summaryrefslogtreecommitdiffstats
path: root/lava-slave
diff options
context:
space:
mode:
authorkhilman <khilman@users.noreply.github.com>2018-06-05 11:47:07 -0700
committerGitHub <noreply@github.com>2018-06-05 11:47:07 -0700
commitc1071d0f9b57958b22546abe8eadf670b3926b98 (patch)
tree6ac6947fc9196283ecba0c17a9033d3af3aaaa99 /lava-slave
parent2d79d03f5818c096535c9784b12df5ea99c0dbff (diff)
parenta22e4a89a06bda681ba329bf73e05a7d9196efe3 (diff)
Merge pull request #27 from montjoie/multi_slave_2018_x
Multi slave 2018 x
Diffstat (limited to 'lava-slave')
-rw-r--r--lava-slave/Dockerfile29
-rw-r--r--lava-slave/scripts/extra_actions0
-rw-r--r--lava-slave/scripts/lava-slave98
-rwxr-xr-xlava-slave/scripts/retire.sh43
-rw-r--r--lava-slave/scripts/setdispatcherip.py11
-rwxr-xr-xlava-slave/scripts/setup.sh93
-rwxr-xr-xlava-slave/scripts/start.sh3
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