Optimize generation of required roles/collections
Instead of running set_fact in cycle which consumes significant amount of output and time to execute, patch moves roles and collections generation process into a simplier Jinja statements which are easier to asses and quicker to execute. Change-Id: I943a608c56a68b32f5ee8d47b10596f35393cae5
This commit is contained in:

committed by
Dmitriy Rabotyagov

parent
bc517cfcc5
commit
756618d250
@@ -25,26 +25,7 @@
|
|||||||
state: directory
|
state: directory
|
||||||
recurse: yes
|
recurse: yes
|
||||||
|
|
||||||
- name: Read the list of user collections
|
- name: Installing required Ansible collections
|
||||||
set_fact:
|
|
||||||
user_collection_names: "{{ user_collections.collections | default([]) | map(attribute='name') | list }}"
|
|
||||||
|
|
||||||
- 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
|
|
||||||
- "'source' in item"
|
|
||||||
|
|
||||||
- name: Installing resulting collection list
|
|
||||||
block:
|
block:
|
||||||
- name: Create temporary file for galaxy collection requirements
|
- name: Create temporary file for galaxy collection requirements
|
||||||
tempfile:
|
tempfile:
|
||||||
@@ -52,14 +33,17 @@
|
|||||||
|
|
||||||
- name: Copy content into galaxy collection requirements temporary file
|
- name: Copy content into galaxy collection requirements temporary file
|
||||||
vars:
|
vars:
|
||||||
|
_user_collection_names: "{{ user_collections.collections | default([]) | map(attribute='name') }}"
|
||||||
|
_default_collections: "{{ required_collections.collections | rejectattr('name', 'in', _user_collection_names) }}"
|
||||||
|
_user_collections: "{{ user_collections.collections | default([]) | selectattr('source', 'defined') }}"
|
||||||
content_var:
|
content_var:
|
||||||
collections: "{{ galaxy_collections_list }}"
|
collections: "{{ _default_collections + _user_collections }}"
|
||||||
copy:
|
copy:
|
||||||
content: "{{ content_var | to_nice_yaml }}"
|
content: "{{ content_var | to_nice_yaml }}"
|
||||||
dest: "{{ collection_requirements_tmpfile.path }}"
|
dest: "{{ collection_requirements_tmpfile.path }}"
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
|
|
||||||
- name: Install collection requirements with ansible galaxy
|
- name: Install collection requirements with ansible galaxy # noqa: no-changed-when
|
||||||
command: >
|
command: >
|
||||||
/opt/ansible-runtime/bin/ansible-galaxy collection install --force
|
/opt/ansible-runtime/bin/ansible-galaxy collection install --force
|
||||||
-r "{{ collection_requirements_tmpfile.path }}"
|
-r "{{ collection_requirements_tmpfile.path }}"
|
||||||
@@ -71,7 +55,7 @@
|
|||||||
|
|
||||||
- name: Show collection install output
|
- name: Show collection install output
|
||||||
debug:
|
debug:
|
||||||
msg: "{{ collection_install.stdout.split('\n') }}"
|
msg: "{{ collection_install.stdout_lines }}"
|
||||||
|
|
||||||
always:
|
always:
|
||||||
- name: Clean up temporary file
|
- name: Clean up temporary file
|
||||||
@@ -84,5 +68,5 @@
|
|||||||
required_collections: "{{ lookup('file', collection_file) | from_yaml }}"
|
required_collections: "{{ lookup('file', collection_file) | from_yaml }}"
|
||||||
collection_path_default: '/etc/ansible/'
|
collection_path_default: '/etc/ansible/'
|
||||||
user_collection_file: 'user-collection-requirements.yml'
|
user_collection_file: 'user-collection-requirements.yml'
|
||||||
user_collections: "{{ lookup('file', user_collections_path, errors='ignore')|default([], true) | from_yaml }}"
|
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 }}"
|
user_collections_path: "{{ lookup('env', 'OSA_CONFIG_DIR') | default('/etc/openstack_deploy', true) ~ '/' ~ user_collection_file }}"
|
||||||
|
@@ -37,6 +37,14 @@
|
|||||||
name: http.https://opendev.org/.userAgent
|
name: http.https://opendev.org/.userAgent
|
||||||
value: "{{ 'git/' ~ _git_version.stdout.split(' ')[2] ~ ' (osa/' ~ lookup('env', 'CURRENT_OSA_VERSION') ~ '/deploy)' }}"
|
value: "{{ 'git/' ~ _git_version.stdout.split(' ')[2] ~ ' (osa/' ~ lookup('env', 'CURRENT_OSA_VERSION') ~ '/deploy)' }}"
|
||||||
|
|
||||||
|
- name: Generate a list of roles to clone
|
||||||
|
vars:
|
||||||
|
_default_roles: "{{ required_roles | rejectattr('name', 'in', user_roles | map(attribute='name')) }}"
|
||||||
|
_user_roles_filtered: "{{ user_roles | rejectattr('src', 'undefined') }}"
|
||||||
|
_role_list: "{{ _default_roles + _user_roles_filtered }}"
|
||||||
|
set_fact:
|
||||||
|
clone_roles: "{{ _role_list | selectattr('scm', 'undefined') + _role_list | selectattr('scm', 'eq', 'git') }}"
|
||||||
|
|
||||||
- name: Remove target directory if required
|
- name: Remove target directory if required
|
||||||
file:
|
file:
|
||||||
path: "{{ item.path | default(role_path_default) }}/{{ item.name | default(item.src | basename) }}"
|
path: "{{ item.path | default(role_path_default) }}/{{ item.name | default(item.src | basename) }}"
|
||||||
@@ -44,7 +52,7 @@
|
|||||||
when:
|
when:
|
||||||
- ((item.path | default(role_path_default) ~ '/' ~ item.name | default(item.src | basename) ~ '/.git') is not directory) or
|
- ((item.path | default(role_path_default) ~ '/' ~ item.name | default(item.src | basename) ~ '/.git') is not directory) or
|
||||||
(lookup('env', 'DROP_ROLE_DIRS') | bool is true)
|
(lookup('env', 'DROP_ROLE_DIRS') | bool is true)
|
||||||
with_items: "{{ required_roles }}"
|
with_items: "{{ clone_roles }}"
|
||||||
|
|
||||||
- name: Ensure the default roles directory exists
|
- name: Ensure the default roles directory exists
|
||||||
file:
|
file:
|
||||||
@@ -52,22 +60,6 @@
|
|||||||
state: directory
|
state: directory
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
|
||||||
- name: Generate a list of user overridden roles
|
|
||||||
set_fact:
|
|
||||||
user_overridden_roles: "{{ user_roles | json_query('[*].name') }}"
|
|
||||||
|
|
||||||
- name: Generate a list of roles excluding user overridden roles
|
|
||||||
set_fact:
|
|
||||||
clone_roles: "{{ (clone_roles | default([])) + [item] }}"
|
|
||||||
when:
|
|
||||||
- item.scm == "git" or item.scm is undefined
|
|
||||||
- item.name not in user_overridden_roles
|
|
||||||
with_items: "{{ required_roles }}"
|
|
||||||
|
|
||||||
- name: Append user overridden roles
|
|
||||||
set_fact:
|
|
||||||
clone_roles: "{{ (clone_roles | default([])) + user_roles | rejectattr('src', 'undefined') }}"
|
|
||||||
|
|
||||||
- name: Clone git repos
|
- name: Clone git repos
|
||||||
block:
|
block:
|
||||||
- name: Clone git repos (parallel)
|
- name: Clone git repos (parallel)
|
||||||
|
Reference in New Issue
Block a user