Skip to content

Commit 8da9228

Browse files
committed
implement preferred_models support for host selection
Query the QUADS /available endpoint per preferred model to select hosts in order of model preference. Falls back to first-available when preferred_models is set to "all" or undefined.
1 parent ffa22f1 commit 8da9228

1 file changed

Lines changed: 79 additions & 10 deletions

File tree

quads_self_schedule.yml

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,25 @@
123123
status_code: 200
124124
register: available_hosts
125125

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+
126145
- name: Display available server hostnames and exit
127146
when: list_servers_only | default(false)
128147
block:
@@ -145,23 +164,73 @@
145164
msg: "Found {{ available_hosts.json | length }} hosts available for self-scheduling."
146165
when: available_hosts.json is sequence
147166
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 }}
157189
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
159213
ansible.builtin.set_fact:
160214
hosts_to_schedule: "{{ selected_hostnames | map('community.general.dict_kv', 'name') }}"
161215
vars:
162216
selected_hostnames: "{{ available_hosts.json[: (num_hosts | default(1) | int)] }}"
163217
changed_when: false
164218

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+
165234
- name: Attempt to create a new assignment
166235
ansible.builtin.uri:
167236
url: "{{ base_api_url }}/assignments/self"

0 commit comments

Comments
 (0)