|
14 | 14 | os_version: '24.04' |
15 | 15 | os_distro: 'ubuntu' |
16 | 16 | os_purpose: 'generic' |
17 | | - cloud_name: "{{ lookup('env', 'OS_CLOUD'} | default('openstack') }}" |
| 17 | + cloud_name: "{{ lookup('env', 'OS_CLOUD') | default('openstack') }}" |
18 | 18 |
|
19 | 19 | tasks: |
20 | 20 | - name: Get available images matching os_distro and os_version |
|
25 | 25 | os_version: '{{ os_version }}' |
26 | 26 | register: _distro_images |
27 | 27 |
|
| 28 | + - name: 'Show images that match {{os_distro}} {{os_version}}' |
| 29 | + debug: |
| 30 | + msg: '{{ _distro_images.images | to_nice_json }}' |
| 31 | + |
28 | 32 | - name: 'First choice: Match os_purpose' |
29 | 33 | set_fact: |
30 | 34 | _primary_images: >- |
|
33 | 37 | | selectattr('properties.os_purpose', 'defined') |
34 | 38 | | selectattr('properties.os_purpose', 'equalto', os_purpose) |
35 | 39 | | list |
36 | | - | sort(attribute='created_at', reverse=true) |
37 | | - | sort(attribute='name', reverse=true) |
38 | 40 | }} |
39 | 41 |
|
40 | 42 | - name: 'Select primary image if found' |
41 | 43 | set_fact: |
42 | | - selected_image_id: '{{ _primary_images[0].id }}' |
43 | | - selected_image_name: '{{ _primary_images[0].name }}' |
44 | | - selected_image: '{{ _primary_images[0] }}' |
| 44 | + selected_image: >- |
| 45 | + {{ |
| 46 | + _primary_images |
| 47 | + | sort(attribute='created_at', reverse=true) |
| 48 | + | sort(attribute='name', reverse=true) |
| 49 | + | first |
| 50 | + }} |
45 | 51 | match_type: 'primary' |
46 | 52 | when: _primary_images | length > 0 |
47 | 53 |
|
48 | 54 | # Fallback logic - only executed if no primary match |
49 | | - - name: "Fallback 1: Filter images without os_purpose, matching name pattern '{{ os_distro }} {{ os_version }} {{ os_purpose }}'" |
50 | | - set_fact: |
51 | | - _fallback1_images: >- |
52 | | - {{ |
53 | | - _distro_images.images |
54 | | - | rejectattr('properties.os_purpose', 'defined') |
55 | | - | selectattr('name', 'match', '(?i)^.*' + os_distro | regex_escape + '\\s+' + os_version | regex_escape + '\\s+' + os_purpose | regex_escape + '.*$') |
56 | | - | list |
57 | | - | sort(attribute='created_at', reverse=true) |
58 | | - | sort(attribute='name', reverse=true) |
59 | | - }} |
| 55 | + - block: |
| 56 | + - name: 'Fallback 1 pattern' |
| 57 | + set_fact: |
| 58 | + _pattern1: "(?i){{ os_distro | regex_escape }}\\s+{{ os_version | regex_escape }}\\s+{{ os_purpose | regex_escape }}.*" |
| 59 | + - name: "Fallback 1: Filter images without os_purpose, matching name pattern '{{ os_distro }} {{ os_version }} {{ os_purpose }}'" |
| 60 | + set_fact: |
| 61 | + _fallback1_images: >- |
| 62 | + {{ |
| 63 | + _distro_images.images |
| 64 | + | rejectattr('properties.os_purpose', 'defined') |
| 65 | + | selectattr('name', 'search', _pattern1) |
| 66 | + | list |
| 67 | + }} |
| 68 | + - name: Select fallback 1 match if found |
| 69 | + set_fact: |
| 70 | + selected_image: >- |
| 71 | + {{ |
| 72 | + _fallback1_images |
| 73 | + | sort(attribute='created_at', reverse=true) |
| 74 | + | sort(attribute='name', reverse=true) |
| 75 | + | first |
| 76 | + }} |
| 77 | + match_type: 'fallback_pattern1' |
| 78 | + when: _fallback1_images | length > 0 |
60 | 79 | when: _primary_images | length == 0 |
61 | 80 |
|
62 | | - - name: Select fallback 1 match if found |
63 | | - set_fact: |
64 | | - selected_image_id: '{{ _fallback1_matches[0].id }}' |
65 | | - selected_image_name: '{{ _fallback1_matches[0].name }}' |
66 | | - selected_image: '{{ _fallback1_matches[0] }}' |
67 | | - match_type: 'fallback_pattern1' |
68 | | - when: |
69 | | - - _primary_images | length == 0 |
70 | | - - _fallback1_images | length > 0 |
71 | | - |
72 | | - - name: "Fallback 2: Filter images without os_purpose, matching name pattern '{{ os_distro }} {{ os_purpose }} {{ os_version }}'" |
73 | | - set_fact: |
74 | | - _fallback2_images: >- |
75 | | - {{ |
76 | | - _distro_images.images |
77 | | - | rejectattr('properties.os_purpose', 'defined') |
78 | | - | selectattr('name', 'match', '(?i)^.*' + os_distro | regex_escape + '\\s+' + os_purpose | regex_escape + '\\s+' + os_version | regex_escape + '.*$') |
79 | | - | list |
80 | | - | sort(attribute='created_at', reverse=true) |
81 | | - | sort(attribute='name', reverse=true) |
82 | | - }} |
| 81 | + - block: |
| 82 | + - name: 'Fallback 2 pattern' |
| 83 | + set_fact: |
| 84 | + _pattern2: "(?i){{ os_distro | regex_escape }}\\s+{{ os_purpose | regex_escape }}\\s+{{ os_version | regex_escape }}.*" |
| 85 | + - name: "Fallback 2: Filter images without os_purpose, matching name pattern '{{ os_distro }} {{ os_purpose }} {{ os_version }}'" |
| 86 | + set_fact: |
| 87 | + _fallback2_images: >- |
| 88 | + {{ |
| 89 | + _distro_images.images |
| 90 | + | rejectattr('properties.os_purpose', 'defined') |
| 91 | + | selectattr('name', 'search', _pattern2) |
| 92 | + | list |
| 93 | + }} |
| 94 | + - name: Select fallback 2 match if found |
| 95 | + set_fact: |
| 96 | + selected_image: >- |
| 97 | + {{ |
| 98 | + _fallback2_images |
| 99 | + | sort(attribute='created_at', reverse=true) |
| 100 | + | sort(attribute='name', reverse=true) |
| 101 | + | first |
| 102 | + }} |
| 103 | + match_type: 'fallback_pattern2' |
| 104 | + when: _fallback2_images | length > 0 |
83 | 105 | when: |
84 | 106 | - _primary_images | length == 0 |
85 | 107 | - _fallback1_images | default([]) | length == 0 |
86 | 108 |
|
87 | | - - name: Select fallback 2 match if found |
88 | | - set_fact: |
89 | | - selected_image_id: '{{ _fallback2_matches[0].id }}' |
90 | | - selected_image_name: '{{ _fallback2_matches[0].name }}' |
91 | | - selected_image: '{{ _fallback2_matches[0] }}' |
92 | | - match_type: 'fallback_pattern2' |
93 | | - when: |
94 | | - - _primary_images | length == 0 |
95 | | - - _fallback1_images | default([]) | length == 0 |
96 | | - - _fallback2_images | length > 0 |
97 | | - |
98 | | - - name: "Fallback 3: Filter images without os_purpose, matching name pattern '{{ os_distro }} {{ os_version }}'" |
99 | | - set_fact: |
100 | | - _fallback3_images: >- |
101 | | - {{ |
102 | | - _distro_images.images |
103 | | - | rejectattr('properties.os_purpose', 'defined') |
104 | | - | selectattr('name', 'match', '(?i)^.*' + os_distro | regex_escape + '\\s+' + os_version | regex_escape + '.*$') |
105 | | - | list |
106 | | - | sort(attribute='created_at', reverse=true) |
107 | | - | sort(attribute='name', reverse=true) |
108 | | - }} |
109 | | - when: |
110 | | - - _primary_images | length == 0 |
111 | | - - _fallback1_images | default([]) | length == 0 |
112 | | - - _fallback2_images | default([]) | length == 0 |
113 | | - |
114 | | - - name: Select fallback 3 match if found |
115 | | - set_fact: |
116 | | - selected_image_id: '{{ _fallback3_matches[0].id }}' |
117 | | - selected_image_name: '{{ _fallback3_matches[0].name }}' |
118 | | - selected_image: '{{ _fallback3_matches[0] }}' |
119 | | - match_type: 'fallback_pattern3' |
| 109 | + - block: |
| 110 | + - name: 'Fallback 3 pattern' |
| 111 | + set_fact: |
| 112 | + _pattern3: "(?i){{ os_distro | regex_escape }}\\s+{{ os_version | regex_escape }}.*" |
| 113 | + - name: "Fallback 3: Filter images without os_purpose, matching name pattern '{{ os_distro }} {{ os_version }}'" |
| 114 | + set_fact: |
| 115 | + _fallback3_images: >- |
| 116 | + {{ |
| 117 | + _distro_images.images |
| 118 | + | rejectattr('properties.os_purpose', 'defined') |
| 119 | + | selectattr('name', 'search', _pattern3) |
| 120 | + | list |
| 121 | + }} |
| 122 | + - name: Select fallback 3 match if found |
| 123 | + set_fact: |
| 124 | + selected_image: >- |
| 125 | + {{ |
| 126 | + _fallback3_images |
| 127 | + | sort(attribute='created_at', reverse=true) |
| 128 | + | sort(attribute='name', reverse=true) |
| 129 | + | first |
| 130 | + }} |
| 131 | + match_type: 'fallback_pattern3' |
| 132 | + when: _fallback3_images | length > 0 |
120 | 133 | when: |
121 | 134 | - _primary_images | length == 0 |
122 | 135 | - _fallback1_images | default([]) | length == 0 |
123 | 136 | - _fallback2_images | default([]) | length == 0 |
124 | | - - _fallback3_images | length > 0 |
125 | 137 |
|
126 | 138 | - name: Display selected image |
127 | 139 | debug: |
128 | 140 | msg: |
129 | 141 | - 'Match Type: {{ match_type }}' |
130 | | - - 'Image Name: {{ selected_image_name }}' |
131 | | - - 'Image ID: {{ selected_image_id }}' |
| 142 | + - 'Image Name: {{ selected_image.name }}' |
| 143 | + - 'Image ID: {{ selected_image.id }}' |
132 | 144 | - 'Created: {{ selected_image.created_at }}' |
133 | 145 | - 'Properties: {{ selected_image.properties }}' |
134 | 146 | when: selected_image is defined |
|
0 commit comments