all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe08:e931
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 578ac59a-200d-4c98-a5a0-313082ebb6eb
        host_id: 5afd8fc909abddfe2ce3a956a91bbe56629648b7209fd0acfa541862
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe08:e931
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.12
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.106
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe08:e931
        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: 599728fa864b4d5f80647d37d6f99e3a
      build_refs:
      - branch: main
        change: '2350'
        change_message: "Add unit tests for osism.utils.ssh\n\n## Summary\n\nImplements
          #2231. Adds `tests/unit/utils/test_ssh.py`, a single cohesive\ntest module
          covering every function in `osism/utils/ssh.py` (SSH\n`known_hosts` maintenance
          for reset/undeploy flows). No production code is\nchanged.\n\nPart of the
          Tier 4 testing effort (#2199); follow-up to #2192 / #2193.\n\n## Change
          set (single commit)\n\n**`Add unit tests for osism.utils.ssh`** \u2014 adds
          44 test functions grouped\nby the function under test:\n\n| Target (`ssh.py`)
          | Cases |\n|---|---|\n| `ensure_known_hosts_file` | dir+file exist (no writes),
          missing dir \u2192 `os.makedirs(..., mode=0o755, exist_ok=True)`, missing
          file \u2192 `open(path,\"a\")` + `os.chmod(path,0o644)`, `PermissionError`/`OSError`/catch-all
          branches, custom path propagation |\n| `get_host_identifiers` | unique DNS
          IP, DNS returns hostname (no dup), `socket.gaierror`, `utils.nb is None`,
          NetBox `primary_ip4` with prefix stripped, device `None`, NetBox lookup
          raises (no propagation), same IP from DNS+NetBox de-duplicated, list always
          starts with hostname |\n| `remove_known_hosts_entries` | empty/whitespace
          hostname, missing file \u2192 `True`, empty identifiers \u2192 `False`,
          lookup raises, `ssh-keygen` success (`updated` / identifier-in-stderr /
          neither), non-zero exit continues, `TimeoutExpired`/`CalledProcessError`/generic
          \u2192 `success=False`, multi-host one-timeout, empty-identifier skip, success/empty
          final logs |\n| `backup_known_hosts` | empty/missing/unreadable path, missing/unwritable
          backup dir, happy path (`shutil.copy2` + path regex), post-copy `exists`/`getsize`
          verification, `PermissionError`/`OSError`/catch-all copy failures |\n| `cleanup_ssh_known_hosts_for_node`
          | backup succeeds (debug log), backup `None` (cleanup still runs), `create_backup=False`,
          remove returns `False`, remove raises (caught) \u2014 always uses `KNOWN_HOSTS_PATH`
          |\n\n## Notes for the reviewer\n\n- Tests use `pytest-mock` (`mocker`) and
          the shared `loguru_logs` fixture\n  from `tests/conftest.py`, matching the
          existing `tests/unit/utils` style.\n- `socket`, `shutil` and `datetime`
          are imported **inside** the functions\n  under test. The issue's hint to
          patch `osism.utils.ssh.datetime.datetime`\n  cannot resolve (no module-level
          `datetime` attribute), so the timestamped\n  backup path is asserted with
          a regular expression instead \u2014 the\n  alternative the issue explicitly
          allows. For the same reason\n  `socket.gethostbyname` and `shutil.copy2`
          are patched on their real\n  modules; `utils.nb` is patched via `osism.utils.ssh.utils.nb`\n
          \ (`create=True`), mirroring `tests/unit/tasks/conductor/test_netbox.py`.\n\n##
          Verification\n\n- `black --check`, `flake8` (repo config): clean on the
          new file.\n- `mypy`: no type errors in the test logic (local run reports
          only\n  third-party `import-not-found` notes, which resolve inside the CI
          venv).\n- Per-line trace of `ssh.py` shows every executable line is exercised,\n
          \ comfortably above the \u226595 % target.\n- `pytest`/coverage left to
          the Zuul `python-osism-unit-tests` job.\n\nCloses #2231.\n\nAssisted-by:
          Claude:anthropic-opus-4-8\n"
        change_url: https://github.com/osism/python-osism/pull/2350
        commit_id: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
        patchset: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
        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: 204d10ff5e874b7fb5636ccc44185edd
      buildset_refs:
      - branch: main
        change: '2350'
        change_message: "Add unit tests for osism.utils.ssh\n\n## Summary\n\nImplements
          #2231. Adds `tests/unit/utils/test_ssh.py`, a single cohesive\ntest module
          covering every function in `osism/utils/ssh.py` (SSH\n`known_hosts` maintenance
          for reset/undeploy flows). No production code is\nchanged.\n\nPart of the
          Tier 4 testing effort (#2199); follow-up to #2192 / #2193.\n\n## Change
          set (single commit)\n\n**`Add unit tests for osism.utils.ssh`** \u2014 adds
          44 test functions grouped\nby the function under test:\n\n| Target (`ssh.py`)
          | Cases |\n|---|---|\n| `ensure_known_hosts_file` | dir+file exist (no writes),
          missing dir \u2192 `os.makedirs(..., mode=0o755, exist_ok=True)`, missing
          file \u2192 `open(path,\"a\")` + `os.chmod(path,0o644)`, `PermissionError`/`OSError`/catch-all
          branches, custom path propagation |\n| `get_host_identifiers` | unique DNS
          IP, DNS returns hostname (no dup), `socket.gaierror`, `utils.nb is None`,
          NetBox `primary_ip4` with prefix stripped, device `None`, NetBox lookup
          raises (no propagation), same IP from DNS+NetBox de-duplicated, list always
          starts with hostname |\n| `remove_known_hosts_entries` | empty/whitespace
          hostname, missing file \u2192 `True`, empty identifiers \u2192 `False`,
          lookup raises, `ssh-keygen` success (`updated` / identifier-in-stderr /
          neither), non-zero exit continues, `TimeoutExpired`/`CalledProcessError`/generic
          \u2192 `success=False`, multi-host one-timeout, empty-identifier skip, success/empty
          final logs |\n| `backup_known_hosts` | empty/missing/unreadable path, missing/unwritable
          backup dir, happy path (`shutil.copy2` + path regex), post-copy `exists`/`getsize`
          verification, `PermissionError`/`OSError`/catch-all copy failures |\n| `cleanup_ssh_known_hosts_for_node`
          | backup succeeds (debug log), backup `None` (cleanup still runs), `create_backup=False`,
          remove returns `False`, remove raises (caught) \u2014 always uses `KNOWN_HOSTS_PATH`
          |\n\n## Notes for the reviewer\n\n- Tests use `pytest-mock` (`mocker`) and
          the shared `loguru_logs` fixture\n  from `tests/conftest.py`, matching the
          existing `tests/unit/utils` style.\n- `socket`, `shutil` and `datetime`
          are imported **inside** the functions\n  under test. The issue's hint to
          patch `osism.utils.ssh.datetime.datetime`\n  cannot resolve (no module-level
          `datetime` attribute), so the timestamped\n  backup path is asserted with
          a regular expression instead \u2014 the\n  alternative the issue explicitly
          allows. For the same reason\n  `socket.gethostbyname` and `shutil.copy2`
          are patched on their real\n  modules; `utils.nb` is patched via `osism.utils.ssh.utils.nb`\n
          \ (`create=True`), mirroring `tests/unit/tasks/conductor/test_netbox.py`.\n\n##
          Verification\n\n- `black --check`, `flake8` (repo config): clean on the
          new file.\n- `mypy`: no type errors in the test logic (local run reports
          only\n  third-party `import-not-found` notes, which resolve inside the CI
          venv).\n- Per-line trace of `ssh.py` shows every executable line is exercised,\n
          \ comfortably above the \u226595 % target.\n- `pytest`/coverage left to
          the Zuul `python-osism-unit-tests` job.\n\nCloses #2231.\n\nAssisted-by:
          Claude:anthropic-opus-4-8\n"
        change_url: https://github.com/osism/python-osism/pull/2350
        commit_id: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
        patchset: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
        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: '2350'
      change_message: "Add unit tests for osism.utils.ssh\n\n## Summary\n\nImplements
        #2231. Adds `tests/unit/utils/test_ssh.py`, a single cohesive\ntest module
        covering every function in `osism/utils/ssh.py` (SSH\n`known_hosts` maintenance
        for reset/undeploy flows). No production code is\nchanged.\n\nPart of the
        Tier 4 testing effort (#2199); follow-up to #2192 / #2193.\n\n## Change set
        (single commit)\n\n**`Add unit tests for osism.utils.ssh`** \u2014 adds 44
        test functions grouped\nby the function under test:\n\n| Target (`ssh.py`)
        | Cases |\n|---|---|\n| `ensure_known_hosts_file` | dir+file exist (no writes),
        missing dir \u2192 `os.makedirs(..., mode=0o755, exist_ok=True)`, missing
        file \u2192 `open(path,\"a\")` + `os.chmod(path,0o644)`, `PermissionError`/`OSError`/catch-all
        branches, custom path propagation |\n| `get_host_identifiers` | unique DNS
        IP, DNS returns hostname (no dup), `socket.gaierror`, `utils.nb is None`,
        NetBox `primary_ip4` with prefix stripped, device `None`, NetBox lookup raises
        (no propagation), same IP from DNS+NetBox de-duplicated, list always starts
        with hostname |\n| `remove_known_hosts_entries` | empty/whitespace hostname,
        missing file \u2192 `True`, empty identifiers \u2192 `False`, lookup raises,
        `ssh-keygen` success (`updated` / identifier-in-stderr / neither), non-zero
        exit continues, `TimeoutExpired`/`CalledProcessError`/generic \u2192 `success=False`,
        multi-host one-timeout, empty-identifier skip, success/empty final logs |\n|
        `backup_known_hosts` | empty/missing/unreadable path, missing/unwritable backup
        dir, happy path (`shutil.copy2` + path regex), post-copy `exists`/`getsize`
        verification, `PermissionError`/`OSError`/catch-all copy failures |\n| `cleanup_ssh_known_hosts_for_node`
        | backup succeeds (debug log), backup `None` (cleanup still runs), `create_backup=False`,
        remove returns `False`, remove raises (caught) \u2014 always uses `KNOWN_HOSTS_PATH`
        |\n\n## Notes for the reviewer\n\n- Tests use `pytest-mock` (`mocker`) and
        the shared `loguru_logs` fixture\n  from `tests/conftest.py`, matching the
        existing `tests/unit/utils` style.\n- `socket`, `shutil` and `datetime` are
        imported **inside** the functions\n  under test. The issue's hint to patch
        `osism.utils.ssh.datetime.datetime`\n  cannot resolve (no module-level `datetime`
        attribute), so the timestamped\n  backup path is asserted with a regular expression
        instead \u2014 the\n  alternative the issue explicitly allows. For the same
        reason\n  `socket.gethostbyname` and `shutil.copy2` are patched on their real\n
        \ modules; `utils.nb` is patched via `osism.utils.ssh.utils.nb`\n  (`create=True`),
        mirroring `tests/unit/tasks/conductor/test_netbox.py`.\n\n## Verification\n\n-
        `black --check`, `flake8` (repo config): clean on the new file.\n- `mypy`:
        no type errors in the test logic (local run reports only\n  third-party `import-not-found`
        notes, which resolve inside the CI venv).\n- Per-line trace of `ssh.py` shows
        every executable line is exercised,\n  comfortably above the \u226595 % target.\n-
        `pytest`/coverage left to the Zuul `python-osism-unit-tests` job.\n\nCloses
        #2231.\n\nAssisted-by: Claude:anthropic-opus-4-8\n"
      change_url: https://github.com/osism/python-osism/pull/2350
      child_jobs: []
      commit_id: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
      event_id: e231d480-770e-11f1-9b1d-1387916ac2ac
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/599728fa864b4d5f80647d37d6f99e3a/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/599728fa864b4d5f80647d37d6f99e3a/work/logs
        result_data_file: /var/lib/zuul/builds/599728fa864b4d5f80647d37d6f99e3a/work/results.json
        src_root: /var/lib/zuul/builds/599728fa864b4d5f80647d37d6f99e3a/work/src
        work_root: /var/lib/zuul/builds/599728fa864b4d5f80647d37d6f99e3a/work
      include_vars: []
      items:
      - branch: main
        change: '2350'
        change_message: "Add unit tests for osism.utils.ssh\n\n## Summary\n\nImplements
          #2231. Adds `tests/unit/utils/test_ssh.py`, a single cohesive\ntest module
          covering every function in `osism/utils/ssh.py` (SSH\n`known_hosts` maintenance
          for reset/undeploy flows). No production code is\nchanged.\n\nPart of the
          Tier 4 testing effort (#2199); follow-up to #2192 / #2193.\n\n## Change
          set (single commit)\n\n**`Add unit tests for osism.utils.ssh`** \u2014 adds
          44 test functions grouped\nby the function under test:\n\n| Target (`ssh.py`)
          | Cases |\n|---|---|\n| `ensure_known_hosts_file` | dir+file exist (no writes),
          missing dir \u2192 `os.makedirs(..., mode=0o755, exist_ok=True)`, missing
          file \u2192 `open(path,\"a\")` + `os.chmod(path,0o644)`, `PermissionError`/`OSError`/catch-all
          branches, custom path propagation |\n| `get_host_identifiers` | unique DNS
          IP, DNS returns hostname (no dup), `socket.gaierror`, `utils.nb is None`,
          NetBox `primary_ip4` with prefix stripped, device `None`, NetBox lookup
          raises (no propagation), same IP from DNS+NetBox de-duplicated, list always
          starts with hostname |\n| `remove_known_hosts_entries` | empty/whitespace
          hostname, missing file \u2192 `True`, empty identifiers \u2192 `False`,
          lookup raises, `ssh-keygen` success (`updated` / identifier-in-stderr /
          neither), non-zero exit continues, `TimeoutExpired`/`CalledProcessError`/generic
          \u2192 `success=False`, multi-host one-timeout, empty-identifier skip, success/empty
          final logs |\n| `backup_known_hosts` | empty/missing/unreadable path, missing/unwritable
          backup dir, happy path (`shutil.copy2` + path regex), post-copy `exists`/`getsize`
          verification, `PermissionError`/`OSError`/catch-all copy failures |\n| `cleanup_ssh_known_hosts_for_node`
          | backup succeeds (debug log), backup `None` (cleanup still runs), `create_backup=False`,
          remove returns `False`, remove raises (caught) \u2014 always uses `KNOWN_HOSTS_PATH`
          |\n\n## Notes for the reviewer\n\n- Tests use `pytest-mock` (`mocker`) and
          the shared `loguru_logs` fixture\n  from `tests/conftest.py`, matching the
          existing `tests/unit/utils` style.\n- `socket`, `shutil` and `datetime`
          are imported **inside** the functions\n  under test. The issue's hint to
          patch `osism.utils.ssh.datetime.datetime`\n  cannot resolve (no module-level
          `datetime` attribute), so the timestamped\n  backup path is asserted with
          a regular expression instead \u2014 the\n  alternative the issue explicitly
          allows. For the same reason\n  `socket.gethostbyname` and `shutil.copy2`
          are patched on their real\n  modules; `utils.nb` is patched via `osism.utils.ssh.utils.nb`\n
          \ (`create=True`), mirroring `tests/unit/tasks/conductor/test_netbox.py`.\n\n##
          Verification\n\n- `black --check`, `flake8` (repo config): clean on the
          new file.\n- `mypy`: no type errors in the test logic (local run reports
          only\n  third-party `import-not-found` notes, which resolve inside the CI
          venv).\n- Per-line trace of `ssh.py` shows every executable line is exercised,\n
          \ comfortably above the \u226595 % target.\n- `pytest`/coverage left to
          the Zuul `python-osism-unit-tests` job.\n\nCloses #2231.\n\nAssisted-by:
          Claude:anthropic-opus-4-8\n"
        change_url: https://github.com/osism/python-osism/pull/2350
        commit_id: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
        patchset: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
        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: QWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtLnV0aWxzLnNzaAoKIyMgU3VtbWFyeQoKSW1wbGVtZW50cyAjMjIzMS4gQWRkcyBgdGVzdHMvdW5pdC91dGlscy90ZXN0X3NzaC5weWAsIGEgc2luZ2xlIGNvaGVzaXZlCnRlc3QgbW9kdWxlIGNvdmVyaW5nIGV2ZXJ5IGZ1bmN0aW9uIGluIGBvc2lzbS91dGlscy9zc2gucHlgIChTU0gKYGtub3duX2hvc3RzYCBtYWludGVuYW5jZSBmb3IgcmVzZXQvdW5kZXBsb3kgZmxvd3MpLiBObyBwcm9kdWN0aW9uIGNvZGUgaXMKY2hhbmdlZC4KClBhcnQgb2YgdGhlIFRpZXIgNCB0ZXN0aW5nIGVmZm9ydCAoIzIxOTkpOyBmb2xsb3ctdXAgdG8gIzIxOTIgLyAjMjE5My4KCiMjIENoYW5nZSBzZXQgKHNpbmdsZSBjb21taXQpCgoqKmBBZGQgdW5pdCB0ZXN0cyBmb3Igb3Npc20udXRpbHMuc3NoYCoqIOKAlCBhZGRzIDQ0IHRlc3QgZnVuY3Rpb25zIGdyb3VwZWQKYnkgdGhlIGZ1bmN0aW9uIHVuZGVyIHRlc3Q6Cgp8IFRhcmdldCAoYHNzaC5weWApIHwgQ2FzZXMgfAp8LS0tfC0tLXwKfCBgZW5zdXJlX2tub3duX2hvc3RzX2ZpbGVgIHwgZGlyK2ZpbGUgZXhpc3QgKG5vIHdyaXRlcyksIG1pc3NpbmcgZGlyIOKGkiBgb3MubWFrZWRpcnMoLi4uLCBtb2RlPTBvNzU1LCBleGlzdF9vaz1UcnVlKWAsIG1pc3NpbmcgZmlsZSDihpIgYG9wZW4ocGF0aCwiYSIpYCArIGBvcy5jaG1vZChwYXRoLDBvNjQ0KWAsIGBQZXJtaXNzaW9uRXJyb3JgL2BPU0Vycm9yYC9jYXRjaC1hbGwgYnJhbmNoZXMsIGN1c3RvbSBwYXRoIHByb3BhZ2F0aW9uIHwKfCBgZ2V0X2hvc3RfaWRlbnRpZmllcnNgIHwgdW5pcXVlIEROUyBJUCwgRE5TIHJldHVybnMgaG9zdG5hbWUgKG5vIGR1cCksIGBzb2NrZXQuZ2FpZXJyb3JgLCBgdXRpbHMubmIgaXMgTm9uZWAsIE5ldEJveCBgcHJpbWFyeV9pcDRgIHdpdGggcHJlZml4IHN0cmlwcGVkLCBkZXZpY2UgYE5vbmVgLCBOZXRCb3ggbG9va3VwIHJhaXNlcyAobm8gcHJvcGFnYXRpb24pLCBzYW1lIElQIGZyb20gRE5TK05ldEJveCBkZS1kdXBsaWNhdGVkLCBsaXN0IGFsd2F5cyBzdGFydHMgd2l0aCBob3N0bmFtZSB8CnwgYHJlbW92ZV9rbm93bl9ob3N0c19lbnRyaWVzYCB8IGVtcHR5L3doaXRlc3BhY2UgaG9zdG5hbWUsIG1pc3NpbmcgZmlsZSDihpIgYFRydWVgLCBlbXB0eSBpZGVudGlmaWVycyDihpIgYEZhbHNlYCwgbG9va3VwIHJhaXNlcywgYHNzaC1rZXlnZW5gIHN1Y2Nlc3MgKGB1cGRhdGVkYCAvIGlkZW50aWZpZXItaW4tc3RkZXJyIC8gbmVpdGhlciksIG5vbi16ZXJvIGV4aXQgY29udGludWVzLCBgVGltZW91dEV4cGlyZWRgL2BDYWxsZWRQcm9jZXNzRXJyb3JgL2dlbmVyaWMg4oaSIGBzdWNjZXNzPUZhbHNlYCwgbXVsdGktaG9zdCBvbmUtdGltZW91dCwgZW1wdHktaWRlbnRpZmllciBza2lwLCBzdWNjZXNzL2VtcHR5IGZpbmFsIGxvZ3MgfAp8IGBiYWNrdXBfa25vd25faG9zdHNgIHwgZW1wdHkvbWlzc2luZy91bnJlYWRhYmxlIHBhdGgsIG1pc3NpbmcvdW53cml0YWJsZSBiYWNrdXAgZGlyLCBoYXBweSBwYXRoIChgc2h1dGlsLmNvcHkyYCArIHBhdGggcmVnZXgpLCBwb3N0LWNvcHkgYGV4aXN0c2AvYGdldHNpemVgIHZlcmlmaWNhdGlvbiwgYFBlcm1pc3Npb25FcnJvcmAvYE9TRXJyb3JgL2NhdGNoLWFsbCBjb3B5IGZhaWx1cmVzIHwKfCBgY2xlYW51cF9zc2hfa25vd25faG9zdHNfZm9yX25vZGVgIHwgYmFja3VwIHN1Y2NlZWRzIChkZWJ1ZyBsb2cpLCBiYWNrdXAgYE5vbmVgIChjbGVhbnVwIHN0aWxsIHJ1bnMpLCBgY3JlYXRlX2JhY2t1cD1GYWxzZWAsIHJlbW92ZSByZXR1cm5zIGBGYWxzZWAsIHJlbW92ZSByYWlzZXMgKGNhdWdodCkg4oCUIGFsd2F5cyB1c2VzIGBLTk9XTl9IT1NUU19QQVRIYCB8CgojIyBOb3RlcyBmb3IgdGhlIHJldmlld2VyCgotIFRlc3RzIHVzZSBgcHl0ZXN0LW1vY2tgIChgbW9ja2VyYCkgYW5kIHRoZSBzaGFyZWQgYGxvZ3VydV9sb2dzYCBmaXh0dXJlCiAgZnJvbSBgdGVzdHMvY29uZnRlc3QucHlgLCBtYXRjaGluZyB0aGUgZXhpc3RpbmcgYHRlc3RzL3VuaXQvdXRpbHNgIHN0eWxlLgotIGBzb2NrZXRgLCBgc2h1dGlsYCBhbmQgYGRhdGV0aW1lYCBhcmUgaW1wb3J0ZWQgKippbnNpZGUqKiB0aGUgZnVuY3Rpb25zCiAgdW5kZXIgdGVzdC4gVGhlIGlzc3VlJ3MgaGludCB0byBwYXRjaCBgb3Npc20udXRpbHMuc3NoLmRhdGV0aW1lLmRhdGV0aW1lYAogIGNhbm5vdCByZXNvbHZlIChubyBtb2R1bGUtbGV2ZWwgYGRhdGV0aW1lYCBhdHRyaWJ1dGUpLCBzbyB0aGUgdGltZXN0YW1wZWQKICBiYWNrdXAgcGF0aCBpcyBhc3NlcnRlZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIGluc3RlYWQg4oCUIHRoZQogIGFsdGVybmF0aXZlIHRoZSBpc3N1ZSBleHBsaWNpdGx5IGFsbG93cy4gRm9yIHRoZSBzYW1lIHJlYXNvbgogIGBzb2NrZXQuZ2V0aG9zdGJ5bmFtZWAgYW5kIGBzaHV0aWwuY29weTJgIGFyZSBwYXRjaGVkIG9uIHRoZWlyIHJlYWwKICBtb2R1bGVzOyBgdXRpbHMubmJgIGlzIHBhdGNoZWQgdmlhIGBvc2lzbS51dGlscy5zc2gudXRpbHMubmJgCiAgKGBjcmVhdGU9VHJ1ZWApLCBtaXJyb3JpbmcgYHRlc3RzL3VuaXQvdGFza3MvY29uZHVjdG9yL3Rlc3RfbmV0Ym94LnB5YC4KCiMjIFZlcmlmaWNhdGlvbgoKLSBgYmxhY2sgLS1jaGVja2AsIGBmbGFrZThgIChyZXBvIGNvbmZpZyk6IGNsZWFuIG9uIHRoZSBuZXcgZmlsZS4KLSBgbXlweWA6IG5vIHR5cGUgZXJyb3JzIGluIHRoZSB0ZXN0IGxvZ2ljIChsb2NhbCBydW4gcmVwb3J0cyBvbmx5CiAgdGhpcmQtcGFydHkgYGltcG9ydC1ub3QtZm91bmRgIG5vdGVzLCB3aGljaCByZXNvbHZlIGluc2lkZSB0aGUgQ0kgdmVudikuCi0gUGVyLWxpbmUgdHJhY2Ugb2YgYHNzaC5weWAgc2hvd3MgZXZlcnkgZXhlY3V0YWJsZSBsaW5lIGlzIGV4ZXJjaXNlZCwKICBjb21mb3J0YWJseSBhYm92ZSB0aGUg4omlOTUgJSB0YXJnZXQuCi0gYHB5dGVzdGAvY292ZXJhZ2UgbGVmdCB0byB0aGUgWnV1bCBgcHl0aG9uLW9zaXNtLXVuaXQtdGVzdHNgIGpvYi4KCkNsb3NlcyAjMjIzMS4KCkFzc2lzdGVkLWJ5OiBDbGF1ZGU6YW50aHJvcGljLW9wdXMtNC04Cg==
      patchset: f38f9beeac9c7a5d473aa9b0fb1e0693abe61ddd
      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: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 7edb47009f3fc537642235f2a1652e13b10d1807
          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: 1d71e58c93442038e695a5d883d57a603182c7ae
        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: 7edb47009f3fc537642235f2a1652e13b10d1807
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2350/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
