all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:feb1:11df
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 4339ae95-625b-492a-956a-e7e67a0d0c8e
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:feb1:11df
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.99
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.95
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:feb1:11df
        region: null
        slot: null
  vars:
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job python-osism-integration-tests explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#138>'
      - '<Job python-osism-integration-tests explicit: None implied: None source:
        osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: be6fa3d1b17843a486f07cdb83c79a19
      build_refs:
      - branch: main
        change: '2473'
        change_message: "Add unit tests for osism/services/listener.py\n\nCloses #2358.\n\nCreates
          `tests/unit/services/test_listener.py` with unit tests for the RabbitMQ
          notification listener (`osism/services/listener.py`), which previously had
          no coverage.\n\n## Coverage\n\n- **Module constants**: `EXCHANGES_CONFIG`
          contains exactly the six OpenStack services with the expected exchange/routing-key/queue
          naming; the legacy `EXCHANGE_NAME`/`ROUTING_KEY`/`QUEUE_NAME` constants
          match the ironic entry\n- **`BaremetalEvents.get_handler()`**: all eight
          registered event types resolve to their bound methods (parametrized over
          the full `_handler` tree), unknown leaf/branch events fall back to the default
          handler (logs, no NetBox task), extra event-type segments are ignored, short
          event types leak an `IndexError` (documented with `pytest.raises`), `get_object_data()`
          raises `KeyError` on missing `ironic_object.data`\n- **Handler methods**:
          each handler calls the expected `netbox.set_power_state`/`set_provision_state`/`set_maintenance`
          task via `.delay` (incl. the `state=` keyword for maintenance and the double
          reset in `node_delete_end`)\n- **`NotificationsDump.__init__()`**: no API
          session without `OSISM_API_URL`, trailing-slash stripping when set, event
          bridge singleton wiring and the `ImportError` fallback via `sys.modules`,
          initial discovery state\n- **Exchange discovery**: `_get_exchange_properties()`
          (passive declare, exception \u2192 `None`), `_check_for_new_exchanges()`
          (new/known/none/channel-error paths), `_exchange_discovery_loop()` driven
          synchronously with a scripted stop event (stop request, all-available break,
          restart signaling via `_new_exchanges_found`/`should_stop`, quiet continuation),
          thread start/stop with `threading.Thread` patched, `_wait_for_exchanges()`
          retry with `EXCHANGE_RETRY_INTERVAL`\n- **`get_consumers()`**: consumer
          per available exchange with `passive=True` exchanges and `no_ack=True` queues,
          `exchange_props` defaults, per-service error isolation, empty-exchange error
          path\n- **`on_message()`**: payload-info extraction for baremetal/nova/neutron/other
          services, missing `event_type` behavior (documented `KeyError`), event bridge
          forwarding incl. both error logs and the `unknown` fallback for non-ironic
          payloads, OSISM API delivery (204 success with exact JSON body, retry/backoff
          `sleep(3)`/`sleep(9)` on `ConnectionError`/`Timeout`, early give-up on HTTP
          errors `<= 500` incl. the 500 edge case, retries on 503 and on the 200-falls-through
          path), handler dispatch without an API session\n- **`main()`**: `ConnectionRefusedError`
          retry with `sleep(60)`, and the consumer restart path when the discovery
          thread finds new exchanges (exchange carry-over into the next `NotificationsDump`
          instance)\n\n## Notes\n\n- Threads and timeouts are never real: the discovery
          loop is called synchronously with a scripted `_stop_discovery` mock, `threading.Thread`
          and `time.sleep` are patched (the sleep mock carries a bounded guard so
          a regression cannot hang pytest), and `main()`'s `while True` loop is escaped
          with a sentinel exception.\n- The NetBox Celery tasks are only invoked via
          `.delay`, so the three `osism.services.listener.netbox.*.delay` attributes
          are patched; no broker is needed.\n- `tests/unit/services/__init__.py` is
          byte-identical to the one created by #2460, so whichever PR lands second
          merges cleanly.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2473
        commit_id: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
        patchset: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
        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: de824fb8f89e4eff97271168d4a08cff
      buildset_refs:
      - branch: main
        change: '2473'
        change_message: "Add unit tests for osism/services/listener.py\n\nCloses #2358.\n\nCreates
          `tests/unit/services/test_listener.py` with unit tests for the RabbitMQ
          notification listener (`osism/services/listener.py`), which previously had
          no coverage.\n\n## Coverage\n\n- **Module constants**: `EXCHANGES_CONFIG`
          contains exactly the six OpenStack services with the expected exchange/routing-key/queue
          naming; the legacy `EXCHANGE_NAME`/`ROUTING_KEY`/`QUEUE_NAME` constants
          match the ironic entry\n- **`BaremetalEvents.get_handler()`**: all eight
          registered event types resolve to their bound methods (parametrized over
          the full `_handler` tree), unknown leaf/branch events fall back to the default
          handler (logs, no NetBox task), extra event-type segments are ignored, short
          event types leak an `IndexError` (documented with `pytest.raises`), `get_object_data()`
          raises `KeyError` on missing `ironic_object.data`\n- **Handler methods**:
          each handler calls the expected `netbox.set_power_state`/`set_provision_state`/`set_maintenance`
          task via `.delay` (incl. the `state=` keyword for maintenance and the double
          reset in `node_delete_end`)\n- **`NotificationsDump.__init__()`**: no API
          session without `OSISM_API_URL`, trailing-slash stripping when set, event
          bridge singleton wiring and the `ImportError` fallback via `sys.modules`,
          initial discovery state\n- **Exchange discovery**: `_get_exchange_properties()`
          (passive declare, exception \u2192 `None`), `_check_for_new_exchanges()`
          (new/known/none/channel-error paths), `_exchange_discovery_loop()` driven
          synchronously with a scripted stop event (stop request, all-available break,
          restart signaling via `_new_exchanges_found`/`should_stop`, quiet continuation),
          thread start/stop with `threading.Thread` patched, `_wait_for_exchanges()`
          retry with `EXCHANGE_RETRY_INTERVAL`\n- **`get_consumers()`**: consumer
          per available exchange with `passive=True` exchanges and `no_ack=True` queues,
          `exchange_props` defaults, per-service error isolation, empty-exchange error
          path\n- **`on_message()`**: payload-info extraction for baremetal/nova/neutron/other
          services, missing `event_type` behavior (documented `KeyError`), event bridge
          forwarding incl. both error logs and the `unknown` fallback for non-ironic
          payloads, OSISM API delivery (204 success with exact JSON body, retry/backoff
          `sleep(3)`/`sleep(9)` on `ConnectionError`/`Timeout`, early give-up on HTTP
          errors `<= 500` incl. the 500 edge case, retries on 503 and on the 200-falls-through
          path), handler dispatch without an API session\n- **`main()`**: `ConnectionRefusedError`
          retry with `sleep(60)`, and the consumer restart path when the discovery
          thread finds new exchanges (exchange carry-over into the next `NotificationsDump`
          instance)\n\n## Notes\n\n- Threads and timeouts are never real: the discovery
          loop is called synchronously with a scripted `_stop_discovery` mock, `threading.Thread`
          and `time.sleep` are patched (the sleep mock carries a bounded guard so
          a regression cannot hang pytest), and `main()`'s `while True` loop is escaped
          with a sentinel exception.\n- The NetBox Celery tasks are only invoked via
          `.delay`, so the three `osism.services.listener.netbox.*.delay` attributes
          are patched; no broker is needed.\n- `tests/unit/services/__init__.py` is
          byte-identical to the one created by #2460, so whichever PR lands second
          merges cleanly.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2473
        commit_id: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
        patchset: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
        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: '2473'
      change_message: "Add unit tests for osism/services/listener.py\n\nCloses #2358.\n\nCreates
        `tests/unit/services/test_listener.py` with unit tests for the RabbitMQ notification
        listener (`osism/services/listener.py`), which previously had no coverage.\n\n##
        Coverage\n\n- **Module constants**: `EXCHANGES_CONFIG` contains exactly the
        six OpenStack services with the expected exchange/routing-key/queue naming;
        the legacy `EXCHANGE_NAME`/`ROUTING_KEY`/`QUEUE_NAME` constants match the
        ironic entry\n- **`BaremetalEvents.get_handler()`**: all eight registered
        event types resolve to their bound methods (parametrized over the full `_handler`
        tree), unknown leaf/branch events fall back to the default handler (logs,
        no NetBox task), extra event-type segments are ignored, short event types
        leak an `IndexError` (documented with `pytest.raises`), `get_object_data()`
        raises `KeyError` on missing `ironic_object.data`\n- **Handler methods**:
        each handler calls the expected `netbox.set_power_state`/`set_provision_state`/`set_maintenance`
        task via `.delay` (incl. the `state=` keyword for maintenance and the double
        reset in `node_delete_end`)\n- **`NotificationsDump.__init__()`**: no API
        session without `OSISM_API_URL`, trailing-slash stripping when set, event
        bridge singleton wiring and the `ImportError` fallback via `sys.modules`,
        initial discovery state\n- **Exchange discovery**: `_get_exchange_properties()`
        (passive declare, exception \u2192 `None`), `_check_for_new_exchanges()` (new/known/none/channel-error
        paths), `_exchange_discovery_loop()` driven synchronously with a scripted
        stop event (stop request, all-available break, restart signaling via `_new_exchanges_found`/`should_stop`,
        quiet continuation), thread start/stop with `threading.Thread` patched, `_wait_for_exchanges()`
        retry with `EXCHANGE_RETRY_INTERVAL`\n- **`get_consumers()`**: consumer per
        available exchange with `passive=True` exchanges and `no_ack=True` queues,
        `exchange_props` defaults, per-service error isolation, empty-exchange error
        path\n- **`on_message()`**: payload-info extraction for baremetal/nova/neutron/other
        services, missing `event_type` behavior (documented `KeyError`), event bridge
        forwarding incl. both error logs and the `unknown` fallback for non-ironic
        payloads, OSISM API delivery (204 success with exact JSON body, retry/backoff
        `sleep(3)`/`sleep(9)` on `ConnectionError`/`Timeout`, early give-up on HTTP
        errors `<= 500` incl. the 500 edge case, retries on 503 and on the 200-falls-through
        path), handler dispatch without an API session\n- **`main()`**: `ConnectionRefusedError`
        retry with `sleep(60)`, and the consumer restart path when the discovery thread
        finds new exchanges (exchange carry-over into the next `NotificationsDump`
        instance)\n\n## Notes\n\n- Threads and timeouts are never real: the discovery
        loop is called synchronously with a scripted `_stop_discovery` mock, `threading.Thread`
        and `time.sleep` are patched (the sleep mock carries a bounded guard so a
        regression cannot hang pytest), and `main()`'s `while True` loop is escaped
        with a sentinel exception.\n- The NetBox Celery tasks are only invoked via
        `.delay`, so the three `osism.services.listener.netbox.*.delay` attributes
        are patched; no broker is needed.\n- `tests/unit/services/__init__.py` is
        byte-identical to the one created by #2460, so whichever PR lands second merges
        cleanly.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2473
      child_jobs: []
      commit_id: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
      event_id: 89d65f20-8115-11f1-9cf7-1092a43fc783
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/be6fa3d1b17843a486f07cdb83c79a19/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/be6fa3d1b17843a486f07cdb83c79a19/work/logs
        result_data_file: /var/lib/zuul/builds/be6fa3d1b17843a486f07cdb83c79a19/work/results.json
        src_root: /var/lib/zuul/builds/be6fa3d1b17843a486f07cdb83c79a19/work/src
        work_root: /var/lib/zuul/builds/be6fa3d1b17843a486f07cdb83c79a19/work
      include_vars: []
      items:
      - branch: main
        change: '2473'
        change_message: "Add unit tests for osism/services/listener.py\n\nCloses #2358.\n\nCreates
          `tests/unit/services/test_listener.py` with unit tests for the RabbitMQ
          notification listener (`osism/services/listener.py`), which previously had
          no coverage.\n\n## Coverage\n\n- **Module constants**: `EXCHANGES_CONFIG`
          contains exactly the six OpenStack services with the expected exchange/routing-key/queue
          naming; the legacy `EXCHANGE_NAME`/`ROUTING_KEY`/`QUEUE_NAME` constants
          match the ironic entry\n- **`BaremetalEvents.get_handler()`**: all eight
          registered event types resolve to their bound methods (parametrized over
          the full `_handler` tree), unknown leaf/branch events fall back to the default
          handler (logs, no NetBox task), extra event-type segments are ignored, short
          event types leak an `IndexError` (documented with `pytest.raises`), `get_object_data()`
          raises `KeyError` on missing `ironic_object.data`\n- **Handler methods**:
          each handler calls the expected `netbox.set_power_state`/`set_provision_state`/`set_maintenance`
          task via `.delay` (incl. the `state=` keyword for maintenance and the double
          reset in `node_delete_end`)\n- **`NotificationsDump.__init__()`**: no API
          session without `OSISM_API_URL`, trailing-slash stripping when set, event
          bridge singleton wiring and the `ImportError` fallback via `sys.modules`,
          initial discovery state\n- **Exchange discovery**: `_get_exchange_properties()`
          (passive declare, exception \u2192 `None`), `_check_for_new_exchanges()`
          (new/known/none/channel-error paths), `_exchange_discovery_loop()` driven
          synchronously with a scripted stop event (stop request, all-available break,
          restart signaling via `_new_exchanges_found`/`should_stop`, quiet continuation),
          thread start/stop with `threading.Thread` patched, `_wait_for_exchanges()`
          retry with `EXCHANGE_RETRY_INTERVAL`\n- **`get_consumers()`**: consumer
          per available exchange with `passive=True` exchanges and `no_ack=True` queues,
          `exchange_props` defaults, per-service error isolation, empty-exchange error
          path\n- **`on_message()`**: payload-info extraction for baremetal/nova/neutron/other
          services, missing `event_type` behavior (documented `KeyError`), event bridge
          forwarding incl. both error logs and the `unknown` fallback for non-ironic
          payloads, OSISM API delivery (204 success with exact JSON body, retry/backoff
          `sleep(3)`/`sleep(9)` on `ConnectionError`/`Timeout`, early give-up on HTTP
          errors `<= 500` incl. the 500 edge case, retries on 503 and on the 200-falls-through
          path), handler dispatch without an API session\n- **`main()`**: `ConnectionRefusedError`
          retry with `sleep(60)`, and the consumer restart path when the discovery
          thread finds new exchanges (exchange carry-over into the next `NotificationsDump`
          instance)\n\n## Notes\n\n- Threads and timeouts are never real: the discovery
          loop is called synchronously with a scripted `_stop_discovery` mock, `threading.Thread`
          and `time.sleep` are patched (the sleep mock carries a bounded guard so
          a regression cannot hang pytest), and `main()`'s `while True` loop is escaped
          with a sentinel exception.\n- The NetBox Celery tasks are only invoked via
          `.delay`, so the three `osism.services.listener.netbox.*.delay` attributes
          are patched; no broker is needed.\n- `tests/unit/services/__init__.py` is
          byte-identical to the one created by #2460, so whichever PR lands second
          merges cleanly.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2473
        commit_id: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
        patchset: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
        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: python-osism-integration-tests
      jobtags: []
      max_attempts: 3
      message: QWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtL3NlcnZpY2VzL2xpc3RlbmVyLnB5CgpDbG9zZXMgIzIzNTguCgpDcmVhdGVzIGB0ZXN0cy91bml0L3NlcnZpY2VzL3Rlc3RfbGlzdGVuZXIucHlgIHdpdGggdW5pdCB0ZXN0cyBmb3IgdGhlIFJhYmJpdE1RIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciAoYG9zaXNtL3NlcnZpY2VzL2xpc3RlbmVyLnB5YCksIHdoaWNoIHByZXZpb3VzbHkgaGFkIG5vIGNvdmVyYWdlLgoKIyMgQ292ZXJhZ2UKCi0gKipNb2R1bGUgY29uc3RhbnRzKio6IGBFWENIQU5HRVNfQ09ORklHYCBjb250YWlucyBleGFjdGx5IHRoZSBzaXggT3BlblN0YWNrIHNlcnZpY2VzIHdpdGggdGhlIGV4cGVjdGVkIGV4Y2hhbmdlL3JvdXRpbmcta2V5L3F1ZXVlIG5hbWluZzsgdGhlIGxlZ2FjeSBgRVhDSEFOR0VfTkFNRWAvYFJPVVRJTkdfS0VZYC9gUVVFVUVfTkFNRWAgY29uc3RhbnRzIG1hdGNoIHRoZSBpcm9uaWMgZW50cnkKLSAqKmBCYXJlbWV0YWxFdmVudHMuZ2V0X2hhbmRsZXIoKWAqKjogYWxsIGVpZ2h0IHJlZ2lzdGVyZWQgZXZlbnQgdHlwZXMgcmVzb2x2ZSB0byB0aGVpciBib3VuZCBtZXRob2RzIChwYXJhbWV0cml6ZWQgb3ZlciB0aGUgZnVsbCBgX2hhbmRsZXJgIHRyZWUpLCB1bmtub3duIGxlYWYvYnJhbmNoIGV2ZW50cyBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgaGFuZGxlciAobG9ncywgbm8gTmV0Qm94IHRhc2spLCBleHRyYSBldmVudC10eXBlIHNlZ21lbnRzIGFyZSBpZ25vcmVkLCBzaG9ydCBldmVudCB0eXBlcyBsZWFrIGFuIGBJbmRleEVycm9yYCAoZG9jdW1lbnRlZCB3aXRoIGBweXRlc3QucmFpc2VzYCksIGBnZXRfb2JqZWN0X2RhdGEoKWAgcmFpc2VzIGBLZXlFcnJvcmAgb24gbWlzc2luZyBgaXJvbmljX29iamVjdC5kYXRhYAotICoqSGFuZGxlciBtZXRob2RzKio6IGVhY2ggaGFuZGxlciBjYWxscyB0aGUgZXhwZWN0ZWQgYG5ldGJveC5zZXRfcG93ZXJfc3RhdGVgL2BzZXRfcHJvdmlzaW9uX3N0YXRlYC9gc2V0X21haW50ZW5hbmNlYCB0YXNrIHZpYSBgLmRlbGF5YCAoaW5jbC4gdGhlIGBzdGF0ZT1gIGtleXdvcmQgZm9yIG1haW50ZW5hbmNlIGFuZCB0aGUgZG91YmxlIHJlc2V0IGluIGBub2RlX2RlbGV0ZV9lbmRgKQotICoqYE5vdGlmaWNhdGlvbnNEdW1wLl9faW5pdF9fKClgKio6IG5vIEFQSSBzZXNzaW9uIHdpdGhvdXQgYE9TSVNNX0FQSV9VUkxgLCB0cmFpbGluZy1zbGFzaCBzdHJpcHBpbmcgd2hlbiBzZXQsIGV2ZW50IGJyaWRnZSBzaW5nbGV0b24gd2lyaW5nIGFuZCB0aGUgYEltcG9ydEVycm9yYCBmYWxsYmFjayB2aWEgYHN5cy5tb2R1bGVzYCwgaW5pdGlhbCBkaXNjb3Zlcnkgc3RhdGUKLSAqKkV4Y2hhbmdlIGRpc2NvdmVyeSoqOiBgX2dldF9leGNoYW5nZV9wcm9wZXJ0aWVzKClgIChwYXNzaXZlIGRlY2xhcmUsIGV4Y2VwdGlvbiDihpIgYE5vbmVgKSwgYF9jaGVja19mb3JfbmV3X2V4Y2hhbmdlcygpYCAobmV3L2tub3duL25vbmUvY2hhbm5lbC1lcnJvciBwYXRocyksIGBfZXhjaGFuZ2VfZGlzY292ZXJ5X2xvb3AoKWAgZHJpdmVuIHN5bmNocm9ub3VzbHkgd2l0aCBhIHNjcmlwdGVkIHN0b3AgZXZlbnQgKHN0b3AgcmVxdWVzdCwgYWxsLWF2YWlsYWJsZSBicmVhaywgcmVzdGFydCBzaWduYWxpbmcgdmlhIGBfbmV3X2V4Y2hhbmdlc19mb3VuZGAvYHNob3VsZF9zdG9wYCwgcXVpZXQgY29udGludWF0aW9uKSwgdGhyZWFkIHN0YXJ0L3N0b3Agd2l0aCBgdGhyZWFkaW5nLlRocmVhZGAgcGF0Y2hlZCwgYF93YWl0X2Zvcl9leGNoYW5nZXMoKWAgcmV0cnkgd2l0aCBgRVhDSEFOR0VfUkVUUllfSU5URVJWQUxgCi0gKipgZ2V0X2NvbnN1bWVycygpYCoqOiBjb25zdW1lciBwZXIgYXZhaWxhYmxlIGV4Y2hhbmdlIHdpdGggYHBhc3NpdmU9VHJ1ZWAgZXhjaGFuZ2VzIGFuZCBgbm9fYWNrPVRydWVgIHF1ZXVlcywgYGV4Y2hhbmdlX3Byb3BzYCBkZWZhdWx0cywgcGVyLXNlcnZpY2UgZXJyb3IgaXNvbGF0aW9uLCBlbXB0eS1leGNoYW5nZSBlcnJvciBwYXRoCi0gKipgb25fbWVzc2FnZSgpYCoqOiBwYXlsb2FkLWluZm8gZXh0cmFjdGlvbiBmb3IgYmFyZW1ldGFsL25vdmEvbmV1dHJvbi9vdGhlciBzZXJ2aWNlcywgbWlzc2luZyBgZXZlbnRfdHlwZWAgYmVoYXZpb3IgKGRvY3VtZW50ZWQgYEtleUVycm9yYCksIGV2ZW50IGJyaWRnZSBmb3J3YXJkaW5nIGluY2wuIGJvdGggZXJyb3IgbG9ncyBhbmQgdGhlIGB1bmtub3duYCBmYWxsYmFjayBmb3Igbm9uLWlyb25pYyBwYXlsb2FkcywgT1NJU00gQVBJIGRlbGl2ZXJ5ICgyMDQgc3VjY2VzcyB3aXRoIGV4YWN0IEpTT04gYm9keSwgcmV0cnkvYmFja29mZiBgc2xlZXAoMylgL2BzbGVlcCg5KWAgb24gYENvbm5lY3Rpb25FcnJvcmAvYFRpbWVvdXRgLCBlYXJseSBnaXZlLXVwIG9uIEhUVFAgZXJyb3JzIGA8PSA1MDBgIGluY2wuIHRoZSA1MDAgZWRnZSBjYXNlLCByZXRyaWVzIG9uIDUwMyBhbmQgb24gdGhlIDIwMC1mYWxscy10aHJvdWdoIHBhdGgpLCBoYW5kbGVyIGRpc3BhdGNoIHdpdGhvdXQgYW4gQVBJIHNlc3Npb24KLSAqKmBtYWluKClgKio6IGBDb25uZWN0aW9uUmVmdXNlZEVycm9yYCByZXRyeSB3aXRoIGBzbGVlcCg2MClgLCBhbmQgdGhlIGNvbnN1bWVyIHJlc3RhcnQgcGF0aCB3aGVuIHRoZSBkaXNjb3ZlcnkgdGhyZWFkIGZpbmRzIG5ldyBleGNoYW5nZXMgKGV4Y2hhbmdlIGNhcnJ5LW92ZXIgaW50byB0aGUgbmV4dCBgTm90aWZpY2F0aW9uc0R1bXBgIGluc3RhbmNlKQoKIyMgTm90ZXMKCi0gVGhyZWFkcyBhbmQgdGltZW91dHMgYXJlIG5ldmVyIHJlYWw6IHRoZSBkaXNjb3ZlcnkgbG9vcCBpcyBjYWxsZWQgc3luY2hyb25vdXNseSB3aXRoIGEgc2NyaXB0ZWQgYF9zdG9wX2Rpc2NvdmVyeWAgbW9jaywgYHRocmVhZGluZy5UaHJlYWRgIGFuZCBgdGltZS5zbGVlcGAgYXJlIHBhdGNoZWQgKHRoZSBzbGVlcCBtb2NrIGNhcnJpZXMgYSBib3VuZGVkIGd1YXJkIHNvIGEgcmVncmVzc2lvbiBjYW5ub3QgaGFuZyBweXRlc3QpLCBhbmQgYG1haW4oKWAncyBgd2hpbGUgVHJ1ZWAgbG9vcCBpcyBlc2NhcGVkIHdpdGggYSBzZW50aW5lbCBleGNlcHRpb24uCi0gVGhlIE5ldEJveCBDZWxlcnkgdGFza3MgYXJlIG9ubHkgaW52b2tlZCB2aWEgYC5kZWxheWAsIHNvIHRoZSB0aHJlZSBgb3Npc20uc2VydmljZXMubGlzdGVuZXIubmV0Ym94LiouZGVsYXlgIGF0dHJpYnV0ZXMgYXJlIHBhdGNoZWQ7IG5vIGJyb2tlciBpcyBuZWVkZWQuCi0gYHRlc3RzL3VuaXQvc2VydmljZXMvX19pbml0X18ucHlgIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBvbmUgY3JlYXRlZCBieSAjMjQ2MCwgc28gd2hpY2hldmVyIFBSIGxhbmRzIHNlY29uZCBtZXJnZXMgY2xlYW5seS4KCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUp
      patchset: 547704bcd48a511ad506adf9ffc9bd2e9ef3c399
      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: b0a7566f5e3dc73546533a830a00e30e675990a1
          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/test-integration.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: b0a7566f5e3dc73546533a830a00e30e675990a1
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2473/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
