From c258f5183abafc0ec6c66258753a98273497697e Mon Sep 17 00:00:00 2001 From: pavel Date: Fri, 13 Feb 2026 09:33:39 +0200 Subject: [PATCH] 0933 --- .../afterupgrade_indoor_check.yml | 248 ++++++++++++++++++ 1 file changed, 248 insertions(+) diff --git a/files/ansible-playbooks/afterupgrade_indoor_check.yml b/files/ansible-playbooks/afterupgrade_indoor_check.yml index 7ed2af9..7b9bb2e 100644 --- a/files/ansible-playbooks/afterupgrade_indoor_check.yml +++ b/files/ansible-playbooks/afterupgrade_indoor_check.yml @@ -370,6 +370,14 @@ effective_max_attempts: "{{ (max_attempts | default(3)) | int }}" correlation_id: "{{ correlation_id | default('') }}" original_emitted_at: "{{ original_emitted_at | default('') }}" + is_run_by_effective: "{{ is_run_by | default('manual') }}" + + + - name: Debug is_run_by mode + ansible.builtin.debug: + msg: + - "is_run_by={{ is_run_by | default('UNSET') }}" + - "is_run_by_effective={{ is_run_by_effective }}" - name: Compute read_ok flag based on firmware readout delegate_to: localhost @@ -641,6 +649,190 @@ register: rmq_customfield_fw changed_when: (rmq_customfield_fw.json is defined) and (rmq_customfield_fw.json.routed | default(false) | bool) + - name: Success publish action_state done + when: journal_success_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_state', 'task_result': 'done' } | to_json }}" + payload_encoding: "string" + changed_when: false + + - name: Success pause before NetBox wrapup custom fields + ansible.builtin.pause: + seconds: 1 + delegate_to: localhost + changed_when: false + when: journal_success_payload is defined + + - name: Success clear action_restart_timestamp + when: journal_success_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_restart_timestamp', 'task_result': '' } | to_json }}" + payload_encoding: "string" + changed_when: false + + - name: Success pause before NetBox wrapup custom fields + ansible.builtin.pause: + seconds: 1 + delegate_to: localhost + changed_when: false + when: journal_success_payload is defined + + - name: Success clear action_next + when: journal_success_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_next', 'task_result': '' } | to_json }}" + payload_encoding: "string" + changed_when: false + + - name: Success pause before NetBox wrapup custom fields + ansible.builtin.pause: + seconds: 1 + delegate_to: localhost + changed_when: false + when: journal_success_payload is defined + + - name: Success clear action_next_timestamp + when: journal_success_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_next_timestamp', 'task_result': '' } | to_json }}" + payload_encoding: "string" + changed_when: false + + - name: Success pause before NetBox wrapup custom fields + ansible.builtin.pause: + seconds: 3 + delegate_to: localhost + changed_when: false + when: journal_success_payload is defined + + - name: Build cleanup control payload update_cleanup_success + when: journal_success_payload is defined + delegate_to: localhost + ansible.builtin.set_fact: + control_cleanup_payload: + inscope_device: "{{ ansible_hostname | default(inventory_hostname) }}" + task_name: "update_cleanup_success" + + - name: Publish cleanup control message to control queue + when: control_cleanup_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ control_cleanup_payload | to_json }}" + payload_encoding: "string" + register: rmq_cleanup_success + changed_when: (rmq_cleanup_success.json is defined) and (rmq_cleanup_success.json.routed | default(false) | bool) + + - name: Scheduled success set action_next to sot-updater-wrapper + when: journal_success_payload is defined and (is_run_by_effective | default('manual')) == 'scheduler' + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_next', 'task_result': 'sot-updater-wrapper' } | to_json }}" + payload_encoding: "string" + changed_when: false + + - name: Scheduled success publish sot-updater-wrapper work message + when: journal_success_payload is defined and (is_run_by_effective | default('manual')) == 'scheduler' + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ 'deviceconfig' | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "deviceconfig" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'sot-updater-wrapper' } | to_json }}" + payload_encoding: "string" + changed_when: false + # MISMATCH path - name: Build journal payload for version mismatch after upgrade when: (read_ok | bool) and (not (version_match | bool)) @@ -676,6 +868,34 @@ register: rmq_j_mismatch changed_when: (rmq_j_mismatch.json is defined) and (rmq_j_mismatch.json.routed | default(false) | bool) + - name: Failure pause before action_state failed mismatch + ansible.builtin.pause: + seconds: 1 + delegate_to: localhost + changed_when: false + when: journal_mismatch_payload is defined + + - name: Failure publish action_state failed mismatch + when: journal_mismatch_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_state', 'task_result': 'failed' } | to_json }}" + payload_encoding: "string" + changed_when: false + - name: Stop host after mismatch path is handled when: journal_mismatch_payload is defined ansible.builtin.meta: end_host @@ -754,6 +974,34 @@ register: rmq_pub_gaveup changed_when: (rmq_pub_gaveup.json is defined) and (rmq_pub_gaveup.json.routed | default(false) | bool) + - name: Failure pause before action_state failed gaveup + ansible.builtin.pause: + seconds: 1 + delegate_to: localhost + changed_when: false + when: journal_gaveup_payload is defined + + - name: Failure publish action_state failed gaveup + when: journal_gaveup_payload is defined + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish" + method: POST + user: "{{ rmq_user }}" + password: "{{ rmq_pass }}" + force_basic_auth: true + status_code: 200 + headers: + content-type: "application/json" + body_format: json + body: + properties: + content_type: "application/json" + routing_key: "{{ control_queue }}" + payload: "{{ { 'inscope_device': (ansible_hostname | default(inventory_hostname)), 'task_name': 'custom_field_set', 'task_add1': 'action_state', 'task_result': 'failed' } | to_json }}" + payload_encoding: "string" + changed_when: false + # Only schedule next attempt if budget left - name: Build delayed payload for next indoor attempt wait ten minutes when: (not (read_ok | bool)) and ((attempt | int) < (effective_max_attempts | int))