all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe39:d335
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 758b3f29-92f7-4b6c-b626-f73bacc92890
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe39:d335
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.103
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.177
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe39:d335
        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-test-setup explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#128>'
      - '<Job python-osism-test-setup explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: fff4a7af771e4a469eb24ef6662c5964
      build_refs:
      - branch: main
        change: '2551'
        change_message: "Add integration tests for the EventBridge pub/sub round trip\n\nAdds
          live-Redis integration tests for the cross-container event path in\n`osism/services/event_bridge.py`,
          the last open Tier 1 item of #2400.\n\n`EventBridge.add_event` publishes
          an event as JSON to a Redis pub/sub channel,\nand a second `EventBridge`
          picks it up in a background thread and forwards it\nto its websocket manager.
          That path is how OpenStack notifications travel from\nthe listener container
          to WebSocket clients of the API container\n(`osism/services/listener.py:415-418`
          publishes, `osism/api.py:156` receives).\nUntil now every test of it replaced
          Redis with a `MagicMock`, so no test had\nshown a real `PUBLISH` reaching
          a real subscriber connection, a real thread\ndecoding it, or a real shutdown
          reclaiming the threads.\n\nThe two commits:\n\n1. `fb0ef8d` \u2014 Reference
          the event bridge channel through a module constant.\n   The literal `\"osism:events\"`
          appeared at the publish, the\n   publish-after-reconnect and the subscribe
          site. It becomes\n   `EVENTS_CHANNEL`, read from the module globals at call
          time. The value is\n   unchanged, so this is a testability hoist with no
          behavior change.\n\n2. `4a8cf81` \u2014 Add the new module `tests/integration/test_event_bridge.py`\n
          \  with six tests: the published wire format seen by a raw `redis.pubsub()`\n
          \  subscriber, a bridge-to-bridge round trip with a nested payload, an empty\n
          \  payload, the warning when nobody subscribes, recovery from a malformed
          and\n   an incomplete frame, and shutdown ending both background threads.\n\nEach
          test monkeypatches `EVENTS_CHANNEL` to its own `itest-events-<uuid4>`\nchannel.
          That isolation is what makes the tests deterministic: the sibling\nmodules
          `tests/integration/test_api_facts.py` and\n`tests/integration/test_api_websocket.py`
          import `osism.api`, which subscribes\nthe module-level `event_bridge` singleton
          to the real channel for the rest of\nthe session. On a shared channel the
          singleton would consume test events and\nno channel would ever report zero
          subscribers.\n\nEvery publish a test expects to be received is gated on
          `PUBSUB NUMSUB`\nreporting a subscriber first, since `EventBridge` subscribes
          inside its\nbackground thread rather than in `set_websocket_manager`. Every
          wait runs\nthrough a deadline helper that calls `pytest.fail`, so a regression
          fails at\nthe wait that never finished instead of hanging until the CI wall
          clock.\n\nNo infrastructure changes: `tests/integration/conftest.py`,\n`playbooks/test-integration.yml`,
          `Pipfile` and `setup.cfg` are untouched, and\n`pytest-timeout` was already
          a dev dependency. Without a reachable Redis the\nmodule skips through the
          existing logic in `tests/integration/conftest.py:70`.\n\nThe six tests have
          not run outside CI; the `python-osism-integration-tests`\njob is the first
          environment with a live Redis to execute them.\n\nCloses #2405\n\n---\n\n_Implemented
          by [planwerk-agent](https://github.com/planwerk/planwerk-agent) with Claude:claude-fable-5_\n"
        change_url: https://github.com/osism/python-osism/pull/2551
        commit_id: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
        patchset: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
        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: 55623d723fef41fd8123ec9792d81caa
      buildset_refs:
      - branch: main
        change: '2551'
        change_message: "Add integration tests for the EventBridge pub/sub round trip\n\nAdds
          live-Redis integration tests for the cross-container event path in\n`osism/services/event_bridge.py`,
          the last open Tier 1 item of #2400.\n\n`EventBridge.add_event` publishes
          an event as JSON to a Redis pub/sub channel,\nand a second `EventBridge`
          picks it up in a background thread and forwards it\nto its websocket manager.
          That path is how OpenStack notifications travel from\nthe listener container
          to WebSocket clients of the API container\n(`osism/services/listener.py:415-418`
          publishes, `osism/api.py:156` receives).\nUntil now every test of it replaced
          Redis with a `MagicMock`, so no test had\nshown a real `PUBLISH` reaching
          a real subscriber connection, a real thread\ndecoding it, or a real shutdown
          reclaiming the threads.\n\nThe two commits:\n\n1. `fb0ef8d` \u2014 Reference
          the event bridge channel through a module constant.\n   The literal `\"osism:events\"`
          appeared at the publish, the\n   publish-after-reconnect and the subscribe
          site. It becomes\n   `EVENTS_CHANNEL`, read from the module globals at call
          time. The value is\n   unchanged, so this is a testability hoist with no
          behavior change.\n\n2. `4a8cf81` \u2014 Add the new module `tests/integration/test_event_bridge.py`\n
          \  with six tests: the published wire format seen by a raw `redis.pubsub()`\n
          \  subscriber, a bridge-to-bridge round trip with a nested payload, an empty\n
          \  payload, the warning when nobody subscribes, recovery from a malformed
          and\n   an incomplete frame, and shutdown ending both background threads.\n\nEach
          test monkeypatches `EVENTS_CHANNEL` to its own `itest-events-<uuid4>`\nchannel.
          That isolation is what makes the tests deterministic: the sibling\nmodules
          `tests/integration/test_api_facts.py` and\n`tests/integration/test_api_websocket.py`
          import `osism.api`, which subscribes\nthe module-level `event_bridge` singleton
          to the real channel for the rest of\nthe session. On a shared channel the
          singleton would consume test events and\nno channel would ever report zero
          subscribers.\n\nEvery publish a test expects to be received is gated on
          `PUBSUB NUMSUB`\nreporting a subscriber first, since `EventBridge` subscribes
          inside its\nbackground thread rather than in `set_websocket_manager`. Every
          wait runs\nthrough a deadline helper that calls `pytest.fail`, so a regression
          fails at\nthe wait that never finished instead of hanging until the CI wall
          clock.\n\nNo infrastructure changes: `tests/integration/conftest.py`,\n`playbooks/test-integration.yml`,
          `Pipfile` and `setup.cfg` are untouched, and\n`pytest-timeout` was already
          a dev dependency. Without a reachable Redis the\nmodule skips through the
          existing logic in `tests/integration/conftest.py:70`.\n\nThe six tests have
          not run outside CI; the `python-osism-integration-tests`\njob is the first
          environment with a live Redis to execute them.\n\nCloses #2405\n\n---\n\n_Implemented
          by [planwerk-agent](https://github.com/planwerk/planwerk-agent) with Claude:claude-fable-5_\n"
        change_url: https://github.com/osism/python-osism/pull/2551
        commit_id: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
        patchset: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
        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: '2551'
      change_message: "Add integration tests for the EventBridge pub/sub round trip\n\nAdds
        live-Redis integration tests for the cross-container event path in\n`osism/services/event_bridge.py`,
        the last open Tier 1 item of #2400.\n\n`EventBridge.add_event` publishes an
        event as JSON to a Redis pub/sub channel,\nand a second `EventBridge` picks
        it up in a background thread and forwards it\nto its websocket manager. That
        path is how OpenStack notifications travel from\nthe listener container to
        WebSocket clients of the API container\n(`osism/services/listener.py:415-418`
        publishes, `osism/api.py:156` receives).\nUntil now every test of it replaced
        Redis with a `MagicMock`, so no test had\nshown a real `PUBLISH` reaching
        a real subscriber connection, a real thread\ndecoding it, or a real shutdown
        reclaiming the threads.\n\nThe two commits:\n\n1. `fb0ef8d` \u2014 Reference
        the event bridge channel through a module constant.\n   The literal `\"osism:events\"`
        appeared at the publish, the\n   publish-after-reconnect and the subscribe
        site. It becomes\n   `EVENTS_CHANNEL`, read from the module globals at call
        time. The value is\n   unchanged, so this is a testability hoist with no behavior
        change.\n\n2. `4a8cf81` \u2014 Add the new module `tests/integration/test_event_bridge.py`\n
        \  with six tests: the published wire format seen by a raw `redis.pubsub()`\n
        \  subscriber, a bridge-to-bridge round trip with a nested payload, an empty\n
        \  payload, the warning when nobody subscribes, recovery from a malformed
        and\n   an incomplete frame, and shutdown ending both background threads.\n\nEach
        test monkeypatches `EVENTS_CHANNEL` to its own `itest-events-<uuid4>`\nchannel.
        That isolation is what makes the tests deterministic: the sibling\nmodules
        `tests/integration/test_api_facts.py` and\n`tests/integration/test_api_websocket.py`
        import `osism.api`, which subscribes\nthe module-level `event_bridge` singleton
        to the real channel for the rest of\nthe session. On a shared channel the
        singleton would consume test events and\nno channel would ever report zero
        subscribers.\n\nEvery publish a test expects to be received is gated on `PUBSUB
        NUMSUB`\nreporting a subscriber first, since `EventBridge` subscribes inside
        its\nbackground thread rather than in `set_websocket_manager`. Every wait
        runs\nthrough a deadline helper that calls `pytest.fail`, so a regression
        fails at\nthe wait that never finished instead of hanging until the CI wall
        clock.\n\nNo infrastructure changes: `tests/integration/conftest.py`,\n`playbooks/test-integration.yml`,
        `Pipfile` and `setup.cfg` are untouched, and\n`pytest-timeout` was already
        a dev dependency. Without a reachable Redis the\nmodule skips through the
        existing logic in `tests/integration/conftest.py:70`.\n\nThe six tests have
        not run outside CI; the `python-osism-integration-tests`\njob is the first
        environment with a live Redis to execute them.\n\nCloses #2405\n\n---\n\n_Implemented
        by [planwerk-agent](https://github.com/planwerk/planwerk-agent) with Claude:claude-fable-5_\n"
      change_url: https://github.com/osism/python-osism/pull/2551
      child_jobs: []
      commit_id: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
      event_id: a7a58300-8f25-11f1-96c4-c65d3fdd6449
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/fff4a7af771e4a469eb24ef6662c5964/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/fff4a7af771e4a469eb24ef6662c5964/work/logs
        result_data_file: /var/lib/zuul/builds/fff4a7af771e4a469eb24ef6662c5964/work/results.json
        src_root: /var/lib/zuul/builds/fff4a7af771e4a469eb24ef6662c5964/work/src
        work_root: /var/lib/zuul/builds/fff4a7af771e4a469eb24ef6662c5964/work
      include_vars: []
      items:
      - branch: main
        change: '2551'
        change_message: "Add integration tests for the EventBridge pub/sub round trip\n\nAdds
          live-Redis integration tests for the cross-container event path in\n`osism/services/event_bridge.py`,
          the last open Tier 1 item of #2400.\n\n`EventBridge.add_event` publishes
          an event as JSON to a Redis pub/sub channel,\nand a second `EventBridge`
          picks it up in a background thread and forwards it\nto its websocket manager.
          That path is how OpenStack notifications travel from\nthe listener container
          to WebSocket clients of the API container\n(`osism/services/listener.py:415-418`
          publishes, `osism/api.py:156` receives).\nUntil now every test of it replaced
          Redis with a `MagicMock`, so no test had\nshown a real `PUBLISH` reaching
          a real subscriber connection, a real thread\ndecoding it, or a real shutdown
          reclaiming the threads.\n\nThe two commits:\n\n1. `fb0ef8d` \u2014 Reference
          the event bridge channel through a module constant.\n   The literal `\"osism:events\"`
          appeared at the publish, the\n   publish-after-reconnect and the subscribe
          site. It becomes\n   `EVENTS_CHANNEL`, read from the module globals at call
          time. The value is\n   unchanged, so this is a testability hoist with no
          behavior change.\n\n2. `4a8cf81` \u2014 Add the new module `tests/integration/test_event_bridge.py`\n
          \  with six tests: the published wire format seen by a raw `redis.pubsub()`\n
          \  subscriber, a bridge-to-bridge round trip with a nested payload, an empty\n
          \  payload, the warning when nobody subscribes, recovery from a malformed
          and\n   an incomplete frame, and shutdown ending both background threads.\n\nEach
          test monkeypatches `EVENTS_CHANNEL` to its own `itest-events-<uuid4>`\nchannel.
          That isolation is what makes the tests deterministic: the sibling\nmodules
          `tests/integration/test_api_facts.py` and\n`tests/integration/test_api_websocket.py`
          import `osism.api`, which subscribes\nthe module-level `event_bridge` singleton
          to the real channel for the rest of\nthe session. On a shared channel the
          singleton would consume test events and\nno channel would ever report zero
          subscribers.\n\nEvery publish a test expects to be received is gated on
          `PUBSUB NUMSUB`\nreporting a subscriber first, since `EventBridge` subscribes
          inside its\nbackground thread rather than in `set_websocket_manager`. Every
          wait runs\nthrough a deadline helper that calls `pytest.fail`, so a regression
          fails at\nthe wait that never finished instead of hanging until the CI wall
          clock.\n\nNo infrastructure changes: `tests/integration/conftest.py`,\n`playbooks/test-integration.yml`,
          `Pipfile` and `setup.cfg` are untouched, and\n`pytest-timeout` was already
          a dev dependency. Without a reachable Redis the\nmodule skips through the
          existing logic in `tests/integration/conftest.py:70`.\n\nThe six tests have
          not run outside CI; the `python-osism-integration-tests`\njob is the first
          environment with a live Redis to execute them.\n\nCloses #2405\n\n---\n\n_Implemented
          by [planwerk-agent](https://github.com/planwerk/planwerk-agent) with Claude:claude-fable-5_\n"
        change_url: https://github.com/osism/python-osism/pull/2551
        commit_id: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
        patchset: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
        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-test-setup
      jobtags: []
      max_attempts: 3
      message: QWRkIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgRXZlbnRCcmlkZ2UgcHViL3N1YiByb3VuZCB0cmlwCgpBZGRzIGxpdmUtUmVkaXMgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjcm9zcy1jb250YWluZXIgZXZlbnQgcGF0aCBpbgpgb3Npc20vc2VydmljZXMvZXZlbnRfYnJpZGdlLnB5YCwgdGhlIGxhc3Qgb3BlbiBUaWVyIDEgaXRlbSBvZiAjMjQwMC4KCmBFdmVudEJyaWRnZS5hZGRfZXZlbnRgIHB1Ymxpc2hlcyBhbiBldmVudCBhcyBKU09OIHRvIGEgUmVkaXMgcHViL3N1YiBjaGFubmVsLAphbmQgYSBzZWNvbmQgYEV2ZW50QnJpZGdlYCBwaWNrcyBpdCB1cCBpbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZCBmb3J3YXJkcyBpdAp0byBpdHMgd2Vic29ja2V0IG1hbmFnZXIuIFRoYXQgcGF0aCBpcyBob3cgT3BlblN0YWNrIG5vdGlmaWNhdGlvbnMgdHJhdmVsIGZyb20KdGhlIGxpc3RlbmVyIGNvbnRhaW5lciB0byBXZWJTb2NrZXQgY2xpZW50cyBvZiB0aGUgQVBJIGNvbnRhaW5lcgooYG9zaXNtL3NlcnZpY2VzL2xpc3RlbmVyLnB5OjQxNS00MThgIHB1Ymxpc2hlcywgYG9zaXNtL2FwaS5weToxNTZgIHJlY2VpdmVzKS4KVW50aWwgbm93IGV2ZXJ5IHRlc3Qgb2YgaXQgcmVwbGFjZWQgUmVkaXMgd2l0aCBhIGBNYWdpY01vY2tgLCBzbyBubyB0ZXN0IGhhZApzaG93biBhIHJlYWwgYFBVQkxJU0hgIHJlYWNoaW5nIGEgcmVhbCBzdWJzY3JpYmVyIGNvbm5lY3Rpb24sIGEgcmVhbCB0aHJlYWQKZGVjb2RpbmcgaXQsIG9yIGEgcmVhbCBzaHV0ZG93biByZWNsYWltaW5nIHRoZSB0aHJlYWRzLgoKVGhlIHR3byBjb21taXRzOgoKMS4gYGZiMGVmOGRgIOKAlCBSZWZlcmVuY2UgdGhlIGV2ZW50IGJyaWRnZSBjaGFubmVsIHRocm91Z2ggYSBtb2R1bGUgY29uc3RhbnQuCiAgIFRoZSBsaXRlcmFsIGAib3Npc206ZXZlbnRzImAgYXBwZWFyZWQgYXQgdGhlIHB1Ymxpc2gsIHRoZQogICBwdWJsaXNoLWFmdGVyLXJlY29ubmVjdCBhbmQgdGhlIHN1YnNjcmliZSBzaXRlLiBJdCBiZWNvbWVzCiAgIGBFVkVOVFNfQ0hBTk5FTGAsIHJlYWQgZnJvbSB0aGUgbW9kdWxlIGdsb2JhbHMgYXQgY2FsbCB0aW1lLiBUaGUgdmFsdWUgaXMKICAgdW5jaGFuZ2VkLCBzbyB0aGlzIGlzIGEgdGVzdGFiaWxpdHkgaG9pc3Qgd2l0aCBubyBiZWhhdmlvciBjaGFuZ2UuCgoyLiBgNGE4Y2Y4MWAg4oCUIEFkZCB0aGUgbmV3IG1vZHVsZSBgdGVzdHMvaW50ZWdyYXRpb24vdGVzdF9ldmVudF9icmlkZ2UucHlgCiAgIHdpdGggc2l4IHRlc3RzOiB0aGUgcHVibGlzaGVkIHdpcmUgZm9ybWF0IHNlZW4gYnkgYSByYXcgYHJlZGlzLnB1YnN1YigpYAogICBzdWJzY3JpYmVyLCBhIGJyaWRnZS10by1icmlkZ2Ugcm91bmQgdHJpcCB3aXRoIGEgbmVzdGVkIHBheWxvYWQsIGFuIGVtcHR5CiAgIHBheWxvYWQsIHRoZSB3YXJuaW5nIHdoZW4gbm9ib2R5IHN1YnNjcmliZXMsIHJlY292ZXJ5IGZyb20gYSBtYWxmb3JtZWQgYW5kCiAgIGFuIGluY29tcGxldGUgZnJhbWUsIGFuZCBzaHV0ZG93biBlbmRpbmcgYm90aCBiYWNrZ3JvdW5kIHRocmVhZHMuCgpFYWNoIHRlc3QgbW9ua2V5cGF0Y2hlcyBgRVZFTlRTX0NIQU5ORUxgIHRvIGl0cyBvd24gYGl0ZXN0LWV2ZW50cy08dXVpZDQ+YApjaGFubmVsLiBUaGF0IGlzb2xhdGlvbiBpcyB3aGF0IG1ha2VzIHRoZSB0ZXN0cyBkZXRlcm1pbmlzdGljOiB0aGUgc2libGluZwptb2R1bGVzIGB0ZXN0cy9pbnRlZ3JhdGlvbi90ZXN0X2FwaV9mYWN0cy5weWAgYW5kCmB0ZXN0cy9pbnRlZ3JhdGlvbi90ZXN0X2FwaV93ZWJzb2NrZXQucHlgIGltcG9ydCBgb3Npc20uYXBpYCwgd2hpY2ggc3Vic2NyaWJlcwp0aGUgbW9kdWxlLWxldmVsIGBldmVudF9icmlkZ2VgIHNpbmdsZXRvbiB0byB0aGUgcmVhbCBjaGFubmVsIGZvciB0aGUgcmVzdCBvZgp0aGUgc2Vzc2lvbi4gT24gYSBzaGFyZWQgY2hhbm5lbCB0aGUgc2luZ2xldG9uIHdvdWxkIGNvbnN1bWUgdGVzdCBldmVudHMgYW5kCm5vIGNoYW5uZWwgd291bGQgZXZlciByZXBvcnQgemVybyBzdWJzY3JpYmVycy4KCkV2ZXJ5IHB1Ymxpc2ggYSB0ZXN0IGV4cGVjdHMgdG8gYmUgcmVjZWl2ZWQgaXMgZ2F0ZWQgb24gYFBVQlNVQiBOVU1TVUJgCnJlcG9ydGluZyBhIHN1YnNjcmliZXIgZmlyc3QsIHNpbmNlIGBFdmVudEJyaWRnZWAgc3Vic2NyaWJlcyBpbnNpZGUgaXRzCmJhY2tncm91bmQgdGhyZWFkIHJhdGhlciB0aGFuIGluIGBzZXRfd2Vic29ja2V0X21hbmFnZXJgLiBFdmVyeSB3YWl0IHJ1bnMKdGhyb3VnaCBhIGRlYWRsaW5lIGhlbHBlciB0aGF0IGNhbGxzIGBweXRlc3QuZmFpbGAsIHNvIGEgcmVncmVzc2lvbiBmYWlscyBhdAp0aGUgd2FpdCB0aGF0IG5ldmVyIGZpbmlzaGVkIGluc3RlYWQgb2YgaGFuZ2luZyB1bnRpbCB0aGUgQ0kgd2FsbCBjbG9jay4KCk5vIGluZnJhc3RydWN0dXJlIGNoYW5nZXM6IGB0ZXN0cy9pbnRlZ3JhdGlvbi9jb25mdGVzdC5weWAsCmBwbGF5Ym9va3MvdGVzdC1pbnRlZ3JhdGlvbi55bWxgLCBgUGlwZmlsZWAgYW5kIGBzZXR1cC5jZmdgIGFyZSB1bnRvdWNoZWQsIGFuZApgcHl0ZXN0LXRpbWVvdXRgIHdhcyBhbHJlYWR5IGEgZGV2IGRlcGVuZGVuY3kuIFdpdGhvdXQgYSByZWFjaGFibGUgUmVkaXMgdGhlCm1vZHVsZSBza2lwcyB0aHJvdWdoIHRoZSBleGlzdGluZyBsb2dpYyBpbiBgdGVzdHMvaW50ZWdyYXRpb24vY29uZnRlc3QucHk6NzBgLgoKVGhlIHNpeCB0ZXN0cyBoYXZlIG5vdCBydW4gb3V0c2lkZSBDSTsgdGhlIGBweXRob24tb3Npc20taW50ZWdyYXRpb24tdGVzdHNgCmpvYiBpcyB0aGUgZmlyc3QgZW52aXJvbm1lbnQgd2l0aCBhIGxpdmUgUmVkaXMgdG8gZXhlY3V0ZSB0aGVtLgoKQ2xvc2VzICMyNDA1CgotLS0KCl9JbXBsZW1lbnRlZCBieSBbcGxhbndlcmstYWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9wbGFud2Vyay9wbGFud2Vyay1hZ2VudCkgd2l0aCBDbGF1ZGU6Y2xhdWRlLWZhYmxlLTVfCg==
      patchset: 4a8cf815f2fbe84eac6eeae9c04860c4068732ad
      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: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 562045c7ee5f5e3b2bc406f6d35d65c423802410
          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: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/test-setup.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: 562045c7ee5f5e3b2bc406f6d35d65c423802410
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2551/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
