Skip to content

Commit c53b9cc

Browse files
committed
mirror_ocp_release: fixes for concurrent jobs
1 parent bc73091 commit c53b9cc

File tree

7 files changed

+78
-60
lines changed

7 files changed

+78
-60
lines changed

roles/mirror_ocp_release/tasks/artifacts.yml

+37-18
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,52 @@
77
when:
88
- not mor_force
99

10+
- name: Create temporary working directory
11+
ansible.builtin.tempfile:
12+
state: directory
13+
prefix: mor-
14+
register: _mor_tmp
15+
notify: "Remove temporary directory"
16+
when: mor_force or not _mor_target.stat.exists
17+
1018
- name: "Extract the OCP installer and metadata"
1119
when:
1220
- mor_force or not _mor_target.stat.exists
1321
block:
14-
- name: "Extract installer and metadata from release image"
15-
ansible.builtin.shell: >
16-
flock -x {{ mor_cache_dir }}/{{ mor_version }}/release_extract.lock -c '
17-
set -e;
22+
- name: "Extract installer from release image"
23+
ansible.builtin.command: >
1824
{{ mor_oc }} adm release extract
1925
--registry-config {{ mor_auths_file }}
2026
--command={{ mor_installer }}
2127
--from {{ mor_pull_url }}
22-
--to "{{ mor_cache_dir }}/{{ mor_version }}";
28+
--to "{{ _mor_tmp.path }}"
29+
register: _mor_extract_res
30+
retries: 9
31+
delay: 10
32+
until: _mor_extract_res is not failed
33+
changed_when: _mor_extract_res.rc == 0
34+
35+
- name: "Extract metadata from release image"
36+
ansible.builtin.command: >
2337
{{ mor_oc }} adm release extract
2438
--registry-config {{ mor_auths_file }}
2539
--tools
2640
--from {{ mor_pull_url }}
27-
--to "{{ mor_cache_dir }}/{{ mor_version }}"'
41+
--to "{{ _mor_tmp.path }}"
2842
register: _mor_extract_res
2943
retries: 9
3044
delay: 10
3145
until: _mor_extract_res is not failed
32-
changed_when: false
46+
changed_when: _mor_extract_res.rc == 0
3347

3448
- name: "Extract rhcos.json if version >= 4.8"
3549
when:
3650
- mor_version is version("4.8", ">=")
3751
ansible.builtin.shell: >
38-
flock -x "{{ mor_cache_dir }}/{{ mor_version }}/release_extract.lock" -c '{
39-
"{{ mor_cache_dir }}/{{ mor_version }}/{{ mor_installer }}" coreos print-stream-json >
40-
"{{ mor_cache_dir }}/{{ mor_version }}/rhcos.json";
41-
}'
52+
"{{ _mor_tmp.path }}/{{ mor_installer }}" coreos print-stream-json >
53+
"{{ _mor_tmp.path }}/rhcos.json"
54+
args:
55+
creates: "{{ _mor_tmp.path }}/rhcos.json"
4256

4357
- name: "Download rhcos.json (< 4.8)"
4458
when:
@@ -47,7 +61,7 @@
4761
- name: "Get Git SHA from installer"
4862
ansible.builtin.shell: >
4963
set -e -o pipefail;
50-
{{ mor_cache_dir }}/{{ mor_version }}/openshift-baremetal-install version |
64+
{{ _mor_tmp.path }}/openshift-baremetal-install version |
5165
grep "^built from" |
5266
awk '{ print $NF }'
5367
register: _mor_commit_id
@@ -57,7 +71,7 @@
5771
ansible.builtin.include_tasks: fetch.yml
5872
vars:
5973
mor_uri: "https://raw.githubusercontent.com/openshift/installer/{{ _mor_commit_id.stdout }}/data/data/rhcos.json"
60-
mor_dir: "{{ mor_cache_dir }}/{{ mor_version }}"
74+
mor_dir: "{{ _mor_tmp.path }}"
6175

6276
- name: "Figure out status of SELinux"
6377
ansible.builtin.command: /usr/sbin/selinuxenabled
@@ -66,8 +80,8 @@
6680
changed_when: false
6781

