all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe03:2797
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      docker_image: frontend
      docker_namespace: osism
      docker_registry: osism.harbor.regio.digital
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 7a05cc71-e6be-44b0-b656-6938e4f7b804
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe03:2797
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.109
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.152
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe03:2797
        region: null
        slot: null
      repository: osism/osism
  vars:
    docker_image: frontend
    docker_namespace: osism
    docker_registry: osism.harbor.regio.digital
    repository: osism/osism
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job container-image-python-osism-frontend-build explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: osism/python-osism/.zuul.yaml@main#87>'
      - '<Job container-image-python-osism-frontend-build explicit: None implied:
        None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 11afd56fdd194564a555ea1e4d33d9ba
      build_refs:
      - branch: main
        change: '2549'
        change_message: "Add integration tests for the Ansible facts freshness check\n\nCloses
          #2403.\n\n`check_ansible_facts()` (`osism/utils/__init__.py:596`) is what
          `osism apply` calls before running plays (`osism/commands/apply.py:422`)
          to warn operators about a missing or outdated facts cache. Its unit tests
          (`tests/unit/utils/test_init_task_output.py:450`) drive it through a `MagicMock`
          client, so the parts most likely to regress are the parts the mocks simulate:
          the cursor-based `SCAN` loop, the bytes decoding of keys and values, and
          JSON parsing of data a real server returned.\n\nThis adds `tests/integration/test_facts.py`,
          which exercises those paths against the live Redis the `python-osism-integration-tests`
          job provides. No source file changes.\n\n## The commit\n\n- `Add integration
          tests for the Ansible facts freshness check` \u2014 one new module with
          six tests and a module-local `seed_facts` fixture.\n\n## What the tests
          cover\n\n| Test | Seeded value | Checks |\n|---|---|---|\n| `test_no_facts_warns_about_empty_cache`
          | nothing | the \"No Ansible facts found in Redis cache\" warning |\n| `test_fresh_facts_produce_no_warning`
          | current epoch | no warning names the host |\n| `test_stale_facts_report_the_stale_host_only`
          | one host at `now-9999`, one fresh | the stale host is named with its age,
          the fresh one is not |\n| `test_facts_without_epoch_are_skipped` | facts
          without `ansible_date_time.epoch` | the skip is logged at debug level, no
          warning |\n| `test_malformed_json_is_skipped` | `{ not valid json` | `json.JSONDecodeError`
          is caught, the skip is logged at debug level |\n| `test_empty_value_is_skipped`
          | empty string | the host is skipped silently |\n\nTwo properties keep the
          module deterministic against a Redis that is not empty. Hostnames are `itest-<uuid4>`,
          and every assertion is scoped to a seeded hostname or to a message unique
          to its scenario, so unrelated keys cannot fail the suite. `check_ansible_facts()`
          scans the whole database, so the empty-cache case cannot be produced on
          a Redis holding real facts; that test skips and names the leftover keys
          rather than deleting data the suite does not own.\n\n`max_age=300` is passed
          explicitly everywhere, since the `settings.FACTS_MAX_AGE` default of 12
          hours would tie the stale case to the environment.\n\n## Verification\n\nAgainst
          a throwaway `redis:7-alpine`:\n\n- `pytest tests/integration/test_facts.py`
          \u2014 6 passed, run twice in a row, with `KEYS 'ansible_facts*'` empty
          afterwards.\n- With a foreign `ansible_facts` key present: the empty-cache
          test is reported as skipped, the key survives, and the other five tests
          stay green.\n- Without Redis: 6 skipped; with `OSISM_REQUIRE_REDIS=1` the
          session exits non-zero.\n- `black --check` and `flake8` are clean.\n\nThree
          mutations of `check_ansible_facts()` were each caught by the matching test
          and then reverted: disabling the staleness comparison failed `test_stale_facts_report_the_stale_host_only`,
          downgrading the empty-cache warning failed `test_no_facts_warns_about_empty_cache`,
          and removing the missing-epoch debug line failed `test_facts_without_epoch_are_skipped`.\n\nPart
          of #2400 (Tier 1).\n"
        change_url: https://github.com/osism/python-osism/pull/2549
        commit_id: bfc039c6520ebbc7e908c7354810b4ed04be28fa
        patchset: bfc039c6520ebbc7e908c7354810b4ed04be28fa
        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: ee390f4700a34bf8bf56a6089e0c5741
      buildset_refs:
      - branch: main
        change: '2549'
        change_message: "Add integration tests for the Ansible facts freshness check\n\nCloses
          #2403.\n\n`check_ansible_facts()` (`osism/utils/__init__.py:596`) is what
          `osism apply` calls before running plays (`osism/commands/apply.py:422`)
          to warn operators about a missing or outdated facts cache. Its unit tests
          (`tests/unit/utils/test_init_task_output.py:450`) drive it through a `MagicMock`
          client, so the parts most likely to regress are the parts the mocks simulate:
          the cursor-based `SCAN` loop, the bytes decoding of keys and values, and
          JSON parsing of data a real server returned.\n\nThis adds `tests/integration/test_facts.py`,
          which exercises those paths against the live Redis the `python-osism-integration-tests`
          job provides. No source file changes.\n\n## The commit\n\n- `Add integration
          tests for the Ansible facts freshness check` \u2014 one new module with
          six tests and a module-local `seed_facts` fixture.\n\n## What the tests
          cover\n\n| Test | Seeded value | Checks |\n|---|---|---|\n| `test_no_facts_warns_about_empty_cache`
          | nothing | the \"No Ansible facts found in Redis cache\" warning |\n| `test_fresh_facts_produce_no_warning`
          | current epoch | no warning names the host |\n| `test_stale_facts_report_the_stale_host_only`
          | one host at `now-9999`, one fresh | the stale host is named with its age,
          the fresh one is not |\n| `test_facts_without_epoch_are_skipped` | facts
          without `ansible_date_time.epoch` | the skip is logged at debug level, no
          warning |\n| `test_malformed_json_is_skipped` | `{ not valid json` | `json.JSONDecodeError`
          is caught, the skip is logged at debug level |\n| `test_empty_value_is_skipped`
          | empty string | the host is skipped silently |\n\nTwo properties keep the
          module deterministic against a Redis that is not empty. Hostnames are `itest-<uuid4>`,
          and every assertion is scoped to a seeded hostname or to a message unique
          to its scenario, so unrelated keys cannot fail the suite. `check_ansible_facts()`
          scans the whole database, so the empty-cache case cannot be produced on
          a Redis holding real facts; that test skips and names the leftover keys
          rather than deleting data the suite does not own.\n\n`max_age=300` is passed
          explicitly everywhere, since the `settings.FACTS_MAX_AGE` default of 12
          hours would tie the stale case to the environment.\n\n## Verification\n\nAgainst
          a throwaway `redis:7-alpine`:\n\n- `pytest tests/integration/test_facts.py`
          \u2014 6 passed, run twice in a row, with `KEYS 'ansible_facts*'` empty
          afterwards.\n- With a foreign `ansible_facts` key present: the empty-cache
          test is reported as skipped, the key survives, and the other five tests
          stay green.\n- Without Redis: 6 skipped; with `OSISM_REQUIRE_REDIS=1` the
          session exits non-zero.\n- `black --check` and `flake8` are clean.\n\nThree
          mutations of `check_ansible_facts()` were each caught by the matching test
          and then reverted: disabling the staleness comparison failed `test_stale_facts_report_the_stale_host_only`,
          downgrading the empty-cache warning failed `test_no_facts_warns_about_empty_cache`,
          and removing the missing-epoch debug line failed `test_facts_without_epoch_are_skipped`.\n\nPart
          of #2400 (Tier 1).\n"
        change_url: https://github.com/osism/python-osism/pull/2549
        commit_id: bfc039c6520ebbc7e908c7354810b4ed04be28fa
        patchset: bfc039c6520ebbc7e908c7354810b4ed04be28fa
        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: '2549'
      change_message: "Add integration tests for the Ansible facts freshness check\n\nCloses
        #2403.\n\n`check_ansible_facts()` (`osism/utils/__init__.py:596`) is what
        `osism apply` calls before running plays (`osism/commands/apply.py:422`) to
        warn operators about a missing or outdated facts cache. Its unit tests (`tests/unit/utils/test_init_task_output.py:450`)
        drive it through a `MagicMock` client, so the parts most likely to regress
        are the parts the mocks simulate: the cursor-based `SCAN` loop, the bytes
        decoding of keys and values, and JSON parsing of data a real server returned.\n\nThis
        adds `tests/integration/test_facts.py`, which exercises those paths against
        the live Redis the `python-osism-integration-tests` job provides. No source
        file changes.\n\n## The commit\n\n- `Add integration tests for the Ansible
        facts freshness check` \u2014 one new module with six tests and a module-local
        `seed_facts` fixture.\n\n## What the tests cover\n\n| Test | Seeded value
        | Checks |\n|---|---|---|\n| `test_no_facts_warns_about_empty_cache` | nothing
        | the \"No Ansible facts found in Redis cache\" warning |\n| `test_fresh_facts_produce_no_warning`
        | current epoch | no warning names the host |\n| `test_stale_facts_report_the_stale_host_only`
        | one host at `now-9999`, one fresh | the stale host is named with its age,
        the fresh one is not |\n| `test_facts_without_epoch_are_skipped` | facts without
        `ansible_date_time.epoch` | the skip is logged at debug level, no warning
        |\n| `test_malformed_json_is_skipped` | `{ not valid json` | `json.JSONDecodeError`
        is caught, the skip is logged at debug level |\n| `test_empty_value_is_skipped`
        | empty string | the host is skipped silently |\n\nTwo properties keep the
        module deterministic against a Redis that is not empty. Hostnames are `itest-<uuid4>`,
        and every assertion is scoped to a seeded hostname or to a message unique
        to its scenario, so unrelated keys cannot fail the suite. `check_ansible_facts()`
        scans the whole database, so the empty-cache case cannot be produced on a
        Redis holding real facts; that test skips and names the leftover keys rather
        than deleting data the suite does not own.\n\n`max_age=300` is passed explicitly
        everywhere, since the `settings.FACTS_MAX_AGE` default of 12 hours would tie
        the stale case to the environment.\n\n## Verification\n\nAgainst a throwaway
        `redis:7-alpine`:\n\n- `pytest tests/integration/test_facts.py` \u2014 6 passed,
        run twice in a row, with `KEYS 'ansible_facts*'` empty afterwards.\n- With
        a foreign `ansible_facts` key present: the empty-cache test is reported as
        skipped, the key survives, and the other five tests stay green.\n- Without
        Redis: 6 skipped; with `OSISM_REQUIRE_REDIS=1` the session exits non-zero.\n-
        `black --check` and `flake8` are clean.\n\nThree mutations of `check_ansible_facts()`
        were each caught by the matching test and then reverted: disabling the staleness
        comparison failed `test_stale_facts_report_the_stale_host_only`, downgrading
        the empty-cache warning failed `test_no_facts_warns_about_empty_cache`, and
        removing the missing-epoch debug line failed `test_facts_without_epoch_are_skipped`.\n\nPart
        of #2400 (Tier 1).\n"
      change_url: https://github.com/osism/python-osism/pull/2549
      child_jobs: []
      commit_id: bfc039c6520ebbc7e908c7354810b4ed04be28fa
      event_id: 93cd04f0-8f18-11f1-8262-c5b4353e9270
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/11afd56fdd194564a555ea1e4d33d9ba/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/11afd56fdd194564a555ea1e4d33d9ba/work/logs
        result_data_file: /var/lib/zuul/builds/11afd56fdd194564a555ea1e4d33d9ba/work/results.json
        src_root: /var/lib/zuul/builds/11afd56fdd194564a555ea1e4d33d9ba/work/src
        work_root: /var/lib/zuul/builds/11afd56fdd194564a555ea1e4d33d9ba/work
      include_vars: []
      items:
      - branch: main
        change: '2549'
        change_message: "Add integration tests for the Ansible facts freshness check\n\nCloses
          #2403.\n\n`check_ansible_facts()` (`osism/utils/__init__.py:596`) is what
          `osism apply` calls before running plays (`osism/commands/apply.py:422`)
          to warn operators about a missing or outdated facts cache. Its unit tests
          (`tests/unit/utils/test_init_task_output.py:450`) drive it through a `MagicMock`
          client, so the parts most likely to regress are the parts the mocks simulate:
          the cursor-based `SCAN` loop, the bytes decoding of keys and values, and
          JSON parsing of data a real server returned.\n\nThis adds `tests/integration/test_facts.py`,
          which exercises those paths against the live Redis the `python-osism-integration-tests`
          job provides. No source file changes.\n\n## The commit\n\n- `Add integration
          tests for the Ansible facts freshness check` \u2014 one new module with
          six tests and a module-local `seed_facts` fixture.\n\n## What the tests
          cover\n\n| Test | Seeded value | Checks |\n|---|---|---|\n| `test_no_facts_warns_about_empty_cache`
          | nothing | the \"No Ansible facts found in Redis cache\" warning |\n| `test_fresh_facts_produce_no_warning`
          | current epoch | no warning names the host |\n| `test_stale_facts_report_the_stale_host_only`
          | one host at `now-9999`, one fresh | the stale host is named with its age,
          the fresh one is not |\n| `test_facts_without_epoch_are_skipped` | facts
          without `ansible_date_time.epoch` | the skip is logged at debug level, no
          warning |\n| `test_malformed_json_is_skipped` | `{ not valid json` | `json.JSONDecodeError`
          is caught, the skip is logged at debug level |\n| `test_empty_value_is_skipped`
          | empty string | the host is skipped silently |\n\nTwo properties keep the
          module deterministic against a Redis that is not empty. Hostnames are `itest-<uuid4>`,
          and every assertion is scoped to a seeded hostname or to a message unique
          to its scenario, so unrelated keys cannot fail the suite. `check_ansible_facts()`
          scans the whole database, so the empty-cache case cannot be produced on
          a Redis holding real facts; that test skips and names the leftover keys
          rather than deleting data the suite does not own.\n\n`max_age=300` is passed
          explicitly everywhere, since the `settings.FACTS_MAX_AGE` default of 12
          hours would tie the stale case to the environment.\n\n## Verification\n\nAgainst
          a throwaway `redis:7-alpine`:\n\n- `pytest tests/integration/test_facts.py`
          \u2014 6 passed, run twice in a row, with `KEYS 'ansible_facts*'` empty
          afterwards.\n- With a foreign `ansible_facts` key present: the empty-cache
          test is reported as skipped, the key survives, and the other five tests
          stay green.\n- Without Redis: 6 skipped; with `OSISM_REQUIRE_REDIS=1` the
          session exits non-zero.\n- `black --check` and `flake8` are clean.\n\nThree
          mutations of `check_ansible_facts()` were each caught by the matching test
          and then reverted: disabling the staleness comparison failed `test_stale_facts_report_the_stale_host_only`,
          downgrading the empty-cache warning failed `test_no_facts_warns_about_empty_cache`,
          and removing the missing-epoch debug line failed `test_facts_without_epoch_are_skipped`.\n\nPart
          of #2400 (Tier 1).\n"
        change_url: https://github.com/osism/python-osism/pull/2549
        commit_id: bfc039c6520ebbc7e908c7354810b4ed04be28fa
        patchset: bfc039c6520ebbc7e908c7354810b4ed04be28fa
        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: container-image-python-osism-frontend-build
      jobtags: []
      max_attempts: 3
      message: QWRkIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgQW5zaWJsZSBmYWN0cyBmcmVzaG5lc3MgY2hlY2sKCkNsb3NlcyAjMjQwMy4KCmBjaGVja19hbnNpYmxlX2ZhY3RzKClgIChgb3Npc20vdXRpbHMvX19pbml0X18ucHk6NTk2YCkgaXMgd2hhdCBgb3Npc20gYXBwbHlgIGNhbGxzIGJlZm9yZSBydW5uaW5nIHBsYXlzIChgb3Npc20vY29tbWFuZHMvYXBwbHkucHk6NDIyYCkgdG8gd2FybiBvcGVyYXRvcnMgYWJvdXQgYSBtaXNzaW5nIG9yIG91dGRhdGVkIGZhY3RzIGNhY2hlLiBJdHMgdW5pdCB0ZXN0cyAoYHRlc3RzL3VuaXQvdXRpbHMvdGVzdF9pbml0X3Rhc2tfb3V0cHV0LnB5OjQ1MGApIGRyaXZlIGl0IHRocm91Z2ggYSBgTWFnaWNNb2NrYCBjbGllbnQsIHNvIHRoZSBwYXJ0cyBtb3N0IGxpa2VseSB0byByZWdyZXNzIGFyZSB0aGUgcGFydHMgdGhlIG1vY2tzIHNpbXVsYXRlOiB0aGUgY3Vyc29yLWJhc2VkIGBTQ0FOYCBsb29wLCB0aGUgYnl0ZXMgZGVjb2Rpbmcgb2Yga2V5cyBhbmQgdmFsdWVzLCBhbmQgSlNPTiBwYXJzaW5nIG9mIGRhdGEgYSByZWFsIHNlcnZlciByZXR1cm5lZC4KClRoaXMgYWRkcyBgdGVzdHMvaW50ZWdyYXRpb24vdGVzdF9mYWN0cy5weWAsIHdoaWNoIGV4ZXJjaXNlcyB0aG9zZSBwYXRocyBhZ2FpbnN0IHRoZSBsaXZlIFJlZGlzIHRoZSBgcHl0aG9uLW9zaXNtLWludGVncmF0aW9uLXRlc3RzYCBqb2IgcHJvdmlkZXMuIE5vIHNvdXJjZSBmaWxlIGNoYW5nZXMuCgojIyBUaGUgY29tbWl0CgotIGBBZGQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBBbnNpYmxlIGZhY3RzIGZyZXNobmVzcyBjaGVja2Ag4oCUIG9uZSBuZXcgbW9kdWxlIHdpdGggc2l4IHRlc3RzIGFuZCBhIG1vZHVsZS1sb2NhbCBgc2VlZF9mYWN0c2AgZml4dHVyZS4KCiMjIFdoYXQgdGhlIHRlc3RzIGNvdmVyCgp8IFRlc3QgfCBTZWVkZWQgdmFsdWUgfCBDaGVja3MgfAp8LS0tfC0tLXwtLS18CnwgYHRlc3Rfbm9fZmFjdHNfd2FybnNfYWJvdXRfZW1wdHlfY2FjaGVgIHwgbm90aGluZyB8IHRoZSAiTm8gQW5zaWJsZSBmYWN0cyBmb3VuZCBpbiBSZWRpcyBjYWNoZSIgd2FybmluZyB8CnwgYHRlc3RfZnJlc2hfZmFjdHNfcHJvZHVjZV9ub193YXJuaW5nYCB8IGN1cnJlbnQgZXBvY2ggfCBubyB3YXJuaW5nIG5hbWVzIHRoZSBob3N0IHwKfCBgdGVzdF9zdGFsZV9mYWN0c19yZXBvcnRfdGhlX3N0YWxlX2hvc3Rfb25seWAgfCBvbmUgaG9zdCBhdCBgbm93LTk5OTlgLCBvbmUgZnJlc2ggfCB0aGUgc3RhbGUgaG9zdCBpcyBuYW1lZCB3aXRoIGl0cyBhZ2UsIHRoZSBmcmVzaCBvbmUgaXMgbm90IHwKfCBgdGVzdF9mYWN0c193aXRob3V0X2Vwb2NoX2FyZV9za2lwcGVkYCB8IGZhY3RzIHdpdGhvdXQgYGFuc2libGVfZGF0ZV90aW1lLmVwb2NoYCB8IHRoZSBza2lwIGlzIGxvZ2dlZCBhdCBkZWJ1ZyBsZXZlbCwgbm8gd2FybmluZyB8CnwgYHRlc3RfbWFsZm9ybWVkX2pzb25faXNfc2tpcHBlZGAgfCBgeyBub3QgdmFsaWQganNvbmAgfCBganNvbi5KU09ORGVjb2RlRXJyb3JgIGlzIGNhdWdodCwgdGhlIHNraXAgaXMgbG9nZ2VkIGF0IGRlYnVnIGxldmVsIHwKfCBgdGVzdF9lbXB0eV92YWx1ZV9pc19za2lwcGVkYCB8IGVtcHR5IHN0cmluZyB8IHRoZSBob3N0IGlzIHNraXBwZWQgc2lsZW50bHkgfAoKVHdvIHByb3BlcnRpZXMga2VlcCB0aGUgbW9kdWxlIGRldGVybWluaXN0aWMgYWdhaW5zdCBhIFJlZGlzIHRoYXQgaXMgbm90IGVtcHR5LiBIb3N0bmFtZXMgYXJlIGBpdGVzdC08dXVpZDQ+YCwgYW5kIGV2ZXJ5IGFzc2VydGlvbiBpcyBzY29wZWQgdG8gYSBzZWVkZWQgaG9zdG5hbWUgb3IgdG8gYSBtZXNzYWdlIHVuaXF1ZSB0byBpdHMgc2NlbmFyaW8sIHNvIHVucmVsYXRlZCBrZXlzIGNhbm5vdCBmYWlsIHRoZSBzdWl0ZS4gYGNoZWNrX2Fuc2libGVfZmFjdHMoKWAgc2NhbnMgdGhlIHdob2xlIGRhdGFiYXNlLCBzbyB0aGUgZW1wdHktY2FjaGUgY2FzZSBjYW5ub3QgYmUgcHJvZHVjZWQgb24gYSBSZWRpcyBob2xkaW5nIHJlYWwgZmFjdHM7IHRoYXQgdGVzdCBza2lwcyBhbmQgbmFtZXMgdGhlIGxlZnRvdmVyIGtleXMgcmF0aGVyIHRoYW4gZGVsZXRpbmcgZGF0YSB0aGUgc3VpdGUgZG9lcyBub3Qgb3duLgoKYG1heF9hZ2U9MzAwYCBpcyBwYXNzZWQgZXhwbGljaXRseSBldmVyeXdoZXJlLCBzaW5jZSB0aGUgYHNldHRpbmdzLkZBQ1RTX01BWF9BR0VgIGRlZmF1bHQgb2YgMTIgaG91cnMgd291bGQgdGllIHRoZSBzdGFsZSBjYXNlIHRvIHRoZSBlbnZpcm9ubWVudC4KCiMjIFZlcmlmaWNhdGlvbgoKQWdhaW5zdCBhIHRocm93YXdheSBgcmVkaXM6Ny1hbHBpbmVgOgoKLSBgcHl0ZXN0IHRlc3RzL2ludGVncmF0aW9uL3Rlc3RfZmFjdHMucHlgIOKAlCA2IHBhc3NlZCwgcnVuIHR3aWNlIGluIGEgcm93LCB3aXRoIGBLRVlTICdhbnNpYmxlX2ZhY3RzKidgIGVtcHR5IGFmdGVyd2FyZHMuCi0gV2l0aCBhIGZvcmVpZ24gYGFuc2libGVfZmFjdHNgIGtleSBwcmVzZW50OiB0aGUgZW1wdHktY2FjaGUgdGVzdCBpcyByZXBvcnRlZCBhcyBza2lwcGVkLCB0aGUga2V5IHN1cnZpdmVzLCBhbmQgdGhlIG90aGVyIGZpdmUgdGVzdHMgc3RheSBncmVlbi4KLSBXaXRob3V0IFJlZGlzOiA2IHNraXBwZWQ7IHdpdGggYE9TSVNNX1JFUVVJUkVfUkVESVM9MWAgdGhlIHNlc3Npb24gZXhpdHMgbm9uLXplcm8uCi0gYGJsYWNrIC0tY2hlY2tgIGFuZCBgZmxha2U4YCBhcmUgY2xlYW4uCgpUaHJlZSBtdXRhdGlvbnMgb2YgYGNoZWNrX2Fuc2libGVfZmFjdHMoKWAgd2VyZSBlYWNoIGNhdWdodCBieSB0aGUgbWF0Y2hpbmcgdGVzdCBhbmQgdGhlbiByZXZlcnRlZDogZGlzYWJsaW5nIHRoZSBzdGFsZW5lc3MgY29tcGFyaXNvbiBmYWlsZWQgYHRlc3Rfc3RhbGVfZmFjdHNfcmVwb3J0X3RoZV9zdGFsZV9ob3N0X29ubHlgLCBkb3duZ3JhZGluZyB0aGUgZW1wdHktY2FjaGUgd2FybmluZyBmYWlsZWQgYHRlc3Rfbm9fZmFjdHNfd2FybnNfYWJvdXRfZW1wdHlfY2FjaGVgLCBhbmQgcmVtb3ZpbmcgdGhlIG1pc3NpbmctZXBvY2ggZGVidWcgbGluZSBmYWlsZWQgYHRlc3RfZmFjdHNfd2l0aG91dF9lcG9jaF9hcmVfc2tpcHBlZGAuCgpQYXJ0IG9mICMyNDAwIChUaWVyIDEpLgo=
      patchset: bfc039c6520ebbc7e908c7354810b4ed04be28fa
      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: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: e4d4a58b0f06a4256f829b76b26e6af71a1f71cb
          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: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/build.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: e4d4a58b0f06a4256f829b76b26e6af71a1f71cb
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2549/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
