all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:feff:1fb
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      docker_image: frontend
      docker_namespace: osism
      docker_registry: osism.harbor.regio.digital
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 60e231d6-7171-4b80-811e-ccbf97491a61
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:feff:1fb
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.71
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.79
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:feff:1fb
        region: null
        slot: null
      repository: osism/osism
  vars:
    docker_image: frontend
    docker_namespace: osism
    docker_registry: osism.harbor.regio.digital
    repository: osism/osism
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job container-image-python-osism-frontend-build explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: osism/python-osism/.zuul.yaml@main#87>'
      - '<Job container-image-python-osism-frontend-build explicit: None implied:
        None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 2de64d475cfb4ac6ba35d4db82b1c6b2
      build_refs:
      - branch: main
        change: '2485'
        change_message: "Add unit tests for osism/api.py HTTP and WebSocket endpoints\n\nAdds
          `tests/unit/test_api_endpoints.py`, exercising all HTTP endpoints and the
          WebSocket endpoint of `osism/api.py` through `fastapi.testclient.TestClient`,
          as specified in #2360:\n\n- **Health / telemetry**: `/`, `/v1`, `/v1/events`,
          and both sink endpoints (JSON list, JSON object, malformed body \u2192 500
          with endpoint-specific detail)\n- **Baremetal**: node list mapping into
          `BaremetalNode`, empty list, NetBox info for single and multiple nodes (including
          422 for a missing `node_names` field), ports, parameters, and error paths
          asserting the node name/UUID in the detail\n- **Notifications**: handler
          dispatch via `BaremetalEvents`, handler errors \u2192 500, non-UUID `message_id`
          \u2192 422, and the real default handler for unknown event types \u2192
          204\n- **SONiC ZTP complete**: 503 without NetBox, `provision_state` update
          plus `device.save()`, 404 for unknown identifiers, save failures \u2192
          500\n- **NetBox webhook**: 503 without NetBox, parsed `WebhookNetboxData`
          handed to `process_netbox_webhook`, processing errors \u2192 500, missing
          required field \u2192 422\n- **WebSocket `/v1/events/openstack`**: connect/disconnect
          lifecycle, `set_filters` acknowledgment with full and partial filters, ignored
          invalid JSON and non-filter actions, connection survival after `update_filters`
          errors (stubbed websocket manager, so no broadcaster task is started)\n-
          **Inventory**: hosts listing with `--limit` handling, hostvars with secret
          masking and sorted variables, ansible-inventory error mapping (404/500/504),
          facts from the Redis cache with the separator-less cache key, and the search
          endpoint (regex/source validation, host filtering, facts source, result
          limit with early loop exit, masking before matching, per-host failure tolerance,
          query echo, and both `get_inventory_path` call variants)\n\n`httpx` was
          already added to the `Pipfile` dev packages by #2359, so no dependency changes
          are needed. The module-level helpers and Pydantic models are covered separately
          by `tests/unit/test_api_helpers.py`.\n\nCloses #2360\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01P5LudkHsw8ZXnyFmRHQDRE"
        change_url: https://github.com/osism/python-osism/pull/2485
        commit_id: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
        patchset: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
        src_dir: src/github.com/osism/python-osism
        topic: null
      buildset: 1202be1317d64218a2708cb62901be98
      buildset_refs:
      - branch: main
        change: '2485'
        change_message: "Add unit tests for osism/api.py HTTP and WebSocket endpoints\n\nAdds
          `tests/unit/test_api_endpoints.py`, exercising all HTTP endpoints and the
          WebSocket endpoint of `osism/api.py` through `fastapi.testclient.TestClient`,
          as specified in #2360:\n\n- **Health / telemetry**: `/`, `/v1`, `/v1/events`,
          and both sink endpoints (JSON list, JSON object, malformed body \u2192 500
          with endpoint-specific detail)\n- **Baremetal**: node list mapping into
          `BaremetalNode`, empty list, NetBox info for single and multiple nodes (including
          422 for a missing `node_names` field), ports, parameters, and error paths
          asserting the node name/UUID in the detail\n- **Notifications**: handler
          dispatch via `BaremetalEvents`, handler errors \u2192 500, non-UUID `message_id`
          \u2192 422, and the real default handler for unknown event types \u2192
          204\n- **SONiC ZTP complete**: 503 without NetBox, `provision_state` update
          plus `device.save()`, 404 for unknown identifiers, save failures \u2192
          500\n- **NetBox webhook**: 503 without NetBox, parsed `WebhookNetboxData`
          handed to `process_netbox_webhook`, processing errors \u2192 500, missing
          required field \u2192 422\n- **WebSocket `/v1/events/openstack`**: connect/disconnect
          lifecycle, `set_filters` acknowledgment with full and partial filters, ignored
          invalid JSON and non-filter actions, connection survival after `update_filters`
          errors (stubbed websocket manager, so no broadcaster task is started)\n-
          **Inventory**: hosts listing with `--limit` handling, hostvars with secret
          masking and sorted variables, ansible-inventory error mapping (404/500/504),
          facts from the Redis cache with the separator-less cache key, and the search
          endpoint (regex/source validation, host filtering, facts source, result
          limit with early loop exit, masking before matching, per-host failure tolerance,
          query echo, and both `get_inventory_path` call variants)\n\n`httpx` was
          already added to the `Pipfile` dev packages by #2359, so no dependency changes
          are needed. The module-level helpers and Pydantic models are covered separately
          by `tests/unit/test_api_helpers.py`.\n\nCloses #2360\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01P5LudkHsw8ZXnyFmRHQDRE"
        change_url: https://github.com/osism/python-osism/pull/2485
        commit_id: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
        patchset: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
        src_dir: src/github.com/osism/python-osism
        topic: null
      change: '2485'
      change_message: "Add unit tests for osism/api.py HTTP and WebSocket endpoints\n\nAdds
        `tests/unit/test_api_endpoints.py`, exercising all HTTP endpoints and the
        WebSocket endpoint of `osism/api.py` through `fastapi.testclient.TestClient`,
        as specified in #2360:\n\n- **Health / telemetry**: `/`, `/v1`, `/v1/events`,
        and both sink endpoints (JSON list, JSON object, malformed body \u2192 500
        with endpoint-specific detail)\n- **Baremetal**: node list mapping into `BaremetalNode`,
        empty list, NetBox info for single and multiple nodes (including 422 for a
        missing `node_names` field), ports, parameters, and error paths asserting
        the node name/UUID in the detail\n- **Notifications**: handler dispatch via
        `BaremetalEvents`, handler errors \u2192 500, non-UUID `message_id` \u2192
        422, and the real default handler for unknown event types \u2192 204\n- **SONiC
        ZTP complete**: 503 without NetBox, `provision_state` update plus `device.save()`,
        404 for unknown identifiers, save failures \u2192 500\n- **NetBox webhook**:
        503 without NetBox, parsed `WebhookNetboxData` handed to `process_netbox_webhook`,
        processing errors \u2192 500, missing required field \u2192 422\n- **WebSocket
        `/v1/events/openstack`**: connect/disconnect lifecycle, `set_filters` acknowledgment
        with full and partial filters, ignored invalid JSON and non-filter actions,
        connection survival after `update_filters` errors (stubbed websocket manager,
        so no broadcaster task is started)\n- **Inventory**: hosts listing with `--limit`
        handling, hostvars with secret masking and sorted variables, ansible-inventory
        error mapping (404/500/504), facts from the Redis cache with the separator-less
        cache key, and the search endpoint (regex/source validation, host filtering,
        facts source, result limit with early loop exit, masking before matching,
        per-host failure tolerance, query echo, and both `get_inventory_path` call
        variants)\n\n`httpx` was already added to the `Pipfile` dev packages by #2359,
        so no dependency changes are needed. The module-level helpers and Pydantic
        models are covered separately by `tests/unit/test_api_helpers.py`.\n\nCloses
        #2360\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01P5LudkHsw8ZXnyFmRHQDRE"
      change_url: https://github.com/osism/python-osism/pull/2485
      child_jobs: []
      commit_id: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
      event_id: 4ba2b170-865d-11f1-87bf-5e4df2948882
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/2de64d475cfb4ac6ba35d4db82b1c6b2/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/2de64d475cfb4ac6ba35d4db82b1c6b2/work/logs
        result_data_file: /var/lib/zuul/builds/2de64d475cfb4ac6ba35d4db82b1c6b2/work/results.json
        src_root: /var/lib/zuul/builds/2de64d475cfb4ac6ba35d4db82b1c6b2/work/src
        work_root: /var/lib/zuul/builds/2de64d475cfb4ac6ba35d4db82b1c6b2/work
      include_vars: []
      items:
      - branch: main
        change: '2485'
        change_message: "Add unit tests for osism/api.py HTTP and WebSocket endpoints\n\nAdds
          `tests/unit/test_api_endpoints.py`, exercising all HTTP endpoints and the
          WebSocket endpoint of `osism/api.py` through `fastapi.testclient.TestClient`,
          as specified in #2360:\n\n- **Health / telemetry**: `/`, `/v1`, `/v1/events`,
          and both sink endpoints (JSON list, JSON object, malformed body \u2192 500
          with endpoint-specific detail)\n- **Baremetal**: node list mapping into
          `BaremetalNode`, empty list, NetBox info for single and multiple nodes (including
          422 for a missing `node_names` field), ports, parameters, and error paths
          asserting the node name/UUID in the detail\n- **Notifications**: handler
          dispatch via `BaremetalEvents`, handler errors \u2192 500, non-UUID `message_id`
          \u2192 422, and the real default handler for unknown event types \u2192
          204\n- **SONiC ZTP complete**: 503 without NetBox, `provision_state` update
          plus `device.save()`, 404 for unknown identifiers, save failures \u2192
          500\n- **NetBox webhook**: 503 without NetBox, parsed `WebhookNetboxData`
          handed to `process_netbox_webhook`, processing errors \u2192 500, missing
          required field \u2192 422\n- **WebSocket `/v1/events/openstack`**: connect/disconnect
          lifecycle, `set_filters` acknowledgment with full and partial filters, ignored
          invalid JSON and non-filter actions, connection survival after `update_filters`
          errors (stubbed websocket manager, so no broadcaster task is started)\n-
          **Inventory**: hosts listing with `--limit` handling, hostvars with secret
          masking and sorted variables, ansible-inventory error mapping (404/500/504),
          facts from the Redis cache with the separator-less cache key, and the search
          endpoint (regex/source validation, host filtering, facts source, result
          limit with early loop exit, masking before matching, per-host failure tolerance,
          query echo, and both `get_inventory_path` call variants)\n\n`httpx` was
          already added to the `Pipfile` dev packages by #2359, so no dependency changes
          are needed. The module-level helpers and Pydantic models are covered separately
          by `tests/unit/test_api_helpers.py`.\n\nCloses #2360\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01P5LudkHsw8ZXnyFmRHQDRE"
        change_url: https://github.com/osism/python-osism/pull/2485
        commit_id: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
        patchset: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
        topic: null
      job: container-image-python-osism-frontend-build
      jobtags: []
      max_attempts: 3
      message: QWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtL2FwaS5weSBIVFRQIGFuZCBXZWJTb2NrZXQgZW5kcG9pbnRzCgpBZGRzIGB0ZXN0cy91bml0L3Rlc3RfYXBpX2VuZHBvaW50cy5weWAsIGV4ZXJjaXNpbmcgYWxsIEhUVFAgZW5kcG9pbnRzIGFuZCB0aGUgV2ViU29ja2V0IGVuZHBvaW50IG9mIGBvc2lzbS9hcGkucHlgIHRocm91Z2ggYGZhc3RhcGkudGVzdGNsaWVudC5UZXN0Q2xpZW50YCwgYXMgc3BlY2lmaWVkIGluICMyMzYwOgoKLSAqKkhlYWx0aCAvIHRlbGVtZXRyeSoqOiBgL2AsIGAvdjFgLCBgL3YxL2V2ZW50c2AsIGFuZCBib3RoIHNpbmsgZW5kcG9pbnRzIChKU09OIGxpc3QsIEpTT04gb2JqZWN0LCBtYWxmb3JtZWQgYm9keSDihpIgNTAwIHdpdGggZW5kcG9pbnQtc3BlY2lmaWMgZGV0YWlsKQotICoqQmFyZW1ldGFsKio6IG5vZGUgbGlzdCBtYXBwaW5nIGludG8gYEJhcmVtZXRhbE5vZGVgLCBlbXB0eSBsaXN0LCBOZXRCb3ggaW5mbyBmb3Igc2luZ2xlIGFuZCBtdWx0aXBsZSBub2RlcyAoaW5jbHVkaW5nIDQyMiBmb3IgYSBtaXNzaW5nIGBub2RlX25hbWVzYCBmaWVsZCksIHBvcnRzLCBwYXJhbWV0ZXJzLCBhbmQgZXJyb3IgcGF0aHMgYXNzZXJ0aW5nIHRoZSBub2RlIG5hbWUvVVVJRCBpbiB0aGUgZGV0YWlsCi0gKipOb3RpZmljYXRpb25zKio6IGhhbmRsZXIgZGlzcGF0Y2ggdmlhIGBCYXJlbWV0YWxFdmVudHNgLCBoYW5kbGVyIGVycm9ycyDihpIgNTAwLCBub24tVVVJRCBgbWVzc2FnZV9pZGAg4oaSIDQyMiwgYW5kIHRoZSByZWFsIGRlZmF1bHQgaGFuZGxlciBmb3IgdW5rbm93biBldmVudCB0eXBlcyDihpIgMjA0Ci0gKipTT05pQyBaVFAgY29tcGxldGUqKjogNTAzIHdpdGhvdXQgTmV0Qm94LCBgcHJvdmlzaW9uX3N0YXRlYCB1cGRhdGUgcGx1cyBgZGV2aWNlLnNhdmUoKWAsIDQwNCBmb3IgdW5rbm93biBpZGVudGlmaWVycywgc2F2ZSBmYWlsdXJlcyDihpIgNTAwCi0gKipOZXRCb3ggd2ViaG9vayoqOiA1MDMgd2l0aG91dCBOZXRCb3gsIHBhcnNlZCBgV2ViaG9va05ldGJveERhdGFgIGhhbmRlZCB0byBgcHJvY2Vzc19uZXRib3hfd2ViaG9va2AsIHByb2Nlc3NpbmcgZXJyb3JzIOKGkiA1MDAsIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQg4oaSIDQyMgotICoqV2ViU29ja2V0IGAvdjEvZXZlbnRzL29wZW5zdGFja2AqKjogY29ubmVjdC9kaXNjb25uZWN0IGxpZmVjeWNsZSwgYHNldF9maWx0ZXJzYCBhY2tub3dsZWRnbWVudCB3aXRoIGZ1bGwgYW5kIHBhcnRpYWwgZmlsdGVycywgaWdub3JlZCBpbnZhbGlkIEpTT04gYW5kIG5vbi1maWx0ZXIgYWN0aW9ucywgY29ubmVjdGlvbiBzdXJ2aXZhbCBhZnRlciBgdXBkYXRlX2ZpbHRlcnNgIGVycm9ycyAoc3R1YmJlZCB3ZWJzb2NrZXQgbWFuYWdlciwgc28gbm8gYnJvYWRjYXN0ZXIgdGFzayBpcyBzdGFydGVkKQotICoqSW52ZW50b3J5Kio6IGhvc3RzIGxpc3Rpbmcgd2l0aCBgLS1saW1pdGAgaGFuZGxpbmcsIGhvc3R2YXJzIHdpdGggc2VjcmV0IG1hc2tpbmcgYW5kIHNvcnRlZCB2YXJpYWJsZXMsIGFuc2libGUtaW52ZW50b3J5IGVycm9yIG1hcHBpbmcgKDQwNC81MDAvNTA0KSwgZmFjdHMgZnJvbSB0aGUgUmVkaXMgY2FjaGUgd2l0aCB0aGUgc2VwYXJhdG9yLWxlc3MgY2FjaGUga2V5LCBhbmQgdGhlIHNlYXJjaCBlbmRwb2ludCAocmVnZXgvc291cmNlIHZhbGlkYXRpb24sIGhvc3QgZmlsdGVyaW5nLCBmYWN0cyBzb3VyY2UsIHJlc3VsdCBsaW1pdCB3aXRoIGVhcmx5IGxvb3AgZXhpdCwgbWFza2luZyBiZWZvcmUgbWF0Y2hpbmcsIHBlci1ob3N0IGZhaWx1cmUgdG9sZXJhbmNlLCBxdWVyeSBlY2hvLCBhbmQgYm90aCBgZ2V0X2ludmVudG9yeV9wYXRoYCBjYWxsIHZhcmlhbnRzKQoKYGh0dHB4YCB3YXMgYWxyZWFkeSBhZGRlZCB0byB0aGUgYFBpcGZpbGVgIGRldiBwYWNrYWdlcyBieSAjMjM1OSwgc28gbm8gZGVwZW5kZW5jeSBjaGFuZ2VzIGFyZSBuZWVkZWQuIFRoZSBtb2R1bGUtbGV2ZWwgaGVscGVycyBhbmQgUHlkYW50aWMgbW9kZWxzIGFyZSBjb3ZlcmVkIHNlcGFyYXRlbHkgYnkgYHRlc3RzL3VuaXQvdGVzdF9hcGlfaGVscGVycy5weWAuCgpDbG9zZXMgIzIzNjAKCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUpCgpodHRwczovL2NsYXVkZS5haS9jb2RlL3Nlc3Npb25fMDFQNUx1ZGtIc3c4WlhueUZtUkhRRFJF
      patchset: ace2f712ce217acb2b83856f26d0975a5ab3b3aa
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 2cf26246f1f209157abe5b8cd36a09ecba83b6b8
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          untrusted/project_3/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/build.yml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_1/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_2/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_3/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_3/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/python-osism
        name: osism/python-osism
        short_name: python-osism
        src_dir: src/github.com/osism/python-osism
      projects:
        github.com/osism/python-osism:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          checkout: main
          checkout_description: zuul branch
          commit: 2cf26246f1f209157abe5b8cd36a09ecba83b6b8
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2485/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
