diff options
Diffstat (limited to 'lava-slave')
-rw-r--r-- | lava-slave/Dockerfile | 29 | ||||
-rw-r--r-- | lava-slave/scripts/extra_actions | 0 | ||||
-rw-r--r-- | lava-slave/scripts/lava-slave | 98 | ||||
-rwxr-xr-x | lava-slave/scripts/retire.sh | 43 | ||||
-rw-r--r-- | lava-slave/scripts/setdispatcherip.py | 11 | ||||
-rwxr-xr-x | lava-slave/scripts/setup.sh | 93 | ||||
-rwxr-xr-x | lava-slave/scripts/start.sh | 3 |
7 files changed, 273 insertions, 4 deletions
diff --git a/lava-slave/Dockerfile b/lava-slave/Dockerfile index b5e6385..b7252ef 100644 --- a/lava-slave/Dockerfile +++ b/lava-slave/Dockerfile @@ -34,18 +34,18 @@ RUN if [ "$(uname -m)" = "x86_64" -o "$(uname -m)" = "x86" ] ;then apt-get -y in #RUN DEBIAN_FRONTEND=noninteractive apt-get -y install lava-dispatcher COPY scripts/build-lava / -RUN sh /build-lava lava-dispatcher 2017.11 2017.11.post1-1 +RUN sh /build-lava lava-dispatcher 2018.4 2018.4-1 COPY configs/lava-slave /etc/lava-dispatcher/lava-slave COPY configs/tftpd-hpa /etc/default/tftpd-hpa COPY scripts/cu-loop /usr/local/bin/ -COPY conmux/* /etc/conmux/ +COPY conmux/ /etc/conmux/ # Caution to not use any port between the Linux dynamic port range: 32768-60999 -RUN sed -i 's,XNBD_PORT_RANGE_MIN.*,XNBD_PORT_RANGE_MIN=61950,' /usr/lib/python2.7/dist-packages/lava_dispatcher/utils/constants.py -RUN sed -i 's,XNBD_PORT_RANGE_MAX.*,XNBD_PORT_RANGE_MAX=62000,' /usr/lib/python2.7/dist-packages/lava_dispatcher/utils/constants.py +RUN sed -i 's,XNBD_PORT_RANGE_MIN.*,XNBD_PORT_RANGE_MIN=61950,' /usr/lib/python3/dist-packages/lava_dispatcher/utils/constants.py +RUN sed -i 's,XNBD_PORT_RANGE_MAX.*,XNBD_PORT_RANGE_MAX=62000,' /usr/lib/python3/dist-packages/lava_dispatcher/utils/constants.py #conmux need cu >= 1.07-24 See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=336996 RUN echo "deb http://debian.proxad.net/debian/ testing main" >> /etc/apt/sources.list.d/testing.list @@ -53,10 +53,31 @@ RUN apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get -y install cu RUN rm /etc/apt/sources.list.d/testing.list +COPY scripts/lava-slave /etc/init.d/ +RUN chmod 755 /etc/init.d/lava-slave + # Add services helper utilities to start and stop LAVA COPY scripts/stop.sh . COPY scripts/start.sh . +# lava-cli dependencies +RUN apt-get -y install python3-setuptools python3-dev python3-zmq +RUN git clone https://git.linaro.org/lava/lavacli.git /root/lavacli && cd /root/lavacli && git checkout v0.7 && python3 setup.py install + +COPY phyhostname /root/ +COPY scripts/setup.sh . + +COPY scripts/setdispatcherip.py /usr/local/bin/ +RUN chmod 755 /usr/local/bin/setdispatcherip.py + +COPY scripts/retire.sh /usr/local/bin/ +RUN chmod 755 /usr/local/bin/retire.sh + +COPY devices/ /root/devices/ + +COPY scripts/extra_actions /root/ +RUN if [ -x /root/extra_actions ] ; then /root/extra_actions ; fi + EXPOSE 69/udp 80 CMD /start.sh diff --git a/lava-slave/scripts/extra_actions b/lava-slave/scripts/extra_actions new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/lava-slave/scripts/extra_actions diff --git a/lava-slave/scripts/lava-slave b/lava-slave/scripts/lava-slave new file mode 100644 index 0000000..3ba00f7 --- /dev/null +++ b/lava-slave/scripts/lava-slave @@ -0,0 +1,98 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: lava-slave +# Required-Start: $time +# Required-Stop: $time +# X-Stop-After: sendsigs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: lava-slave +# Description: lava-slave +### END INIT INFO + +# +# Author: Corentin LABBE <clabbe@baylibre.com> +# + +# PATH should only include /usr/* if it runs after the mountnfs.sh script +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="lava-slave" +NAME=lava-slave + +DAEMON=/usr/bin/lava-slave +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +MASTER_URL=tcp://localhost:5556 +LOGGER_URL=tcp://localhost:5555 +LOGLEVEL=DEBUG + +# Exit if the package is not installed +[ -x "$DAEMON" ] || exit 0 + +# Read configuration variable file if it is present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME +[ -r /etc/lava-dispatcher/$NAME ] && . /etc/lava-dispatcher/$NAME + +# Define LSB log_* functions. +. /lib/lsb/init-functions + +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # other if daemon could not be started or a failure occured + start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON -- --level $LOGLEVEL --master $MASTER_URL --socket-addr $LOGGER_URL $IPV6 $ENCRYPT $MASTER_CERT $SLAVE_CERT $HOSTNAME +} + +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # other if daemon could not be stopped or a failure occurred + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON +} + +case "$1" in + start) + log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0) + log_end_msg 0 ;; + 1) log_progress_msg "already started" + log_end_msg 0 ;; + *) log_end_msg 1 ;; + esac + + ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0) log_end_msg 0 ;; + 1) log_progress_msg "already stopped" + log_end_msg 0 ;; + *) log_end_msg 1 ;; + esac + + ;; + restart|force-reload) + $0 stop + $0 start + ;; + try-restart) + $0 status >/dev/null 2>&1 && $0 restart + ;; + status) + status_of_proc -p $PIDFILE $DAEMON $RSYSLOGD && exit 0 || exit $? + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|try-restart|status}" >&2 + exit 3 + ;; +esac + +: + diff --git a/lava-slave/scripts/retire.sh b/lava-slave/scripts/retire.sh new file mode 100755 index 0000000..def6c8e --- /dev/null +++ b/lava-slave/scripts/retire.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +LAVA_MASTER_URI=$1 + +if [ -z "$LAVA_MASTER_URI" ];then + echo "retire.sh: remove an offline worker" + echo "Usage: $0 LAVA_MASTER_URI" + echo "ERROR: Missing LAVA_MASTER_URI" + exit 11 +fi + +LAVACLIOPTS="--uri $LAVA_MASTER_URI" + +retire_worker() { + worker=$1 + lavacli $LAVACLIOPTS workers list |grep -q $worker + if [ $? -eq 0 ];then + echo "Removing $worker" + lavacli $LAVACLIOPTS workers update $worker || exit $? + else + echo "SKIP: worker $worker does not exists" + return 0 + fi + lavacli $LAVACLIOPTS devices list -a | grep '^\*' | cut -d' ' -f2 | + while read devicename + do + lavacli $LAVACLIOPTS devices show $devicename |grep -q "^worker.*$worker$" + if [ $? -eq 0 ];then + echo "Retire $devicename" + lavacli $LAVACLIOPTS devices update --health RETIRED --worker $worker $devicename || exit $? + fi + done + return 0 +} + +if [ -z "$2" ];then + for ww in $(ls devices/) + do + retire_worker $ww + done +else + retire_worker $2 +fi diff --git a/lava-slave/scripts/setdispatcherip.py b/lava-slave/scripts/setdispatcherip.py new file mode 100644 index 0000000..a058cba --- /dev/null +++ b/lava-slave/scripts/setdispatcherip.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +import xmlrpclib +import sys + +if len(sys.argv) < 4: + print("ERROR: Usage: %s URI workername dispatcherIP" % sys.argv[0]) + sys.exit(1) + +server = xmlrpclib.ServerProxy("%s" % sys.argv[1]) +server.scheduler.workers.set_config("%s" % sys.argv[2], "dispatcher_ip: %s" % sys.argv[3]) diff --git a/lava-slave/scripts/setup.sh b/lava-slave/scripts/setup.sh new file mode 100755 index 0000000..bf91c7a --- /dev/null +++ b/lava-slave/scripts/setup.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +if [ ! -e "/root/devices/$(hostname)" ];then + echo "Static slave for $LAVA_MASTER" + exit 0 +fi + +if [ -z "$LAVA_MASTER_URI" ];then + echo "ERROR: Missing LAVA_MASTER_URI" + exit 11 +fi + +echo "Dynamic slave for $LAVA_MASTER ($LAVA_MASTER_URI)" +cd /root/lavacli +LAVACLIOPTS="--uri $LAVA_MASTER_URI" + +# do a sort of ping for letting master to be up +TIMEOUT=30 +while [ $TIMEOUT -ge 1 ]; +do + lavacli $LAVACLIOPTS device-types list 2>/dev/null >/dev/null + if [ $? -eq 0 ];then + TIMEOUT=0 + else + echo "Wait for master...." + sleep 2 + fi + TIMEOUT=$(($TIMEOUT-1)) +done + +# This directory is used for storing device-types already added +mkdir -p /root/.lavadocker/ +if [ -e /root/device-types ];then + for i in $(ls /root/device-types/*jinja2) + do + devicetype=$(basename $i |sed 's,.jinja2,,') + echo "Adding custom $devicetype" + lavacli $LAVACLIOPTS device-types list || exit $? + touch /root/.lavadocker/devicetype-$devicetype + done +fi + +for worker in $(ls /root/devices/) +do + lavacli $LAVACLIOPTS workers list |grep -q $worker + if [ $? -eq 0 ];then + echo "Remains of $worker, cleaning it" + /usr/local/bin/retire.sh $LAVA_MASTER_URI $worker + #lavacli $LAVACLIOPTS workers update $worker || exit $? + else + echo "Adding worker $worker" + lavacli $LAVACLIOPTS workers add --description "LAVA dispatcher on $(cat /root/phyhostname)" $worker || exit $? + fi + if [ ! -z "$LAVA_DISPATCHER_IP" ];then + echo "Add dispatcher_ip $LAVA_DISPATCHER_IP to $worker" + /usr/local/bin/setdispatcherip.py $LAVA_MASTER_URI $worker $LAVA_DISPATCHER_IP || exit $? + fi + for device in $(ls /root/devices/$worker/) + do + devicename=$(echo $device | sed 's,.jinja2,,') + devicetype=$(grep -h extends /root/devices/$worker/$device| grep -o '[a-zA-Z0-9_-]*.jinja2' | sed 's,.jinja2,,') + if [ -e /root/.lavadocker/devicetype-$devicetype ];then + echo "Skip devicetype $devicetype" + else + echo "Add devicetype $devicetype" + lavacli $LAVACLIOPTS device-types list | grep -q "$devicetype[[:space:]]" + if [ $? -eq 0 ];then + echo "Skip devicetype $devicetype" + else + lavacli $LAVACLIOPTS device-types add $devicetype || exit $? + fi + touch /root/.lavadocker/devicetype-$devicetype + fi + echo "Add device $devicename on $worker" + lavacli $LAVACLIOPTS devices list -a | grep -q $devicename + if [ $? -eq 0 ];then + echo "$devicename already present" + #verify if present on another worker + #TODO + lavacli $LAVACLIOPTS devices show $devicename |grep ^worker |grep -q $worker + if [ $? -ne 0 ];then + echo "ERROR: $devicename already present on another worker" + exit 1 + fi + lavacli $LAVACLIOPTS devices update --worker $worker --health UNKNOWN $devicename || exit $? + # always reset the device dict in case of update of it + lavacli $LAVACLIOPTS devices dict set $devicename /root/devices/$worker/$device || exit $? + else + lavacli $LAVACLIOPTS devices add --type $devicetype --worker $worker $devicename || exit $? + lavacli $LAVACLIOPTS devices dict set $devicename /root/devices/$worker/$device || exit $? + fi + done +done diff --git a/lava-slave/scripts/start.sh b/lava-slave/scripts/start.sh index 92e76bb..35e58a4 100755 --- a/lava-slave/scripts/start.sh +++ b/lava-slave/scripts/start.sh @@ -1,4 +1,7 @@ #!/bin/bash + +/setup.sh || exit $? + # Set LAVA Master IP if [[ -n "$LAVA_MASTER" ]]; then sed -i -e "s/{LAVA_MASTER}/$LAVA_MASTER/g" /etc/lava-dispatcher/lava-slave |