6882
- name: Apply SELinux container file context to extracted files
69-
ansible.builtin.sefcontext:
70-
target: "{{ mor_cache_dir }}/{{ mor_version }}"
83+
community.general.sefcontext:
84+
target: "{{ _mor_tmp.path }}"
7185
setype: container_file_t
7286
become: true
7387
register: _mor_cache_secontext
@@ -79,7 +93,7 @@
7993

8094
- name: "Make installer command readable from HTTP"
8195
ansible.builtin.file:
82-
path: "{{ mor_cache_dir }}/{{ mor_version }}/{{ mor_installer }}"
96+
path: "{{ _mor_tmp.path }}/{{ mor_installer }}"
8397
state: file
8498
owner: "{{ mor_owner }}"
8599
group: "{{ mor_group }}"
@@ -90,9 +104,14 @@
90104
delay: 5
91105
until: _mor_install_mode is not failed
92106

107+
- name: Copy artifacts to release directory
108+
ansible.builtin.copy:
109+
src: "{{ _mor_tmp.path }}/"
110+
dest: "{{ mor_cache_dir }}/{{ mor_version }}/"
111+
mode: preserve
93112
always:
94-
- name: "Ensure lock file is removed"
113+
- name: Remove temporary directory
95114
ansible.builtin.file:
96-
path: "{{ mor_cache_dir }}/{{ mor_version }}/release_extract.lock"
115+
path: "{{ _mor_tmp.path }}"
97116
state: absent
98117
...

roles/mirror_ocp_release/tasks/facts.yml

+20-12
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,23 @@
1313
mor_release_image: "{{ _mor_release_content.content | b64decode | regex_search('(?<=^Pull From: )(.*)$', multiline=true) }}"
1414

1515
- name: "Read the contents of rhcos.json"
16-
ansible.builtin.command: "cat {{ mor_cache_dir }}/{{ mor_version }}/rhcos.json"
17-
register: rhcos
16+
ansible.builtin.slurp:
17+
src: "{{ mor_cache_dir }}/{{ mor_version }}/rhcos.json"
18+
register: _mor_rhcos
1819
no_log: true
1920
retries: 6
2021
delay: 10
21-
until: rhcos is not failed
22+
until: _mor_rhcos is not failed
2223

