From 52eff080b495d6f0339f8beb419038bffa91814f Mon Sep 17 00:00:00 2001 From: Bertrand Lanson Date: Sun, 9 Apr 2023 23:28:29 +0200 Subject: [PATCH] added a few tests, corrected various errors --- defaults/main.yml | 5 ++- handlers/main.yml | 12 ++++++ molecule/default/tests/test_default.py | 29 +++++++++++-- molecule/with_custom_config/converge.yml | 7 ++++ .../with_custom_config/group_vars/all.yml | 9 ++++ molecule/with_custom_config/molecule.yml | 41 +++++++++++++++++++ molecule/with_custom_config/requirements.yml | 6 +++ molecule/with_custom_config/tests/conftest.py | 22 ++++++++++ .../with_custom_config/tests/test_default.py | 41 +++++++++++++++++++ tasks/configure.yml | 20 ++++----- tasks/install_compose.yml | 2 +- tasks/prerequisites.yml | 1 - templates/daemon.json.j2 | 1 + 13 files changed, 178 insertions(+), 18 deletions(-) create mode 100644 molecule/with_custom_config/converge.yml create mode 100644 molecule/with_custom_config/group_vars/all.yml create mode 100644 molecule/with_custom_config/molecule.yml create mode 100644 molecule/with_custom_config/requirements.yml create mode 100644 molecule/with_custom_config/tests/conftest.py create mode 100644 molecule/with_custom_config/tests/test_default.py create mode 100644 templates/daemon.json.j2 diff --git a/defaults/main.yml b/defaults/main.yml index d18af49..076dc75 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -2,8 +2,9 @@ # defaults file for install_docker install_docker_edition: ce # can be ce or ee (community or enterprise) install_docker_start_service: true -install_docker_compose: true +install_docker_compose: false install_docker_compose_version: latest -install_docker_python_packages: true +install_docker_python_packages: false install_docker_python_packages_version: latest install_docker_users: [] +install_docker_daemon_options: {} diff --git a/handlers/main.yml b/handlers/main.yml index 58c758a..3047c6f 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,2 +1,14 @@ --- # handlers file for install_docker +- name: "Enable docker service" + ansible.builtin.service: + name: docker + enabled: true + listen: "systemctl-enable-docker" + +- name: "Start docker service" + ansible.builtin.service: + name: docker + state: restarted + listen: "systemctl-restart-docker" + when: install_docker_start_service diff --git a/molecule/default/tests/test_default.py b/molecule/default/tests/test_default.py index 0cff669..3edca55 100644 --- a/molecule/default/tests/test_default.py +++ b/molecule/default/tests/test_default.py @@ -3,8 +3,29 @@ def test_hosts_file(host): """Validate /etc/hosts file.""" - f = host.file("/etc/hosts") + etc_hosts = host.file("/etc/hosts") + assert etc_hosts.exists + assert etc_hosts.user == "root" + assert etc_hosts.group == "root" - assert f.exists - assert f.user == "root" - assert f.group == "root" +def test_docker_service(host): + """Validate docker service.""" + docker_service = host.service("docker.service") + assert docker_service.is_enabled + assert docker_service.is_running + assert docker_service.systemd_properties["Restart"] == "always" + assert docker_service.systemd_properties["FragmentPath"] == "/lib/systemd/system/docker.service" + +def test_docker_daemon(host): + """Validate /etc/docker/daemon.json file.""" + docker_daemon_file = host.file("/etc/docker/daemon.json") + assert docker_daemon_file.exists + assert docker_daemon_file.user == "root" + assert docker_daemon_file.group =="root" + assert docker_daemon_file.mode == 0o644 + assert docker_daemon_file.contains("{}") + +def test_docker_interaction(host): + """Validate interaction with docker.""" + docker_ps = host.check_output("docker ps") + assert docker_ps == "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES" diff --git a/molecule/with_custom_config/converge.yml b/molecule/with_custom_config/converge.yml new file mode 100644 index 0000000..3825f52 --- /dev/null +++ b/molecule/with_custom_config/converge.yml @@ -0,0 +1,7 @@ +--- +- name: Converge + hosts: all + tasks: + - name: "Include ednxzu.install_docker" + ansible.builtin.include_role: + name: "ednxzu.install_docker" diff --git a/molecule/with_custom_config/group_vars/all.yml b/molecule/with_custom_config/group_vars/all.yml new file mode 100644 index 0000000..62cfeaa --- /dev/null +++ b/molecule/with_custom_config/group_vars/all.yml @@ -0,0 +1,9 @@ +--- +install_docker_edition: ce # can be ce or ee (community or enterprise) +install_docker_start_service: true +install_docker_compose: true +install_docker_compose_version: latest +install_docker_python_packages: true +install_docker_python_packages_version: latest +install_docker_users: [] +install_docker_daemon_options: {} diff --git a/molecule/with_custom_config/molecule.yml b/molecule/with_custom_config/molecule.yml new file mode 100644 index 0000000..0f4babb --- /dev/null +++ b/molecule/with_custom_config/molecule.yml @@ -0,0 +1,41 @@ +--- +dependency: + name: galaxy + options: + requirements-file: ./requirements.yml +driver: + name: docker +platforms: + - name: instance + image: geerlingguy/docker-${MOLECULE_TEST_OS}-ansible + command: "" + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup + cgroupns_mode: host + privileged: true + pre_build_image: true +provisioner: + name: ansible + config_options: + defaults: + remote_tmp: /tmp/.ansible +verifier: + name: testinfra +lint: | + yamllint -c .yamllint . + ansible-lint +scenario: + name: with_custom_config + test_sequence: + - dependency + - lint + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - idempotence + - verify + - cleanup + - destroy diff --git a/molecule/with_custom_config/requirements.yml b/molecule/with_custom_config/requirements.yml new file mode 100644 index 0000000..03bb97b --- /dev/null +++ b/molecule/with_custom_config/requirements.yml @@ -0,0 +1,6 @@ +--- +# requirements file for molecule +roles: + - name: ednxzu.manage_repositories + - name: ednxzu.manage_apt_packages + - name: ednxzu.manage_pip_packages diff --git a/molecule/with_custom_config/tests/conftest.py b/molecule/with_custom_config/tests/conftest.py new file mode 100644 index 0000000..f7ddb3f --- /dev/null +++ b/molecule/with_custom_config/tests/conftest.py @@ -0,0 +1,22 @@ +"""PyTest Fixtures.""" +from __future__ import absolute_import + +import os + +import pytest + + +def pytest_runtest_setup(item): + """Run tests only when under molecule with testinfra installed.""" + try: + import testinfra + except ImportError: + pytest.skip("Test requires testinfra", allow_module_level=True) + if "MOLECULE_INVENTORY_FILE" in os.environ: + pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ["MOLECULE_INVENTORY_FILE"] + ).get_hosts("all") + else: + pytest.skip( + "Test should run only from inside molecule.", allow_module_level=True + ) diff --git a/molecule/with_custom_config/tests/test_default.py b/molecule/with_custom_config/tests/test_default.py new file mode 100644 index 0000000..447ce74 --- /dev/null +++ b/molecule/with_custom_config/tests/test_default.py @@ -0,0 +1,41 @@ +"""Role testing files using testinfra.""" + + +def test_hosts_file(host): + """Validate /etc/hosts file.""" + etc_hosts = host.file("/etc/hosts") + assert etc_hosts.exists + assert etc_hosts.user == "root" + assert etc_hosts.group == "root" + +def test_docker_service(host): + """Validate docker service.""" + docker_service = host.service("docker.service") + assert docker_service.is_enabled + assert docker_service.is_running + assert docker_service.systemd_properties["Restart"] == "always" + assert docker_service.systemd_properties["FragmentPath"] == "/lib/systemd/system/docker.service" + +def test_docker_daemon(host): + """Validate /etc/docker/daemon.json file.""" + docker_daemon_file = host.file("/etc/docker/daemon.json") + assert docker_daemon_file.exists + assert docker_daemon_file.user == "root" + assert docker_daemon_file.group =="root" + assert docker_daemon_file.mode == 0o644 + assert docker_daemon_file.contains("{}") + +def test_docker_interaction(host): + """Validate interaction with docker.""" + docker_ps = host.check_output("docker ps") + assert docker_ps == "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES" + +def test_docker_compose(host): + """Validate docker-compose installation""" + docker_compose_bin = host.file("/usr/local/bin/docker-compose") + docker_compose_version = host.check_output("docker-compose --version") + assert docker_compose_bin.exists + assert docker_compose_bin.user == "root" + assert docker_compose_bin.group == "root" + assert docker_compose_bin.mode == 0o755 + assert docker_compose_version == "Docker Compose version "+ r'^v\d+\.\d+\.\d+$' diff --git a/tasks/configure.yml b/tasks/configure.yml index d0420b7..1a4ce49 100644 --- a/tasks/configure.yml +++ b/tasks/configure.yml @@ -7,13 +7,13 @@ append: true loop: "{{ install_docker_users }}" -- name: "Enable docker service" - ansible.builtin.service: - name: docker - enabled: true - -- name: "Start docker service" - ansible.builtin.service: - name: docker - state: restarted - when: install_docker_start_service +- name: "Copy daemon.json template" + ansible.builtin.template: + src: daemon.json.j2 + dest: "{{ install_docker_daemon_dir }}/daemon.json" + owner: root + group: root + mode: '0644' + notify: + - "systemctl-enable-docker" + - "systemctl-restart-docker" diff --git a/tasks/install_compose.yml b/tasks/install_compose.yml index 4fef327..c630394 100644 --- a/tasks/install_compose.yml +++ b/tasks/install_compose.yml @@ -9,7 +9,7 @@ register: _docker_compose_new_release - name: "Check current compose version" - command: "{{ install_docker_compose_path }} --version --short" + ansible.builtin.command: "{{ install_docker_compose_path }} --version --short" register: _docker_compose_old_release check_mode: false changed_when: false diff --git a/tasks/prerequisites.yml b/tasks/prerequisites.yml index d5c08a1..c1b6fdf 100644 --- a/tasks/prerequisites.yml +++ b/tasks/prerequisites.yml @@ -20,4 +20,3 @@ owner: root group: root mode: '0755' - diff --git a/templates/daemon.json.j2 b/templates/daemon.json.j2 new file mode 100644 index 0000000..10bdfe0 --- /dev/null +++ b/templates/daemon.json.j2 @@ -0,0 +1 @@ +{{ install_docker_daemon_options | to_nice_json }} \ No newline at end of file