all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe8c:d619
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: fe22ae75-462c-42bb-88b4-f4fd2419ad4a
        host_id: 25afcdcd4b24cc9d1766f11f81549380a3029030a455889bb61ec093
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe8c:d619
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.139
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.210
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe8c:d619
        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 hadolint explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#37>'
      - '<Job hadolint explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#138>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 577a4a91e3b74edd922bcfdedfb283b9
      build_refs:
      - branch: main
        change: '2333'
        change_message: "Add unit tests for SONiC sync and exporter modules\n\nCloses
          #2224. Part of the Tier 3 SONiC unit-test effort (#2199), follow-up\nto
          #2192 / #2193.\n\nAdds two test modules covering the SONiC sync pipeline.
          Both mirror the\nexisting `tests/unit/tasks/conductor/sonic/` conventions:
          the shared\n`mock_nb` / `loguru_logs` fixtures, `SimpleNamespace` device
          stubs, and a\nper-module fixture that stubs collaborators at their import
          site (the\n`patch_orchestrator_helpers` pattern). No production code is
          touched.\n\n## Change set (commit order)\n\n1. **Add unit tests for SONiC
          exporter module** \u2014 `test_exporter.py` (21 tests)\n   - `save_config_to_netbox`:
          first-time create, no-change (`DeepDiff` empty,\n     no save), changed
          config (unified diff + journal entry + save), journal\n     failure still
          saves, `device.save()` failure returns no-change. Both the\n     tuple (`return_diff=True`)
          and bool return forms are asserted.\n   - `export_config_to_file`: filename
          selection (hostname vs. serial-number,\n     empty/missing serial falls
          back to hostname with a warning), diff\n     handling (missing / identical
          / changed / unreadable file), symlink\n     handling (absent target, existing
          regular file, dangling symlink,\n     `os.symlink` failure, hostname mode
          / falsy serial skip), and the outer\n     `os.makedirs` failure path.\n
          \  - File-export tests use a real `tmp_path` filesystem where that reads
          more\n     clearly (the symlink end-state proves remove-then-symlink ordering),
          and\n     patch `os.*` only to inject the symlink / makedirs failures.\n\n2.
          **Add unit tests for SONiC sync orchestrator** \u2014 `test_sync.py` (26
          tests)\n   - Cache lifecycle: exact start/end clear ordering via `attach_mock`,
          and\n     the metalbox / VIP loads called once per invocation.\n   - Single-device
          path: allowed role processed; disallowed role, `role=None`,\n     not-found,
          and lookup-raises each return `{}`; single spine triggers the\n     full
          spine fetch (`nb.dcim.devices.filter`), single leaf does not.\n   - Multi-device
          path: only allowed roles kept; role-less devices skipped.\n   - Per-device:
          missing / unsupported / valid HWSKU; `config_version` read\n     from custom
          fields.\n   - AS mapping: computed per spine group, propagated into\n     `generate_sonic_config`,
          and a `min_as=None` group is not propagated.\n   - Diff handling: diff streamed
          to task output, first-time message,\n     no-change still exports, `show_diff=False`
          calls save without\n     `return_diff`.\n   - Task output gated on `task_id`;
          cache-stats logged only when non-empty.\n\n   `generate_sonic_config` and
          `find_interconnected_devices` are stubbed (they\n   have their own issues
          under #2199), per the issue's instructions.\n\n## Local verification\n\n-
          `black --check` \u2014 pass (both files)\n- `flake8` \u2014 pass (both files)\n-
          `python -m py_compile` \u2014 pass (both files)\n- `pytest` \u2014 not run
          locally; the unit-test suite runs in the\n  `python-osism-unit-tests` Zuul
          job. The coverage gate\n  (`--cov=...sync`/`...exporter` >= 90 %) is verified
          there."
        change_url: https://github.com/osism/python-osism/pull/2333
        commit_id: 89ba47d2a038319b37d13c7f2bf20fb577b08765
        patchset: 89ba47d2a038319b37d13c7f2bf20fb577b08765
        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: 19366acf81de486b829fad4b559296c8
      buildset_refs:
      - branch: main
        change: '2333'
        change_message: "Add unit tests for SONiC sync and exporter modules\n\nCloses
          #2224. Part of the Tier 3 SONiC unit-test effort (#2199), follow-up\nto
          #2192 / #2193.\n\nAdds two test modules covering the SONiC sync pipeline.
          Both mirror the\nexisting `tests/unit/tasks/conductor/sonic/` conventions:
          the shared\n`mock_nb` / `loguru_logs` fixtures, `SimpleNamespace` device
          stubs, and a\nper-module fixture that stubs collaborators at their import
          site (the\n`patch_orchestrator_helpers` pattern). No production code is
          touched.\n\n## Change set (commit order)\n\n1. **Add unit tests for SONiC
          exporter module** \u2014 `test_exporter.py` (21 tests)\n   - `save_config_to_netbox`:
          first-time create, no-change (`DeepDiff` empty,\n     no save), changed
          config (unified diff + journal entry + save), journal\n     failure still
          saves, `device.save()` failure returns no-change. Both the\n     tuple (`return_diff=True`)
          and bool return forms are asserted.\n   - `export_config_to_file`: filename
          selection (hostname vs. serial-number,\n     empty/missing serial falls
          back to hostname with a warning), diff\n     handling (missing / identical
          / changed / unreadable file), symlink\n     handling (absent target, existing
          regular file, dangling symlink,\n     `os.symlink` failure, hostname mode
          / falsy serial skip), and the outer\n     `os.makedirs` failure path.\n
          \  - File-export tests use a real `tmp_path` filesystem where that reads
          more\n     clearly (the symlink end-state proves remove-then-symlink ordering),
          and\n     patch `os.*` only to inject the symlink / makedirs failures.\n\n2.
          **Add unit tests for SONiC sync orchestrator** \u2014 `test_sync.py` (26
          tests)\n   - Cache lifecycle: exact start/end clear ordering via `attach_mock`,
          and\n     the metalbox / VIP loads called once per invocation.\n   - Single-device
          path: allowed role processed; disallowed role, `role=None`,\n     not-found,
          and lookup-raises each return `{}`; single spine triggers the\n     full
          spine fetch (`nb.dcim.devices.filter`), single leaf does not.\n   - Multi-device
          path: only allowed roles kept; role-less devices skipped.\n   - Per-device:
          missing / unsupported / valid HWSKU; `config_version` read\n     from custom
          fields.\n   - AS mapping: computed per spine group, propagated into\n     `generate_sonic_config`,
          and a `min_as=None` group is not propagated.\n   - Diff handling: diff streamed
          to task output, first-time message,\n     no-change still exports, `show_diff=False`
          calls save without\n     `return_diff`.\n   - Task output gated on `task_id`;
          cache-stats logged only when non-empty.\n\n   `generate_sonic_config` and
          `find_interconnected_devices` are stubbed (they\n   have their own issues
          under #2199), per the issue's instructions.\n\n## Local verification\n\n-
          `black --check` \u2014 pass (both files)\n- `flake8` \u2014 pass (both files)\n-
          `python -m py_compile` \u2014 pass (both files)\n- `pytest` \u2014 not run
          locally; the unit-test suite runs in the\n  `python-osism-unit-tests` Zuul
          job. The coverage gate\n  (`--cov=...sync`/`...exporter` >= 90 %) is verified
          there."
        change_url: https://github.com/osism/python-osism/pull/2333
        commit_id: 89ba47d2a038319b37d13c7f2bf20fb577b08765
        patchset: 89ba47d2a038319b37d13c7f2bf20fb577b08765
        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: '2333'
      change_message: "Add unit tests for SONiC sync and exporter modules\n\nCloses
        #2224. Part of the Tier 3 SONiC unit-test effort (#2199), follow-up\nto #2192
        / #2193.\n\nAdds two test modules covering the SONiC sync pipeline. Both mirror
        the\nexisting `tests/unit/tasks/conductor/sonic/` conventions: the shared\n`mock_nb`
        / `loguru_logs` fixtures, `SimpleNamespace` device stubs, and a\nper-module
        fixture that stubs collaborators at their import site (the\n`patch_orchestrator_helpers`
        pattern). No production code is touched.\n\n## Change set (commit order)\n\n1.
        **Add unit tests for SONiC exporter module** \u2014 `test_exporter.py` (21
        tests)\n   - `save_config_to_netbox`: first-time create, no-change (`DeepDiff`
        empty,\n     no save), changed config (unified diff + journal entry + save),
        journal\n     failure still saves, `device.save()` failure returns no-change.
        Both the\n     tuple (`return_diff=True`) and bool return forms are asserted.\n
        \  - `export_config_to_file`: filename selection (hostname vs. serial-number,\n
        \    empty/missing serial falls back to hostname with a warning), diff\n     handling
        (missing / identical / changed / unreadable file), symlink\n     handling
        (absent target, existing regular file, dangling symlink,\n     `os.symlink`
        failure, hostname mode / falsy serial skip), and the outer\n     `os.makedirs`
        failure path.\n   - File-export tests use a real `tmp_path` filesystem where
        that reads more\n     clearly (the symlink end-state proves remove-then-symlink
        ordering), and\n     patch `os.*` only to inject the symlink / makedirs failures.\n\n2.
        **Add unit tests for SONiC sync orchestrator** \u2014 `test_sync.py` (26 tests)\n
        \  - Cache lifecycle: exact start/end clear ordering via `attach_mock`, and\n
        \    the metalbox / VIP loads called once per invocation.\n   - Single-device
        path: allowed role processed; disallowed role, `role=None`,\n     not-found,
        and lookup-raises each return `{}`; single spine triggers the\n     full spine
        fetch (`nb.dcim.devices.filter`), single leaf does not.\n   - Multi-device
        path: only allowed roles kept; role-less devices skipped.\n   - Per-device:
        missing / unsupported / valid HWSKU; `config_version` read\n     from custom
        fields.\n   - AS mapping: computed per spine group, propagated into\n     `generate_sonic_config`,
        and a `min_as=None` group is not propagated.\n   - Diff handling: diff streamed
        to task output, first-time message,\n     no-change still exports, `show_diff=False`
        calls save without\n     `return_diff`.\n   - Task output gated on `task_id`;
        cache-stats logged only when non-empty.\n\n   `generate_sonic_config` and
        `find_interconnected_devices` are stubbed (they\n   have their own issues
        under #2199), per the issue's instructions.\n\n## Local verification\n\n-
        `black --check` \u2014 pass (both files)\n- `flake8` \u2014 pass (both files)\n-
        `python -m py_compile` \u2014 pass (both files)\n- `pytest` \u2014 not run
        locally; the unit-test suite runs in the\n  `python-osism-unit-tests` Zuul
        job. The coverage gate\n  (`--cov=...sync`/`...exporter` >= 90 %) is verified
        there."
      change_url: https://github.com/osism/python-osism/pull/2333
      child_jobs: []
      commit_id: 89ba47d2a038319b37d13c7f2bf20fb577b08765
      event_id: 18a62320-6492-11f1-80a4-db3a65978beb
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/577a4a91e3b74edd922bcfdedfb283b9/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/577a4a91e3b74edd922bcfdedfb283b9/work/logs
        result_data_file: /var/lib/zuul/builds/577a4a91e3b74edd922bcfdedfb283b9/work/results.json
        src_root: /var/lib/zuul/builds/577a4a91e3b74edd922bcfdedfb283b9/work/src
        work_root: /var/lib/zuul/builds/577a4a91e3b74edd922bcfdedfb283b9/work
      include_vars: []
      items:
      - branch: main
        change: '2333'
        change_message: "Add unit tests for SONiC sync and exporter modules\n\nCloses
          #2224. Part of the Tier 3 SONiC unit-test effort (#2199), follow-up\nto
          #2192 / #2193.\n\nAdds two test modules covering the SONiC sync pipeline.
          Both mirror the\nexisting `tests/unit/tasks/conductor/sonic/` conventions:
          the shared\n`mock_nb` / `loguru_logs` fixtures, `SimpleNamespace` device
          stubs, and a\nper-module fixture that stubs collaborators at their import
          site (the\n`patch_orchestrator_helpers` pattern). No production code is
          touched.\n\n## Change set (commit order)\n\n1. **Add unit tests for SONiC
          exporter module** \u2014 `test_exporter.py` (21 tests)\n   - `save_config_to_netbox`:
          first-time create, no-change (`DeepDiff` empty,\n     no save), changed
          config (unified diff + journal entry + save), journal\n     failure still
          saves, `device.save()` failure returns no-change. Both the\n     tuple (`return_diff=True`)
          and bool return forms are asserted.\n   - `export_config_to_file`: filename
          selection (hostname vs. serial-number,\n     empty/missing serial falls
          back to hostname with a warning), diff\n     handling (missing / identical
          / changed / unreadable file), symlink\n     handling (absent target, existing
          regular file, dangling symlink,\n     `os.symlink` failure, hostname mode
          / falsy serial skip), and the outer\n     `os.makedirs` failure path.\n
          \  - File-export tests use a real `tmp_path` filesystem where that reads
          more\n     clearly (the symlink end-state proves remove-then-symlink ordering),
          and\n     patch `os.*` only to inject the symlink / makedirs failures.\n\n2.
          **Add unit tests for SONiC sync orchestrator** \u2014 `test_sync.py` (26
          tests)\n   - Cache lifecycle: exact start/end clear ordering via `attach_mock`,
          and\n     the metalbox / VIP loads called once per invocation.\n   - Single-device
          path: allowed role processed; disallowed role, `role=None`,\n     not-found,
          and lookup-raises each return `{}`; single spine triggers the\n     full
          spine fetch (`nb.dcim.devices.filter`), single leaf does not.\n   - Multi-device
          path: only allowed roles kept; role-less devices skipped.\n   - Per-device:
          missing / unsupported / valid HWSKU; `config_version` read\n     from custom
          fields.\n   - AS mapping: computed per spine group, propagated into\n     `generate_sonic_config`,
          and a `min_as=None` group is not propagated.\n   - Diff handling: diff streamed
          to task output, first-time message,\n     no-change still exports, `show_diff=False`
          calls save without\n     `return_diff`.\n   - Task output gated on `task_id`;
          cache-stats logged only when non-empty.\n\n   `generate_sonic_config` and
          `find_interconnected_devices` are stubbed (they\n   have their own issues
          under #2199), per the issue's instructions.\n\n## Local verification\n\n-
          `black --check` \u2014 pass (both files)\n- `flake8` \u2014 pass (both files)\n-
          `python -m py_compile` \u2014 pass (both files)\n- `pytest` \u2014 not run
          locally; the unit-test suite runs in the\n  `python-osism-unit-tests` Zuul
          job. The coverage gate\n  (`--cov=...sync`/`...exporter` >= 90 %) is verified
          there."
        change_url: https://github.com/osism/python-osism/pull/2333
        commit_id: 89ba47d2a038319b37d13c7f2bf20fb577b08765
        patchset: 89ba47d2a038319b37d13c7f2bf20fb577b08765
        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: hadolint
      jobtags: []
      max_attempts: 3
      message: QWRkIHVuaXQgdGVzdHMgZm9yIFNPTmlDIHN5bmMgYW5kIGV4cG9ydGVyIG1vZHVsZXMKCkNsb3NlcyAjMjIyNC4gUGFydCBvZiB0aGUgVGllciAzIFNPTmlDIHVuaXQtdGVzdCBlZmZvcnQgKCMyMTk5KSwgZm9sbG93LXVwCnRvICMyMTkyIC8gIzIxOTMuCgpBZGRzIHR3byB0ZXN0IG1vZHVsZXMgY292ZXJpbmcgdGhlIFNPTmlDIHN5bmMgcGlwZWxpbmUuIEJvdGggbWlycm9yIHRoZQpleGlzdGluZyBgdGVzdHMvdW5pdC90YXNrcy9jb25kdWN0b3Ivc29uaWMvYCBjb252ZW50aW9uczogdGhlIHNoYXJlZApgbW9ja19uYmAgLyBgbG9ndXJ1X2xvZ3NgIGZpeHR1cmVzLCBgU2ltcGxlTmFtZXNwYWNlYCBkZXZpY2Ugc3R1YnMsIGFuZCBhCnBlci1tb2R1bGUgZml4dHVyZSB0aGF0IHN0dWJzIGNvbGxhYm9yYXRvcnMgYXQgdGhlaXIgaW1wb3J0IHNpdGUgKHRoZQpgcGF0Y2hfb3JjaGVzdHJhdG9yX2hlbHBlcnNgIHBhdHRlcm4pLiBObyBwcm9kdWN0aW9uIGNvZGUgaXMgdG91Y2hlZC4KCiMjIENoYW5nZSBzZXQgKGNvbW1pdCBvcmRlcikKCjEuICoqQWRkIHVuaXQgdGVzdHMgZm9yIFNPTmlDIGV4cG9ydGVyIG1vZHVsZSoqIOKAlCBgdGVzdF9leHBvcnRlci5weWAgKDIxIHRlc3RzKQogICAtIGBzYXZlX2NvbmZpZ190b19uZXRib3hgOiBmaXJzdC10aW1lIGNyZWF0ZSwgbm8tY2hhbmdlIChgRGVlcERpZmZgIGVtcHR5LAogICAgIG5vIHNhdmUpLCBjaGFuZ2VkIGNvbmZpZyAodW5pZmllZCBkaWZmICsgam91cm5hbCBlbnRyeSArIHNhdmUpLCBqb3VybmFsCiAgICAgZmFpbHVyZSBzdGlsbCBzYXZlcywgYGRldmljZS5zYXZlKClgIGZhaWx1cmUgcmV0dXJucyBuby1jaGFuZ2UuIEJvdGggdGhlCiAgICAgdHVwbGUgKGByZXR1cm5fZGlmZj1UcnVlYCkgYW5kIGJvb2wgcmV0dXJuIGZvcm1zIGFyZSBhc3NlcnRlZC4KICAgLSBgZXhwb3J0X2NvbmZpZ190b19maWxlYDogZmlsZW5hbWUgc2VsZWN0aW9uIChob3N0bmFtZSB2cy4gc2VyaWFsLW51bWJlciwKICAgICBlbXB0eS9taXNzaW5nIHNlcmlhbCBmYWxscyBiYWNrIHRvIGhvc3RuYW1lIHdpdGggYSB3YXJuaW5nKSwgZGlmZgogICAgIGhhbmRsaW5nIChtaXNzaW5nIC8gaWRlbnRpY2FsIC8gY2hhbmdlZCAvIHVucmVhZGFibGUgZmlsZSksIHN5bWxpbmsKICAgICBoYW5kbGluZyAoYWJzZW50IHRhcmdldCwgZXhpc3RpbmcgcmVndWxhciBmaWxlLCBkYW5nbGluZyBzeW1saW5rLAogICAgIGBvcy5zeW1saW5rYCBmYWlsdXJlLCBob3N0bmFtZSBtb2RlIC8gZmFsc3kgc2VyaWFsIHNraXApLCBhbmQgdGhlIG91dGVyCiAgICAgYG9zLm1ha2VkaXJzYCBmYWlsdXJlIHBhdGguCiAgIC0gRmlsZS1leHBvcnQgdGVzdHMgdXNlIGEgcmVhbCBgdG1wX3BhdGhgIGZpbGVzeXN0ZW0gd2hlcmUgdGhhdCByZWFkcyBtb3JlCiAgICAgY2xlYXJseSAodGhlIHN5bWxpbmsgZW5kLXN0YXRlIHByb3ZlcyByZW1vdmUtdGhlbi1zeW1saW5rIG9yZGVyaW5nKSwgYW5kCiAgICAgcGF0Y2ggYG9zLipgIG9ubHkgdG8gaW5qZWN0IHRoZSBzeW1saW5rIC8gbWFrZWRpcnMgZmFpbHVyZXMuCgoyLiAqKkFkZCB1bml0IHRlc3RzIGZvciBTT05pQyBzeW5jIG9yY2hlc3RyYXRvcioqIOKAlCBgdGVzdF9zeW5jLnB5YCAoMjYgdGVzdHMpCiAgIC0gQ2FjaGUgbGlmZWN5Y2xlOiBleGFjdCBzdGFydC9lbmQgY2xlYXIgb3JkZXJpbmcgdmlhIGBhdHRhY2hfbW9ja2AsIGFuZAogICAgIHRoZSBtZXRhbGJveCAvIFZJUCBsb2FkcyBjYWxsZWQgb25jZSBwZXIgaW52b2NhdGlvbi4KICAgLSBTaW5nbGUtZGV2aWNlIHBhdGg6IGFsbG93ZWQgcm9sZSBwcm9jZXNzZWQ7IGRpc2FsbG93ZWQgcm9sZSwgYHJvbGU9Tm9uZWAsCiAgICAgbm90LWZvdW5kLCBhbmQgbG9va3VwLXJhaXNlcyBlYWNoIHJldHVybiBge31gOyBzaW5nbGUgc3BpbmUgdHJpZ2dlcnMgdGhlCiAgICAgZnVsbCBzcGluZSBmZXRjaCAoYG5iLmRjaW0uZGV2aWNlcy5maWx0ZXJgKSwgc2luZ2xlIGxlYWYgZG9lcyBub3QuCiAgIC0gTXVsdGktZGV2aWNlIHBhdGg6IG9ubHkgYWxsb3dlZCByb2xlcyBrZXB0OyByb2xlLWxlc3MgZGV2aWNlcyBza2lwcGVkLgogICAtIFBlci1kZXZpY2U6IG1pc3NpbmcgLyB1bnN1cHBvcnRlZCAvIHZhbGlkIEhXU0tVOyBgY29uZmlnX3ZlcnNpb25gIHJlYWQKICAgICBmcm9tIGN1c3RvbSBmaWVsZHMuCiAgIC0gQVMgbWFwcGluZzogY29tcHV0ZWQgcGVyIHNwaW5lIGdyb3VwLCBwcm9wYWdhdGVkIGludG8KICAgICBgZ2VuZXJhdGVfc29uaWNfY29uZmlnYCwgYW5kIGEgYG1pbl9hcz1Ob25lYCBncm91cCBpcyBub3QgcHJvcGFnYXRlZC4KICAgLSBEaWZmIGhhbmRsaW5nOiBkaWZmIHN0cmVhbWVkIHRvIHRhc2sgb3V0cHV0LCBmaXJzdC10aW1lIG1lc3NhZ2UsCiAgICAgbm8tY2hhbmdlIHN0aWxsIGV4cG9ydHMsIGBzaG93X2RpZmY9RmFsc2VgIGNhbGxzIHNhdmUgd2l0aG91dAogICAgIGByZXR1cm5fZGlmZmAuCiAgIC0gVGFzayBvdXRwdXQgZ2F0ZWQgb24gYHRhc2tfaWRgOyBjYWNoZS1zdGF0cyBsb2dnZWQgb25seSB3aGVuIG5vbi1lbXB0eS4KCiAgIGBnZW5lcmF0ZV9zb25pY19jb25maWdgIGFuZCBgZmluZF9pbnRlcmNvbm5lY3RlZF9kZXZpY2VzYCBhcmUgc3R1YmJlZCAodGhleQogICBoYXZlIHRoZWlyIG93biBpc3N1ZXMgdW5kZXIgIzIxOTkpLCBwZXIgdGhlIGlzc3VlJ3MgaW5zdHJ1Y3Rpb25zLgoKIyMgTG9jYWwgdmVyaWZpY2F0aW9uCgotIGBibGFjayAtLWNoZWNrYCDigJQgcGFzcyAoYm90aCBmaWxlcykKLSBgZmxha2U4YCDigJQgcGFzcyAoYm90aCBmaWxlcykKLSBgcHl0aG9uIC1tIHB5X2NvbXBpbGVgIOKAlCBwYXNzIChib3RoIGZpbGVzKQotIGBweXRlc3RgIOKAlCBub3QgcnVuIGxvY2FsbHk7IHRoZSB1bml0LXRlc3Qgc3VpdGUgcnVucyBpbiB0aGUKICBgcHl0aG9uLW9zaXNtLXVuaXQtdGVzdHNgIFp1dWwgam9iLiBUaGUgY292ZXJhZ2UgZ2F0ZQogIChgLS1jb3Y9Li4uc3luY2AvYC4uLmV4cG9ydGVyYCA+PSA5MCAlKSBpcyB2ZXJpZmllZCB0aGVyZS4=
      patchset: 89ba47d2a038319b37d13c7f2bf20fb577b08765
      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/hadolint/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: 0c15eb2ff89a62e2e84ee716c9ca5d30b6b970c4
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2333/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
