From 54f6fb58351ed0539a03b45516ed142e3e26d022 Mon Sep 17 00:00:00 2001 From: Przemyslaw Rzad Date: Fri, 12 Jul 2019 14:51:06 +0200 Subject: [PATCH] UI deployment - Molecule tests (#147) * Renamed scenario default to oracle * Introduced ui molecule tests * Readme * Common prepare * Shared test_all * Moved test_docker_config to common * Added ui tests * Lint. --- .circleci/config.yml | 14 ++++- deployment/molecule/TESTING.md | 3 +- .../{default => oracle}/Dockerfile.j2 | 0 .../molecule/{default => oracle}/molecule.yml | 6 +- .../molecule/{default => oracle}/prepare.yml | 0 .../{default => oracle}/tests/test_oracle.py | 4 -- deployment/molecule/prepare.yml | 13 +++++ .../molecule/{default => }/tests/test_all.py | 4 ++ deployment/molecule/ui/Dockerfile.j2 | 14 +++++ deployment/molecule/ui/molecule.yml | 56 +++++++++++++++++++ deployment/molecule/ui/tests/test_ui.py | 48 ++++++++++++++++ 11 files changed, 152 insertions(+), 10 deletions(-) rename deployment/molecule/{default => oracle}/Dockerfile.j2 (100%) rename deployment/molecule/{default => oracle}/molecule.yml (91%) rename deployment/molecule/{default => oracle}/prepare.yml (100%) rename deployment/molecule/{default => oracle}/tests/test_oracle.py (92%) create mode 100644 deployment/molecule/prepare.yml rename deployment/molecule/{default => }/tests/test_all.py (90%) create mode 100644 deployment/molecule/ui/Dockerfile.j2 create mode 100644 deployment/molecule/ui/molecule.yml create mode 100644 deployment/molecule/ui/tests/test_ui.py diff --git a/.circleci/config.yml b/.circleci/config.yml index bd953ed9..e55d1dea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -114,13 +114,20 @@ jobs: key: initialize-{{ .Environment.CIRCLE_SHA1 }} - run: yarn workspace ui run coverage - run: yarn workspace ui run coveralls - deployment: + deployment-oracle: machine: image: circleci/classic:latest docker_layer_caching: true steps: - checkout - - run: deployment/molecule/molecule.sh default + - run: deployment/molecule/molecule.sh oracle + deployment-ui: + machine: + image: circleci/classic:latest + docker_layer_caching: true + steps: + - checkout + - run: deployment/molecule/molecule.sh ui workflows: version: 2 tokenbridge: @@ -148,4 +155,5 @@ workflows: - oracle-e2e - ui-e2e - monitor-e2e - - deployment + - deployment-oracle + - deployment-ui diff --git a/deployment/molecule/TESTING.md b/deployment/molecule/TESTING.md index 16d6fa13..fe344b0d 100644 --- a/deployment/molecule/TESTING.md +++ b/deployment/molecule/TESTING.md @@ -28,4 +28,5 @@ Available scenarios: Scenario | Description --- | --- -default | Deploys oracle on Ubuntu host and checks some assertions +oracle | Deploys and checks standalone Oracle on Ubuntu host +ui | Deploys and checks standalone UI on Ubuntu host diff --git a/deployment/molecule/default/Dockerfile.j2 b/deployment/molecule/oracle/Dockerfile.j2 similarity index 100% rename from deployment/molecule/default/Dockerfile.j2 rename to deployment/molecule/oracle/Dockerfile.j2 diff --git a/deployment/molecule/default/molecule.yml b/deployment/molecule/oracle/molecule.yml similarity index 91% rename from deployment/molecule/default/molecule.yml rename to deployment/molecule/oracle/molecule.yml index 0f349cec..08b69240 100644 --- a/deployment/molecule/default/molecule.yml +++ b/deployment/molecule/oracle/molecule.yml @@ -28,7 +28,7 @@ provisioner: options: r: ["bug"] playbooks: - prepare: prepare.yml + prepare: ../prepare.yml converge: ../../site.yml inventory: host_vars: @@ -40,8 +40,10 @@ verifier: name: testinfra lint: name: flake8 + additional_files_or_dirs: + - ../../tests/* scenario: - name: default + name: oracle test_sequence: - lint - cleanup diff --git a/deployment/molecule/default/prepare.yml b/deployment/molecule/oracle/prepare.yml similarity index 100% rename from deployment/molecule/default/prepare.yml rename to deployment/molecule/oracle/prepare.yml diff --git a/deployment/molecule/default/tests/test_oracle.py b/deployment/molecule/oracle/tests/test_oracle.py similarity index 92% rename from deployment/molecule/default/tests/test_oracle.py rename to deployment/molecule/oracle/tests/test_oracle.py index 7046a85b..5ac88b31 100644 --- a/deployment/molecule/default/tests/test_oracle.py +++ b/deployment/molecule/oracle/tests/test_oracle.py @@ -36,7 +36,3 @@ def test_services(host, service): def test_logging(host, filename): assert host.file(filename).exists assert host.file(filename).mode == 0o0644 - - -def test_docker_config(host): - assert host.file('/etc/docker/daemon.json').exists diff --git a/deployment/molecule/prepare.yml b/deployment/molecule/prepare.yml new file mode 100644 index 00000000..8a17f873 --- /dev/null +++ b/deployment/molecule/prepare.yml @@ -0,0 +1,13 @@ +--- +- name: prepare + hosts: all + tasks: + - name: install apt packages + apt: + name: "{{ packages }}" + vars: + packages: + - apt-transport-https + - rsyslog + - shell: service rsyslog start + - shell: groupadd docker && chgrp docker /var/run/docker.sock diff --git a/deployment/molecule/default/tests/test_all.py b/deployment/molecule/tests/test_all.py similarity index 90% rename from deployment/molecule/default/tests/test_all.py rename to deployment/molecule/tests/test_all.py index f26c6f33..050107ca 100644 --- a/deployment/molecule/default/tests/test_all.py +++ b/deployment/molecule/tests/test_all.py @@ -28,3 +28,7 @@ def test_user(host): def test_logging(host, filename): assert host.file(filename).exists assert host.file(filename).mode == 0o0644 + + +def test_docker_config(host): + assert host.file('/etc/docker/daemon.json').exists diff --git a/deployment/molecule/ui/Dockerfile.j2 b/deployment/molecule/ui/Dockerfile.j2 new file mode 100644 index 00000000..e6aa95d3 --- /dev/null +++ b/deployment/molecule/ui/Dockerfile.j2 @@ -0,0 +1,14 @@ +# Molecule managed + +{% if item.registry is defined %} +FROM {{ item.registry.url }}/{{ item.image }} +{% else %} +FROM {{ item.image }} +{% endif %} + +RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get install -y python sudo bash ca-certificates && apt-get clean; \ + elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install python sudo python-devel python*-dnf bash && dnf clean all; \ + elif [ $(command -v yum) ]; then yum makecache fast && yum install -y python sudo yum-plugin-ovl bash && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \ + elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python sudo bash python-xml && zypper clean -a; \ + elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates; \ + elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python sudo bash ca-certificates && xbps-remove -O; fi diff --git a/deployment/molecule/ui/molecule.yml b/deployment/molecule/ui/molecule.yml new file mode 100644 index 00000000..552ab4d3 --- /dev/null +++ b/deployment/molecule/ui/molecule.yml @@ -0,0 +1,56 @@ +--- +dependency: + name: galaxy +driver: + name: docker +lint: + name: yamllint + enabled: True + options: + config-data: + ignore: ../../hosts.yml +platforms: + - name: ui-host + groups: + - example + children: + - ui + image: ubuntu:16.04 + privileged: true + network_mode: host + volumes: + - /var/run/docker.sock:/var/run/docker.sock +provisioner: + name: ansible + lint: + name: ansible-lint + enabled: True + options: + r: ["bug"] + playbooks: + prepare: ../prepare.yml + converge: ../../site.yml + inventory: + host_vars: + ui-host: + syslog_server_port: "udp://127.0.0.1:514" + bridge_repo_branch: $CODEBASE_BRANCH +verifier: + name: testinfra + lint: + name: flake8 + additional_files_or_dirs: + - ../../tests/* +scenario: + name: ui + test_sequence: + - lint + - cleanup + - destroy + - dependency + - syntax + - create + - prepare + - converge + - verify + - destroy diff --git a/deployment/molecule/ui/tests/test_ui.py b/deployment/molecule/ui/tests/test_ui.py new file mode 100644 index 00000000..f059e8da --- /dev/null +++ b/deployment/molecule/ui/tests/test_ui.py @@ -0,0 +1,48 @@ +import os +import pytest +import testinfra.utils.ansible_runner + +testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('ui') + + +@pytest.mark.parametrize("name", [ + ("ui_ui_1") +]) +def test_docker_containers(host, name): + container = host.docker(name) + assert container.is_running + + +@pytest.mark.parametrize("service", [ + ("tokenbridge-ui"), + ("rsyslog") +]) +def test_services(host, service): + assert host.service(service).is_enabled + assert host.service(service).is_running + + +@pytest.mark.parametrize("filename", [ + ("/etc/rsyslog.d/32-ui-docker.conf"), + ("/etc/rsyslog.d/37-ui-remote-logging.conf") +]) +def test_logging(host, filename): + assert host.file(filename).exists + assert host.file(filename).mode == 0o0644 + + +def test_index_page_title(host): + assert host.run_test( + 'curl -s http://localhost:3001 | ' + 'grep "" | ' + 'grep -q "TokenBridge UI app"' + ) + + +def test_index_page_error(host): + assert host.run_expect( + [1], + 'curl -s http://localhost:3001 | ' + 'grep -i -q "error"' + )