all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe63:6753
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 8d0a3e40-5c17-4181-8850-87cc20e1d54a
        host_id: 0d3d02185f810c959252bd1d303ec55040bf5bb0b401cceef814c3a7
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe63:6753
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.29
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.235
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe63:6753
        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 flake8 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#32>'
      - '<Job flake8 explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 1d2402d3b1db4be7b7258844025e5528
      build_refs:
      - branch: main
        change: '2369'
        change_message: "Add lightweight integration tests for Celery/Redis basics
          in CI\n\nImplements #2368.\n\nAdds a lightweight integration-test job that
          covers the Celery/Redis\ntask-processing core (broker, queue routing, worker,
          result backend, Redis\nstreams for task output, distributed locks) end-to-end
          in CI, plus the\nprerequisite that makes the broker URL configurable.\n\n##
          Change set (in commit order)\n\n### 1. Derive Celery broker URL from settings
          and environment\n`osism/tasks/__init__.py`, `osism/commands/service.py`\n\n-
          `Config.broker_url` / `Config.result_backend` were hardcoded to\n  `redis://redis`,
          with the same literals duplicated in the `beat` and\n  `flower` service
          commands. They now derive from `REDIS_HOST` /\n  `REDIS_PORT` / `REDIS_DB`
          (the same settings `osism.utils._init_redis`\n  already honors), overridable
          via `CELERY_BROKER_URL` /\n  `CELERY_RESULT_BACKEND`. The default of `REDIS_HOST`
          is `redis`, so this\n  is backwards compatible.\n- `service.py` now references
          `Config.broker_url` (single source of truth)\n  for `beat`/`flower`, removing
          the duplicated literals.\n- Fixed `task_track_started`, which was the tuple
          `(True,)` instead of the\n  intended bool (it only worked because a non-empty
          tuple is truthy).\n\nThis is what lets the tests point Celery at a local
          Redis via\n`REDIS_HOST=localhost`.\n\n### 2. Add Celery/Redis integration
          tests\n`tests/integration/`, `setup.cfg`, `README.md`\n\n- `test_celery.py`
          \u2014 **round-trip**: `ansible.noop.delay()` \u2192\n  `result.get(timeout=60)
          is True` (broker + `osism-ansible` routing +\n  worker + result backend);
          **worker visibility**: a fresh `Celery`\n  client configured from `Config`
          sees the worker via\n  `inspect().ping()` (the mechanism behind `osism get
          status workers`).\n- `test_redis_streams.py` \u2014 `push_task_output` /
          `finish_task_output` /\n  `fetch_task_output` round-trip (the path `osism
          apply` uses to stream\n  logs).\n- `test_locking.py` \u2014 `create_redlock`
          acquire/release and\n  `set_task_lock` / `is_task_locked` / `remove_task_lock`.\n-
          `conftest.py` starts the worker as a session-scoped fixture from the\n  same
          venv, running only the `ansible` Celery app (no import-time\n  dependency
          on NetBox/OpenStack/ansible-core) with\n  `GATHER_FACTS_SCHEDULE=0` so the
          periodic `gather_facts` task is not\n  registered. It polls `inspect().ping()`
          until the worker is ready and\n  terminates it on teardown.\n- Tests carry
          an `integration` marker (registered in `setup.cfg` for the\n  `--strict-markers`
          run) and are **skipped when Redis is not reachable**,\n  so a local `pytest`
          is unaffected.\n\n### 3. Add Zuul integration-test job\n`.zuul.yaml`, `playbooks/test-integration.yml`\n\n-
          New `python-osism-integration-tests` job added to the `check` and\n  `periodic-daily`
          pipelines. It reuses `playbooks/pre.yml` (which already\n  sets up Docker
          via `ensure-docker`), starts a `redis:7-alpine`\n  container, installs the
          package with pipenv exactly like the unit-test\n  job, and runs `pytest
          tests/integration` with `REDIS_HOST=localhost`.\n\n## Notes / deviations\n\n-
          The unit-test job is already restricted to `tests/unit` via\n  `testpaths
          = tests/unit` in `setup.cfg`, so a bare `pytest` never\n  collects `tests/integration`
          \u2014 the issue's first concern is already\n  satisfied. The `integration`
          marker + Redis-reachability skip are still\n  added (the marker is required
          by `--strict-markers`, and the skip keeps\n  `pytest tests/integration`
          green locally without Redis).\n- No `CHANGELOG.md` entry: this repo maintains
          the changelog in batched,\n  post-release commits that map merged PR numbers
          to release versions, so\n  per-PR entries are out of convention here.\n-
          Follow-ups listed in the issue (compose-based variant, API/beat/revoke\n
          \ coverage) are intentionally out of scope.\n\n## Local verification\n\n-
          `black --check` \u2014 clean (6 files)\n- `flake8` \u2014 clean\n- `pytest
          tests/integration` \u2014 not run locally (no Redis); exercised by\n  the
          new CI job.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2369
        commit_id: 81ec7d28a963899f4fbda5a1c15147948139da9e
        patchset: 81ec7d28a963899f4fbda5a1c15147948139da9e
        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: 29deb6cb0eb6479db21996ee15551421
      buildset_refs:
      - branch: main
        change: '2369'
        change_message: "Add lightweight integration tests for Celery/Redis basics
          in CI\n\nImplements #2368.\n\nAdds a lightweight integration-test job that
          covers the Celery/Redis\ntask-processing core (broker, queue routing, worker,
          result backend, Redis\nstreams for task output, distributed locks) end-to-end
          in CI, plus the\nprerequisite that makes the broker URL configurable.\n\n##
          Change set (in commit order)\n\n### 1. Derive Celery broker URL from settings
          and environment\n`osism/tasks/__init__.py`, `osism/commands/service.py`\n\n-
          `Config.broker_url` / `Config.result_backend` were hardcoded to\n  `redis://redis`,
          with the same literals duplicated in the `beat` and\n  `flower` service
          commands. They now derive from `REDIS_HOST` /\n  `REDIS_PORT` / `REDIS_DB`
          (the same settings `osism.utils._init_redis`\n  already honors), overridable
          via `CELERY_BROKER_URL` /\n  `CELERY_RESULT_BACKEND`. The default of `REDIS_HOST`
          is `redis`, so this\n  is backwards compatible.\n- `service.py` now references
          `Config.broker_url` (single source of truth)\n  for `beat`/`flower`, removing
          the duplicated literals.\n- Fixed `task_track_started`, which was the tuple
          `(True,)` instead of the\n  intended bool (it only worked because a non-empty
          tuple is truthy).\n\nThis is what lets the tests point Celery at a local
          Redis via\n`REDIS_HOST=localhost`.\n\n### 2. Add Celery/Redis integration
          tests\n`tests/integration/`, `setup.cfg`, `README.md`\n\n- `test_celery.py`
          \u2014 **round-trip**: `ansible.noop.delay()` \u2192\n  `result.get(timeout=60)
          is True` (broker + `osism-ansible` routing +\n  worker + result backend);
          **worker visibility**: a fresh `Celery`\n  client configured from `Config`
          sees the worker via\n  `inspect().ping()` (the mechanism behind `osism get
          status workers`).\n- `test_redis_streams.py` \u2014 `push_task_output` /
          `finish_task_output` /\n  `fetch_task_output` round-trip (the path `osism
          apply` uses to stream\n  logs).\n- `test_locking.py` \u2014 `create_redlock`
          acquire/release and\n  `set_task_lock` / `is_task_locked` / `remove_task_lock`.\n-
          `conftest.py` starts the worker as a session-scoped fixture from the\n  same
          venv, running only the `ansible` Celery app (no import-time\n  dependency
          on NetBox/OpenStack/ansible-core) with\n  `GATHER_FACTS_SCHEDULE=0` so the
          periodic `gather_facts` task is not\n  registered. It polls `inspect().ping()`
          until the worker is ready and\n  terminates it on teardown.\n- Tests carry
          an `integration` marker (registered in `setup.cfg` for the\n  `--strict-markers`
          run) and are **skipped when Redis is not reachable**,\n  so a local `pytest`
          is unaffected.\n\n### 3. Add Zuul integration-test job\n`.zuul.yaml`, `playbooks/test-integration.yml`\n\n-
          New `python-osism-integration-tests` job added to the `check` and\n  `periodic-daily`
          pipelines. It reuses `playbooks/pre.yml` (which already\n  sets up Docker
          via `ensure-docker`), starts a `redis:7-alpine`\n  container, installs the
          package with pipenv exactly like the unit-test\n  job, and runs `pytest
          tests/integration` with `REDIS_HOST=localhost`.\n\n## Notes / deviations\n\n-
          The unit-test job is already restricted to `tests/unit` via\n  `testpaths
          = tests/unit` in `setup.cfg`, so a bare `pytest` never\n  collects `tests/integration`
          \u2014 the issue's first concern is already\n  satisfied. The `integration`
          marker + Redis-reachability skip are still\n  added (the marker is required
          by `--strict-markers`, and the skip keeps\n  `pytest tests/integration`
          green locally without Redis).\n- No `CHANGELOG.md` entry: this repo maintains
          the changelog in batched,\n  post-release commits that map merged PR numbers
          to release versions, so\n  per-PR entries are out of convention here.\n-
          Follow-ups listed in the issue (compose-based variant, API/beat/revoke\n
          \ coverage) are intentionally out of scope.\n\n## Local verification\n\n-
          `black --check` \u2014 clean (6 files)\n- `flake8` \u2014 clean\n- `pytest
          tests/integration` \u2014 not run locally (no Redis); exercised by\n  the
          new CI job.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2369
        commit_id: 81ec7d28a963899f4fbda5a1c15147948139da9e
        patchset: 81ec7d28a963899f4fbda5a1c15147948139da9e
        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: '2369'
      change_message: "Add lightweight integration tests for Celery/Redis basics in
        CI\n\nImplements #2368.\n\nAdds a lightweight integration-test job that covers
        the Celery/Redis\ntask-processing core (broker, queue routing, worker, result
        backend, Redis\nstreams for task output, distributed locks) end-to-end in
        CI, plus the\nprerequisite that makes the broker URL configurable.\n\n## Change
        set (in commit order)\n\n### 1. Derive Celery broker URL from settings and
        environment\n`osism/tasks/__init__.py`, `osism/commands/service.py`\n\n- `Config.broker_url`
        / `Config.result_backend` were hardcoded to\n  `redis://redis`, with the same
        literals duplicated in the `beat` and\n  `flower` service commands. They now
        derive from `REDIS_HOST` /\n  `REDIS_PORT` / `REDIS_DB` (the same settings
        `osism.utils._init_redis`\n  already honors), overridable via `CELERY_BROKER_URL`
        /\n  `CELERY_RESULT_BACKEND`. The default of `REDIS_HOST` is `redis`, so this\n
        \ is backwards compatible.\n- `service.py` now references `Config.broker_url`
        (single source of truth)\n  for `beat`/`flower`, removing the duplicated literals.\n-
        Fixed `task_track_started`, which was the tuple `(True,)` instead of the\n
        \ intended bool (it only worked because a non-empty tuple is truthy).\n\nThis
        is what lets the tests point Celery at a local Redis via\n`REDIS_HOST=localhost`.\n\n###
        2. Add Celery/Redis integration tests\n`tests/integration/`, `setup.cfg`,
        `README.md`\n\n- `test_celery.py` \u2014 **round-trip**: `ansible.noop.delay()`
        \u2192\n  `result.get(timeout=60) is True` (broker + `osism-ansible` routing
        +\n  worker + result backend); **worker visibility**: a fresh `Celery`\n  client
        configured from `Config` sees the worker via\n  `inspect().ping()` (the mechanism
        behind `osism get status workers`).\n- `test_redis_streams.py` \u2014 `push_task_output`
        / `finish_task_output` /\n  `fetch_task_output` round-trip (the path `osism
        apply` uses to stream\n  logs).\n- `test_locking.py` \u2014 `create_redlock`
        acquire/release and\n  `set_task_lock` / `is_task_locked` / `remove_task_lock`.\n-
        `conftest.py` starts the worker as a session-scoped fixture from the\n  same
        venv, running only the `ansible` Celery app (no import-time\n  dependency
        on NetBox/OpenStack/ansible-core) with\n  `GATHER_FACTS_SCHEDULE=0` so the
        periodic `gather_facts` task is not\n  registered. It polls `inspect().ping()`
        until the worker is ready and\n  terminates it on teardown.\n- Tests carry
        an `integration` marker (registered in `setup.cfg` for the\n  `--strict-markers`
        run) and are **skipped when Redis is not reachable**,\n  so a local `pytest`
        is unaffected.\n\n### 3. Add Zuul integration-test job\n`.zuul.yaml`, `playbooks/test-integration.yml`\n\n-
        New `python-osism-integration-tests` job added to the `check` and\n  `periodic-daily`
        pipelines. It reuses `playbooks/pre.yml` (which already\n  sets up Docker
        via `ensure-docker`), starts a `redis:7-alpine`\n  container, installs the
        package with pipenv exactly like the unit-test\n  job, and runs `pytest tests/integration`
        with `REDIS_HOST=localhost`.\n\n## Notes / deviations\n\n- The unit-test job
        is already restricted to `tests/unit` via\n  `testpaths = tests/unit` in `setup.cfg`,
        so a bare `pytest` never\n  collects `tests/integration` \u2014 the issue's
        first concern is already\n  satisfied. The `integration` marker + Redis-reachability
        skip are still\n  added (the marker is required by `--strict-markers`, and
        the skip keeps\n  `pytest tests/integration` green locally without Redis).\n-
        No `CHANGELOG.md` entry: this repo maintains the changelog in batched,\n  post-release
        commits that map merged PR numbers to release versions, so\n  per-PR entries
        are out of convention here.\n- Follow-ups listed in the issue (compose-based
        variant, API/beat/revoke\n  coverage) are intentionally out of scope.\n\n##
        Local verification\n\n- `black --check` \u2014 clean (6 files)\n- `flake8`
        \u2014 clean\n- `pytest tests/integration` \u2014 not run locally (no Redis);
        exercised by\n  the new CI job.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/python-osism/pull/2369
      child_jobs: []
      commit_id: 81ec7d28a963899f4fbda5a1c15147948139da9e
      event_id: 96c97b00-6666-11f1-8a0a-833cc9a3f338
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/1d2402d3b1db4be7b7258844025e5528/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/1d2402d3b1db4be7b7258844025e5528/work/logs
        result_data_file: /var/lib/zuul/builds/1d2402d3b1db4be7b7258844025e5528/work/results.json
        src_root: /var/lib/zuul/builds/1d2402d3b1db4be7b7258844025e5528/work/src
        work_root: /var/lib/zuul/builds/1d2402d3b1db4be7b7258844025e5528/work
      include_vars: []
      items:
      - branch: main
        change: '2369'
        change_message: "Add lightweight integration tests for Celery/Redis basics
          in CI\n\nImplements #2368.\n\nAdds a lightweight integration-test job that
          covers the Celery/Redis\ntask-processing core (broker, queue routing, worker,
          result backend, Redis\nstreams for task output, distributed locks) end-to-end
          in CI, plus the\nprerequisite that makes the broker URL configurable.\n\n##
          Change set (in commit order)\n\n### 1. Derive Celery broker URL from settings
          and environment\n`osism/tasks/__init__.py`, `osism/commands/service.py`\n\n-
          `Config.broker_url` / `Config.result_backend` were hardcoded to\n  `redis://redis`,
          with the same literals duplicated in the `beat` and\n  `flower` service
          commands. They now derive from `REDIS_HOST` /\n  `REDIS_PORT` / `REDIS_DB`
          (the same settings `osism.utils._init_redis`\n  already honors), overridable
          via `CELERY_BROKER_URL` /\n  `CELERY_RESULT_BACKEND`. The default of `REDIS_HOST`
          is `redis`, so this\n  is backwards compatible.\n- `service.py` now references
          `Config.broker_url` (single source of truth)\n  for `beat`/`flower`, removing
          the duplicated literals.\n- Fixed `task_track_started`, which was the tuple
          `(True,)` instead of the\n  intended bool (it only worked because a non-empty
          tuple is truthy).\n\nThis is what lets the tests point Celery at a local
          Redis via\n`REDIS_HOST=localhost`.\n\n### 2. Add Celery/Redis integration
          tests\n`tests/integration/`, `setup.cfg`, `README.md`\n\n- `test_celery.py`
          \u2014 **round-trip**: `ansible.noop.delay()` \u2192\n  `result.get(timeout=60)
          is True` (broker + `osism-ansible` routing +\n  worker + result backend);
          **worker visibility**: a fresh `Celery`\n  client configured from `Config`
          sees the worker via\n  `inspect().ping()` (the mechanism behind `osism get
          status workers`).\n- `test_redis_streams.py` \u2014 `push_task_output` /
          `finish_task_output` /\n  `fetch_task_output` round-trip (the path `osism
          apply` uses to stream\n  logs).\n- `test_locking.py` \u2014 `create_redlock`
          acquire/release and\n  `set_task_lock` / `is_task_locked` / `remove_task_lock`.\n-
          `conftest.py` starts the worker as a session-scoped fixture from the\n  same
          venv, running only the `ansible` Celery app (no import-time\n  dependency
          on NetBox/OpenStack/ansible-core) with\n  `GATHER_FACTS_SCHEDULE=0` so the
          periodic `gather_facts` task is not\n  registered. It polls `inspect().ping()`
          until the worker is ready and\n  terminates it on teardown.\n- Tests carry
          an `integration` marker (registered in `setup.cfg` for the\n  `--strict-markers`
          run) and are **skipped when Redis is not reachable**,\n  so a local `pytest`
          is unaffected.\n\n### 3. Add Zuul integration-test job\n`.zuul.yaml`, `playbooks/test-integration.yml`\n\n-
          New `python-osism-integration-tests` job added to the `check` and\n  `periodic-daily`
          pipelines. It reuses `playbooks/pre.yml` (which already\n  sets up Docker
          via `ensure-docker`), starts a `redis:7-alpine`\n  container, installs the
          package with pipenv exactly like the unit-test\n  job, and runs `pytest
          tests/integration` with `REDIS_HOST=localhost`.\n\n## Notes / deviations\n\n-
          The unit-test job is already restricted to `tests/unit` via\n  `testpaths
          = tests/unit` in `setup.cfg`, so a bare `pytest` never\n  collects `tests/integration`
          \u2014 the issue's first concern is already\n  satisfied. The `integration`
          marker + Redis-reachability skip are still\n  added (the marker is required
          by `--strict-markers`, and the skip keeps\n  `pytest tests/integration`
          green locally without Redis).\n- No `CHANGELOG.md` entry: this repo maintains
          the changelog in batched,\n  post-release commits that map merged PR numbers
          to release versions, so\n  per-PR entries are out of convention here.\n-
          Follow-ups listed in the issue (compose-based variant, API/beat/revoke\n
          \ coverage) are intentionally out of scope.\n\n## Local verification\n\n-
          `black --check` \u2014 clean (6 files)\n- `flake8` \u2014 clean\n- `pytest
          tests/integration` \u2014 not run locally (no Redis); exercised by\n  the
          new CI job.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2369
        commit_id: 81ec7d28a963899f4fbda5a1c15147948139da9e
        patchset: 81ec7d28a963899f4fbda5a1c15147948139da9e
        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: flake8
      jobtags: []
      max_attempts: 3
      message: QWRkIGxpZ2h0d2VpZ2h0IGludGVncmF0aW9uIHRlc3RzIGZvciBDZWxlcnkvUmVkaXMgYmFzaWNzIGluIENJCgpJbXBsZW1lbnRzICMyMzY4LgoKQWRkcyBhIGxpZ2h0d2VpZ2h0IGludGVncmF0aW9uLXRlc3Qgam9iIHRoYXQgY292ZXJzIHRoZSBDZWxlcnkvUmVkaXMKdGFzay1wcm9jZXNzaW5nIGNvcmUgKGJyb2tlciwgcXVldWUgcm91dGluZywgd29ya2VyLCByZXN1bHQgYmFja2VuZCwgUmVkaXMKc3RyZWFtcyBmb3IgdGFzayBvdXRwdXQsIGRpc3RyaWJ1dGVkIGxvY2tzKSBlbmQtdG8tZW5kIGluIENJLCBwbHVzIHRoZQpwcmVyZXF1aXNpdGUgdGhhdCBtYWtlcyB0aGUgYnJva2VyIFVSTCBjb25maWd1cmFibGUuCgojIyBDaGFuZ2Ugc2V0IChpbiBjb21taXQgb3JkZXIpCgojIyMgMS4gRGVyaXZlIENlbGVyeSBicm9rZXIgVVJMIGZyb20gc2V0dGluZ3MgYW5kIGVudmlyb25tZW50CmBvc2lzbS90YXNrcy9fX2luaXRfXy5weWAsIGBvc2lzbS9jb21tYW5kcy9zZXJ2aWNlLnB5YAoKLSBgQ29uZmlnLmJyb2tlcl91cmxgIC8gYENvbmZpZy5yZXN1bHRfYmFja2VuZGAgd2VyZSBoYXJkY29kZWQgdG8KICBgcmVkaXM6Ly9yZWRpc2AsIHdpdGggdGhlIHNhbWUgbGl0ZXJhbHMgZHVwbGljYXRlZCBpbiB0aGUgYGJlYXRgIGFuZAogIGBmbG93ZXJgIHNlcnZpY2UgY29tbWFuZHMuIFRoZXkgbm93IGRlcml2ZSBmcm9tIGBSRURJU19IT1NUYCAvCiAgYFJFRElTX1BPUlRgIC8gYFJFRElTX0RCYCAodGhlIHNhbWUgc2V0dGluZ3MgYG9zaXNtLnV0aWxzLl9pbml0X3JlZGlzYAogIGFscmVhZHkgaG9ub3JzKSwgb3ZlcnJpZGFibGUgdmlhIGBDRUxFUllfQlJPS0VSX1VSTGAgLwogIGBDRUxFUllfUkVTVUxUX0JBQ0tFTkRgLiBUaGUgZGVmYXVsdCBvZiBgUkVESVNfSE9TVGAgaXMgYHJlZGlzYCwgc28gdGhpcwogIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlLgotIGBzZXJ2aWNlLnB5YCBub3cgcmVmZXJlbmNlcyBgQ29uZmlnLmJyb2tlcl91cmxgIChzaW5nbGUgc291cmNlIG9mIHRydXRoKQogIGZvciBgYmVhdGAvYGZsb3dlcmAsIHJlbW92aW5nIHRoZSBkdXBsaWNhdGVkIGxpdGVyYWxzLgotIEZpeGVkIGB0YXNrX3RyYWNrX3N0YXJ0ZWRgLCB3aGljaCB3YXMgdGhlIHR1cGxlIGAoVHJ1ZSwpYCBpbnN0ZWFkIG9mIHRoZQogIGludGVuZGVkIGJvb2wgKGl0IG9ubHkgd29ya2VkIGJlY2F1c2UgYSBub24tZW1wdHkgdHVwbGUgaXMgdHJ1dGh5KS4KClRoaXMgaXMgd2hhdCBsZXRzIHRoZSB0ZXN0cyBwb2ludCBDZWxlcnkgYXQgYSBsb2NhbCBSZWRpcyB2aWEKYFJFRElTX0hPU1Q9bG9jYWxob3N0YC4KCiMjIyAyLiBBZGQgQ2VsZXJ5L1JlZGlzIGludGVncmF0aW9uIHRlc3RzCmB0ZXN0cy9pbnRlZ3JhdGlvbi9gLCBgc2V0dXAuY2ZnYCwgYFJFQURNRS5tZGAKCi0gYHRlc3RfY2VsZXJ5LnB5YCDigJQgKipyb3VuZC10cmlwKio6IGBhbnNpYmxlLm5vb3AuZGVsYXkoKWAg4oaSCiAgYHJlc3VsdC5nZXQodGltZW91dD02MCkgaXMgVHJ1ZWAgKGJyb2tlciArIGBvc2lzbS1hbnNpYmxlYCByb3V0aW5nICsKICB3b3JrZXIgKyByZXN1bHQgYmFja2VuZCk7ICoqd29ya2VyIHZpc2liaWxpdHkqKjogYSBmcmVzaCBgQ2VsZXJ5YAogIGNsaWVudCBjb25maWd1cmVkIGZyb20gYENvbmZpZ2Agc2VlcyB0aGUgd29ya2VyIHZpYQogIGBpbnNwZWN0KCkucGluZygpYCAodGhlIG1lY2hhbmlzbSBiZWhpbmQgYG9zaXNtIGdldCBzdGF0dXMgd29ya2Vyc2ApLgotIGB0ZXN0X3JlZGlzX3N0cmVhbXMucHlgIOKAlCBgcHVzaF90YXNrX291dHB1dGAgLyBgZmluaXNoX3Rhc2tfb3V0cHV0YCAvCiAgYGZldGNoX3Rhc2tfb3V0cHV0YCByb3VuZC10cmlwICh0aGUgcGF0aCBgb3Npc20gYXBwbHlgIHVzZXMgdG8gc3RyZWFtCiAgbG9ncykuCi0gYHRlc3RfbG9ja2luZy5weWAg4oCUIGBjcmVhdGVfcmVkbG9ja2AgYWNxdWlyZS9yZWxlYXNlIGFuZAogIGBzZXRfdGFza19sb2NrYCAvIGBpc190YXNrX2xvY2tlZGAgLyBgcmVtb3ZlX3Rhc2tfbG9ja2AuCi0gYGNvbmZ0ZXN0LnB5YCBzdGFydHMgdGhlIHdvcmtlciBhcyBhIHNlc3Npb24tc2NvcGVkIGZpeHR1cmUgZnJvbSB0aGUKICBzYW1lIHZlbnYsIHJ1bm5pbmcgb25seSB0aGUgYGFuc2libGVgIENlbGVyeSBhcHAgKG5vIGltcG9ydC10aW1lCiAgZGVwZW5kZW5jeSBvbiBOZXRCb3gvT3BlblN0YWNrL2Fuc2libGUtY29yZSkgd2l0aAogIGBHQVRIRVJfRkFDVFNfU0NIRURVTEU9MGAgc28gdGhlIHBlcmlvZGljIGBnYXRoZXJfZmFjdHNgIHRhc2sgaXMgbm90CiAgcmVnaXN0ZXJlZC4gSXQgcG9sbHMgYGluc3BlY3QoKS5waW5nKClgIHVudGlsIHRoZSB3b3JrZXIgaXMgcmVhZHkgYW5kCiAgdGVybWluYXRlcyBpdCBvbiB0ZWFyZG93bi4KLSBUZXN0cyBjYXJyeSBhbiBgaW50ZWdyYXRpb25gIG1hcmtlciAocmVnaXN0ZXJlZCBpbiBgc2V0dXAuY2ZnYCBmb3IgdGhlCiAgYC0tc3RyaWN0LW1hcmtlcnNgIHJ1bikgYW5kIGFyZSAqKnNraXBwZWQgd2hlbiBSZWRpcyBpcyBub3QgcmVhY2hhYmxlKiosCiAgc28gYSBsb2NhbCBgcHl0ZXN0YCBpcyB1bmFmZmVjdGVkLgoKIyMjIDMuIEFkZCBadXVsIGludGVncmF0aW9uLXRlc3Qgam9iCmAuenV1bC55YW1sYCwgYHBsYXlib29rcy90ZXN0LWludGVncmF0aW9uLnltbGAKCi0gTmV3IGBweXRob24tb3Npc20taW50ZWdyYXRpb24tdGVzdHNgIGpvYiBhZGRlZCB0byB0aGUgYGNoZWNrYCBhbmQKICBgcGVyaW9kaWMtZGFpbHlgIHBpcGVsaW5lcy4gSXQgcmV1c2VzIGBwbGF5Ym9va3MvcHJlLnltbGAgKHdoaWNoIGFscmVhZHkKICBzZXRzIHVwIERvY2tlciB2aWEgYGVuc3VyZS1kb2NrZXJgKSwgc3RhcnRzIGEgYHJlZGlzOjctYWxwaW5lYAogIGNvbnRhaW5lciwgaW5zdGFsbHMgdGhlIHBhY2thZ2Ugd2l0aCBwaXBlbnYgZXhhY3RseSBsaWtlIHRoZSB1bml0LXRlc3QKICBqb2IsIGFuZCBydW5zIGBweXRlc3QgdGVzdHMvaW50ZWdyYXRpb25gIHdpdGggYFJFRElTX0hPU1Q9bG9jYWxob3N0YC4KCiMjIE5vdGVzIC8gZGV2aWF0aW9ucwoKLSBUaGUgdW5pdC10ZXN0IGpvYiBpcyBhbHJlYWR5IHJlc3RyaWN0ZWQgdG8gYHRlc3RzL3VuaXRgIHZpYQogIGB0ZXN0cGF0aHMgPSB0ZXN0cy91bml0YCBpbiBgc2V0dXAuY2ZnYCwgc28gYSBiYXJlIGBweXRlc3RgIG5ldmVyCiAgY29sbGVjdHMgYHRlc3RzL2ludGVncmF0aW9uYCDigJQgdGhlIGlzc3VlJ3MgZmlyc3QgY29uY2VybiBpcyBhbHJlYWR5CiAgc2F0aXNmaWVkLiBUaGUgYGludGVncmF0aW9uYCBtYXJrZXIgKyBSZWRpcy1yZWFjaGFiaWxpdHkgc2tpcCBhcmUgc3RpbGwKICBhZGRlZCAodGhlIG1hcmtlciBpcyByZXF1aXJlZCBieSBgLS1zdHJpY3QtbWFya2Vyc2AsIGFuZCB0aGUgc2tpcCBrZWVwcwogIGBweXRlc3QgdGVzdHMvaW50ZWdyYXRpb25gIGdyZWVuIGxvY2FsbHkgd2l0aG91dCBSZWRpcykuCi0gTm8gYENIQU5HRUxPRy5tZGAgZW50cnk6IHRoaXMgcmVwbyBtYWludGFpbnMgdGhlIGNoYW5nZWxvZyBpbiBiYXRjaGVkLAogIHBvc3QtcmVsZWFzZSBjb21taXRzIHRoYXQgbWFwIG1lcmdlZCBQUiBudW1iZXJzIHRvIHJlbGVhc2UgdmVyc2lvbnMsIHNvCiAgcGVyLVBSIGVudHJpZXMgYXJlIG91dCBvZiBjb252ZW50aW9uIGhlcmUuCi0gRm9sbG93LXVwcyBsaXN0ZWQgaW4gdGhlIGlzc3VlIChjb21wb3NlLWJhc2VkIHZhcmlhbnQsIEFQSS9iZWF0L3Jldm9rZQogIGNvdmVyYWdlKSBhcmUgaW50ZW50aW9uYWxseSBvdXQgb2Ygc2NvcGUuCgojIyBMb2NhbCB2ZXJpZmljYXRpb24KCi0gYGJsYWNrIC0tY2hlY2tgIOKAlCBjbGVhbiAoNiBmaWxlcykKLSBgZmxha2U4YCDigJQgY2xlYW4KLSBgcHl0ZXN0IHRlc3RzL2ludGVncmF0aW9uYCDigJQgbm90IHJ1biBsb2NhbGx5IChubyBSZWRpcyk7IGV4ZXJjaXNlZCBieQogIHRoZSBuZXcgQ0kgam9iLgoK8J+kliBHZW5lcmF0ZWQgd2l0aCBbQ2xhdWRlIENvZGVdKGh0dHBzOi8vY2xhdWRlLmNvbS9jbGF1ZGUtY29kZSkK
      patchset: 81ec7d28a963899f4fbda5a1c15147948139da9e
      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/flake8/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: 329cd02badff4780a677fdb18f5320250725807c
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2369/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
