From 75f0c57654429d3b861d792169a9c1bdf9156bf8 Mon Sep 17 00:00:00 2001 From: Luke Meyer Date: Thu, 30 Mar 2017 13:08:34 -0400 Subject: preflight int tests: generalize; add tests Make the container setup and teardown more reusable. Remove example tests. Add basic package tests. --- .../example/example_test.go | 26 ------ .../example/playbooks/test_fail.yml | 14 --- .../example/playbooks/test_ping.yml | 14 --- .../package_availability_missing_required.yml | 20 ++++ .../playbooks/package_availability_succeeds.yml | 20 ++++ .../playbooks/package_update_dep_missing.yml | 24 +++++ .../playbooks/package_update_repo_broken.yml | 31 +++++++ .../playbooks/package_update_repo_disabled.yml | 21 +++++ .../playbooks/package_update_repo_unreachable.yml | 27 ++++++ .../playbooks/package_version_matches.yml | 24 +++++ .../playbooks/package_version_mismatches.yml | 24 +++++ .../playbooks/package_version_multiple.yml | 26 ++++++ .../preflight/playbooks/package_version_origin.yml | 20 ++++ .../preflight/playbooks/preflight_fail_all.yml | 11 --- .../preflight/playbooks/roles | 1 + .../preflight/playbooks/setup_container.yml | 23 ----- .../preflight/playbooks/tasks/enable_repo.yml | 9 ++ .../preflight/preflight_test.go | 101 +++++++++++++++++++-- .../openshift_health_checker/setup_container.yml | 45 +++++++++ .../teardown_container.yml | 23 +++++ 20 files changed, 406 insertions(+), 98 deletions(-) delete mode 100644 test/integration/openshift_health_checker/example/example_test.go delete mode 100644 test/integration/openshift_health_checker/example/playbooks/test_fail.yml delete mode 100644 test/integration/openshift_health_checker/example/playbooks/test_ping.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_availability_missing_required.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_availability_succeeds.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_update_dep_missing.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_broken.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_disabled.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_unreachable.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_version_matches.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_version_mismatches.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_version_multiple.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/package_version_origin.yml delete mode 100644 test/integration/openshift_health_checker/preflight/playbooks/preflight_fail_all.yml create mode 120000 test/integration/openshift_health_checker/preflight/playbooks/roles delete mode 100644 test/integration/openshift_health_checker/preflight/playbooks/setup_container.yml create mode 100644 test/integration/openshift_health_checker/preflight/playbooks/tasks/enable_repo.yml create mode 100644 test/integration/openshift_health_checker/setup_container.yml create mode 100644 test/integration/openshift_health_checker/teardown_container.yml (limited to 'test') diff --git a/test/integration/openshift_health_checker/example/example_test.go b/test/integration/openshift_health_checker/example/example_test.go deleted file mode 100644 index f59c21291..000000000 --- a/test/integration/openshift_health_checker/example/example_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package example - -import ( - "testing" - - . ".." -) - -// TestPing and TestFail below are just examples of tests that involve running -// 'ansible-playbook' with a given playbook and verifying the outcome. Real -// tests look similar, but call more interesting playbooks. - -func TestPing(t *testing.T) { - PlaybookTest{ - Path: "playbooks/test_ping.yml", - Output: []string{"[test ping]"}, - }.Run(t) -} - -func TestFail(t *testing.T) { - PlaybookTest{ - Path: "playbooks/test_fail.yml", - ExitCode: 2, - Output: []string{"[test fail]", `"msg": "Failed as requested from task"`}, - }.Run(t) -} diff --git a/test/integration/openshift_health_checker/example/playbooks/test_fail.yml b/test/integration/openshift_health_checker/example/playbooks/test_fail.yml deleted file mode 100644 index 318f1c507..000000000 --- a/test/integration/openshift_health_checker/example/playbooks/test_fail.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -# This is just a placeholder playbook. Our aim is to make it: -# 1. Build one or more Docker images with a certain interesting state; -# 2. Ensure one or more containers (with random names) are running with the -# latest build of the image; -# 3. Run the byo OpenShift installation playbook targeting the container. -- hosts: localhost - gather_facts: no - tasks: - - name: waste some time - pause: - seconds: 1 - - name: test fail - fail: diff --git a/test/integration/openshift_health_checker/example/playbooks/test_ping.yml b/test/integration/openshift_health_checker/example/playbooks/test_ping.yml deleted file mode 100644 index da31b3d85..000000000 --- a/test/integration/openshift_health_checker/example/playbooks/test_ping.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -# This is just a placeholder playbook. Our aim is to make it: -# 1. Build one or more Docker images with a certain interesting state; -# 2. Ensure one or more containers (with random names) are running with the -# latest build of the image; -# 3. Run the byo OpenShift installation playbook targeting the container. -- hosts: localhost - gather_facts: no - tasks: - - name: waste some time - pause: - seconds: 1 - - name: test ping - ping: diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_availability_missing_required.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_availability_missing_required.yml new file mode 100644 index 000000000..31d0d521e --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_availability_missing_required.yml @@ -0,0 +1,20 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + deployment_type: openshift-enterprise + +- name: Fail as required packages cannot be installed + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - action: openshift_health_check + args: + checks: [ 'package_availability' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_availability_succeeds.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_availability_succeeds.yml new file mode 100644 index 000000000..16ff41673 --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_availability_succeeds.yml @@ -0,0 +1,20 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + deployment_type: origin + +- name: Succeeds as Origin packages are public + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - action: openshift_health_check + args: + checks: [ 'package_availability' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_update_dep_missing.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_update_dep_missing.yml new file mode 100644 index 000000000..7b6e71f91 --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_update_dep_missing.yml @@ -0,0 +1,24 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + openshift_deployment_type: openshift-enterprise + openshift_release: 3.2 + +- name: Fails when a dependency required for update is missing + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - include: tasks/enable_repo.yml + vars: { repo_name: "break-yum" } + + - action: openshift_health_check + args: + checks: [ 'package_update' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_broken.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_broken.yml new file mode 100644 index 000000000..c2e9c3866 --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_broken.yml @@ -0,0 +1,31 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + openshift_deployment_type: openshift-enterprise + openshift_release: 3.2 + +- name: Fails when a repo definition is completely broken + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - include: tasks/enable_repo.yml + vars: { repo_name: "break-yum" } + + - name: Break the break-yum repo + replace: + dest: /etc/yum.repos.d/break-yum.repo + backup: no + regexp: "^baseurl" + replace: "#baseurl" + + - action: openshift_health_check + args: + checks: [ 'package_update' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_disabled.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_disabled.yml new file mode 100644 index 000000000..98d41aad4 --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_disabled.yml @@ -0,0 +1,21 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + openshift_deployment_type: openshift-enterprise + openshift_release: 3.2 + +- name: Succeeds when nothing blocks a yum update + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - action: openshift_health_check + args: + checks: [ 'package_update' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_unreachable.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_unreachable.yml new file mode 100644 index 000000000..60ab9942a --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_update_repo_unreachable.yml @@ -0,0 +1,27 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + openshift_deployment_type: openshift-enterprise + openshift_release: 3.2 + +- name: Fails when repo content is not available + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - include: tasks/enable_repo.yml + vars: { repo_name: "break-yum" } + + - name: Remove the local repo entirely + file: path=/mnt/localrepo state=absent + + - action: openshift_health_check + args: + checks: [ 'package_update' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_version_matches.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_version_matches.yml new file mode 100644 index 000000000..cd60dee5a --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_version_matches.yml @@ -0,0 +1,24 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + deployment_type: openshift-enterprise + openshift_release: 3.2 + +- name: Success when AOS version matches openshift_release + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - include: tasks/enable_repo.yml + vars: { repo_name: "ose-3.2" } + + - action: openshift_health_check + args: + checks: [ 'package_version' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_version_mismatches.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_version_mismatches.yml new file mode 100644 index 000000000..5939a1ef1 --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_version_mismatches.yml @@ -0,0 +1,24 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + deployment_type: openshift-enterprise + openshift_release: 3.3 + +- name: Failure when AOS version doesn't match openshift_release + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - include: tasks/enable_repo.yml + vars: { repo_name: "ose-3.2" } + + - action: openshift_health_check + args: + checks: [ 'package_version' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_version_multiple.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_version_multiple.yml new file mode 100644 index 000000000..be0f9bc7a --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_version_multiple.yml @@ -0,0 +1,26 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + openshift_deployment_type: openshift-enterprise + +- name: Fails when multiple AOS versions are available + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - include: tasks/enable_repo.yml + vars: { repo_name: "ose-3.2" } + + - include: tasks/enable_repo.yml + vars: { repo_name: "ose-3.3" } + + - action: openshift_health_check + args: + checks: [ 'package_version' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/package_version_origin.yml b/test/integration/openshift_health_checker/preflight/playbooks/package_version_origin.yml new file mode 100644 index 000000000..da3f6b844 --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/package_version_origin.yml @@ -0,0 +1,20 @@ +--- +- include: ../../setup_container.yml + vars: + image: preflight-aos-package-checks + l_host_vars: + openshift_deployment_type: origin + +- name: Succeeds with Origin although multiple versions are available + hosts: all + roles: + - openshift_health_checker + tasks: + - block: + + - action: openshift_health_check + args: + checks: [ 'package_version' ] + + always: # destroy the container whether check passed or not + - include: ../../teardown_container.yml diff --git a/test/integration/openshift_health_checker/preflight/playbooks/preflight_fail_all.yml b/test/integration/openshift_health_checker/preflight/playbooks/preflight_fail_all.yml deleted file mode 100644 index e7790a0d4..000000000 --- a/test/integration/openshift_health_checker/preflight/playbooks/preflight_fail_all.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- include: setup_container.yml - vars: - name: preflight_fail_all - -- name: Run preflight checks - include: ../../../../../playbooks/byo/openshift-preflight/check.yml - -# - include: tasks/teardown_container.yml -# vars: -# name: preflight_fail_all diff --git a/test/integration/openshift_health_checker/preflight/playbooks/roles b/test/integration/openshift_health_checker/preflight/playbooks/roles new file mode 120000 index 000000000..6bc1a7aef --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/roles @@ -0,0 +1 @@ +../../../../../roles \ No newline at end of file diff --git a/test/integration/openshift_health_checker/preflight/playbooks/setup_container.yml b/test/integration/openshift_health_checker/preflight/playbooks/setup_container.yml deleted file mode 100644 index fff797c27..000000000 --- a/test/integration/openshift_health_checker/preflight/playbooks/setup_container.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- -# Required vars: -# * name = name of the container to be started - -- name: Start CentOS 7 container - gather_facts: no - hosts: localhost - connection: local - vars: - container_name: openshift_ansible_test_{{ name }} - tasks: - - name: start container - docker_container: - name: "{{ container_name }}" - image: centos:7 - command: sleep infinity - recreate: yes - - name: add host - add_host: - name: "{{ container_name }}" - ansible_connection: docker - groups: OSEv3,masters,nodes - deployment_type: origin diff --git a/test/integration/openshift_health_checker/preflight/playbooks/tasks/enable_repo.yml b/test/integration/openshift_health_checker/preflight/playbooks/tasks/enable_repo.yml new file mode 100644 index 000000000..aaacf205e --- /dev/null +++ b/test/integration/openshift_health_checker/preflight/playbooks/tasks/enable_repo.yml @@ -0,0 +1,9 @@ +--- +- name: Enable {{ repo_name }} repo + # believe it or not we can't use the yum_repository module for this. + # https://github.com/ansible/ansible-modules-extras/issues/2384 + ini_file: + dest: /etc/yum.repos.d/{{ repo_name }}.repo + section: "{{ repo_name }}" + option: enabled + value: 1 diff --git a/test/integration/openshift_health_checker/preflight/preflight_test.go b/test/integration/openshift_health_checker/preflight/preflight_test.go index a1b98bf0f..05ddf139f 100644 --- a/test/integration/openshift_health_checker/preflight/preflight_test.go +++ b/test/integration/openshift_health_checker/preflight/preflight_test.go @@ -6,19 +6,100 @@ import ( . ".." ) -func TestPreflightFailAll(t *testing.T) { +func TestPackageUpdateDepMissing(t *testing.T) { PlaybookTest{ - Path: "playbooks/preflight_fail_all.yml", + Path: "playbooks/package_update_dep_missing.yml", ExitCode: 2, Output: []string{ - "Failure summary", - "Cannot install all of the necessary packages", - "origin-clients", - "origin-master", - "origin-node", - "origin-sdn-ovs", - "python-httplib2", - "failed=1", + "check \"package_update\":", + "Could not perform a yum update.", + "break-yum-update-1.0-2.noarch requires package-that-does-not-exist", + }, + }.Run(t) +} + +func TestPackageUpdateRepoBroken(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_update_repo_broken.yml", + ExitCode: 2, + Output: []string{ + "check \"package_update\":", + "Error with yum repository configuration: Cannot find a valid baseurl for repo", + }, + }.Run(t) +} + +func TestPackageUpdateRepoDisabled(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_update_repo_disabled.yml", + ExitCode: 0, + Output: []string{ + "CHECK [package_update", + }, + }.Run(t) +} + +func TestPackageUpdateRepoUnreachable(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_update_repo_unreachable.yml", + ExitCode: 2, + Output: []string{ + "check \"package_update\":", + "Error getting data from at least one yum repository", + }, + }.Run(t) +} + +func TestPackageVersionMatches(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_version_matches.yml", + ExitCode: 0, + Output: []string{ + "CHECK [package_version", + }, + }.Run(t) +} + +func TestPackageVersionMismatches(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_version_mismatches.yml", + ExitCode: 2, + Output: []string{ + "check \"package_version\":", + "Not all of the required packages are available at requested version", + }, + }.Run(t) +} + +func TestPackageVersionMultiple(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_version_multiple.yml", + ExitCode: 2, + Output: []string{ + "check \"package_version\":", + "Multiple minor versions of these packages are available", + }, + }.Run(t) +} + +func TestPackageAvailabilityMissingRequired(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_availability_missing_required.yml", + ExitCode: 2, + Output: []string{ + "check \"package_availability\":", + "Cannot install all of the necessary packages.", + "atomic-openshift", + }, + }.Run(t) +} + +func TestPackageAvailabilitySucceeds(t *testing.T) { + PlaybookTest{ + Path: "playbooks/package_availability_succeeds.yml", + ExitCode: 0, + Output: []string{ + "CHECK [package_availability", }, }.Run(t) } diff --git a/test/integration/openshift_health_checker/setup_container.yml b/test/integration/openshift_health_checker/setup_container.yml new file mode 100644 index 000000000..4dd2c4b1e --- /dev/null +++ b/test/integration/openshift_health_checker/setup_container.yml @@ -0,0 +1,45 @@ +--- +# Include this play once for each container you want to create and use as a test host. +# +# Optional parameters on the include are as follows: +# * scenario = unique name for the container to be started +# * image = name of the image to start in the container +# * command = command to run in the container +# * l_groups = host groups that the container should be added to +# * l_host_vars = any variables that should be added to the host + +- name: Start container for specified test host + gather_facts: no + hosts: localhost + connection: local + tasks: + + - set_fact: + # This is a little weird but if we use a var instead of a fact, + # a different random value is generated for each task. See: + # https://opensolitude.com/2015/05/27/ansible-lookups-variables-vs-facts.html + container_name: openshift_ansible_test_{{ scenario | default(100000000000000 | random) }} + + - name: start container + docker_container: + name: "{{ container_name }}" + image: "{{ image | default('test-target-base') }}" + command: "{{ command | default('sleep 1800') }}" + recreate: yes + # NOTE: When/if we need to run containers that are docker hosts as well: + # volumes: [ "/var/run/docker.sock:/var/run/docker.sock:z" ] + + - name: add container as host in inventory + add_host: + ansible_connection: docker + name: "{{ container_name }}" + groups: '{{ l_groups | default("masters,nodes,etcd") }}' + + # There ought to be a better way to transfer the host vars, but see: + # https://groups.google.com/forum/#!topic/Ansible-project/Jwx8RYhqxPA + - name: set host facts per test parameters + set_fact: + "{{ item.key }}": "{{ item.value }}" + delegate_facts: True + delegate_to: "{{ container_name }}" + with_dict: "{{ l_host_vars | default({}) }}" diff --git a/test/integration/openshift_health_checker/teardown_container.yml b/test/integration/openshift_health_checker/teardown_container.yml new file mode 100644 index 000000000..fe11e2617 --- /dev/null +++ b/test/integration/openshift_health_checker/teardown_container.yml @@ -0,0 +1,23 @@ +--- + +# Include this to delete the current test host container. +# +# In order to recover from test exceptions, this cleanup is expected to +# be done in an "always:" task on the same block as the test task(s). So +# it happens in a task "on" the host being tested. In order to delete the +# host's container, the task uses its own hostname (which is same as the +# container name) but delegates the docker action to localhost. + +- block: + + # so handlers don't break the test by trying to run after teardown: + - meta: flush_handlers + + always: + + - name: delete test container + delegate_to: localhost + connection: local + docker_container: + name: "{{ inventory_hostname }}" + state: absent -- cgit v1.2.1