all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe5c:66d5
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: e702cd17-fb0b-452b-a000-fae6a845b290
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe5c:66d5
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.221
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.9
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe5c:66d5
        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-unit-tests explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#133>'
      - '<Job python-osism-unit-tests explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 655e4c8e936541daa8702aa6e621e8cc
      build_refs:
      - branch: main
        change: '2332'
        change_message: "Fix silent reconciler skips on lock contention\n\n## Summary\n\n`osism
          sync inventory` dispatches an explicit `reconciler.run` task and waits\non
          that task's Redis output stream. Two paths left the waiting client with
          no\noutcome, so the CLI blocked until its own output-inactivity timeout
          before\nfailing. This PR makes both paths **fail fast** with a terminal
          marker and a\nnon-zero result, and clarifies the `--task-timeout` help text.\n\n##
          Problem\n\n`reconciler.run` attempted to acquire its execution lock for
          20 seconds. If the\nlock stayed held, the task skipped its whole body, published
          no terminal\nmarker, returned `None`, and was recorded by Celery as successful.
          The waiting\nCLI could not distinguish that silent skip from a still-running
          task, so it\nstayed blocked until its configured task-output timeout.\n\nSeparately,
          when tasks were administratively locked,\n`check_task_lock_and_exit()` called
          `exit(1)`; the resulting `SystemExit`\npropagated out of the Celery task,
          churned the prefork worker, and again left\nthe waiting client with no terminal
          marker.\n\nThis surfaced during a deploy when a burst of reconciler tasks
          contended on the\nlock: tasks skipped silently after ~20 seconds while a
          CLI waiting with a long\n`--task-timeout` blocked for the full timeout before
          aborting.\n\n## Changes\n\n- Catch the `SystemExit` raised under an administrative
          lock, publish a\n  terminal marker, and return a non-zero result instead
          of letting it propagate\n  and churn the prefork worker.\n- On execution-lock
          contention, fail fast with a terminal marker and a non-zero\n  result instead
          of silently returning `None` and blocking the waiting client.\n- Do **not**
          retry on contention: a retry could acquire a lease the in-flight\n  run
          let expire and start a second concurrent `/run.sh` against shared\n  inventory
          state.\n- When no client is waiting (`publish=False`), log the failure instead
          of\n  streaming it.\n- Leave the periodic `run_on_change` path unchanged;
          it keeps coalescing on\n  contention.\n- Clarify the `--task-timeout` help
          text: it is an output-inactivity timeout,\n  and time a task spends queued
          (emitting no output) counts against it in full.\n\n## Tradeoffs and scope
          limits\n\n- Terminal-marker publication is best-effort; if Redis is unavailable
          no marker\n  is published. This fix narrows the no-outcome surface, it does
          not close it.\n- Fire-and-forget callers (NetBox webhook, watchdog) run
          with `publish=True`,\n  so they now push the failure marker to an output
          stream nobody reads and that\n  has no TTL \u2014 marginal waste on paths
          that previously skipped silently.\n- The admin-lock path now records the
          Celery task as `SUCCESS` with result `1`\n  where the propagating `SystemExit`
          previously recorded `FAILURE`. Nothing\n  in-repo consumes the `AsyncResult`,
          so this only affects external\n  observability (e.g. flower).\n- Scope is
          reconciler-only; other task sites keep the same `SystemExit` churn.\n- The
          concurrency question is deliberately left open: whether two `/run.sh` can\n
          \ run concurrently in one container after the 60s lease expires is not\n
          \ addressed here. An earlier commit defaulting the worker to concurrency
          1 was\n  dropped \u2014 its rationale misdescribed the locking and it reintroduced
          a\n  silent-queueing UX. A proper fix would pair a structural lock with
          burst\n  coalescing or dispatch expiry.\n\n## Testing\n\n- `run` fails fast
          on contention with a terminal marker, and logs + returns\n  non-zero on
          contention without a waiting client.\n- `run` converts the admin-lock `SystemExit`
          into a terminal marker, and\n  returns non-zero quietly when no client is
          waiting.\n- `run` publishes success and releases the lock on the happy path
          (with and\n  without publishing).\n- `run_on_change` still runs and releases
          when it acquires the lock, and skips\n  silently when contended.\n- The
          `--task-timeout` help text describes an output-inactivity timeout.\n- Full
          test suite, Black, and flake8 pass.\n"
        change_url: https://github.com/osism/python-osism/pull/2332
        commit_id: b3e5a5afdc48d900ab56d851170f7461e69bfc54
        patchset: b3e5a5afdc48d900ab56d851170f7461e69bfc54
        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: 7fb679b034db40008f5e2a1f201a4436
      buildset_refs:
      - branch: main
        change: '2332'
        change_message: "Fix silent reconciler skips on lock contention\n\n## Summary\n\n`osism
          sync inventory` dispatches an explicit `reconciler.run` task and waits\non
          that task's Redis output stream. Two paths left the waiting client with
          no\noutcome, so the CLI blocked until its own output-inactivity timeout
          before\nfailing. This PR makes both paths **fail fast** with a terminal
          marker and a\nnon-zero result, and clarifies the `--task-timeout` help text.\n\n##
          Problem\n\n`reconciler.run` attempted to acquire its execution lock for
          20 seconds. If the\nlock stayed held, the task skipped its whole body, published
          no terminal\nmarker, returned `None`, and was recorded by Celery as successful.
          The waiting\nCLI could not distinguish that silent skip from a still-running
          task, so it\nstayed blocked until its configured task-output timeout.\n\nSeparately,
          when tasks were administratively locked,\n`check_task_lock_and_exit()` called
          `exit(1)`; the resulting `SystemExit`\npropagated out of the Celery task,
          churned the prefork worker, and again left\nthe waiting client with no terminal
          marker.\n\nThis surfaced during a deploy when a burst of reconciler tasks
          contended on the\nlock: tasks skipped silently after ~20 seconds while a
          CLI waiting with a long\n`--task-timeout` blocked for the full timeout before
          aborting.\n\n## Changes\n\n- Catch the `SystemExit` raised under an administrative
          lock, publish a\n  terminal marker, and return a non-zero result instead
          of letting it propagate\n  and churn the prefork worker.\n- On execution-lock
          contention, fail fast with a terminal marker and a non-zero\n  result instead
          of silently returning `None` and blocking the waiting client.\n- Do **not**
          retry on contention: a retry could acquire a lease the in-flight\n  run
          let expire and start a second concurrent `/run.sh` against shared\n  inventory
          state.\n- When no client is waiting (`publish=False`), log the failure instead
          of\n  streaming it.\n- Leave the periodic `run_on_change` path unchanged;
          it keeps coalescing on\n  contention.\n- Clarify the `--task-timeout` help
          text: it is an output-inactivity timeout,\n  and time a task spends queued
          (emitting no output) counts against it in full.\n\n## Tradeoffs and scope
          limits\n\n- Terminal-marker publication is best-effort; if Redis is unavailable
          no marker\n  is published. This fix narrows the no-outcome surface, it does
          not close it.\n- Fire-and-forget callers (NetBox webhook, watchdog) run
          with `publish=True`,\n  so they now push the failure marker to an output
          stream nobody reads and that\n  has no TTL \u2014 marginal waste on paths
          that previously skipped silently.\n- The admin-lock path now records the
          Celery task as `SUCCESS` with result `1`\n  where the propagating `SystemExit`
          previously recorded `FAILURE`. Nothing\n  in-repo consumes the `AsyncResult`,
          so this only affects external\n  observability (e.g. flower).\n- Scope is
          reconciler-only; other task sites keep the same `SystemExit` churn.\n- The
          concurrency question is deliberately left open: whether two `/run.sh` can\n
          \ run concurrently in one container after the 60s lease expires is not\n
          \ addressed here. An earlier commit defaulting the worker to concurrency
          1 was\n  dropped \u2014 its rationale misdescribed the locking and it reintroduced
          a\n  silent-queueing UX. A proper fix would pair a structural lock with
          burst\n  coalescing or dispatch expiry.\n\n## Testing\n\n- `run` fails fast
          on contention with a terminal marker, and logs + returns\n  non-zero on
          contention without a waiting client.\n- `run` converts the admin-lock `SystemExit`
          into a terminal marker, and\n  returns non-zero quietly when no client is
          waiting.\n- `run` publishes success and releases the lock on the happy path
          (with and\n  without publishing).\n- `run_on_change` still runs and releases
          when it acquires the lock, and skips\n  silently when contended.\n- The
          `--task-timeout` help text describes an output-inactivity timeout.\n- Full
          test suite, Black, and flake8 pass.\n"
        change_url: https://github.com/osism/python-osism/pull/2332
        commit_id: b3e5a5afdc48d900ab56d851170f7461e69bfc54
        patchset: b3e5a5afdc48d900ab56d851170f7461e69bfc54
        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: '2332'
      change_message: "Fix silent reconciler skips on lock contention\n\n## Summary\n\n`osism
        sync inventory` dispatches an explicit `reconciler.run` task and waits\non
        that task's Redis output stream. Two paths left the waiting client with no\noutcome,
        so the CLI blocked until its own output-inactivity timeout before\nfailing.
        This PR makes both paths **fail fast** with a terminal marker and a\nnon-zero
        result, and clarifies the `--task-timeout` help text.\n\n## Problem\n\n`reconciler.run`
        attempted to acquire its execution lock for 20 seconds. If the\nlock stayed
        held, the task skipped its whole body, published no terminal\nmarker, returned
        `None`, and was recorded by Celery as successful. The waiting\nCLI could not
        distinguish that silent skip from a still-running task, so it\nstayed blocked
        until its configured task-output timeout.\n\nSeparately, when tasks were administratively
        locked,\n`check_task_lock_and_exit()` called `exit(1)`; the resulting `SystemExit`\npropagated
        out of the Celery task, churned the prefork worker, and again left\nthe waiting
        client with no terminal marker.\n\nThis surfaced during a deploy when a burst
        of reconciler tasks contended on the\nlock: tasks skipped silently after ~20
        seconds while a CLI waiting with a long\n`--task-timeout` blocked for the
        full timeout before aborting.\n\n## Changes\n\n- Catch the `SystemExit` raised
        under an administrative lock, publish a\n  terminal marker, and return a non-zero
        result instead of letting it propagate\n  and churn the prefork worker.\n-
        On execution-lock contention, fail fast with a terminal marker and a non-zero\n
        \ result instead of silently returning `None` and blocking the waiting client.\n-
        Do **not** retry on contention: a retry could acquire a lease the in-flight\n
        \ run let expire and start a second concurrent `/run.sh` against shared\n
        \ inventory state.\n- When no client is waiting (`publish=False`), log the
        failure instead of\n  streaming it.\n- Leave the periodic `run_on_change`
        path unchanged; it keeps coalescing on\n  contention.\n- Clarify the `--task-timeout`
        help text: it is an output-inactivity timeout,\n  and time a task spends queued
        (emitting no output) counts against it in full.\n\n## Tradeoffs and scope
        limits\n\n- Terminal-marker publication is best-effort; if Redis is unavailable
        no marker\n  is published. This fix narrows the no-outcome surface, it does
        not close it.\n- Fire-and-forget callers (NetBox webhook, watchdog) run with
        `publish=True`,\n  so they now push the failure marker to an output stream
        nobody reads and that\n  has no TTL \u2014 marginal waste on paths that previously
        skipped silently.\n- The admin-lock path now records the Celery task as `SUCCESS`
        with result `1`\n  where the propagating `SystemExit` previously recorded
        `FAILURE`. Nothing\n  in-repo consumes the `AsyncResult`, so this only affects
        external\n  observability (e.g. flower).\n- Scope is reconciler-only; other
        task sites keep the same `SystemExit` churn.\n- The concurrency question is
        deliberately left open: whether two `/run.sh` can\n  run concurrently in one
        container after the 60s lease expires is not\n  addressed here. An earlier
        commit defaulting the worker to concurrency 1 was\n  dropped \u2014 its rationale
        misdescribed the locking and it reintroduced a\n  silent-queueing UX. A proper
        fix would pair a structural lock with burst\n  coalescing or dispatch expiry.\n\n##
        Testing\n\n- `run` fails fast on contention with a terminal marker, and logs
        + returns\n  non-zero on contention without a waiting client.\n- `run` converts
        the admin-lock `SystemExit` into a terminal marker, and\n  returns non-zero
        quietly when no client is waiting.\n- `run` publishes success and releases
        the lock on the happy path (with and\n  without publishing).\n- `run_on_change`
        still runs and releases when it acquires the lock, and skips\n  silently when
        contended.\n- The `--task-timeout` help text describes an output-inactivity
        timeout.\n- Full test suite, Black, and flake8 pass.\n"
      change_url: https://github.com/osism/python-osism/pull/2332
      child_jobs: []
      commit_id: b3e5a5afdc48d900ab56d851170f7461e69bfc54
      event_id: 21f5a880-81b4-11f1-9e6b-a952fba234db
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/655e4c8e936541daa8702aa6e621e8cc/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/655e4c8e936541daa8702aa6e621e8cc/work/logs
        result_data_file: /var/lib/zuul/builds/655e4c8e936541daa8702aa6e621e8cc/work/results.json
        src_root: /var/lib/zuul/builds/655e4c8e936541daa8702aa6e621e8cc/work/src
        work_root: /var/lib/zuul/builds/655e4c8e936541daa8702aa6e621e8cc/work
      include_vars: []
      items:
      - branch: main
        change: '2332'
        change_message: "Fix silent reconciler skips on lock contention\n\n## Summary\n\n`osism
          sync inventory` dispatches an explicit `reconciler.run` task and waits\non
          that task's Redis output stream. Two paths left the waiting client with
          no\noutcome, so the CLI blocked until its own output-inactivity timeout
          before\nfailing. This PR makes both paths **fail fast** with a terminal
          marker and a\nnon-zero result, and clarifies the `--task-timeout` help text.\n\n##
          Problem\n\n`reconciler.run` attempted to acquire its execution lock for
          20 seconds. If the\nlock stayed held, the task skipped its whole body, published
          no terminal\nmarker, returned `None`, and was recorded by Celery as successful.
          The waiting\nCLI could not distinguish that silent skip from a still-running
          task, so it\nstayed blocked until its configured task-output timeout.\n\nSeparately,
          when tasks were administratively locked,\n`check_task_lock_and_exit()` called
          `exit(1)`; the resulting `SystemExit`\npropagated out of the Celery task,
          churned the prefork worker, and again left\nthe waiting client with no terminal
          marker.\n\nThis surfaced during a deploy when a burst of reconciler tasks
          contended on the\nlock: tasks skipped silently after ~20 seconds while a
          CLI waiting with a long\n`--task-timeout` blocked for the full timeout before
          aborting.\n\n## Changes\n\n- Catch the `SystemExit` raised under an administrative
          lock, publish a\n  terminal marker, and return a non-zero result instead
          of letting it propagate\n  and churn the prefork worker.\n- On execution-lock
          contention, fail fast with a terminal marker and a non-zero\n  result instead
          of silently returning `None` and blocking the waiting client.\n- Do **not**
          retry on contention: a retry could acquire a lease the in-flight\n  run
          let expire and start a second concurrent `/run.sh` against shared\n  inventory
          state.\n- When no client is waiting (`publish=False`), log the failure instead
          of\n  streaming it.\n- Leave the periodic `run_on_change` path unchanged;
          it keeps coalescing on\n  contention.\n- Clarify the `--task-timeout` help
          text: it is an output-inactivity timeout,\n  and time a task spends queued
          (emitting no output) counts against it in full.\n\n## Tradeoffs and scope
          limits\n\n- Terminal-marker publication is best-effort; if Redis is unavailable
          no marker\n  is published. This fix narrows the no-outcome surface, it does
          not close it.\n- Fire-and-forget callers (NetBox webhook, watchdog) run
          with `publish=True`,\n  so they now push the failure marker to an output
          stream nobody reads and that\n  has no TTL \u2014 marginal waste on paths
          that previously skipped silently.\n- The admin-lock path now records the
          Celery task as `SUCCESS` with result `1`\n  where the propagating `SystemExit`
          previously recorded `FAILURE`. Nothing\n  in-repo consumes the `AsyncResult`,
          so this only affects external\n  observability (e.g. flower).\n- Scope is
          reconciler-only; other task sites keep the same `SystemExit` churn.\n- The
          concurrency question is deliberately left open: whether two `/run.sh` can\n
          \ run concurrently in one container after the 60s lease expires is not\n
          \ addressed here. An earlier commit defaulting the worker to concurrency
          1 was\n  dropped \u2014 its rationale misdescribed the locking and it reintroduced
          a\n  silent-queueing UX. A proper fix would pair a structural lock with
          burst\n  coalescing or dispatch expiry.\n\n## Testing\n\n- `run` fails fast
          on contention with a terminal marker, and logs + returns\n  non-zero on
          contention without a waiting client.\n- `run` converts the admin-lock `SystemExit`
          into a terminal marker, and\n  returns non-zero quietly when no client is
          waiting.\n- `run` publishes success and releases the lock on the happy path
          (with and\n  without publishing).\n- `run_on_change` still runs and releases
          when it acquires the lock, and skips\n  silently when contended.\n- The
          `--task-timeout` help text describes an output-inactivity timeout.\n- Full
          test suite, Black, and flake8 pass.\n"
        change_url: https://github.com/osism/python-osism/pull/2332
        commit_id: b3e5a5afdc48d900ab56d851170f7461e69bfc54
        patchset: b3e5a5afdc48d900ab56d851170f7461e69bfc54
        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-unit-tests
      jobtags: []
      max_attempts: 3
      message: Rml4IHNpbGVudCByZWNvbmNpbGVyIHNraXBzIG9uIGxvY2sgY29udGVudGlvbgoKIyMgU3VtbWFyeQoKYG9zaXNtIHN5bmMgaW52ZW50b3J5YCBkaXNwYXRjaGVzIGFuIGV4cGxpY2l0IGByZWNvbmNpbGVyLnJ1bmAgdGFzayBhbmQgd2FpdHMKb24gdGhhdCB0YXNrJ3MgUmVkaXMgb3V0cHV0IHN0cmVhbS4gVHdvIHBhdGhzIGxlZnQgdGhlIHdhaXRpbmcgY2xpZW50IHdpdGggbm8Kb3V0Y29tZSwgc28gdGhlIENMSSBibG9ja2VkIHVudGlsIGl0cyBvd24gb3V0cHV0LWluYWN0aXZpdHkgdGltZW91dCBiZWZvcmUKZmFpbGluZy4gVGhpcyBQUiBtYWtlcyBib3RoIHBhdGhzICoqZmFpbCBmYXN0Kiogd2l0aCBhIHRlcm1pbmFsIG1hcmtlciBhbmQgYQpub24temVybyByZXN1bHQsIGFuZCBjbGFyaWZpZXMgdGhlIGAtLXRhc2stdGltZW91dGAgaGVscCB0ZXh0LgoKIyMgUHJvYmxlbQoKYHJlY29uY2lsZXIucnVuYCBhdHRlbXB0ZWQgdG8gYWNxdWlyZSBpdHMgZXhlY3V0aW9uIGxvY2sgZm9yIDIwIHNlY29uZHMuIElmIHRoZQpsb2NrIHN0YXllZCBoZWxkLCB0aGUgdGFzayBza2lwcGVkIGl0cyB3aG9sZSBib2R5LCBwdWJsaXNoZWQgbm8gdGVybWluYWwKbWFya2VyLCByZXR1cm5lZCBgTm9uZWAsIGFuZCB3YXMgcmVjb3JkZWQgYnkgQ2VsZXJ5IGFzIHN1Y2Nlc3NmdWwuIFRoZSB3YWl0aW5nCkNMSSBjb3VsZCBub3QgZGlzdGluZ3Vpc2ggdGhhdCBzaWxlbnQgc2tpcCBmcm9tIGEgc3RpbGwtcnVubmluZyB0YXNrLCBzbyBpdApzdGF5ZWQgYmxvY2tlZCB1bnRpbCBpdHMgY29uZmlndXJlZCB0YXNrLW91dHB1dCB0aW1lb3V0LgoKU2VwYXJhdGVseSwgd2hlbiB0YXNrcyB3ZXJlIGFkbWluaXN0cmF0aXZlbHkgbG9ja2VkLApgY2hlY2tfdGFza19sb2NrX2FuZF9leGl0KClgIGNhbGxlZCBgZXhpdCgxKWA7IHRoZSByZXN1bHRpbmcgYFN5c3RlbUV4aXRgCnByb3BhZ2F0ZWQgb3V0IG9mIHRoZSBDZWxlcnkgdGFzaywgY2h1cm5lZCB0aGUgcHJlZm9yayB3b3JrZXIsIGFuZCBhZ2FpbiBsZWZ0CnRoZSB3YWl0aW5nIGNsaWVudCB3aXRoIG5vIHRlcm1pbmFsIG1hcmtlci4KClRoaXMgc3VyZmFjZWQgZHVyaW5nIGEgZGVwbG95IHdoZW4gYSBidXJzdCBvZiByZWNvbmNpbGVyIHRhc2tzIGNvbnRlbmRlZCBvbiB0aGUKbG9jazogdGFza3Mgc2tpcHBlZCBzaWxlbnRseSBhZnRlciB+MjAgc2Vjb25kcyB3aGlsZSBhIENMSSB3YWl0aW5nIHdpdGggYSBsb25nCmAtLXRhc2stdGltZW91dGAgYmxvY2tlZCBmb3IgdGhlIGZ1bGwgdGltZW91dCBiZWZvcmUgYWJvcnRpbmcuCgojIyBDaGFuZ2VzCgotIENhdGNoIHRoZSBgU3lzdGVtRXhpdGAgcmFpc2VkIHVuZGVyIGFuIGFkbWluaXN0cmF0aXZlIGxvY2ssIHB1Ymxpc2ggYQogIHRlcm1pbmFsIG1hcmtlciwgYW5kIHJldHVybiBhIG5vbi16ZXJvIHJlc3VsdCBpbnN0ZWFkIG9mIGxldHRpbmcgaXQgcHJvcGFnYXRlCiAgYW5kIGNodXJuIHRoZSBwcmVmb3JrIHdvcmtlci4KLSBPbiBleGVjdXRpb24tbG9jayBjb250ZW50aW9uLCBmYWlsIGZhc3Qgd2l0aCBhIHRlcm1pbmFsIG1hcmtlciBhbmQgYSBub24temVybwogIHJlc3VsdCBpbnN0ZWFkIG9mIHNpbGVudGx5IHJldHVybmluZyBgTm9uZWAgYW5kIGJsb2NraW5nIHRoZSB3YWl0aW5nIGNsaWVudC4KLSBEbyAqKm5vdCoqIHJldHJ5IG9uIGNvbnRlbnRpb246IGEgcmV0cnkgY291bGQgYWNxdWlyZSBhIGxlYXNlIHRoZSBpbi1mbGlnaHQKICBydW4gbGV0IGV4cGlyZSBhbmQgc3RhcnQgYSBzZWNvbmQgY29uY3VycmVudCBgL3J1bi5zaGAgYWdhaW5zdCBzaGFyZWQKICBpbnZlbnRvcnkgc3RhdGUuCi0gV2hlbiBubyBjbGllbnQgaXMgd2FpdGluZyAoYHB1Ymxpc2g9RmFsc2VgKSwgbG9nIHRoZSBmYWlsdXJlIGluc3RlYWQgb2YKICBzdHJlYW1pbmcgaXQuCi0gTGVhdmUgdGhlIHBlcmlvZGljIGBydW5fb25fY2hhbmdlYCBwYXRoIHVuY2hhbmdlZDsgaXQga2VlcHMgY29hbGVzY2luZyBvbgogIGNvbnRlbnRpb24uCi0gQ2xhcmlmeSB0aGUgYC0tdGFzay10aW1lb3V0YCBoZWxwIHRleHQ6IGl0IGlzIGFuIG91dHB1dC1pbmFjdGl2aXR5IHRpbWVvdXQsCiAgYW5kIHRpbWUgYSB0YXNrIHNwZW5kcyBxdWV1ZWQgKGVtaXR0aW5nIG5vIG91dHB1dCkgY291bnRzIGFnYWluc3QgaXQgaW4gZnVsbC4KCiMjIFRyYWRlb2ZmcyBhbmQgc2NvcGUgbGltaXRzCgotIFRlcm1pbmFsLW1hcmtlciBwdWJsaWNhdGlvbiBpcyBiZXN0LWVmZm9ydDsgaWYgUmVkaXMgaXMgdW5hdmFpbGFibGUgbm8gbWFya2VyCiAgaXMgcHVibGlzaGVkLiBUaGlzIGZpeCBuYXJyb3dzIHRoZSBuby1vdXRjb21lIHN1cmZhY2UsIGl0IGRvZXMgbm90IGNsb3NlIGl0LgotIEZpcmUtYW5kLWZvcmdldCBjYWxsZXJzIChOZXRCb3ggd2ViaG9vaywgd2F0Y2hkb2cpIHJ1biB3aXRoIGBwdWJsaXNoPVRydWVgLAogIHNvIHRoZXkgbm93IHB1c2ggdGhlIGZhaWx1cmUgbWFya2VyIHRvIGFuIG91dHB1dCBzdHJlYW0gbm9ib2R5IHJlYWRzIGFuZCB0aGF0CiAgaGFzIG5vIFRUTCDigJQgbWFyZ2luYWwgd2FzdGUgb24gcGF0aHMgdGhhdCBwcmV2aW91c2x5IHNraXBwZWQgc2lsZW50bHkuCi0gVGhlIGFkbWluLWxvY2sgcGF0aCBub3cgcmVjb3JkcyB0aGUgQ2VsZXJ5IHRhc2sgYXMgYFNVQ0NFU1NgIHdpdGggcmVzdWx0IGAxYAogIHdoZXJlIHRoZSBwcm9wYWdhdGluZyBgU3lzdGVtRXhpdGAgcHJldmlvdXNseSByZWNvcmRlZCBgRkFJTFVSRWAuIE5vdGhpbmcKICBpbi1yZXBvIGNvbnN1bWVzIHRoZSBgQXN5bmNSZXN1bHRgLCBzbyB0aGlzIG9ubHkgYWZmZWN0cyBleHRlcm5hbAogIG9ic2VydmFiaWxpdHkgKGUuZy4gZmxvd2VyKS4KLSBTY29wZSBpcyByZWNvbmNpbGVyLW9ubHk7IG90aGVyIHRhc2sgc2l0ZXMga2VlcCB0aGUgc2FtZSBgU3lzdGVtRXhpdGAgY2h1cm4uCi0gVGhlIGNvbmN1cnJlbmN5IHF1ZXN0aW9uIGlzIGRlbGliZXJhdGVseSBsZWZ0IG9wZW46IHdoZXRoZXIgdHdvIGAvcnVuLnNoYCBjYW4KICBydW4gY29uY3VycmVudGx5IGluIG9uZSBjb250YWluZXIgYWZ0ZXIgdGhlIDYwcyBsZWFzZSBleHBpcmVzIGlzIG5vdAogIGFkZHJlc3NlZCBoZXJlLiBBbiBlYXJsaWVyIGNvbW1pdCBkZWZhdWx0aW5nIHRoZSB3b3JrZXIgdG8gY29uY3VycmVuY3kgMSB3YXMKICBkcm9wcGVkIOKAlCBpdHMgcmF0aW9uYWxlIG1pc2Rlc2NyaWJlZCB0aGUgbG9ja2luZyBhbmQgaXQgcmVpbnRyb2R1Y2VkIGEKICBzaWxlbnQtcXVldWVpbmcgVVguIEEgcHJvcGVyIGZpeCB3b3VsZCBwYWlyIGEgc3RydWN0dXJhbCBsb2NrIHdpdGggYnVyc3QKICBjb2FsZXNjaW5nIG9yIGRpc3BhdGNoIGV4cGlyeS4KCiMjIFRlc3RpbmcKCi0gYHJ1bmAgZmFpbHMgZmFzdCBvbiBjb250ZW50aW9uIHdpdGggYSB0ZXJtaW5hbCBtYXJrZXIsIGFuZCBsb2dzICsgcmV0dXJucwogIG5vbi16ZXJvIG9uIGNvbnRlbnRpb24gd2l0aG91dCBhIHdhaXRpbmcgY2xpZW50LgotIGBydW5gIGNvbnZlcnRzIHRoZSBhZG1pbi1sb2NrIGBTeXN0ZW1FeGl0YCBpbnRvIGEgdGVybWluYWwgbWFya2VyLCBhbmQKICByZXR1cm5zIG5vbi16ZXJvIHF1aWV0bHkgd2hlbiBubyBjbGllbnQgaXMgd2FpdGluZy4KLSBgcnVuYCBwdWJsaXNoZXMgc3VjY2VzcyBhbmQgcmVsZWFzZXMgdGhlIGxvY2sgb24gdGhlIGhhcHB5IHBhdGggKHdpdGggYW5kCiAgd2l0aG91dCBwdWJsaXNoaW5nKS4KLSBgcnVuX29uX2NoYW5nZWAgc3RpbGwgcnVucyBhbmQgcmVsZWFzZXMgd2hlbiBpdCBhY3F1aXJlcyB0aGUgbG9jaywgYW5kIHNraXBzCiAgc2lsZW50bHkgd2hlbiBjb250ZW5kZWQuCi0gVGhlIGAtLXRhc2stdGltZW91dGAgaGVscCB0ZXh0IGRlc2NyaWJlcyBhbiBvdXRwdXQtaW5hY3Rpdml0eSB0aW1lb3V0LgotIEZ1bGwgdGVzdCBzdWl0ZSwgQmxhY2ssIGFuZCBmbGFrZTggcGFzcy4K
      patchset: b3e5a5afdc48d900ab56d851170f7461e69bfc54
      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: 7e58616133db3f5dd65744d3a7553e4e568b3414
          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-unit.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: 7e58616133db3f5dd65744d3a7553e4e568b3414
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2332/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
