diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c64ba84133..a706e7ed2a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,6 +35,9 @@ image-build-builder/ubuntu/bionic: image-build-tests-runner: extends: .image-build +image-build-boardfarm-ci: + extends: .image-build + .in-prplmesh-builder: image: name: $CI_REGISTRY_IMAGE/prplmesh-builder-ubuntu-bionic:$CI_PIPELINE_ID @@ -213,6 +216,21 @@ run-tests: - job: image-build-tests-runner - job: image-build-runner +boardfarm-tests: + stage: test + image: $CI_REGISTRY_IMAGE/prplmesh-boardfarm-ci:$CI_PIPELINE_ID + script: + - export USER='' + - tests/run_bf.sh + artifacts: + paths: + - logs + - results + needs: + - job: build-in-docker + tags: + - boardfarm + .build-for-openwrt: stage: build script: diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_base.py index 227e8cd27b..700c5c2863 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 {}:\n{}".format(entry, res)) + self.log_calls += entry self.log += "$ " + entry + "\r\n" + res diff --git a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_docker.py b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_docker.py index ae46897104..7e890c800d 100644 --- a/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_docker.py +++ b/tests/boardfarm_plugins/boardfarm_prplmesh/devices/prplmesh_docker.py @@ -77,8 +77,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("printf", + ["device_get_info", "|", "nc", "-w", "1", "controller-rme", "8002"]) def isalive(self): """Method required by boardfarm. diff --git a/tests/run_bf.sh b/tests/run_bf.sh index 8c71953b2f..0dbbea4d12 100755 --- a/tests/run_bf.sh +++ b/tests/run_bf.sh @@ -15,4 +15,4 @@ else fi export PYTHONPATH -exec python3 "${bf_dir}"/bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config.json -n prplmesh_docker -x test_flows +exec bft -c "${bf_plugins_dir}"/boardfarm_prplmesh/prplmesh_config.json -n prplmesh_docker -x test_flows diff --git a/tools/docker/boardfarm-ci/Dockerfile b/tools/docker/boardfarm-ci/Dockerfile new file mode 100644 index 0000000000..67fd3ed294 --- /dev/null +++ b/tools/docker/boardfarm-ci/Dockerfile @@ -0,0 +1,42 @@ +FROM python:3.8-slim-buster + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates curl \ + curl \ + gcc \ + git \ + gnupg \ + gnupg-agent \ + libsnmp-dev \ + netcat \ + software-properties-common \ + wireshark-common \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt /app/requirements.txt + +WORKDIR app +RUN pip3 install -r requirements.txt + +# TODO: what needs this? +#RUN pip3 install jsonschema distro + + +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 -y --no-install-recommends \ + docker-ce \ + docker-ce-cli \ + containerd.io \ + && rm -rf /var/lib/apt/lists/* + +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 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 new file mode 100644 index 0000000000..aaaea868c8 --- /dev/null +++ b/tools/docker/boardfarm-ci/requirements.txt @@ -0,0 +1,48 @@ +aenum +argparse +beautifulsoup4 +boto3 +cdrouter +debtcollector +distro +dlipower +dnspython +docutils<0.16 +easysnmp +elasticsearch>=1.0.0 +Faker +future +ipaddress +jira +jsonschema +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