openstack-ansible-tests/get-ansible-role-requiremen...

238 lines
9.7 KiB
YAML

---
# Copyright 2016, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Note(odyssey4me):
# This uses a local connection for the lint test which
# never sets up host keys and therefore cannot connect
# to localhost as a remote host.
#
- name: Clone the role ansible-role-requirements
hosts: localhost
connection: local
gather_facts: false
tasks:
- name: Set name for role under testing
set_fact:
role_name: "{{ lookup('env', 'ROLE_NAME') | default('') }}"
- name: Remove target role directories if they are not git repositories
shell: |
EXIT_CODE=0
{% for role in osa_roles %}
{% if role['scm'] == "git" or role['scm'] is undefined %}
ROLE_REPO_PATH="{{ lookup('env', 'ANSIBLE_ROLE_DEP_DIR') }}/{{ role['name'] | default(role['src'] | basename) }}"
if [[ -e ${ROLE_REPO_PATH} ]] && [[ ! -d "${ROLE_REPO_PATH}/.git" ]]; then
echo "${ROLE_REPO_PATH} is not a git repo, deleting..."
rm -rf "${ROLE_REPO_PATH}"
EXIT_CODE=2
fi
{% endif %}
{% endfor %}
exit ${EXIT_CODE}
args:
executable: /bin/bash
register: existing_dir_cleanup
changed_when: existing_dir_cleanup.rc == 2
failed_when: existing_dir_cleanup.rc not in [0,2]
- name: Create the ansible role directory
file:
dest: "{{ lookup('env', 'ANSIBLE_ROLE_DEP_DIR') }}"
state: directory
- name: Check whether zuul-cloner is installed and provide the path to it
shell: |
which zuul-cloner || { [[ -x /usr/zuul-env/bin/zuul-cloner ]] && echo '/usr/zuul-env/bin/zuul-cloner'; }
args:
executable: /bin/bash
changed_when: false
failed_when: false
register: _zuul_cloner_check
- name: Set fact to decide which version of zuul to cater to, if any
set_fact:
zuul_version: >-
{#- This tells us that we are running under zuul v2 or v3 #}
{%- if _zuul_cloner_check.rc == 0 %}
{#- So now we check for an environment variable that's unique to zuul v2 #}
{#- ref: http://git.openstack.org/cgit/openstack-infra/zuul/tree/zuul/ansible/filter/zuul_filters.py?h=feature/zuulv3#n17 #}
{%- if lookup('env', 'ZUUL_REF') != "" %}
{%- set version_output="2" %}
{%- else %}
{%- set version_output="3" %}
{%- endif %}
{%- else %}
{%- set version_output="none" %}
{%- endif %}
{{- version_output }}
- name: Clone git repos (no zuul)
block:
- name: Prepare git clone list
set_fact:
git_roles: "{{ osa_roles }}"
- name: Clone git repos
git:
repo: "{{ item['src'] }}"
dest: "{{ lookup('env', 'ANSIBLE_ROLE_DEP_DIR') }}/{{ item['name'] | default(item['src'] | basename) }}"
version: "{{ item['version'] | default('master') }}"
depth: "{{ item['depth'] | default('10') }}"
update: true
force: true
with_items: "{{ git_roles }}"
retries: "{{ git_clone_retries | default(3) }}"
delay: "{{ git_clone_retry_delay | default(5) }}"
when:
- item['scm'] == "git" or item['scm'] is undefined
when:
- zuul_version == "none"
- name: Clone git repos (zuul v2)
block:
- name: Prepare git clone list
set_fact:
git_roles: >
{%- set filtered_role_list = [] %}
{%- for role in osa_roles %}
{%- if (not role.src | match(".*git.openstack.org.*")) or
(role.name | match("os_previous_.*")) or
(role.name | match("previous_.*")) %}
{%- set _ = filtered_role_list.append(role) %}
{%- endif %}
{%- endfor %}
{{- filtered_role_list -}}
zuul_roles: >
{%- set filtered_role_list = [] %}
{%- for role in osa_roles %}
{%- if (role.src | match(".*git.openstack.org.*")) and (not role.name | match("os_previous_.*")) %}
{%- set role_src_cleaned = role.src | regex_replace('https://git.openstack.org/', '') %}
{%- set _ = filtered_role_list.append(role_src_cleaned) %}
{%- endif %}
{%- endfor %}
{{- filtered_role_list -}}
openstack_repo_list: >
{%- set filtered_repo_list = [] %}
{%- set repo_list = lookup('env', 'ZUUL_CHANGES').split('^') %}
{%- for repo in repo_list %}
{%- set repo_cleaned = repo | regex_replace(':.*$', '') %}
{%- if not repo_cleaned | match("^openstack/openstack-ansible.*") %}
{%- set _ = filtered_repo_list.append(repo_cleaned) %}
{%- endif %}
{%- endfor %}
{{- filtered_repo_list -}}
- name: Clone git repos (non openstack)
git:
repo: "{{ item['src'] }}"
dest: "{{ lookup('env', 'ANSIBLE_ROLE_DEP_DIR') }}/{{ item['name'] | default(item['src'] | basename) }}"
version: "{{ item['version'] | default('master') }}"
depth: "{{ item['depth'] | default('10') }}"
update: true
force: true
with_items: "{{ git_roles }}"
retries: "{{ git_clone_retries | default(3) }}"
delay: "{{ git_clone_retry_delay | default(5) }}"
when:
- item['scm'] == "git" or item['scm'] is undefined
- name: Create clone map
copy:
content: |
clonemap:
- name: 'openstack/openstack-ansible-tests'
dest: '{{ lookup("env", "WORKING_DIR") }}/tests/common'
- name: 'openstack/openstack-ansible-(?!tests)(.*)'
dest: '{{ lookup("env", "ANSIBLE_ROLE_DEP_DIR") }}/\1'
- name: 'openstack/(?!openstack-ansible)(.*)'
dest: '{{ homedir }}/git/openstack/\1'
dest: "{{ homedir }}/.ansible/clonemap.yml"
- name: Clone git repos (with zuul-cloner)
shell: |
{{ _zuul_cloner_check.stdout }} \
-m {{ homedir }}/.ansible/clonemap.yml \
--cache-dir /opt/git \
git://git.openstack.org \
{% for repo in zuul_roles + openstack_repo_list %}
{{ repo }} \
{% endfor %}
when:
- zuul_version == "2"
- name: Clone git repos (zuul v3)
block:
- name: Find repositories already cloned by zuul
command: "find {{ zuul_git_src_dir }} -type d -maxdepth 2"
register: zuul_src_folder
- name: Simplify the given src repository list
set_fact:
zuul_src_repo_list: >
{%- set filtered_repo_list = [] %}
{%- for folder_path in zuul_src_folder['stdout_lines'] %}
{%- if folder_path | match("^" ~ zuul_git_src_dir ~ "/openstack/openstack-ansible-(?!tests).*") %}
{%- set repo_cleaned = folder_path | regex_replace('^' ~ zuul_git_src_dir ~ '/', '') %}
{%- set _ = filtered_repo_list.append(repo_cleaned) %}
{%- endif %}
{%- endfor %}
{{- filtered_repo_list -}}
- name: Prepare git clone list
set_fact:
git_roles: >
{%- set filtered_role_list = [] %}
{%- for role in osa_roles %}
{%- if (role['name'] | match('os_previous_.*')) or
(role['name'] | match('previous_.*')) or
(role['src'] | regex_replace('https://git.openstack.org/', '') not in zuul_src_repo_list) %}
{%- set _ = filtered_role_list.append(role) %}
{%- endif %}
{%- endfor %}
{{- filtered_role_list -}}
- name: Link the zuul provided roles
file:
src: "{{ zuul_git_src_dir }}/{{ item }}"
dest: "{{ lookup('env', 'ANSIBLE_ROLE_DEP_DIR') }}/{{ item | regex_replace('openstack/openstack-ansible-', '') }}"
state: link
force: yes
with_items: "{{ zuul_src_repo_list }}"
# Do not link the role we are testing
when: role_name == '' or not item | search(role_name)
- name: Clone the remaining git repos
git:
repo: "{{ item['src'] }}"
dest: "{{ lookup('env', 'ANSIBLE_ROLE_DEP_DIR') }}/{{ item['name'] | default(item['src'] | basename) }}"
version: "{{ item['version'] | default('master') }}"
depth: "{{ item['depth'] | default('10') }}"
update: true
force: true
with_items: "{{ git_roles }}"
retries: "{{ git_clone_retries | default(3) }}"
delay: "{{ git_clone_retry_delay | default(5) }}"
when:
- item['scm'] == "git" or item['scm'] is undefined
when:
- zuul_version == "3"
vars:
homedir: "{{ lookup('env', 'TESTING_HOME') }}"
role_file: "{{ lookup('env', 'ANSIBLE_ROLE_REQUIREMENTS_PATH') }}"
osa_roles: "{{ lookup('file', role_file) | from_yaml }}"
zuul_git_src_dir: "/home/zuul/src/git.openstack.org"