From 6db5f0455be9582275382a158fececa457883c0c Mon Sep 17 00:00:00 2001 From: odkq Date: Thu, 18 Jun 2020 15:39:45 +0200 Subject: [PATCH 01/45] boardfarm-ci: Run boardfarm into docker-compose test requirements and controller Signed-off-by: odkq --- tools/docker/boardfarm-ci/Dockerfile | 15 +++++++ tools/docker/boardfarm-ci/docker-compose.yml | 19 ++++++++ tools/docker/boardfarm-ci/entrypoint.sh | 2 + tools/docker/boardfarm-ci/requirements.txt | 46 ++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 tools/docker/boardfarm-ci/Dockerfile create mode 100644 tools/docker/boardfarm-ci/docker-compose.yml create mode 100755 tools/docker/boardfarm-ci/entrypoint.sh create mode 100644 tools/docker/boardfarm-ci/requirements.txt diff --git a/tools/docker/boardfarm-ci/Dockerfile b/tools/docker/boardfarm-ci/Dockerfile new file mode 100644 index 0000000000..3d6ab88668 --- /dev/null +++ b/tools/docker/boardfarm-ci/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.8-slim-buster + +RUN apt-get update \ +&& apt-get install gcc libsnmp-dev -y \ +&& apt-get clean + +COPY requirements.txt /app/requirements.txt + +WORKDIR app +RUN pip3 install -r requirements.txt + +RUN apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y + +# VOLUME "/home/pablo/assia/prpl/git" +# ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml new file mode 100644 index 0000000000..92ad543c13 --- /dev/null +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + controller: + image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner + privileged: true + environment: + - USER=pablo + - INSTALL_DIR=/home/pablo/assia/prpl/git/prplMesh/build/install + expose: + - "5000" + volumes: + - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" + - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" + - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" + + boardfarm: + build: . + ports: + - "5000:5000" diff --git a/tools/docker/boardfarm-ci/entrypoint.sh b/tools/docker/boardfarm-ci/entrypoint.sh new file mode 100755 index 0000000000..06bd986563 --- /dev/null +++ b/tools/docker/boardfarm-ci/entrypoint.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exit 0 diff --git a/tools/docker/boardfarm-ci/requirements.txt b/tools/docker/boardfarm-ci/requirements.txt new file mode 100644 index 0000000000..e2c7809a0b --- /dev/null +++ b/tools/docker/boardfarm-ci/requirements.txt @@ -0,0 +1,46 @@ +aenum +argparse +beautifulsoup4 +boto3 +cdrouter +debtcollector +dlipower +dnspython +docutils<0.16 +easysnmp +elasticsearch>=1.0.0 +Faker +future +ipaddress +jira +marshmallow<3 +matplotlib +nested_lookup==0.2.19 +netaddr +pexpect +pre-commit +psutil +pycountry +pycryptodome +pyflakes +pymongo +pyserial +pysmi +pysnmp +pytest==5.3.5 +pytest-html +pytest-mock +pytest-randomly +pyvirtualdisplay +requests +retry +selenium +simplejson +six +sphinx +termcolor +unittest2 +xmltodict +xvfbwrapper +yapf +zeep From c904291b83c7a97497a0507bd9941d814de8a3c9 Mon Sep 17 00:00:00 2001 From: odkq Date: Tue, 23 Jun 2020 15:23:35 +0200 Subject: [PATCH 02/45] boardfarm-ci: Use docker-compose from within boardfarm Signed-off-by: odkq --- .../prplmesh_config_compose.json | 20 +++++++++++++ tests/run_bf_compose.sh | 18 ++++++++++++ tools/docker/boardfarm-ci/Dockerfile | 10 +++++++ tools/docker/boardfarm-ci/docker-compose.yml | 29 ++++++++++++++++++- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json create mode 100755 tests/run_bf_compose.sh diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json b/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json new file mode 100644 index 0000000000..c7818832e4 --- /dev/null +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json @@ -0,0 +1,20 @@ +{ + "prplmesh_docker": { + "name": "dockerized_device", + "board_type": "prplmesh_compose", + "role": "controller", + "conn_cmd": "", + "devices": [ + { + "name": "repeater1", + "type": "prplmesh_compose", + "conn_cmd": "" + }, + { + "name": "repeater2", + "type": "prplmesh_compose", + "conn_cmd": "" + } + ] + } +} diff --git a/tests/run_bf_compose.sh b/tests/run_bf_compose.sh new file mode 100755 index 0000000000..ab1cc2fed7 --- /dev/null +++ b/tests/run_bf_compose.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# SPDX-License-Identifier: BSD-2-Clause-Patent +# SPDX-FileCopyrightText: 2020 the prplMesh contributors (see AUTHORS.md) +# This code is subject to the terms of the BSD+Patent license. +# See LICENSE file for more details. + +scriptdir=$(dirname "$(readlink -f "${0}")") +bf_plugins_dir=${scriptdir}/boardfarm_plugins +bf_dir=$(realpath "${scriptdir}/../../boardfarm") + +if [ -n "${PYTHONPATH}" ]; then + PYTHONPATH="${bf_dir}:${bf_plugins_dir}:${scriptdir}:${PYTHONPATH}" +else + PYTHONPATH="${bf_dir}:${bf_plugins_dir}:${scriptdir}" +fi +export PYTHONPATH + +exec python3 "${bf_dir}"/bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config_compose.json -n prplmesh_docker -x test_flows diff --git a/tools/docker/boardfarm-ci/Dockerfile b/tools/docker/boardfarm-ci/Dockerfile index 3d6ab88668..e3f3d2a9e1 100644 --- a/tools/docker/boardfarm-ci/Dockerfile +++ b/tools/docker/boardfarm-ci/Dockerfile @@ -1,4 +1,5 @@ FROM python:3.8-slim-buster +# FROM tiangolo/docker-with-compose RUN apt-get update \ && apt-get install gcc libsnmp-dev -y \ @@ -11,5 +12,14 @@ RUN pip3 install -r requirements.txt RUN apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y +RUN apt-get install curl -y + +RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - +RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" +RUN apt-get update \ +&& apt-get install docker-ce docker-ce-cli containerd.io -y +RUN curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +RUN chmod 755 /usr/local/bin/docker-compose + # VOLUME "/home/pablo/assia/prpl/git" # ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 92ad543c13..a7dbf3f2d6 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -1,6 +1,22 @@ version: '3' services: controller: + image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner + privileged: true # For the creation of the bridge to work + environment: + - USER=pablo + - INSTALL_DIR=/home/pablo/assia/prpl/git/prplMesh/build/install + expose: + - "5000" + - "8002" + volumes: + - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" + - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" + - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" + - "/lib/modules:/lib/modules" + entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] + + agent: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true environment: @@ -8,12 +24,23 @@ services: - INSTALL_DIR=/home/pablo/assia/prpl/git/prplMesh/build/install expose: - "5000" + - "8002" volumes: - - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" + - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" + - "/lib/modules:/lib/modules" + entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] boardfarm: build: . ports: - "5000:5000" + volumes: + - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" + - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" + - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" + - "/home/pablo/assia/prpl/git/boardfarm:/home/pablo/assia/prpl/git/boardfarm" + - "/var/run/docker:/var/run/docker" + - "/var/run/docker.sock:/var/run/docker.sock" + entrypoint: ["tail", "-f", "/dev/null"] From 137135309b62de27a1f6a8ce93c6263864bdb5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= Date: Tue, 23 Jun 2020 17:31:47 +0200 Subject: [PATCH 03/45] boardfarm-ci: docker-compose.yml: use a variable for the volumes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Raphaël Mélotte Signed-off-by: odkq --- tools/docker/boardfarm-ci/docker-compose.yml | 23 ++++++-------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index a7dbf3f2d6..5652de7eb8 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -4,32 +4,26 @@ services: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true # For the creation of the bridge to work environment: - - USER=pablo - - INSTALL_DIR=/home/pablo/assia/prpl/git/prplMesh/build/install + - USER=$USER + - INSTALL_DIR=$ROOT_DIR/build/install expose: - "5000" - "8002" volumes: - - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" - - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" - - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" - - "/lib/modules:/lib/modules" + - "$ROOT_DIR:$ROOT_DIR" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true environment: - - USER=pablo - - INSTALL_DIR=/home/pablo/assia/prpl/git/prplMesh/build/install + - USER=$USER + - INSTALL_DIR=$ROOT_DIR/build/install expose: - "5000" - "8002" volumes: - - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" - - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" - - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" - - "/lib/modules:/lib/modules" + - "$ROOT_DIR:$ROOT_DIR" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] boardfarm: @@ -37,10 +31,7 @@ services: ports: - "5000:5000" volumes: - - "/home/pablo/assia/prpl/git/prplMesh/build/install:/home/pablo/assia/prpl/git/prplMesh/build/install" - - "/home/pablo/assia/prpl/git/prplMesh:/home/pablo/assia/prpl/git/prplMesh" - - "/home/pablo/assia/prpl/git/prplMesh/logs/controller:/tmp/pablo/beerocks/logs" - - "/home/pablo/assia/prpl/git/boardfarm:/home/pablo/assia/prpl/git/boardfarm" + - "$ROOT_DIR:$ROOT_DIR" - "/var/run/docker:/var/run/docker" - "/var/run/docker.sock:/var/run/docker.sock" entrypoint: ["tail", "-f", "/dev/null"] From 2c43b827372aee09ab7f02beca28e78ef8ca4096 Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 24 Jun 2020 20:21:18 +0200 Subject: [PATCH 04/45] boardfarm-ci: Add exit status check in _run_shell_cmd Export $ROOT_DIR into images Signed-off-by: odkq --- .../devices/prplmesh_base.py | 11 ++++++++- tests/environment.py | 24 +++++++++++-------- tools/docker/boardfarm-ci/docker-compose.yml | 8 +++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py index 227e8cd27b..5ca4ba8a3d 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py @@ -8,14 +8,23 @@ from boardfarm.devices import linux +class CommandError(Exception): + """Raised on failed execution""" + pass + + class PrplMeshBase(linux.LinuxDevice): """PrplMesh abstract device.""" def _run_shell_cmd(self, cmd: str = "", args: list = None, timeout: int = 30): """Wrapper that executes command with specified args on host machine and logs output.""" - res = pexpect.run(cmd, args=args, timeout=timeout, encoding="utf-8") + res, exitstatus = pexpect.run(cmd, args=args, timeout=timeout, encoding="utf-8", + withexitstatus=1) entry = " ".join((cmd, " ".join(args))) + if exitstatus != 0: + raise CommandError("Error executing {}".format(entry)) + self.log_calls += entry self.log += "$ " + entry + "\r\n" + res diff --git a/tests/environment.py b/tests/environment.py index 155436df41..1a98e6fdfa 100644 --- a/tests/environment.py +++ b/tests/environment.py @@ -243,7 +243,8 @@ class ALEntityDocker(ALEntity): The entity is defined from the name of the container, the rest is derived from that. ''' - def __init__(self, name: str, is_controller: bool = False): + def __init__(self, name: str, is_controller: bool = False, + compose: bool = False): self.name = name self.bridge_name = 'br-lan' @@ -257,16 +258,19 @@ def __init__(self, name: str, is_controller: bool = False): re.search(r'ucc_listener_port=(?P[0-9]+)', config_file.read()).group('port') # On WSL, connect to the locally exposed container port - if on_wsl: - published_port_output = subprocess.check_output( - ["docker", "port", name, ucc_port]).decode('utf-8').split(":") - device_ip = published_port_output[0] - ucc_port = int(published_port_output[1]) + if not compose: + if on_wsl: + published_port_output = subprocess.check_output( + ["docker", "port", name, ucc_port]).decode('utf-8').split(":") + device_ip = published_port_output[0] + ucc_port = int(published_port_output[1]) + else: + device_ip_output = self.command( + 'ip', '-f', 'inet', 'addr', 'show', self.bridge_name) + device_ip = re.search( + r'inet (?P[0-9.]+)', device_ip_output.decode('utf-8')).group('ip') else: - device_ip_output = self.command( - 'ip', '-f', 'inet', 'addr', 'show', self.bridge_name) - device_ip = re.search( - r'inet (?P[0-9.]+)', device_ip_output.decode('utf-8')).group('ip') + device_ip = name ucc_socket = UCCSocket(device_ip, ucc_port) mac = ucc_socket.dev_get_parameter('ALid') diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 5652de7eb8..5ca4c1f451 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -3,9 +3,11 @@ services: controller: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true # For the creation of the bridge to work + container_name: controller environment: - USER=$USER - INSTALL_DIR=$ROOT_DIR/build/install + - ROOT_DIR=$ROOT_DIR expose: - "5000" - "8002" @@ -16,9 +18,11 @@ services: agent: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true + container_name: agent environment: - USER=$USER - INSTALL_DIR=$ROOT_DIR/build/install + - ROOT_DIR=$ROOT_DIR expose: - "5000" - "8002" @@ -28,6 +32,10 @@ services: boardfarm: build: . + container_name: boardfarm + environment: + - USER=$USER + - ROOT_DIR=$ROOT_DIR ports: - "5000:5000" volumes: From 3bfd97d4f9e6dc2f1dd017a549c763806b6e0876 Mon Sep 17 00:00:00 2001 From: odkq Date: Thu, 25 Jun 2020 11:50:41 +0200 Subject: [PATCH 05/45] boardfarm-ci: Preliminary version of prplmesh_compose.py Signed-off-by: odkq --- .../devices/prplmesh_compose.py | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py new file mode 100644 index 0000000000..976f7ee04f --- /dev/null +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -0,0 +1,91 @@ +# SPDX-License-Identifier: BSD-2-Clause-Patent +# SPDX-FileCopyrightText: 2020 the prplMesh contributors (see AUTHORS.md) +# This code is subject to the terms of the BSD+Patent license. +# See LICENSE file for more details. + +import os +import time + +import boardfarm +from environment import ALEntityDocker, _get_bridge_interface +from .prplmesh_base import PrplMeshBase +from sniffer import Sniffer + +rootdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..')) + + +class PrplMeshCompose(PrplMeshBase): + """Dockerized prplMesh device.""" + + model = ("prplmesh_compose") + agent_entity = None + controller_entity = None + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + config = kwargs.get("config", kwargs) + + # List of device's consoles test can interact with + self.consoles = [self] + + # Getting unic ID to distinguish devices and network they belong to + self.unique_id = os.getenv("SUDO_USER", os.getenv("USER", "")) + + self.name = "-".join((config.get("name", "prplmesh_compose"), self.unique_id)) + self.role = config.get("role", "agent") + self.cleanup_cmd = config.get("cleanup_cmd", None) + self.conn_cmd = config.get("conn_cmd", None) + self.delay = config.get("delay", 7) + self.docker_network = "boardfarm-ci_default" + # "prplMesh-net-{}".format(self.unique_id)) + + # docker_cmd = os.path.join(rootdir, "tools", "docker", "run.sh") + # docker_args = ["--verbose", "--detach", "--force", "--name", self.name, + # "--network", self.docker_network, "--expose", "8002"] + + if self.role == "controller": + # Start controller + args = ["-f", + os.path.join(rootdir, + "tools/docker/boardfarm-ci/docker-compose.yml"), + "up", "-d", "controller"] + print('args {}'.format(args)) + self._run_shell_cmd("/usr/local/bin/docker-compose", args) + + time.sleep(self.delay) + self.controller_entity = ALEntityDocker("controller", is_controller=True, + compose=True) + else: + args = ["up", "-d", "agent"] + print('args {}'.format(args)) + self._run_shell_cmd("/usr/local/bin/docker-compose", args) + + time.sleep(self.delay) + self.agent_entity = ALEntityDocker(self.name, is_controller=False, compose=True) + + self.wired_sniffer = Sniffer(_get_bridge_interface(self.docker_network), + boardfarm.config.output_dir) + self.check_status() + + def __del__(self): + if self.cleanup_cmd: + self._run_shell_cmd(self.cleanup_cmd) + + def check_status(self): + """Method required by boardfarm. + + It is used by boardfarm to indicate that spawned device instance is ready for test + and also after test - to insure that device still operational. + """ + self._run_shell_cmd(os.path.join(rootdir, "tools", "docker", "test.sh"), + ["-v", "-n", self.name]) + pass + + def isalive(self): + """Method required by boardfarm. + + States that device is operational and its consoles are accessible. + """ + return True From f6776015a630925f3e54d964cdbf61a224c3246a Mon Sep 17 00:00:00 2001 From: odkq Date: Thu, 25 Jun 2020 16:31:53 +0200 Subject: [PATCH 06/45] boardfarm-ci: Made the boardfarm container privileged For dumpcap Signed-off-by: odkq --- .../boardfarm_prplmesh/devices/prplmesh_compose.py | 11 +++++++---- .../boardfarm_prplmesh/prplmesh_config_compose.json | 5 ----- tools/docker/boardfarm-ci/Dockerfile | 1 + tools/docker/boardfarm-ci/docker-compose.yml | 1 + 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index 976f7ee04f..677ed1cd40 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -58,12 +58,15 @@ def __init__(self, *args, **kwargs): self.controller_entity = ALEntityDocker("controller", is_controller=True, compose=True) else: - args = ["up", "-d", "agent"] + args = ["-f", + os.path.join(rootdir, + "tools/docker/boardfarm-ci/docker-compose.yml"), + "up", "-d", "agent"] print('args {}'.format(args)) self._run_shell_cmd("/usr/local/bin/docker-compose", args) time.sleep(self.delay) - self.agent_entity = ALEntityDocker(self.name, is_controller=False, compose=True) + self.agent_entity = ALEntityDocker("agent", is_controller=False, compose=True) self.wired_sniffer = Sniffer(_get_bridge_interface(self.docker_network), boardfarm.config.output_dir) @@ -79,8 +82,8 @@ def check_status(self): It is used by boardfarm to indicate that spawned device instance is ready for test and also after test - to insure that device still operational. """ - self._run_shell_cmd(os.path.join(rootdir, "tools", "docker", "test.sh"), - ["-v", "-n", self.name]) + # self._run_shell_cmd(os.path.join(rootdir, "tools", "docker", "test.sh"), + # ["-v", "-n", "controller"]) pass def isalive(self): diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json b/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json index c7818832e4..dbd3897cb8 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/prplmesh_config_compose.json @@ -9,11 +9,6 @@ "name": "repeater1", "type": "prplmesh_compose", "conn_cmd": "" - }, - { - "name": "repeater2", - "type": "prplmesh_compose", - "conn_cmd": "" } ] } diff --git a/tools/docker/boardfarm-ci/Dockerfile b/tools/docker/boardfarm-ci/Dockerfile index e3f3d2a9e1..e7a40a167a 100644 --- a/tools/docker/boardfarm-ci/Dockerfile +++ b/tools/docker/boardfarm-ci/Dockerfile @@ -21,5 +21,6 @@ RUN apt-get update \ RUN curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose RUN chmod 755 /usr/local/bin/docker-compose +RUN DEBIAN_FRONTEND=noninteractive apt-get install wireshark-common -y # VOLUME "/home/pablo/assia/prpl/git" # ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 5ca4c1f451..d33acaf6e5 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -32,6 +32,7 @@ services: boardfarm: build: . + privileged: true container_name: boardfarm environment: - USER=$USER From 0bea3d941143f97a92b43c63fdcb69257dd92558 Mon Sep 17 00:00:00 2001 From: odkq Date: Sat, 27 Jun 2020 01:02:43 +0200 Subject: [PATCH 07/45] boardfarm-ci: Use docker-compose run (not up) With this, many instances can be launched. Each one get's the name configured in the .json file, with the 'unique id' being the user. Also, a volume is mapped where the tests expect the output log to reside, from them to /tmp/user/beerocks/logs Changed the entrypoint for boardfarm image to run the script and and made a small shell script wrapper Signed-off-by: odkq --- dctest.sh | 14 +++++ .../devices/prplmesh_compose.py | 58 ++++++++++--------- tests/environment.py | 3 + tools/docker/boardfarm-ci/docker-compose.yml | 3 +- 4 files changed, 51 insertions(+), 27 deletions(-) create mode 100755 dctest.sh diff --git a/dctest.sh b/dctest.sh new file mode 100755 index 0000000000..05f3cf0862 --- /dev/null +++ b/dctest.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +function dc { + ROOT_DIR=$(dirname $(pwd)) docker-compose -f tools/docker/boardfarm-ci/docker-compose.yml $@ +} +if [ $# -eq 0 ]; then + dc up boardfarm +else + if [ $1 == "-h" ]; then + print "Usage ./dctest.sh | ./dctest.sh --clean" + elif [ $1 == "--clean" ]; then + dc down --remove-orphans --rmi all --help + fi +fi diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index 677ed1cd40..55986bb807 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -34,47 +34,52 @@ def __init__(self, *args, **kwargs): self.unique_id = os.getenv("SUDO_USER", os.getenv("USER", "")) self.name = "-".join((config.get("name", "prplmesh_compose"), self.unique_id)) + print('config.get("name") {}'.format(config.get("name"))) + # self.name = config.get("name") self.role = config.get("role", "agent") self.cleanup_cmd = config.get("cleanup_cmd", None) self.conn_cmd = config.get("conn_cmd", None) self.delay = config.get("delay", 7) self.docker_network = "boardfarm-ci_default" - # "prplMesh-net-{}".format(self.unique_id)) - - # docker_cmd = os.path.join(rootdir, "tools", "docker", "run.sh") - # docker_args = ["--verbose", "--detach", "--force", "--name", self.name, - # "--network", self.docker_network, "--expose", "8002"] if self.role == "controller": - # Start controller - args = ["-f", - os.path.join(rootdir, - "tools/docker/boardfarm-ci/docker-compose.yml"), - "up", "-d", "controller"] - print('args {}'.format(args)) - self._run_shell_cmd("/usr/local/bin/docker-compose", args) - + self._docker_compose(["-d", "--name", self.name, "controller"], + "run") time.sleep(self.delay) - self.controller_entity = ALEntityDocker("controller", is_controller=True, - compose=True) + self.controller_entity = \ + ALEntityDocker(self.name, is_controller=True, compose=True) else: - args = ["-f", - os.path.join(rootdir, - "tools/docker/boardfarm-ci/docker-compose.yml"), - "up", "-d", "agent"] - print('args {}'.format(args)) - self._run_shell_cmd("/usr/local/bin/docker-compose", args) - + self._docker_compose(["-d", "--name", self.name, "agent"], + "run") time.sleep(self.delay) - self.agent_entity = ALEntityDocker("agent", is_controller=False, compose=True) + self.agent_entity = \ + ALEntityDocker(self.name, is_controller=False, + compose=True) self.wired_sniffer = Sniffer(_get_bridge_interface(self.docker_network), boardfarm.config.output_dir) self.check_status() + def _docker_compose(self, args, parameter=None): + print('_docker_compose: args {}'.format(args)) + yml_path = "tools/docker/boardfarm-ci/docker-compose.yml" + full_args = ["-f", os.path.join(rootdir, yml_path)] + + if parameter == "run": + log_path = os.path.join(rootdir, "logs/{}".format(self.name)) + if not os.path.exists(log_path): + os.mkdir(log_path) + vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.unique_id) + full_args += ["run", "-v", vol] + full_args += args + + print('_docker_compose: {}'.format(' '.join(full_args))) + self._run_shell_cmd("/usr/local/bin/docker-compose", full_args) + def __del__(self): - if self.cleanup_cmd: - self._run_shell_cmd(self.cleanup_cmd) + # self._docker_compose(["stop", self.name]) + self._run_shell_cmd("docker", ["stop", self.name]) + self._run_shell_cmd("docker", ["container", "rm", "-f", self.name]) def check_status(self): """Method required by boardfarm. @@ -83,12 +88,13 @@ def check_status(self): and also after test - to insure that device still operational. """ # self._run_shell_cmd(os.path.join(rootdir, "tools", "docker", "test.sh"), - # ["-v", "-n", "controller"]) + # ["-v", "-n", "controller"]) pass def isalive(self): """Method required by boardfarm. States that device is operational and its consoles are accessible. + """ return True diff --git a/tests/environment.py b/tests/environment.py index 1a98e6fdfa..100683526d 100644 --- a/tests/environment.py +++ b/tests/environment.py @@ -191,6 +191,9 @@ def _docker_wait_for_log(container: str, programs: [str], regex: str, start_line timeout: float) -> bool: def logfilename(program): logfilename = os.path.join(rootdir, 'logs', container, 'beerocks_{}.log'.format(program)) + + print(' --- logfilename: {}'.format(logfilename)) + # WSL doesn't support symlinks on NTFS, so resolve the symlink manually if on_wsl: logfilename = os.path.join( diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index d33acaf6e5..bdf9209511 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -43,4 +43,5 @@ services: - "$ROOT_DIR:$ROOT_DIR" - "/var/run/docker:/var/run/docker" - "/var/run/docker.sock:/var/run/docker.sock" - entrypoint: ["tail", "-f", "/dev/null"] + working_dir: $ROOT_DIR/prplMesh/tests + entrypoint: ["bash", "run_bf_compose.sh"] From 6d796bf2f33adf54ed33805bf1dfa208433f2834 Mon Sep 17 00:00:00 2001 From: odkq Date: Sat, 27 Jun 2020 01:09:55 +0200 Subject: [PATCH 08/45] boardfarm-ci: Fix dctest.sh --clean Signed-off-by: odkq --- dctest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dctest.sh b/dctest.sh index 05f3cf0862..c57faca677 100755 --- a/dctest.sh +++ b/dctest.sh @@ -9,6 +9,6 @@ else if [ $1 == "-h" ]; then print "Usage ./dctest.sh | ./dctest.sh --clean" elif [ $1 == "--clean" ]; then - dc down --remove-orphans --rmi all --help + dc down --remove-orphans --rmi all fi fi From c649d9fae7bf8166a9cc35c408896f49c02e16d9 Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 1 Jul 2020 17:38:37 +0200 Subject: [PATCH 09/45] boardfarm-ci: Implementation of dctest in python 3.5 This will allow better extensibility when adding bridges and the rest Signed-off-by: odkq --- dctest.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ dctest.sh | 14 -------------- 2 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 dctest.py delete mode 100755 dctest.sh diff --git a/dctest.py b/dctest.py new file mode 100644 index 0000000000..c635ddcd20 --- /dev/null +++ b/dctest.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# +# Launch the test suite using docker and docker-compose. This script wraps +# the creation of the bridge(s) to be able to connect external devices with +# the docker network, launching the service for boardfarm. +# +# As this script is run outside containers, it does not use anything apart +# from Python 3.5 (will work on later versions but only uses 3.5 features) +# +# The best way to make sure no Python 3.5+ features are used is running the +# script with a Python 3.5.0 interpreter. Compile it from: +# +# https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz +# +# Also, when calling a function look for 'New in version 3.X' where X > 5 +# +import argparse +import os +from subprocess import Popen, PIPE + + +class Services: + def __init__(self): + scriptdir = os.path.dirname(os.path.realpath(__file__)) + os.chdir(scriptdir) + self.rootdir = os.path.dirname(scriptdir) + print(self.rootdir) + + def dc(self, args): + params = ['docker-compose', '-f', + 'tools/docker/boardfarm-ci/docker-compose.yml'] + params += args + local_env = os.environ + local_env['ROOT_DIR'] = self.rootdir + proc = Popen(params, stdout=PIPE, stderr=PIPE) + for line in proc.stdout: + print(line.decode(), end='') + proc.stdout.close() + return_code = proc.wait() + return return_code + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Dockerized test launcher') + parser.add_argument('--test', dest='test', type=str, help='Test to be run') + parser.add_argument('--clean', dest='clean', help='Test to be run') + args = parser.parse_args() + services = Services() + if args.clean: + services.dc(['down', '--remove-orphans', '--rmi', 'all']) + else: + rc = services.dc(['up', 'boardfarm']) + if rc != 0: + print('Return code !=0 -> {}'.format(rc)) + diff --git a/dctest.sh b/dctest.sh deleted file mode 100755 index c57faca677..0000000000 --- a/dctest.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -function dc { - ROOT_DIR=$(dirname $(pwd)) docker-compose -f tools/docker/boardfarm-ci/docker-compose.yml $@ -} -if [ $# -eq 0 ]; then - dc up boardfarm -else - if [ $1 == "-h" ]; then - print "Usage ./dctest.sh | ./dctest.sh --clean" - elif [ $1 == "--clean" ]; then - dc down --remove-orphans --rmi all - fi -fi From 552f49f2338fc39a513556d614ed8cc06e8bf9b9 Mon Sep 17 00:00:00 2001 From: odkq Date: Mon, 6 Jul 2020 16:28:29 +0200 Subject: [PATCH 10/45] gitlab-ci: Check versions Check versions of docker, docker-compose and python Signed-off-by: odkq --- dctest.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) mode change 100644 => 100755 dctest.py diff --git a/dctest.py b/dctest.py old mode 100644 new mode 100755 index c635ddcd20..00b724af28 --- a/dctest.py +++ b/dctest.py @@ -14,11 +14,45 @@ # # Also, when calling a function look for 'New in version 3.X' where X > 5 # +from __future__ import print_function # To check for python2 or < 3.5 execution import argparse import os +import sys from subprocess import Popen, PIPE +if not (sys.version_info.major == 3 and sys.version_info.minor >= 5): + print("This script requires Python 3.5 or higher!") + print("You are using Python {}.{}.".format(sys.version_info.major, sys.version_info.minor)) + sys.exit(1) + + +def check_docker_versions(): + DOCKER_MAJOR = 19 + DC_MAJOR = 1 + DC_MINOR = 25 + docker_version = os.popen('docker --version').read().split(' ')[2] + docker_major = int(docker_version.split('.')[0]) + if docker_major < DOCKER_MAJOR: + fmt = "This script requires docker {}.0 or higher" + print(fmt.format(DOCKER_MAJOR)) + print("You are usng version {}".format(docker_version)) + sys.exit(1) + dc_version = os.popen('docker-compose --version').read().split(' ')[2] + dc_major = int(dc_version.split('.')[0]) + dc_minor = int(dc_version.split('.')[1]) + if dc_major < DC_MAJOR: + fmt = "This script requires docker-compose {}.{} or higher" + print(fmt.format(DC_MAJOR, DC_MINOR)) + print("You are usng version {}".format(dc_version)) + sys.exit(1) + if dc_minor < DC_MINOR: + fmt = "This script requires docker-compose {}.{} or higher" + print(fmt.format(DC_MAJOR, DC_MINOR)) + print("You are usng version {}".format(dc_version)) + sys.exit(1) + + class Services: def __init__(self): scriptdir = os.path.dirname(os.path.realpath(__file__)) @@ -41,6 +75,7 @@ def dc(self, args): if __name__ == '__main__': + check_docker_versions() parser = argparse.ArgumentParser(description='Dockerized test launcher') parser.add_argument('--test', dest='test', type=str, help='Test to be run') parser.add_argument('--clean', dest='clean', help='Test to be run') From c4e63faec0235d8164a0ea60a50f4f424ba15e8b Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 8 Jul 2020 15:36:32 +0200 Subject: [PATCH 11/45] boardfarm-ci: add --shell parameter --- dctest.py | 32 ++++++++++++++++---- tools/docker/boardfarm-ci/docker-compose.yml | 5 +++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/dctest.py b/dctest.py index 00b724af28..85cd5297d6 100755 --- a/dctest.py +++ b/dctest.py @@ -16,6 +16,7 @@ # from __future__ import print_function # To check for python2 or < 3.5 execution import argparse +import fcntl import os import sys from subprocess import Popen, PIPE @@ -60,16 +61,27 @@ def __init__(self): self.rootdir = os.path.dirname(scriptdir) print(self.rootdir) - def dc(self, args): + def _setNonBlocking(fd): + """ + Set the file description of the given file descriptor to non-blocking. + """ + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + flags = flags | os.O_NONBLOCK + fcntl.fcntl(fd, fcntl.F_SETFL, flags) + + def dc(self, args, interactive=False): params = ['docker-compose', '-f', 'tools/docker/boardfarm-ci/docker-compose.yml'] params += args local_env = os.environ local_env['ROOT_DIR'] = self.rootdir - proc = Popen(params, stdout=PIPE, stderr=PIPE) - for line in proc.stdout: - print(line.decode(), end='') - proc.stdout.close() + if not interactive: + proc = Popen(params, stdout=PIPE, stderr=PIPE) + for line in proc.stdout: + print(line.decode(), end='') + proc.stdout.close() + else: + proc = Popen(params) return_code = proc.wait() return return_code @@ -78,11 +90,19 @@ def dc(self, args): check_docker_versions() parser = argparse.ArgumentParser(description='Dockerized test launcher') parser.add_argument('--test', dest='test', type=str, help='Test to be run') - parser.add_argument('--clean', dest='clean', help='Test to be run') + parser.add_argument('--clean', dest='clean', action='store_true', + help='Clean containers images and networks') + parser.add_argument('--shell', dest='shell', action='store_true', + help='Run a shell on the bf container') args = parser.parse_args() services = Services() if args.clean: services.dc(['down', '--remove-orphans', '--rmi', 'all']) + elif args.shell: + rc = services.dc(['run', '--service-ports', '--entrypoint', + '/bin/bash', 'boardfarm'], interactive=True) + if rc != 0: + print('Return code !=0 -> {}'.format(rc)) else: rc = services.dc(['up', 'boardfarm']) if rc != 0: diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index bdf9209511..e3a4233adf 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -45,3 +45,8 @@ services: - "/var/run/docker.sock:/var/run/docker.sock" working_dir: $ROOT_DIR/prplMesh/tests entrypoint: ["bash", "run_bf_compose.sh"] + +networks: + default: + external: + name: prplbr From 8cbc474347d685f62e30a2449d64276f2b3933a5 Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 8 Jul 2020 16:33:04 +0200 Subject: [PATCH 12/45] boardfarm-ci: Use curret user for volumes --- dctest.py | 4 +++- tools/docker/boardfarm-ci/docker-compose.yml | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dctest.py b/dctest.py index 00b724af28..3e60c33c6f 100755 --- a/dctest.py +++ b/dctest.py @@ -66,6 +66,7 @@ def dc(self, args): params += args local_env = os.environ local_env['ROOT_DIR'] = self.rootdir + local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) proc = Popen(params, stdout=PIPE, stderr=PIPE) for line in proc.stdout: print(line.decode(), end='') @@ -78,7 +79,8 @@ def dc(self, args): check_docker_versions() parser = argparse.ArgumentParser(description='Dockerized test launcher') parser.add_argument('--test', dest='test', type=str, help='Test to be run') - parser.add_argument('--clean', dest='clean', help='Test to be run') + parser.add_argument('--clean', dest='clean', help='Clean', + action='store_true') args = parser.parse_args() services = Services() if args.clean: diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index bdf9209511..8872145408 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -13,6 +13,7 @@ services: - "8002" volumes: - "$ROOT_DIR:$ROOT_DIR" + user: ${CURRENT_UID} entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: @@ -28,6 +29,7 @@ services: - "8002" volumes: - "$ROOT_DIR:$ROOT_DIR" + user: ${CURRENT_UID} entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] boardfarm: @@ -43,5 +45,6 @@ services: - "$ROOT_DIR:$ROOT_DIR" - "/var/run/docker:/var/run/docker" - "/var/run/docker.sock:/var/run/docker.sock" + user: ${CURRENT_UID} working_dir: $ROOT_DIR/prplMesh/tests entrypoint: ["bash", "run_bf_compose.sh"] From 8c1ff616c5eefc550684c288ad1b7527d915dbde Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 10 Jul 2020 12:35:36 +0200 Subject: [PATCH 13/45] boardfarm-ci: Remove existing network This is functionality that do not belong on this branch Signed-off-by: odkq --- dctest.py | 7 ++++++- .../boardfarm_prplmesh/devices/prplmesh_compose.py | 1 + tests/run_bf_compose.sh | 3 +++ tools/docker/boardfarm-ci/docker-compose.yml | 13 ++++++------- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/dctest.py b/dctest.py index 9ef2e083d3..ddcd3473cf 100755 --- a/dctest.py +++ b/dctest.py @@ -17,6 +17,8 @@ from __future__ import print_function # To check for python2 or < 3.5 execution import argparse import fcntl +import getpass +import grp import os import sys from subprocess import Popen, PIPE @@ -75,7 +77,10 @@ def dc(self, args, interactive=False): params += args local_env = os.environ local_env['ROOT_DIR'] = self.rootdir - local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) + docker_gid = grp.getgrnam('docker')[2] + # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) + local_env['CURRENT_ID']= str(os.getuid()) + # local_env['USER']= getpass.getuser() if not interactive: proc = Popen(params, stdout=PIPE, stderr=PIPE) for line in proc.stdout: diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index 55986bb807..39943d5867 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -74,6 +74,7 @@ def _docker_compose(self, args, parameter=None): full_args += args print('_docker_compose: {}'.format(' '.join(full_args))) + os.environ['CURRENT_UID'] = '1000:998' self._run_shell_cmd("/usr/local/bin/docker-compose", full_args) def __del__(self): diff --git a/tests/run_bf_compose.sh b/tests/run_bf_compose.sh index ab1cc2fed7..5db6290deb 100755 --- a/tests/run_bf_compose.sh +++ b/tests/run_bf_compose.sh @@ -13,6 +13,9 @@ if [ -n "${PYTHONPATH}" ]; then else PYTHONPATH="${bf_dir}:${bf_plugins_dir}:${scriptdir}" fi +echo $PYTHONPATH export PYTHONPATH +adduser --system --no-create-home --uid $CURRENT_ID --ingroup root $USER + exec python3 "${bf_dir}"/bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config_compose.json -n prplmesh_docker -x test_flows diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 358f83c721..bfae6bdf66 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -8,12 +8,13 @@ services: - USER=$USER - INSTALL_DIR=$ROOT_DIR/build/install - ROOT_DIR=$ROOT_DIR + - CURRENT_ID=$CURRENT_ID expose: - "5000" - "8002" volumes: - "$ROOT_DIR:$ROOT_DIR" - user: ${CURRENT_UID} + # user: ${CURRENT_UID} entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: @@ -24,12 +25,13 @@ services: - USER=$USER - INSTALL_DIR=$ROOT_DIR/build/install - ROOT_DIR=$ROOT_DIR + - CURRENT_ID=$CURRENT_ID expose: - "5000" - "8002" volumes: - "$ROOT_DIR:$ROOT_DIR" - user: ${CURRENT_UID} + # user: ${CURRENT_UID} entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] boardfarm: @@ -39,6 +41,8 @@ services: environment: - USER=$USER - ROOT_DIR=$ROOT_DIR + - CURRENT_UID=$CURRENT_UID + - CURRENT_ID=$CURRENT_ID ports: - "5000:5000" volumes: @@ -48,8 +52,3 @@ services: user: ${CURRENT_UID} working_dir: $ROOT_DIR/prplMesh/tests entrypoint: ["bash", "run_bf_compose.sh"] - -networks: - default: - external: - name: prplbr From 68598ffcf4ea63e57d02f5d7eb2d7e2c920abb1c Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 15 Jul 2020 11:21:12 +0200 Subject: [PATCH 14/45] boardfarm-ci: Remove user: references, run as root again Signed-off-by: odkq --- tools/docker/boardfarm-ci/docker-compose.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index bfae6bdf66..c6e020c758 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -14,7 +14,6 @@ services: - "8002" volumes: - "$ROOT_DIR:$ROOT_DIR" - # user: ${CURRENT_UID} entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: @@ -31,7 +30,6 @@ services: - "8002" volumes: - "$ROOT_DIR:$ROOT_DIR" - # user: ${CURRENT_UID} entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] boardfarm: @@ -41,7 +39,6 @@ services: environment: - USER=$USER - ROOT_DIR=$ROOT_DIR - - CURRENT_UID=$CURRENT_UID - CURRENT_ID=$CURRENT_ID ports: - "5000:5000" @@ -49,6 +46,6 @@ services: - "$ROOT_DIR:$ROOT_DIR" - "/var/run/docker:/var/run/docker" - "/var/run/docker.sock:/var/run/docker.sock" - user: ${CURRENT_UID} + # user: ${CURRENT_UID} working_dir: $ROOT_DIR/prplMesh/tests entrypoint: ["bash", "run_bf_compose.sh"] From cd782d95b0528133d6f7c50b59c300218baa1c7c Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 15 Jul 2020 11:24:26 +0200 Subject: [PATCH 15/45] Enable running a different entrypoint This allows running an entrypoint script from the code, mounted as volume, instead of running the one in the uploaded image Signed-off-by: odkq --- .../devices/prplmesh_compose.py | 12 +++-- .../docker/boardfarm-ci/runner-entrypoint.sh | 46 +++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) create mode 100755 tools/docker/boardfarm-ci/runner-entrypoint.sh diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index 39943d5867..cecb06058d 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -44,13 +44,13 @@ def __init__(self, *args, **kwargs): if self.role == "controller": self._docker_compose(["-d", "--name", self.name, "controller"], - "run") + "run", "start-controller") time.sleep(self.delay) self.controller_entity = \ ALEntityDocker(self.name, is_controller=True, compose=True) else: self._docker_compose(["-d", "--name", self.name, "agent"], - "run") + "run", "start-agent") time.sleep(self.delay) self.agent_entity = \ ALEntityDocker(self.name, is_controller=False, @@ -60,21 +60,23 @@ def __init__(self, *args, **kwargs): boardfarm.config.output_dir) self.check_status() - def _docker_compose(self, args, parameter=None): + def _docker_compose(self, args, parameter=None, start=None): print('_docker_compose: args {}'.format(args)) yml_path = "tools/docker/boardfarm-ci/docker-compose.yml" full_args = ["-f", os.path.join(rootdir, yml_path)] - + entrypoint_path = "tools/docker/boardfarm-ci/runner-entrypoint.sh" + entrypoint = os.path.join(rootdir, entrypoint_path) if parameter == "run": log_path = os.path.join(rootdir, "logs/{}".format(self.name)) if not os.path.exists(log_path): os.mkdir(log_path) vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.unique_id) full_args += ["run", "-v", vol] + # full_args += ["--entrypoint", entrypoint + ' ' + start] full_args += args print('_docker_compose: {}'.format(' '.join(full_args))) - os.environ['CURRENT_UID'] = '1000:998' + # os.environ['CURRENT_UID'] = '1000:998' self._run_shell_cmd("/usr/local/bin/docker-compose", full_args) def __del__(self): diff --git a/tools/docker/boardfarm-ci/runner-entrypoint.sh b/tools/docker/boardfarm-ci/runner-entrypoint.sh new file mode 100755 index 0000000000..eccfc52579 --- /dev/null +++ b/tools/docker/boardfarm-ci/runner-entrypoint.sh @@ -0,0 +1,46 @@ +#!/bin/bash +############################################################### +# SPDX-License-Identifier: BSD-2-Clause-Patent +# SPDX-FileCopyrightText: 2019-2020 the prplMesh contributors (see AUTHORS.md) +# This code is subject to the terms of the BSD+Patent license. +# See LICENSE file for more details. +############################################################### + +run() { + echo "$*" + "$@" || exit $? +} + +apt-get update +apt-get install -y sudo + +# Use the ip address that was allocated by the daemon to this +# container (from eth0) +bridge_ip="$(ip addr show dev eth0 | awk '/^ *inet / {print $2}')" + +run ip link add br-lan type bridge +run ip link add wlan0 type dummy +run ip link add wlan2 type dummy + +# When an interface is added to the bridge, the bridge inherits its MAC address. +# It shouldn't be the same as any other interface because that messes up the topology in the +# controller, however. Therefore, save the MAC address an re-apply it later. +bridge_mac="$(ip link show dev br-lan | awk '/^ *link\/ether / {print $2}')" + +run ip link set dev eth0 master br-lan +run ip link set dev wlan0 master br-lan +run ip link set dev wlan2 master br-lan +run ip address flush dev eth0 +run ip link set dev wlan0 up +run ip link set dev wlan2 up +run ip link set dev br-lan addr "$bridge_mac" +run ip address add dev br-lan "$bridge_ip" +run ip link set dev br-lan up + +echo "runner-entrypoint.sh: $@ CURRENT_ID $CURENT_ID USER $USER" + +# adduser --system --no-create-home --uid $CURRENT_ID --ingroup root $USER + +cd "${INSTALL_DIR}" || exit 1 +# exec sudo -E -u $USER /bin/bash "$@" +exec /bin/bash "$@" From 3498fdef30bec60d89eae66431c05179db4c428d Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 15 Jul 2020 11:25:36 +0200 Subject: [PATCH 16/45] Do not create the regular user into the container As it is run as root (again) for now Signed-off-by: odkq --- tests/run_bf_compose.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/run_bf_compose.sh b/tests/run_bf_compose.sh index 5db6290deb..95c98d682a 100755 --- a/tests/run_bf_compose.sh +++ b/tests/run_bf_compose.sh @@ -16,6 +16,4 @@ fi echo $PYTHONPATH export PYTHONPATH -adduser --system --no-create-home --uid $CURRENT_ID --ingroup root $USER - exec python3 "${bf_dir}"/bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config_compose.json -n prplmesh_docker -x test_flows From d05e2246c49fc274ceeae3b14918fbc1baa1752f Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 15 Jul 2020 11:26:36 +0200 Subject: [PATCH 17/45] boardfarm-ci: Prepopulate log directories This way, even if the files belong to root, they can be removed by gitlab-ci Signed-off-by: odkq --- dctest.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/dctest.py b/dctest.py index 8c6ec03cb6..10683589dd 100755 --- a/dctest.py +++ b/dctest.py @@ -20,6 +20,7 @@ import getpass import grp import os +import shutil import sys from subprocess import Popen, PIPE @@ -58,10 +59,24 @@ def check_docker_versions(): class Services: def __init__(self): - scriptdir = os.path.dirname(os.path.realpath(__file__)) - os.chdir(scriptdir) - self.rootdir = os.path.dirname(scriptdir) + self.scriptdir = os.path.dirname(os.path.realpath(__file__)) + os.chdir(self.scriptdir) + self.rootdir = os.path.dirname(self.scriptdir) print(self.rootdir) + self.logdir = os.path.join(self.scriptdir, 'logs') + device_name = 'dockerized_device-{}'.format(getpass.getuser()) + self.devicedir = os.path.join(self.logdir, device_name) + repeater_name = 'repeater1-{}'.format(getpass.getuser()) + self.repeaterdir = os.path.join(self.logdir, repeater_name) + if not os.path.exists(self.logdir): + os.makedirs(self.logdir) + os.makedirs(self.devicedir) + os.makedirs(self.repeaterdir) + + # Create log dir + + def cleanlogs(self): + shutil.rmtree(os.path.join(self.scriptdir, 'logs')) def _setNonBlocking(fd): """ @@ -80,7 +95,6 @@ def dc(self, args, interactive=False): docker_gid = grp.getgrnam('docker')[2] # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) local_env['CURRENT_ID']= str(os.getuid()) - # local_env['USER']= getpass.getuser() # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) if not interactive: proc = Popen(params, stdout=PIPE, stderr=PIPE) @@ -99,17 +113,24 @@ def dc(self, args, interactive=False): parser.add_argument('--test', dest='test', type=str, help='Test to be run') parser.add_argument('--clean', dest='clean', action='store_true', help='Clean containers images and networks') + parser.add_argument('--build', dest='build', action='store_true', + help='Rebuild containers') parser.add_argument('--shell', dest='shell', action='store_true', help='Run a shell on the bf container') args = parser.parse_args() services = Services() if args.clean: services.dc(['down', '--remove-orphans', '--rmi', 'all']) + # services.cleanlogs() elif args.shell: rc = services.dc(['run', '--service-ports', '--entrypoint', '/bin/bash', 'boardfarm'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) + elif args.build: + rc = services.dc(['build'], interactive=True) + if rc != 0: + print('Return code !=0 -> {}'.format(rc)) else: rc = services.dc(['up', 'boardfarm']) if rc != 0: From ac48e1f4c2a7ca5ccb20e9c5b0e40432277adeca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= Date: Wed, 15 Jul 2020 15:05:17 +0200 Subject: [PATCH 18/45] docker: boardfarm-ci: add boardfarm to the docker image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new version also need 2 new python packages. Ideally, the requirements.txt file would be taken from the github repository directly. Signed-off-by: Raphaël Mélotte --- tools/docker/boardfarm-ci/Dockerfile | 4 ++++ tools/docker/boardfarm-ci/requirements.txt | 2 ++ 2 files changed, 6 insertions(+) diff --git a/tools/docker/boardfarm-ci/Dockerfile b/tools/docker/boardfarm-ci/Dockerfile index e7a40a167a..a5d2979de6 100644 --- a/tools/docker/boardfarm-ci/Dockerfile +++ b/tools/docker/boardfarm-ci/Dockerfile @@ -24,3 +24,7 @@ RUN chmod 755 /usr/local/bin/docker-compose RUN DEBIAN_FRONTEND=noninteractive apt-get install wireshark-common -y # VOLUME "/home/pablo/assia/prpl/git" # ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +RUN git clone https://github.com/mattsm/boardfarm.git \ + && cd boardfarm \ + && git checkout 100521fde1fb67536682cafecc2f91a6e2e8a6f8 \ + && python3 setup.py install diff --git a/tools/docker/boardfarm-ci/requirements.txt b/tools/docker/boardfarm-ci/requirements.txt index e2c7809a0b..aaaea868c8 100644 --- a/tools/docker/boardfarm-ci/requirements.txt +++ b/tools/docker/boardfarm-ci/requirements.txt @@ -4,6 +4,7 @@ beautifulsoup4 boto3 cdrouter debtcollector +distro dlipower dnspython docutils<0.16 @@ -13,6 +14,7 @@ Faker future ipaddress jira +jsonschema marshmallow<3 matplotlib nested_lookup==0.2.19 From a3d247be92f623bb1a4df72f3c9154bd6a06cd61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= Date: Wed, 15 Jul 2020 15:06:25 +0200 Subject: [PATCH 19/45] tests: boardfarm: use bft from the environment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Raphaël Mélotte --- tests/run_bf_compose.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/run_bf_compose.sh b/tests/run_bf_compose.sh index 95c98d682a..22987b5be5 100755 --- a/tests/run_bf_compose.sh +++ b/tests/run_bf_compose.sh @@ -6,7 +6,6 @@ scriptdir=$(dirname "$(readlink -f "${0}")") bf_plugins_dir=${scriptdir}/boardfarm_plugins -bf_dir=$(realpath "${scriptdir}/../../boardfarm") if [ -n "${PYTHONPATH}" ]; then PYTHONPATH="${bf_dir}:${bf_plugins_dir}:${scriptdir}:${PYTHONPATH}" @@ -16,4 +15,4 @@ fi echo $PYTHONPATH export PYTHONPATH -exec python3 "${bf_dir}"/bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config_compose.json -n prplmesh_docker -x test_flows +exec bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config_compose.json -n prplmesh_docker -x test_flows From 5d1da603e270e909e8d35223988d52db6aeb32c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= Date: Wed, 15 Jul 2020 15:51:33 +0200 Subject: [PATCH 20/45] rootdir: change to use the prplMesh directory itself MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Raphaël Mélotte --- dctest.py | 2 +- tools/docker/boardfarm-ci/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dctest.py b/dctest.py index 10683589dd..6f39e7cbdd 100755 --- a/dctest.py +++ b/dctest.py @@ -61,7 +61,7 @@ class Services: def __init__(self): self.scriptdir = os.path.dirname(os.path.realpath(__file__)) os.chdir(self.scriptdir) - self.rootdir = os.path.dirname(self.scriptdir) + self.rootdir = self.scriptdir print(self.rootdir) self.logdir = os.path.join(self.scriptdir, 'logs') device_name = 'dockerized_device-{}'.format(getpass.getuser()) diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index c6e020c758..0ec164a0ea 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -47,5 +47,5 @@ services: - "/var/run/docker:/var/run/docker" - "/var/run/docker.sock:/var/run/docker.sock" # user: ${CURRENT_UID} - working_dir: $ROOT_DIR/prplMesh/tests + working_dir: $ROOT_DIR/tests entrypoint: ["bash", "run_bf_compose.sh"] From 0ce036a4eb6b901908915783c34824db52b12376 Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 17 Jul 2020 15:00:18 +0200 Subject: [PATCH 21/45] boardfarm-ci: Add --comp parameter This allows calling any docker-compose command from dc-test. For example: ./dctest.py --comp images ./dctest.py --comp ps Signed-off-by: odkq --- dctest.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/dctest.py b/dctest.py index 6f39e7cbdd..c6075486b9 100755 --- a/dctest.py +++ b/dctest.py @@ -62,7 +62,6 @@ def __init__(self): self.scriptdir = os.path.dirname(os.path.realpath(__file__)) os.chdir(self.scriptdir) self.rootdir = self.scriptdir - print(self.rootdir) self.logdir = os.path.join(self.scriptdir, 'logs') device_name = 'dockerized_device-{}'.format(getpass.getuser()) self.devicedir = os.path.join(self.logdir, device_name) @@ -107,6 +106,30 @@ def dc(self, args, interactive=False): return return_code +def vararg_callback(option, opt_str, value, parser): + assert value is None + value = [] + + def floatable(str): + try: + float(str) + return True + except ValueError: + return False + + for arg in parser.rargs: + # stop on --foo like options + if arg[:2] == "--" and len(arg) > 2: + break + # stop on -a, but not on -3 or -3.0 + if arg[:1] == "-" and len(arg) > 1 and not floatable(arg): + break + value.append(arg) + + del parser.rargs[:len(value)] + setattr(parser.values, option.dest, value) + + if __name__ == '__main__': check_docker_versions() parser = argparse.ArgumentParser(description='Dockerized test launcher') @@ -117,11 +140,22 @@ def dc(self, args, interactive=False): help='Rebuild containers') parser.add_argument('--shell', dest='shell', action='store_true', help='Run a shell on the bf container') - args = parser.parse_args() + parser.add_argument('--comp', dest='comp', action='store_true', + help='Pass the rest of arguments to docker-compose') + args, rest = parser.parse_known_args() services = Services() + if args.comp: + if len(rest) == 0: + print('Usage: dctest --comp ') + sys.exit(1) + sys.exit(services.dc(rest, interactive=True)) + else: + if len(rest) > 0: + print('Unknown parameters: {}'.format(rest)) + sys.exit(1) + if args.clean: services.dc(['down', '--remove-orphans', '--rmi', 'all']) - # services.cleanlogs() elif args.shell: rc = services.dc(['run', '--service-ports', '--entrypoint', '/bin/bash', 'boardfarm'], interactive=True) From b187853dd818652dfe8ecddd29acf00101041f39 Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 22 Jul 2020 18:43:38 +0200 Subject: [PATCH 22/45] boardfarm-ci: Allow simultaneous executions This allows simultaneus executions of dctest.py, by using different paths for logs and logs on devices based on an increasing id, when running locally, and on the CI_PIPELINE_ID environment variable when run in gitlab-ci. --- dctest.py | 44 +++++++++++++++++-- .../devices/prplmesh_compose.py | 5 ++- tools/docker/boardfarm-ci/docker-compose.yml | 4 ++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/dctest.py b/dctest.py index c6075486b9..dd109fce88 100755 --- a/dctest.py +++ b/dctest.py @@ -62,18 +62,24 @@ def __init__(self): self.scriptdir = os.path.dirname(os.path.realpath(__file__)) os.chdir(self.scriptdir) self.rootdir = self.scriptdir + + self.build_id = self.get_build_id() + print('build_id {}'.format(self.build_id)) + self.logdir = os.path.join(self.scriptdir, 'logs') - device_name = 'dockerized_device-{}'.format(getpass.getuser()) + device_name = 'dockerized_device-{}'.format(self.build_id) self.devicedir = os.path.join(self.logdir, device_name) - repeater_name = 'repeater1-{}'.format(getpass.getuser()) + repeater_name = 'repeater1-{}'.format(self.build_id) self.repeaterdir = os.path.join(self.logdir, repeater_name) if not os.path.exists(self.logdir): os.makedirs(self.logdir) + if not os.path.exists(self.devicedir): + print('Making {}'.format(self.devicedir)) os.makedirs(self.devicedir) + if not os.path.exists(self.repeaterdir): + print('Making {}'.format(self.repeaterdir)) os.makedirs(self.repeaterdir) - # Create log dir - def cleanlogs(self): shutil.rmtree(os.path.join(self.scriptdir, 'logs')) @@ -85,6 +91,35 @@ def _setNonBlocking(fd): flags = flags | os.O_NONBLOCK fcntl.fcntl(fd, fcntl.F_SETFL, flags) + def get_build_id(self): + ci_pipeline_id = os.getenv('CI_PIPELINE_ID') + if ci_pipeline_id is not None: + return ci_pipeline_id + + # Otherwise we are running on the local machine, just find last id + # created and add one + last_id = 0 + if not os.path.exists('logs'): + return str(1) + for d in os.listdir('logs'): + if d.startswith('dockerized_device-'): + suffix = d[len('dockerized_device-'):] + isuffix = int(suffix) + if isuffix > last_id: + last_id = isuffix + if last_id == 0: + new_id = 1 + else: + new_id = last_id + 1 + return str(new_id) + + + def copy_build_dir(self): + new_id = self.build_id + self.build_dir = 'build-{}'.format(new_id) + shutil.copytree('build', 'build-{}'.format(self.build_dir)) + print('Copied build/ into {}'.format(self.build_dir)) + def dc(self, args, interactive=False): params = ['docker-compose', '-f', 'tools/docker/boardfarm-ci/docker-compose.yml'] @@ -94,6 +129,7 @@ def dc(self, args, interactive=False): docker_gid = grp.getgrnam('docker')[2] # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) local_env['CURRENT_ID']= str(os.getuid()) + local_env['RUN_ID'] = self.build_id # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) if not interactive: proc = Popen(params, stdout=PIPE, stderr=PIPE) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index cecb06058d..92e231de60 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -31,7 +31,8 @@ def __init__(self, *args, **kwargs): self.consoles = [self] # Getting unic ID to distinguish devices and network they belong to - self.unique_id = os.getenv("SUDO_USER", os.getenv("USER", "")) + self.unique_id = os.getenv("RUN_ID") + self.user_id = os.getenv("SUDO_USER", os.getenv("USER", "")) self.name = "-".join((config.get("name", "prplmesh_compose"), self.unique_id)) print('config.get("name") {}'.format(config.get("name"))) @@ -70,7 +71,7 @@ def _docker_compose(self, args, parameter=None, start=None): log_path = os.path.join(rootdir, "logs/{}".format(self.name)) if not os.path.exists(log_path): os.mkdir(log_path) - vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.unique_id) + vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.user_id) full_args += ["run", "-v", vol] # full_args += ["--entrypoint", entrypoint + ' ' + start] full_args += args diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 0ec164a0ea..3e9a4beeb6 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -1,5 +1,6 @@ version: '3' services: + # Controller and agent are run from inside the boardfarm container controller: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true # For the creation of the bridge to work @@ -32,6 +33,8 @@ services: - "$ROOT_DIR:$ROOT_DIR" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] + # Boardfarm image is launched from dctest.py, TARGET_DIR refers to the + # path inside the controller, will be referred as $ROOT_DIR inside boardfarm: build: . privileged: true @@ -40,6 +43,7 @@ services: - USER=$USER - ROOT_DIR=$ROOT_DIR - CURRENT_ID=$CURRENT_ID + - RUN_ID=$RUN_ID ports: - "5000:5000" volumes: From 67e74afae7e7e041b4baae267528048b5e315706 Mon Sep 17 00:00:00 2001 From: odkq Date: Wed, 22 Jul 2020 18:43:38 +0200 Subject: [PATCH 23/45] boardfarm-ci: Allow simultaneous executions This allows simultaneus executions of dctest.py, by using different paths for logs and logs on devices based on an increasing id, when running locally, and on the CI_PIPELINE_ID environment variable when run in gitlab-ci. Signed-off-by: odkq --- dctest.py | 44 +++++++++++++++++-- .../devices/prplmesh_compose.py | 5 ++- tools/docker/boardfarm-ci/docker-compose.yml | 4 ++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/dctest.py b/dctest.py index c6075486b9..dd109fce88 100755 --- a/dctest.py +++ b/dctest.py @@ -62,18 +62,24 @@ def __init__(self): self.scriptdir = os.path.dirname(os.path.realpath(__file__)) os.chdir(self.scriptdir) self.rootdir = self.scriptdir + + self.build_id = self.get_build_id() + print('build_id {}'.format(self.build_id)) + self.logdir = os.path.join(self.scriptdir, 'logs') - device_name = 'dockerized_device-{}'.format(getpass.getuser()) + device_name = 'dockerized_device-{}'.format(self.build_id) self.devicedir = os.path.join(self.logdir, device_name) - repeater_name = 'repeater1-{}'.format(getpass.getuser()) + repeater_name = 'repeater1-{}'.format(self.build_id) self.repeaterdir = os.path.join(self.logdir, repeater_name) if not os.path.exists(self.logdir): os.makedirs(self.logdir) + if not os.path.exists(self.devicedir): + print('Making {}'.format(self.devicedir)) os.makedirs(self.devicedir) + if not os.path.exists(self.repeaterdir): + print('Making {}'.format(self.repeaterdir)) os.makedirs(self.repeaterdir) - # Create log dir - def cleanlogs(self): shutil.rmtree(os.path.join(self.scriptdir, 'logs')) @@ -85,6 +91,35 @@ def _setNonBlocking(fd): flags = flags | os.O_NONBLOCK fcntl.fcntl(fd, fcntl.F_SETFL, flags) + def get_build_id(self): + ci_pipeline_id = os.getenv('CI_PIPELINE_ID') + if ci_pipeline_id is not None: + return ci_pipeline_id + + # Otherwise we are running on the local machine, just find last id + # created and add one + last_id = 0 + if not os.path.exists('logs'): + return str(1) + for d in os.listdir('logs'): + if d.startswith('dockerized_device-'): + suffix = d[len('dockerized_device-'):] + isuffix = int(suffix) + if isuffix > last_id: + last_id = isuffix + if last_id == 0: + new_id = 1 + else: + new_id = last_id + 1 + return str(new_id) + + + def copy_build_dir(self): + new_id = self.build_id + self.build_dir = 'build-{}'.format(new_id) + shutil.copytree('build', 'build-{}'.format(self.build_dir)) + print('Copied build/ into {}'.format(self.build_dir)) + def dc(self, args, interactive=False): params = ['docker-compose', '-f', 'tools/docker/boardfarm-ci/docker-compose.yml'] @@ -94,6 +129,7 @@ def dc(self, args, interactive=False): docker_gid = grp.getgrnam('docker')[2] # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) local_env['CURRENT_ID']= str(os.getuid()) + local_env['RUN_ID'] = self.build_id # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) if not interactive: proc = Popen(params, stdout=PIPE, stderr=PIPE) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index cecb06058d..92e231de60 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -31,7 +31,8 @@ def __init__(self, *args, **kwargs): self.consoles = [self] # Getting unic ID to distinguish devices and network they belong to - self.unique_id = os.getenv("SUDO_USER", os.getenv("USER", "")) + self.unique_id = os.getenv("RUN_ID") + self.user_id = os.getenv("SUDO_USER", os.getenv("USER", "")) self.name = "-".join((config.get("name", "prplmesh_compose"), self.unique_id)) print('config.get("name") {}'.format(config.get("name"))) @@ -70,7 +71,7 @@ def _docker_compose(self, args, parameter=None, start=None): log_path = os.path.join(rootdir, "logs/{}".format(self.name)) if not os.path.exists(log_path): os.mkdir(log_path) - vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.unique_id) + vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.user_id) full_args += ["run", "-v", vol] # full_args += ["--entrypoint", entrypoint + ' ' + start] full_args += args diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 0ec164a0ea..3e9a4beeb6 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -1,5 +1,6 @@ version: '3' services: + # Controller and agent are run from inside the boardfarm container controller: image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner privileged: true # For the creation of the bridge to work @@ -32,6 +33,8 @@ services: - "$ROOT_DIR:$ROOT_DIR" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] + # Boardfarm image is launched from dctest.py, TARGET_DIR refers to the + # path inside the controller, will be referred as $ROOT_DIR inside boardfarm: build: . privileged: true @@ -40,6 +43,7 @@ services: - USER=$USER - ROOT_DIR=$ROOT_DIR - CURRENT_ID=$CURRENT_ID + - RUN_ID=$RUN_ID ports: - "5000:5000" volumes: From e0ddab7ffe8b94f450410c728f35553062fe3e9e Mon Sep 17 00:00:00 2001 From: odkq Date: Thu, 23 Jul 2020 16:19:50 +0200 Subject: [PATCH 24/45] Make the boardfarm instance itself parallel The boardfarm container itself is able to run in parallel by using the id passed as parameter or detected from the environment Signed-off-by: odkq --- dctest.py | 52 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/dctest.py b/dctest.py index dd109fce88..fb6ecef5d1 100755 --- a/dctest.py +++ b/dctest.py @@ -17,8 +17,6 @@ from __future__ import print_function # To check for python2 or < 3.5 execution import argparse import fcntl -import getpass -import grp import os import shutil import sys @@ -35,7 +33,7 @@ def check_docker_versions(): DOCKER_MAJOR = 19 DC_MAJOR = 1 DC_MINOR = 25 - docker_version = os.popen('docker --version').read().split(' ')[2] + docker_version = os.popen('docker --version').read().split(' ')[2] docker_major = int(docker_version.split('.')[0]) if docker_major < DOCKER_MAJOR: fmt = "This script requires docker {}.0 or higher" @@ -58,13 +56,17 @@ def check_docker_versions(): class Services: - def __init__(self): + def __init__(self, bid=None): self.scriptdir = os.path.dirname(os.path.realpath(__file__)) os.chdir(self.scriptdir) self.rootdir = self.scriptdir - self.build_id = self.get_build_id() - print('build_id {}'.format(self.build_id)) + if bid is not None: + self.build_id = bid + print('Using ID {}'.format(self.build_id)) + # return + else: + self.build_id = self.get_build_id() self.logdir = os.path.join(self.scriptdir, 'logs') device_name = 'dockerized_device-{}'.format(self.build_id) @@ -113,7 +115,6 @@ def get_build_id(self): new_id = last_id + 1 return str(new_id) - def copy_build_dir(self): new_id = self.build_id self.build_dir = 'build-{}'.format(new_id) @@ -123,12 +124,13 @@ def copy_build_dir(self): def dc(self, args, interactive=False): params = ['docker-compose', '-f', 'tools/docker/boardfarm-ci/docker-compose.yml'] + # params += ['-p', 'boardfarm-ci-{}'.format(self.build_id)] params += args local_env = os.environ local_env['ROOT_DIR'] = self.rootdir - docker_gid = grp.getgrnam('docker')[2] + # docker_gid = grp.getgrnam('docker')[2] # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) - local_env['CURRENT_ID']= str(os.getuid()) + local_env['CURRENT_ID'] = str(os.getuid()) local_env['RUN_ID'] = self.build_id # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) if not interactive: @@ -178,11 +180,16 @@ def floatable(str): help='Run a shell on the bf container') parser.add_argument('--comp', dest='comp', action='store_true', help='Pass the rest of arguments to docker-compose') + parser.add_argument('--id', dest='bid', type=str, + help='Specify the id to use for build/shell/comp/clean') args, rest = parser.parse_known_args() - services = Services() if args.comp: + if args.bid is None: + print('Specify --id for the --comp parameter') + sys.exit(0) + services = Services(bid=args.bid) if len(rest) == 0: - print('Usage: dctest --comp ') + print('Usage: dctest --id --comp ') sys.exit(1) sys.exit(services.dc(rest, interactive=True)) else: @@ -191,18 +198,37 @@ def floatable(str): sys.exit(1) if args.clean: + if args.bid is None: + print('Specify --id for the --clean parameter') + sys.exit(0) + services = Services(bid=args.bid) services.dc(['down', '--remove-orphans', '--rmi', 'all']) elif args.shell: + if not args.bid: + print('Specify --id for the shell parameter') + sys.exit(0) + services = Services(bid=args.bid) rc = services.dc(['run', '--service-ports', '--entrypoint', '/bin/bash', 'boardfarm'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) elif args.build: + if not args.bid: + print('Specify --id for the build parameter') + sys.exit(0) + services = Services(bid=args.bid) rc = services.dc(['build'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) else: - rc = services.dc(['up', 'boardfarm']) + if args.bid: + services = Services(bid=args.bid) # With new build id + else: + services = Services() # With new build id + # rc = services.dc(['up', 'boardfarm']) + #rc = services.dc(['run', '--service-ports', '--entrypoint', + # '/bin/bash', 'boardfarm'], interactive=True) + rc = services.dc(['run', '--service-ports', '--use-aliases', + 'boardfarm'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) - From 8cae0e2a1c836be16212dfe643c98ee7ce96b696 Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 24 Jul 2020 12:27:48 +0200 Subject: [PATCH 25/45] boardfarm-ci: Added dctest to .gitlab-ci.yml --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 14d36166b7..a20a48893a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -172,6 +172,14 @@ upload-artifacts: - build-for-glinet-b1300 - build-for-turris-omnia +.run-test-dctest: + stage: test + extends: .in-prplmesh-builder + script: + - ./dctest.py + needs: + - job: build-in-dctest + .run-test-in-docker: stage: test extends: .in-prplmesh-builder From 064cb83583e398aad44ec8c41658da8a2d664dba Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 24 Jul 2020 12:27:48 +0200 Subject: [PATCH 26/45] boardfarm-ci: Added dctest to .gitlab-ci.yml Signed-off-by: odkq --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 14d36166b7..a20a48893a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -172,6 +172,14 @@ upload-artifacts: - build-for-glinet-b1300 - build-for-turris-omnia +.run-test-dctest: + stage: test + extends: .in-prplmesh-builder + script: + - ./dctest.py + needs: + - job: build-in-dctest + .run-test-in-docker: stage: test extends: .in-prplmesh-builder From f2be16f12fa65043b636d30029beb4b4373696f7 Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 24 Jul 2020 13:51:07 +0200 Subject: [PATCH 27/45] boardfarm-ci: Correct dependency on .run-test-dctest Signed-off-by: odkq --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a20a48893a..00fc67eeac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -178,7 +178,7 @@ upload-artifacts: script: - ./dctest.py needs: - - job: build-in-dctest + - job: build-in-docker .run-test-in-docker: stage: test From 061a26b6f2aab13004fab9c628028c4daff9659f Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 24 Jul 2020 14:31:34 +0200 Subject: [PATCH 28/45] boardfarm-ci: Temporary replace bcl_unit_tests To test dctest.py --- .gitlab-ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00fc67eeac..9de67b52c7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,8 +195,16 @@ tlvf_test: bwl_dummy_unit_tests: extends: .run-test-in-docker +#bcl_unit_tests: +# extends: .run-test-in-docker + +# dctest_one_test: +# extends: .run-test-dctest + +# Replacing bcl_unit_tests to run dctest. XXX: This is a test; only for dev +# branch bcl_unit_tests: - extends: .run-test-in-docker + extends: .run-test-dctest run-tests: stage: test From de9ecff88a58a644dae4d96b467e895b36eb59a4 Mon Sep 17 00:00:00 2001 From: odkq Date: Fri, 24 Jul 2020 14:31:34 +0200 Subject: [PATCH 29/45] boardfarm-ci: Temporary replace bcl_unit_tests To test dctest.py Signed-off-by: odkq --- .gitlab-ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00fc67eeac..9de67b52c7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,8 +195,16 @@ tlvf_test: bwl_dummy_unit_tests: extends: .run-test-in-docker +#bcl_unit_tests: +# extends: .run-test-in-docker + +# dctest_one_test: +# extends: .run-test-dctest + +# Replacing bcl_unit_tests to run dctest. XXX: This is a test; only for dev +# branch bcl_unit_tests: - extends: .run-test-in-docker + extends: .run-test-dctest run-tests: stage: test From 7acc63c54be9faf2eb5fc6ed5df111523fa426fd Mon Sep 17 00:00:00 2001 From: odkq Date: Mon, 27 Jul 2020 14:56:07 +0200 Subject: [PATCH 30/45] boardfarm-ci: Added correct tag in .gitlab-ci.yml added tag 'boardfarm-compose' to dctest_one_test target Signed-off-by: odkq --- .gitlab-ci.yml | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9de67b52c7..8c03c0a516 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -172,13 +172,6 @@ upload-artifacts: - build-for-glinet-b1300 - build-for-turris-omnia -.run-test-dctest: - stage: test - extends: .in-prplmesh-builder - script: - - ./dctest.py - needs: - - job: build-in-docker .run-test-in-docker: stage: test @@ -195,16 +188,17 @@ tlvf_test: bwl_dummy_unit_tests: extends: .run-test-in-docker -#bcl_unit_tests: -# extends: .run-test-in-docker - -# dctest_one_test: -# extends: .run-test-dctest - -# Replacing bcl_unit_tests to run dctest. XXX: This is a test; only for dev -# branch bcl_unit_tests: - extends: .run-test-dctest + extends: .run-test-in-docker + +dctest_one_test: + stage: test + script: + - ./dctest.py + tags: + - boardfarm-compose + needs: + - job: build-in-docker run-tests: stage: test From 62a558b0599e90a20a5324728bac1e7c82fb0703 Mon Sep 17 00:00:00 2001 From: odkq Date: Mon, 27 Jul 2020 15:52:03 +0200 Subject: [PATCH 31/45] boardfarm-ci: Return != 0 when inner process do so This allows for gitlab-ci to report a failing test Signed-off-by: odkq --- dctest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dctest.py b/dctest.py index fb6ecef5d1..3fcaa35161 100755 --- a/dctest.py +++ b/dctest.py @@ -212,6 +212,7 @@ def floatable(str): '/bin/bash', 'boardfarm'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) + sys.exit(rc) elif args.build: if not args.bid: print('Specify --id for the build parameter') @@ -220,6 +221,7 @@ def floatable(str): rc = services.dc(['build'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) + sys.exit(rc) else: if args.bid: services = Services(bid=args.bid) # With new build id @@ -232,3 +234,4 @@ def floatable(str): 'boardfarm'], interactive=True) if rc != 0: print('Return code !=0 -> {}'.format(rc)) + sys.exit(rc) From 7252294c2269bed18d2bc29a4589bbf6a772fced Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 16:10:33 +0200 Subject: [PATCH 32/45] Use $CI_PIPELINE_ID tag for runner images. Use 'latest' tag when testing locally (not in gitlab-ci) Signed-off-by: pablo --- dctest.py | 2 ++ .../boardfarm_prplmesh/devices/prplmesh_base.py | 11 ++++++++--- .../boardfarm_prplmesh/devices/prplmesh_compose.py | 9 ++++++++- tools/docker/boardfarm-ci/docker-compose.yml | 4 ++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/dctest.py b/dctest.py index 3fcaa35161..d57efa99ed 100755 --- a/dctest.py +++ b/dctest.py @@ -132,6 +132,8 @@ def dc(self, args, interactive=False): # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) local_env['CURRENT_ID'] = str(os.getuid()) local_env['RUN_ID'] = self.build_id + if os.getenv('CI_PIPELINE_ID') is None: + local_env['CI_PIPELINE_ID'] = 'latest' # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) if not interactive: proc = Popen(params, stdout=PIPE, stderr=PIPE) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py index 5ca4ba8a3d..0241460b50 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py @@ -4,6 +4,7 @@ # See LICENSE file for more details. import pexpect +from typing import Dict from boardfarm.devices import linux @@ -16,11 +17,15 @@ class CommandError(Exception): class PrplMeshBase(linux.LinuxDevice): """PrplMesh abstract device.""" - def _run_shell_cmd(self, cmd: str = "", args: list = None, timeout: int = 30): + def _run_shell_cmd(self, cmd: str = "", args: list = None, timeout: int = 30, env: Dict[str, str] = None): """Wrapper that executes command with specified args on host machine and logs output.""" - res, exitstatus = pexpect.run(cmd, args=args, timeout=timeout, encoding="utf-8", - withexitstatus=1) + if env is not None: + res, exitstatus = pexpect.run(cmd, args=args, timeout=timeout, encoding="utf-8", + withexitstatus=1, env=env) + else: + res, exitstatus = pexpect.run(cmd, args=args, timeout=timeout, encoding="utf-8", + withexitstatus=1) entry = " ".join((cmd, " ".join(args))) if exitstatus != 0: raise CommandError("Error executing {}".format(entry)) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index 92e231de60..d4947012b2 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -78,7 +78,14 @@ def _docker_compose(self, args, parameter=None, start=None): print('_docker_compose: {}'.format(' '.join(full_args))) # os.environ['CURRENT_UID'] = '1000:998' - self._run_shell_cmd("/usr/local/bin/docker-compose", full_args) + if os.getenv('CI_PIPELINE_ID') is None: + print('Setting CI_PIPELINE_ID "latest"') + os.environ['CI_PIPELINE_ID'] = 'latest' + self._run_shell_cmd("/usr/local/bin/docker-compose", + full_args, env=os.environ) + else: + self._run_shell_cmd("/usr/local/bin/docker-compose", full_args) + def __del__(self): # self._docker_compose(["stop", self.name]) diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index 3e9a4beeb6..f12762980c 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: # Controller and agent are run from inside the boardfarm container controller: - image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner + image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner:${CI_PIPELINE_ID} privileged: true # For the creation of the bridge to work container_name: controller environment: @@ -18,7 +18,7 @@ services: entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: - image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner + image: registry.gitlab.com/prpl-foundation/prplmesh/prplmesh-runner:${CI_PIPELINE_ID} privileged: true container_name: agent environment: From caca5dd998d30349c7559746b0b984dd45825cc1 Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 17:07:50 +0200 Subject: [PATCH 33/45] boardfarm-ci: Forward the CI_PIPELINE_ID var Forward the variable so it is used to tag the images for the runner and agent inside boardfarm container Signed-off-by: pablo --- tools/docker/boardfarm-ci/docker-compose.yml | 23 +++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index f12762980c..bbb257ab73 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -6,10 +6,11 @@ services: privileged: true # For the creation of the bridge to work container_name: controller environment: - - USER=$USER + - USER - INSTALL_DIR=$ROOT_DIR/build/install - - ROOT_DIR=$ROOT_DIR - - CURRENT_ID=$CURRENT_ID + - ROOT_DIR + - CURRENT_ID + - CI_PIPELINE_ID expose: - "5000" - "8002" @@ -22,10 +23,11 @@ services: privileged: true container_name: agent environment: - - USER=$USER + - USER - INSTALL_DIR=$ROOT_DIR/build/install - - ROOT_DIR=$ROOT_DIR - - CURRENT_ID=$CURRENT_ID + - ROOT_DIR + - CURRENT_ID + - CI_PIPELINE_ID expose: - "5000" - "8002" @@ -40,10 +42,11 @@ services: privileged: true container_name: boardfarm environment: - - USER=$USER - - ROOT_DIR=$ROOT_DIR - - CURRENT_ID=$CURRENT_ID - - RUN_ID=$RUN_ID + - USER + - ROOT_DIR + - CURRENT_ID + - RUN_ID + - CI_PIPELINE_ID ports: - "5000:5000" volumes: From e273782406383f1570fc7328c7186719a761522a Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 17:09:15 +0200 Subject: [PATCH 34/45] boardfarm-ci: Change owner of files to gitlab-runner After running dctest.py, make sure the files created while building boardfarm (as root) can be removed later by gitlab-runner Signed-off-by: pablo --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8c03c0a516..ded560280c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,6 +195,7 @@ dctest_one_test: stage: test script: - ./dctest.py + - chown -R gitlab-runner:gitlab-runner . tags: - boardfarm-compose needs: From 08d1eb65522e219fbb612a698fa1b8ca5f1d2817 Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 17:41:17 +0200 Subject: [PATCH 35/45] boardfarm-ci: Change ownership of the files before exiting the script. Adding it in .gitlab-ci.yml did not work as when the script fails next lines are not executed Signed-off-by: pablo --- dctest.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/dctest.py b/dctest.py index d57efa99ed..ba507dbef9 100755 --- a/dctest.py +++ b/dctest.py @@ -170,6 +170,13 @@ def floatable(str): setattr(parser.values, option.dest, value) +def cleanup(rc): + if rc != 0: + print('Return code !=0 -> {}'.format(rc)) + if getpass.getuser() == 'gitlab-runner': + os.system('chown -R gitlab-runner:gitlab-runner .') + sys.exit(rc) + if __name__ == '__main__': check_docker_versions() parser = argparse.ArgumentParser(description='Dockerized test launcher') @@ -204,7 +211,8 @@ def floatable(str): print('Specify --id for the --clean parameter') sys.exit(0) services = Services(bid=args.bid) - services.dc(['down', '--remove-orphans', '--rmi', 'all']) + rc = services.dc(['down', '--remove-orphans', '--rmi', 'all']) + cleanup(rc) elif args.shell: if not args.bid: print('Specify --id for the shell parameter') @@ -212,18 +220,14 @@ def floatable(str): services = Services(bid=args.bid) rc = services.dc(['run', '--service-ports', '--entrypoint', '/bin/bash', 'boardfarm'], interactive=True) - if rc != 0: - print('Return code !=0 -> {}'.format(rc)) - sys.exit(rc) + cleanup(rc) elif args.build: if not args.bid: print('Specify --id for the build parameter') sys.exit(0) services = Services(bid=args.bid) rc = services.dc(['build'], interactive=True) - if rc != 0: - print('Return code !=0 -> {}'.format(rc)) - sys.exit(rc) + cleanup(rc) else: if args.bid: services = Services(bid=args.bid) # With new build id @@ -234,6 +238,4 @@ def floatable(str): # '/bin/bash', 'boardfarm'], interactive=True) rc = services.dc(['run', '--service-ports', '--use-aliases', 'boardfarm'], interactive=True) - if rc != 0: - print('Return code !=0 -> {}'.format(rc)) - sys.exit(rc) + cleanup(rc) From 6d3872b2ee9f133489b79951324065202048c0de Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 18:20:09 +0200 Subject: [PATCH 36/45] boardfarm-ci: Change destination for log directory When it runs inside gitlab-ci, the directory is /tmp/beerocks/logs, not /tmp//beerocks/logs Signed-off-by: pablo --- .../boardfarm_prplmesh/devices/prplmesh_compose.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index d4947012b2..d1473a1c68 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -71,7 +71,12 @@ def _docker_compose(self, args, parameter=None, start=None): log_path = os.path.join(rootdir, "logs/{}".format(self.name)) if not os.path.exists(log_path): os.mkdir(log_path) - vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.user_id) + + if os.getenv('CI_PIPELINE_ID') is None: + vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.user_id) + else: + vol = '{}:/tmp/beerocks/logs'.format(log_path) + full_args += ["run", "-v", vol] # full_args += ["--entrypoint", entrypoint + ' ' + start] full_args += args From c90f303af4ad9d76b0ebad1f58799c6f8ed0e219 Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 18:25:23 +0200 Subject: [PATCH 37/45] boardfarm-ci: missing import Signed-off-by: pablo --- dctest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dctest.py b/dctest.py index ba507dbef9..8394129b93 100755 --- a/dctest.py +++ b/dctest.py @@ -19,6 +19,7 @@ import fcntl import os import shutil +import getpass import sys from subprocess import Popen, PIPE From aae5f1b6122e38fe1f38a39d59d05af59164d59e Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 18:37:35 +0200 Subject: [PATCH 38/45] boardfarm-ci: Set the ROOT_DIR and INSTALL_DIR To /builds/prpl-foundation/prplMesh which is the one expected by the runner and binaries built Signed-off-by: pablo --- tools/docker/boardfarm-ci/docker-compose.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index bbb257ab73..a8f7517168 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -7,15 +7,15 @@ services: container_name: controller environment: - USER - - INSTALL_DIR=$ROOT_DIR/build/install - - ROOT_DIR + - INSTALL_DIR=/builds/prpl-foundation/prplMesh/build/install + - ROOT_DIR=/builds/prpl-foundation/prplMesh - CURRENT_ID - CI_PIPELINE_ID expose: - "5000" - "8002" volumes: - - "$ROOT_DIR:$ROOT_DIR" + - "$ROOT_DIR:/builds/prpl-foundation/prplMesh" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: @@ -24,15 +24,15 @@ services: container_name: agent environment: - USER - - INSTALL_DIR=$ROOT_DIR/build/install - - ROOT_DIR + - INSTALL_DIR=/builds/prpl-foundation/prplMesh/build/install + - ROOT_DIR=/builds/prpl-foundation/prplMesh - CURRENT_ID - CI_PIPELINE_ID expose: - "5000" - "8002" volumes: - - "$ROOT_DIR:$ROOT_DIR" + - "$ROOT_DIR:/builds/prpl-foundation/prplMesh" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] # Boardfarm image is launched from dctest.py, TARGET_DIR refers to the From 9b04699c2025dbcb57b26f0aaefe494f75ef8f17 Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 18:50:04 +0200 Subject: [PATCH 39/45] boardfarm-ci: Do not try to chown from .gitlab-ci.yml Signed-off-by: pablo --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ded560280c..8c03c0a516 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,7 +195,6 @@ dctest_one_test: stage: test script: - ./dctest.py - - chown -R gitlab-runner:gitlab-runner . tags: - boardfarm-compose needs: From fffe5d43b41a2b4626d512a5ea362fb6ac5dd9da Mon Sep 17 00:00:00 2001 From: pablo Date: Wed, 29 Jul 2020 22:06:57 +0200 Subject: [PATCH 40/45] boardfarm-ci: Run boardfarm as a regular user Setting the current uid and the group id of docker (to be able to access the docker socket), this makes all the files created by the boardfarm installation deletable by the gitlab-ci user Signed-off-by: pablo --- dctest.py | 20 +++++++++++++++---- .../devices/prplmesh_compose.py | 5 +++-- tools/docker/boardfarm-ci/docker-compose.yml | 16 ++++++++------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/dctest.py b/dctest.py index 8394129b93..fcc1fe2390 100755 --- a/dctest.py +++ b/dctest.py @@ -18,6 +18,7 @@ import argparse import fcntl import os +import grp import shutil import getpass import sys @@ -129,12 +130,19 @@ def dc(self, args, interactive=False): params += args local_env = os.environ local_env['ROOT_DIR'] = self.rootdir - # docker_gid = grp.getgrnam('docker')[2] - # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) + docker_gid = grp.getgrnam('docker')[2] + local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) local_env['CURRENT_ID'] = str(os.getuid()) local_env['RUN_ID'] = self.build_id + if os.getenv('CI_PIPELINE_ID') is None: + # Running locally local_env['CI_PIPELINE_ID'] = 'latest' + local_env['FINAL_ROOT_DIR'] = self.rootdir + else: + # Running inside gitlab-ci + local_env['FINAL_ROOT_DIR'] = '/builds/prpl-foundation/prplMesh' + # local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(os.getgid()) if not interactive: proc = Popen(params, stdout=PIPE, stderr=PIPE) @@ -193,6 +201,10 @@ def cleanup(rc): parser.add_argument('--id', dest='bid', type=str, help='Specify the id to use for build/shell/comp/clean') args, rest = parser.parse_known_args() + + if os.getenv('CI_PIPELINE_ID') is not None: + args.bid == os.getenv('CI_PIPELINE_ID') + if args.comp: if args.bid is None: print('Specify --id for the --comp parameter') @@ -219,7 +231,7 @@ def cleanup(rc): print('Specify --id for the shell parameter') sys.exit(0) services = Services(bid=args.bid) - rc = services.dc(['run', '--service-ports', '--entrypoint', + rc = services.dc(['run', '--rm', '--service-ports', '--entrypoint', '/bin/bash', 'boardfarm'], interactive=True) cleanup(rc) elif args.build: @@ -237,6 +249,6 @@ def cleanup(rc): # rc = services.dc(['up', 'boardfarm']) #rc = services.dc(['run', '--service-ports', '--entrypoint', # '/bin/bash', 'boardfarm'], interactive=True) - rc = services.dc(['run', '--service-ports', '--use-aliases', + rc = services.dc(['run', '--rm', '--service-ports', '--use-aliases', 'boardfarm'], interactive=True) cleanup(rc) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index d1473a1c68..9aae0e93c2 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -72,12 +72,13 @@ def _docker_compose(self, args, parameter=None, start=None): if not os.path.exists(log_path): os.mkdir(log_path) - if os.getenv('CI_PIPELINE_ID') is None: + pipeline_id = os.getenv('CI_PIPELINE_ID') + if pipeline_id is None or pipeline_id == 'latest': vol = '{}:/tmp/{}/beerocks/logs'.format(log_path, self.user_id) else: vol = '{}:/tmp/beerocks/logs'.format(log_path) - full_args += ["run", "-v", vol] + full_args += ["run", "--rm", "-v", vol] # full_args += ["--entrypoint", entrypoint + ' ' + start] full_args += args diff --git a/tools/docker/boardfarm-ci/docker-compose.yml b/tools/docker/boardfarm-ci/docker-compose.yml index a8f7517168..1f50b9cc75 100644 --- a/tools/docker/boardfarm-ci/docker-compose.yml +++ b/tools/docker/boardfarm-ci/docker-compose.yml @@ -7,15 +7,15 @@ services: container_name: controller environment: - USER - - INSTALL_DIR=/builds/prpl-foundation/prplMesh/build/install - - ROOT_DIR=/builds/prpl-foundation/prplMesh + - INSTALL_DIR=${FINAL_ROOT_DIR}/build/install + - ROOT_DIR=${FINAL_ROOT_DIR} - CURRENT_ID - CI_PIPELINE_ID expose: - "5000" - "8002" volumes: - - "$ROOT_DIR:/builds/prpl-foundation/prplMesh" + - "$ROOT_DIR:${FINAL_ROOT_DIR}" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-controller-agent"] agent: @@ -24,15 +24,16 @@ services: container_name: agent environment: - USER - - INSTALL_DIR=/builds/prpl-foundation/prplMesh/build/install - - ROOT_DIR=/builds/prpl-foundation/prplMesh + - INSTALL_DIR=${FINAL_ROOT_DIR}/build/install + - ROOT_DIR=${FINAL_ROOT_DIR} + # /builds/prpl-foundation/prplMesh - CURRENT_ID - CI_PIPELINE_ID expose: - "5000" - "8002" volumes: - - "$ROOT_DIR:/builds/prpl-foundation/prplMesh" + - "$ROOT_DIR:${FINAL_ROOT_DIR}" entrypoint: ["/root/entrypoint.sh", "/usr/bin/start-agent"] # Boardfarm image is launched from dctest.py, TARGET_DIR refers to the @@ -47,12 +48,13 @@ services: - CURRENT_ID - RUN_ID - CI_PIPELINE_ID + - FINAL_ROOT_DIR ports: - "5000:5000" volumes: - "$ROOT_DIR:$ROOT_DIR" - "/var/run/docker:/var/run/docker" - "/var/run/docker.sock:/var/run/docker.sock" - # user: ${CURRENT_UID} + user: ${CURRENT_UID} working_dir: $ROOT_DIR/tests entrypoint: ["bash", "run_bf_compose.sh"] From 858e5e8ffa295ace9b7b66977988f929e1bf5ebe Mon Sep 17 00:00:00 2001 From: pablo Date: Mon, 3 Aug 2020 12:44:05 +0200 Subject: [PATCH 41/45] boardfarm-ci: Fixed 'missing device' bug This appeared after merging from master Signed-off-by: pablo --- tests/environment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/environment.py b/tests/environment.py index 0de5f226df..07f84b68a3 100644 --- a/tests/environment.py +++ b/tests/environment.py @@ -257,8 +257,8 @@ def __init__(self, name: str, is_controller: bool = False, self.name = name self.bridge_name = 'br-lan' - if device: - self.device = device + # if device: + # self.device = device # First, get the UCC port from the config file if is_controller: From 6456dc3b40552ee41cb5886e91f3938b7def976e Mon Sep 17 00:00:00 2001 From: pablo Date: Mon, 3 Aug 2020 17:26:14 +0200 Subject: [PATCH 42/45] boardfarm-ci: Removed unused shell script Alternative entrypoint for the runner image when running as a regular user Signed-off-by: pablo --- .../docker/boardfarm-ci/runner-entrypoint.sh | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100755 tools/docker/boardfarm-ci/runner-entrypoint.sh diff --git a/tools/docker/boardfarm-ci/runner-entrypoint.sh b/tools/docker/boardfarm-ci/runner-entrypoint.sh deleted file mode 100755 index eccfc52579..0000000000 --- a/tools/docker/boardfarm-ci/runner-entrypoint.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -############################################################### -# SPDX-License-Identifier: BSD-2-Clause-Patent -# SPDX-FileCopyrightText: 2019-2020 the prplMesh contributors (see AUTHORS.md) -# This code is subject to the terms of the BSD+Patent license. -# See LICENSE file for more details. -############################################################### - -run() { - echo "$*" - "$@" || exit $? -} - -apt-get update -apt-get install -y sudo - -# Use the ip address that was allocated by the daemon to this -# container (from eth0) -bridge_ip="$(ip addr show dev eth0 | awk '/^ *inet / {print $2}')" - -run ip link add br-lan type bridge -run ip link add wlan0 type dummy -run ip link add wlan2 type dummy - -# When an interface is added to the bridge, the bridge inherits its MAC address. -# It shouldn't be the same as any other interface because that messes up the topology in the -# controller, however. Therefore, save the MAC address an re-apply it later. -bridge_mac="$(ip link show dev br-lan | awk '/^ *link\/ether / {print $2}')" - -run ip link set dev eth0 master br-lan -run ip link set dev wlan0 master br-lan -run ip link set dev wlan2 master br-lan -run ip address flush dev eth0 -run ip link set dev wlan0 up -run ip link set dev wlan2 up -run ip link set dev br-lan addr "$bridge_mac" -run ip address add dev br-lan "$bridge_ip" -run ip link set dev br-lan up - -echo "runner-entrypoint.sh: $@ CURRENT_ID $CURENT_ID USER $USER" - -# adduser --system --no-create-home --uid $CURRENT_ID --ingroup root $USER - -cd "${INSTALL_DIR}" || exit 1 -# exec sudo -E -u $USER /bin/bash "$@" -exec /bin/bash "$@" From 6cb135fa153943467bddafda27c2bbbe91d06cbe Mon Sep 17 00:00:00 2001 From: pablo Date: Mon, 3 Aug 2020 17:27:15 +0200 Subject: [PATCH 43/45] boardfarm-ci: Fix device parameter passing Signed-off-by: pablo --- tests/environment.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/environment.py b/tests/environment.py index 07f84b68a3..888ff0fe71 100644 --- a/tests/environment.py +++ b/tests/environment.py @@ -252,13 +252,13 @@ class ALEntityDocker(ALEntity): The entity is defined from the name of the container, the rest is derived from that. ''' - def __init__(self, name: str, is_controller: bool = False, + def __init__(self, name: str, device: None = None, is_controller: bool = False, compose: bool = False): self.name = name self.bridge_name = 'br-lan' - # if device: - # self.device = device + if device: + self.device = device # First, get the UCC port from the config file if is_controller: From 98974a966d85d30da94e0c5678da72eff59ea83f Mon Sep 17 00:00:00 2001 From: pablo Date: Mon, 3 Aug 2020 17:42:10 +0200 Subject: [PATCH 44/45] boardfarm-ci: Shellcheck fixes Signed-off-by: pablo --- tests/run_bf_compose.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/run_bf_compose.sh b/tests/run_bf_compose.sh index 22987b5be5..365e3a7671 100755 --- a/tests/run_bf_compose.sh +++ b/tests/run_bf_compose.sh @@ -8,11 +8,11 @@ scriptdir=$(dirname "$(readlink -f "${0}")") bf_plugins_dir=${scriptdir}/boardfarm_plugins if [ -n "${PYTHONPATH}" ]; then - PYTHONPATH="${bf_dir}:${bf_plugins_dir}:${scriptdir}:${PYTHONPATH}" + PYTHONPATH="${bf_plugins_dir}:${scriptdir}:${PYTHONPATH}" else - PYTHONPATH="${bf_dir}:${bf_plugins_dir}:${scriptdir}" + PYTHONPATH="${bf_plugins_dir}:${scriptdir}" fi -echo $PYTHONPATH +echo "$PYTHONPATH" export PYTHONPATH exec bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config_compose.json -n prplmesh_docker -x test_flows From 9122a23c2af4378714c4f1c47781ca48f95c0658 Mon Sep 17 00:00:00 2001 From: pablo Date: Mon, 3 Aug 2020 17:49:47 +0200 Subject: [PATCH 45/45] boardfarm-ci: Fixes for PEP-8 compliance Signed-off-by: pablo --- dctest.py | 5 +++-- .../boardfarm_prplmesh/devices/prplmesh_base.py | 3 ++- .../boardfarm_prplmesh/devices/prplmesh_compose.py | 7 +------ 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/dctest.py b/dctest.py index fcc1fe2390..3855209703 100755 --- a/dctest.py +++ b/dctest.py @@ -131,7 +131,7 @@ def dc(self, args, interactive=False): local_env = os.environ local_env['ROOT_DIR'] = self.rootdir docker_gid = grp.getgrnam('docker')[2] - local_env['CURRENT_UID']= str(os.getuid()) + ':' + str(docker_gid) + local_env['CURRENT_UID'] = str(os.getuid()) + ':' + str(docker_gid) local_env['CURRENT_ID'] = str(os.getuid()) local_env['RUN_ID'] = self.build_id @@ -186,6 +186,7 @@ def cleanup(rc): os.system('chown -R gitlab-runner:gitlab-runner .') sys.exit(rc) + if __name__ == '__main__': check_docker_versions() parser = argparse.ArgumentParser(description='Dockerized test launcher') @@ -247,7 +248,7 @@ def cleanup(rc): else: services = Services() # With new build id # rc = services.dc(['up', 'boardfarm']) - #rc = services.dc(['run', '--service-ports', '--entrypoint', + # rc = services.dc(['run', '--service-ports', '--entrypoint', # '/bin/bash', 'boardfarm'], interactive=True) rc = services.dc(['run', '--rm', '--service-ports', '--use-aliases', 'boardfarm'], interactive=True) diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py index 931beff6e5..c30bf08e28 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py @@ -17,7 +17,8 @@ class CommandError(Exception): class PrplMeshBase(linux.LinuxDevice): """PrplMesh abstract device.""" - def _run_shell_cmd(self, cmd: str = "", args: list = None, timeout: int = 30, env: Dict[str, str] = None): + def _run_shell_cmd(self, cmd: str = "", args: list = None, timeout: int = 30, + env: Dict[str, str] = None): """Wrapper that executes command with specified args on host machine and logs output.""" if env is not None: res, exitstatus = pexpect.run(cmd, args=args, timeout=timeout, encoding="utf-8", diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py index 9aae0e93c2..79eea79ea7 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_compose.py @@ -53,9 +53,7 @@ def __init__(self, *args, **kwargs): self._docker_compose(["-d", "--name", self.name, "agent"], "run", "start-agent") time.sleep(self.delay) - self.agent_entity = \ - ALEntityDocker(self.name, is_controller=False, - compose=True) + self.agent_entity = ALEntityDocker(self.name, is_controller=False, compose=True) self.wired_sniffer = Sniffer(_get_bridge_interface(self.docker_network), boardfarm.config.output_dir) @@ -65,8 +63,6 @@ def _docker_compose(self, args, parameter=None, start=None): print('_docker_compose: args {}'.format(args)) yml_path = "tools/docker/boardfarm-ci/docker-compose.yml" full_args = ["-f", os.path.join(rootdir, yml_path)] - entrypoint_path = "tools/docker/boardfarm-ci/runner-entrypoint.sh" - entrypoint = os.path.join(rootdir, entrypoint_path) if parameter == "run": log_path = os.path.join(rootdir, "logs/{}".format(self.name)) if not os.path.exists(log_path): @@ -92,7 +88,6 @@ def _docker_compose(self, args, parameter=None, start=None): else: self._run_shell_cmd("/usr/local/bin/docker-compose", full_args) - def __del__(self): # self._docker_compose(["stop", self.name]) self._run_shell_cmd("docker", ["stop", self.name])