all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe49:3a70
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 459919a6-48ee-435b-8837-3fa07abc796c
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe49:3a70
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.20
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.248
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe49:3a70
        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 mypy explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#42>'
      - '<Job mypy explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 6a70297178fd40b295eb95c033c8b446
      build_refs:
      - branch: main
        change: '2577'
        change_message: "tests: cover interface resolution against real Ansible\n\nThe
          unit tests for `get_rabbitmq_node_addresses()` replace both `subprocess`
          and the Redis client, so what they verify is the *shape of the calls* the
          function makes. That is a poor fit for the part of it that matters most:
          the value it resolves, `internal_interface`, is frequently Jinja-valued,
          and its meaning is defined by Ansible's templating and by how Ansible names
          interface facts. A mock cannot speak for either, so those tests pass whether
          or not the resolution agrees with Ansible.\n\nThis adds integration tests
          that drive the **public** function with the real collaborators \u2014 a
          live Redis holding the cached facts, an inventory on disk, and the real
          ansible binaries \u2014 and deletes the unit tests they supersede:\n\n|
          retired unit test | replaced by |\n|---|---|\n| literal interface | `test_literal_interface`
          |\n| Jinja resolved from facts | `test_fact_derived_interface` |\n| interface
          name \u2192 fact key | `test_dotted_interface_name`, `test_dashed_interface_name`
          |\n| no `internal_interface` | `test_missing_internal_interface_yields_no_addresses`
          |\n| no fact for the interface | `test_interface_without_matching_fact_yields_no_addresses`
          |\n| interface fact without `ipv4` | `test_interface_fact_without_ipv4_yields_no_addresses`
          |\n| `ipv4` without an address | `test_ipv4_without_address_yields_no_addresses`
          |\n\nEach pair covers the same behaviour, one against mocks and one against
          Ansible, so keeping both would only duplicate. The unit tests that remain
          are the ones with no equivalent at this level: the per-host loop, the inventory
          and cache error paths, and the two describing the internals of the resolver
          itself.\n\nBecause these target the public function rather than its internals,
          they keep their meaning across changes to *how* the resolution is implemented
          \u2014 which is the point. They are what will make it visible that the reimplementation
          in the next PR preserves the shapes that already worked.\n\n**One case is
          `xfail(strict=True)`:** an `internal_interface` pointing at an inventory
          variable rather than a fact, which is what was reported in the issue below.
          The current resolver walks dotted paths through the facts only, so it cannot
          resolve it. A strict marker documents the behaviour where the others are
          documented, and forces whatever fixes it to remove the marker \u2014 an
          unexpected pass fails the suite. The suite is green with the xfail present
          (exit code 0).\n\n**CI.** The integration job installs ansible from `requirements.ansible.txt`,
          the file the container image already builds from, so the version under test
          is the version that ships and **no second ansible pin is introduced**. `OSISM_REQUIRE_ANSIBLE`
          makes a missing install fail the job rather than skip every ansible-dependent
          test, mirroring `OSISM_REQUIRE_REDIS`.\n\nAnsible is installed for the integration
          job only, because that is the only job that needs it \u2014 the unit tests
          mock the subprocess away.\n\nDocuments the bug reported in:\n\n- osism/issues#1425\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2577
        commit_id: 4ef3873df08963c8d28d25a82824b62c316f6512
        patchset: 4ef3873df08963c8d28d25a82824b62c316f6512
        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: 5cd6746ff6744f4dab919db6a7cd198f
      buildset_refs:
      - branch: main
        change: '2577'
        change_message: "tests: cover interface resolution against real Ansible\n\nThe
          unit tests for `get_rabbitmq_node_addresses()` replace both `subprocess`
          and the Redis client, so what they verify is the *shape of the calls* the
          function makes. That is a poor fit for the part of it that matters most:
          the value it resolves, `internal_interface`, is frequently Jinja-valued,
          and its meaning is defined by Ansible's templating and by how Ansible names
          interface facts. A mock cannot speak for either, so those tests pass whether
          or not the resolution agrees with Ansible.\n\nThis adds integration tests
          that drive the **public** function with the real collaborators \u2014 a
          live Redis holding the cached facts, an inventory on disk, and the real
          ansible binaries \u2014 and deletes the unit tests they supersede:\n\n|
          retired unit test | replaced by |\n|---|---|\n| literal interface | `test_literal_interface`
          |\n| Jinja resolved from facts | `test_fact_derived_interface` |\n| interface
          name \u2192 fact key | `test_dotted_interface_name`, `test_dashed_interface_name`
          |\n| no `internal_interface` | `test_missing_internal_interface_yields_no_addresses`
          |\n| no fact for the interface | `test_interface_without_matching_fact_yields_no_addresses`
          |\n| interface fact without `ipv4` | `test_interface_fact_without_ipv4_yields_no_addresses`
          |\n| `ipv4` without an address | `test_ipv4_without_address_yields_no_addresses`
          |\n\nEach pair covers the same behaviour, one against mocks and one against
          Ansible, so keeping both would only duplicate. The unit tests that remain
          are the ones with no equivalent at this level: the per-host loop, the inventory
          and cache error paths, and the two describing the internals of the resolver
          itself.\n\nBecause these target the public function rather than its internals,
          they keep their meaning across changes to *how* the resolution is implemented
          \u2014 which is the point. They are what will make it visible that the reimplementation
          in the next PR preserves the shapes that already worked.\n\n**One case is
          `xfail(strict=True)`:** an `internal_interface` pointing at an inventory
          variable rather than a fact, which is what was reported in the issue below.
          The current resolver walks dotted paths through the facts only, so it cannot
          resolve it. A strict marker documents the behaviour where the others are
          documented, and forces whatever fixes it to remove the marker \u2014 an
          unexpected pass fails the suite. The suite is green with the xfail present
          (exit code 0).\n\n**CI.** The integration job installs ansible from `requirements.ansible.txt`,
          the file the container image already builds from, so the version under test
          is the version that ships and **no second ansible pin is introduced**. `OSISM_REQUIRE_ANSIBLE`
          makes a missing install fail the job rather than skip every ansible-dependent
          test, mirroring `OSISM_REQUIRE_REDIS`.\n\nAnsible is installed for the integration
          job only, because that is the only job that needs it \u2014 the unit tests
          mock the subprocess away.\n\nDocuments the bug reported in:\n\n- osism/issues#1425\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2577
        commit_id: 4ef3873df08963c8d28d25a82824b62c316f6512
        patchset: 4ef3873df08963c8d28d25a82824b62c316f6512
        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: '2577'
      change_message: "tests: cover interface resolution against real Ansible\n\nThe
        unit tests for `get_rabbitmq_node_addresses()` replace both `subprocess` and
        the Redis client, so what they verify is the *shape of the calls* the function
        makes. That is a poor fit for the part of it that matters most: the value
        it resolves, `internal_interface`, is frequently Jinja-valued, and its meaning
        is defined by Ansible's templating and by how Ansible names interface facts.
        A mock cannot speak for either, so those tests pass whether or not the resolution
        agrees with Ansible.\n\nThis adds integration tests that drive the **public**
        function with the real collaborators \u2014 a live Redis holding the cached
        facts, an inventory on disk, and the real ansible binaries \u2014 and deletes
        the unit tests they supersede:\n\n| retired unit test | replaced by |\n|---|---|\n|
        literal interface | `test_literal_interface` |\n| Jinja resolved from facts
        | `test_fact_derived_interface` |\n| interface name \u2192 fact key | `test_dotted_interface_name`,
        `test_dashed_interface_name` |\n| no `internal_interface` | `test_missing_internal_interface_yields_no_addresses`
        |\n| no fact for the interface | `test_interface_without_matching_fact_yields_no_addresses`
        |\n| interface fact without `ipv4` | `test_interface_fact_without_ipv4_yields_no_addresses`
        |\n| `ipv4` without an address | `test_ipv4_without_address_yields_no_addresses`
        |\n\nEach pair covers the same behaviour, one against mocks and one against
        Ansible, so keeping both would only duplicate. The unit tests that remain
        are the ones with no equivalent at this level: the per-host loop, the inventory
        and cache error paths, and the two describing the internals of the resolver
        itself.\n\nBecause these target the public function rather than its internals,
        they keep their meaning across changes to *how* the resolution is implemented
        \u2014 which is the point. They are what will make it visible that the reimplementation
        in the next PR preserves the shapes that already worked.\n\n**One case is
        `xfail(strict=True)`:** an `internal_interface` pointing at an inventory variable
        rather than a fact, which is what was reported in the issue below. The current
        resolver walks dotted paths through the facts only, so it cannot resolve it.
        A strict marker documents the behaviour where the others are documented, and
        forces whatever fixes it to remove the marker \u2014 an unexpected pass fails
        the suite. The suite is green with the xfail present (exit code 0).\n\n**CI.**
        The integration job installs ansible from `requirements.ansible.txt`, the
        file the container image already builds from, so the version under test is
        the version that ships and **no second ansible pin is introduced**. `OSISM_REQUIRE_ANSIBLE`
        makes a missing install fail the job rather than skip every ansible-dependent
        test, mirroring `OSISM_REQUIRE_REDIS`.\n\nAnsible is installed for the integration
        job only, because that is the only job that needs it \u2014 the unit tests
        mock the subprocess away.\n\nDocuments the bug reported in:\n\n- osism/issues#1425\n\n\U0001F916
        Generated with [Claude Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/python-osism/pull/2577
      child_jobs: []
      commit_id: 4ef3873df08963c8d28d25a82824b62c316f6512
      event_id: 63f70f90-922f-11f1-8b3f-e851b71300d0
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/6a70297178fd40b295eb95c033c8b446/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/6a70297178fd40b295eb95c033c8b446/work/logs
        result_data_file: /var/lib/zuul/builds/6a70297178fd40b295eb95c033c8b446/work/results.json
        src_root: /var/lib/zuul/builds/6a70297178fd40b295eb95c033c8b446/work/src
        work_root: /var/lib/zuul/builds/6a70297178fd40b295eb95c033c8b446/work
      include_vars: []
      items:
      - branch: main
        change: '2577'
        change_message: "tests: cover interface resolution against real Ansible\n\nThe
          unit tests for `get_rabbitmq_node_addresses()` replace both `subprocess`
          and the Redis client, so what they verify is the *shape of the calls* the
          function makes. That is a poor fit for the part of it that matters most:
          the value it resolves, `internal_interface`, is frequently Jinja-valued,
          and its meaning is defined by Ansible's templating and by how Ansible names
          interface facts. A mock cannot speak for either, so those tests pass whether
          or not the resolution agrees with Ansible.\n\nThis adds integration tests
          that drive the **public** function with the real collaborators \u2014 a
          live Redis holding the cached facts, an inventory on disk, and the real
          ansible binaries \u2014 and deletes the unit tests they supersede:\n\n|
          retired unit test | replaced by |\n|---|---|\n| literal interface | `test_literal_interface`
          |\n| Jinja resolved from facts | `test_fact_derived_interface` |\n| interface
          name \u2192 fact key | `test_dotted_interface_name`, `test_dashed_interface_name`
          |\n| no `internal_interface` | `test_missing_internal_interface_yields_no_addresses`
          |\n| no fact for the interface | `test_interface_without_matching_fact_yields_no_addresses`
          |\n| interface fact without `ipv4` | `test_interface_fact_without_ipv4_yields_no_addresses`
          |\n| `ipv4` without an address | `test_ipv4_without_address_yields_no_addresses`
          |\n\nEach pair covers the same behaviour, one against mocks and one against
          Ansible, so keeping both would only duplicate. The unit tests that remain
          are the ones with no equivalent at this level: the per-host loop, the inventory
          and cache error paths, and the two describing the internals of the resolver
          itself.\n\nBecause these target the public function rather than its internals,
          they keep their meaning across changes to *how* the resolution is implemented
          \u2014 which is the point. They are what will make it visible that the reimplementation
          in the next PR preserves the shapes that already worked.\n\n**One case is
          `xfail(strict=True)`:** an `internal_interface` pointing at an inventory
          variable rather than a fact, which is what was reported in the issue below.
          The current resolver walks dotted paths through the facts only, so it cannot
          resolve it. A strict marker documents the behaviour where the others are
          documented, and forces whatever fixes it to remove the marker \u2014 an
          unexpected pass fails the suite. The suite is green with the xfail present
          (exit code 0).\n\n**CI.** The integration job installs ansible from `requirements.ansible.txt`,
          the file the container image already builds from, so the version under test
          is the version that ships and **no second ansible pin is introduced**. `OSISM_REQUIRE_ANSIBLE`
          makes a missing install fail the job rather than skip every ansible-dependent
          test, mirroring `OSISM_REQUIRE_REDIS`.\n\nAnsible is installed for the integration
          job only, because that is the only job that needs it \u2014 the unit tests
          mock the subprocess away.\n\nDocuments the bug reported in:\n\n- osism/issues#1425\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/python-osism/pull/2577
        commit_id: 4ef3873df08963c8d28d25a82824b62c316f6512
        patchset: 4ef3873df08963c8d28d25a82824b62c316f6512
        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: mypy
      jobtags: []
      max_attempts: 3
      message: dGVzdHM6IGNvdmVyIGludGVyZmFjZSByZXNvbHV0aW9uIGFnYWluc3QgcmVhbCBBbnNpYmxlCgpUaGUgdW5pdCB0ZXN0cyBmb3IgYGdldF9yYWJiaXRtcV9ub2RlX2FkZHJlc3NlcygpYCByZXBsYWNlIGJvdGggYHN1YnByb2Nlc3NgIGFuZCB0aGUgUmVkaXMgY2xpZW50LCBzbyB3aGF0IHRoZXkgdmVyaWZ5IGlzIHRoZSAqc2hhcGUgb2YgdGhlIGNhbGxzKiB0aGUgZnVuY3Rpb24gbWFrZXMuIFRoYXQgaXMgYSBwb29yIGZpdCBmb3IgdGhlIHBhcnQgb2YgaXQgdGhhdCBtYXR0ZXJzIG1vc3Q6IHRoZSB2YWx1ZSBpdCByZXNvbHZlcywgYGludGVybmFsX2ludGVyZmFjZWAsIGlzIGZyZXF1ZW50bHkgSmluamEtdmFsdWVkLCBhbmQgaXRzIG1lYW5pbmcgaXMgZGVmaW5lZCBieSBBbnNpYmxlJ3MgdGVtcGxhdGluZyBhbmQgYnkgaG93IEFuc2libGUgbmFtZXMgaW50ZXJmYWNlIGZhY3RzLiBBIG1vY2sgY2Fubm90IHNwZWFrIGZvciBlaXRoZXIsIHNvIHRob3NlIHRlc3RzIHBhc3Mgd2hldGhlciBvciBub3QgdGhlIHJlc29sdXRpb24gYWdyZWVzIHdpdGggQW5zaWJsZS4KClRoaXMgYWRkcyBpbnRlZ3JhdGlvbiB0ZXN0cyB0aGF0IGRyaXZlIHRoZSAqKnB1YmxpYyoqIGZ1bmN0aW9uIHdpdGggdGhlIHJlYWwgY29sbGFib3JhdG9ycyDigJQgYSBsaXZlIFJlZGlzIGhvbGRpbmcgdGhlIGNhY2hlZCBmYWN0cywgYW4gaW52ZW50b3J5IG9uIGRpc2ssIGFuZCB0aGUgcmVhbCBhbnNpYmxlIGJpbmFyaWVzIOKAlCBhbmQgZGVsZXRlcyB0aGUgdW5pdCB0ZXN0cyB0aGV5IHN1cGVyc2VkZToKCnwgcmV0aXJlZCB1bml0IHRlc3QgfCByZXBsYWNlZCBieSB8CnwtLS18LS0tfAp8IGxpdGVyYWwgaW50ZXJmYWNlIHwgYHRlc3RfbGl0ZXJhbF9pbnRlcmZhY2VgIHwKfCBKaW5qYSByZXNvbHZlZCBmcm9tIGZhY3RzIHwgYHRlc3RfZmFjdF9kZXJpdmVkX2ludGVyZmFjZWAgfAp8IGludGVyZmFjZSBuYW1lIOKGkiBmYWN0IGtleSB8IGB0ZXN0X2RvdHRlZF9pbnRlcmZhY2VfbmFtZWAsIGB0ZXN0X2Rhc2hlZF9pbnRlcmZhY2VfbmFtZWAgfAp8IG5vIGBpbnRlcm5hbF9pbnRlcmZhY2VgIHwgYHRlc3RfbWlzc2luZ19pbnRlcm5hbF9pbnRlcmZhY2VfeWllbGRzX25vX2FkZHJlc3Nlc2AgfAp8IG5vIGZhY3QgZm9yIHRoZSBpbnRlcmZhY2UgfCBgdGVzdF9pbnRlcmZhY2Vfd2l0aG91dF9tYXRjaGluZ19mYWN0X3lpZWxkc19ub19hZGRyZXNzZXNgIHwKfCBpbnRlcmZhY2UgZmFjdCB3aXRob3V0IGBpcHY0YCB8IGB0ZXN0X2ludGVyZmFjZV9mYWN0X3dpdGhvdXRfaXB2NF95aWVsZHNfbm9fYWRkcmVzc2VzYCB8CnwgYGlwdjRgIHdpdGhvdXQgYW4gYWRkcmVzcyB8IGB0ZXN0X2lwdjRfd2l0aG91dF9hZGRyZXNzX3lpZWxkc19ub19hZGRyZXNzZXNgIHwKCkVhY2ggcGFpciBjb3ZlcnMgdGhlIHNhbWUgYmVoYXZpb3VyLCBvbmUgYWdhaW5zdCBtb2NrcyBhbmQgb25lIGFnYWluc3QgQW5zaWJsZSwgc28ga2VlcGluZyBib3RoIHdvdWxkIG9ubHkgZHVwbGljYXRlLiBUaGUgdW5pdCB0ZXN0cyB0aGF0IHJlbWFpbiBhcmUgdGhlIG9uZXMgd2l0aCBubyBlcXVpdmFsZW50IGF0IHRoaXMgbGV2ZWw6IHRoZSBwZXItaG9zdCBsb29wLCB0aGUgaW52ZW50b3J5IGFuZCBjYWNoZSBlcnJvciBwYXRocywgYW5kIHRoZSB0d28gZGVzY3JpYmluZyB0aGUgaW50ZXJuYWxzIG9mIHRoZSByZXNvbHZlciBpdHNlbGYuCgpCZWNhdXNlIHRoZXNlIHRhcmdldCB0aGUgcHVibGljIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGl0cyBpbnRlcm5hbHMsIHRoZXkga2VlcCB0aGVpciBtZWFuaW5nIGFjcm9zcyBjaGFuZ2VzIHRvICpob3cqIHRoZSByZXNvbHV0aW9uIGlzIGltcGxlbWVudGVkIOKAlCB3aGljaCBpcyB0aGUgcG9pbnQuIFRoZXkgYXJlIHdoYXQgd2lsbCBtYWtlIGl0IHZpc2libGUgdGhhdCB0aGUgcmVpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbmV4dCBQUiBwcmVzZXJ2ZXMgdGhlIHNoYXBlcyB0aGF0IGFscmVhZHkgd29ya2VkLgoKKipPbmUgY2FzZSBpcyBgeGZhaWwoc3RyaWN0PVRydWUpYDoqKiBhbiBgaW50ZXJuYWxfaW50ZXJmYWNlYCBwb2ludGluZyBhdCBhbiBpbnZlbnRvcnkgdmFyaWFibGUgcmF0aGVyIHRoYW4gYSBmYWN0LCB3aGljaCBpcyB3aGF0IHdhcyByZXBvcnRlZCBpbiB0aGUgaXNzdWUgYmVsb3cuIFRoZSBjdXJyZW50IHJlc29sdmVyIHdhbGtzIGRvdHRlZCBwYXRocyB0aHJvdWdoIHRoZSBmYWN0cyBvbmx5LCBzbyBpdCBjYW5ub3QgcmVzb2x2ZSBpdC4gQSBzdHJpY3QgbWFya2VyIGRvY3VtZW50cyB0aGUgYmVoYXZpb3VyIHdoZXJlIHRoZSBvdGhlcnMgYXJlIGRvY3VtZW50ZWQsIGFuZCBmb3JjZXMgd2hhdGV2ZXIgZml4ZXMgaXQgdG8gcmVtb3ZlIHRoZSBtYXJrZXIg4oCUIGFuIHVuZXhwZWN0ZWQgcGFzcyBmYWlscyB0aGUgc3VpdGUuIFRoZSBzdWl0ZSBpcyBncmVlbiB3aXRoIHRoZSB4ZmFpbCBwcmVzZW50IChleGl0IGNvZGUgMCkuCgoqKkNJLioqIFRoZSBpbnRlZ3JhdGlvbiBqb2IgaW5zdGFsbHMgYW5zaWJsZSBmcm9tIGByZXF1aXJlbWVudHMuYW5zaWJsZS50eHRgLCB0aGUgZmlsZSB0aGUgY29udGFpbmVyIGltYWdlIGFscmVhZHkgYnVpbGRzIGZyb20sIHNvIHRoZSB2ZXJzaW9uIHVuZGVyIHRlc3QgaXMgdGhlIHZlcnNpb24gdGhhdCBzaGlwcyBhbmQgKipubyBzZWNvbmQgYW5zaWJsZSBwaW4gaXMgaW50cm9kdWNlZCoqLiBgT1NJU01fUkVRVUlSRV9BTlNJQkxFYCBtYWtlcyBhIG1pc3NpbmcgaW5zdGFsbCBmYWlsIHRoZSBqb2IgcmF0aGVyIHRoYW4gc2tpcCBldmVyeSBhbnNpYmxlLWRlcGVuZGVudCB0ZXN0LCBtaXJyb3JpbmcgYE9TSVNNX1JFUVVJUkVfUkVESVNgLgoKQW5zaWJsZSBpcyBpbnN0YWxsZWQgZm9yIHRoZSBpbnRlZ3JhdGlvbiBqb2Igb25seSwgYmVjYXVzZSB0aGF0IGlzIHRoZSBvbmx5IGpvYiB0aGF0IG5lZWRzIGl0IOKAlCB0aGUgdW5pdCB0ZXN0cyBtb2NrIHRoZSBzdWJwcm9jZXNzIGF3YXkuCgpEb2N1bWVudHMgdGhlIGJ1ZyByZXBvcnRlZCBpbjoKCi0gb3Npc20vaXNzdWVzIzE0MjUKCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUpCg==
      patchset: 4ef3873df08963c8d28d25a82824b62c316f6512
      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: b7c70f39598a39998dbbc6f833779355630f3a39
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: b7c70f39598a39998dbbc6f833779355630f3a39
          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
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/mypy/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: d44ff9f04ea9f1f1278452fd295c06762f918003
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2577/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
