all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fed9:5944
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 8915f498-8361-4c99-8926-3f0aab76b9db
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fed9:5944
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.11
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.107
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fed9:5944
        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: b59ca97814594e83abc55853ee0d96c1
      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. `1983084` \u2014 Let an
          `EventBridge` take the channel it publishes and\n   subscribes on. The literal
          `\"osism:events\"` appeared at the publish, the\n   publish-after-reconnect
          and the subscribe site. It becomes the\n   `EVENTS_CHANNEL` default of a
          new constructor parameter, which the three\n   sites read from the instance.
          The default is unchanged, so the singleton\n   and both production callers
          behave exactly as before.\n\n2. `2ec0f2b` \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 builds its bridges on its own `itest-events-<uuid4>` channel. That\nisolation
          is what makes the tests deterministic: the sibling modules\n`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 default channel
          for the rest\nof the session. On a shared channel the singleton would consume
          test events and\nno channel would ever report zero subscribers.\n\nThe constructor
          parameter is the only hook the tests need from the module. They\ntouch no
          private attribute: the shutdown test watches the two background\nthreads
          through `threading.enumerate()` by the names the module gives them,\nagainst
          a baseline taken before the bridge is built, which also makes it the\ncheck
          that actually matters -- no thread outlives its bridge.\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\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: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
        patchset: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
        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: 38cb62ab4eea4a31af394e5433c420cf
      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. `1983084` \u2014 Let an
          `EventBridge` take the channel it publishes and\n   subscribes on. The literal
          `\"osism:events\"` appeared at the publish, the\n   publish-after-reconnect
          and the subscribe site. It becomes the\n   `EVENTS_CHANNEL` default of a
          new constructor parameter, which the three\n   sites read from the instance.
          The default is unchanged, so the singleton\n   and both production callers
          behave exactly as before.\n\n2. `2ec0f2b` \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 builds its bridges on its own `itest-events-<uuid4>` channel. That\nisolation
          is what makes the tests deterministic: the sibling modules\n`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 default channel
          for the rest\nof the session. On a shared channel the singleton would consume
          test events and\nno channel would ever report zero subscribers.\n\nThe constructor
          parameter is the only hook the tests need from the module. They\ntouch no
          private attribute: the shutdown test watches the two background\nthreads
          through `threading.enumerate()` by the names the module gives them,\nagainst
          a baseline taken before the bridge is built, which also makes it the\ncheck
          that actually matters -- no thread outlives its bridge.\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\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: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
        patchset: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
        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. `1983084` \u2014 Let an
        `EventBridge` take the channel it publishes and\n   subscribes on. The literal
        `\"osism:events\"` appeared at the publish, the\n   publish-after-reconnect
        and the subscribe site. It becomes the\n   `EVENTS_CHANNEL` default of a new
        constructor parameter, which the three\n   sites read from the instance. The
        default is unchanged, so the singleton\n   and both production callers behave
        exactly as before.\n\n2. `2ec0f2b` \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 builds its bridges on its own `itest-events-<uuid4>` channel. That\nisolation
        is what makes the tests deterministic: the sibling modules\n`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 default channel for the rest\nof
        the session. On a shared channel the singleton would consume test events and\nno
        channel would ever report zero subscribers.\n\nThe constructor parameter is
        the only hook the tests need from the module. They\ntouch no private attribute:
        the shutdown test watches the two background\nthreads through `threading.enumerate()`
        by the names the module gives them,\nagainst a baseline taken before the bridge
        is built, which also makes it the\ncheck that actually matters -- no thread
        outlives its bridge.\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\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: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
      event_id: 4e6f5920-8f28-11f1-9d5f-e15dd2a9c3cc
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/b59ca97814594e83abc55853ee0d96c1/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/b59ca97814594e83abc55853ee0d96c1/work/logs
        result_data_file: /var/lib/zuul/builds/b59ca97814594e83abc55853ee0d96c1/work/results.json
        src_root: /var/lib/zuul/builds/b59ca97814594e83abc55853ee0d96c1/work/src
        work_root: /var/lib/zuul/builds/b59ca97814594e83abc55853ee0d96c1/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. `1983084` \u2014 Let an
          `EventBridge` take the channel it publishes and\n   subscribes on. The literal
          `\"osism:events\"` appeared at the publish, the\n   publish-after-reconnect
          and the subscribe site. It becomes the\n   `EVENTS_CHANNEL` default of a
          new constructor parameter, which the three\n   sites read from the instance.
          The default is unchanged, so the singleton\n   and both production callers
          behave exactly as before.\n\n2. `2ec0f2b` \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 builds its bridges on its own `itest-events-<uuid4>` channel. That\nisolation
          is what makes the tests deterministic: the sibling modules\n`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 default channel
          for the rest\nof the session. On a shared channel the singleton would consume
          test events and\nno channel would ever report zero subscribers.\n\nThe constructor
          parameter is the only hook the tests need from the module. They\ntouch no
          private attribute: the shutdown test watches the two background\nthreads
          through `threading.enumerate()` by the names the module gives them,\nagainst
          a baseline taken before the bridge is built, which also makes it the\ncheck
          that actually matters -- no thread outlives its bridge.\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\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: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
        patchset: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
        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: QWRkIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgRXZlbnRCcmlkZ2UgcHViL3N1YiByb3VuZCB0cmlwCgpBZGRzIGxpdmUtUmVkaXMgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjcm9zcy1jb250YWluZXIgZXZlbnQgcGF0aCBpbgpgb3Npc20vc2VydmljZXMvZXZlbnRfYnJpZGdlLnB5YCwgdGhlIGxhc3Qgb3BlbiBUaWVyIDEgaXRlbSBvZiAjMjQwMC4KCmBFdmVudEJyaWRnZS5hZGRfZXZlbnRgIHB1Ymxpc2hlcyBhbiBldmVudCBhcyBKU09OIHRvIGEgUmVkaXMgcHViL3N1YiBjaGFubmVsLAphbmQgYSBzZWNvbmQgYEV2ZW50QnJpZGdlYCBwaWNrcyBpdCB1cCBpbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZCBmb3J3YXJkcyBpdAp0byBpdHMgd2Vic29ja2V0IG1hbmFnZXIuIFRoYXQgcGF0aCBpcyBob3cgT3BlblN0YWNrIG5vdGlmaWNhdGlvbnMgdHJhdmVsIGZyb20KdGhlIGxpc3RlbmVyIGNvbnRhaW5lciB0byBXZWJTb2NrZXQgY2xpZW50cyBvZiB0aGUgQVBJIGNvbnRhaW5lcgooYG9zaXNtL3NlcnZpY2VzL2xpc3RlbmVyLnB5OjQxNS00MThgIHB1Ymxpc2hlcywgYG9zaXNtL2FwaS5weToxNTZgIHJlY2VpdmVzKS4KVW50aWwgbm93IGV2ZXJ5IHRlc3Qgb2YgaXQgcmVwbGFjZWQgUmVkaXMgd2l0aCBhIGBNYWdpY01vY2tgLCBzbyBubyB0ZXN0IGhhZApzaG93biBhIHJlYWwgYFBVQkxJU0hgIHJlYWNoaW5nIGEgcmVhbCBzdWJzY3JpYmVyIGNvbm5lY3Rpb24sIGEgcmVhbCB0aHJlYWQKZGVjb2RpbmcgaXQsIG9yIGEgcmVhbCBzaHV0ZG93biByZWNsYWltaW5nIHRoZSB0aHJlYWRzLgoKVGhlIHR3byBjb21taXRzOgoKMS4gYDE5ODMwODRgIOKAlCBMZXQgYW4gYEV2ZW50QnJpZGdlYCB0YWtlIHRoZSBjaGFubmVsIGl0IHB1Ymxpc2hlcyBhbmQKICAgc3Vic2NyaWJlcyBvbi4gVGhlIGxpdGVyYWwgYCJvc2lzbTpldmVudHMiYCBhcHBlYXJlZCBhdCB0aGUgcHVibGlzaCwgdGhlCiAgIHB1Ymxpc2gtYWZ0ZXItcmVjb25uZWN0IGFuZCB0aGUgc3Vic2NyaWJlIHNpdGUuIEl0IGJlY29tZXMgdGhlCiAgIGBFVkVOVFNfQ0hBTk5FTGAgZGVmYXVsdCBvZiBhIG5ldyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIsIHdoaWNoIHRoZSB0aHJlZQogICBzaXRlcyByZWFkIGZyb20gdGhlIGluc3RhbmNlLiBUaGUgZGVmYXVsdCBpcyB1bmNoYW5nZWQsIHNvIHRoZSBzaW5nbGV0b24KICAgYW5kIGJvdGggcHJvZHVjdGlvbiBjYWxsZXJzIGJlaGF2ZSBleGFjdGx5IGFzIGJlZm9yZS4KCjIuIGAyZWMwZjJiYCDigJQgQWRkIHRoZSBuZXcgbW9kdWxlIGB0ZXN0cy9pbnRlZ3JhdGlvbi90ZXN0X2V2ZW50X2JyaWRnZS5weWAKICAgd2l0aCBzaXggdGVzdHM6IHRoZSBwdWJsaXNoZWQgd2lyZSBmb3JtYXQgc2VlbiBieSBhIHJhdyBgcmVkaXMucHVic3ViKClgCiAgIHN1YnNjcmliZXIsIGEgYnJpZGdlLXRvLWJyaWRnZSByb3VuZCB0cmlwIHdpdGggYSBuZXN0ZWQgcGF5bG9hZCwgYW4gZW1wdHkKICAgcGF5bG9hZCwgdGhlIHdhcm5pbmcgd2hlbiBub2JvZHkgc3Vic2NyaWJlcywgcmVjb3ZlcnkgZnJvbSBhIG1hbGZvcm1lZCBhbmQKICAgYW4gaW5jb21wbGV0ZSBmcmFtZSwgYW5kIHNodXRkb3duIGVuZGluZyBib3RoIGJhY2tncm91bmQgdGhyZWFkcy4KCkVhY2ggdGVzdCBidWlsZHMgaXRzIGJyaWRnZXMgb24gaXRzIG93biBgaXRlc3QtZXZlbnRzLTx1dWlkND5gIGNoYW5uZWwuIFRoYXQKaXNvbGF0aW9uIGlzIHdoYXQgbWFrZXMgdGhlIHRlc3RzIGRldGVybWluaXN0aWM6IHRoZSBzaWJsaW5nIG1vZHVsZXMKYHRlc3RzL2ludGVncmF0aW9uL3Rlc3RfYXBpX2ZhY3RzLnB5YCBhbmQKYHRlc3RzL2ludGVncmF0aW9uL3Rlc3RfYXBpX3dlYnNvY2tldC5weWAgaW1wb3J0IGBvc2lzbS5hcGlgLCB3aGljaCBzdWJzY3JpYmVzCnRoZSBtb2R1bGUtbGV2ZWwgYGV2ZW50X2JyaWRnZWAgc2luZ2xldG9uIHRvIHRoZSBkZWZhdWx0IGNoYW5uZWwgZm9yIHRoZSByZXN0Cm9mIHRoZSBzZXNzaW9uLiBPbiBhIHNoYXJlZCBjaGFubmVsIHRoZSBzaW5nbGV0b24gd291bGQgY29uc3VtZSB0ZXN0IGV2ZW50cyBhbmQKbm8gY2hhbm5lbCB3b3VsZCBldmVyIHJlcG9ydCB6ZXJvIHN1YnNjcmliZXJzLgoKVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBpcyB0aGUgb25seSBob29rIHRoZSB0ZXN0cyBuZWVkIGZyb20gdGhlIG1vZHVsZS4gVGhleQp0b3VjaCBubyBwcml2YXRlIGF0dHJpYnV0ZTogdGhlIHNodXRkb3duIHRlc3Qgd2F0Y2hlcyB0aGUgdHdvIGJhY2tncm91bmQKdGhyZWFkcyB0aHJvdWdoIGB0aHJlYWRpbmcuZW51bWVyYXRlKClgIGJ5IHRoZSBuYW1lcyB0aGUgbW9kdWxlIGdpdmVzIHRoZW0sCmFnYWluc3QgYSBiYXNlbGluZSB0YWtlbiBiZWZvcmUgdGhlIGJyaWRnZSBpcyBidWlsdCwgd2hpY2ggYWxzbyBtYWtlcyBpdCB0aGUKY2hlY2sgdGhhdCBhY3R1YWxseSBtYXR0ZXJzIC0tIG5vIHRocmVhZCBvdXRsaXZlcyBpdHMgYnJpZGdlLgoKRXZlcnkgcHVibGlzaCBhIHRlc3QgZXhwZWN0cyB0byBiZSByZWNlaXZlZCBpcyBnYXRlZCBvbiBgUFVCU1VCIE5VTVNVQmAKcmVwb3J0aW5nIGEgc3Vic2NyaWJlciBmaXJzdCwgc2luY2UgYEV2ZW50QnJpZGdlYCBzdWJzY3JpYmVzIGluc2lkZSBpdHMKYmFja2dyb3VuZCB0aHJlYWQgcmF0aGVyIHRoYW4gaW4gYHNldF93ZWJzb2NrZXRfbWFuYWdlcmAuIEV2ZXJ5IHdhaXQgcnVucwp0aHJvdWdoIGEgZGVhZGxpbmUgaGVscGVyIHRoYXQgY2FsbHMgYHB5dGVzdC5mYWlsYCwgc28gYSByZWdyZXNzaW9uIGZhaWxzIGF0CnRoZSB3YWl0IHRoYXQgbmV2ZXIgZmluaXNoZWQgaW5zdGVhZCBvZiBoYW5naW5nIHVudGlsIHRoZSBDSSB3YWxsIGNsb2NrLgoKTm8gaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlczogYHRlc3RzL2ludGVncmF0aW9uL2NvbmZ0ZXN0LnB5YCwKYHBsYXlib29rcy90ZXN0LWludGVncmF0aW9uLnltbGAsIGBQaXBmaWxlYCBhbmQgYHNldHVwLmNmZ2AgYXJlIHVudG91Y2hlZCwgYW5kCmBweXRlc3QtdGltZW91dGAgd2FzIGFscmVhZHkgYSBkZXYgZGVwZW5kZW5jeS4gV2l0aG91dCBhIHJlYWNoYWJsZSBSZWRpcyB0aGUKbW9kdWxlIHNraXBzIHRocm91Z2ggdGhlIGV4aXN0aW5nIGxvZ2ljIGluIGB0ZXN0cy9pbnRlZ3JhdGlvbi9jb25mdGVzdC5weTo3MGAuCgpDbG9zZXMgIzI0MDUKCi0tLQoKX0ltcGxlbWVudGVkIGJ5IFtwbGFud2Vyay1hZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3BsYW53ZXJrL3BsYW53ZXJrLWFnZW50KSB3aXRoIENsYXVkZTpjbGF1ZGUtZmFibGUtNV8K
      patchset: 0786c9b12eb7bad79d1bc1eccb367d5daf67a05a
      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: 20bff1c4ad31a2f85966b5e22c8da0a5966c3f3b
          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-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: 20bff1c4ad31a2f85966b5e22c8da0a5966c3f3b
          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
