From fc2c451981c88f7215a05f24e9a7d3500033b647 2017-11-26 00:10:12 From: Branko Majic Date: 2017-11-26 00:10:12 Subject: [PATCH] MAR-128: Upgraded tests for database_server role: - Switch to new Molecule configuration. - Updated set-up playbook to use become: yes. - Moved some preparatory steps outside of the main playbook (eases idempotence tests). - Updated tests to reference the yml inventory file. - Updated tests to use new fixture (host instead of individual ones). --- diff --git a/roles/database_server/meta/main.yml b/roles/database_server/meta/main.yml index a8a7bb38f612001e78287e5cb3a9c67ab7134faa..e53b9cc9399b1d218dc1a06d3fa5ba178c25c61c 100644 --- a/roles/database_server/meta/main.yml +++ b/roles/database_server/meta/main.yml @@ -1,4 +1,4 @@ --- dependencies: - - common \ No newline at end of file + - common diff --git a/roles/database_server/molecule.yml b/roles/database_server/molecule.yml deleted file mode 100644 index eed1e3034c3a652c20dd174dd2f9fca9d42732e7..0000000000000000000000000000000000000000 --- a/roles/database_server/molecule.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- - -ansible: - ansiblecfg_ssh_connection: - pipelining: True - -dependency: {} - -driver: - name: vagrant - -vagrant: - - platforms: - - name: debian-jessie64 - box: debian/contrib-jessie64 - - providers: - - name: virtualbox - type: virtualbox - options: - memory: 512 - cpus: 1 - - instances: - - - name: parameters-mandatory - -verifier: - name: testinfra diff --git a/roles/database_server/molecule/default/create.yml b/roles/database_server/molecule/default/create.yml new file mode 100644 index 0000000000000000000000000000000000000000..f8eb37cd4df02c540216c02791d0c50870986202 --- /dev/null +++ b/roles/database_server/molecule/default/create.yml @@ -0,0 +1,56 @@ +--- +- 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_instance_config: "{{ lookup('env', 'MOLECULE_INSTANCE_CONFIG') }}" + molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" + tasks: + - name: Create molecule instance(s) + molecule_vagrant: + instance_name: "{{ item.name }}" + instance_interfaces: "{{ item.interfaces | default(omit) }}" + instance_raw_config_args: "{{ item.instance_raw_config_args | default(omit) }}" + + platform_box: "{{ item.box }}" + platform_box_version: "{{ item.box_version | default(omit) }}" + platform_box_url: "{{ item.box_url | default(omit) }}" + + provider_name: "{{ molecule_yml.driver.provider.name }}" + provider_memory: "{{ item.memory | default(omit) }}" + provider_cpus: "{{ item.cpus | default(omit) }}" + provider_raw_config_args: "{{ item.raw_config_args | default(omit) }}" + + state: up + register: server + with_items: "{{ molecule_yml.platforms }}" + + # Mandatory configuration for Molecule to function. + + - name: Populate instance config dict + set_fact: + instance_conf_dict: { + 'instance': "{{ item.Host }}", + 'address': "{{ item.HostName }}", + 'user': "{{ item.User }}", + 'port': "{{ item.Port }}", + 'identity_file': "{{ item.IdentityFile }}", } + with_items: "{{ server.results }}" + register: instance_config_dict + when: server.changed | bool + + - name: Convert instance config dict to a list + set_fact: + instance_conf: "{{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}" + when: server.changed | bool + + - name: Dump instance config + copy: + # NOTE(retr0h): Workaround for Ansible 2.2. + # https://github.com/ansible/ansible/issues/20885 + content: "{{ instance_conf | to_json | from_json | molecule_to_yaml | molecule_header }}" + dest: "{{ molecule_instance_config }}" + when: server.changed | bool diff --git a/roles/database_server/molecule/default/destroy.yml b/roles/database_server/molecule/default/destroy.yml new file mode 100644 index 0000000000000000000000000000000000000000..3972a2df8fafe515b30a74f951499b83aae8449c --- /dev/null +++ b/roles/database_server/molecule/default/destroy.yml @@ -0,0 +1,36 @@ +--- + +- 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_instance_config: "{{ lookup('env',' MOLECULE_INSTANCE_CONFIG') }}" + molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" + tasks: + - name: Destroy molecule instance(s) + molecule_vagrant: + instance_name: "{{ item.name }}" + platform_box: "{{ item.box }}" + provider_name: "{{ molecule_yml.driver.provider.name }}" + force_stop: "{{ item.force_stop | default(True) }}" + + state: destroy + register: server + with_items: "{{ molecule_yml.platforms }}" + + # Mandatory configuration for Molecule to function. + + - name: Populate instance config + set_fact: + instance_conf: {} + + - name: Dump instance config + copy: + # NOTE(retr0h): Workaround for Ansible 2.2. + # https://github.com/ansible/ansible/issues/20885 + content: "{{ instance_conf | to_json | from_json | molecule_to_yaml | molecule_header }}" + dest: "{{ molecule_instance_config }}" + when: server.changed | bool diff --git a/roles/database_server/molecule/default/molecule.yml b/roles/database_server/molecule/default/molecule.yml new file mode 100644 index 0000000000000000000000000000000000000000..e44e64743bbf19e7d42d4df80e0bcee59ca2be15 --- /dev/null +++ b/roles/database_server/molecule/default/molecule.yml @@ -0,0 +1,36 @@ +--- + +dependency: {} + +driver: + name: vagrant + provider: + name: virtualbox + +lint: + name: yamllint + +platforms: + + - name: parameters-mandatory-jessie64 + groups: + - parameters-mandatory + box: debian/contrib-jessie64 + memory: 512 + cpus: 1 + +provisioner: + name: ansible + config_options: + ssh_connection: + pipelining: "True" + lint: + name: ansible-lint + +scenario: + name: default + +verifier: + name: testinfra + lint: + name: flake8 diff --git a/roles/database_server/molecule/default/playbook.yml b/roles/database_server/molecule/default/playbook.yml new file mode 100644 index 0000000000000000000000000000000000000000..e2bee44b97a348cb69230f3dd3ddcd9d58e65399 --- /dev/null +++ b/roles/database_server/molecule/default/playbook.yml @@ -0,0 +1,7 @@ +--- + +- hosts: parameters-mandatory + become: yes + roles: + - role: database_server + db_root_password: "root_password" diff --git a/roles/database_server/molecule/default/prepare.yml b/roles/database_server/molecule/default/prepare.yml new file mode 100644 index 0000000000000000000000000000000000000000..2ca5369027ee16118496dcf8548f8d803a0c9699 --- /dev/null +++ b/roles/database_server/molecule/default/prepare.yml @@ -0,0 +1,19 @@ +--- + +- name: Prepare + hosts: all + gather_facts: False + tasks: + - name: Install python for Ansible + raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) + become: True + changed_when: False + +- hosts: all + become: yes + tasks: + + - name: Update all caches to avoid errors due to missing remote archives + apt: + update_cache: yes + changed_when: False diff --git a/roles/database_server/tests/test_default.py b/roles/database_server/molecule/default/tests/test_default.py similarity index 57% rename from roles/database_server/tests/test_default.py rename to roles/database_server/molecule/default/tests/test_default.py index 65d3ad3533f317c9e10751a693e110526ab1e2a4..ce10d6c77694ec20a0df7431b7d55d1d933de9f0 100644 --- a/roles/database_server/tests/test_default.py +++ b/roles/database_server/molecule/default/tests/test_default.py @@ -1,36 +1,36 @@ import testinfra.utils.ansible_runner testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( - '.molecule/ansible_inventory').get_hosts('all') + '.molecule/ansible_inventory.yml').get_hosts('all') -def test_installed_packages(Package): +def test_installed_packages(host): """ Tests if the correct packages have been installed. """ - assert Package('mariadb-client').is_installed - assert Package('mariadb-server').is_installed - assert Package('python-mysqldb').is_installed + assert host.package('mariadb-client').is_installed + assert host.package('mariadb-server').is_installed + assert host.package('python-mysqldb').is_installed -def test_service(Service): +def test_service(host): """ Tests if the database server service is enabled on boot and running. """ - service = Service('mysql') + service = host.service('mysql') assert service.is_enabled assert service.is_running -def test_root_password(Command): +def test_root_password(host): """ Tests if the root password has been set correctly. """ - login = Command("mysql -uroot -proot_password -BNe 'show databases'") + login = host.run("mysql -uroot -proot_password -BNe 'show databases'") assert login.rc == 0 assert "information_schema" in login.stdout @@ -38,15 +38,15 @@ def test_root_password(Command): assert "performance_schema" in login.stdout -def test_root_my_cnf(File, Sudo): +def test_root_my_cnf(host): """ Tests if the root my.cnf configuration has been set-up with correct user/password and permissions. """ - with Sudo(): + with host.sudo(): - my_cnf = File('/root/.my.cnf') + my_cnf = host.file('/root/.my.cnf') assert my_cnf.is_file assert my_cnf.user == 'root' @@ -56,28 +56,28 @@ def test_root_my_cnf(File, Sudo): assert "password=root_password" in my_cnf.content -def test_root_my_cnf_login(Command, Sudo): +def test_root_my_cnf_login(host): """ Tets if the database server root login works using just the my.cnf configuration file. """ - with Sudo(): + with host.sudo(): - login = Command("mysql -BNe 'show databases'") + login = host.run("mysql -BNe 'show databases'") assert "information_schema" in login.stdout assert "mysql" in login.stdout assert "performance_schema" in login.stdout -def test_utf8_configuration_file(File): +def test_utf8_configuration_file(host): """ Tests if UTF-8 database server configuration file has been deployed correctly. """ - config = File('/etc/mysql/conf.d/utf8.cnf') + config = host.file('/etc/mysql/conf.d/utf8.cnf') assert config.is_file assert config.user == 'root' @@ -85,25 +85,25 @@ def test_utf8_configuration_file(File): assert config.mode == 0o644 -def test_utf8_configuration(Command): +def test_utf8_configuration(host): """ Tests if UTF-8 configuration has been applied correctly to server. """ - assert Command("mysql -uroot -proot_password -BNe 'drop database if exists test'").rc == 0 - assert Command("mysql -uroot -proot_password -BNe 'create database test'").rc == 0 + assert host.run("mysql -uroot -proot_password -BNe 'drop database if exists test'").rc == 0 + assert host.run("mysql -uroot -proot_password -BNe 'create database test'").rc == 0 - check_server = Command("mysql -uroot -proot_password test -BNe 'select @@character_set_server; select @@collation_server'") + check_server = host.run("mysql -uroot -proot_password test -BNe 'select @@character_set_server; select @@collation_server'") assert check_server.rc == 0 assert check_server.stdout == "utf8\nutf8_general_ci" - check_database = Command("mysql -uroot -proot_password test -BNe 'select @@character_set_database; select @@collation_database'") + check_database = host.run("mysql -uroot -proot_password test -BNe 'select @@character_set_database; select @@collation_database'") assert check_database.rc == 0 assert check_database.stdout == "utf8\nutf8_general_ci" - check_database = Command("mysql -uroot -proot_password -BNe 'select @@character_set_connection; select @@collation_connection'") + check_database = host.run("mysql -uroot -proot_password -BNe 'select @@character_set_connection; select @@collation_connection'") assert check_database.rc == 0 assert check_database.stdout == "utf8\nutf8_general_ci" diff --git a/roles/database_server/playbook.yml b/roles/database_server/playbook.yml deleted file mode 100644 index f6226618406ea3150461241dd07a2eddba71a1ea..0000000000000000000000000000000000000000 --- a/roles/database_server/playbook.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - -- hosts: all - tasks: - - - name: Update all caches to avoid errors due to missing remote archives - apt: - update_cache: yes - changed_when: False - -- hosts: parameters-mandatory - roles: - - role: database_server - db_root_password: "root_password"