aboutsummaryrefslogtreecommitdiffstats
path: root/jjb/common/include-agl-lava-jobs-submit.sh
blob: ec0cee69af89762e4a322277909f84676fb63c3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# (c) 2017 Kevin Hilman <khilman@baylibre.com>
# License GPLv2
#
# Submit LAVA YAML job file (default testjob.yaml) to first available LAVA lab
# with matching device-type
#
#JOB_FILE=${1:-testjob.yaml}
JOB_FILE=testjob.yaml

if [ ! -e $JOB_FILE ]; then
    JOB_FILE=$1
fi

if [ ! -e $JOB_FILE ]; then
    echo "ERROR: LAVA job file $JOB_FILE not present."
    exit 1
fi
JOB_BASE=$(basename $JOB_FILE .yaml)

# Need to hack the LAVA device-type name in the job file
JOB_FILE_NEW="${JOB_BASE}_${LAVA_LAB}.yaml"
cat $JOB_FILE | sed "s/device_type: $releng_device$/device_type: $lava_device/" > $JOB_FILE_NEW

#
# LAVA job submit, get job ID from lava-tool output
#
JOB_STATUS="${JOB_BASE}_${LAVA_LAB}.status"

if [ -z "$lab" ];then
	echo "WARNING: lab is empty fallback to agl lab"
	lab=agl
fi

job_id=$(lavacli -i $lab jobs submit $JOB_FILE_NEW)
if [ $? -ne 0 ]; then
	echo "ERROR: job submission error"
	exit 1
fi
# Printing the job URL in the log
echo "THe job id is: ${job_id}"
JOB_URL="${url}scheduler/job/${job_id}"

echo ""
echo ""
echo "Submitted as job: $JOB_URL"
echo ""
echo "####################################################"
echo ""

# use lavacli wait job instead of the polling.
lavacli -i $lab jobs wait $job_id --timeout 7200
lavacli -i $lab jobs show $job_id --yaml > $JOB_STATUS
state=$(grep ^state: $JOB_STATUS| cut -d' ' -f2)
if [ "$state" == "Finished" ]; then
        status=$(grep ^health: $JOB_STATUS| cut -d' ' -f2)
        echo "LAVA job $job_id completed with status: $status"
fi

echo "####"
echo "#### Start: Output from LAVA job $job_id ####"
echo "####"

JOB_OUTPUT="${JOB_BASE}_output.yaml"
JOB_LOG="${JOB_BASE}_output.log"
curl -s -o $JOB_OUTPUT $lava_url/scheduler/job/$job_id/log_file/plain
cat $JOB_OUTPUT | grep '"target",' | sed -e 's#- {"dt".*"lvl".*"msg":."##g' -e 's#"}$##g' | tee $JOB_LOG
cat $JOB_OUTPUT | grep '"error_msg":' | sed -e 's#.*"error_msg": "##g' -e 's#", ".*##g' | tee -a $JOB_LOG

echo "####"
echo "#### End: Output from LAVA job $job_id ####"
echo "####"

handle_skiplist() {
	SKIPLIST=skiplist
	# detect job type (apps vs non-apps) and get skiplist
	if [ ! -z "$(echo $JOB_NAME | grep 'ci-platform')" ];then
		git clone https://${GERRIT_HOST}/gerrit/src/qa-testdefinitions.git || true
		if [ ! -e qa-testdefinitions ];then
			echo "ERROR: fail to get qa-testdefinitions"
			return 0
		fi
		SKIPDIR=qa-testdefinitions/skiplists/
		SKIPFILE=common
		CK_REPO_NAME="qa-testdefinitions"
	else
		git clone https://${GERRIT_HOST}/gerrit/${GERRIT_PROJECT}.git || true
		# GERRIT_PROJECT could have a / in it
		CK_REPO_NAME="$(basename ${GERRIT_PROJECT})"
		if [ ! -e $CK_REPO_NAME ];then
			echo "ERROR: fail to get $GERRIT_PROJECT"
			return 0
		fi
		SKIPDIR=${CK_REPO_NAME}/
		SKIPFILE=.aglci
	fi
	for skipfile in $SKIPFILE $MACHINE ${GERRIT_PROJECT}
	do
		if [ -e $SKIPDIR/$skipfile ];then
			echo "DEBUG: SKIPLIST: Found $SKIPDIR/$skipfile"
			cat $SKIPDIR/$skipfile >> $SKIPLIST
		fi
	done

	if [ -e "$SKIPLIST" ];then
		echo "DEBUG: $SKIPLIST does not exists"
		return 0
	fi

	if [ ! -s "$SKIPLIST" ];then
		echo "DEBUG: $SKIPLIST is empty"
		return 0
	fi

	# example of testline: * lava.lava-test-retry [fail]
	while read testline
	do
		# Check if fail are "normal/accepted"
		TESTNAME=$(echo $testline | cut -d' ' -f2)
		if [ -z "$(grep $TESTNAME $SKIPLIST)" ];then
			echo "DEBUG: $TESNAME not in skiplist"
			GOODJOB=0
		else
			echo "DEBUG: $TESNAME in skiplist"
		fi
	done < job-result.fail
	# clean skiplist
	rm --one-file-system -rf "${CK_REPO_NAME}"
	return 0
}

# Analyze jobs results
lavacli -i $lab results $job_id | tee job-result

# GOODJOB is equal to 0 if any test fail (and not present in a skiplist), 1 if all test are success
GOODJOB=1
grep '\[fail\]$' job-result > job-result.fail || true

if [ -s job-result.fail ];then
	handle_skiplist
fi

if [ $GOODJOB -eq 0 ];then
	# send -1
	ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -p 29418 agl-jobbuilder@gerrit.automotivelinux.org gerrit review ${GERRIT_CHANGE_NUMBER},${GERRIT_PATCHSET_NUMBER} --verified +1 --label ci-image-boot-test=-1 -n NONE --message="CI-Image-Boot-Test\ fail\ on\ ${MACHINE}" || true
else
	# send +1
	ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -p 29418 agl-jobbuilder@gerrit.automotivelinux.org gerrit review ${GERRIT_CHANGE_NUMBER},${GERRIT_PATCHSET_NUMBER} --verified +1 --label ci-image-boot-test=+1 -n NONE --message="CI-Image-Boot-Test\ success\ on\ ${MACHINE}" || true
fi

# after one successful submit, we're done
if [ x"$status" = x"Complete" ]; then
    exit 0
fi

#exit 1
# for now do not fail
exit 0