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