aboutsummaryrefslogtreecommitdiffstats
path: root/jjb/common/include-agl-lava-labs-prepare.sh
blob: f8a35fd6c01e20f664fdacdee5c7cf83649b188f (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
# (c) 2017 Kevin Hilman <khilman@baylibre.com>
# License GPLv2

#
# Setup LAVA API authentication tokens for various LAVA labs
#
# Uses user/token pairs from Jenkins secrets
#
# And macthing LAVA lab names for releng-scripts
#
# Strucuture: [JENKINS_LAB_NAME]="LAB_URL;JENKINS_LAB_USER;JENKINS_LAB_TOKEN;RELENG_LAB_NAME"
#

# Let the script handle errors nicely
set +e

declare -A labs
labs=(
      [agl]="https://lava.automotivelinux.org/;$LAB_AGL_USER;$LAB_AGL_TOKEN;lab-agl-core"
#      [baylibre]="http://lava.baylibre.com:10080/;$LAB_BAYLIBRE_USER;$LAB_BAYLIBRE_TOKEN;lab-baylibre-legacy"
)

#
# Ensure python_keyring is set to plaintext.  Required for
# non-interactive use
#
echo "default keyring config"
mkdir -p ~/.local/share/python_keyring/
cat <<EOF >  ~/.local/share/python_keyring/keyringrc.cfg
[backend]
default-keyring=keyring.backends.file.PlaintextKeyring
EOF

#set -x
device_available=0
for lab in "${!labs[@]}"; do
    val=${labs[$lab]}
    OFS=${IFS}
    IFS=';'
    arr=(${labs[$lab]})
    IFS=${OFS}

    url=${arr[0]}
    user=${arr[1]}
    token=${arr[2]}
    lava_lab=${arr[3]}
    token_file=$HOME/.local/lab-$lab-token

    if [ -z ${user} ]; then
        echo "WARNING: Lab ${lab}: missing user. Ignoring."
        continue
    fi
    if [ -z ${token} ]; then
        echo "WARNING: Lab ${lab}: missing token. Ignoring."
        continue
    fi

    # LAVA URL with username
    lava_url=${url/:\/\//:\/\/${user}\@}
    full_url=${lava_url}
    full_url+="RPC2/" # entry point for XML-RPC API
    echo "LAVA auth-add for lab: $lab, URL: $full_url"

    # lavacli auth using token
    mkdir -p ~/.config
    lavacli identities add --token ${token} --uri ${url}/RPC2 --username $user $lab

    # lavacli: Find the LAVA lab that has the device available to run the job
    echo -n "lavacli: Checking for $lava_device at $full_url... "
    lavacli_line=$(lavacli -i $lab devices list | grep $lava_device | grep Good | head -1)
    lavacli_line=$(echo "$lavacli_line" | tr -d '[:space:]')

    if [ -z "$lavacli_line" ]; then
        echo "not found."
    fi
    IFS=':'
    arr=($lavacli_line)
    device_status=${arr[1]}
    IFS=${OFS}

    if [ x"$device_status" = x"Idle,Good" ]; then
	echo "lavacli: found a device available: $lavacli_line"
	lavacli_dev=$(echo ${arr[0]} | sed 's/\*\([^(]*\).*/\1/')
	lavacli_tags=$(lavacli -i $lab devices tags list $lavacli_dev | grep \*)
	lavacli_tags=$(echo "$lavacli_tags" | sed 's/\* \(\)/\1/')
	echo "Tags for $lavacli_dev: $lavacli_tags"
    else
	echo "lavacli: did not find any device available: $lavacli_line"
    fi

    # FIXME: encode this better , we might have multiple jobs already queued/running.
    # We have to wait before we 'flood' the queue. Better here than to timeout later!
    retries=1
    if [ x"$device_status" = x"Reserved,Good" ]; then
        retries=30
    elif [ x"$device_status" = x"Running,Good" ]; then
        retries=30
    fi

    # If the device is reserved poll it's status every minutes.
    # The max polling time is set to $retries * 60 seconds = 10 minutes.
    device_available=0
    for i in `seq 1 $retries`
    do
        # device is only available if "idle" or "running"
        # Look if the status of the board has changed from reserved in the lab
        echo -n "Checking for $lava_device at $full_url... "
        lavacli_line=$(lavacli -i $lab devices list | grep $lava_device | grep Good | head -1)
        lavacli_line=$(echo "$lavacli_line" | tr -d '[:space:]')
        if [ -z "$lavacli_line" ]; then
            echo "not found."
            break
        fi
        IFS=':'
        arr=($lavacli_line)
        device_status=${arr[1]}
        IFS=${OFS}

        if [ x"$device_status" = x"Reserved,Good" ]; then
            echo "Device still reserved, retries left: $retries ."
        elif [ x"$device_status" = x"Idle,Good" ]; then
            # IDLE AND GOOD means we can grab it
            device_available=1
            break
        elif [ x"$device_status" = x"Running,Good" ]; then
            echo "Device still running (other job), retries left: $retries ."
        fi
        sleep 60s
    done

    if [ $device_available = 0 ]; then
        echo " Not Available.  Status: $device_status"
        continue
    else
        echo " Found and available.  Status: $device_status"
        export LAVA_LAB=$lava_lab
        break
    fi
done

if [ "$device_available" -eq 0 ]; then
    echo ""
    echo "ERROR: device not found in any available lab."
    exit 0
fi

# Re-enable error detection
set -e