|
123 | 123 | status_code: 200 |
124 | 124 | register: available_hosts |
125 | 125 |
|
| 126 | + - name: Get available hosts per preferred model |
| 127 | + when: |
| 128 | + - schedule_servers is not defined |
| 129 | + - not list_servers_only | default(false) |
| 130 | + - not list_active_only | default(false) |
| 131 | + - preferred_models is defined |
| 132 | + - preferred_models is not string |
| 133 | + ansible.builtin.uri: |
| 134 | + url: "{{ base_api_url }}/available?can_self_schedule=true&model={{ item | upper }}" |
| 135 | + method: GET |
| 136 | + headers: |
| 137 | + Authorization: "Bearer {{ quads_token }}" |
| 138 | + validate_certs: false |
| 139 | + status_code: 200 |
| 140 | + loop: "{{ preferred_models if preferred_models is not string else [] }}" |
| 141 | + loop_control: |
| 142 | + label: "{{ item }}" |
| 143 | + register: available_by_model |
| 144 | + |
126 | 145 | - name: Display available server hostnames and exit |
127 | 146 | when: list_servers_only | default(false) |
128 | 147 | block: |
|
145 | 164 | msg: "Found {{ available_hosts.json | length }} hosts available for self-scheduling." |
146 | 165 | when: available_hosts.json is sequence |
147 | 166 | changed_when: false |
148 | | - - name: Assert that available hosts were found |
149 | | - ansible.builtin.assert: |
150 | | - that: |
151 | | - - available_hosts.json is sequence |
152 | | - - available_hosts.json | length >= (num_hosts | default(1) | int) |
153 | | - fail_msg: >- |
154 | | - Could not find enough available hosts. |
155 | | - Found {{ available_hosts.json | length }}, but need {{ num_hosts | default(1) }}. |
156 | | - Please try again later. |
| 167 | + |
| 168 | + - name: Select hosts by model preference order |
| 169 | + when: |
| 170 | + - preferred_models is defined |
| 171 | + - preferred_models is not string |
| 172 | + - available_by_model is defined |
| 173 | + ansible.builtin.set_fact: |
| 174 | + hosts_to_schedule: "{{ selected | map('community.general.dict_kv', 'name') }}" |
| 175 | + vars: |
| 176 | + needed: "{{ num_hosts | default(1) | int }}" |
| 177 | + selected: >- |
| 178 | + {%- set result = [] -%} |
| 179 | + {%- for model_result in available_by_model.results -%} |
| 180 | + {%- if result | length < needed | int -%} |
| 181 | + {%- for host in model_result.json -%} |
| 182 | + {%- if result | length < needed | int and host not in result -%} |
| 183 | + {%- set _ = result.append(host) -%} |
| 184 | + {%- endif -%} |
| 185 | + {%- endfor -%} |
| 186 | + {%- endif -%} |
| 187 | + {%- endfor -%} |
| 188 | + {{ result }} |
157 | 189 | changed_when: false |
158 | | - - name: Select the first available hosts |
| 190 | + |
| 191 | + - name: Display model selection results |
| 192 | + when: |
| 193 | + - preferred_models is defined |
| 194 | + - preferred_models is not string |
| 195 | + - hosts_to_schedule is defined |
| 196 | + vars: |
| 197 | + selected_hosts_info: >- |
| 198 | + {%- set lines = [] -%} |
| 199 | + {%- for model_result in available_by_model.results -%} |
| 200 | + {%- for h in hosts_to_schedule -%} |
| 201 | + {%- if h.name in model_result.json -%} |
| 202 | + {%- set _ = lines.append(h.name ~ ' (model: ' ~ model_result.item ~ ')') -%} |
| 203 | + {%- endif -%} |
| 204 | + {%- endfor -%} |
| 205 | + {%- endfor -%} |
| 206 | + {{ lines }} |
| 207 | + ansible.builtin.debug: |
| 208 | + msg: "{{ ['Selected ' ~ hosts_to_schedule | length ~ ' host(s) by model preference:'] + selected_hosts_info }}" |
| 209 | + changed_when: false |
| 210 | + |
| 211 | + - name: Select first available hosts (no model preference) |
| 212 | + when: preferred_models is not defined or preferred_models is string |
159 | 213 | ansible.builtin.set_fact: |
160 | 214 | hosts_to_schedule: "{{ selected_hostnames | map('community.general.dict_kv', 'name') }}" |
161 | 215 | vars: |
162 | 216 | selected_hostnames: "{{ available_hosts.json[: (num_hosts | default(1) | int)] }}" |
163 | 217 | changed_when: false |
164 | 218 |
|
| 219 | + - name: Assert that enough hosts were selected |
| 220 | + ansible.builtin.assert: |
| 221 | + that: |
| 222 | + - hosts_to_schedule is defined |
| 223 | + - hosts_to_schedule | length >= (num_hosts | default(1) | int) |
| 224 | + fail_msg: >- |
| 225 | + Could not find enough available hosts matching preferences. |
| 226 | + Selected {{ hosts_to_schedule | length | default(0) }}, |
| 227 | + but need {{ num_hosts | default(1) }}. |
| 228 | + {% if preferred_models is defined and preferred_models is not string %} |
| 229 | + Preferred models tried: {{ preferred_models | join(', ') }}. |
| 230 | + {% endif %} |
| 231 | + Please try again later or adjust preferred_models. |
| 232 | + changed_when: false |
| 233 | + |
165 | 234 | - name: Attempt to create a new assignment |
166 | 235 | ansible.builtin.uri: |
167 | 236 | url: "{{ base_api_url }}/assignments/self" |
|
0 commit comments