From ed570487dc44accf1935a906feb6258cff1a970a Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Tue, 7 May 2019 12:01:54 -0500 Subject: [PATCH 01/55] docker-compose: dispatcher: Add /run/udev/control for libudev libudev which is utilized by pyudev expects /run/udev/control to exist for udev class events to be available. Signed-off-by: Kumar Gala --- docker-compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index 7dc076c..fce4e9c 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -101,6 +101,7 @@ services: LOGGER_URL: "tcp://lava-logs:5555" MASTER_URL: "tcp://lava-master:5556" volumes: + - /run/udev/control:/run/udev/control:ro # libudev expects it for udev events - /boot:/boot:ro - /lib/modules:/lib/modules:ro From c788949f5c62e52d034fc290a285b91adda1d645 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:01:33 -0500 Subject: [PATCH 02/55] contrib/usb-passthrough: Script to pass usb devices to container This script is meant to be called via udev to passthrough the usb devices to a container that needs to use them. The script will update the cgroup file for the container to give (or remove) permissions to the device, create device nodes in the container, and udev symlinks in the container. The udev rule is expected to key off a USB serial number for the device in question. An example udev rule to utilize this script would look like: ACTION=="add", ENV{ID_SERIAL_SHORT}=="E00A1029", RUN+="/usr/local/bin/usb-passthrough -a -d %E{ID_SERIAL_SHORT} -i lava-dispatcher" Where "E00A1029" is the serial number of the device in question, and "lava-dispatcher" is the container that any associated device nodes will get setup in. This script is based on: https://git.linaro.org/lava/lava-lab.git/tree/shared/lab-scripts/docker/passthrough The major additions are: * Handle device removal * Dynamically create/remove device nodes in container * Create symlinks in container for udev friend names The removal logic creates on the fly udev rules to handle the removal since we can't key off of the serial number. Signed-off-by: Kumar Gala --- contrib/usb-passthrough | 122 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 contrib/usb-passthrough diff --git a/contrib/usb-passthrough b/contrib/usb-passthrough new file mode 100755 index 0000000..788ef60 --- /dev/null +++ b/contrib/usb-passthrough @@ -0,0 +1,122 @@ +#!/usr/bin/python3 + +# Copyright 2019 Linaro Limited +# Author: Dave Pigott +# Author: Kumar Gala + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +# +# USB device passthrough for docker containers + +import argparse +import os +import sys +import stat +import docker + +# Example of what a udev rule looks like for using this script +# +# ACTION=="add", ENV{ID_SERIAL_SHORT}=="E00A1029", RUN+="/usr/local/bin/usb-passthrough -a -d %E{ID_SERIAL_SHORT} -i lava-dispatcher" + +def pass_device_into_container(instance, dev_type, major, minor, node, serial_no, subsys, links): + client = docker.from_env() + + container = client.containers.get(instance) + + allow_devices = open("/sys/fs/cgroup/devices/docker/%s/devices.allow" % container.id, "w") + allow_devices.write("%s %s:%s rwm\n" % (dev_type, major, minor)) + allow_devices.close() + create_dev_cmd = "sh -c '[ ! -e " + node + " ] " + \ + "&& mkdir -p $(dirname " + node + \ + ") && mknod " + node + " " + dev_type + \ + " " + str(major) + " " + str(minor) + "'" + container.exec_run(create_dev_cmd) + + for link in links.split(): + link_cmd = "sh -c 'mkdir -p $(dirname " + link + ");" + \ + "ln -f -s " + node + " " + link + "'" + container.exec_run(link_cmd) + + udev_file_name = "/etc/udev/rules.d/lava-%s-%s-%s" % (instance, serial_no, subsys) + if ('ID_USB_INTERFACE_NUM' in os.environ): + udev_file_name += "-if%s" % os.environ['ID_USB_INTERFACE_NUM'] + udev_file_name += ".rules" + + udev_rule = open(udev_file_name, "w") + + udev_rule.write('ACTION=="remove",ENV{DEVNAME}=="' + node) + udev_rule.write('",RUN+="' + sys.argv[0]) + udev_rule.write(' -d ' + serial_no) + udev_rule.write(' -i ' + instance) + udev_rule.write('"\n') + + udev_rule.close() + +def remove_device_from_container(instance, dev_type, major, minor, node, serial_no, subsys, links): + client = docker.from_env() + + container = client.containers.get(instance) + + allow_devices = open("/sys/fs/cgroup/devices/docker/%s/devices.deny" % container.id, "w") + allow_devices.write("%s %s:%s rwm\n" % (dev_type, major, minor)) + allow_devices.close() + create_dev_cmd = "rm " + node + container.exec_run(create_dev_cmd) + + for link in links.split(): + link_cmd = "rm " + link + container.exec_run(link_cmd) + + udev_file_name = "/etc/udev/rules.d/lava-%s-%s-%s" % (instance, serial_no, subsys) + if ('ID_USB_INTERFACE_NUM' in os.environ): + udev_file_name += "-if%s" % os.environ['ID_USB_INTERFACE_NUM'] + udev_file_name += ".rules" + + os.remove(udev_file_name) + +def main(): + parser = argparse.ArgumentParser(description='USB device passthrough for docker containers', add_help=False) + + parser.add_argument("-d", "--device_serial", type=str, required=True, + help="Devices serial number") + parser.add_argument("-i", "--instance", type=str, required=True, + help="Docker instance") + parser.add_argument("-a", "--add", action="store_true", + help="Add device") + + options = parser.parse_args() + + subsys = os.environ['SUBSYSTEM'] + links = "" + if ('DEVLINKS' in os.environ): + links = os.environ['DEVLINKS'] + + dev_type = "c" + if (subsys == "block"): + dev_type = "b" + + major = os.environ['MAJOR'] + minor = os.environ['MINOR'] + device_node = os.environ['DEVNAME'] + + if (options.add): + pass_device_into_container(options.instance, dev_type, major, minor, device_node, options.device_serial, subsys, links) + else: + remove_device_from_container(options.instance, dev_type, major, minor, device_node, options.device_serial, subsys, links) + + +if __name__ == '__main__': + main() From 6692f515e244dfff9a6e1425f3a8fd16237d32c6 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:03:48 -0500 Subject: [PATCH 03/55] Add LITE specific dispatcher Add a LITE specific dispatcher with pyOCD installed in it. Signed-off-by: Kumar Gala --- docker-compose.yaml | 6 +++++- lite-lava-dispatcher/Dockerfile | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 lite-lava-dispatcher/Dockerfile diff --git a/docker-compose.yaml b/docker-compose.yaml index fce4e9c..8d6ee04 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -87,7 +87,11 @@ services: lava-dispatcher: container_name: lava-dispatcher - image: ${DC_DISPATCHER_IMAGE} + #image: ${DC_DISPATCHER_IMAGE} + build: + context: ./lite-lava-dispatcher + args: + DC_DISPATCHER_IMAGE: ${DC_DISPATCHER_IMAGE} devices: - /dev/kvm # needed for QEMU - /dev/net/tun # needed for QEMU diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile new file mode 100644 index 0000000..118610e --- /dev/null +++ b/lite-lava-dispatcher/Dockerfile @@ -0,0 +1,9 @@ +ARG DC_DISPATCHER_IMAGE + +FROM ${DC_DISPATCHER_IMAGE} + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get -y install \ + python3-pip libusb-1.0.0 && \ + pip3 install --upgrade setuptools && \ + pip3 install pyOCD From 1617b459cdabf4879723e247047000b7ae2bf37f Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:03:53 -0500 Subject: [PATCH 04/55] docker-compose: comment out /dev/kvm We aren't using QEMU right now so comment out /dev/kvm Signed-off-by: Kumar Gala --- docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 8d6ee04..5dd41cb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -93,7 +93,7 @@ services: args: DC_DISPATCHER_IMAGE: ${DC_DISPATCHER_IMAGE} devices: - - /dev/kvm # needed for QEMU +# - /dev/kvm # needed for QEMU - /dev/net/tun # needed for QEMU security_opt: - apparmor:unconfined # needed for usb mass storage From 618231d1949375ea12b97a94637485615fb39215 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:25:20 -0500 Subject: [PATCH 05/55] contrib/LAVA.rules: Example udev rule file for usb-passthrough Signed-off-by: Kumar Gala --- contrib/LAVA.rules | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 contrib/LAVA.rules diff --git a/contrib/LAVA.rules b/contrib/LAVA.rules new file mode 100644 index 0000000..2481e99 --- /dev/null +++ b/contrib/LAVA.rules @@ -0,0 +1,10 @@ +# Example LAVA.rules for USB passthrough to container +# +# Assumes that usb-passthrough script is installed in +# /usr/local/bin/passthrough + +# Pass all usb devices (TTY, block, CDC) to lava-dispatcher container +# FRDM-K64F +ACTION=="add", ENV{ID_SERIAL_SHORT}=="MYSERIALNUM", RUN+="/usr/local/bin/usb-passthrough -a -d %E{ID_SERIAL_SHORT} -i lava-dispatcher" +# Pass TTY through to lava-ser2net container +ACTION=="add", SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="MYSERIALNUM", RUN+="/usr/local/bin/usb-passthrough -a -d %E{ID_SERIAL_SHORT} -i lava-ser2net" From 2ccf267b818115f94df3a418a78393bc4c8a6ec2 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:29:56 -0500 Subject: [PATCH 06/55] ser2net: setup for running ser2net in a container Signed-off-by: Kumar Gala --- docker-compose.yaml | 7 +++++++ ser2net/Dockerfile | 8 ++++++++ ser2net/ser2net.conf | 0 3 files changed, 15 insertions(+) create mode 100644 ser2net/Dockerfile create mode 100644 ser2net/ser2net.conf diff --git a/docker-compose.yaml b/docker-compose.yaml index 5dd41cb..b49a60e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -109,6 +109,13 @@ services: - /boot:/boot:ro - /lib/modules:/lib/modules:ro + ser2net: + container_name: lava-ser2net + build: + context: ./ser2net + volumes: + - ./ser2net/ser2net.conf:/etc/ser2net.conf + volumes: db-data: name: lava-server-pgdata diff --git a/ser2net/Dockerfile b/ser2net/Dockerfile new file mode 100644 index 0000000..2aeb487 --- /dev/null +++ b/ser2net/Dockerfile @@ -0,0 +1,8 @@ +FROM debian:sid-slim + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ser2net=3.5-2 && \ + rm -rf /var/lib/apt/lists/* + +CMD echo -n "Starting " && ser2net -v && ser2net -d -c /etc/ser2net.conf diff --git a/ser2net/ser2net.conf b/ser2net/ser2net.conf new file mode 100644 index 0000000..e69de29 From 7db776fb67b6aec12d25984636c3b4b777a67e00 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 9 May 2019 16:33:45 -0500 Subject: [PATCH 07/55] docker-compose: ser2net make it a bind mount --- docker-compose.yaml | 4 +++- ser2net/Dockerfile | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index b49a60e..db5de62 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -114,7 +114,9 @@ services: build: context: ./ser2net volumes: - - ./ser2net/ser2net.conf:/etc/ser2net.conf + - type: bind + source: ./ser2net/ser2net.conf + target: /etc/ser2net.conf volumes: db-data: diff --git a/ser2net/Dockerfile b/ser2net/Dockerfile index 2aeb487..26efa28 100644 --- a/ser2net/Dockerfile +++ b/ser2net/Dockerfile @@ -5,4 +5,4 @@ RUN apt-get update && \ ser2net=3.5-2 && \ rm -rf /var/lib/apt/lists/* -CMD echo -n "Starting " && ser2net -v && ser2net -d -c /etc/ser2net.conf +CMD echo -n "Starting " && ser2net -v && ser2net -d -c /etc/ser2net.conf -P /var/run/ser2net.pid From fdcaeb6eae06d0cd378a4a72fdf1518a9cdc8034 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:30:40 -0500 Subject: [PATCH 08/55] frdm-k64f.jinja2 update device type support --- docker-compose.yaml | 2 ++ .../device-types/frdm-k64f.jinja2 | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 diff --git a/docker-compose.yaml b/docker-compose.yaml index db5de62..995e196 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -36,6 +36,7 @@ services: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/lava-master:/etc/lava-server/lava-master:ro + - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro depends_on: - db environment: @@ -65,6 +66,7 @@ services: - joboutput:/var/lib/lava-server/default/media/job-output - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro + - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro depends_on: - db environment: diff --git a/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 b/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 new file mode 100644 index 0000000..70f84c3 --- /dev/null +++ b/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 @@ -0,0 +1,36 @@ +{# device_type: frdm-k64f #} +{% extends 'base.jinja2' %} +{% block body %} +board_id: '{{ board_id|default('0000000000') }}' +usb_vendor_id: '0d28' +usb_product_id: '0204' + +actions: + deploy: + connections: + lxc: + methods: + lxc: + image: + parameters: + + boot: + connections: + serial: + lxc: + ssh: + methods: + lxc: + pyocd: + parameters: + command: + pyocd-flashtool + options: + - -d {{ debug|default('debug') }} + - -t k64f + - -f 3000000 + cmsis-dap: + parameters: + usb_mass_device: '{{ usb_mass_device|default('/notset') }}' + resets_after_flash: {{ resets_after_flash|default(True) }} +{% endblock body -%} From 850fa6bdfbda35ca512cc8424a98054a5a222bcd Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 13:31:11 -0500 Subject: [PATCH 09/55] lava-server: settings.conf: Update to allow access beyond local --- overlays/lava-server/etc/lava-server/settings.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/overlays/lava-server/etc/lava-server/settings.conf b/overlays/lava-server/etc/lava-server/settings.conf index 57e683e..ab2f6bd 100644 --- a/overlays/lava-server/etc/lava-server/settings.conf +++ b/overlays/lava-server/etc/lava-server/settings.conf @@ -2,6 +2,7 @@ "HTTPS_XML_RPC": false, "MOUNT_POINT": "/", "STATIC_URL": "/static/", + "ALLOWED_HOSTS": ["192.168.1.14", "127.0.0.1", "localhost"], "CSRF_COOKIE_SECURE": false, "SESSION_COOKIE_SECURE": false, "EVENT_NOTIFICATION": true, From 9d44acfaaa001eac63e7f5b9704b4e460bcb9916 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 14:37:55 -0500 Subject: [PATCH 10/55] board-setup-helper.py: script to help setup stuff for a new board Signed-off-by: Kumar Gala --- contrib/board-setup-helper.py | 115 ++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100755 contrib/board-setup-helper.py diff --git a/contrib/board-setup-helper.py b/contrib/board-setup-helper.py new file mode 100755 index 0000000..dea6147 --- /dev/null +++ b/contrib/board-setup-helper.py @@ -0,0 +1,115 @@ +#!/usr/bin/python3 + +# Copyright 2019 Linaro Limited +# Author: Kumar Gala + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. + +import pyudev +import argparse +import os +import pprint + +def ser2net(dev, ser2net_file): + ser2net = {} + port_num = 5001 + + with open(ser2net_file, 'r') as fd: + for line in fd: + line = line.strip() + values = line.split(':') + port = int(values.pop(0)) + ser2net[port] = values + + if len(ser2net): + port_num = max(ser2net.keys()) + 1 + + new_device = True + + for k in ser2net: + if dev in ser2net[k][2]: + new_device = False + print("WARNING: device %s already exists in %s on port %d" % (dev, ser2net_file, k)) + port_num = k + + if new_device: + with open(ser2net_file, 'a') as fd: + fd.write("%d:telnet:0:%s:115200 8DATABITS NONE 1STOPBIT LOCAL max-connections=10\n" % (port_num, dev)) + + return port_num + +def get_device_numbers(serial_no, dev_type, board_file, ser2net_file): + result = None, None + context = pyudev.Context() + + devices = context.list_devices() + + board_jinja = open(board_file, 'w') + + board_jinja.write("{%% extends '%s.jinja2' %%}\n" % dev_type) + board_jinja.write("{%% set board_id = '%s' %%}\n" % serial_no) + + for device in devices: + serial = device.attributes.get("serial") + if serial is not None and serial_no in serial.decode("utf-8"): + child = device.children + for c in child: + if (c.subsystem == "block"): + for l in c.device_links: + if "by-id" in l: + board_jinja.write("{%% set usb_mass_device = '%s' %%}\n" % l) + + if (c.subsystem == "tty"): + for l in c.device_links: + if "by-id" in l: + port = ser2net(l, ser2net_file) + if port: + board_jinja.write("{%% set connection_command = 'telnet ser2net %d' %%}\n" % port) + break + + +def main(): + parser = argparse.ArgumentParser(description='LAVA board helper', add_help=False) + + parser.add_argument("-d", "--device_serial_num", type=str, required=True, + help="Devices serial number") + + parser.add_argument("-t", "--device_type", type=str, required=True, + help="Devices type") + + parser.add_argument("-s", "--ser2net_conf", type=str, required=False, + default = "./ser2net/ser2net.conf", + help="ser2net configuration file") + + parser.add_argument("-u", dest='udev', default=False, action='store_true') + + parser.add_argument("-b", "--board_file", type=str, required=False, + default = "board.jinja2", + help="board jinja file") + + options = parser.parse_args() + + get_device_numbers(options.device_serial_num, options.device_type, + options.board_file, options.ser2net_conf) + + if (options.udev): + print('ACTION=="add", ENV{ID_SERIAL_SHORT}=="%s", RUN+="/usr/local/bin/usb-passthrough -a -d %%E{ID_SERIAL_SHORT} -i lava-dispatcher"' % options.device_serial_num) + print('ACTION=="add", SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="%s", RUN+="/usr/local/bin/usb-passthrough -a -d %%E{ID_SERIAL_SHORT} -i lava-ser2net"' % options.device_serial_num) + + + +if __name__ == '__main__': + main() From 3dbc646c4df32bb8cf5f1e4bb2a7faf8501c01f2 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 2 May 2019 16:36:04 -0500 Subject: [PATCH 11/55] examples --- example/board.jinja2 | 5 +++++ example/lava.job | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 example/board.jinja2 create mode 100644 example/lava.job diff --git a/example/board.jinja2 b/example/board.jinja2 new file mode 100644 index 0000000..15955f0 --- /dev/null +++ b/example/board.jinja2 @@ -0,0 +1,5 @@ +{% extends 'frdm-k64f.jinja2' %} +{% set board_id = '0240000031754e45001c0019948500046461000097969900' %} +{% set usb_mass_device = '/dev/disk/by-id/usb-MBED_VFS_0240000031754e45001c0019948500046461000097969900-0:0' %} +{% set connection_command = 'telnet ser2net 5001' %} +{% set resets_after_flash = false %} diff --git a/example/lava.job b/example/lava.job new file mode 100644 index 0000000..f82caeb --- /dev/null +++ b/example/lava.job @@ -0,0 +1,50 @@ +# Zephyr JOB definition for frdm-k64f +device_type: 'frdm-k64f' +job_name: 'zephyr-upstream tests-subsys-logging-log_list-logging-log_list-zephyr' + +timeouts: + job: + minutes: 3 + action: + minutes: 3 + actions: + wait-usb-device: + seconds: 40 + +priority: medium +visibility: public + +actions: +- deploy: + timeout: + minutes: 3 + to: tmpfs + images: + zephyr: + url: 'https://snapshots.linaro.org/components/kernel/zephyr/master/zephyr/frdm_k64f/3708/tests/subsys/logging/log_list/logging.log_list/zephyr/zephyr.bin' + +- boot: + method: cmsis-dap + timeout: + minutes: 1 + +- test: + timeout: + minutes: 2 + monitors: + - name: 'tests-subsys-logging-log_list-logging-log_list-zephyr' + start: (tc_start\(\)|starting .*test|BOOTING ZEPHYR OS) + end: PROJECT EXECUTION + pattern: (?P(PASS|FAIL))\s-\s(?P\w+)\r\n + fixupdict: + PASS: pass + FAIL: fail + +metadata: + build-url: https://ci.linaro.org/job/zephyr-upstream/PLATFORM=frdm_k64f,ZEPHYR_TOOLCHAIN_VARIANT=zephyr,label=docker-xenial-amd64-13/3708/ + build-log: https://ci.linaro.org/job/zephyr-upstream/PLATFORM=frdm_k64f,ZEPHYR_TOOLCHAIN_VARIANT=zephyr,label=docker-xenial-amd64-13/3708//consoleText + zephyr-gcc-variant: zephyr + platform: frdm_k64f + git-url: https://git.linaro.org/zephyrproject-org/zephyr.git + git-commit: 193fb971 + From 70101a70ba9cfd428818d2a6aff1440ec38b5016 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Tue, 7 May 2019 10:16:19 -0500 Subject: [PATCH 12/55] lite-lava-dispatcher: Update libudev1 version Update version to get fixes so udev bind/unbind events are seen correctly. Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index 118610e..cc4d2d0 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -5,5 +5,6 @@ FROM ${DC_DISPATCHER_IMAGE} RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install \ python3-pip libusb-1.0.0 && \ + apt-get -y -t stretch-backports install libudev1 && \ pip3 install --upgrade setuptools && \ pip3 install pyOCD From 666b83840c89c2e580f0331ce013a32a2027fd36 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Wed, 8 May 2019 00:35:16 -0500 Subject: [PATCH 13/55] add initial cut of udev-forward.py based on C implementation https://github.com/eiz/udevfw Note: we workaround error on older linux kernels Kernel version 4.15 on Ubuntu shows a behavior of reporting ECONNREFUSED from the send. The data is still sent, so we workaround this by ignoring the ConnectionRefusedError exception we get in python. Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 152 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 contrib/udev-forward.py diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py new file mode 100755 index 0000000..c763f26 --- /dev/null +++ b/contrib/udev-forward.py @@ -0,0 +1,152 @@ +#!/usr/bin/python3 + +import os +import sys +import socket +import pyudev +import syslog +import threading +import docker +import pyhash +from struct import * +from ctypes import CDLL +import argparse + +NETLINK_KOBJECT_UEVENT = 15 +UDEV_MONITOR_UDEV = 2 +CLONE_NEWNET = 0x40000000 +UDEV_MONITOR_MAGIC = 0xFEEDCAFE + +device_list = [] +lock = threading.Lock() + +hasher = pyhash.murmur2_32() + +def bloomHash(tag): + bits = 0 + hash = hasher(tag.encode()) + + bits = bits | 1 << (hash & 63) + bits = bits | 1 << ((hash >> 6) & 63) + bits = bits | 1 << ((hash >> 12) & 63) + bits = bits | 1 << ((hash >> 18) & 63) + + return bits + + +def buildHeader(proplen, subsys, devtype, taghash): + header_fmt = "8s8I" + header_size = calcsize(header_fmt) + subsys_hash = 0 + devtype_hash = 0 + + if subsys: + subsys_hash = socket.htonl(hasher(subsys.encode())) + + if devtype: + devtype_hash = socket.htonl(hasher(devtype.encode())) + + tag_low = socket.htonl(taghash & 0xffffffff) + tag_high = socket.htonl(taghash >> 32) + + return pack(header_fmt, b"libudev", socket.htonl(UDEV_MONITOR_MAGIC), + header_size, header_size, proplen, subsys_hash, devtype_hash, + tag_low, tag_high) + + +def BuildPacket(dev): + subsys = dev.subsystem + devtype = dev.device_type + + proplist = bytearray() + for p in dev.properties: + proppair = p + "=" + dev.properties[p] + proplist = proplist + proppair.encode() + bytes([0]) + + tag_hash = 0 + for t in dev.tags: + tag_hash = tag_hash | bloomHash(t) + +# print(proplist) +# print(proplist.hex()) +# print(data[header_size:].hex()) + + hdr = buildHeader(len(proplist), subsys, devtype, tag_hash) + + return hdr + proplist + +def errcheck(ret, func, args): + if ret == -1: + e = get_errno() + raise OSError(e, os.strerror(e)) + +def sendMsgThread(): + libc = CDLL('libc.so.6', use_errno=True) + libc.setns.errcheck = errcheck + libc.setns(nsfd.fileno(), CLONE_NEWNET) + sendfd = socket.socket(socket.AF_NETLINK, socket.SOCK_RAW|socket.SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT) + if options.debug: + print(sendfd) + + while True: + dev = None + lock.acquire() + if len(device_list): + dev = device_list.pop(0) + lock.release() + + if dev: + if options.debug: + print('working event {0.action}: {0.device_path}'.format(dev)) + pkt = BuildPacket(dev) + + # Older kernels (like 4.15 on Ubuntu 18.04) return ECONNREFUSED + # to work around this we just ignore this specific error as the + # data still is send on the socket. + try: + sendfd.sendto(pkt, (0, UDEV_MONITOR_UDEV)) + except ConnectionRefusedError: + pass + +def udev_event_callback(dev): + if options.debug: + print('background event {0.action}: {0.device_path}'.format(dev)) + lock.acquire() + device_list.append(dev) + lock.release() + +def main(): + parser = argparse.ArgumentParser(description='USB device passthrough for docker containers', add_help=False) + + parser.add_argument("-i", "--instance", type=str, required=True, + help="Docker instance") + + parser.add_argument("-d", "--debug", action="store_true", + help="Enable Debug Loggin") + + global options + options = parser.parse_args() + + client = docker.from_env() + container = client.containers.get(options.instance) + netns_file = container.attrs['NetworkSettings']['SandboxKey'] + + if options.debug: + print("DBG: Container netns file %s" % netns_file) + + global nsfd + nsfd = open(netns_file, "r") + + threading.Thread(target=sendMsgThread).start() + + context = pyudev.Context() + context.log_priority = syslog.LOG_DEBUG + monitor = pyudev.Monitor.from_netlink(context) + observer = pyudev.MonitorObserver(monitor, callback=udev_event_callback, name='monitor-observer') + + observer.start() + + + +if __name__ == '__main__': + main() From e679a443c6c61aa4c4a6aee4cb79332797463e63 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 9 May 2019 07:15:07 -0500 Subject: [PATCH 14/55] docker-compose: Add example for development Add example of how you can setup the docker-compose.yaml to point to a local git checkout of lava for development purposes. Signed-off-by: Kumar Gala --- docker-compose.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index 995e196..7a33bae 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -110,6 +110,15 @@ services: - /run/udev/control:/run/udev/control:ro # libudev expects it for udev events - /boot:/boot:ro - /lib/modules:/lib/modules:ro + # Example for development + # If you wanted to point to a local git checkout of lava for development + # of lava_dispatcher, you can uncomment out the lines below and + # set the 'source:' to point to where your lava checkout is + # The example assumes its relative in ../lava + # +# - type: bind +# source: ../lava/lava_dispatcher +# target: /usr/lib/python3/dist-packages/lava_dispatcher ser2net: container_name: lava-ser2net From eb79f658bc8ab93cf3137fc43e9aba5df12eaf41 Mon Sep 17 00:00:00 2001 From: Vincent Wan Date: Wed, 8 May 2019 15:33:38 -0700 Subject: [PATCH 15/55] Fix pyocd boot action method to print out version of binary used The commit changes the boot action method to print out the version of the pyocd-flashtool utility used by the method. It is non-Debian so it was previously failing with the previous methodology of querying the version number. The changed file is provided as a lava-dispatcher overlay. Signed-off-by: Vincent Wan --- docker-compose.yaml | 1 + .../lava_dispatcher/actions/boot/pyocd.py | 164 ++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py diff --git a/docker-compose.yaml b/docker-compose.yaml index 7a33bae..94b6945 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -110,6 +110,7 @@ services: - /run/udev/control:/run/udev/control:ro # libudev expects it for udev events - /boot:/boot:ro - /lib/modules:/lib/modules:ro + - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:ro # Example for development # If you wanted to point to a local git checkout of lava for development # of lava_dispatcher, you can uncomment out the lines below and diff --git a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py new file mode 100644 index 0000000..f1e2441 --- /dev/null +++ b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py @@ -0,0 +1,164 @@ +# Copyright (C) 2016 Linaro Limited +# +# Author: Tyler Baker +# +# This file is part of LAVA Dispatcher. +# +# LAVA Dispatcher is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LAVA Dispatcher is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along +# with this program; if not, see . + +from lava_common.utils import debian_filename_version +from lava_dispatcher.action import Pipeline, Action, JobError +from lava_dispatcher.logical import Boot, RetryAction +from lava_dispatcher.actions.boot import BootAction +from lava_dispatcher.connections.serial import ConnectDevice +from lava_dispatcher.utils.shell import which +from lava_dispatcher.utils.strings import substitute +from lava_dispatcher.power import ResetDevice +from lava_dispatcher.utils.udev import WaitDeviceBoardID +from lava_common.exceptions import InfrastructureError + +import subprocess + +class PyOCD(Boot): + + compatibility = 4 # FIXME: change this to 5 and update test cases + + def __init__(self, parent, parameters): + super().__init__(parent) + self.action = BootPyOCD() + self.action.section = self.action_type + self.action.job = self.job + parent.add_action(self.action, parameters) + + @classmethod + def accepts(cls, device, parameters): + if "pyocd" not in device["actions"]["boot"]["methods"]: + return False, '"pyocd" was not in the device configuration boot methods' + if "method" not in parameters: + return False, '"method" was not in parameters' + if parameters["method"] != "pyocd": + return False, '"method" was not "pyocd"' + if "board_id" not in device: + return False, '"board_id" is not in the device configuration' + return True, "accepted" + + +class BootPyOCD(BootAction): + + name = "boot-pyocd-image" + description = "boot pyocd image with retry" + summary = "boot pyocd image with retry" + + def populate(self, parameters): + self.internal_pipeline = Pipeline( + parent=self, job=self.job, parameters=parameters + ) + self.internal_pipeline.add_action(BootPyOCDRetry()) + + +class BootPyOCDRetry(RetryAction): + + name = "boot-pyocd-image" + description = "boot pyocd image using the command line interface" + summary = "boot pyocd image" + + def populate(self, parameters): + self.internal_pipeline = Pipeline( + parent=self, job=self.job, parameters=parameters + ) + if self.job.device.hard_reset_command: + self.internal_pipeline.add_action(ResetDevice()) + self.internal_pipeline.add_action( + WaitDeviceBoardID(self.job.device.get("board_id")) + ) + self.internal_pipeline.add_action(FlashPyOCDAction()) + self.internal_pipeline.add_action(ConnectDevice()) + + +class FlashPyOCDAction(Action): + + name = "flash-pyocd" + description = "flash pyocd to boot the image" + summary = "flash pyocd to boot the image" + + @staticmethod + def filename_version(binary): + # if binary is not absolute, fail. + msg = "Unable to retrieve version of %s" % binary + try: + ver_str = ( + subprocess.check_output((binary, "--version")) + .decode("utf-8", errors="replace") + ) + if not ver_str: + raise InfrastructureError(msg) + except subprocess.CalledProcessError: + raise InfrastructureError(msg) + return "%s, version %s" % (binary, ver_str) + + def __init__(self): + super().__init__() + self.base_command = [] + self.exec_list = [] + + def validate(self): + super().validate() + boot = self.job.device["actions"]["boot"]["methods"]["pyocd"] + pyocd_binary = boot["parameters"]["command"] + binary = which(pyocd_binary) + self.logger.info(self.filename_version(binary)) + self.base_command = [pyocd_binary] + self.base_command.extend(boot["parameters"].get("options", [])) + if self.job.device["board_id"] == "0000000000": + self.errors = "[PYOCD] board_id unset" + substitutions = {} + self.base_command.extend(["--board", self.job.device["board_id"]]) + for action in self.get_namespace_keys("download-action"): + pyocd_full_command = [] + image_arg = self.get_namespace_data( + action="download-action", label=action, key="image_arg" + ) + action_arg = self.get_namespace_data( + action="download-action", label=action, key="file" + ) + if image_arg: + if not isinstance(image_arg, str): + self.errors = "image_arg is not a string (try quoting it)" + continue + substitutions["{%s}" % action] = action_arg + pyocd_full_command.extend(self.base_command) + pyocd_full_command.extend(substitute([image_arg], substitutions)) + self.exec_list.append(pyocd_full_command) + else: + pyocd_full_command.extend(self.base_command) + pyocd_full_command.extend([action_arg]) + self.exec_list.append(pyocd_full_command) + if not self.exec_list: + self.errors = "No PyOCD command to execute" + + def run(self, connection, max_end_time): + connection = self.get_namespace_data( + action="shared", label="shared", key="connection", deepcopy=False + ) + connection = super().run(connection, max_end_time) + for pyocd_command in self.exec_list: + pyocd = " ".join(pyocd_command) + self.logger.info("PyOCD command: %s", pyocd) + if not self.run_command(pyocd.split(" ")): + raise JobError("%s command failed" % (pyocd.split(" "))) + self.set_namespace_data( + action="shared", label="shared", key="connection", value=connection + ) + return connection From afd717deca9fa09e8f0b06333e03ec4dc28e4bf7 Mon Sep 17 00:00:00 2001 From: Vincent Wan Date: Wed, 8 May 2019 15:37:14 -0700 Subject: [PATCH 16/55] Install vim automatically into the dispatcher image As a convenience for the developer Signed-off-by: Vincent Wan --- lite-lava-dispatcher/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index cc4d2d0..3704d57 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -4,7 +4,7 @@ FROM ${DC_DISPATCHER_IMAGE} RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install \ - python3-pip libusb-1.0.0 && \ + python3-pip libusb-1.0.0 vim && \ apt-get -y -t stretch-backports install libudev1 && \ pip3 install --upgrade setuptools && \ pip3 install pyOCD From 6ae7201cce0a02dc0ddfab950ade2b8767463051 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 09:33:51 -0500 Subject: [PATCH 17/55] udev-forward.py: add copyright header/license Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index c763f26..a99af2d 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -1,5 +1,27 @@ #!/usr/bin/python3 +# Copyright 2019 Linaro Limited +# Author: Kumar Gala + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +# +# UDEV event forwarding to a container +# +# based on https://github.com/eiz/udevfw + import os import sys import socket From 700cbe25c92a00c3479c904ee7b9081625a4f560 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 09:49:09 -0500 Subject: [PATCH 18/55] udev-forward.py: setting logging in debug mode Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index a99af2d..9852023 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -162,7 +162,8 @@ def main(): threading.Thread(target=sendMsgThread).start() context = pyudev.Context() - context.log_priority = syslog.LOG_DEBUG + if options.debug: + context.log_priority = syslog.LOG_DEBUG monitor = pyudev.Monitor.from_netlink(context) observer = pyudev.MonitorObserver(monitor, callback=udev_event_callback, name='monitor-observer') From c16b6f97f7701996ed37279c9e2a3a5649fba830 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 10:00:12 -0500 Subject: [PATCH 19/55] udev-forward.py: Move init of udev observer Move the init of the pyudev.MonitorObserver up before handling of packet thread Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index 9852023..e69b638 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -149,6 +149,14 @@ def main(): global options options = parser.parse_args() + context = pyudev.Context() + if options.debug: + context.log_priority = syslog.LOG_DEBUG + monitor = pyudev.Monitor.from_netlink(context) + observer = pyudev.MonitorObserver(monitor, callback=udev_event_callback, name='monitor-observer') + + observer.start() + client = docker.from_env() container = client.containers.get(options.instance) netns_file = container.attrs['NetworkSettings']['SandboxKey'] @@ -161,14 +169,6 @@ def main(): threading.Thread(target=sendMsgThread).start() - context = pyudev.Context() - if options.debug: - context.log_priority = syslog.LOG_DEBUG - monitor = pyudev.Monitor.from_netlink(context) - observer = pyudev.MonitorObserver(monitor, callback=udev_event_callback, name='monitor-observer') - - observer.start() - if __name__ == '__main__': From 5f03e81cedccd183325257c6917cece8fda9f4ef Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 09:48:47 -0500 Subject: [PATCH 20/55] udev-forward.py: Use a queue for passing work Move to using a queue so it handles the syncronization, etc for us. Also make a subtle change to build the packet in the udev thread so if we support multicasting we only build the packet once and have multiple send threads for each container we would send to. Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index e69b638..bf27fbc 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -30,6 +30,7 @@ import threading import docker import pyhash +import queue from struct import * from ctypes import CDLL import argparse @@ -39,8 +40,7 @@ CLONE_NEWNET = 0x40000000 UDEV_MONITOR_MAGIC = 0xFEEDCAFE -device_list = [] -lock = threading.Lock() +workqueue = queue.Queue() hasher = pyhash.murmur2_32() @@ -111,17 +111,9 @@ def sendMsgThread(): print(sendfd) while True: - dev = None - lock.acquire() - if len(device_list): - dev = device_list.pop(0) - lock.release() - - if dev: - if options.debug: - print('working event {0.action}: {0.device_path}'.format(dev)) - pkt = BuildPacket(dev) + (work_type, pkt) = workqueue.get() + if work_type == "PKT": # Older kernels (like 4.15 on Ubuntu 18.04) return ECONNREFUSED # to work around this we just ignore this specific error as the # data still is send on the socket. @@ -133,9 +125,7 @@ def sendMsgThread(): def udev_event_callback(dev): if options.debug: print('background event {0.action}: {0.device_path}'.format(dev)) - lock.acquire() - device_list.append(dev) - lock.release() + workqueue.put(("PKT", BuildPacket(dev))) def main(): parser = argparse.ArgumentParser(description='USB device passthrough for docker containers', add_help=False) From b044717dec80bfce5f905c797cbbf89304d7b530 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 11:42:17 -0500 Subject: [PATCH 21/55] udev-forward.py: handle container lifecycle This change supports dealing with the lifecycle of the container and know how to setup the sendMsgThread for this lifecycle. We handle three cases: 1. Container is up already 2. Container comes up after we are running 3. Container goes down after we are running For case 2/3 we loop so we can handle multiple up/downs with having to restart the script. Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 48 +++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index bf27fbc..9be189b 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -122,11 +122,26 @@ def sendMsgThread(): except ConnectionRefusedError: pass + if work_type == "DOCKER": + nsfd.close() + break + def udev_event_callback(dev): if options.debug: print('background event {0.action}: {0.device_path}'.format(dev)) workqueue.put(("PKT", BuildPacket(dev))) +def start_up_thread(instance): + container = client.containers.get(instance) + netns_file = container.attrs['NetworkSettings']['SandboxKey'] + if options.debug: + print("DBG: Container[%s] netns file %s" % (instance, netns_file)) + global nsfd + global t + nsfd = open(netns_file, "r") + t = threading.Thread(name=instance, target=sendMsgThread) + t.start() + def main(): parser = argparse.ArgumentParser(description='USB device passthrough for docker containers', add_help=False) @@ -147,18 +162,33 @@ def main(): observer.start() - client = docker.from_env() - container = client.containers.get(options.instance) - netns_file = container.attrs['NetworkSettings']['SandboxKey'] - - if options.debug: - print("DBG: Container netns file %s" % netns_file) + instance = options.instance - global nsfd - nsfd = open(netns_file, "r") + global client - threading.Thread(target=sendMsgThread).start() + client = docker.from_env() + # If the container is running get the namespace file (SandboxKey) + # and startup the sendMsgThread + f = {'name': [ instance ], 'status': 'running'} + if client.containers.list(filters=f): + start_up_thread(instance) + + # Watch for docker events to startup or shutdown a new sendMsgThread + f = {'type': 'container', 'event': ['start', 'stop'], 'container': [ instance ]} + try: + for event in client.events(decode=True, filters=f): + instance = event['Actor']['Attributes']['name'] + if options.debug: + print("DOCKER: %s for %s" % (event['Action'], instance)) + if event['Action'] == 'start': + start_up_thread(instance) + if event['Action'] == 'stop': + workqueue.put(("DOCKER", event['Action'])) + t.join() + except KeyboardInterrupt: + if t.is_alive(): + workqueue.put(("DOCKER", 'stop')) if __name__ == '__main__': From 21f18803d067340cd2e0e568f5da0e485b7b3121 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 11:47:22 -0500 Subject: [PATCH 22/55] udev-forward.py: Move netns fd into sendMsgThread Just handle all the open/close for the netfs in the thread. Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index 9be189b..972ce65 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -103,6 +103,7 @@ def errcheck(ret, func, args): raise OSError(e, os.strerror(e)) def sendMsgThread(): + nsfd = open(netns_file, "r") libc = CDLL('libc.so.6', use_errno=True) libc.setns.errcheck = errcheck libc.setns(nsfd.fileno(), CLONE_NEWNET) @@ -133,12 +134,11 @@ def udev_event_callback(dev): def start_up_thread(instance): container = client.containers.get(instance) + global netns_file netns_file = container.attrs['NetworkSettings']['SandboxKey'] if options.debug: print("DBG: Container[%s] netns file %s" % (instance, netns_file)) - global nsfd global t - nsfd = open(netns_file, "r") t = threading.Thread(name=instance, target=sendMsgThread) t.start() From bdbe4135b9be08e0063e886586e804919cf83346 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 12:35:38 -0500 Subject: [PATCH 23/55] udev-forward.py: remove some cruft Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index 972ce65..1fca2ee 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -89,10 +89,6 @@ def BuildPacket(dev): for t in dev.tags: tag_hash = tag_hash | bloomHash(t) -# print(proplist) -# print(proplist.hex()) -# print(data[header_size:].hex()) - hdr = buildHeader(len(proplist), subsys, devtype, tag_hash) return hdr + proplist From 30022d76c03b2ef4f2894010626c8fc91da8c9d7 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 13:06:25 -0500 Subject: [PATCH 24/55] udev-forward.py: support multiple instances Make changes to support multiplexing data to multiple containers. We either pass some per thread information as args to the thread (netns_file) or we make the thread and workqueue tracked on a per container basis (introduction of containerClass and containers dict) you can now pass multiple -i options for the set of containers you want events sent to. Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 54 +++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index 1fca2ee..8d17c14 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -40,10 +40,15 @@ CLONE_NEWNET = 0x40000000 UDEV_MONITOR_MAGIC = 0xFEEDCAFE -workqueue = queue.Queue() - hasher = pyhash.murmur2_32() +containers = {} + +class containersClass: + def __init__(self): + self.thread = threading.Thread() + self.wq = queue.Queue() + def bloomHash(tag): bits = 0 hash = hasher(tag.encode()) @@ -98,7 +103,7 @@ def errcheck(ret, func, args): e = get_errno() raise OSError(e, os.strerror(e)) -def sendMsgThread(): +def sendMsgThread(inst, netns_file): nsfd = open(netns_file, "r") libc = CDLL('libc.so.6', use_errno=True) libc.setns.errcheck = errcheck @@ -108,7 +113,7 @@ def sendMsgThread(): print(sendfd) while True: - (work_type, pkt) = workqueue.get() + (work_type, pkt) = containers[inst].wq.get() if work_type == "PKT": # Older kernels (like 4.15 on Ubuntu 18.04) return ECONNREFUSED @@ -126,23 +131,24 @@ def sendMsgThread(): def udev_event_callback(dev): if options.debug: print('background event {0.action}: {0.device_path}'.format(dev)) - workqueue.put(("PKT", BuildPacket(dev))) + for i in containers: + if containers[i].thread.is_alive(): + containers[i].wq.put(("PKT", BuildPacket(dev))) -def start_up_thread(instance): - container = client.containers.get(instance) - global netns_file - netns_file = container.attrs['NetworkSettings']['SandboxKey'] +def start_up_thread(name): + container = client.containers.get(name) + ns_filename = container.attrs['NetworkSettings']['SandboxKey'] if options.debug: - print("DBG: Container[%s] netns file %s" % (instance, netns_file)) - global t - t = threading.Thread(name=instance, target=sendMsgThread) - t.start() + print("DBG: Container[%s] netns file %s" % (name, ns_filename)) + containers[name] = containersClass() + containers[name].thread = threading.Thread(name=name, target=sendMsgThread, args=(name, ns_filename)) + containers[name].thread.start() def main(): parser = argparse.ArgumentParser(description='USB device passthrough for docker containers', add_help=False) - parser.add_argument("-i", "--instance", type=str, required=True, - help="Docker instance") + parser.add_argument("-i", "--instance", type=str, required=True, action='append', + help="Docker instance", dest="names") parser.add_argument("-d", "--debug", action="store_true", help="Enable Debug Loggin") @@ -158,20 +164,19 @@ def main(): observer.start() - instance = options.instance - global client client = docker.from_env() # If the container is running get the namespace file (SandboxKey) # and startup the sendMsgThread - f = {'name': [ instance ], 'status': 'running'} + f = {'name': options.names, 'status': 'running'} if client.containers.list(filters=f): - start_up_thread(instance) + for name in options.names: + start_up_thread(name) # Watch for docker events to startup or shutdown a new sendMsgThread - f = {'type': 'container', 'event': ['start', 'stop'], 'container': [ instance ]} + f = {'type': 'container', 'event': ['start', 'stop'], 'container': options.names } try: for event in client.events(decode=True, filters=f): instance = event['Actor']['Attributes']['name'] @@ -180,11 +185,12 @@ def main(): if event['Action'] == 'start': start_up_thread(instance) if event['Action'] == 'stop': - workqueue.put(("DOCKER", event['Action'])) - t.join() + containers[instance].wq.put(("DOCKER", event['Action'])) + containers[instance].thread.join() except KeyboardInterrupt: - if t.is_alive(): - workqueue.put(("DOCKER", 'stop')) + for i in containers: + if containers[i].thread.is_alive(): + containers[i].wq.put(("DOCKER", 'stop')) if __name__ == '__main__': From 8a78490c281cb08409c72306a99da1ff5167c536 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 10 May 2019 13:52:27 -0500 Subject: [PATCH 25/55] udev-forward.py: rename instance var to name Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index 8d17c14..ce969c9 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -179,14 +179,14 @@ def main(): f = {'type': 'container', 'event': ['start', 'stop'], 'container': options.names } try: for event in client.events(decode=True, filters=f): - instance = event['Actor']['Attributes']['name'] + name = event['Actor']['Attributes']['name'] if options.debug: - print("DOCKER: %s for %s" % (event['Action'], instance)) + print("DOCKER: %s for %s" % (event['Action'], name)) if event['Action'] == 'start': - start_up_thread(instance) + start_up_thread(name) if event['Action'] == 'stop': - containers[instance].wq.put(("DOCKER", event['Action'])) - containers[instance].thread.join() + containers[name].wq.put(("DOCKER", event['Action'])) + containers[name].thread.join() except KeyboardInterrupt: for i in containers: if containers[i].thread.is_alive(): From deae023c483446c200b4de3977779c259228cf15 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Sat, 11 May 2019 09:01:22 -0500 Subject: [PATCH 26/55] udev-forward.py: Replace Murmur pyhash with pure python version Found a pure python implementation of murmur2 hash that we can use to replace the need to pull in pyhash. pyhash is always an option if the performance of the python implementation is an issue, but seems unlikely as what we hash are pretty small strings. Grabbed the python implementation from here: https://github.com/Orochimarufan/cdev/blob/master/cdev/murmurhash2.py Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 86 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index ce969c9..dcc8f16 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -1,6 +1,8 @@ #!/usr/bin/python3 # Copyright 2019 Linaro Limited +# Copyright (c) 2014 Taeyeon Mori (for MurmurHash2 code) + # Author: Kumar Gala # This program is free software; you can redistribute it and/or modify @@ -18,6 +20,9 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # +# The MurmurHash2 implementation is take from: +# https://github.com/Orochimarufan/cdev/blob/master/cdev/murmurhash2.py +# # UDEV event forwarding to a container # # based on https://github.com/eiz/udevfw @@ -29,8 +34,8 @@ import syslog import threading import docker -import pyhash import queue +import array from struct import * from ctypes import CDLL import argparse @@ -40,8 +45,6 @@ CLONE_NEWNET = 0x40000000 UDEV_MONITOR_MAGIC = 0xFEEDCAFE -hasher = pyhash.murmur2_32() - containers = {} class containersClass: @@ -49,9 +52,80 @@ def __init__(self): self.thread = threading.Thread() self.wq = queue.Queue() +if array.array('L').itemsize == 4: + uint32_t = 'L' +elif array.array('I').itemsize == 4: + uint32_t = 'I' +else: + raise ImportError("Could not determine 4-byte array code!") + +def MurmurHash2(input, seed=0): + """ + Generate a 32-bit hash from a string using the MurmurHash2 algorithm + + takes a bytestring! + + Pure-python implementation. + """ + l = len(input) + + # m and r are mixing constants generated offline + # They're not really magic, they just happen to work well + m = 0x5bd1e995 + #r = 24 + + # Initialize the hash to a "random" value + h = seed ^ l + + # Mix 4 bytes at a time into the hash + x = l % 4 + o = l - x + + for k in array.array(uint32_t, input[:o]): + # Original Algorithm + #k *= m; + #k ^= k >> r; + #k *= m; + + #h *= m; + #h ^= k; + + # My Algorithm + k = (k * m) & 0xFFFFFFFF + h = (((k ^ (k >> 24)) * m) ^ (h * m)) & 0xFFFFFFFF + + # Explanation: We need to keep it 32-bit. There are a few rules: + # 1. Inputs to >> must be truncated, it never overflows + # 2. Inputs to * must be truncated, it may overflow + # 3. Inputs to ^ may be overflowed, it overflows if any input was overflowed + # 4. The end result must be truncated + # Therefore: + # b = k * m -> may overflow, we truncate it because b >> r cannot take overflowed data + # c = b ^ (b >> r) -> never overflows, as b is truncated and >> never does + # h = (c * m) ^ (h * m) -> both inputs to ^ may overflow, but since ^ can take it, we truncate once afterwards. + + # Handle the last few bytes of the input array + if x > 0: + if x > 2: + h ^= input[o+2] << 16 + if x > 1: + h ^= input[o+1] << 8 + h = ((h ^ input[o]) * m) & 0xFFFFFFFF + + # Do a few final mixes of the hash to ensure the last few + # bytes are well incorporated + + # Original: + #h ^= h >> 13; + #h *= m; + #h ^= h >> 15; + + h = ((h ^ (h >> 13)) * m) & 0xFFFFFFFF + return (h ^ (h >> 15)) + def bloomHash(tag): bits = 0 - hash = hasher(tag.encode()) + hash = MurmurHash2(tag.encode()) bits = bits | 1 << (hash & 63) bits = bits | 1 << ((hash >> 6) & 63) @@ -68,10 +142,10 @@ def buildHeader(proplen, subsys, devtype, taghash): devtype_hash = 0 if subsys: - subsys_hash = socket.htonl(hasher(subsys.encode())) + subsys_hash = socket.htonl(MurmurHash2(subsys.encode())) if devtype: - devtype_hash = socket.htonl(hasher(devtype.encode())) + devtype_hash = socket.htonl(MurmurHash2(devtype.encode())) tag_low = socket.htonl(taghash & 0xffffffff) tag_high = socket.htonl(taghash >> 32) From b0bc1fc4601248ad0a5018fc402aa41c1f128544 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Mon, 13 May 2019 08:26:33 -0500 Subject: [PATCH 27/55] udev-forward.py: Fix nameerror for get_errno We forgot to import get_errno from ctypes so we get a NameError if this code path gets executed. Signed-off-by: Kumar Gala --- contrib/udev-forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index dcc8f16..e460065 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -37,7 +37,7 @@ import queue import array from struct import * -from ctypes import CDLL +from ctypes import CDLL, get_errno import argparse NETLINK_KOBJECT_UEVENT = 15 From 9e6bf574804ff1c8e5fcf5fda701705a6d05e659 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Wed, 15 May 2019 09:16:51 -0500 Subject: [PATCH 28/55] lite-lava-dispatcher: add Segger jlink Add fetching a version of segger jlink into the dispatcher. Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index 3704d57..a593bc7 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -2,9 +2,15 @@ ARG DC_DISPATCHER_IMAGE FROM ${DC_DISPATCHER_IMAGE} +ENV JLINK_DEB="JLink_Linux_V644h_x86_64.deb" +ENV JLINK_URL="https://www.segger.com/downloads/jlink/${JLINK_DEB}" + RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install \ python3-pip libusb-1.0.0 vim && \ apt-get -y -t stretch-backports install libudev1 && \ pip3 install --upgrade setuptools && \ - pip3 install pyOCD + pip3 install pyOCD && \ + wget --post-data="accept_license_agreement=accepted&non_emb_ctr=confirmed&submit=Download+software" ${JLINK_URL} -O ${JLINK_DEB} && \ + dpkg -i ${JLINK_DEB} && \ + rm ${JLINK_DEB} From f78e62336f77f02f382929b3467cd9c376b1a6aa Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 17 May 2019 07:41:40 -0500 Subject: [PATCH 29/55] lite-lava-dispatcher: adds symlink for JLinkExe to /usr/local/bin Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index a593bc7..4c16894 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -13,4 +13,5 @@ RUN apt-get update && \ pip3 install pyOCD && \ wget --post-data="accept_license_agreement=accepted&non_emb_ctr=confirmed&submit=Download+software" ${JLINK_URL} -O ${JLINK_DEB} && \ dpkg -i ${JLINK_DEB} && \ - rm ${JLINK_DEB} + rm ${JLINK_DEB} && \ + ln -s /opt/SEGGER/JLink/JLinkExe /usr/local/bin From 4332eed2d28daa2296cc9331c4444bd13fd7f8af Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Fri, 17 May 2019 07:40:27 -0500 Subject: [PATCH 30/55] lite-lava-dispatcher: Add openocd from Zephyr SDK Pull in the host-tools from Zephyr SDK. This also gets us QEMU for ARM as well (plus some other tools from Zephyr that might be useful in the future). For now we symlink openocd into /usr/local/bin to expose it. Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index 4c16894..4654509 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -4,6 +4,8 @@ FROM ${DC_DISPATCHER_IMAGE} ENV JLINK_DEB="JLink_Linux_V644h_x86_64.deb" ENV JLINK_URL="https://www.segger.com/downloads/jlink/${JLINK_DEB}" +ENV ZEPHYR_SDK="zephyr-sdk-0.10.0-pr-77-setup.run" +ENV ZEPHYR_SDK_URL="https://builds.zephyrproject.org/zephyrproject-rtos/sdk-ng/77/${ZEPHYR_SDK}" RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install \ @@ -14,4 +16,10 @@ RUN apt-get update && \ wget --post-data="accept_license_agreement=accepted&non_emb_ctr=confirmed&submit=Download+software" ${JLINK_URL} -O ${JLINK_DEB} && \ dpkg -i ${JLINK_DEB} && \ rm ${JLINK_DEB} && \ - ln -s /opt/SEGGER/JLink/JLinkExe /usr/local/bin + ln -s /opt/SEGGER/JLink/JLinkExe /usr/local/bin && \ + wget ${ZEPHYR_SDK_URL} -O ${ZEPHYR_SDK} && \ + chmod a+x ${ZEPHYR_SDK} && \ + ./${ZEPHYR_SDK} --noexec --keep && \ + ./toolchains/zephyr-sdk-x86_64-hosttools-standalone-0.9.sh -d /opt/zephyr-sdk -y && \ + rm ${ZEPHYR_SDK} && rm -r toolchains && \ + ln -s /opt/zephyr-sdk/sysroots/x86_64-pokysdk-linux/usr/bin/openocd /usr/local/bin/ From 15a73eb7e17ed3efdf3eaa6fe182cd6961545236 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 6 Jun 2019 09:21:40 -0500 Subject: [PATCH 31/55] lite-lava-dispatcher: Update Zephyr SDK version Update to Zephyr SDK 0.10.1-rc1 so we have a stable URL. Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index 4654509..31c20ed 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -4,8 +4,8 @@ FROM ${DC_DISPATCHER_IMAGE} ENV JLINK_DEB="JLink_Linux_V644h_x86_64.deb" ENV JLINK_URL="https://www.segger.com/downloads/jlink/${JLINK_DEB}" -ENV ZEPHYR_SDK="zephyr-sdk-0.10.0-pr-77-setup.run" -ENV ZEPHYR_SDK_URL="https://builds.zephyrproject.org/zephyrproject-rtos/sdk-ng/77/${ZEPHYR_SDK}" +ENV ZEPHYR_SDK="zephyr-sdk-0.10.1-rc1-setup.run" +ENV ZEPHYR_SDK_URL="https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.10.1-rc1/${ZEPHYR_SDK}" RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install \ From 45fbf7b85dca1575350eb1ebfc8d6a9eeba497fa Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Tue, 18 Jun 2019 10:43:46 -0500 Subject: [PATCH 32/55] lite-lava-dispatcher: Update how we get zephyr sdk Now that we publish the zephyr sdk hosttools we can just grab that package and reduce how much data we need to fetch. Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index 31c20ed..cf98c9e 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -4,8 +4,8 @@ FROM ${DC_DISPATCHER_IMAGE} ENV JLINK_DEB="JLink_Linux_V644h_x86_64.deb" ENV JLINK_URL="https://www.segger.com/downloads/jlink/${JLINK_DEB}" -ENV ZEPHYR_SDK="zephyr-sdk-0.10.1-rc1-setup.run" -ENV ZEPHYR_SDK_URL="https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.10.1-rc1/${ZEPHYR_SDK}" +ENV ZEPHYR_HOST_TOOLS="zephyr-sdk-x86_64-hosttools-standalone-0.9.sh" +ENV ZEPHYR_HOST_TOOLS_URL="https://builds.zephyrproject.org/sdk/0.10.1/${ZEPHYR_HOST_TOOLS}" RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install \ @@ -17,9 +17,8 @@ RUN apt-get update && \ dpkg -i ${JLINK_DEB} && \ rm ${JLINK_DEB} && \ ln -s /opt/SEGGER/JLink/JLinkExe /usr/local/bin && \ - wget ${ZEPHYR_SDK_URL} -O ${ZEPHYR_SDK} && \ - chmod a+x ${ZEPHYR_SDK} && \ - ./${ZEPHYR_SDK} --noexec --keep && \ - ./toolchains/zephyr-sdk-x86_64-hosttools-standalone-0.9.sh -d /opt/zephyr-sdk -y && \ - rm ${ZEPHYR_SDK} && rm -r toolchains && \ + wget ${ZEPHYR_HOST_TOOLS_URL} -O ${ZEPHYR_HOST_TOOLS} && \ + chmod a+x ${ZEPHYR_HOST_TOOLS} && \ + ./${ZEPHYR_HOST_TOOLS} -d /opt/zephyr-sdk -y && \ + rm ${ZEPHYR_HOST_TOOLS} && \ ln -s /opt/zephyr-sdk/sysroots/x86_64-pokysdk-linux/usr/bin/openocd /usr/local/bin/ From dd0038eadffd2d3f32243b04f9462123837d9bf0 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 13 Jun 2019 19:09:47 +0300 Subject: [PATCH 33/55] contrib/udev-forward.py: Typo fix in option description. --- contrib/udev-forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/udev-forward.py b/contrib/udev-forward.py index e460065..bac8142 100755 --- a/contrib/udev-forward.py +++ b/contrib/udev-forward.py @@ -225,7 +225,7 @@ def main(): help="Docker instance", dest="names") parser.add_argument("-d", "--debug", action="store_true", - help="Enable Debug Loggin") + help="Enable Debug Logging") global options options = parser.parse_args() From 2661cfa26897455933400428d26b93d54ef25df2 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 13 Jun 2019 22:27:10 +0300 Subject: [PATCH 34/55] Makefile: Add "install" target to install host-side files. Like, udev rules and usb passthru script. For udev rules, the idea is that a user will update repo's template with their board serial number first. --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index a98d42a..f7d76dd 100644 --- a/Makefile +++ b/Makefile @@ -4,3 +4,7 @@ all: clean: docker-compose rm -vsf docker volume rm -f lava-server-pgdata lava-server-joboutput lava-server-devices lava-server-health-checks + +install: + sudo cp contrib/LAVA.rules /etc/udev/rules.d/ + sudo cp contrib/usb-passthrough /usr/local/bin/ From d7ec483b6069da49b8622f8fca0427314c7bd264 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 20 Jun 2019 05:50:22 +0300 Subject: [PATCH 35/55] Makefile: install: It's mandatory to reload udev rules after updates. Don't rely on udevd (and especially, systemd-udevd) detection of updates, it easily fails for anything by initial creation of a rule file. --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index f7d76dd..2874a26 100644 --- a/Makefile +++ b/Makefile @@ -8,3 +8,4 @@ clean: install: sudo cp contrib/LAVA.rules /etc/udev/rules.d/ sudo cp contrib/usb-passthrough /usr/local/bin/ + sudo udevadm control --reload From ced1227fb7165e29dcaba7f712415d15939c1c73 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Mon, 24 Jun 2019 12:17:23 -0500 Subject: [PATCH 36/55] lite-lava-dispatcher: Update to tip of pyOCD Until we have a new release of pyOCD, use git head to get support for LPC55S69 board. Signed-off-by: Kumar Gala --- lite-lava-dispatcher/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lite-lava-dispatcher/Dockerfile b/lite-lava-dispatcher/Dockerfile index cf98c9e..7798b91 100644 --- a/lite-lava-dispatcher/Dockerfile +++ b/lite-lava-dispatcher/Dockerfile @@ -12,7 +12,7 @@ RUN apt-get update && \ python3-pip libusb-1.0.0 vim && \ apt-get -y -t stretch-backports install libudev1 && \ pip3 install --upgrade setuptools && \ - pip3 install pyOCD && \ + pip3 install -U git+https://github.com/mbedmicro/pyOCD && \ wget --post-data="accept_license_agreement=accepted&non_emb_ctr=confirmed&submit=Download+software" ${JLINK_URL} -O ${JLINK_DEB} && \ dpkg -i ${JLINK_DEB} && \ rm ${JLINK_DEB} && \ From 124d44bb71c31220e8d62954f94ba9eedc12699d Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 14 Jun 2019 09:59:49 +0300 Subject: [PATCH 37/55] Makefile: lava-setup: Automate setup of LAVA users. --- Makefile | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Makefile b/Makefile index 2874a26..8880f35 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,12 @@ +# Host address on which LAVA is accessible. +LAVA_HOST = localhost +# LAVA user to create/use. +LAVA_USER = admin +# lavacli "identity" (cached credential name) for the above user, to submit jobs +# "dispatcher" is legacy name from the original instructions. +LAVA_IDENTITY = dispatcher + + all: docker-compose up @@ -9,3 +18,19 @@ install: sudo cp contrib/LAVA.rules /etc/udev/rules.d/ sudo cp contrib/usb-passthrough /usr/local/bin/ sudo udevadm control --reload + +lava-setup: lava-user lava-identity + +lava-user: + @echo -n "Input LAVA admin user passwd: "; \ + read passwd; \ + test -n "$$passwd" && docker exec -it lava-server lava-server manage users add $(LAVA_USER) --superuser --staff --passwd $$passwd || true + @echo + @echo "Now login at http://$(LAVA_HOST)/accounts/login/?next=/api/tokens/ and create an auth token (long sequence of chars)" + +lava-identity: + @echo + @echo -n "Enter auth token: "; \ + read token; \ + test -n "$$token" && lavacli identities add --username $(LAVA_USER) --token $$token --uri http://$(LAVA_HOST)/RPC2 $(LAVA_IDENTITY) || true + lavacli -i dispatcher system version From 673c6f1cbe0a9a235cba39b8a2ddccbc8eb31f91 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 14 Jun 2019 13:48:26 +0300 Subject: [PATCH 38/55] Makefile: lava-user: Actually open webpage in browser using xdg-open util. --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 8880f35..d94a520 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ lava-user: test -n "$$passwd" && docker exec -it lava-server lava-server manage users add $(LAVA_USER) --superuser --staff --passwd $$passwd || true @echo @echo "Now login at http://$(LAVA_HOST)/accounts/login/?next=/api/tokens/ and create an auth token (long sequence of chars)" + -xdg-open http://$(LAVA_HOST)/accounts/login/?next=/api/tokens/ lava-identity: @echo From 8ff4a84c6450b5c66cb6cbf4b9c7469ee8c37fd0 Mon Sep 17 00:00:00 2001 From: Vincent Wan Date: Mon, 24 Jun 2019 09:50:16 -0700 Subject: [PATCH 39/55] docker-compose.yaml: Add overlays for OpenOCD boot action method This commit adds the OpenOCD boot action method as an overlay temporarily til the change is merged into upstream LAVA. Signed-off-by: Vincent Wan --- docker-compose.yaml | 12 ++ .../lava_common/schemas/boot/openocd.py | 30 ++++ .../dist-packages/lava_common/utils.py | 114 ++++++++++++ .../lava_dispatcher/actions/boot/openocd.py | 162 ++++++++++++++++++ .../actions/boot/strategies.py | 48 ++++++ .../device-types/cc3220SF.jinja2 | 58 +++++++ 6 files changed, 424 insertions(+) create mode 100644 overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py create mode 100644 overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py create mode 100644 overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py create mode 100644 overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py create mode 100644 overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 diff --git a/docker-compose.yaml b/docker-compose.yaml index 94b6945..bfd8b72 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -18,6 +18,7 @@ services: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/lava-logs:/etc/lava-server/lava-logs:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro depends_on: - db environment: @@ -37,6 +38,9 @@ services: - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/lava-master:/etc/lava-server/lava-master:ro - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro + - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro depends_on: - db environment: @@ -51,6 +55,9 @@ services: volumes: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-publisher/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro + - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro environment: SERVICES: "lava-publisher" ports: @@ -67,6 +74,7 @@ services: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro + - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro depends_on: - db environment: @@ -111,6 +119,10 @@ services: - /boot:/boot:ro - /lib/modules:/lib/modules:ro - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro + - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro + - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py:ro + - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py:ro # Example for development # If you wanted to point to a local git checkout of lava for development # of lava_dispatcher, you can uncomment out the lines below and diff --git a/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py b/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py new file mode 100644 index 0000000..3d6cd37 --- /dev/null +++ b/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2019 Linaro Limited +# +# Author: Vincent Wan +# +# This file is part of LAVA. +# +# LAVA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LAVA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along +# with this program; if not, see . + +from voluptuous import Msg, Required + +from lava_common.schemas import boot + + +def schema(): + base = {Required("method"): Msg("openocd", "'method' should be 'openocd'")} + return {**boot.schema(), **base} diff --git a/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py b/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py new file mode 100644 index 0000000..93e8b81 --- /dev/null +++ b/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py @@ -0,0 +1,114 @@ +# Copyright (C) 2018 Linaro Limited +# +# Author: Remi Duraffort +# +# This file is part of LAVA. +# +# LAVA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LAVA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along +# with this program; if not, see . + +import re +import contextlib +import subprocess # nosec dpkg +from lava_common.exceptions import InfrastructureError + + +def binary_version(binary, flags="", pattern=""): + """ + Returns a string with the version of the binary by running it with + the provided flags. If the output from running the binary is verbose + and contains more than just the version number, a pattern can be + provided for the function to parse the output to pick out the + substring that contains the version number. + """ + # if binary is not absolute, fail. + msg = "Unable to retrieve version of %s" % binary + try: + ver_str = ( + subprocess.check_output((binary, flags), stderr=subprocess.STDOUT) + .strip() + .decode("utf-8", errors="replace") + ) + if not ver_str: + raise InfrastructureError(msg) + except (subprocess.CalledProcessError, FileNotFoundError): + raise InfrastructureError(msg) + + if pattern is not "": + p = re.compile(pattern) + result = p.search(ver_str) + if result is not None: + ver_str = result.group(1) + else: + raise InfrastructureError(msg) + + return "%s, version %s" % (binary, ver_str) + + +def debian_package_arch(pkg): + """ + Relies on Debian Policy rules for the existence of the + changelog. Distributions not derived from Debian will + return an empty string. + """ + with contextlib.suppress(FileNotFoundError, subprocess.CalledProcessError): + return ( + subprocess.check_output( # nosec dpkg-query + ("dpkg-query", "-W", "-f=${Architecture}\n", "%s" % pkg) + ) + .strip() + .decode("utf-8", errors="replace") + ) + return "" + + +def debian_package_version(pkg): + """ + Use dpkg-query to retrive the version of the given package. + Distributions not derived from Debian will return an empty string. + """ + with contextlib.suppress(FileNotFoundError, subprocess.CalledProcessError): + return ( + subprocess.check_output( # nosec dpkg-query + ("dpkg-query", "-W", "-f=${Version}\n", "%s" % pkg) + ) + .strip() + .decode("utf-8", errors="replace") + ) + return "" + + +def debian_filename_version(binary, label=False): + """ + Relies on Debian Policy rules for the existence of the + changelog. Distributions not derived from Debian will + return an empty string. + """ + # if binary is not absolute, fail. + msg = "Unable to retrieve version of %s" % binary + try: + pkg_str = ( + subprocess.check_output(("dpkg-query", "-S", binary)) # nosec dpkg-query + .strip() + .decode("utf-8", errors="replace") + ) + if not pkg_str: + raise InfrastructureError(msg) + except subprocess.CalledProcessError: + raise InfrastructureError(msg) + pkg = pkg_str.split(":")[0] + pkg_ver = debian_package_version(pkg) + if not label: + return pkg_ver + return "%s for <%s>, installed at version: %s" % (pkg, binary, pkg_ver) diff --git a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py new file mode 100644 index 0000000..d840cad --- /dev/null +++ b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py @@ -0,0 +1,162 @@ +# Copyright (C) 2019 Linaro Limited +# +# Author: Vincent Wan +# +# This file is part of LAVA Dispatcher. +# +# LAVA Dispatcher is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LAVA Dispatcher is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along +# with this program; if not, see . + +from lava_common.utils import binary_version +from lava_dispatcher.action import Pipeline, Action +from lava_dispatcher.logical import Boot, RetryAction +from lava_dispatcher.actions.boot import BootAction +from lava_dispatcher.connections.serial import ConnectDevice +from lava_dispatcher.utils.shell import which +from lava_dispatcher.utils.strings import substitute +from lava_dispatcher.power import ResetDevice +from lava_dispatcher.utils.udev import WaitDeviceBoardID + + +class OpenOCD(Boot): + + compatibility = 4 # FIXME: change this to 5 and update test cases + + def __init__(self, parent, parameters): + super().__init__(parent) + self.action = BootOpenOCD() + self.action.section = self.action_type + self.action.job = self.job + parent.add_action(self.action, parameters) + + @classmethod + def accepts(cls, device, parameters): + if "openocd" not in device["actions"]["boot"]["methods"]: + return False, '"openocd" was not in the device configuration boot methods' + if "method" not in parameters: + return False, '"method" was not in parameters' + if parameters["method"] != "openocd": + return False, '"method" was not "openocd"' + if "board_id" not in device: + return False, '"board_id" is not in the device configuration' + return True, "accepted" + + +class BootOpenOCD(BootAction): + + name = "boot-openocd-image" + description = "boot openocd image with retry" + summary = "boot openocd image with retry" + + def populate(self, parameters): + self.internal_pipeline = Pipeline( + parent=self, job=self.job, parameters=parameters + ) + self.internal_pipeline.add_action(BootOpenOCDRetry()) + + +class BootOpenOCDRetry(RetryAction): + + name = "boot-openocd-image" + description = "boot openocd image using the command line interface" + summary = "boot openocd image" + + def populate(self, parameters): + self.internal_pipeline = Pipeline( + parent=self, job=self.job, parameters=parameters + ) + if self.job.device.hard_reset_command: + self.internal_pipeline.add_action(ResetDevice()) + self.internal_pipeline.add_action( + WaitDeviceBoardID(self.job.device.get("board_id")) + ) + self.internal_pipeline.add_action(FlashOpenOCDAction()) + self.internal_pipeline.add_action(ConnectDevice()) + + +class FlashOpenOCDAction(Action): + + name = "flash-openocd" + description = "use openocd to flash the image" + summary = "use openocd to flash the image" + + def __init__(self): + super().__init__() + self.base_command = [] + self.exec_list = [] + + def validate(self): + super().validate() + boot = self.job.device["actions"]["boot"]["methods"]["openocd"] + openocd_binary = boot["parameters"]["command"] + binary = which(openocd_binary) + self.logger.info( + binary_version(binary, "--version", "Open On-Chip Debugger (.*)") + ) + self.base_command = [openocd_binary] + job_cfg_file = "" + + # Build the substitutions dictionary and set cfg script based on + # job definition + substitutions = {} + for action in self.get_namespace_keys("download-action"): + filename = self.get_namespace_data( + action="download-action", label=action, key="file" + ) + if filename is None: + self.logger.warning( + "Empty value for action='download-action' label='%s' " "key='file'", + action, + ) + continue + if action == "openocd_script": + # if a url for openocd_script is specified in the job + # definition, use that instead of the default for the device + # type. + job_cfg_file = filename + self.base_command.extend(["-f", job_cfg_file]) + else: + substitutions["{%s}" % action.upper()] = filename + + if job_cfg_file is "": + for item in boot["parameters"]["options"].get("file", []): + if item is not None: + self.base_command.extend(["-f", item]) + debug = boot["parameters"]["options"]["debug"] + if debug is not None: + self.base_command.extend(["-d" + str(debug)]) + for item in boot["parameters"]["options"].get("search", []): + self.base_command.extend(["-s", item]) + for item in boot["parameters"]["options"].get("command", []): + self.base_command.extend(["-c", item]) + + if self.job.device["board_id"] == "00000000": + self.errors = "[FLASH_OPENOCD] board_id unset" + + self.base_command = substitute(self.base_command, substitutions) + self.exec_list.append(self.base_command) + if not self.exec_list: + self.errors = "No OpenOCD command to execute" + + def run(self, connection, max_end_time): + connection = self.get_namespace_data( + action="shared", label="shared", key="connection", deepcopy=False + ) + connection = super().run(connection, max_end_time) + for openocd_command in self.exec_list: + self.run_cmd(openocd_command) + self.set_namespace_data( + action="shared", label="shared", key="connection", value=connection + ) + return connection diff --git a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py new file mode 100644 index 0000000..5c66525 --- /dev/null +++ b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py @@ -0,0 +1,48 @@ +# Copyright (C) 2014 Linaro Limited +# +# Author: Neil Williams +# +# This file is part of LAVA Dispatcher. +# +# LAVA Dispatcher is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LAVA Dispatcher is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along +# with this program; if not, see . + +# List just the subclasses supported for this base strategy +# imported by the parser to populate the list of subclasses. + +# pylint: disable=unused-import + +from lava_dispatcher.actions.boot import SecondaryShell +from lava_dispatcher.actions.boot.bootloader import BootBootloader +from lava_dispatcher.actions.boot.cmsis_dap import CMSIS +from lava_dispatcher.actions.boot.depthcharge import Depthcharge +from lava_dispatcher.actions.boot.dfu import DFU +from lava_dispatcher.actions.boot.docker import BootDocker +from lava_dispatcher.actions.boot.fastboot import BootFastboot +from lava_dispatcher.actions.boot.gdb import GDB +from lava_dispatcher.actions.boot.grub import Grub, GrubSequence +from lava_dispatcher.actions.boot.iso import BootIsoInstaller +from lava_dispatcher.actions.boot.ipxe import IPXE +from lava_dispatcher.actions.boot.kexec import BootKExec +from lava_dispatcher.actions.boot.lxc import BootLxc +from lava_dispatcher.actions.boot.minimal import Minimal +from lava_dispatcher.actions.boot.openocd import OpenOCD +from lava_dispatcher.actions.boot.pyocd import PyOCD +from lava_dispatcher.actions.boot.qemu import BootQEMU +from lava_dispatcher.actions.boot.ssh import SshLogin, Schroot +from lava_dispatcher.actions.boot.u_boot import UBoot +from lava_dispatcher.actions.boot.barebox import Barebox +from lava_dispatcher.actions.boot.uefi import UefiShell +from lava_dispatcher.actions.boot.uefi_menu import UefiMenu +from lava_dispatcher.actions.boot.recovery import RecoveryBoot diff --git a/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 b/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 new file mode 100644 index 0000000..1db6e03 --- /dev/null +++ b/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 @@ -0,0 +1,58 @@ +{# device_type: cc3220SF #} +{% extends 'base.jinja2' %} +{% block body %} +board_id: '{{ board_id|default('00000000') }}' +usb_vendor_id: '0451' +usb_product_id: 'bef3' +usb_sleep: {{ usb_sleep|default(10) }} + +actions: + deploy: + methods: + image: + parameters: + + boot: + connections: + serial: + methods: + openocd: + parameters: + command: + # Can set 'openocd_bin_override' in device dictionary to + # override location of OpenOCD executable to point to TI OpenOCD + # if necessary + {{ openocd_bin_override|default('openocd') }} + options: + file: + - board/ti_cc3220sf_launchpad.cfg + # Set 'openocd_scripts_dir_override' in device dictionary to + # point to TI OpenOCD scripts if necessary + search: [{{ openocd_scripts_dir_override }}] + command: + - init + - targets + - 'reset halt' + - 'flash write_image erase {BINARY}' + - 'reset halt' + - 'verify_image {BINARY}' + - 'reset run' + - shutdown + debug: 2 + gdb: + parameters: + command: gdb-multiarch + wait_before_continue: {{ wait_before_continue|default(5) }} + openocd: + arguments: + - "{ZEPHYR}" + commands: + - target remote | openocd -c "gdb_port pipe" -f {OPENOCD_SCRIPT} + - monitor reset halt + - load + - set remotetimeout 10000 + docker: + use: {{ docker_use|default(False) }} + container: '{{ docker_container|default('ti-openocd') }}' + devices: {{ docker_devices|default([]) }} +{% endblock body %} From 692b805849c846ea83e3bc323655ed61be2223d6 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 14 Jun 2019 13:47:18 +0300 Subject: [PATCH 40/55] Makefile: lava-boards: Target to configure test boards. Runs as part of lava-setup. --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d94a520..e047c0f 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ install: sudo cp contrib/usb-passthrough /usr/local/bin/ sudo udevadm control --reload -lava-setup: lava-user lava-identity +lava-setup: lava-user lava-identity lava-boards lava-user: @echo -n "Input LAVA admin user passwd: "; \ @@ -35,3 +35,8 @@ lava-identity: read token; \ test -n "$$token" && lavacli identities add --username $(LAVA_USER) --token $$token --uri http://$(LAVA_HOST)/RPC2 $(LAVA_IDENTITY) || true lavacli -i dispatcher system version + +lava-boards: + -lavacli -i $(LAVA_IDENTITY) device-types add frdm-k64f + -lavacli -i $(LAVA_IDENTITY) devices add --type frdm-k64f --worker lava-dispatcher frdm-k64f-01 + lavacli -i $(LAVA_IDENTITY) devices dict set frdm-k64f-01 devices/frdm-k64f-01.jinja2 From f032d3e04d105f26da36fb4d3d78c4a1792d9cda Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Wed, 19 Jun 2019 13:59:31 +0300 Subject: [PATCH 41/55] Makefile, devices: lava-boards: Create qemu-01 device. The config matches exactly qemu-01 config from https://lite.validation.linaro.org/ (as of now). --- Makefile | 3 +++ devices/qemu-01.jinja2 | 4 ++++ 2 files changed, 7 insertions(+) create mode 100644 devices/qemu-01.jinja2 diff --git a/Makefile b/Makefile index e047c0f..af62238 100644 --- a/Makefile +++ b/Makefile @@ -40,3 +40,6 @@ lava-boards: -lavacli -i $(LAVA_IDENTITY) device-types add frdm-k64f -lavacli -i $(LAVA_IDENTITY) devices add --type frdm-k64f --worker lava-dispatcher frdm-k64f-01 lavacli -i $(LAVA_IDENTITY) devices dict set frdm-k64f-01 devices/frdm-k64f-01.jinja2 + -lavacli -i $(LAVA_IDENTITY) device-types add qemu + -lavacli -i $(LAVA_IDENTITY) devices add --type qemu --worker lava-dispatcher qemu-01 + lavacli -i $(LAVA_IDENTITY) devices dict set qemu-01 devices/qemu-01.jinja2 diff --git a/devices/qemu-01.jinja2 b/devices/qemu-01.jinja2 new file mode 100644 index 0000000..6d145fc --- /dev/null +++ b/devices/qemu-01.jinja2 @@ -0,0 +1,4 @@ +{% extends 'qemu.jinja2' %} +{% set mac_addr = 'DE:AD:BE:EF:05:01' %} +{% set memory = 1024 %} +{% set netdevice = 'tap' %} From 6e75b68d15de17fc2bf87d85edc65f92e1c9abf9 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 14 Jun 2019 13:52:05 +0300 Subject: [PATCH 42/55] Makefile: Add explicit "stop" target. Now that there's a need to stop udev-forward in addition to docker-compose. --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index af62238..4fb27bb 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,10 @@ LAVA_IDENTITY = dispatcher all: docker-compose up +stop: + -sudo pkill udev-forward.py + docker-compose stop + clean: docker-compose rm -vsf docker volume rm -f lava-server-pgdata lava-server-joboutput lava-server-devices lava-server-health-checks From 085eb61a77bb3c4b95d4ac4b6d874bfe7ef9a1e3 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 14 Jun 2019 13:54:04 +0300 Subject: [PATCH 43/55] Makefile: testjob: Target to quickly post a test job to LAVA. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 4fb27bb..1ef1a78 100644 --- a/Makefile +++ b/Makefile @@ -47,3 +47,6 @@ lava-boards: -lavacli -i $(LAVA_IDENTITY) device-types add qemu -lavacli -i $(LAVA_IDENTITY) devices add --type qemu --worker lava-dispatcher qemu-01 lavacli -i $(LAVA_IDENTITY) devices dict set qemu-01 devices/qemu-01.jinja2 + +testjob: + lavacli -i dispatcher jobs submit example/lava.job From 68e635e700df763cf0bc27b7609a44e4df446db9 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 14 Jun 2019 13:51:01 +0300 Subject: [PATCH 44/55] Makefile: Start/stop udev-forward.py tool together with composed setup. --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 1ef1a78..a4c42de 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ LAVA_IDENTITY = dispatcher all: + sudo contrib/udev-forward.py -i lava-dispatcher & docker-compose up stop: @@ -15,6 +16,7 @@ stop: docker-compose stop clean: + -sudo pkill udev-forward.py docker-compose rm -vsf docker volume rm -f lava-server-pgdata lava-server-joboutput lava-server-devices lava-server-health-checks From 8a897d514e5f3610569fb06ac288fa0fd1b9dcbe Mon Sep 17 00:00:00 2001 From: David Brown Date: Tue, 25 Jun 2019 08:51:10 -0600 Subject: [PATCH 45/55] docker-compose: Add overlay sample lines Add a few additional overlay sample lines to overlay a source tree into the running image. This is the easiest way to do development on the lava source itself. Signed-off-by: David Brown --- docker-compose.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index bfd8b72..59bd276 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -75,6 +75,18 @@ services: - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro + # Example for development + # If you wanted to point to a local git checkout of lava for development + # of lava_dispatcher, you can uncomment out the lines below and + # set the 'source:' to point to where your lava checkout is + # The example assumes its relative in ../lava + # +# - type: bind +# source: ../lava/lava_server +# target: /usr/lib/python3/dist-packages/lava_server +# - type: bind +# source: ../lava/lava_common +# target: /usr/lib/python3/dist-packages/lava_common depends_on: - db environment: @@ -132,6 +144,9 @@ services: # - type: bind # source: ../lava/lava_dispatcher # target: /usr/lib/python3/dist-packages/lava_dispatcher +# - type: bind +# source: ../lava/lava_common +# target: /usr/lib/python3/dist-packages/lava_common ser2net: container_name: lava-ser2net From 961b11fc74246209d8c7e80188b84ea0389bdc19 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Tue, 25 Jun 2019 12:48:43 -0500 Subject: [PATCH 46/55] board-setup-helper.py: For frdm-k64f, use "resets_after_flash = false". All DAPLink firmwares starting from ~2015 have auto-reset off by default. We agreed that we should default to support contemporary firmwares. --- contrib/board-setup-helper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/board-setup-helper.py b/contrib/board-setup-helper.py index dea6147..49ca256 100755 --- a/contrib/board-setup-helper.py +++ b/contrib/board-setup-helper.py @@ -80,6 +80,9 @@ def get_device_numbers(serial_no, dev_type, board_file, ser2net_file): board_jinja.write("{%% set connection_command = 'telnet ser2net %d' %%}\n" % port) break + if dev_type == "frdm-k64f": + board_jinja.write("{% set resets_after_flash = false %}\n") + def main(): parser = argparse.ArgumentParser(description='LAVA board helper', add_help=False) From 8f55499dc576494cf64b1a3c9ef3e5a1e80b5d68 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 20 Jun 2019 06:32:14 +0300 Subject: [PATCH 47/55] Makefile: Add "dispatcher-shell" target. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index a4c42de..51d1d7d 100644 --- a/Makefile +++ b/Makefile @@ -52,3 +52,6 @@ lava-boards: testjob: lavacli -i dispatcher jobs submit example/lava.job + +dispatcher-shell: + docker exec -it lava-dispatcher bash From 8e73db70f7fcb3d994fe6eb6f0abbd3b783e9094 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Wed, 26 Jun 2019 14:36:50 -0500 Subject: [PATCH 48/55] Add a local dir for test images Signed-off-by: Kumar Gala --- docker-compose.yaml | 1 + example/lava.job | 2 +- .../frdm_k64f/logging.log_list/zephyr.bin | Bin 0 -> 61082 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 test-images/frdm_k64f/logging.log_list/zephyr.bin diff --git a/docker-compose.yaml b/docker-compose.yaml index 59bd276..1984dfe 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -130,6 +130,7 @@ services: - /run/udev/control:/run/udev/control:ro # libudev expects it for udev events - /boot:/boot:ro - /lib/modules:/lib/modules:ro + - ./test-images:/test-images:ro - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:ro - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro diff --git a/example/lava.job b/example/lava.job index f82caeb..9f0df0d 100644 --- a/example/lava.job +++ b/example/lava.job @@ -21,7 +21,7 @@ actions: to: tmpfs images: zephyr: - url: 'https://snapshots.linaro.org/components/kernel/zephyr/master/zephyr/frdm_k64f/3708/tests/subsys/logging/log_list/logging.log_list/zephyr/zephyr.bin' + url: 'file:///test-images/frdm_k64f/logging.log_list/zephyr.bin' - boot: method: cmsis-dap diff --git a/test-images/frdm_k64f/logging.log_list/zephyr.bin b/test-images/frdm_k64f/logging.log_list/zephyr.bin new file mode 100644 index 0000000000000000000000000000000000000000..d5ac7ef3bc1df3830167a9794b33ad4108ee6862 GIT binary patch literal 61082 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 Date: Tue, 25 Jun 2019 17:26:02 -0500 Subject: [PATCH 49/55] boards: musca_a board support This commit adds support for the musca_a1 platform using pyocd. Signed-off-by: Kevin Townsend --- device-types/musca_a.jinja2 | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 device-types/musca_a.jinja2 diff --git a/device-types/musca_a.jinja2 b/device-types/musca_a.jinja2 new file mode 100644 index 0000000..94d3215 --- /dev/null +++ b/device-types/musca_a.jinja2 @@ -0,0 +1,36 @@ +{# device_type: musca_a #} +{% extends 'base.jinja2' %} +{% block body %} +board_id: '{{ board_id|default('0000000000') }}' +usb_vendor_id: '0d28' +usb_product_id: '0204' + +actions: + deploy: + connections: + lxc: + methods: + lxc: + image: + parameters: + + boot: + connections: + serial: + lxc: + ssh: + methods: + lxc: + pyocd: + parameters: + command: + pyocd-flashtool + options: + - -d {{ debug|default('debug') }} + - -t musca_a1 + - -f 3000000 + cmsis-dap: + parameters: + usb_mass_device: '{{ usb_mass_device|default('/notset') }}' + resets_after_flash: {{ resets_after_flash|default(True) }} +{% endblock body -%} From 816ea7f124028ccb20977bae899e5ea591496650 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Wed, 26 Jun 2019 11:47:33 -0500 Subject: [PATCH 50/55] Makefile: lava-boards: Add musca_a devicep-type. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 51d1d7d..8a38420 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,9 @@ lava-boards: -lavacli -i $(LAVA_IDENTITY) devices add --type qemu --worker lava-dispatcher qemu-01 lavacli -i $(LAVA_IDENTITY) devices dict set qemu-01 devices/qemu-01.jinja2 + -lavacli -i $(LAVA_IDENTITY) device-types add musca_a + lavacli -i $(LAVA_IDENTITY) device-types template set musca_a device-types/musca_a.jinja2 + testjob: lavacli -i dispatcher jobs submit example/lava.job From 4ad917c945fea28b8de900a3dff873e70b7bf83c Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Tue, 25 Jun 2019 08:57:33 -0500 Subject: [PATCH 51/55] Bump version to 2019.05post1 Update versions in .env to 2019.05post1 release. Signed-off-by: Kumar Gala --- .env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index be21ee4..68c576b 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ DC_POSTGRES_IMAGE=postgres:11.2-alpine -DC_SERVER_IMAGE=lavasoftware/lava-server:2019.04 -DC_DISPATCHER_IMAGE=lavasoftware/lava-dispatcher:2019.04 +DC_SERVER_IMAGE=lavasoftware/lava-server:2019.05.post1 +DC_DISPATCHER_IMAGE=lavasoftware/lava-dispatcher:2019.05.post1 From d75bd057699e731f30319bd45613a196ea2adf51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Duraffort?= Date: Fri, 28 Jun 2019 12:36:54 +0200 Subject: [PATCH 52/55] Upgrade to the latest LAVA release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Duraffort --- .env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index 68c576b..887869d 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ DC_POSTGRES_IMAGE=postgres:11.2-alpine -DC_SERVER_IMAGE=lavasoftware/lava-server:2019.05.post1 -DC_DISPATCHER_IMAGE=lavasoftware/lava-dispatcher:2019.05.post1 +DC_SERVER_IMAGE=lavasoftware/lava-server:2019.06 +DC_DISPATCHER_IMAGE=lavasoftware/lava-dispatcher:2019.06 From e5c027c46792de77a08e896e8e42527ebaf7410a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Duraffort?= Date: Fri, 28 Jun 2019 12:36:54 +0200 Subject: [PATCH 53/55] docker-compose: Sync with 2019.06 Remove changes that are now in 2019.06 release: * OpenOCD support * pyocd print out version of binary used * frdm-k64 device type support for resets_after_flash Signed-off-by: Kumar Gala --- docker-compose.yaml | 15 -- .../lava_common/schemas/boot/openocd.py | 30 ---- .../dist-packages/lava_common/utils.py | 114 ------------ .../lava_dispatcher/actions/boot/openocd.py | 162 ----------------- .../lava_dispatcher/actions/boot/pyocd.py | 164 ------------------ .../actions/boot/strategies.py | 48 ----- .../device-types/cc3220SF.jinja2 | 58 ------- .../device-types/frdm-k64f.jinja2 | 36 ---- 8 files changed, 627 deletions(-) delete mode 100644 overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py delete mode 100644 overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py delete mode 100644 overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py delete mode 100644 overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py delete mode 100644 overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py delete mode 100644 overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 delete mode 100644 overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 diff --git a/docker-compose.yaml b/docker-compose.yaml index 1984dfe..cab96fb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -18,7 +18,6 @@ services: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/lava-logs:/etc/lava-server/lava-logs:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro depends_on: - db environment: @@ -37,10 +36,6 @@ services: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - ./overlays/lava-server/etc/lava-server/lava-master:/etc/lava-server/lava-master:ro - - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro - - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro depends_on: - db environment: @@ -55,9 +50,6 @@ services: volumes: - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-publisher/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro - - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro environment: SERVICES: "lava-publisher" ports: @@ -73,8 +65,6 @@ services: - joboutput:/var/lib/lava-server/default/media/job-output - ./overlays/lava-server/etc/lava-server/instance.conf:/etc/lava-server/instance.conf:ro - ./overlays/lava-server/etc/lava-server/settings.conf:/etc/lava-server/settings.conf:ro - - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2:ro - - ./overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2:ro # Example for development # If you wanted to point to a local git checkout of lava for development # of lava_dispatcher, you can uncomment out the lines below and @@ -131,11 +121,6 @@ services: - /boot:/boot:ro - /lib/modules:/lib/modules:ro - ./test-images:/test-images:ro - - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py:/usr/lib/python3/dist-packages/lava_common/utils.py:ro - - ./overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py:ro - - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py:ro - - ./overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py:/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py:ro # Example for development # If you wanted to point to a local git checkout of lava for development # of lava_dispatcher, you can uncomment out the lines below and diff --git a/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py b/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py deleted file mode 100644 index 3d6cd37..0000000 --- a/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/schemas/boot/openocd.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2019 Linaro Limited -# -# Author: Vincent Wan -# -# This file is part of LAVA. -# -# LAVA is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# LAVA is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along -# with this program; if not, see . - -from voluptuous import Msg, Required - -from lava_common.schemas import boot - - -def schema(): - base = {Required("method"): Msg("openocd", "'method' should be 'openocd'")} - return {**boot.schema(), **base} diff --git a/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py b/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py deleted file mode 100644 index 93e8b81..0000000 --- a/overlays/lava-common/usr/lib/python3/dist-packages/lava_common/utils.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (C) 2018 Linaro Limited -# -# Author: Remi Duraffort -# -# This file is part of LAVA. -# -# LAVA is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# LAVA is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along -# with this program; if not, see . - -import re -import contextlib -import subprocess # nosec dpkg -from lava_common.exceptions import InfrastructureError - - -def binary_version(binary, flags="", pattern=""): - """ - Returns a string with the version of the binary by running it with - the provided flags. If the output from running the binary is verbose - and contains more than just the version number, a pattern can be - provided for the function to parse the output to pick out the - substring that contains the version number. - """ - # if binary is not absolute, fail. - msg = "Unable to retrieve version of %s" % binary - try: - ver_str = ( - subprocess.check_output((binary, flags), stderr=subprocess.STDOUT) - .strip() - .decode("utf-8", errors="replace") - ) - if not ver_str: - raise InfrastructureError(msg) - except (subprocess.CalledProcessError, FileNotFoundError): - raise InfrastructureError(msg) - - if pattern is not "": - p = re.compile(pattern) - result = p.search(ver_str) - if result is not None: - ver_str = result.group(1) - else: - raise InfrastructureError(msg) - - return "%s, version %s" % (binary, ver_str) - - -def debian_package_arch(pkg): - """ - Relies on Debian Policy rules for the existence of the - changelog. Distributions not derived from Debian will - return an empty string. - """ - with contextlib.suppress(FileNotFoundError, subprocess.CalledProcessError): - return ( - subprocess.check_output( # nosec dpkg-query - ("dpkg-query", "-W", "-f=${Architecture}\n", "%s" % pkg) - ) - .strip() - .decode("utf-8", errors="replace") - ) - return "" - - -def debian_package_version(pkg): - """ - Use dpkg-query to retrive the version of the given package. - Distributions not derived from Debian will return an empty string. - """ - with contextlib.suppress(FileNotFoundError, subprocess.CalledProcessError): - return ( - subprocess.check_output( # nosec dpkg-query - ("dpkg-query", "-W", "-f=${Version}\n", "%s" % pkg) - ) - .strip() - .decode("utf-8", errors="replace") - ) - return "" - - -def debian_filename_version(binary, label=False): - """ - Relies on Debian Policy rules for the existence of the - changelog. Distributions not derived from Debian will - return an empty string. - """ - # if binary is not absolute, fail. - msg = "Unable to retrieve version of %s" % binary - try: - pkg_str = ( - subprocess.check_output(("dpkg-query", "-S", binary)) # nosec dpkg-query - .strip() - .decode("utf-8", errors="replace") - ) - if not pkg_str: - raise InfrastructureError(msg) - except subprocess.CalledProcessError: - raise InfrastructureError(msg) - pkg = pkg_str.split(":")[0] - pkg_ver = debian_package_version(pkg) - if not label: - return pkg_ver - return "%s for <%s>, installed at version: %s" % (pkg, binary, pkg_ver) diff --git a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py deleted file mode 100644 index d840cad..0000000 --- a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/openocd.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright (C) 2019 Linaro Limited -# -# Author: Vincent Wan -# -# This file is part of LAVA Dispatcher. -# -# LAVA Dispatcher is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# LAVA Dispatcher is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along -# with this program; if not, see . - -from lava_common.utils import binary_version -from lava_dispatcher.action import Pipeline, Action -from lava_dispatcher.logical import Boot, RetryAction -from lava_dispatcher.actions.boot import BootAction -from lava_dispatcher.connections.serial import ConnectDevice -from lava_dispatcher.utils.shell import which -from lava_dispatcher.utils.strings import substitute -from lava_dispatcher.power import ResetDevice -from lava_dispatcher.utils.udev import WaitDeviceBoardID - - -class OpenOCD(Boot): - - compatibility = 4 # FIXME: change this to 5 and update test cases - - def __init__(self, parent, parameters): - super().__init__(parent) - self.action = BootOpenOCD() - self.action.section = self.action_type - self.action.job = self.job - parent.add_action(self.action, parameters) - - @classmethod - def accepts(cls, device, parameters): - if "openocd" not in device["actions"]["boot"]["methods"]: - return False, '"openocd" was not in the device configuration boot methods' - if "method" not in parameters: - return False, '"method" was not in parameters' - if parameters["method"] != "openocd": - return False, '"method" was not "openocd"' - if "board_id" not in device: - return False, '"board_id" is not in the device configuration' - return True, "accepted" - - -class BootOpenOCD(BootAction): - - name = "boot-openocd-image" - description = "boot openocd image with retry" - summary = "boot openocd image with retry" - - def populate(self, parameters): - self.internal_pipeline = Pipeline( - parent=self, job=self.job, parameters=parameters - ) - self.internal_pipeline.add_action(BootOpenOCDRetry()) - - -class BootOpenOCDRetry(RetryAction): - - name = "boot-openocd-image" - description = "boot openocd image using the command line interface" - summary = "boot openocd image" - - def populate(self, parameters): - self.internal_pipeline = Pipeline( - parent=self, job=self.job, parameters=parameters - ) - if self.job.device.hard_reset_command: - self.internal_pipeline.add_action(ResetDevice()) - self.internal_pipeline.add_action( - WaitDeviceBoardID(self.job.device.get("board_id")) - ) - self.internal_pipeline.add_action(FlashOpenOCDAction()) - self.internal_pipeline.add_action(ConnectDevice()) - - -class FlashOpenOCDAction(Action): - - name = "flash-openocd" - description = "use openocd to flash the image" - summary = "use openocd to flash the image" - - def __init__(self): - super().__init__() - self.base_command = [] - self.exec_list = [] - - def validate(self): - super().validate() - boot = self.job.device["actions"]["boot"]["methods"]["openocd"] - openocd_binary = boot["parameters"]["command"] - binary = which(openocd_binary) - self.logger.info( - binary_version(binary, "--version", "Open On-Chip Debugger (.*)") - ) - self.base_command = [openocd_binary] - job_cfg_file = "" - - # Build the substitutions dictionary and set cfg script based on - # job definition - substitutions = {} - for action in self.get_namespace_keys("download-action"): - filename = self.get_namespace_data( - action="download-action", label=action, key="file" - ) - if filename is None: - self.logger.warning( - "Empty value for action='download-action' label='%s' " "key='file'", - action, - ) - continue - if action == "openocd_script": - # if a url for openocd_script is specified in the job - # definition, use that instead of the default for the device - # type. - job_cfg_file = filename - self.base_command.extend(["-f", job_cfg_file]) - else: - substitutions["{%s}" % action.upper()] = filename - - if job_cfg_file is "": - for item in boot["parameters"]["options"].get("file", []): - if item is not None: - self.base_command.extend(["-f", item]) - debug = boot["parameters"]["options"]["debug"] - if debug is not None: - self.base_command.extend(["-d" + str(debug)]) - for item in boot["parameters"]["options"].get("search", []): - self.base_command.extend(["-s", item]) - for item in boot["parameters"]["options"].get("command", []): - self.base_command.extend(["-c", item]) - - if self.job.device["board_id"] == "00000000": - self.errors = "[FLASH_OPENOCD] board_id unset" - - self.base_command = substitute(self.base_command, substitutions) - self.exec_list.append(self.base_command) - if not self.exec_list: - self.errors = "No OpenOCD command to execute" - - def run(self, connection, max_end_time): - connection = self.get_namespace_data( - action="shared", label="shared", key="connection", deepcopy=False - ) - connection = super().run(connection, max_end_time) - for openocd_command in self.exec_list: - self.run_cmd(openocd_command) - self.set_namespace_data( - action="shared", label="shared", key="connection", value=connection - ) - return connection diff --git a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py deleted file mode 100644 index f1e2441..0000000 --- a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/pyocd.py +++ /dev/null @@ -1,164 +0,0 @@ -# Copyright (C) 2016 Linaro Limited -# -# Author: Tyler Baker -# -# This file is part of LAVA Dispatcher. -# -# LAVA Dispatcher is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# LAVA Dispatcher is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along -# with this program; if not, see . - -from lava_common.utils import debian_filename_version -from lava_dispatcher.action import Pipeline, Action, JobError -from lava_dispatcher.logical import Boot, RetryAction -from lava_dispatcher.actions.boot import BootAction -from lava_dispatcher.connections.serial import ConnectDevice -from lava_dispatcher.utils.shell import which -from lava_dispatcher.utils.strings import substitute -from lava_dispatcher.power import ResetDevice -from lava_dispatcher.utils.udev import WaitDeviceBoardID -from lava_common.exceptions import InfrastructureError - -import subprocess - -class PyOCD(Boot): - - compatibility = 4 # FIXME: change this to 5 and update test cases - - def __init__(self, parent, parameters): - super().__init__(parent) - self.action = BootPyOCD() - self.action.section = self.action_type - self.action.job = self.job - parent.add_action(self.action, parameters) - - @classmethod - def accepts(cls, device, parameters): - if "pyocd" not in device["actions"]["boot"]["methods"]: - return False, '"pyocd" was not in the device configuration boot methods' - if "method" not in parameters: - return False, '"method" was not in parameters' - if parameters["method"] != "pyocd": - return False, '"method" was not "pyocd"' - if "board_id" not in device: - return False, '"board_id" is not in the device configuration' - return True, "accepted" - - -class BootPyOCD(BootAction): - - name = "boot-pyocd-image" - description = "boot pyocd image with retry" - summary = "boot pyocd image with retry" - - def populate(self, parameters): - self.internal_pipeline = Pipeline( - parent=self, job=self.job, parameters=parameters - ) - self.internal_pipeline.add_action(BootPyOCDRetry()) - - -class BootPyOCDRetry(RetryAction): - - name = "boot-pyocd-image" - description = "boot pyocd image using the command line interface" - summary = "boot pyocd image" - - def populate(self, parameters): - self.internal_pipeline = Pipeline( - parent=self, job=self.job, parameters=parameters - ) - if self.job.device.hard_reset_command: - self.internal_pipeline.add_action(ResetDevice()) - self.internal_pipeline.add_action( - WaitDeviceBoardID(self.job.device.get("board_id")) - ) - self.internal_pipeline.add_action(FlashPyOCDAction()) - self.internal_pipeline.add_action(ConnectDevice()) - - -class FlashPyOCDAction(Action): - - name = "flash-pyocd" - description = "flash pyocd to boot the image" - summary = "flash pyocd to boot the image" - - @staticmethod - def filename_version(binary): - # if binary is not absolute, fail. - msg = "Unable to retrieve version of %s" % binary - try: - ver_str = ( - subprocess.check_output((binary, "--version")) - .decode("utf-8", errors="replace") - ) - if not ver_str: - raise InfrastructureError(msg) - except subprocess.CalledProcessError: - raise InfrastructureError(msg) - return "%s, version %s" % (binary, ver_str) - - def __init__(self): - super().__init__() - self.base_command = [] - self.exec_list = [] - - def validate(self): - super().validate() - boot = self.job.device["actions"]["boot"]["methods"]["pyocd"] - pyocd_binary = boot["parameters"]["command"] - binary = which(pyocd_binary) - self.logger.info(self.filename_version(binary)) - self.base_command = [pyocd_binary] - self.base_command.extend(boot["parameters"].get("options", [])) - if self.job.device["board_id"] == "0000000000": - self.errors = "[PYOCD] board_id unset" - substitutions = {} - self.base_command.extend(["--board", self.job.device["board_id"]]) - for action in self.get_namespace_keys("download-action"): - pyocd_full_command = [] - image_arg = self.get_namespace_data( - action="download-action", label=action, key="image_arg" - ) - action_arg = self.get_namespace_data( - action="download-action", label=action, key="file" - ) - if image_arg: - if not isinstance(image_arg, str): - self.errors = "image_arg is not a string (try quoting it)" - continue - substitutions["{%s}" % action] = action_arg - pyocd_full_command.extend(self.base_command) - pyocd_full_command.extend(substitute([image_arg], substitutions)) - self.exec_list.append(pyocd_full_command) - else: - pyocd_full_command.extend(self.base_command) - pyocd_full_command.extend([action_arg]) - self.exec_list.append(pyocd_full_command) - if not self.exec_list: - self.errors = "No PyOCD command to execute" - - def run(self, connection, max_end_time): - connection = self.get_namespace_data( - action="shared", label="shared", key="connection", deepcopy=False - ) - connection = super().run(connection, max_end_time) - for pyocd_command in self.exec_list: - pyocd = " ".join(pyocd_command) - self.logger.info("PyOCD command: %s", pyocd) - if not self.run_command(pyocd.split(" ")): - raise JobError("%s command failed" % (pyocd.split(" "))) - self.set_namespace_data( - action="shared", label="shared", key="connection", value=connection - ) - return connection diff --git a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py b/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py deleted file mode 100644 index 5c66525..0000000 --- a/overlays/lava-dispatcher/usr/lib/python3/dist-packages/lava_dispatcher/actions/boot/strategies.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (C) 2014 Linaro Limited -# -# Author: Neil Williams -# -# This file is part of LAVA Dispatcher. -# -# LAVA Dispatcher is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# LAVA Dispatcher is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along -# with this program; if not, see . - -# List just the subclasses supported for this base strategy -# imported by the parser to populate the list of subclasses. - -# pylint: disable=unused-import - -from lava_dispatcher.actions.boot import SecondaryShell -from lava_dispatcher.actions.boot.bootloader import BootBootloader -from lava_dispatcher.actions.boot.cmsis_dap import CMSIS -from lava_dispatcher.actions.boot.depthcharge import Depthcharge -from lava_dispatcher.actions.boot.dfu import DFU -from lava_dispatcher.actions.boot.docker import BootDocker -from lava_dispatcher.actions.boot.fastboot import BootFastboot -from lava_dispatcher.actions.boot.gdb import GDB -from lava_dispatcher.actions.boot.grub import Grub, GrubSequence -from lava_dispatcher.actions.boot.iso import BootIsoInstaller -from lava_dispatcher.actions.boot.ipxe import IPXE -from lava_dispatcher.actions.boot.kexec import BootKExec -from lava_dispatcher.actions.boot.lxc import BootLxc -from lava_dispatcher.actions.boot.minimal import Minimal -from lava_dispatcher.actions.boot.openocd import OpenOCD -from lava_dispatcher.actions.boot.pyocd import PyOCD -from lava_dispatcher.actions.boot.qemu import BootQEMU -from lava_dispatcher.actions.boot.ssh import SshLogin, Schroot -from lava_dispatcher.actions.boot.u_boot import UBoot -from lava_dispatcher.actions.boot.barebox import Barebox -from lava_dispatcher.actions.boot.uefi import UefiShell -from lava_dispatcher.actions.boot.uefi_menu import UefiMenu -from lava_dispatcher.actions.boot.recovery import RecoveryBoot diff --git a/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 b/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 deleted file mode 100644 index 1db6e03..0000000 --- a/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/cc3220SF.jinja2 +++ /dev/null @@ -1,58 +0,0 @@ -{# device_type: cc3220SF #} -{% extends 'base.jinja2' %} -{% block body %} -board_id: '{{ board_id|default('00000000') }}' -usb_vendor_id: '0451' -usb_product_id: 'bef3' -usb_sleep: {{ usb_sleep|default(10) }} - -actions: - deploy: - methods: - image: - parameters: - - boot: - connections: - serial: - methods: - openocd: - parameters: - command: - # Can set 'openocd_bin_override' in device dictionary to - # override location of OpenOCD executable to point to TI OpenOCD - # if necessary - {{ openocd_bin_override|default('openocd') }} - options: - file: - - board/ti_cc3220sf_launchpad.cfg - # Set 'openocd_scripts_dir_override' in device dictionary to - # point to TI OpenOCD scripts if necessary - search: [{{ openocd_scripts_dir_override }}] - command: - - init - - targets - - 'reset halt' - - 'flash write_image erase {BINARY}' - - 'reset halt' - - 'verify_image {BINARY}' - - 'reset run' - - shutdown - debug: 2 - gdb: - parameters: - command: gdb-multiarch - wait_before_continue: {{ wait_before_continue|default(5) }} - openocd: - arguments: - - "{ZEPHYR}" - commands: - - target remote | openocd -c "gdb_port pipe" -f {OPENOCD_SCRIPT} - - monitor reset halt - - load - - set remotetimeout 10000 - docker: - use: {{ docker_use|default(False) }} - container: '{{ docker_container|default('ti-openocd') }}' - devices: {{ docker_devices|default([]) }} -{% endblock body %} diff --git a/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 b/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 deleted file mode 100644 index 70f84c3..0000000 --- a/overlays/lava-server/etc/lava-server/dispatcher-config/device-types/frdm-k64f.jinja2 +++ /dev/null @@ -1,36 +0,0 @@ -{# device_type: frdm-k64f #} -{% extends 'base.jinja2' %} -{% block body %} -board_id: '{{ board_id|default('0000000000') }}' -usb_vendor_id: '0d28' -usb_product_id: '0204' - -actions: - deploy: - connections: - lxc: - methods: - lxc: - image: - parameters: - - boot: - connections: - serial: - lxc: - ssh: - methods: - lxc: - pyocd: - parameters: - command: - pyocd-flashtool - options: - - -d {{ debug|default('debug') }} - - -t k64f - - -f 3000000 - cmsis-dap: - parameters: - usb_mass_device: '{{ usb_mass_device|default('/notset') }}' - resets_after_flash: {{ resets_after_flash|default(True) }} -{% endblock body -%} From e326f75f30834c4be4f788100cf33bb2dfe1931b Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 20 Jun 2019 06:40:49 +0300 Subject: [PATCH 54/55] Makefile: Add "board-configs" target. Based on board serials, stored in devices/.serial, create any needed board configs, using board-setup-helper.py. The boards should be connected to USB while running this. --- Makefile | 11 +++++++++++ contrib/make-board-files.sh | 13 +++++++++++++ 2 files changed, 24 insertions(+) create mode 100755 contrib/make-board-files.sh diff --git a/Makefile b/Makefile index 8a38420..82e8044 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,17 @@ clean: docker-compose rm -vsf docker volume rm -f lava-server-pgdata lava-server-joboutput lava-server-devices lava-server-health-checks +# Create various board configs for connected board(s). Supposed to be done +# before "install" target. +board-configs: + @echo "Note: you should have *all* of your boards connected to USB before running this." + @echo "Press Ctrl+C to break if not. Review results carefully afterwards." + @read dummy + -mv ser2net/ser2net.conf ser2net/ser2net.conf.old + touch ser2net/ser2net.conf + @echo + contrib/make-board-files.sh devices + install: sudo cp contrib/LAVA.rules /etc/udev/rules.d/ sudo cp contrib/usb-passthrough /usr/local/bin/ diff --git a/contrib/make-board-files.sh b/contrib/make-board-files.sh new file mode 100755 index 0000000..001e3bf --- /dev/null +++ b/contrib/make-board-files.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +for ser in $1/*.serial; do + echo "Processing: $ser" + devname=$(basename $ser .serial) + devtype=$(echo $devname | python -c "import sys; print(sys.stdin.readline().rsplit('-', 1)[0])") + contrib/board-setup-helper.py -d $(cat $ser) -t $devtype -b $1/$devname.jinja2 -u >contrib/LAVA.rules +done From 33d159a5ce3dfea98a05a8154769d0609fa80796 Mon Sep 17 00:00:00 2001 From: Vincent Wan Date: Wed, 3 Jul 2019 16:17:32 -0700 Subject: [PATCH 55/55] add script to monitor test-images directory for new test images When new test images are added to the directory, jobs are automatically submitted to LAVA using the template corresponding to the device type. The templates are stored under 'job-templates/lava_.job. Usage: ./monitor-images.sh The script is automatically run when running 'make all'. Signed-off-by: Vincent Wan --- Makefile | 3 ++ contrib/monitor-images.sh | 41 ++++++++++++++ example/lava.job | 2 +- job-templates/lava_cc3220SF.job | 47 ++++++++++++++++ job-templates/lava_frdm-k64f.job | 50 ++++++++++++++++++ .../cc3220SF/logging.log_list/zephyr.elf | Bin 0 -> 572552 bytes .../logging.log_list/zephyr.bin | Bin 7 files changed, 142 insertions(+), 1 deletion(-) create mode 100755 contrib/monitor-images.sh create mode 100644 job-templates/lava_cc3220SF.job create mode 100644 job-templates/lava_frdm-k64f.job create mode 100644 test-images/cc3220SF/logging.log_list/zephyr.elf rename test-images/{frdm_k64f => frdm-k64f}/logging.log_list/zephyr.bin (100%) diff --git a/Makefile b/Makefile index 82e8044..077b60e 100644 --- a/Makefile +++ b/Makefile @@ -8,14 +8,17 @@ LAVA_IDENTITY = dispatcher all: + contrib/monitor-images.sh $(LAVA_IDENTITY) & sudo contrib/udev-forward.py -i lava-dispatcher & docker-compose up stop: + pkill -f monitor-images.sh -sudo pkill udev-forward.py docker-compose stop clean: + pkill -f monitor-images.sh -sudo pkill udev-forward.py docker-compose rm -vsf docker volume rm -f lava-server-pgdata lava-server-joboutput lava-server-devices lava-server-health-checks diff --git a/contrib/monitor-images.sh b/contrib/monitor-images.sh new file mode 100755 index 0000000..64d2ce7 --- /dev/null +++ b/contrib/monitor-images.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Usage: ./monitor-images.sh +# +# This script monitors the 'test-images' directory for any file that is +# dropped into it. It assumes the directory layout is +# test-images/, and upon detecting a new file, uses the +# corresponding job template in job-templates/lava_.job +# to submit the job with the provided LAVA identity. +# +# '' in the template is automatically substituted with the +# actual path to the test image. + +contrib_dir=`dirname $0` +dir=test-images +template_dir=job-templates + +cd $contrib_dir/.. + +inotifywait -r -m "$dir" -e close_write --format '%w%f' | + while IFS=' ' read -r fname + do + IFS='/' + read -ra path <<< "$fname" + template="$template_dir"/lava_"${path[1]}".job + if [ ! -f "$template" ] + then + #if no template found for the device-type, do nothing + continue + fi + + echo "Using template for device type ${path[1]}:" + echo " $template" + + # Replace with actual path to test image + sed_cmd=s/\/"file:\/\/\/${fname//\//\\\/}"/g + + tmp_file=$(mktemp) + echo "Submitting job for $fname" + [ -f "$fname" ] && sed "$sed_cmd" "$template" > "$tmp_file" && lavacli -i $1 jobs submit "$tmp_file" && rm "$tmp_file" + done diff --git a/example/lava.job b/example/lava.job index 9f0df0d..950dbae 100644 --- a/example/lava.job +++ b/example/lava.job @@ -21,7 +21,7 @@ actions: to: tmpfs images: zephyr: - url: 'file:///test-images/frdm_k64f/logging.log_list/zephyr.bin' + url: 'file:///test-images/frdm-k64f/logging.log_list/zephyr.bin' - boot: method: cmsis-dap diff --git a/job-templates/lava_cc3220SF.job b/job-templates/lava_cc3220SF.job new file mode 100644 index 0000000..530010f --- /dev/null +++ b/job-templates/lava_cc3220SF.job @@ -0,0 +1,47 @@ +# Standard job template for zephyr tests on cc3220sf_launchxl +device_type: 'cc3220SF' +job_name: 'zephyr-upstream tests-zephyr-cc3220SF' + +timeouts: + job: + minutes: 3 + action: + minutes: 3 + actions: + wait-usb-device: + seconds: 40 + +priority: medium +visibility: public + +actions: +- deploy: + timeout: + minutes: 3 + to: tmpfs + images: + binary: + url: + +- boot: + method: openocd + timeout: + minutes: 1 + +- test: + timeout: + minutes: 2 + monitors: + - name: 'tests-zephyr-cc3220SF' + start: (tc_start\(\)|starting .*test|BOOTING ZEPHYR OS) + end: PROJECT EXECUTION + pattern: (?P(PASS|FAIL))\s-\s(?P\w+)\r\n + fixupdict: + PASS: pass + FAIL: fail + +metadata: + zephyr-gcc-variant: zephyr + platform: cc3220sf_launchxl + git-url: https://git.linaro.org/zephyrproject-org/zephyr.git + diff --git a/job-templates/lava_frdm-k64f.job b/job-templates/lava_frdm-k64f.job new file mode 100644 index 0000000..3e3e4e1 --- /dev/null +++ b/job-templates/lava_frdm-k64f.job @@ -0,0 +1,50 @@ +# Zephyr JOB definition for frdm-k64f +device_type: 'frdm-k64f' +job_name: 'zephyr-upstream tests-subsys-logging-log_list-logging-log_list-zephyr' + +timeouts: + job: + minutes: 3 + action: + minutes: 3 + actions: + wait-usb-device: + seconds: 40 + +priority: medium +visibility: public + +actions: +- deploy: + timeout: + minutes: 3 + to: tmpfs + images: + zephyr: + url: + +- boot: + method: cmsis-dap + timeout: + minutes: 1 + +- test: + timeout: + minutes: 2 + monitors: + - name: 'tests-subsys-logging-log_list-logging-log_list-zephyr' + start: (tc_start\(\)|starting .*test|BOOTING ZEPHYR OS) + end: PROJECT EXECUTION + pattern: (?P(PASS|FAIL))\s-\s(?P\w+)\r\n + fixupdict: + PASS: pass + FAIL: fail + +metadata: + build-url: https://ci.linaro.org/job/zephyr-upstream/PLATFORM=frdm_k64f,ZEPHYR_TOOLCHAIN_VARIANT=zephyr,label=docker-xenial-amd64-13/3708/ + build-log: https://ci.linaro.org/job/zephyr-upstream/PLATFORM=frdm_k64f,ZEPHYR_TOOLCHAIN_VARIANT=zephyr,label=docker-xenial-amd64-13/3708//consoleText + zephyr-gcc-variant: zephyr + platform: frdm_k64f + git-url: https://git.linaro.org/zephyrproject-org/zephyr.git + git-commit: 193fb971 + diff --git a/test-images/cc3220SF/logging.log_list/zephyr.elf b/test-images/cc3220SF/logging.log_list/zephyr.elf new file mode 100644 index 0000000000000000000000000000000000000000..a5080513b5455fa122445851000aa64698eb2404 GIT binary patch literal 572552 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

qUt94#8Vj|yfp_hp;h!57hQV*f|1-j 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 z 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
!`e-rscG%4~LGft;q5who! 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 literal 0 HcmV?d00001 diff --git a/test-images/frdm_k64f/logging.log_list/zephyr.bin b/test-images/frdm-k64f/logging.log_list/zephyr.bin similarity index 100% rename from test-images/frdm_k64f/logging.log_list/zephyr.bin rename to test-images/frdm-k64f/logging.log_list/zephyr.bin