2324
- name: "Set image facts"
2425
ansible.builtin.set_fact:
25-
ocp_release_data:
26+
mor_ocp_release_data:
2627
container_image: "{{ mor_release_image }}"
27-
rhcos_version: "{{ rhcos.stdout | from_json | json_query('architectures.x86_64.artifacts.metal.release') }}"
28-
rhcos_images: "{{ ocp_release_data['rhcos_images'] | default({}) | combine({item.key: (rhcos.stdout | from_json | json_query('architectures.x86_64.artifacts.' + item.path))}) }}"
28+
rhcos_version: "{{ rhcos_json | json_query('architectures.x86_64.artifacts.metal.release') }}"
29+
rhcos_images: "{{ mor_ocp_release_data['rhcos_images'] | default({}) | combine({item.key: (rhcos_json | json_query(arch_query))}) }}"
30+
vars:
31+
rhcos_json: "{{ _mor_rhcos.content | b64decode | from_json }}"
32+
arch_query: "architectures.x86_64.artifacts.{{ item.path }}"
2933
with_items:
3034
- {'key': 'aws_location', 'path': 'aws.formats."vmdk.gz".disk.location'}
3135
- {'key': 'aws_sha256', 'path': 'aws.formats."vmdk.gz".disk.sha256'}
@@ -60,13 +64,15 @@
6064
# TODO: Remove this task when 4.7 is no longer supported
6165
- name: "Set image facts (< 4.8)"
6266
vars:
63-
rhcos_ver: "{{ rhcos.stdout | from_json | json_query('buildid') }}"
67+
rhcos_json: "{{ _mor_rhcos.content | b64decode | from_json }}"
68+
rhcos_ver: "{{ rhcos_json | json_query('buildid') }}"
6469
base_uri: "https://rhcos.mirror.openshift.com/art/storage/releases/rhcos-{{ mor_base_version }}/{{ rhcos_ver }}/x86_64/"
70+
add_item: "{{ {item.key: (item.baseURI | default('')) + (rhcos_json | json_query('images.' + item.path))} }}"
6571
ansible.builtin.set_fact:
66-
ocp_release_data:
72+
mor_ocp_release_data:
6773
container_image: "{{ mor_release_image }}"
6874
rhcos_version: "{{ rhcos_ver }}"
69-
rhcos_images: "{{ ocp_release_data['rhcos_images'] | default({}) | combine({item.key: (item.baseURI | default('')) + (rhcos.stdout | from_json | json_query('images.' + item.path))}) }}"
75+
rhcos_images: "{{ mor_ocp_release_data['rhcos_images'] | default({}) | combine(add_item) }}"
7076
with_items:
7177
- {'key': 'aws_location', 'baseURI': "{{ base_uri }}", 'path': 'aws.path'}
7278
- {'key': 'aws_sha256', 'path': 'aws.sha256'}
@@ -103,9 +109,11 @@
103109
# TODO: remove for releases >= 4.8
104110
- name: "Set facts for *osimage URL overrides"
105111
ansible.builtin.set_fact:
106-
bootstraposimage: "{{ mor_webserver_url }}/{{ ocp_release_data['rhcos_images']['qemu_location'] | basename }}?sha256={{ ocp_release_data['rhcos_images']['qemu_uncompressed_sha256'] }}"
107-
clusterosimage: "{{ mor_webserver_url }}/{{ ocp_release_data['rhcos_images']['openstack_location'] | basename }}?sha256={{ ocp_release_data['rhcos_images']['openstack_sha256'] }}"
108-
metalosimage: "{{ mor_webserver_url }}/{{ ocp_release_data['rhcos_images']['metal_iso_location'] | basename }}?sha256={{ ocp_release_data['rhcos_images']['metal_iso_sha256'] }}"
112+
bootstraposimage: "{{ mor_webserver_url }}/{{ rhcos_images['qemu_location'] | basename }}?sha256={{ rhcos_images['qemu_uncompressed_sha256'] }}"
113+
clusterosimage: "{{ mor_webserver_url }}/{{ rhcos_images['openstack_location'] | basename }}?sha256={{ rhcos_images['openstack_sha256'] }}"
114+
metalosimage: "{{ mor_webserver_url }}/{{ rhcos_images['metal_iso_location'] | basename }}?sha256={{ rhcos_images['metal_iso_sha256'] }}"
115+
vars:
116+
rhcos_images: "{{ mor_ocp_release_data['rhcos_images'] }}"
109117
when:
110118
- mor_write_custom_config | bool
111119
...

roles/mirror_ocp_release/tasks/fetch.yml

+4-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,4 @@
11
---
2-
- name: "Check if target file exists"
3-
ansible.builtin.stat:
4-
path: "{{ mor_dir }}/{{ mor_uri | basename }}"
5-
get_checksum: false
6-
register: target
7-
when:
8-
- not mor_force
9-
102
- name: "Fetch file from URL"
113
ansible.builtin.get_url:
124
url: "{{ mor_uri }}"
@@ -20,8 +12,8 @@
2012
become: true
2113
retries: 3
2214
delay: 10
23-
register: downloaded
24-
until: downloaded is not failed
15+
register: _mor_downloaded
16+
until: _mor_downloaded is not failed
2517
when:
2618
- mor_force or not target.stat.exists
2719

@@ -35,4 +27,6 @@
3527
ansible.builtin.command: /usr/sbin/restorecon -R "{{ mor_dir }}/{{ mor_uri | basename }}"
3628
become: true
3729
when: _mor_selinux.rc == 0
30+
register: _mor_restorecon
31+
changed_when: _mor_restorecon.rc == 0
3832
...

roles/mirror_ocp_release/tasks/files.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
become: true
1414
retries: 10
1515
delay: 20
16-
register: downloaded
17-
until: downloaded is not failed
16+
register: _mor_downloaded
17+
until: _mor_downloaded is not failed
1818
...

