--- # Copyright 2020 BBC R&D. # # 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. - name: Clone collections ansible-collection-requirements hosts: localhost connection: local user: root gather_facts: false tasks: - name: Ensure the default collections directory exists file: path: "{{ collection_path_default }}/ansible_collections" state: directory recurse: yes - name: Read the list of user collections set_fact: user_collection_names: "{{ user_collections.collections | default([]) | map(attribute='name') | list }}" - name: Get Zuul cloned repos path in CI set_fact: zuul_src_path: "{{ lookup('env', 'ZUUL_SRC_PATH') }}" - name: Generate a list of required collections excluding user overridden collections set_fact: galaxy_collections_list : "{{ (galaxy_collections_list | default([])) + [ item ] }}" when: - item.name not in user_collection_names with_items: "{{ required_collections.collections }}" - name: Append user collections to filtered required collections set_fact: galaxy_collections_list: "{{ (galaxy_collections_list | default([])) + [ item ] }}" with_items: "{{ user_collections.collections }}" when: - user_collections.collections is defined - name: Check the Zuul src dir for cloned collections stat: path: "{{ zuul_src_path }}/{{ item.source.split('/')[2:] | join('/') | split('#') | first }}" get_attributes: no get_checksum: no get_mime: no register: zuul_collections with_items: "{{ galaxy_collections_list }}" - name: Override paths for zuul hosted collections in CI vars: zuul_item: name: "{{ item.item.name }}" source: "{{ zuul_src_path }}/{{ item.item.source.split('/')[2:] | join('/') | replace('#', '') }}" type: "dir" set_fact: galaxy_collections_list_ci: "{{ galaxy_collections_list_ci | default([]) + [ (item.stat.exists | ternary(zuul_item, item.item)) ] }}" with_items: "{{ zuul_collections.results }}" - name: Create temporary file for galaxy collection requirements tempfile: register: collection_requirements_tmpfile - name: Copy content into galaxy collection requirements temporary file vars: content_var: collections: "{{ galaxy_collections_list_ci }}" copy: content: "{{ content_var | to_nice_yaml }}" dest: "{{ collection_requirements_tmpfile.path }}" - name: Install collection requirements with ansible galaxy command: > /opt/ansible-runtime/bin/ansible-galaxy collection install --force -r "{{ collection_requirements_tmpfile.path }}" -p "{{ collection_path_default }}" register: collection_install until: collection_install is success retries: 5 delay: 2 - name: Show collection install output debug: msg="{{ collection_install.stdout.split('\n') }}" - name: Clean up temporary file file: path: "{{ collection_requirements_tmpfile.path }}" state: absent vars: collection_file: "{{ playbook_dir }}/../ansible-collection-requirements.yml" required_collections: "{{ lookup('file', collection_file) | from_yaml }}" collection_path_default: '/etc/ansible/' user_collection_file: 'user-collection-requirements.yml' user_collections: "{{ lookup('file', user_collections_path, errors='ignore')|default([], true) | from_yaml }}" user_collections_path: "{{ lookup('env', 'OSA_CONFIG_DIR') | default('/etc/openstack_deploy', true) ~ '/' ~ user_collection_file }}"