From a4e1f294683ae6dc68da9cc3d7f6338b418b16d9 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Thu, 27 Jun 2019 14:43:20 -0700 Subject: [PATCH] Add base role integration jobs These are jobs for the roles in this repo which are currently tested by the "base-integration" job in openstack-zuul-jobs. Move it into this repo and rename it "base-roles". Change-Id: Ibd07964a08120e033bc5a2deca18649bd0e74a48 --- test-playbooks/base-roles/base.yaml | 13 +++ .../base-roles/configure-mirrors.yaml | 16 +++ .../base-roles/emit-job-header.yaml | 19 ++++ .../base-roles/ensure-output-dirs.yaml | 32 ++++++ test-playbooks/base-roles/fetch-output.yaml | 46 +++++++++ .../base-roles/fetch-zuul-cloner.yaml | 84 ++++++++++++++++ .../base-roles/use-cached-repos.yaml | 24 +++++ test-playbooks/base-roles/validate-host.yaml | 13 +++ zuul-tests.d/general-roles-jobs.yaml | 98 ++++++++++++++++++- zuul-tests.d/project.yaml | 14 --- 10 files changed, 341 insertions(+), 18 deletions(-) create mode 100644 test-playbooks/base-roles/base.yaml create mode 100644 test-playbooks/base-roles/configure-mirrors.yaml create mode 100644 test-playbooks/base-roles/emit-job-header.yaml create mode 100644 test-playbooks/base-roles/ensure-output-dirs.yaml create mode 100644 test-playbooks/base-roles/fetch-output.yaml create mode 100644 test-playbooks/base-roles/fetch-zuul-cloner.yaml create mode 100644 test-playbooks/base-roles/use-cached-repos.yaml create mode 100644 test-playbooks/base-roles/validate-host.yaml diff --git a/test-playbooks/base-roles/base.yaml b/test-playbooks/base-roles/base.yaml new file mode 100644 index 000000000..466a793fa --- /dev/null +++ b/test-playbooks/base-roles/base.yaml @@ -0,0 +1,13 @@ +# Roles that are part of the 'base' job + +# If you add new tests, also update the files section in job +# base-integration in zuul.d/jobs.yaml. + +# Note: set-zuul-log-path-fact is tested by emit-job-header.yaml +- include: emit-job-header.yaml +- include: ensure-output-dirs.yaml +- include: use-cached-repos.yaml +- include: configure-mirrors.yaml +- include: fetch-zuul-cloner.yaml +- include: validate-host.yaml +- include: fetch-output.yaml diff --git a/test-playbooks/base-roles/configure-mirrors.yaml b/test-playbooks/base-roles/configure-mirrors.yaml new file mode 100644 index 000000000..1efedb8fe --- /dev/null +++ b/test-playbooks/base-roles/configure-mirrors.yaml @@ -0,0 +1,16 @@ +- name: Test the configure-mirrors role + hosts: all + roles: + - role: configure-mirrors + mirror_fqdn: "{{ zuul_site_mirror_fqdn }}" + set_apt_mirrors_trusted: True + post_tasks: + - name: Set emacs package fact for gentoo + set_fact: + emacs_package: app-editors/emacs + when: ansible_distribution == 'Gentoo' + - name: Install a package to sanity check the mirror configuration + package: + name: "{{ emacs_package | default('emacs') }}" + state: "present" + become: yes diff --git a/test-playbooks/base-roles/emit-job-header.yaml b/test-playbooks/base-roles/emit-job-header.yaml new file mode 100644 index 000000000..2dce32de2 --- /dev/null +++ b/test-playbooks/base-roles/emit-job-header.yaml @@ -0,0 +1,19 @@ +- name: Test the emit-job-header role + hosts: all + roles: + - role: emit-job-header + zuul_log_url: "http://logs.openstack.org" + post_tasks: + # All emit-job-header does is a debug statement so the worst that would + # happen would be that the debug task would fail outright and we'd prevent + # something breaking that debug statement from merging just by running it. + # However, the emit-job-header role includes the set-zuul-log-path-fact + # role. We can only test for zuul_log_path against changes, though. + - name: Assert zuul_log_path by set-zuul-log-path-fact for a change + assert: + that: + - zuul_log_path is defined + - zuul.change in zuul_log_path + - zuul.patchset in zuul_log_path + - zuul.pipeline in zuul_log_path + - zuul.job in zuul_log_path diff --git a/test-playbooks/base-roles/ensure-output-dirs.yaml b/test-playbooks/base-roles/ensure-output-dirs.yaml new file mode 100644 index 000000000..e0e37db3e --- /dev/null +++ b/test-playbooks/base-roles/ensure-output-dirs.yaml @@ -0,0 +1,32 @@ +- name: Test the ensure-output-dirs role + hosts: all + roles: + - role: ensure-output-dirs + post_tasks: + - name: Check that log dir has been created + file: + path: "{{ zuul_output_dir }}/logs" + state: directory + register: log_directory + + - name: Check that artifact dir has been created + file: + path: "{{ zuul_output_dir }}/artifacts" + state: directory + register: artifact_directory + + - name: Check that doc dir has been created + file: + path: "{{ zuul_output_dir }}/docs" + state: directory + register: doc_directory + + - name: Validate that directories were set correctly + assert: + that: + - log_directory is not changed + - log_directory is succeeded + - artifact_directory is not changed + - artifact_directory is succeeded + - doc_directory is not changed + - doc_directory is succeeded diff --git a/test-playbooks/base-roles/fetch-output.yaml b/test-playbooks/base-roles/fetch-output.yaml new file mode 100644 index 000000000..36a9958a0 --- /dev/null +++ b/test-playbooks/base-roles/fetch-output.yaml @@ -0,0 +1,46 @@ +- name: Run the fetch-output role + hosts: all + pre_tasks: + # ensure-output-dirs is run before this + - name: Write test log file + copy: + dest: '{{ zuul_output_dir }}/{{ item }}/{{ inventory_hostname }}' + content: '{{ item }}' + loop: + - logs + - docs + - artifacts + roles: + - role: fetch-output + post_tasks: + - name: Check that logs have been pulled + delegate_to: localhost + file: + # log_path fact is set in fetch-output + path: "{{ log_path }}/{{ inventory_hostname }}" + state: file + register: local_log_content + + - name: Check that artifacts have been pulled + delegate_to: localhost + file: + path: "{{ zuul.executor.work_root }}/artifacts/{{ inventory_hostname }}" + state: file + register: local_artifact_content + + - name: Check that docs have been pulled + delegate_to: localhost + file: + path: "{{ zuul.executor.work_root }}/docs/{{ inventory_hostname }}" + state: file + register: local_doc_content + + - name: Validate that files were pulled correctly + assert: + that: + - local_log_content is not changed + - local_log_content is succeeded + - local_artifact_content is not changed + - local_artifact_content is succeeded + - local_doc_content is not changed + - local_doc_content is succeeded diff --git a/test-playbooks/base-roles/fetch-zuul-cloner.yaml b/test-playbooks/base-roles/fetch-zuul-cloner.yaml new file mode 100644 index 000000000..9bdfe5817 --- /dev/null +++ b/test-playbooks/base-roles/fetch-zuul-cloner.yaml @@ -0,0 +1,84 @@ +- name: Test the fetch-zuul-cloner role + hosts: all + vars: + destination: "/usr/zuul-env/bin/zuul-cloner" + repo_src_dir: "/home/zuul/src/opendev.org" + roles: + - role: fetch-zuul-cloner + post_tasks: + - name: Check that the directory exists + file: + path: "{{ destination | dirname }}" + state: directory + register: directory + + - name: Check that the zuul-cloner shim exists + stat: + path: "{{ destination }}" + register: cloner + + - name: Validate that the shim was installed successfully + assert: + that: + - directory is not changed + - directory is succeeded + - cloner.stat.exists + - cloner.stat.mode == "0755" + + - name: Zuul clone something in required-projects + shell: + executable: /bin/bash + cmd: | + CLONEMAP=`mktemp` + function cleanup { + rm -f $CLONEMAP + } + trap cleanup EXIT + cat > $CLONEMAP << EOF + clonemap: + - name: openstack/project-config + dest: {{ ansible_user_dir }} + EOF + /usr/zuul-env/bin/zuul-cloner -m $CLONEMAP \ + --cache-dir /opt/git https://opendev.org \ + openstack/project-config + register: clone_with_required + + - name: Check if repository was cloned + stat: + path: "{{ ansible_user_dir }}/src/opendev.org/openstack/project-config" + register: with_required_stat + + - name: Zuul clone something not in required-projects + shell: + executable: /bin/bash + cmd: | + CLONEMAP=`mktemp` + function cleanup { + rm -f $CLONEMAP + } + trap cleanup EXIT + cat > $CLONEMAP << EOF + clonemap: + - name: openstack-infra/jenkins-job-builder + dest: {{ ansible_user_dir }} + EOF + /usr/zuul-env/bin/zuul-cloner -m $CLONEMAP \ + --cache-dir /opt/git https://git.openstack.org \ + openstack-infra/jenkins-job-builder + ignore_errors: yes + register: clone_without_required + + - name: Check if repository was cloned + stat: + path: "{{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/jenkins-job-builder" + register: without_required_stat + + - name: Validate zuul-cloner shim results + assert: + that: + - clone_with_required is succeeded + - clone_with_required is changed + - with_required_stat.stat.exists + - clone_without_required is failed + - not without_required_stat.stat.exists diff --git a/test-playbooks/base-roles/use-cached-repos.yaml b/test-playbooks/base-roles/use-cached-repos.yaml new file mode 100644 index 000000000..dc0355328 --- /dev/null +++ b/test-playbooks/base-roles/use-cached-repos.yaml @@ -0,0 +1,24 @@ +- name: Test the use-cached-repos role + hosts: all + roles: + - role: use-cached-repos + post_tasks: + # openstack/project-config is in 'required-projects'. + # Also check that the project being tested is being prepared. + # We're checking them explicitly rather than with_items on zuul.projects + # in case there is a regression which would take an item out. + - name: Check that openstack/project-config was prepared + stat: + path: "{{ ansible_user_dir }}/src/opendev.org/openstack/project-config" + register: project_config + + - name: Check this project was prepared + stat: + path: "{{ ansible_user_dir }}/src/{{ zuul.project.canonical_name }}" + register: self_config + + - name: Validate that required projects have been prepared + assert: + that: + - project_config.stat.exists + - self_config.stat.exists diff --git a/test-playbooks/base-roles/validate-host.yaml b/test-playbooks/base-roles/validate-host.yaml new file mode 100644 index 000000000..67e40da7e --- /dev/null +++ b/test-playbooks/base-roles/validate-host.yaml @@ -0,0 +1,13 @@ +- name: Test the validate-host role + pre_tasks: + # NOTE(pabelanger): Until we hit the validate-host role, we have a minimal + # set of ansible variables collected by zuul-executor. This doesn't include + # network variables (ansible_default_ipv4 / ansible_default_ipv6) so gather + # these variables as they are important to the configure-unbound role. + - name: Gather network facts + setup: + gather_subset: 'network' + hosts: all + roles: + - role: validate-host + zuul_site_traceroute_host: files.openstack.org diff --git a/zuul-tests.d/general-roles-jobs.yaml b/zuul-tests.d/general-roles-jobs.yaml index 2ee83f531..6436212b6 100644 --- a/zuul-tests.d/general-roles-jobs.yaml +++ b/zuul-tests.d/general-roles-jobs.yaml @@ -1,17 +1,107 @@ +- job: + name: zuul-jobs-test-base-roles + description: | + Tests roles in the 'base' job + + These roles are tested together in this job because testing them + relies on using base-minimal, which avoids running these roles. + However, for the job to fully function, they all need to have + been run (once) by the end. + parent: base-minimal + tags: all-platforms + abstract: true + run: test-playbooks/base-roles/base.yaml + # Testing of fetch-zuul-cloner and use-cached-repos need this repo + # in required-projects + required-projects: + - openstack/project-config + files: + - ^roles/configure-mirrors/.* + - ^roles/configure-mirrors/.* + - ^roles/emit-job-header/.* + - ^roles/ensure-output-dirs/.* + - ^roles/fetch-output/.* + - ^roles/fetch-zuul-cloner/.* + - ^roles/set-zuul-log-path-fact/.* + - ^roles/use-cached-repo/.* + - ^roles/validate-host/.* + - ^test-playbooks/base-roles/.* + +- job: + name: zuul-jobs-test-base-roles-centos-7 + description: Tests roles in the 'base' job on centos-7 + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: centos-7 + +- job: + name: zuul-jobs-test-base-roles-debian-stable + description: Tests roles in the 'base' job on debian-stable + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: debian-stable + +- job: + name: zuul-jobs-test-base-roles-fedora-latest + description: Tests roles in the 'base' job on fedora-latest + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: fedora-latest + +- job: + name: zuul-jobs-test-base-roles-opensuse-15 + description: Tests roles in the 'base' job on opensuse-15 + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: opensuse-15 + +- job: + name: zuul-jobs-test-base-roles-opensuse-tumbleweed + description: Tests roles in the 'base' job on opensuse-tumbleweed + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: opensuse-tumbleweed + +- job: + name: zuul-jobs-test-base-roles-ubuntu-bionic + description: Tests roles in the 'base' job on ubuntu-bionic + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: ubuntu-bionic + +- job: + name: zuul-jobs-test-base-roles-ubuntu-trusty + description: Tests roles in the 'base' job on ubuntu-trusty + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: ubuntu-trusty + +- job: + name: zuul-jobs-test-base-roles-ubuntu-xenial + description: Tests roles in the 'base' job on ubuntu-xenial + parent: zuul-jobs-test-base-roles + tags: auto-generated + nodeset: ubuntu-xenial + - job: name: zuul-jobs-test-upload-git-mirror - description: | - Tests for the upload-git-mirror role from zuul-jobs + description: Test the upload-git-mirror role run: test-playbooks/upload-git-mirror.yaml files: - ^roles/upload-git-mirror/.* - ^test-playbooks/upload-git-mirror.yaml -# List all the jobs in this file. - - project: check: jobs: &id001 + - zuul-jobs-test-base-roles-centos-7 + - zuul-jobs-test-base-roles-debian-stable + - zuul-jobs-test-base-roles-fedora-latest + - zuul-jobs-test-base-roles-opensuse-15 + - zuul-jobs-test-base-roles-opensuse-tumbleweed + - zuul-jobs-test-base-roles-ubuntu-bionic + - zuul-jobs-test-base-roles-ubuntu-trusty + - zuul-jobs-test-base-roles-ubuntu-xenial - zuul-jobs-test-upload-git-mirror gate: jobs: *id001 diff --git a/zuul-tests.d/project.yaml b/zuul-tests.d/project.yaml index d0acb023b..eac1e6258 100644 --- a/zuul-tests.d/project.yaml +++ b/zuul-tests.d/project.yaml @@ -7,13 +7,6 @@ - build-tox-docs check: jobs: - - openstack-infra-base-integration-centos-7 - - openstack-infra-base-integration-debian-stable - - openstack-infra-base-integration-fedora-latest - - openstack-infra-base-integration-ubuntu-bionic - - openstack-infra-base-integration-ubuntu-trusty - - openstack-infra-base-integration-ubuntu-xenial - - openstack-infra-base-integration-opensuse423 - openstack-infra-multinode-integration-centos-7 - openstack-infra-multinode-integration-debian-stable - openstack-infra-multinode-integration-fedora-latest @@ -25,13 +18,6 @@ - tox-py35 gate: jobs: - - openstack-infra-base-integration-centos-7 - - openstack-infra-base-integration-debian-stable - - openstack-infra-base-integration-fedora-latest - - openstack-infra-base-integration-ubuntu-bionic - - openstack-infra-base-integration-ubuntu-trusty - - openstack-infra-base-integration-ubuntu-xenial - - openstack-infra-base-integration-opensuse423 - openstack-infra-multinode-integration-centos-7 - openstack-infra-multinode-integration-debian-stable - openstack-infra-multinode-integration-fedora-latest