roles/mirror_ocp_release/tasks/images.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
- name: "Mirror Disk Images for the install type"
33
ansible.builtin.include_tasks: fetch.yml
44
vars:
5-
mor_uri: "{{ ocp_release_data['rhcos_images'][item + '_location'] }}"
6-
mor_checksum: "sha256:{{ ocp_release_data['rhcos_images'][item + '_sha256'] }}"
5+
mor_uri: "{{ mor_ocp_release_data['rhcos_images'][item + '_location'] }}"
6+
mor_checksum: "sha256:{{ mor_ocp_release_data['rhcos_images'][item + '_sha256'] }}"
77
mor_dir: "{{ mor_cache_dir }}"
88
loop: "{{ mor_images }}"
99
...

roles/mirror_ocp_release/tasks/main.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
ansible.builtin.stat:
1313
path: "{{ mor_auths_file }}"
1414
get_checksum: false
15-
register: mor_auths_file_check
15+
register: _mor_auths_file_check
1616
when:
1717
- mor_auths_file is defined
1818

1919
- name: "Validate optional authentication file"
2020
ansible.builtin.assert:
2121
that:
2222
- mor_auths_file is defined
23-
- mor_auths_file_check.stat.exists | bool
23+
- _mor_auths_file_check.stat.exists | bool
2424
when:
2525
- mor_mirror_container_images | bool
2626

roles/mirror_ocp_release/tasks/registry.yml

+11-14
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,22 @@
33
ansible.builtin.command: >
44
skopeo inspect
55
--no-tags
6-
--authfile {{ mor_auths_file }}
7-
{%- if mor_allow_insecure_registry | bool %}
8-
--tls-verify=false
9-
{%- endif %}
6+
--authfile {{ mor_auths_file }}{%- if mor_allow_insecure_registry | bool %}
7+
--tls-verify=false{%- endif %}
108
docker://{{ mor_registry_url }}/{{ mor_registry_path }}:{{ mor_version }}
119
register: _mor_release_image
10+
changed_when: _mor_release_image.rc == 0
1211
failed_when: false
1312
when: not mor_force | bool
1413

1514
- name: Mirror release images to local registry
1615
ansible.builtin.command: >-
1716
{{ mor_oc }} adm release mirror
1817
--registry-config={{ mor_auths_file }}
19-
--from={{ ocp_release_data['container_image'] | quote }}
18+
--from={{ mor_ocp_release_data['container_image'] | quote }}
2019
--to-release-image={{ mor_registry_url }}/{{ mor_registry_path }}:{{ mor_version }}
21-
--to={{ mor_registry_url }}/{{ mor_registry_path }}
22-
{%- if mor_allow_insecure_registry | bool %}
23-
--insecure
24-
{%- endif %}
20+
--to={{ mor_registry_url }}/{{ mor_registry_path }}{%- if mor_allow_insecure_registry | bool %}
21+
--insecure{%- endif %}
2522
retries: 3
2623
delay: 10
2724
register: _mor_result
@@ -37,13 +34,13 @@
3734
ansible.builtin.command: >-
3835
{{ mor_oc }} adm release mirror
3936
--registry-config={{ mor_auths_file }}
40-
--from={{ ocp_release_data['container_image'] | quote }}
37+
--from={{ mor_ocp_release_data['container_image'] | quote }}
4138
--to-release-image={{ mor_registry_url }}/{{ mor_registry_path }}:{{ mor_version }}
4239
--to={{ mor_registry_url }}/{{ mor_registry_path }}
43-
{{ mor_version is version("4.14", "<") | ternary("--dry-run", "--print-mirror-instructions=" + mor_is_type | lower ) }}
44-
{%- if mor_allow_insecure_registry | bool %}
45-
--insecure
46-
{%- endif %}
40+
{{ mor_version is version("4.14", "<") | ternary("--dry-run", mirror_instructions) }}{%- if mor_allow_insecure_registry | bool %}
41+
--insecure{%- endif %}
42+
vars:
43+
mirror_instructions: "--print-mirror-instructions= {{ mor_is_type | lower }}"
4744
retries: 3
4845
delay: 10
4946
register: _mor_result

0 commit comments

Comments
 (0)