all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe9e:3968
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 39b8516a-1aa1-4d61-ab33-bcb1c9d4a63d
        host_id: 0d3d02185f810c959252bd1d303ec55040bf5bb0b401cceef814c3a7
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe9e:3968
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.95
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.198
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe9e:3968
        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#138>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 80251f8419a24a02abab52e40957e0ed
      build_refs:
      - branch: main
        change: '2352'
        change_message: "Add unit tests for osism/utils/rabbitmq.py\n\nCloses #2232\n\nAdds
          `tests/unit/utils/test_rabbitmq.py` covering both functions in\n`osism/utils/rabbitmq.py`.
          Test-only change; no production code is touched.\n\n## What is covered\n\n**`get_rabbitmq_node_addresses()`**\n\n-
          *Inventory & host discovery*: two hosts processed in alphabetical\n  order
          (happy path returning `[(\"10.0.0.5\",\"host1\"),(\"10.0.0.6\",\"host2\")]`);\n
          \ empty rabbitmq group \u2192 `None`; first `subprocess.check_output` raising\n
          \ `CalledProcessError`; invalid JSON from the group listing\n  (`JSONDecodeError`);
          outer generic exception.\n- *Per-host resolution*: cache miss skips the
          host and continues to the\n  next; missing `internal_interface`; literal
          interface name used\n  directly; Jinja2 template resolved via dotted-path
          traversal of the\n  facts; template resolving to a non-string (`None` /
          dict / int);\n  traversal hitting a non-dict mid-walk; interface-name normalization\n
          \ (`eth0.100` \u2192 `ansible_eth0_100`, `eth-0` \u2192 `ansible_eth_0`);
          missing\n  normalized interface key; interface without `ipv4`; `ipv4` without
          an\n  `address`.\n- *Aggregate*: all hosts skipped \u2192 `None`; at least
          one address \u2192 the\n  list is returned with no error logged.\n\n**`load_rabbitmq_password()`**
          \u2014 missing file; empty / invalid / non-dict\nsecrets; missing `rabbitmq_password`
          key; whitespace stripping; int\ncoercion; loader raising.\n\nPlus a check
          that the `RABBITMQ_USER` module constant is `\"openstack\"`.\n\n## Notes
          for the reviewer\n\n- **Redis mocking deviates from the issue's hint.**
          The issue suggested\n  `mocker.patch(\"osism.utils.rabbitmq.utils.redis\",
          ...)`, but that target\n  does not resolve: `redis` is a lazy `__getattr__`
          attribute on the\n  `osism.utils` *package*, and the function reads it via
          a function-local\n  `from osism import utils`, so the `rabbitmq` module
          never gains a `utils`\n  global (`AttributeError: module 'osism.utils.rabbitmq'
          has no attribute\n  'utils'`). Instead the cached attribute is seeded on
          the package\n  namespace with `mocker.patch.dict(osism.utils.__dict__, {\"redis\":
          ...})`,\n  which also bypasses the lazy initializer that would otherwise
          open a real\n  Redis connection. Reading the cache key the function builds
          is asserted in\n  the happy-path test.\n- `load_yaml_file` and `os.path.exists`
          are patched at the call site, as the\n  issue suggests.\n- Tests follow
          the existing `mocker` + `loguru_logs` conventions\n  (see `tests/unit/utils/test_init_connections.py`).\n\n##
          Verification\n\n- `pytest tests/unit/utils/test_rabbitmq.py --cov=osism.utils.rabbitmq`\n
          \ \u2192 **28 passed, 100% line coverage** (run in the CI-equivalent\n  environment
          where `ansible-core` is absent and `tests/conftest.py`\n  installs its ansible
          stubs).\n- `black --check`, `flake8`, `mypy` clean on the new file.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2352
        commit_id: 3807e56222657978e0ef44be18782fdfd112fe13
        patchset: 3807e56222657978e0ef44be18782fdfd112fe13
        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: 67dadf71d1b54f96a0c8b06aa7dd627e
      buildset_refs:
      - branch: main
        change: '2352'
        change_message: "Add unit tests for osism/utils/rabbitmq.py\n\nCloses #2232\n\nAdds
          `tests/unit/utils/test_rabbitmq.py` covering both functions in\n`osism/utils/rabbitmq.py`.
          Test-only change; no production code is touched.\n\n## What is covered\n\n**`get_rabbitmq_node_addresses()`**\n\n-
          *Inventory & host discovery*: two hosts processed in alphabetical\n  order
          (happy path returning `[(\"10.0.0.5\",\"host1\"),(\"10.0.0.6\",\"host2\")]`);\n
          \ empty rabbitmq group \u2192 `None`; first `subprocess.check_output` raising\n
          \ `CalledProcessError`; invalid JSON from the group listing\n  (`JSONDecodeError`);
          outer generic exception.\n- *Per-host resolution*: cache miss skips the
          host and continues to the\n  next; missing `internal_interface`; literal
          interface name used\n  directly; Jinja2 template resolved via dotted-path
          traversal of the\n  facts; template resolving to a non-string (`None` /
          dict / int);\n  traversal hitting a non-dict mid-walk; interface-name normalization\n
          \ (`eth0.100` \u2192 `ansible_eth0_100`, `eth-0` \u2192 `ansible_eth_0`);
          missing\n  normalized interface key; interface without `ipv4`; `ipv4` without
          an\n  `address`.\n- *Aggregate*: all hosts skipped \u2192 `None`; at least
          one address \u2192 the\n  list is returned with no error logged.\n\n**`load_rabbitmq_password()`**
          \u2014 missing file; empty / invalid / non-dict\nsecrets; missing `rabbitmq_password`
          key; whitespace stripping; int\ncoercion; loader raising.\n\nPlus a check
          that the `RABBITMQ_USER` module constant is `\"openstack\"`.\n\n## Notes
          for the reviewer\n\n- **Redis mocking deviates from the issue's hint.**
          The issue suggested\n  `mocker.patch(\"osism.utils.rabbitmq.utils.redis\",
          ...)`, but that target\n  does not resolve: `redis` is a lazy `__getattr__`
          attribute on the\n  `osism.utils` *package*, and the function reads it via
          a function-local\n  `from osism import utils`, so the `rabbitmq` module
          never gains a `utils`\n  global (`AttributeError: module 'osism.utils.rabbitmq'
          has no attribute\n  'utils'`). Instead the cached attribute is seeded on
          the package\n  namespace with `mocker.patch.dict(osism.utils.__dict__, {\"redis\":
          ...})`,\n  which also bypasses the lazy initializer that would otherwise
          open a real\n  Redis connection. Reading the cache key the function builds
          is asserted in\n  the happy-path test.\n- `load_yaml_file` and `os.path.exists`
          are patched at the call site, as the\n  issue suggests.\n- Tests follow
          the existing `mocker` + `loguru_logs` conventions\n  (see `tests/unit/utils/test_init_connections.py`).\n\n##
          Verification\n\n- `pytest tests/unit/utils/test_rabbitmq.py --cov=osism.utils.rabbitmq`\n
          \ \u2192 **28 passed, 100% line coverage** (run in the CI-equivalent\n  environment
          where `ansible-core` is absent and `tests/conftest.py`\n  installs its ansible
          stubs).\n- `black --check`, `flake8`, `mypy` clean on the new file.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2352
        commit_id: 3807e56222657978e0ef44be18782fdfd112fe13
        patchset: 3807e56222657978e0ef44be18782fdfd112fe13
        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: '2352'
      change_message: "Add unit tests for osism/utils/rabbitmq.py\n\nCloses #2232\n\nAdds
        `tests/unit/utils/test_rabbitmq.py` covering both functions in\n`osism/utils/rabbitmq.py`.
        Test-only change; no production code is touched.\n\n## What is covered\n\n**`get_rabbitmq_node_addresses()`**\n\n-
        *Inventory & host discovery*: two hosts processed in alphabetical\n  order
        (happy path returning `[(\"10.0.0.5\",\"host1\"),(\"10.0.0.6\",\"host2\")]`);\n
        \ empty rabbitmq group \u2192 `None`; first `subprocess.check_output` raising\n
        \ `CalledProcessError`; invalid JSON from the group listing\n  (`JSONDecodeError`);
        outer generic exception.\n- *Per-host resolution*: cache miss skips the host
        and continues to the\n  next; missing `internal_interface`; literal interface
        name used\n  directly; Jinja2 template resolved via dotted-path traversal
        of the\n  facts; template resolving to a non-string (`None` / dict / int);\n
        \ traversal hitting a non-dict mid-walk; interface-name normalization\n  (`eth0.100`
        \u2192 `ansible_eth0_100`, `eth-0` \u2192 `ansible_eth_0`); missing\n  normalized
        interface key; interface without `ipv4`; `ipv4` without an\n  `address`.\n-
        *Aggregate*: all hosts skipped \u2192 `None`; at least one address \u2192
        the\n  list is returned with no error logged.\n\n**`load_rabbitmq_password()`**
        \u2014 missing file; empty / invalid / non-dict\nsecrets; missing `rabbitmq_password`
        key; whitespace stripping; int\ncoercion; loader raising.\n\nPlus a check
        that the `RABBITMQ_USER` module constant is `\"openstack\"`.\n\n## Notes for
        the reviewer\n\n- **Redis mocking deviates from the issue's hint.** The issue
        suggested\n  `mocker.patch(\"osism.utils.rabbitmq.utils.redis\", ...)`, but
        that target\n  does not resolve: `redis` is a lazy `__getattr__` attribute
        on the\n  `osism.utils` *package*, and the function reads it via a function-local\n
        \ `from osism import utils`, so the `rabbitmq` module never gains a `utils`\n
        \ global (`AttributeError: module 'osism.utils.rabbitmq' has no attribute\n
        \ 'utils'`). Instead the cached attribute is seeded on the package\n  namespace
        with `mocker.patch.dict(osism.utils.__dict__, {\"redis\": ...})`,\n  which
        also bypasses the lazy initializer that would otherwise open a real\n  Redis
        connection. Reading the cache key the function builds is asserted in\n  the
        happy-path test.\n- `load_yaml_file` and `os.path.exists` are patched at the
        call site, as the\n  issue suggests.\n- Tests follow the existing `mocker`
        + `loguru_logs` conventions\n  (see `tests/unit/utils/test_init_connections.py`).\n\n##
        Verification\n\n- `pytest tests/unit/utils/test_rabbitmq.py --cov=osism.utils.rabbitmq`\n
        \ \u2192 **28 passed, 100% line coverage** (run in the CI-equivalent\n  environment
        where `ansible-core` is absent and `tests/conftest.py`\n  installs its ansible
        stubs).\n- `black --check`, `flake8`, `mypy` clean on the new file.\n\n\U0001F916
        Generated with [Claude Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/python-osism/pull/2352
      child_jobs: []
      commit_id: 3807e56222657978e0ef44be18782fdfd112fe13
      event_id: 20f06460-6653-11f1-8374-ee2b90193974
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/80251f8419a24a02abab52e40957e0ed/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/80251f8419a24a02abab52e40957e0ed/work/logs
        result_data_file: /var/lib/zuul/builds/80251f8419a24a02abab52e40957e0ed/work/results.json
        src_root: /var/lib/zuul/builds/80251f8419a24a02abab52e40957e0ed/work/src
        work_root: /var/lib/zuul/builds/80251f8419a24a02abab52e40957e0ed/work
      include_vars: []
      items:
      - branch: main
        change: '2352'
        change_message: "Add unit tests for osism/utils/rabbitmq.py\n\nCloses #2232\n\nAdds
          `tests/unit/utils/test_rabbitmq.py` covering both functions in\n`osism/utils/rabbitmq.py`.
          Test-only change; no production code is touched.\n\n## What is covered\n\n**`get_rabbitmq_node_addresses()`**\n\n-
          *Inventory & host discovery*: two hosts processed in alphabetical\n  order
          (happy path returning `[(\"10.0.0.5\",\"host1\"),(\"10.0.0.6\",\"host2\")]`);\n
          \ empty rabbitmq group \u2192 `None`; first `subprocess.check_output` raising\n
          \ `CalledProcessError`; invalid JSON from the group listing\n  (`JSONDecodeError`);
          outer generic exception.\n- *Per-host resolution*: cache miss skips the
          host and continues to the\n  next; missing `internal_interface`; literal
          interface name used\n  directly; Jinja2 template resolved via dotted-path
          traversal of the\n  facts; template resolving to a non-string (`None` /
          dict / int);\n  traversal hitting a non-dict mid-walk; interface-name normalization\n
          \ (`eth0.100` \u2192 `ansible_eth0_100`, `eth-0` \u2192 `ansible_eth_0`);
          missing\n  normalized interface key; interface without `ipv4`; `ipv4` without
          an\n  `address`.\n- *Aggregate*: all hosts skipped \u2192 `None`; at least
          one address \u2192 the\n  list is returned with no error logged.\n\n**`load_rabbitmq_password()`**
          \u2014 missing file; empty / invalid / non-dict\nsecrets; missing `rabbitmq_password`
          key; whitespace stripping; int\ncoercion; loader raising.\n\nPlus a check
          that the `RABBITMQ_USER` module constant is `\"openstack\"`.\n\n## Notes
          for the reviewer\n\n- **Redis mocking deviates from the issue's hint.**
          The issue suggested\n  `mocker.patch(\"osism.utils.rabbitmq.utils.redis\",
          ...)`, but that target\n  does not resolve: `redis` is a lazy `__getattr__`
          attribute on the\n  `osism.utils` *package*, and the function reads it via
          a function-local\n  `from osism import utils`, so the `rabbitmq` module
          never gains a `utils`\n  global (`AttributeError: module 'osism.utils.rabbitmq'
          has no attribute\n  'utils'`). Instead the cached attribute is seeded on
          the package\n  namespace with `mocker.patch.dict(osism.utils.__dict__, {\"redis\":
          ...})`,\n  which also bypasses the lazy initializer that would otherwise
          open a real\n  Redis connection. Reading the cache key the function builds
          is asserted in\n  the happy-path test.\n- `load_yaml_file` and `os.path.exists`
          are patched at the call site, as the\n  issue suggests.\n- Tests follow
          the existing `mocker` + `loguru_logs` conventions\n  (see `tests/unit/utils/test_init_connections.py`).\n\n##
          Verification\n\n- `pytest tests/unit/utils/test_rabbitmq.py --cov=osism.utils.rabbitmq`\n
          \ \u2192 **28 passed, 100% line coverage** (run in the CI-equivalent\n  environment
          where `ansible-core` is absent and `tests/conftest.py`\n  installs its ansible
          stubs).\n- `black --check`, `flake8`, `mypy` clean on the new file.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2352
        commit_id: 3807e56222657978e0ef44be18782fdfd112fe13
        patchset: 3807e56222657978e0ef44be18782fdfd112fe13
        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: QWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtL3V0aWxzL3JhYmJpdG1xLnB5CgpDbG9zZXMgIzIyMzIKCkFkZHMgYHRlc3RzL3VuaXQvdXRpbHMvdGVzdF9yYWJiaXRtcS5weWAgY292ZXJpbmcgYm90aCBmdW5jdGlvbnMgaW4KYG9zaXNtL3V0aWxzL3JhYmJpdG1xLnB5YC4gVGVzdC1vbmx5IGNoYW5nZTsgbm8gcHJvZHVjdGlvbiBjb2RlIGlzIHRvdWNoZWQuCgojIyBXaGF0IGlzIGNvdmVyZWQKCioqYGdldF9yYWJiaXRtcV9ub2RlX2FkZHJlc3NlcygpYCoqCgotICpJbnZlbnRvcnkgJiBob3N0IGRpc2NvdmVyeSo6IHR3byBob3N0cyBwcm9jZXNzZWQgaW4gYWxwaGFiZXRpY2FsCiAgb3JkZXIgKGhhcHB5IHBhdGggcmV0dXJuaW5nIGBbKCIxMC4wLjAuNSIsImhvc3QxIiksKCIxMC4wLjAuNiIsImhvc3QyIildYCk7CiAgZW1wdHkgcmFiYml0bXEgZ3JvdXAg4oaSIGBOb25lYDsgZmlyc3QgYHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0YCByYWlzaW5nCiAgYENhbGxlZFByb2Nlc3NFcnJvcmA7IGludmFsaWQgSlNPTiBmcm9tIHRoZSBncm91cCBsaXN0aW5nCiAgKGBKU09ORGVjb2RlRXJyb3JgKTsgb3V0ZXIgZ2VuZXJpYyBleGNlcHRpb24uCi0gKlBlci1ob3N0IHJlc29sdXRpb24qOiBjYWNoZSBtaXNzIHNraXBzIHRoZSBob3N0IGFuZCBjb250aW51ZXMgdG8gdGhlCiAgbmV4dDsgbWlzc2luZyBgaW50ZXJuYWxfaW50ZXJmYWNlYDsgbGl0ZXJhbCBpbnRlcmZhY2UgbmFtZSB1c2VkCiAgZGlyZWN0bHk7IEppbmphMiB0ZW1wbGF0ZSByZXNvbHZlZCB2aWEgZG90dGVkLXBhdGggdHJhdmVyc2FsIG9mIHRoZQogIGZhY3RzOyB0ZW1wbGF0ZSByZXNvbHZpbmcgdG8gYSBub24tc3RyaW5nIChgTm9uZWAgLyBkaWN0IC8gaW50KTsKICB0cmF2ZXJzYWwgaGl0dGluZyBhIG5vbi1kaWN0IG1pZC13YWxrOyBpbnRlcmZhY2UtbmFtZSBub3JtYWxpemF0aW9uCiAgKGBldGgwLjEwMGAg4oaSIGBhbnNpYmxlX2V0aDBfMTAwYCwgYGV0aC0wYCDihpIgYGFuc2libGVfZXRoXzBgKTsgbWlzc2luZwogIG5vcm1hbGl6ZWQgaW50ZXJmYWNlIGtleTsgaW50ZXJmYWNlIHdpdGhvdXQgYGlwdjRgOyBgaXB2NGAgd2l0aG91dCBhbgogIGBhZGRyZXNzYC4KLSAqQWdncmVnYXRlKjogYWxsIGhvc3RzIHNraXBwZWQg4oaSIGBOb25lYDsgYXQgbGVhc3Qgb25lIGFkZHJlc3Mg4oaSIHRoZQogIGxpc3QgaXMgcmV0dXJuZWQgd2l0aCBubyBlcnJvciBsb2dnZWQuCgoqKmBsb2FkX3JhYmJpdG1xX3Bhc3N3b3JkKClgKiog4oCUIG1pc3NpbmcgZmlsZTsgZW1wdHkgLyBpbnZhbGlkIC8gbm9uLWRpY3QKc2VjcmV0czsgbWlzc2luZyBgcmFiYml0bXFfcGFzc3dvcmRgIGtleTsgd2hpdGVzcGFjZSBzdHJpcHBpbmc7IGludApjb2VyY2lvbjsgbG9hZGVyIHJhaXNpbmcuCgpQbHVzIGEgY2hlY2sgdGhhdCB0aGUgYFJBQkJJVE1RX1VTRVJgIG1vZHVsZSBjb25zdGFudCBpcyBgIm9wZW5zdGFjayJgLgoKIyMgTm90ZXMgZm9yIHRoZSByZXZpZXdlcgoKLSAqKlJlZGlzIG1vY2tpbmcgZGV2aWF0ZXMgZnJvbSB0aGUgaXNzdWUncyBoaW50LioqIFRoZSBpc3N1ZSBzdWdnZXN0ZWQKICBgbW9ja2VyLnBhdGNoKCJvc2lzbS51dGlscy5yYWJiaXRtcS51dGlscy5yZWRpcyIsIC4uLilgLCBidXQgdGhhdCB0YXJnZXQKICBkb2VzIG5vdCByZXNvbHZlOiBgcmVkaXNgIGlzIGEgbGF6eSBgX19nZXRhdHRyX19gIGF0dHJpYnV0ZSBvbiB0aGUKICBgb3Npc20udXRpbHNgICpwYWNrYWdlKiwgYW5kIHRoZSBmdW5jdGlvbiByZWFkcyBpdCB2aWEgYSBmdW5jdGlvbi1sb2NhbAogIGBmcm9tIG9zaXNtIGltcG9ydCB1dGlsc2AsIHNvIHRoZSBgcmFiYml0bXFgIG1vZHVsZSBuZXZlciBnYWlucyBhIGB1dGlsc2AKICBnbG9iYWwgKGBBdHRyaWJ1dGVFcnJvcjogbW9kdWxlICdvc2lzbS51dGlscy5yYWJiaXRtcScgaGFzIG5vIGF0dHJpYnV0ZQogICd1dGlscydgKS4gSW5zdGVhZCB0aGUgY2FjaGVkIGF0dHJpYnV0ZSBpcyBzZWVkZWQgb24gdGhlIHBhY2thZ2UKICBuYW1lc3BhY2Ugd2l0aCBgbW9ja2VyLnBhdGNoLmRpY3Qob3Npc20udXRpbHMuX19kaWN0X18sIHsicmVkaXMiOiAuLi59KWAsCiAgd2hpY2ggYWxzbyBieXBhc3NlcyB0aGUgbGF6eSBpbml0aWFsaXplciB0aGF0IHdvdWxkIG90aGVyd2lzZSBvcGVuIGEgcmVhbAogIFJlZGlzIGNvbm5lY3Rpb24uIFJlYWRpbmcgdGhlIGNhY2hlIGtleSB0aGUgZnVuY3Rpb24gYnVpbGRzIGlzIGFzc2VydGVkIGluCiAgdGhlIGhhcHB5LXBhdGggdGVzdC4KLSBgbG9hZF95YW1sX2ZpbGVgIGFuZCBgb3MucGF0aC5leGlzdHNgIGFyZSBwYXRjaGVkIGF0IHRoZSBjYWxsIHNpdGUsIGFzIHRoZQogIGlzc3VlIHN1Z2dlc3RzLgotIFRlc3RzIGZvbGxvdyB0aGUgZXhpc3RpbmcgYG1vY2tlcmAgKyBgbG9ndXJ1X2xvZ3NgIGNvbnZlbnRpb25zCiAgKHNlZSBgdGVzdHMvdW5pdC91dGlscy90ZXN0X2luaXRfY29ubmVjdGlvbnMucHlgKS4KCiMjIFZlcmlmaWNhdGlvbgoKLSBgcHl0ZXN0IHRlc3RzL3VuaXQvdXRpbHMvdGVzdF9yYWJiaXRtcS5weSAtLWNvdj1vc2lzbS51dGlscy5yYWJiaXRtcWAKICDihpIgKioyOCBwYXNzZWQsIDEwMCUgbGluZSBjb3ZlcmFnZSoqIChydW4gaW4gdGhlIENJLWVxdWl2YWxlbnQKICBlbnZpcm9ubWVudCB3aGVyZSBgYW5zaWJsZS1jb3JlYCBpcyBhYnNlbnQgYW5kIGB0ZXN0cy9jb25mdGVzdC5weWAKICBpbnN0YWxscyBpdHMgYW5zaWJsZSBzdHVicykuCi0gYGJsYWNrIC0tY2hlY2tgLCBgZmxha2U4YCwgYG15cHlgIGNsZWFuIG9uIHRoZSBuZXcgZmlsZS4KCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUpCg==
      patchset: 3807e56222657978e0ef44be18782fdfd112fe13
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 688445d15ac2c497396b682f69c57ccd484f5f25
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 688445d15ac2c497396b682f69c57ccd484f5f25
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
        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: null
      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: 8ea1c11fa3170ff43efa55f93cf7622a7389168c
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2352/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
