From 76e8bf4f2c3d7883f49ba0e05c5e25a1cdc1b9d6 Mon Sep 17 00:00:00 2001 From: Benjamin Bertrand <benjamin.bertrand@esss.se> Date: Tue, 23 Jan 2018 14:09:45 +0100 Subject: [PATCH] Switch to molecule v2 --- .gitignore | 1 + .yamllint | 13 ++++ LICENSE | 2 +- README.md | 4 +- meta/main.yml | 8 +-- molecule.yml | 32 ---------- molecule/default/Dockerfile.j2 | 9 +++ molecule/default/create.yml | 59 +++++++++++++++++++ molecule/default/destroy.yml | 27 +++++++++ molecule/default/molecule.yml | 39 ++++++++++++ molecule/default/playbook.yml | 6 ++ molecule/default/prepare.yml | 5 ++ .../default/tests}/python27_env.yml | 0 .../default/tests}/python36_env.yml | 0 .../default/tests}/test_conda.py | 3 +- .../default/tests}/test_conda_create_env.py | 3 +- .../default/tests}/test_conda_uid.py | 3 +- 17 files changed, 172 insertions(+), 42 deletions(-) create mode 100644 .yamllint delete mode 100644 molecule.yml create mode 100644 molecule/default/Dockerfile.j2 create mode 100644 molecule/default/create.yml create mode 100644 molecule/default/destroy.yml create mode 100644 molecule/default/molecule.yml create mode 100644 molecule/default/playbook.yml create mode 100644 molecule/default/prepare.yml rename {tests => molecule/default/tests}/python27_env.yml (100%) rename {tests => molecule/default/tests}/python36_env.yml (100%) rename {tests => molecule/default/tests}/test_conda.py (89%) rename {tests => molecule/default/tests}/test_conda_create_env.py (88%) rename {tests => molecule/default/tests}/test_conda_uid.py (82%) diff --git a/.gitignore b/.gitignore index 3838ca3..853699e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .molecule +.vagrant .cache *.swp .DS_Store diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..3a2255e --- /dev/null +++ b/.yamllint @@ -0,0 +1,13 @@ +extends: default + +rules: + braces: + max-spaces-inside: 1 + level: error + brackets: + max-spaces-inside: 1 + level: error + line-length: disable + # NOTE(retr0h): Templates no longer fail this lint rule. + # Uncomment if running old Molecule templates. + # truthy: disable diff --git a/LICENSE b/LICENSE index 93c8944..3cc600c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 2-Clause License -Copyright (c) 2017, European Spallation Source ERIC +Copyright (c) 2018, European Spallation Source ERIC All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 5268afb..f07633a 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Ansible role to install conda on CentOS. Requirements ------------ -- ansible >= 2.2 -- molecule >= 1.20 +- ansible >= 2.4 +- molecule >= 2.6 Role Variables -------------- diff --git a/meta/main.yml b/meta/main.yml index 593e07c..0f7c8f8 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -3,12 +3,12 @@ galaxy_info: company: European Spallation Source ERIC description: Role to install conda. license: BSD - min_ansible_version: 2.2 + min_ansible_version: 2.4 platforms: - name: CentOS versions: - 7 dependencies: [] - # List your role dependencies here, one per line. - # Be sure to remove the '[]' above if you add dependencies - # to this list. +# List your role dependencies here, one per line. +# Be sure to remove the '[]' above if you add dependencies +# to this list. diff --git a/molecule.yml b/molecule.yml deleted file mode 100644 index 7b07929..0000000 --- a/molecule.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -ansible: - playbook: playbook.yml - group_vars: - default_group: - set_uid: - conda_uid: 48 - create_env: - conda_env_files: - - "{{ playbook_dir }}/tests/python27_env.yml" - - "{{ playbook_dir }}/tests/python36_env.yml" -driver: - name: docker -docker: - containers: - - name: ics-ans-role-conda-default - image: centos - image_version: 7 - ansible_groups: - - default_group - - name: ics-ans-role-conda-set-uid - image: centos - image_version: 7 - ansible_groups: - - set_uid - - name: ics-ans-role-conda-create-env - image: centos - image_version: 7 - ansible_groups: - - create_env -verifier: - name: testinfra diff --git a/molecule/default/Dockerfile.j2 b/molecule/default/Dockerfile.j2 new file mode 100644 index 0000000..f8b4e75 --- /dev/null +++ b/molecule/default/Dockerfile.j2 @@ -0,0 +1,9 @@ +# Molecule managed + +FROM {{ item.image }} + +RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get upgrade -y && 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 python2-dnf bash && dnf clean all; \ + elif [ $(command -v yum) ]; then yum makecache fast && yum update -y && 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 update -y && 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; fi diff --git a/molecule/default/create.yml b/molecule/default/create.yml new file mode 100644 index 0000000..a73a021 --- /dev/null +++ b/molecule/default/create.yml @@ -0,0 +1,59 @@ +--- +- name: Create + hosts: localhost + connection: local + gather_facts: false + no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" + vars: + molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" + molecule_ephemeral_directory: "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}" + molecule_scenario_directory: "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}" + molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" + tasks: + - name: Create Dockerfiles from image names + template: + src: "{{ molecule_scenario_directory }}/Dockerfile.j2" + dest: "{{ molecule_ephemeral_directory }}/Dockerfile_{{ item.image | regex_replace('[^a-zA-Z0-9_]', '_') }}" + with_items: "{{ molecule_yml.platforms }}" + register: platforms + + - name: Discover local Docker images + docker_image_facts: + name: "molecule_local/{{ item.item.name }}" + with_items: "{{ platforms.results }}" + register: docker_images + + - name: Build an Ansible compatible image + docker_image: + path: "{{ molecule_ephemeral_directory }}" + name: "molecule_local/{{ item.item.image }}" + dockerfile: "{{ item.item.dockerfile | default(item.invocation.module_args.dest) }}" + force: "{{ item.item.force | default(true) }}" + with_items: "{{ platforms.results }}" + when: platforms.changed or docker_images.results | map(attribute='images') | select('equalto', []) | list | count >= 0 + + - name: Create molecule instance(s) + docker_container: + name: "{{ item.name }}" + hostname: "{{ item.name }}" + image: "molecule_local/{{ item.image }}" + state: started + recreate: false + log_driver: none + command: "{{ item.command | default('bash -c \"while true; do sleep 10000; done\"') }}" + privileged: "{{ item.privileged | default(omit) }}" + volumes: "{{ item.volumes | default(omit) }}" + capabilities: "{{ item.capabilities | default(omit) }}" + ports: "{{ item.exposed_ports | default(omit) }}" + register: server + with_items: "{{ molecule_yml.platforms }}" + async: 7200 + poll: 0 + + - name: Wait for instance(s) creation to complete + async_status: + jid: "{{ item.ansible_job_id }}" + register: docker_jobs + until: docker_jobs.finished + retries: 300 + with_items: "{{ server.results }}" diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml new file mode 100644 index 0000000..3ce7478 --- /dev/null +++ b/molecule/default/destroy.yml @@ -0,0 +1,27 @@ +--- +- name: Destroy + hosts: localhost + connection: local + gather_facts: false + no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" + vars: + molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" + molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" + tasks: + - name: Destroy molecule instance(s) + docker_container: + name: "{{ item.name }}" + state: absent + force_kill: "{{ item.force_kill | default(true) }}" + register: server + with_items: "{{ molecule_yml.platforms }}" + async: 7200 + poll: 0 + + - name: Wait for instance(s) deletion to complete + async_status: + jid: "{{ item.ansible_job_id }}" + register: docker_jobs + until: docker_jobs.finished + retries: 300 + with_items: "{{ server.results }}" diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml new file mode 100644 index 0000000..6be4477 --- /dev/null +++ b/molecule/default/molecule.yml @@ -0,0 +1,39 @@ +--- +dependency: + name: galaxy +lint: + name: yamllint +provisioner: + name: ansible + lint: + name: ansible-lint + inventory: + group_vars: + default_group: + set_uid: + conda_uid: 48 + create_env: + conda_env_files: + - "{{ playbook_dir }}/tests/python27_env.yml" + - "{{ playbook_dir }}/tests/python36_env.yml" +scenario: + name: default +verifier: + name: testinfra + lint: + name: flake8 +driver: + name: docker +platforms: + - name: ics-ans-role-conda-default + image: centos:7 + groups: + - default_group + - name: ics-ans-role-conda-set-uid + image: centos:7 + groups: + - set_uid + - name: ics-ans-role-conda-create-env + image: centos:7 + groups: + - create_env diff --git a/molecule/default/playbook.yml b/molecule/default/playbook.yml new file mode 100644 index 0000000..0eb2c73 --- /dev/null +++ b/molecule/default/playbook.yml @@ -0,0 +1,6 @@ +--- +- name: Converge + hosts: all + become: yes + roles: + - role: ics-ans-role-conda diff --git a/molecule/default/prepare.yml b/molecule/default/prepare.yml new file mode 100644 index 0000000..5358b3b --- /dev/null +++ b/molecule/default/prepare.yml @@ -0,0 +1,5 @@ +--- +- name: Prepare + hosts: all + gather_facts: false + tasks: [] diff --git a/tests/python27_env.yml b/molecule/default/tests/python27_env.yml similarity index 100% rename from tests/python27_env.yml rename to molecule/default/tests/python27_env.yml diff --git a/tests/python36_env.yml b/molecule/default/tests/python36_env.yml similarity index 100% rename from tests/python36_env.yml rename to molecule/default/tests/python36_env.yml diff --git a/tests/test_conda.py b/molecule/default/tests/test_conda.py similarity index 89% rename from tests/test_conda.py rename to molecule/default/tests/test_conda.py index e11a801..67edc52 100644 --- a/tests/test_conda.py +++ b/molecule/default/tests/test_conda.py @@ -1,7 +1,8 @@ +import os import testinfra.utils.ansible_runner testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( - '.molecule/ansible_inventory').get_hosts('all') + os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all') def test_conda_user(host): diff --git a/tests/test_conda_create_env.py b/molecule/default/tests/test_conda_create_env.py similarity index 88% rename from tests/test_conda_create_env.py rename to molecule/default/tests/test_conda_create_env.py index 4ef9984..b1f6260 100644 --- a/tests/test_conda_create_env.py +++ b/molecule/default/tests/test_conda_create_env.py @@ -1,8 +1,9 @@ # Tests for the create_env group +import os import testinfra.utils.ansible_runner testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( - '.molecule/ansible_inventory').get_hosts('create_env') + os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('create_env') def test_conda_env_python27(host): diff --git a/tests/test_conda_uid.py b/molecule/default/tests/test_conda_uid.py similarity index 82% rename from tests/test_conda_uid.py rename to molecule/default/tests/test_conda_uid.py index d159309..f6c6185 100644 --- a/tests/test_conda_uid.py +++ b/molecule/default/tests/test_conda_uid.py @@ -1,8 +1,9 @@ # Tests for the set_uid group +import os import testinfra.utils.ansible_runner testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( - '.molecule/ansible_inventory').get_hosts('set_uid') + os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('set_uid') def test_conda_uid(host): -- GitLab