all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe1d:f1af
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: d53c684e-4ecc-4cd7-9b84-6aaf21e155d0
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe1d:f1af
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.244
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.81
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe1d:f1af
        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 flake8 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#32>'
      - '<Job flake8 explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 6c139d8315224ff1b4cd491c5695c987
      build_refs:
      - branch: main
        change: '2412'
        change_message: "Add integration test for OpenStack events WebSocket endpoint\n\nCloses
          #2407\n\n## What this does\n\nAdds an integration test for the OpenStack
          events WebSocket endpoint `GET /v1/events/openstack`, driving it through
          `fastapi.testclient.TestClient`. The endpoint upgrades to a WebSocket served
          by the in-process `websocket_manager` (`osism/services/websocket_manager.py`),
          which broadcasts via an in-process `asyncio` queue \u2014 so the test exercises
          the full connect / set-filters / broadcast / disconnect path end-to-end
          without any service beyond the `TestClient`.\n\n## Change set (single commit)\n\n**`35d94ea`
          \u2014 Add integration test for OpenStack events WebSocket endpoint**\n\n-
          **`tests/integration/test_api_websocket.py`** (new, 133 lines) \u2014 five
          test cases covering:\n  - `test_websocket_connect_is_accepted` \u2014 the
          WebSocket upgrade is accepted.\n  - `test_set_filters_is_acknowledged` \u2014
          a `set_filters` message is processed and acknowledged verbatim (`filter_update`
          / `success`, echoing the event/node/service filters).\n  - `test_matching_event_is_delivered`
          \u2014 an event matching the connection's filters is delivered intact (compared
          against `EventMessage.to_dict()`).\n  - `test_non_matching_event_is_filtered_out`
          \u2014 a non-matching event is dropped; a FIFO-following sentinel event
          proves the drop without relying on an absence/timeout.\n  - `test_disconnect_drops_connection_count`
          \u2014 disconnect runs the `finally` cleanup and the connection count returns
          to its pre-connect value.\n- **`Pipfile` / `Pipfile.lock`** \u2014 add `pytest-timeout==2.4.0`
          to dev dependencies.\n\n## Notes for the reviewer\n\n- **Module-scoped `client`
          fixture.** The global `websocket_manager` owns module-level `asyncio` primitives
          (`event_queue`, `_lock`) that bind to the first event loop that touches
          them and raise \"bound to a different event loop\" otherwise. A single module-scoped
          `TestClient` keeps one loop alive across the module so those primitives
          stay valid. `osism.api` is imported lazily inside the fixture because importing
          it wires the event bridge to Redis at module load \u2014 safe only in the
          integration environment.\n- **Loop-bound queue.** Events are enqueued from
          the app's event loop via `client.portal.call(websocket_manager.add_event,
          ...)` rather than from the test thread, because the queue is loop-bound.\n-
          **Divergence from the issue:** the issue (#2407) only asks for the integration
          test. This PR additionally adds `pytest-timeout==2.4.0` as a dev dependency
          and applies `pytest.mark.timeout(30)` to the module. Without it, the blocking
          `ws.receive_json()` calls (Starlette's untimed `queue.get()`) would hang
          forever on a regression and only die on the CI wall-clock timeout; the cap
          turns such a hang into a precise 30-second failure at the exact `receive_json()`
          call. The test is also tagged `integration` to share the FastAPI/`httpx`
          setup with the sibling facts test and stay in the same Tier 2 batch.\n\n---\n\n_Implemented
          by [planwerk-review](https://github.com/planwerk/planwerk-review) a24f4d9
          with Claude:claude-opus-4-8_\n"
        change_url: https://github.com/osism/python-osism/pull/2412
        commit_id: 83ad893109fb8de74223bcd1223c9d8738603bb8
        patchset: 83ad893109fb8de74223bcd1223c9d8738603bb8
        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: e046ad7e97ed43af86112418b19510d2
      buildset_refs:
      - branch: main
        change: '2412'
        change_message: "Add integration test for OpenStack events WebSocket endpoint\n\nCloses
          #2407\n\n## What this does\n\nAdds an integration test for the OpenStack
          events WebSocket endpoint `GET /v1/events/openstack`, driving it through
          `fastapi.testclient.TestClient`. The endpoint upgrades to a WebSocket served
          by the in-process `websocket_manager` (`osism/services/websocket_manager.py`),
          which broadcasts via an in-process `asyncio` queue \u2014 so the test exercises
          the full connect / set-filters / broadcast / disconnect path end-to-end
          without any service beyond the `TestClient`.\n\n## Change set (single commit)\n\n**`35d94ea`
          \u2014 Add integration test for OpenStack events WebSocket endpoint**\n\n-
          **`tests/integration/test_api_websocket.py`** (new, 133 lines) \u2014 five
          test cases covering:\n  - `test_websocket_connect_is_accepted` \u2014 the
          WebSocket upgrade is accepted.\n  - `test_set_filters_is_acknowledged` \u2014
          a `set_filters` message is processed and acknowledged verbatim (`filter_update`
          / `success`, echoing the event/node/service filters).\n  - `test_matching_event_is_delivered`
          \u2014 an event matching the connection's filters is delivered intact (compared
          against `EventMessage.to_dict()`).\n  - `test_non_matching_event_is_filtered_out`
          \u2014 a non-matching event is dropped; a FIFO-following sentinel event
          proves the drop without relying on an absence/timeout.\n  - `test_disconnect_drops_connection_count`
          \u2014 disconnect runs the `finally` cleanup and the connection count returns
          to its pre-connect value.\n- **`Pipfile` / `Pipfile.lock`** \u2014 add `pytest-timeout==2.4.0`
          to dev dependencies.\n\n## Notes for the reviewer\n\n- **Module-scoped `client`
          fixture.** The global `websocket_manager` owns module-level `asyncio` primitives
          (`event_queue`, `_lock`) that bind to the first event loop that touches
          them and raise \"bound to a different event loop\" otherwise. A single module-scoped
          `TestClient` keeps one loop alive across the module so those primitives
          stay valid. `osism.api` is imported lazily inside the fixture because importing
          it wires the event bridge to Redis at module load \u2014 safe only in the
          integration environment.\n- **Loop-bound queue.** Events are enqueued from
          the app's event loop via `client.portal.call(websocket_manager.add_event,
          ...)` rather than from the test thread, because the queue is loop-bound.\n-
          **Divergence from the issue:** the issue (#2407) only asks for the integration
          test. This PR additionally adds `pytest-timeout==2.4.0` as a dev dependency
          and applies `pytest.mark.timeout(30)` to the module. Without it, the blocking
          `ws.receive_json()` calls (Starlette's untimed `queue.get()`) would hang
          forever on a regression and only die on the CI wall-clock timeout; the cap
          turns such a hang into a precise 30-second failure at the exact `receive_json()`
          call. The test is also tagged `integration` to share the FastAPI/`httpx`
          setup with the sibling facts test and stay in the same Tier 2 batch.\n\n---\n\n_Implemented
          by [planwerk-review](https://github.com/planwerk/planwerk-review) a24f4d9
          with Claude:claude-opus-4-8_\n"
        change_url: https://github.com/osism/python-osism/pull/2412
        commit_id: 83ad893109fb8de74223bcd1223c9d8738603bb8
        patchset: 83ad893109fb8de74223bcd1223c9d8738603bb8
        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: '2412'
      change_message: "Add integration test for OpenStack events WebSocket endpoint\n\nCloses
        #2407\n\n## What this does\n\nAdds an integration test for the OpenStack events
        WebSocket endpoint `GET /v1/events/openstack`, driving it through `fastapi.testclient.TestClient`.
        The endpoint upgrades to a WebSocket served by the in-process `websocket_manager`
        (`osism/services/websocket_manager.py`), which broadcasts via an in-process
        `asyncio` queue \u2014 so the test exercises the full connect / set-filters
        / broadcast / disconnect path end-to-end without any service beyond the `TestClient`.\n\n##
        Change set (single commit)\n\n**`35d94ea` \u2014 Add integration test for
        OpenStack events WebSocket endpoint**\n\n- **`tests/integration/test_api_websocket.py`**
        (new, 133 lines) \u2014 five test cases covering:\n  - `test_websocket_connect_is_accepted`
        \u2014 the WebSocket upgrade is accepted.\n  - `test_set_filters_is_acknowledged`
        \u2014 a `set_filters` message is processed and acknowledged verbatim (`filter_update`
        / `success`, echoing the event/node/service filters).\n  - `test_matching_event_is_delivered`
        \u2014 an event matching the connection's filters is delivered intact (compared
        against `EventMessage.to_dict()`).\n  - `test_non_matching_event_is_filtered_out`
        \u2014 a non-matching event is dropped; a FIFO-following sentinel event proves
        the drop without relying on an absence/timeout.\n  - `test_disconnect_drops_connection_count`
        \u2014 disconnect runs the `finally` cleanup and the connection count returns
        to its pre-connect value.\n- **`Pipfile` / `Pipfile.lock`** \u2014 add `pytest-timeout==2.4.0`
        to dev dependencies.\n\n## Notes for the reviewer\n\n- **Module-scoped `client`
        fixture.** The global `websocket_manager` owns module-level `asyncio` primitives
        (`event_queue`, `_lock`) that bind to the first event loop that touches them
        and raise \"bound to a different event loop\" otherwise. A single module-scoped
        `TestClient` keeps one loop alive across the module so those primitives stay
        valid. `osism.api` is imported lazily inside the fixture because importing
        it wires the event bridge to Redis at module load \u2014 safe only in the
        integration environment.\n- **Loop-bound queue.** Events are enqueued from
        the app's event loop via `client.portal.call(websocket_manager.add_event,
        ...)` rather than from the test thread, because the queue is loop-bound.\n-
        **Divergence from the issue:** the issue (#2407) only asks for the integration
        test. This PR additionally adds `pytest-timeout==2.4.0` as a dev dependency
        and applies `pytest.mark.timeout(30)` to the module. Without it, the blocking
        `ws.receive_json()` calls (Starlette's untimed `queue.get()`) would hang forever
        on a regression and only die on the CI wall-clock timeout; the cap turns such
        a hang into a precise 30-second failure at the exact `receive_json()` call.
        The test is also tagged `integration` to share the FastAPI/`httpx` setup with
        the sibling facts test and stay in the same Tier 2 batch.\n\n---\n\n_Implemented
        by [planwerk-review](https://github.com/planwerk/planwerk-review) a24f4d9
        with Claude:claude-opus-4-8_\n"
      change_url: https://github.com/osism/python-osism/pull/2412
      child_jobs: []
      commit_id: 83ad893109fb8de74223bcd1223c9d8738603bb8
      event_id: c17601a0-75db-11f1-804d-ae13e486dbad
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/6c139d8315224ff1b4cd491c5695c987/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/6c139d8315224ff1b4cd491c5695c987/work/logs
        result_data_file: /var/lib/zuul/builds/6c139d8315224ff1b4cd491c5695c987/work/results.json
        src_root: /var/lib/zuul/builds/6c139d8315224ff1b4cd491c5695c987/work/src
        work_root: /var/lib/zuul/builds/6c139d8315224ff1b4cd491c5695c987/work
      include_vars: []
      items:
      - branch: main
        change: '2412'
        change_message: "Add integration test for OpenStack events WebSocket endpoint\n\nCloses
          #2407\n\n## What this does\n\nAdds an integration test for the OpenStack
          events WebSocket endpoint `GET /v1/events/openstack`, driving it through
          `fastapi.testclient.TestClient`. The endpoint upgrades to a WebSocket served
          by the in-process `websocket_manager` (`osism/services/websocket_manager.py`),
          which broadcasts via an in-process `asyncio` queue \u2014 so the test exercises
          the full connect / set-filters / broadcast / disconnect path end-to-end
          without any service beyond the `TestClient`.\n\n## Change set (single commit)\n\n**`35d94ea`
          \u2014 Add integration test for OpenStack events WebSocket endpoint**\n\n-
          **`tests/integration/test_api_websocket.py`** (new, 133 lines) \u2014 five
          test cases covering:\n  - `test_websocket_connect_is_accepted` \u2014 the
          WebSocket upgrade is accepted.\n  - `test_set_filters_is_acknowledged` \u2014
          a `set_filters` message is processed and acknowledged verbatim (`filter_update`
          / `success`, echoing the event/node/service filters).\n  - `test_matching_event_is_delivered`
          \u2014 an event matching the connection's filters is delivered intact (compared
          against `EventMessage.to_dict()`).\n  - `test_non_matching_event_is_filtered_out`
          \u2014 a non-matching event is dropped; a FIFO-following sentinel event
          proves the drop without relying on an absence/timeout.\n  - `test_disconnect_drops_connection_count`
          \u2014 disconnect runs the `finally` cleanup and the connection count returns
          to its pre-connect value.\n- **`Pipfile` / `Pipfile.lock`** \u2014 add `pytest-timeout==2.4.0`
          to dev dependencies.\n\n## Notes for the reviewer\n\n- **Module-scoped `client`
          fixture.** The global `websocket_manager` owns module-level `asyncio` primitives
          (`event_queue`, `_lock`) that bind to the first event loop that touches
          them and raise \"bound to a different event loop\" otherwise. A single module-scoped
          `TestClient` keeps one loop alive across the module so those primitives
          stay valid. `osism.api` is imported lazily inside the fixture because importing
          it wires the event bridge to Redis at module load \u2014 safe only in the
          integration environment.\n- **Loop-bound queue.** Events are enqueued from
          the app's event loop via `client.portal.call(websocket_manager.add_event,
          ...)` rather than from the test thread, because the queue is loop-bound.\n-
          **Divergence from the issue:** the issue (#2407) only asks for the integration
          test. This PR additionally adds `pytest-timeout==2.4.0` as a dev dependency
          and applies `pytest.mark.timeout(30)` to the module. Without it, the blocking
          `ws.receive_json()` calls (Starlette's untimed `queue.get()`) would hang
          forever on a regression and only die on the CI wall-clock timeout; the cap
          turns such a hang into a precise 30-second failure at the exact `receive_json()`
          call. The test is also tagged `integration` to share the FastAPI/`httpx`
          setup with the sibling facts test and stay in the same Tier 2 batch.\n\n---\n\n_Implemented
          by [planwerk-review](https://github.com/planwerk/planwerk-review) a24f4d9
          with Claude:claude-opus-4-8_\n"
        change_url: https://github.com/osism/python-osism/pull/2412
        commit_id: 83ad893109fb8de74223bcd1223c9d8738603bb8
        patchset: 83ad893109fb8de74223bcd1223c9d8738603bb8
        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: flake8
      jobtags: []
      max_attempts: 3
      message: QWRkIGludGVncmF0aW9uIHRlc3QgZm9yIE9wZW5TdGFjayBldmVudHMgV2ViU29ja2V0IGVuZHBvaW50CgpDbG9zZXMgIzI0MDcKCiMjIFdoYXQgdGhpcyBkb2VzCgpBZGRzIGFuIGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBPcGVuU3RhY2sgZXZlbnRzIFdlYlNvY2tldCBlbmRwb2ludCBgR0VUIC92MS9ldmVudHMvb3BlbnN0YWNrYCwgZHJpdmluZyBpdCB0aHJvdWdoIGBmYXN0YXBpLnRlc3RjbGllbnQuVGVzdENsaWVudGAuIFRoZSBlbmRwb2ludCB1cGdyYWRlcyB0byBhIFdlYlNvY2tldCBzZXJ2ZWQgYnkgdGhlIGluLXByb2Nlc3MgYHdlYnNvY2tldF9tYW5hZ2VyYCAoYG9zaXNtL3NlcnZpY2VzL3dlYnNvY2tldF9tYW5hZ2VyLnB5YCksIHdoaWNoIGJyb2FkY2FzdHMgdmlhIGFuIGluLXByb2Nlc3MgYGFzeW5jaW9gIHF1ZXVlIOKAlCBzbyB0aGUgdGVzdCBleGVyY2lzZXMgdGhlIGZ1bGwgY29ubmVjdCAvIHNldC1maWx0ZXJzIC8gYnJvYWRjYXN0IC8gZGlzY29ubmVjdCBwYXRoIGVuZC10by1lbmQgd2l0aG91dCBhbnkgc2VydmljZSBiZXlvbmQgdGhlIGBUZXN0Q2xpZW50YC4KCiMjIENoYW5nZSBzZXQgKHNpbmdsZSBjb21taXQpCgoqKmAzNWQ5NGVhYCDigJQgQWRkIGludGVncmF0aW9uIHRlc3QgZm9yIE9wZW5TdGFjayBldmVudHMgV2ViU29ja2V0IGVuZHBvaW50KioKCi0gKipgdGVzdHMvaW50ZWdyYXRpb24vdGVzdF9hcGlfd2Vic29ja2V0LnB5YCoqIChuZXcsIDEzMyBsaW5lcykg4oCUIGZpdmUgdGVzdCBjYXNlcyBjb3ZlcmluZzoKICAtIGB0ZXN0X3dlYnNvY2tldF9jb25uZWN0X2lzX2FjY2VwdGVkYCDigJQgdGhlIFdlYlNvY2tldCB1cGdyYWRlIGlzIGFjY2VwdGVkLgogIC0gYHRlc3Rfc2V0X2ZpbHRlcnNfaXNfYWNrbm93bGVkZ2VkYCDigJQgYSBgc2V0X2ZpbHRlcnNgIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkIGFuZCBhY2tub3dsZWRnZWQgdmVyYmF0aW0gKGBmaWx0ZXJfdXBkYXRlYCAvIGBzdWNjZXNzYCwgZWNob2luZyB0aGUgZXZlbnQvbm9kZS9zZXJ2aWNlIGZpbHRlcnMpLgogIC0gYHRlc3RfbWF0Y2hpbmdfZXZlbnRfaXNfZGVsaXZlcmVkYCDigJQgYW4gZXZlbnQgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rpb24ncyBmaWx0ZXJzIGlzIGRlbGl2ZXJlZCBpbnRhY3QgKGNvbXBhcmVkIGFnYWluc3QgYEV2ZW50TWVzc2FnZS50b19kaWN0KClgKS4KICAtIGB0ZXN0X25vbl9tYXRjaGluZ19ldmVudF9pc19maWx0ZXJlZF9vdXRgIOKAlCBhIG5vbi1tYXRjaGluZyBldmVudCBpcyBkcm9wcGVkOyBhIEZJRk8tZm9sbG93aW5nIHNlbnRpbmVsIGV2ZW50IHByb3ZlcyB0aGUgZHJvcCB3aXRob3V0IHJlbHlpbmcgb24gYW4gYWJzZW5jZS90aW1lb3V0LgogIC0gYHRlc3RfZGlzY29ubmVjdF9kcm9wc19jb25uZWN0aW9uX2NvdW50YCDigJQgZGlzY29ubmVjdCBydW5zIHRoZSBgZmluYWxseWAgY2xlYW51cCBhbmQgdGhlIGNvbm5lY3Rpb24gY291bnQgcmV0dXJucyB0byBpdHMgcHJlLWNvbm5lY3QgdmFsdWUuCi0gKipgUGlwZmlsZWAgLyBgUGlwZmlsZS5sb2NrYCoqIOKAlCBhZGQgYHB5dGVzdC10aW1lb3V0PT0yLjQuMGAgdG8gZGV2IGRlcGVuZGVuY2llcy4KCiMjIE5vdGVzIGZvciB0aGUgcmV2aWV3ZXIKCi0gKipNb2R1bGUtc2NvcGVkIGBjbGllbnRgIGZpeHR1cmUuKiogVGhlIGdsb2JhbCBgd2Vic29ja2V0X21hbmFnZXJgIG93bnMgbW9kdWxlLWxldmVsIGBhc3luY2lvYCBwcmltaXRpdmVzIChgZXZlbnRfcXVldWVgLCBgX2xvY2tgKSB0aGF0IGJpbmQgdG8gdGhlIGZpcnN0IGV2ZW50IGxvb3AgdGhhdCB0b3VjaGVzIHRoZW0gYW5kIHJhaXNlICJib3VuZCB0byBhIGRpZmZlcmVudCBldmVudCBsb29wIiBvdGhlcndpc2UuIEEgc2luZ2xlIG1vZHVsZS1zY29wZWQgYFRlc3RDbGllbnRgIGtlZXBzIG9uZSBsb29wIGFsaXZlIGFjcm9zcyB0aGUgbW9kdWxlIHNvIHRob3NlIHByaW1pdGl2ZXMgc3RheSB2YWxpZC4gYG9zaXNtLmFwaWAgaXMgaW1wb3J0ZWQgbGF6aWx5IGluc2lkZSB0aGUgZml4dHVyZSBiZWNhdXNlIGltcG9ydGluZyBpdCB3aXJlcyB0aGUgZXZlbnQgYnJpZGdlIHRvIFJlZGlzIGF0IG1vZHVsZSBsb2FkIOKAlCBzYWZlIG9ubHkgaW4gdGhlIGludGVncmF0aW9uIGVudmlyb25tZW50LgotICoqTG9vcC1ib3VuZCBxdWV1ZS4qKiBFdmVudHMgYXJlIGVucXVldWVkIGZyb20gdGhlIGFwcCdzIGV2ZW50IGxvb3AgdmlhIGBjbGllbnQucG9ydGFsLmNhbGwod2Vic29ja2V0X21hbmFnZXIuYWRkX2V2ZW50LCAuLi4pYCByYXRoZXIgdGhhbiBmcm9tIHRoZSB0ZXN0IHRocmVhZCwgYmVjYXVzZSB0aGUgcXVldWUgaXMgbG9vcC1ib3VuZC4KLSAqKkRpdmVyZ2VuY2UgZnJvbSB0aGUgaXNzdWU6KiogdGhlIGlzc3VlICgjMjQwNykgb25seSBhc2tzIGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdC4gVGhpcyBQUiBhZGRpdGlvbmFsbHkgYWRkcyBgcHl0ZXN0LXRpbWVvdXQ9PTIuNC4wYCBhcyBhIGRldiBkZXBlbmRlbmN5IGFuZCBhcHBsaWVzIGBweXRlc3QubWFyay50aW1lb3V0KDMwKWAgdG8gdGhlIG1vZHVsZS4gV2l0aG91dCBpdCwgdGhlIGJsb2NraW5nIGB3cy5yZWNlaXZlX2pzb24oKWAgY2FsbHMgKFN0YXJsZXR0ZSdzIHVudGltZWQgYHF1ZXVlLmdldCgpYCkgd291bGQgaGFuZyBmb3JldmVyIG9uIGEgcmVncmVzc2lvbiBhbmQgb25seSBkaWUgb24gdGhlIENJIHdhbGwtY2xvY2sgdGltZW91dDsgdGhlIGNhcCB0dXJucyBzdWNoIGEgaGFuZyBpbnRvIGEgcHJlY2lzZSAzMC1zZWNvbmQgZmFpbHVyZSBhdCB0aGUgZXhhY3QgYHJlY2VpdmVfanNvbigpYCBjYWxsLiBUaGUgdGVzdCBpcyBhbHNvIHRhZ2dlZCBgaW50ZWdyYXRpb25gIHRvIHNoYXJlIHRoZSBGYXN0QVBJL2BodHRweGAgc2V0dXAgd2l0aCB0aGUgc2libGluZyBmYWN0cyB0ZXN0IGFuZCBzdGF5IGluIHRoZSBzYW1lIFRpZXIgMiBiYXRjaC4KCi0tLQoKX0ltcGxlbWVudGVkIGJ5IFtwbGFud2Vyay1yZXZpZXddKGh0dHBzOi8vZ2l0aHViLmNvbS9wbGFud2Vyay9wbGFud2Vyay1yZXZpZXcpIGEyNGY0ZDkgd2l0aCBDbGF1ZGU6Y2xhdWRlLW9wdXMtNC04Xwo=
      patchset: 83ad893109fb8de74223bcd1223c9d8738603bb8
      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/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          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
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/flake8/run.yaml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_0/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_0/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_1/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_2/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: e13044bb120028b14b669ed00bc2ce207596e5db
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2412/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
