all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe93:751b
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: e48f1936-c815-4276-8e46-14484abe8fc2
        host_id: de4c9765152b8ccf16bcbbf90e33fb083884dc744cc344501046bc88
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe93:751b
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.112
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.154
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe93:751b
        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 mypy explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#42>'
      - '<Job mypy explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#138>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 301395eb723d46088893d35980383e16
      build_refs:
      - branch: main
        change: '2239'
        change_message: "Fix unit test follow-ups from post-merge review\n\n## Summary\n\nPost-merge
          review of the unit test PRs (#2200\u2013#2234) against their\nlinked issues
          turned up 10 findings (3 correctness bugs, 3 missing/weak\ntests, 2 dead
          code paths, 2 fixture gaps).  This PR addresses all of\nthem, one commit
          per finding.\n\n### Correctness bugs\n\n- **conductor/utils**: `deep_compare`
          raised `KeyError` when a nested\n  key present in `a` was absent from `b`
          \u2014 fixed with `b.get(key, {})`.\n- **sonic/connections**: `get_connected_interfaces`
          had a single outer\n  try/except wrapping the entire interface loop; one
          bad interface\n  aborted all subsequent processing \u2014 restructured to
          per-interface\n  recovery with an inner try/except covering all per-interface
          work.\n- **sonic/interface**: `_extract_port_number_from_alias` returned
          `None`\n  for `Eth(Port5)` because the fallback was end-anchored; added
          an\n  explicit `\\(Port(\\d+)\\)` step between the primary pattern and the\n
          \ trailing-number fallback (a digit-anywhere approach was rejected as it\n
          \ misparsed aliases like `QSFP28-49`).\n\n### Missing / weak tests\n\n-
          **sonic/cache**: lock acquisition was never verified per method;\n  added
          three spy tests (`get_device_interfaces`, `clear`,\n  `get_cache_stats`).\n-
          **sonic/interface**: six `convert_netbox_interface_to_sonic` fallback\n
          \ tests checked only the return value, not the `logger.warning` call;\n
          \ added `loguru_logs` assertions to all six.\n- **sonic/interface**: `_convert_using_port_config`
          breakout path where\n  the base port is found but its alias yields no number
          was untested;\n  added a targeted test.\n- **data/enums**: `collection-openstack-core`
          dependency chain was\n  checked only for reachability; added a link-by-link
          test for\n  `keystone \u2192 neutron \u2192 wait-for-nova \u2192 octavia`.\n\n###
          Dead code / fixture issues\n\n- **sonic/connections**: `len(group) > 1`
          guard in\n  `find_interconnected_devices` was unreachable (devices only
          enter\n  the graph when they have in-role peers, so groups always have \u2265
          2);\n  removed the guard and corrected the misleading test comment.\n- **sonic/interface**:
          `interface_speed` was computed in\n  `detect_port_channels` but never passed
          to\n  `convert_netbox_interface_to_sonic`; removed the dead block.\n- **sonic/cache**:
          autouse reset fixture called `clear_interface_cache()`\n  but left `_thread_local.interface_cache`
          set; fixed to also delete\n  the attribute so subsequent tests start clean.\n\n##
          Test plan\n\n- [ ] `pipenv run pytest tests/unit/` passes\n- [ ] `pipenv
          run flake8 osism/ tests/` clean\n- [ ] `pipenv run mypy osism/` clean\n\nAI-assisted:
          Claude Code"
        change_url: https://github.com/osism/python-osism/pull/2239
        commit_id: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
        patchset: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
        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: 48b40306006840ca80fa6c3c439e829b
      buildset_refs:
      - branch: main
        change: '2239'
        change_message: "Fix unit test follow-ups from post-merge review\n\n## Summary\n\nPost-merge
          review of the unit test PRs (#2200\u2013#2234) against their\nlinked issues
          turned up 10 findings (3 correctness bugs, 3 missing/weak\ntests, 2 dead
          code paths, 2 fixture gaps).  This PR addresses all of\nthem, one commit
          per finding.\n\n### Correctness bugs\n\n- **conductor/utils**: `deep_compare`
          raised `KeyError` when a nested\n  key present in `a` was absent from `b`
          \u2014 fixed with `b.get(key, {})`.\n- **sonic/connections**: `get_connected_interfaces`
          had a single outer\n  try/except wrapping the entire interface loop; one
          bad interface\n  aborted all subsequent processing \u2014 restructured to
          per-interface\n  recovery with an inner try/except covering all per-interface
          work.\n- **sonic/interface**: `_extract_port_number_from_alias` returned
          `None`\n  for `Eth(Port5)` because the fallback was end-anchored; added
          an\n  explicit `\\(Port(\\d+)\\)` step between the primary pattern and the\n
          \ trailing-number fallback (a digit-anywhere approach was rejected as it\n
          \ misparsed aliases like `QSFP28-49`).\n\n### Missing / weak tests\n\n-
          **sonic/cache**: lock acquisition was never verified per method;\n  added
          three spy tests (`get_device_interfaces`, `clear`,\n  `get_cache_stats`).\n-
          **sonic/interface**: six `convert_netbox_interface_to_sonic` fallback\n
          \ tests checked only the return value, not the `logger.warning` call;\n
          \ added `loguru_logs` assertions to all six.\n- **sonic/interface**: `_convert_using_port_config`
          breakout path where\n  the base port is found but its alias yields no number
          was untested;\n  added a targeted test.\n- **data/enums**: `collection-openstack-core`
          dependency chain was\n  checked only for reachability; added a link-by-link
          test for\n  `keystone \u2192 neutron \u2192 wait-for-nova \u2192 octavia`.\n\n###
          Dead code / fixture issues\n\n- **sonic/connections**: `len(group) > 1`
          guard in\n  `find_interconnected_devices` was unreachable (devices only
          enter\n  the graph when they have in-role peers, so groups always have \u2265
          2);\n  removed the guard and corrected the misleading test comment.\n- **sonic/interface**:
          `interface_speed` was computed in\n  `detect_port_channels` but never passed
          to\n  `convert_netbox_interface_to_sonic`; removed the dead block.\n- **sonic/cache**:
          autouse reset fixture called `clear_interface_cache()`\n  but left `_thread_local.interface_cache`
          set; fixed to also delete\n  the attribute so subsequent tests start clean.\n\n##
          Test plan\n\n- [ ] `pipenv run pytest tests/unit/` passes\n- [ ] `pipenv
          run flake8 osism/ tests/` clean\n- [ ] `pipenv run mypy osism/` clean\n\nAI-assisted:
          Claude Code"
        change_url: https://github.com/osism/python-osism/pull/2239
        commit_id: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
        patchset: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
        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: '2239'
      change_message: "Fix unit test follow-ups from post-merge review\n\n## Summary\n\nPost-merge
        review of the unit test PRs (#2200\u2013#2234) against their\nlinked issues
        turned up 10 findings (3 correctness bugs, 3 missing/weak\ntests, 2 dead code
        paths, 2 fixture gaps).  This PR addresses all of\nthem, one commit per finding.\n\n###
        Correctness bugs\n\n- **conductor/utils**: `deep_compare` raised `KeyError`
        when a nested\n  key present in `a` was absent from `b` \u2014 fixed with
        `b.get(key, {})`.\n- **sonic/connections**: `get_connected_interfaces` had
        a single outer\n  try/except wrapping the entire interface loop; one bad interface\n
        \ aborted all subsequent processing \u2014 restructured to per-interface\n
        \ recovery with an inner try/except covering all per-interface work.\n- **sonic/interface**:
        `_extract_port_number_from_alias` returned `None`\n  for `Eth(Port5)` because
        the fallback was end-anchored; added an\n  explicit `\\(Port(\\d+)\\)` step
        between the primary pattern and the\n  trailing-number fallback (a digit-anywhere
        approach was rejected as it\n  misparsed aliases like `QSFP28-49`).\n\n###
        Missing / weak tests\n\n- **sonic/cache**: lock acquisition was never verified
        per method;\n  added three spy tests (`get_device_interfaces`, `clear`,\n
        \ `get_cache_stats`).\n- **sonic/interface**: six `convert_netbox_interface_to_sonic`
        fallback\n  tests checked only the return value, not the `logger.warning`
        call;\n  added `loguru_logs` assertions to all six.\n- **sonic/interface**:
        `_convert_using_port_config` breakout path where\n  the base port is found
        but its alias yields no number was untested;\n  added a targeted test.\n-
        **data/enums**: `collection-openstack-core` dependency chain was\n  checked
        only for reachability; added a link-by-link test for\n  `keystone \u2192 neutron
        \u2192 wait-for-nova \u2192 octavia`.\n\n### Dead code / fixture issues\n\n-
        **sonic/connections**: `len(group) > 1` guard in\n  `find_interconnected_devices`
        was unreachable (devices only enter\n  the graph when they have in-role peers,
        so groups always have \u2265 2);\n  removed the guard and corrected the misleading
        test comment.\n- **sonic/interface**: `interface_speed` was computed in\n
        \ `detect_port_channels` but never passed to\n  `convert_netbox_interface_to_sonic`;
        removed the dead block.\n- **sonic/cache**: autouse reset fixture called `clear_interface_cache()`\n
        \ but left `_thread_local.interface_cache` set; fixed to also delete\n  the
        attribute so subsequent tests start clean.\n\n## Test plan\n\n- [ ] `pipenv
        run pytest tests/unit/` passes\n- [ ] `pipenv run flake8 osism/ tests/` clean\n-
        [ ] `pipenv run mypy osism/` clean\n\nAI-assisted: Claude Code"
      change_url: https://github.com/osism/python-osism/pull/2239
      child_jobs: []
      commit_id: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
      event_id: 61edbb60-43a9-11f1-9c51-ad0a4dacd9e8
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/301395eb723d46088893d35980383e16/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/301395eb723d46088893d35980383e16/work/logs
        result_data_file: /var/lib/zuul/builds/301395eb723d46088893d35980383e16/work/results.json
        src_root: /var/lib/zuul/builds/301395eb723d46088893d35980383e16/work/src
        work_root: /var/lib/zuul/builds/301395eb723d46088893d35980383e16/work
      include_vars: []
      items:
      - branch: main
        change: '2239'
        change_message: "Fix unit test follow-ups from post-merge review\n\n## Summary\n\nPost-merge
          review of the unit test PRs (#2200\u2013#2234) against their\nlinked issues
          turned up 10 findings (3 correctness bugs, 3 missing/weak\ntests, 2 dead
          code paths, 2 fixture gaps).  This PR addresses all of\nthem, one commit
          per finding.\n\n### Correctness bugs\n\n- **conductor/utils**: `deep_compare`
          raised `KeyError` when a nested\n  key present in `a` was absent from `b`
          \u2014 fixed with `b.get(key, {})`.\n- **sonic/connections**: `get_connected_interfaces`
          had a single outer\n  try/except wrapping the entire interface loop; one
          bad interface\n  aborted all subsequent processing \u2014 restructured to
          per-interface\n  recovery with an inner try/except covering all per-interface
          work.\n- **sonic/interface**: `_extract_port_number_from_alias` returned
          `None`\n  for `Eth(Port5)` because the fallback was end-anchored; added
          an\n  explicit `\\(Port(\\d+)\\)` step between the primary pattern and the\n
          \ trailing-number fallback (a digit-anywhere approach was rejected as it\n
          \ misparsed aliases like `QSFP28-49`).\n\n### Missing / weak tests\n\n-
          **sonic/cache**: lock acquisition was never verified per method;\n  added
          three spy tests (`get_device_interfaces`, `clear`,\n  `get_cache_stats`).\n-
          **sonic/interface**: six `convert_netbox_interface_to_sonic` fallback\n
          \ tests checked only the return value, not the `logger.warning` call;\n
          \ added `loguru_logs` assertions to all six.\n- **sonic/interface**: `_convert_using_port_config`
          breakout path where\n  the base port is found but its alias yields no number
          was untested;\n  added a targeted test.\n- **data/enums**: `collection-openstack-core`
          dependency chain was\n  checked only for reachability; added a link-by-link
          test for\n  `keystone \u2192 neutron \u2192 wait-for-nova \u2192 octavia`.\n\n###
          Dead code / fixture issues\n\n- **sonic/connections**: `len(group) > 1`
          guard in\n  `find_interconnected_devices` was unreachable (devices only
          enter\n  the graph when they have in-role peers, so groups always have \u2265
          2);\n  removed the guard and corrected the misleading test comment.\n- **sonic/interface**:
          `interface_speed` was computed in\n  `detect_port_channels` but never passed
          to\n  `convert_netbox_interface_to_sonic`; removed the dead block.\n- **sonic/cache**:
          autouse reset fixture called `clear_interface_cache()`\n  but left `_thread_local.interface_cache`
          set; fixed to also delete\n  the attribute so subsequent tests start clean.\n\n##
          Test plan\n\n- [ ] `pipenv run pytest tests/unit/` passes\n- [ ] `pipenv
          run flake8 osism/ tests/` clean\n- [ ] `pipenv run mypy osism/` clean\n\nAI-assisted:
          Claude Code"
        change_url: https://github.com/osism/python-osism/pull/2239
        commit_id: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
        patchset: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
        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: mypy
      jobtags: []
      max_attempts: 3
      message: Rml4IHVuaXQgdGVzdCBmb2xsb3ctdXBzIGZyb20gcG9zdC1tZXJnZSByZXZpZXcKCiMjIFN1bW1hcnkKClBvc3QtbWVyZ2UgcmV2aWV3IG9mIHRoZSB1bml0IHRlc3QgUFJzICgjMjIwMOKAkyMyMjM0KSBhZ2FpbnN0IHRoZWlyCmxpbmtlZCBpc3N1ZXMgdHVybmVkIHVwIDEwIGZpbmRpbmdzICgzIGNvcnJlY3RuZXNzIGJ1Z3MsIDMgbWlzc2luZy93ZWFrCnRlc3RzLCAyIGRlYWQgY29kZSBwYXRocywgMiBmaXh0dXJlIGdhcHMpLiAgVGhpcyBQUiBhZGRyZXNzZXMgYWxsIG9mCnRoZW0sIG9uZSBjb21taXQgcGVyIGZpbmRpbmcuCgojIyMgQ29ycmVjdG5lc3MgYnVncwoKLSAqKmNvbmR1Y3Rvci91dGlscyoqOiBgZGVlcF9jb21wYXJlYCByYWlzZWQgYEtleUVycm9yYCB3aGVuIGEgbmVzdGVkCiAga2V5IHByZXNlbnQgaW4gYGFgIHdhcyBhYnNlbnQgZnJvbSBgYmAg4oCUIGZpeGVkIHdpdGggYGIuZ2V0KGtleSwge30pYC4KLSAqKnNvbmljL2Nvbm5lY3Rpb25zKio6IGBnZXRfY29ubmVjdGVkX2ludGVyZmFjZXNgIGhhZCBhIHNpbmdsZSBvdXRlcgogIHRyeS9leGNlcHQgd3JhcHBpbmcgdGhlIGVudGlyZSBpbnRlcmZhY2UgbG9vcDsgb25lIGJhZCBpbnRlcmZhY2UKICBhYm9ydGVkIGFsbCBzdWJzZXF1ZW50IHByb2Nlc3Npbmcg4oCUIHJlc3RydWN0dXJlZCB0byBwZXItaW50ZXJmYWNlCiAgcmVjb3Zlcnkgd2l0aCBhbiBpbm5lciB0cnkvZXhjZXB0IGNvdmVyaW5nIGFsbCBwZXItaW50ZXJmYWNlIHdvcmsuCi0gKipzb25pYy9pbnRlcmZhY2UqKjogYF9leHRyYWN0X3BvcnRfbnVtYmVyX2Zyb21fYWxpYXNgIHJldHVybmVkIGBOb25lYAogIGZvciBgRXRoKFBvcnQ1KWAgYmVjYXVzZSB0aGUgZmFsbGJhY2sgd2FzIGVuZC1hbmNob3JlZDsgYWRkZWQgYW4KICBleHBsaWNpdCBgXChQb3J0KFxkKylcKWAgc3RlcCBiZXR3ZWVuIHRoZSBwcmltYXJ5IHBhdHRlcm4gYW5kIHRoZQogIHRyYWlsaW5nLW51bWJlciBmYWxsYmFjayAoYSBkaWdpdC1hbnl3aGVyZSBhcHByb2FjaCB3YXMgcmVqZWN0ZWQgYXMgaXQKICBtaXNwYXJzZWQgYWxpYXNlcyBsaWtlIGBRU0ZQMjgtNDlgKS4KCiMjIyBNaXNzaW5nIC8gd2VhayB0ZXN0cwoKLSAqKnNvbmljL2NhY2hlKio6IGxvY2sgYWNxdWlzaXRpb24gd2FzIG5ldmVyIHZlcmlmaWVkIHBlciBtZXRob2Q7CiAgYWRkZWQgdGhyZWUgc3B5IHRlc3RzIChgZ2V0X2RldmljZV9pbnRlcmZhY2VzYCwgYGNsZWFyYCwKICBgZ2V0X2NhY2hlX3N0YXRzYCkuCi0gKipzb25pYy9pbnRlcmZhY2UqKjogc2l4IGBjb252ZXJ0X25ldGJveF9pbnRlcmZhY2VfdG9fc29uaWNgIGZhbGxiYWNrCiAgdGVzdHMgY2hlY2tlZCBvbmx5IHRoZSByZXR1cm4gdmFsdWUsIG5vdCB0aGUgYGxvZ2dlci53YXJuaW5nYCBjYWxsOwogIGFkZGVkIGBsb2d1cnVfbG9nc2AgYXNzZXJ0aW9ucyB0byBhbGwgc2l4LgotICoqc29uaWMvaW50ZXJmYWNlKio6IGBfY29udmVydF91c2luZ19wb3J0X2NvbmZpZ2AgYnJlYWtvdXQgcGF0aCB3aGVyZQogIHRoZSBiYXNlIHBvcnQgaXMgZm91bmQgYnV0IGl0cyBhbGlhcyB5aWVsZHMgbm8gbnVtYmVyIHdhcyB1bnRlc3RlZDsKICBhZGRlZCBhIHRhcmdldGVkIHRlc3QuCi0gKipkYXRhL2VudW1zKio6IGBjb2xsZWN0aW9uLW9wZW5zdGFjay1jb3JlYCBkZXBlbmRlbmN5IGNoYWluIHdhcwogIGNoZWNrZWQgb25seSBmb3IgcmVhY2hhYmlsaXR5OyBhZGRlZCBhIGxpbmstYnktbGluayB0ZXN0IGZvcgogIGBrZXlzdG9uZSDihpIgbmV1dHJvbiDihpIgd2FpdC1mb3Itbm92YSDihpIgb2N0YXZpYWAuCgojIyMgRGVhZCBjb2RlIC8gZml4dHVyZSBpc3N1ZXMKCi0gKipzb25pYy9jb25uZWN0aW9ucyoqOiBgbGVuKGdyb3VwKSA+IDFgIGd1YXJkIGluCiAgYGZpbmRfaW50ZXJjb25uZWN0ZWRfZGV2aWNlc2Agd2FzIHVucmVhY2hhYmxlIChkZXZpY2VzIG9ubHkgZW50ZXIKICB0aGUgZ3JhcGggd2hlbiB0aGV5IGhhdmUgaW4tcm9sZSBwZWVycywgc28gZ3JvdXBzIGFsd2F5cyBoYXZlIOKJpSAyKTsKICByZW1vdmVkIHRoZSBndWFyZCBhbmQgY29ycmVjdGVkIHRoZSBtaXNsZWFkaW5nIHRlc3QgY29tbWVudC4KLSAqKnNvbmljL2ludGVyZmFjZSoqOiBgaW50ZXJmYWNlX3NwZWVkYCB3YXMgY29tcHV0ZWQgaW4KICBgZGV0ZWN0X3BvcnRfY2hhbm5lbHNgIGJ1dCBuZXZlciBwYXNzZWQgdG8KICBgY29udmVydF9uZXRib3hfaW50ZXJmYWNlX3RvX3NvbmljYDsgcmVtb3ZlZCB0aGUgZGVhZCBibG9jay4KLSAqKnNvbmljL2NhY2hlKio6IGF1dG91c2UgcmVzZXQgZml4dHVyZSBjYWxsZWQgYGNsZWFyX2ludGVyZmFjZV9jYWNoZSgpYAogIGJ1dCBsZWZ0IGBfdGhyZWFkX2xvY2FsLmludGVyZmFjZV9jYWNoZWAgc2V0OyBmaXhlZCB0byBhbHNvIGRlbGV0ZQogIHRoZSBhdHRyaWJ1dGUgc28gc3Vic2VxdWVudCB0ZXN0cyBzdGFydCBjbGVhbi4KCiMjIFRlc3QgcGxhbgoKLSBbIF0gYHBpcGVudiBydW4gcHl0ZXN0IHRlc3RzL3VuaXQvYCBwYXNzZXMKLSBbIF0gYHBpcGVudiBydW4gZmxha2U4IG9zaXNtLyB0ZXN0cy9gIGNsZWFuCi0gWyBdIGBwaXBlbnYgcnVuIG15cHkgb3Npc20vYCBjbGVhbgoKQUktYXNzaXN0ZWQ6IENsYXVkZSBDb2Rl
      patchset: 7ed4b90b6f0f4c191907bd1daff239dc4737b3c5
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 7fe648e065ead713980d61fa015a03a26ed6c629
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 397240f42127868e42e86e6aeb120c2cb092d117
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 8ad17ed1be1f63229e054fab94af45f2511a98ea
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 7fe648e065ead713980d61fa015a03a26ed6c629
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 397240f42127868e42e86e6aeb120c2cb092d117
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/mypy/run.yaml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_0/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_0/zuul-jobs/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
      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: 87ba6b2369d693b52a4b6690d605c55e57896cf6
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2239/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
