all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe5f:55d9
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: a09c6f64-483c-4fab-ba6d-5fe681251049
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe5f:55d9
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.101
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.144
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe5f:55d9
        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-black explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#54>'
      - '<Job python-black explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#138>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 71dedc70343a489fb85132e5fa184d05
      build_refs:
      - branch: main
        change: '2349'
        change_message: "Add unit tests for osism/utils semaphore, redlock and task
          locks\n\nImplements #2230.\n\nAdds `tests/unit/utils/test_init_locks.py`,
          the third companion to\n`test_init_connections.py` and `test_init_task_output.py`,
          covering the\nconcurrency primitives and global task-lock helpers in\n`osism/utils/__init__.py`.
          No production code is changed \u2014 this is a\npure test addition. 40 test
          functions (41 cases) following the\nestablished `mocker` / `loguru_logs`
          conventions of the existing suite.\n\n## Change set (commit order)\n\n1.
          **Add RedisSemaphore unit tests** \u2014 `__init__` attribute storage and\n
          \  the unconditional `semaphore:` key prefix (including the\n   already-prefixed
          input \u2192 double prefix); `acquire()` first-try\n   success, full-window
          timeout returning `False`, per-iteration\n   `zremrangebyscore` cleanup,
          the default-10s and explicit-timeout\n   fallbacks, and a fresh `uuid.uuid4()`
          per call; `release()`\n   idempotency; and the `__enter__`/`__exit__` context-manager
          protocol\n   (returns `self`, raises `TimeoutError` containing the key,
          always\n   releases, never swallows exceptions). `time.time`/`time.sleep`/\n
          \  `uuid.uuid4` are patched so the acquisition loop is deterministic.\n2.
          **Add create_redlock and create_netbox_semaphore unit tests** \u2014\n   `create_redlock`
          returns the `pottery.Redlock` built with\n   `key`/`masters={redis}`/`auto_release_time`
          (default `3600` and a\n   custom value), forces the `\"pottery\"` logger
          to `CRITICAL`, and\n   suppresses construction-time stdout/stderr (asserted
          via `capsys`).\n   `create_netbox_semaphore` falls back to\n   `settings.NETBOX_MAX_CONNECTIONS`
          or takes an explicit value, builds\n   a per-URL md5-derived key with `timeout=30`
          and the shared redis\n   client, and produces a stable key per URL.\n3.
          **Add task-lock helper unit tests** \u2014 `set_task_lock`,\n   `remove_task_lock`,
          `is_task_locked` and `check_task_lock_and_exit`,\n   including the operator-user/reason
          fallbacks, the JSON payload shape\n   (regex-matched ISO timestamp), the
          `.decode(\"utf-8\")` path, and the\n   error-logging branches. `builtins.exit`
          and `is_task_locked` are\n   patched for `check_task_lock_and_exit`.\n\n##
          Notes for the reviewer\n\n- `pottery.Redlock` is patched on the `pottery`
          module (not imported\n  into `osism.utils`) because production imports it
          lazily inside\n  `create_redlock` \u2014 matching the issue's mocking hint.\n-
          `logging.getLogger` is patched in the `create_redlock` tests so they\n  never
          mutate the process-global `pottery` logger level (test\n  isolation), addressing
          the issue's note about that mutable state.\n- `freezegun` is not a dev dependency,
          so the `set_task_lock` timestamp\n  is matched with a regex (`^\\d{4}-\\d{2}-\\d{2}T...`)
          rather than frozen,\n  as the issue allows.\n\n## Local verification\n\nPer
          repository practice the test suite, `flake8`, `mypy` and\n`python-black`
          run only in the pipenv venv / Zuul CI (the dev tools and\n`pottery` are
          not installed in the base interpreter), so they were not\nrun locally. `python
          -m py_compile` passes. The Zuul\n`python-osism-unit-tests` job will run
          the suite. The tests exercise\nevery branch of the targeted helpers, satisfying
          the \u226590 % coverage\ncriterion for them.\n\nCloses #2230\n\nAssisted-by:
          Claude:claude-opus-4-8"
        change_url: https://github.com/osism/python-osism/pull/2349
        commit_id: cf3512791f66d3dcca97f9d716ab9baf268891bd
        patchset: cf3512791f66d3dcca97f9d716ab9baf268891bd
        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: 71b3daa4f86541e28b8902cd9776b564
      buildset_refs:
      - branch: main
        change: '2349'
        change_message: "Add unit tests for osism/utils semaphore, redlock and task
          locks\n\nImplements #2230.\n\nAdds `tests/unit/utils/test_init_locks.py`,
          the third companion to\n`test_init_connections.py` and `test_init_task_output.py`,
          covering the\nconcurrency primitives and global task-lock helpers in\n`osism/utils/__init__.py`.
          No production code is changed \u2014 this is a\npure test addition. 40 test
          functions (41 cases) following the\nestablished `mocker` / `loguru_logs`
          conventions of the existing suite.\n\n## Change set (commit order)\n\n1.
          **Add RedisSemaphore unit tests** \u2014 `__init__` attribute storage and\n
          \  the unconditional `semaphore:` key prefix (including the\n   already-prefixed
          input \u2192 double prefix); `acquire()` first-try\n   success, full-window
          timeout returning `False`, per-iteration\n   `zremrangebyscore` cleanup,
          the default-10s and explicit-timeout\n   fallbacks, and a fresh `uuid.uuid4()`
          per call; `release()`\n   idempotency; and the `__enter__`/`__exit__` context-manager
          protocol\n   (returns `self`, raises `TimeoutError` containing the key,
          always\n   releases, never swallows exceptions). `time.time`/`time.sleep`/\n
          \  `uuid.uuid4` are patched so the acquisition loop is deterministic.\n2.
          **Add create_redlock and create_netbox_semaphore unit tests** \u2014\n   `create_redlock`
          returns the `pottery.Redlock` built with\n   `key`/`masters={redis}`/`auto_release_time`
          (default `3600` and a\n   custom value), forces the `\"pottery\"` logger
          to `CRITICAL`, and\n   suppresses construction-time stdout/stderr (asserted
          via `capsys`).\n   `create_netbox_semaphore` falls back to\n   `settings.NETBOX_MAX_CONNECTIONS`
          or takes an explicit value, builds\n   a per-URL md5-derived key with `timeout=30`
          and the shared redis\n   client, and produces a stable key per URL.\n3.
          **Add task-lock helper unit tests** \u2014 `set_task_lock`,\n   `remove_task_lock`,
          `is_task_locked` and `check_task_lock_and_exit`,\n   including the operator-user/reason
          fallbacks, the JSON payload shape\n   (regex-matched ISO timestamp), the
          `.decode(\"utf-8\")` path, and the\n   error-logging branches. `builtins.exit`
          and `is_task_locked` are\n   patched for `check_task_lock_and_exit`.\n\n##
          Notes for the reviewer\n\n- `pottery.Redlock` is patched on the `pottery`
          module (not imported\n  into `osism.utils`) because production imports it
          lazily inside\n  `create_redlock` \u2014 matching the issue's mocking hint.\n-
          `logging.getLogger` is patched in the `create_redlock` tests so they\n  never
          mutate the process-global `pottery` logger level (test\n  isolation), addressing
          the issue's note about that mutable state.\n- `freezegun` is not a dev dependency,
          so the `set_task_lock` timestamp\n  is matched with a regex (`^\\d{4}-\\d{2}-\\d{2}T...`)
          rather than frozen,\n  as the issue allows.\n\n## Local verification\n\nPer
          repository practice the test suite, `flake8`, `mypy` and\n`python-black`
          run only in the pipenv venv / Zuul CI (the dev tools and\n`pottery` are
          not installed in the base interpreter), so they were not\nrun locally. `python
          -m py_compile` passes. The Zuul\n`python-osism-unit-tests` job will run
          the suite. The tests exercise\nevery branch of the targeted helpers, satisfying
          the \u226590 % coverage\ncriterion for them.\n\nCloses #2230\n\nAssisted-by:
          Claude:claude-opus-4-8"
        change_url: https://github.com/osism/python-osism/pull/2349
        commit_id: cf3512791f66d3dcca97f9d716ab9baf268891bd
        patchset: cf3512791f66d3dcca97f9d716ab9baf268891bd
        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: '2349'
      change_message: "Add unit tests for osism/utils semaphore, redlock and task
        locks\n\nImplements #2230.\n\nAdds `tests/unit/utils/test_init_locks.py`,
        the third companion to\n`test_init_connections.py` and `test_init_task_output.py`,
        covering the\nconcurrency primitives and global task-lock helpers in\n`osism/utils/__init__.py`.
        No production code is changed \u2014 this is a\npure test addition. 40 test
        functions (41 cases) following the\nestablished `mocker` / `loguru_logs` conventions
        of the existing suite.\n\n## Change set (commit order)\n\n1. **Add RedisSemaphore
        unit tests** \u2014 `__init__` attribute storage and\n   the unconditional
        `semaphore:` key prefix (including the\n   already-prefixed input \u2192 double
        prefix); `acquire()` first-try\n   success, full-window timeout returning
        `False`, per-iteration\n   `zremrangebyscore` cleanup, the default-10s and
        explicit-timeout\n   fallbacks, and a fresh `uuid.uuid4()` per call; `release()`\n
        \  idempotency; and the `__enter__`/`__exit__` context-manager protocol\n
        \  (returns `self`, raises `TimeoutError` containing the key, always\n   releases,
        never swallows exceptions). `time.time`/`time.sleep`/\n   `uuid.uuid4` are
        patched so the acquisition loop is deterministic.\n2. **Add create_redlock
        and create_netbox_semaphore unit tests** \u2014\n   `create_redlock` returns
        the `pottery.Redlock` built with\n   `key`/`masters={redis}`/`auto_release_time`
        (default `3600` and a\n   custom value), forces the `\"pottery\"` logger to
        `CRITICAL`, and\n   suppresses construction-time stdout/stderr (asserted via
        `capsys`).\n   `create_netbox_semaphore` falls back to\n   `settings.NETBOX_MAX_CONNECTIONS`
        or takes an explicit value, builds\n   a per-URL md5-derived key with `timeout=30`
        and the shared redis\n   client, and produces a stable key per URL.\n3. **Add
        task-lock helper unit tests** \u2014 `set_task_lock`,\n   `remove_task_lock`,
        `is_task_locked` and `check_task_lock_and_exit`,\n   including the operator-user/reason
        fallbacks, the JSON payload shape\n   (regex-matched ISO timestamp), the `.decode(\"utf-8\")`
        path, and the\n   error-logging branches. `builtins.exit` and `is_task_locked`
        are\n   patched for `check_task_lock_and_exit`.\n\n## Notes for the reviewer\n\n-
        `pottery.Redlock` is patched on the `pottery` module (not imported\n  into
        `osism.utils`) because production imports it lazily inside\n  `create_redlock`
        \u2014 matching the issue's mocking hint.\n- `logging.getLogger` is patched
        in the `create_redlock` tests so they\n  never mutate the process-global `pottery`
        logger level (test\n  isolation), addressing the issue's note about that mutable
        state.\n- `freezegun` is not a dev dependency, so the `set_task_lock` timestamp\n
        \ is matched with a regex (`^\\d{4}-\\d{2}-\\d{2}T...`) rather than frozen,\n
        \ as the issue allows.\n\n## Local verification\n\nPer repository practice
        the test suite, `flake8`, `mypy` and\n`python-black` run only in the pipenv
        venv / Zuul CI (the dev tools and\n`pottery` are not installed in the base
        interpreter), so they were not\nrun locally. `python -m py_compile` passes.
        The Zuul\n`python-osism-unit-tests` job will run the suite. The tests exercise\nevery
        branch of the targeted helpers, satisfying the \u226590 % coverage\ncriterion
        for them.\n\nCloses #2230\n\nAssisted-by: Claude:claude-opus-4-8"
      change_url: https://github.com/osism/python-osism/pull/2349
      child_jobs: []
      commit_id: cf3512791f66d3dcca97f9d716ab9baf268891bd
      event_id: a4f83180-664d-11f1-88c1-4677e29c8bea
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/71dedc70343a489fb85132e5fa184d05/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/71dedc70343a489fb85132e5fa184d05/work/logs
        result_data_file: /var/lib/zuul/builds/71dedc70343a489fb85132e5fa184d05/work/results.json
        src_root: /var/lib/zuul/builds/71dedc70343a489fb85132e5fa184d05/work/src
        work_root: /var/lib/zuul/builds/71dedc70343a489fb85132e5fa184d05/work
      include_vars: []
      items:
      - branch: main
        change: '2349'
        change_message: "Add unit tests for osism/utils semaphore, redlock and task
          locks\n\nImplements #2230.\n\nAdds `tests/unit/utils/test_init_locks.py`,
          the third companion to\n`test_init_connections.py` and `test_init_task_output.py`,
          covering the\nconcurrency primitives and global task-lock helpers in\n`osism/utils/__init__.py`.
          No production code is changed \u2014 this is a\npure test addition. 40 test
          functions (41 cases) following the\nestablished `mocker` / `loguru_logs`
          conventions of the existing suite.\n\n## Change set (commit order)\n\n1.
          **Add RedisSemaphore unit tests** \u2014 `__init__` attribute storage and\n
          \  the unconditional `semaphore:` key prefix (including the\n   already-prefixed
          input \u2192 double prefix); `acquire()` first-try\n   success, full-window
          timeout returning `False`, per-iteration\n   `zremrangebyscore` cleanup,
          the default-10s and explicit-timeout\n   fallbacks, and a fresh `uuid.uuid4()`
          per call; `release()`\n   idempotency; and the `__enter__`/`__exit__` context-manager
          protocol\n   (returns `self`, raises `TimeoutError` containing the key,
          always\n   releases, never swallows exceptions). `time.time`/`time.sleep`/\n
          \  `uuid.uuid4` are patched so the acquisition loop is deterministic.\n2.
          **Add create_redlock and create_netbox_semaphore unit tests** \u2014\n   `create_redlock`
          returns the `pottery.Redlock` built with\n   `key`/`masters={redis}`/`auto_release_time`
          (default `3600` and a\n   custom value), forces the `\"pottery\"` logger
          to `CRITICAL`, and\n   suppresses construction-time stdout/stderr (asserted
          via `capsys`).\n   `create_netbox_semaphore` falls back to\n   `settings.NETBOX_MAX_CONNECTIONS`
          or takes an explicit value, builds\n   a per-URL md5-derived key with `timeout=30`
          and the shared redis\n   client, and produces a stable key per URL.\n3.
          **Add task-lock helper unit tests** \u2014 `set_task_lock`,\n   `remove_task_lock`,
          `is_task_locked` and `check_task_lock_and_exit`,\n   including the operator-user/reason
          fallbacks, the JSON payload shape\n   (regex-matched ISO timestamp), the
          `.decode(\"utf-8\")` path, and the\n   error-logging branches. `builtins.exit`
          and `is_task_locked` are\n   patched for `check_task_lock_and_exit`.\n\n##
          Notes for the reviewer\n\n- `pottery.Redlock` is patched on the `pottery`
          module (not imported\n  into `osism.utils`) because production imports it
          lazily inside\n  `create_redlock` \u2014 matching the issue's mocking hint.\n-
          `logging.getLogger` is patched in the `create_redlock` tests so they\n  never
          mutate the process-global `pottery` logger level (test\n  isolation), addressing
          the issue's note about that mutable state.\n- `freezegun` is not a dev dependency,
          so the `set_task_lock` timestamp\n  is matched with a regex (`^\\d{4}-\\d{2}-\\d{2}T...`)
          rather than frozen,\n  as the issue allows.\n\n## Local verification\n\nPer
          repository practice the test suite, `flake8`, `mypy` and\n`python-black`
          run only in the pipenv venv / Zuul CI (the dev tools and\n`pottery` are
          not installed in the base interpreter), so they were not\nrun locally. `python
          -m py_compile` passes. The Zuul\n`python-osism-unit-tests` job will run
          the suite. The tests exercise\nevery branch of the targeted helpers, satisfying
          the \u226590 % coverage\ncriterion for them.\n\nCloses #2230\n\nAssisted-by:
          Claude:claude-opus-4-8"
        change_url: https://github.com/osism/python-osism/pull/2349
        commit_id: cf3512791f66d3dcca97f9d716ab9baf268891bd
        patchset: cf3512791f66d3dcca97f9d716ab9baf268891bd
        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-black
      jobtags: []
      max_attempts: 3
      message: QWRkIHVuaXQgdGVzdHMgZm9yIG9zaXNtL3V0aWxzIHNlbWFwaG9yZSwgcmVkbG9jayBhbmQgdGFzayBsb2NrcwoKSW1wbGVtZW50cyAjMjIzMC4KCkFkZHMgYHRlc3RzL3VuaXQvdXRpbHMvdGVzdF9pbml0X2xvY2tzLnB5YCwgdGhlIHRoaXJkIGNvbXBhbmlvbiB0bwpgdGVzdF9pbml0X2Nvbm5lY3Rpb25zLnB5YCBhbmQgYHRlc3RfaW5pdF90YXNrX291dHB1dC5weWAsIGNvdmVyaW5nIHRoZQpjb25jdXJyZW5jeSBwcmltaXRpdmVzIGFuZCBnbG9iYWwgdGFzay1sb2NrIGhlbHBlcnMgaW4KYG9zaXNtL3V0aWxzL19faW5pdF9fLnB5YC4gTm8gcHJvZHVjdGlvbiBjb2RlIGlzIGNoYW5nZWQg4oCUIHRoaXMgaXMgYQpwdXJlIHRlc3QgYWRkaXRpb24uIDQwIHRlc3QgZnVuY3Rpb25zICg0MSBjYXNlcykgZm9sbG93aW5nIHRoZQplc3RhYmxpc2hlZCBgbW9ja2VyYCAvIGBsb2d1cnVfbG9nc2AgY29udmVudGlvbnMgb2YgdGhlIGV4aXN0aW5nIHN1aXRlLgoKIyMgQ2hhbmdlIHNldCAoY29tbWl0IG9yZGVyKQoKMS4gKipBZGQgUmVkaXNTZW1hcGhvcmUgdW5pdCB0ZXN0cyoqIOKAlCBgX19pbml0X19gIGF0dHJpYnV0ZSBzdG9yYWdlIGFuZAogICB0aGUgdW5jb25kaXRpb25hbCBgc2VtYXBob3JlOmAga2V5IHByZWZpeCAoaW5jbHVkaW5nIHRoZQogICBhbHJlYWR5LXByZWZpeGVkIGlucHV0IOKGkiBkb3VibGUgcHJlZml4KTsgYGFjcXVpcmUoKWAgZmlyc3QtdHJ5CiAgIHN1Y2Nlc3MsIGZ1bGwtd2luZG93IHRpbWVvdXQgcmV0dXJuaW5nIGBGYWxzZWAsIHBlci1pdGVyYXRpb24KICAgYHpyZW1yYW5nZWJ5c2NvcmVgIGNsZWFudXAsIHRoZSBkZWZhdWx0LTEwcyBhbmQgZXhwbGljaXQtdGltZW91dAogICBmYWxsYmFja3MsIGFuZCBhIGZyZXNoIGB1dWlkLnV1aWQ0KClgIHBlciBjYWxsOyBgcmVsZWFzZSgpYAogICBpZGVtcG90ZW5jeTsgYW5kIHRoZSBgX19lbnRlcl9fYC9gX19leGl0X19gIGNvbnRleHQtbWFuYWdlciBwcm90b2NvbAogICAocmV0dXJucyBgc2VsZmAsIHJhaXNlcyBgVGltZW91dEVycm9yYCBjb250YWluaW5nIHRoZSBrZXksIGFsd2F5cwogICByZWxlYXNlcywgbmV2ZXIgc3dhbGxvd3MgZXhjZXB0aW9ucykuIGB0aW1lLnRpbWVgL2B0aW1lLnNsZWVwYC8KICAgYHV1aWQudXVpZDRgIGFyZSBwYXRjaGVkIHNvIHRoZSBhY3F1aXNpdGlvbiBsb29wIGlzIGRldGVybWluaXN0aWMuCjIuICoqQWRkIGNyZWF0ZV9yZWRsb2NrIGFuZCBjcmVhdGVfbmV0Ym94X3NlbWFwaG9yZSB1bml0IHRlc3RzKiog4oCUCiAgIGBjcmVhdGVfcmVkbG9ja2AgcmV0dXJucyB0aGUgYHBvdHRlcnkuUmVkbG9ja2AgYnVpbHQgd2l0aAogICBga2V5YC9gbWFzdGVycz17cmVkaXN9YC9gYXV0b19yZWxlYXNlX3RpbWVgIChkZWZhdWx0IGAzNjAwYCBhbmQgYQogICBjdXN0b20gdmFsdWUpLCBmb3JjZXMgdGhlIGAicG90dGVyeSJgIGxvZ2dlciB0byBgQ1JJVElDQUxgLCBhbmQKICAgc3VwcHJlc3NlcyBjb25zdHJ1Y3Rpb24tdGltZSBzdGRvdXQvc3RkZXJyIChhc3NlcnRlZCB2aWEgYGNhcHN5c2ApLgogICBgY3JlYXRlX25ldGJveF9zZW1hcGhvcmVgIGZhbGxzIGJhY2sgdG8KICAgYHNldHRpbmdzLk5FVEJPWF9NQVhfQ09OTkVDVElPTlNgIG9yIHRha2VzIGFuIGV4cGxpY2l0IHZhbHVlLCBidWlsZHMKICAgYSBwZXItVVJMIG1kNS1kZXJpdmVkIGtleSB3aXRoIGB0aW1lb3V0PTMwYCBhbmQgdGhlIHNoYXJlZCByZWRpcwogICBjbGllbnQsIGFuZCBwcm9kdWNlcyBhIHN0YWJsZSBrZXkgcGVyIFVSTC4KMy4gKipBZGQgdGFzay1sb2NrIGhlbHBlciB1bml0IHRlc3RzKiog4oCUIGBzZXRfdGFza19sb2NrYCwKICAgYHJlbW92ZV90YXNrX2xvY2tgLCBgaXNfdGFza19sb2NrZWRgIGFuZCBgY2hlY2tfdGFza19sb2NrX2FuZF9leGl0YCwKICAgaW5jbHVkaW5nIHRoZSBvcGVyYXRvci11c2VyL3JlYXNvbiBmYWxsYmFja3MsIHRoZSBKU09OIHBheWxvYWQgc2hhcGUKICAgKHJlZ2V4LW1hdGNoZWQgSVNPIHRpbWVzdGFtcCksIHRoZSBgLmRlY29kZSgidXRmLTgiKWAgcGF0aCwgYW5kIHRoZQogICBlcnJvci1sb2dnaW5nIGJyYW5jaGVzLiBgYnVpbHRpbnMuZXhpdGAgYW5kIGBpc190YXNrX2xvY2tlZGAgYXJlCiAgIHBhdGNoZWQgZm9yIGBjaGVja190YXNrX2xvY2tfYW5kX2V4aXRgLgoKIyMgTm90ZXMgZm9yIHRoZSByZXZpZXdlcgoKLSBgcG90dGVyeS5SZWRsb2NrYCBpcyBwYXRjaGVkIG9uIHRoZSBgcG90dGVyeWAgbW9kdWxlIChub3QgaW1wb3J0ZWQKICBpbnRvIGBvc2lzbS51dGlsc2ApIGJlY2F1c2UgcHJvZHVjdGlvbiBpbXBvcnRzIGl0IGxhemlseSBpbnNpZGUKICBgY3JlYXRlX3JlZGxvY2tgIOKAlCBtYXRjaGluZyB0aGUgaXNzdWUncyBtb2NraW5nIGhpbnQuCi0gYGxvZ2dpbmcuZ2V0TG9nZ2VyYCBpcyBwYXRjaGVkIGluIHRoZSBgY3JlYXRlX3JlZGxvY2tgIHRlc3RzIHNvIHRoZXkKICBuZXZlciBtdXRhdGUgdGhlIHByb2Nlc3MtZ2xvYmFsIGBwb3R0ZXJ5YCBsb2dnZXIgbGV2ZWwgKHRlc3QKICBpc29sYXRpb24pLCBhZGRyZXNzaW5nIHRoZSBpc3N1ZSdzIG5vdGUgYWJvdXQgdGhhdCBtdXRhYmxlIHN0YXRlLgotIGBmcmVlemVndW5gIGlzIG5vdCBhIGRldiBkZXBlbmRlbmN5LCBzbyB0aGUgYHNldF90YXNrX2xvY2tgIHRpbWVzdGFtcAogIGlzIG1hdGNoZWQgd2l0aCBhIHJlZ2V4IChgXlxkezR9LVxkezJ9LVxkezJ9VC4uLmApIHJhdGhlciB0aGFuIGZyb3plbiwKICBhcyB0aGUgaXNzdWUgYWxsb3dzLgoKIyMgTG9jYWwgdmVyaWZpY2F0aW9uCgpQZXIgcmVwb3NpdG9yeSBwcmFjdGljZSB0aGUgdGVzdCBzdWl0ZSwgYGZsYWtlOGAsIGBteXB5YCBhbmQKYHB5dGhvbi1ibGFja2AgcnVuIG9ubHkgaW4gdGhlIHBpcGVudiB2ZW52IC8gWnV1bCBDSSAodGhlIGRldiB0b29scyBhbmQKYHBvdHRlcnlgIGFyZSBub3QgaW5zdGFsbGVkIGluIHRoZSBiYXNlIGludGVycHJldGVyKSwgc28gdGhleSB3ZXJlIG5vdApydW4gbG9jYWxseS4gYHB5dGhvbiAtbSBweV9jb21waWxlYCBwYXNzZXMuIFRoZSBadXVsCmBweXRob24tb3Npc20tdW5pdC10ZXN0c2Agam9iIHdpbGwgcnVuIHRoZSBzdWl0ZS4gVGhlIHRlc3RzIGV4ZXJjaXNlCmV2ZXJ5IGJyYW5jaCBvZiB0aGUgdGFyZ2V0ZWQgaGVscGVycywgc2F0aXNmeWluZyB0aGUg4omlOTAgJSBjb3ZlcmFnZQpjcml0ZXJpb24gZm9yIHRoZW0uCgpDbG9zZXMgIzIyMzAKCkFzc2lzdGVkLWJ5OiBDbGF1ZGU6Y2xhdWRlLW9wdXMtNC04
      patchset: cf3512791f66d3dcca97f9d716ab9baf268891bd
      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/python-black/run.yml
          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: ed923c336f11f05dac616bf1a78b73838bb7dca9
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2349/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
