all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe9e:d639
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 13d7ad09-27b4-4ab0-b363-948af445484d
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe9e:d639
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.31
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.246
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe9e:d639
        region: null
        slot: null
  vars:
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job python-osism-test-setup explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#128>'
      - '<Job python-osism-test-setup explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 4d3345b1cbbd4e718565bc6f720172f0
      build_refs:
      - branch: main
        change: '2578'
        change_message: "rabbitmq: resolve internal_interface through Ansible\n\nFixes
          the reported bug. Two commits: the reusable helper, then the switch-over.\n\n###
          The bug\n\n`get_rabbitmq_node_addresses()` read `internal_interface` with
          `ansible-inventory --host`, which returns variables *as defined*, so a Jinja-valued
          `internal_interface` came back as the raw `{{ ... }}`. It then resolved
          that by hand: a regex captured the contents of the first `{{ ... }}` and
          the dotted path was walked through the ansible facts.\n\nThat covers exactly
          one shape \u2014 a single expression whose dotted path is rooted in facts,
          i.e. the testbed's `internal_interface: \"{{ ansible_local.testbed_network_devices.management
          }}\"` \u2014 and nothing else:\n\n- An `internal_interface` pointing at
          an **inventory variable** fails, because the walk only looks in the facts:
          `Could not resolve template '{{ some_var }}' from facts for <host>`. This
          is what the reporter hit.\n- A **mixed literal and template** such as `vlan{{
          vlan_id }}` is passed through verbatim, because `re.match` requires `{{`
          at offset 0; the lookup then asks for a fact named `ansible_vlan{{ vlan_id
          }}`.\n- The regex is **unanchored**, so `{{ base }}.100` matches only the
          leading expression and silently discards the `.100` tail, resolving to the
          *wrong interface* \u2014 a wrong answer rather than an error.\n- Filters,
          `hostvars` lookups and `default()` are not evaluated at all.\n\n### The
          fix\n\nDelegate the lookup to Ansible, which is what `osism/defaults` `all/README.md`
          (\"Consuming these values from code\") prescribes for external consumers
          of these variables. The supported set becomes \"whatever Jinja2 supports\"
          instead of a list of anticipated shapes. The resolver goes away, along with
          the subsequent walk from interface name to `ansible_<name>` to `ipv4.address`,
          since the expression covers all of it.\n\n`resolve_in_host_context()` has
          Ansible template the expression and `copy` the result into a file, run with
          `-c local` so the module executes on the controller: no connection is made,
          a node that is down still resolves, and the value is read back byte-exact
          rather than parsed out of human-readable output.\n\nThe package runs under
          more than one ansible-core \u2014 2.19.11 in its own image, 2.18.x in the
          osism-ansible, kolla-ansible and ceph-ansible images \u2014 so the lookup
          avoids every surface where those differ:\n\n- Facts travel as **extra vars**,
          not a fact-cache plugin. The `redis` plugin lives in `community.general`,
          which is not installed here, and a `jsonfile` cache is honoured by an ad-hoc
          lookup on 2.18 but **not** on 2.19.\n- The value comes from a **file**,
          not a callback. Callback wording and stream differ between the two, and
          `--tree` is deprecated for removal in 2.23.\n- Success is decided by the
          **return code**, never by matching an error string: the undefined-variable
          sentinel is `VARIABLE IS NOT DEFINED!` on 2.18 and `<<error1-'x' is undefined>>`
          on 2.19.\n\nThe resolved value is validated as an IPv4 address before use,
          so a non-address string cannot be passed on as one.\n\n### Coverage\n\nThe
          `xfail(strict=True)` case added in the previous PR passes now, so its marker
          goes \u2014 with `strict` set, leaving it would fail the suite on the unexpected
          pass. That transition is the demonstration: the shapes that already worked
          are still covered by the same tests, and the one that did not now passes
          against real Ansible.\n\nThe two remaining unit tests that described only
          the deleted resolver's internals (a facts-walk yielding a non-string, and
          hitting a non-dict) go with the code they covered \u2014 Ansible has no
          such failure modes, so there is nothing to express at the integration level.\n\n**Verification.**
          Against ansible-core 2.18.9 **and** 2.19.11: the reported shape, a dotted
          interface name, a dashed one, the fact-derived shape the old resolver supported,
          and a missing fact.\n\nOne behaviour change for review: a missing `internal_interface`
          is now reported through Ansible's undefined-variable message rather than
          a dedicated one.\n\n`osism status rabbitmq` shares the helper and is fixed
          with it.\n\nFixes:\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/2578
        commit_id: 386e9767517aff6dbfd888e92fcea12629b33268
        patchset: 386e9767517aff6dbfd888e92fcea12629b33268
        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: 997b8a08ca05443189940c3200a17919
      buildset_refs:
      - branch: main
        change: '2578'
        change_message: "rabbitmq: resolve internal_interface through Ansible\n\nFixes
          the reported bug. Two commits: the reusable helper, then the switch-over.\n\n###
          The bug\n\n`get_rabbitmq_node_addresses()` read `internal_interface` with
          `ansible-inventory --host`, which returns variables *as defined*, so a Jinja-valued
          `internal_interface` came back as the raw `{{ ... }}`. It then resolved
          that by hand: a regex captured the contents of the first `{{ ... }}` and
          the dotted path was walked through the ansible facts.\n\nThat covers exactly
          one shape \u2014 a single expression whose dotted path is rooted in facts,
          i.e. the testbed's `internal_interface: \"{{ ansible_local.testbed_network_devices.management
          }}\"` \u2014 and nothing else:\n\n- An `internal_interface` pointing at
          an **inventory variable** fails, because the walk only looks in the facts:
          `Could not resolve template '{{ some_var }}' from facts for <host>`. This
          is what the reporter hit.\n- A **mixed literal and template** such as `vlan{{
          vlan_id }}` is passed through verbatim, because `re.match` requires `{{`
          at offset 0; the lookup then asks for a fact named `ansible_vlan{{ vlan_id
          }}`.\n- The regex is **unanchored**, so `{{ base }}.100` matches only the
          leading expression and silently discards the `.100` tail, resolving to the
          *wrong interface* \u2014 a wrong answer rather than an error.\n- Filters,
          `hostvars` lookups and `default()` are not evaluated at all.\n\n### The
          fix\n\nDelegate the lookup to Ansible, which is what `osism/defaults` `all/README.md`
          (\"Consuming these values from code\") prescribes for external consumers
          of these variables. The supported set becomes \"whatever Jinja2 supports\"
          instead of a list of anticipated shapes. The resolver goes away, along with
          the subsequent walk from interface name to `ansible_<name>` to `ipv4.address`,
          since the expression covers all of it.\n\n`resolve_in_host_context()` has
          Ansible template the expression and `copy` the result into a file, run with
          `-c local` so the module executes on the controller: no connection is made,
          a node that is down still resolves, and the value is read back byte-exact
          rather than parsed out of human-readable output.\n\nThe package runs under
          more than one ansible-core \u2014 2.19.11 in its own image, 2.18.x in the
          osism-ansible, kolla-ansible and ceph-ansible images \u2014 so the lookup
          avoids every surface where those differ:\n\n- Facts travel as **extra vars**,
          not a fact-cache plugin. The `redis` plugin lives in `community.general`,
          which is not installed here, and a `jsonfile` cache is honoured by an ad-hoc
          lookup on 2.18 but **not** on 2.19.\n- The value comes from a **file**,
          not a callback. Callback wording and stream differ between the two, and
          `--tree` is deprecated for removal in 2.23.\n- Success is decided by the
          **return code**, never by matching an error string: the undefined-variable
          sentinel is `VARIABLE IS NOT DEFINED!` on 2.18 and `<<error1-'x' is undefined>>`
          on 2.19.\n\nThe resolved value is validated as an IPv4 address before use,
          so a non-address string cannot be passed on as one.\n\n### Coverage\n\nThe
          `xfail(strict=True)` case added in the previous PR passes now, so its marker
          goes \u2014 with `strict` set, leaving it would fail the suite on the unexpected
          pass. That transition is the demonstration: the shapes that already worked
          are still covered by the same tests, and the one that did not now passes
          against real Ansible.\n\nThe two remaining unit tests that described only
          the deleted resolver's internals (a facts-walk yielding a non-string, and
          hitting a non-dict) go with the code they covered \u2014 Ansible has no
          such failure modes, so there is nothing to express at the integration level.\n\n**Verification.**
          Against ansible-core 2.18.9 **and** 2.19.11: the reported shape, a dotted
          interface name, a dashed one, the fact-derived shape the old resolver supported,
          and a missing fact.\n\nOne behaviour change for review: a missing `internal_interface`
          is now reported through Ansible's undefined-variable message rather than
          a dedicated one.\n\n`osism status rabbitmq` shares the helper and is fixed
          with it.\n\nFixes:\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/2578
        commit_id: 386e9767517aff6dbfd888e92fcea12629b33268
        patchset: 386e9767517aff6dbfd888e92fcea12629b33268
        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: '2578'
      change_message: "rabbitmq: resolve internal_interface through Ansible\n\nFixes
        the reported bug. Two commits: the reusable helper, then the switch-over.\n\n###
        The bug\n\n`get_rabbitmq_node_addresses()` read `internal_interface` with
        `ansible-inventory --host`, which returns variables *as defined*, so a Jinja-valued
        `internal_interface` came back as the raw `{{ ... }}`. It then resolved that
        by hand: a regex captured the contents of the first `{{ ... }}` and the dotted
        path was walked through the ansible facts.\n\nThat covers exactly one shape
        \u2014 a single expression whose dotted path is rooted in facts, i.e. the
        testbed's `internal_interface: \"{{ ansible_local.testbed_network_devices.management
        }}\"` \u2014 and nothing else:\n\n- An `internal_interface` pointing at an
        **inventory variable** fails, because the walk only looks in the facts: `Could
        not resolve template '{{ some_var }}' from facts for <host>`. This is what
        the reporter hit.\n- A **mixed literal and template** such as `vlan{{ vlan_id
        }}` is passed through verbatim, because `re.match` requires `{{` at offset
        0; the lookup then asks for a fact named `ansible_vlan{{ vlan_id }}`.\n- The
        regex is **unanchored**, so `{{ base }}.100` matches only the leading expression
        and silently discards the `.100` tail, resolving to the *wrong interface*
        \u2014 a wrong answer rather than an error.\n- Filters, `hostvars` lookups
        and `default()` are not evaluated at all.\n\n### The fix\n\nDelegate the lookup
        to Ansible, which is what `osism/defaults` `all/README.md` (\"Consuming these
        values from code\") prescribes for external consumers of these variables.
        The supported set becomes \"whatever Jinja2 supports\" instead of a list of
        anticipated shapes. The resolver goes away, along with the subsequent walk
        from interface name to `ansible_<name>` to `ipv4.address`, since the expression
        covers all of it.\n\n`resolve_in_host_context()` has Ansible template the
        expression and `copy` the result into a file, run with `-c local` so the module
        executes on the controller: no connection is made, a node that is down still
        resolves, and the value is read back byte-exact rather than parsed out of
        human-readable output.\n\nThe package runs under more than one ansible-core
        \u2014 2.19.11 in its own image, 2.18.x in the osism-ansible, kolla-ansible
        and ceph-ansible images \u2014 so the lookup avoids every surface where those
        differ:\n\n- Facts travel as **extra vars**, not a fact-cache plugin. The
        `redis` plugin lives in `community.general`, which is not installed here,
        and a `jsonfile` cache is honoured by an ad-hoc lookup on 2.18 but **not**
        on 2.19.\n- The value comes from a **file**, not a callback. Callback wording
        and stream differ between the two, and `--tree` is deprecated for removal
        in 2.23.\n- Success is decided by the **return code**, never by matching an
        error string: the undefined-variable sentinel is `VARIABLE IS NOT DEFINED!`
        on 2.18 and `<<error1-'x' is undefined>>` on 2.19.\n\nThe resolved value is
        validated as an IPv4 address before use, so a non-address string cannot be
        passed on as one.\n\n### Coverage\n\nThe `xfail(strict=True)` case added in
        the previous PR passes now, so its marker goes \u2014 with `strict` set, leaving
        it would fail the suite on the unexpected pass. That transition is the demonstration:
        the shapes that already worked are still covered by the same tests, and the
        one that did not now passes against real Ansible.\n\nThe two remaining unit
        tests that described only the deleted resolver's internals (a facts-walk yielding
        a non-string, and hitting a non-dict) go with the code they covered \u2014
        Ansible has no such failure modes, so there is nothing to express at the integration
        level.\n\n**Verification.** Against ansible-core 2.18.9 **and** 2.19.11: the
        reported shape, a dotted interface name, a dashed one, the fact-derived shape
        the old resolver supported, and a missing fact.\n\nOne behaviour change for
        review: a missing `internal_interface` is now reported through Ansible's undefined-variable
        message rather than a dedicated one.\n\n`osism status rabbitmq` shares the
        helper and is fixed with it.\n\nFixes:\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/2578
      child_jobs: []
      commit_id: 386e9767517aff6dbfd888e92fcea12629b33268
      event_id: a8244320-924a-11f1-83e3-35e683bfabd4
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/4d3345b1cbbd4e718565bc6f720172f0/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/4d3345b1cbbd4e718565bc6f720172f0/work/logs
        result_data_file: /var/lib/zuul/builds/4d3345b1cbbd4e718565bc6f720172f0/work/results.json
        src_root: /var/lib/zuul/builds/4d3345b1cbbd4e718565bc6f720172f0/work/src
        work_root: /var/lib/zuul/builds/4d3345b1cbbd4e718565bc6f720172f0/work
      include_vars: []
      items:
      - branch: main
        change: '2578'
        change_message: "rabbitmq: resolve internal_interface through Ansible\n\nFixes
          the reported bug. Two commits: the reusable helper, then the switch-over.\n\n###
          The bug\n\n`get_rabbitmq_node_addresses()` read `internal_interface` with
          `ansible-inventory --host`, which returns variables *as defined*, so a Jinja-valued
          `internal_interface` came back as the raw `{{ ... }}`. It then resolved
          that by hand: a regex captured the contents of the first `{{ ... }}` and
          the dotted path was walked through the ansible facts.\n\nThat covers exactly
          one shape \u2014 a single expression whose dotted path is rooted in facts,
          i.e. the testbed's `internal_interface: \"{{ ansible_local.testbed_network_devices.management
          }}\"` \u2014 and nothing else:\n\n- An `internal_interface` pointing at
          an **inventory variable** fails, because the walk only looks in the facts:
          `Could not resolve template '{{ some_var }}' from facts for <host>`. This
          is what the reporter hit.\n- A **mixed literal and template** such as `vlan{{
          vlan_id }}` is passed through verbatim, because `re.match` requires `{{`
          at offset 0; the lookup then asks for a fact named `ansible_vlan{{ vlan_id
          }}`.\n- The regex is **unanchored**, so `{{ base }}.100` matches only the
          leading expression and silently discards the `.100` tail, resolving to the
          *wrong interface* \u2014 a wrong answer rather than an error.\n- Filters,
          `hostvars` lookups and `default()` are not evaluated at all.\n\n### The
          fix\n\nDelegate the lookup to Ansible, which is what `osism/defaults` `all/README.md`
          (\"Consuming these values from code\") prescribes for external consumers
          of these variables. The supported set becomes \"whatever Jinja2 supports\"
          instead of a list of anticipated shapes. The resolver goes away, along with
          the subsequent walk from interface name to `ansible_<name>` to `ipv4.address`,
          since the expression covers all of it.\n\n`resolve_in_host_context()` has
          Ansible template the expression and `copy` the result into a file, run with
          `-c local` so the module executes on the controller: no connection is made,
          a node that is down still resolves, and the value is read back byte-exact
          rather than parsed out of human-readable output.\n\nThe package runs under
          more than one ansible-core \u2014 2.19.11 in its own image, 2.18.x in the
          osism-ansible, kolla-ansible and ceph-ansible images \u2014 so the lookup
          avoids every surface where those differ:\n\n- Facts travel as **extra vars**,
          not a fact-cache plugin. The `redis` plugin lives in `community.general`,
          which is not installed here, and a `jsonfile` cache is honoured by an ad-hoc
          lookup on 2.18 but **not** on 2.19.\n- The value comes from a **file**,
          not a callback. Callback wording and stream differ between the two, and
          `--tree` is deprecated for removal in 2.23.\n- Success is decided by the
          **return code**, never by matching an error string: the undefined-variable
          sentinel is `VARIABLE IS NOT DEFINED!` on 2.18 and `<<error1-'x' is undefined>>`
          on 2.19.\n\nThe resolved value is validated as an IPv4 address before use,
          so a non-address string cannot be passed on as one.\n\n### Coverage\n\nThe
          `xfail(strict=True)` case added in the previous PR passes now, so its marker
          goes \u2014 with `strict` set, leaving it would fail the suite on the unexpected
          pass. That transition is the demonstration: the shapes that already worked
          are still covered by the same tests, and the one that did not now passes
          against real Ansible.\n\nThe two remaining unit tests that described only
          the deleted resolver's internals (a facts-walk yielding a non-string, and
          hitting a non-dict) go with the code they covered \u2014 Ansible has no
          such failure modes, so there is nothing to express at the integration level.\n\n**Verification.**
          Against ansible-core 2.18.9 **and** 2.19.11: the reported shape, a dotted
          interface name, a dashed one, the fact-derived shape the old resolver supported,
          and a missing fact.\n\nOne behaviour change for review: a missing `internal_interface`
          is now reported through Ansible's undefined-variable message rather than
          a dedicated one.\n\n`osism status rabbitmq` shares the helper and is fixed
          with it.\n\nFixes:\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/2578
        commit_id: 386e9767517aff6dbfd888e92fcea12629b33268
        patchset: 386e9767517aff6dbfd888e92fcea12629b33268
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
        topic: null
      job: python-osism-test-setup
      jobtags: []
      max_attempts: 3
      message: cmFiYml0bXE6IHJlc29sdmUgaW50ZXJuYWxfaW50ZXJmYWNlIHRocm91Z2ggQW5zaWJsZQoKRml4ZXMgdGhlIHJlcG9ydGVkIGJ1Zy4gVHdvIGNvbW1pdHM6IHRoZSByZXVzYWJsZSBoZWxwZXIsIHRoZW4gdGhlIHN3aXRjaC1vdmVyLgoKIyMjIFRoZSBidWcKCmBnZXRfcmFiYml0bXFfbm9kZV9hZGRyZXNzZXMoKWAgcmVhZCBgaW50ZXJuYWxfaW50ZXJmYWNlYCB3aXRoIGBhbnNpYmxlLWludmVudG9yeSAtLWhvc3RgLCB3aGljaCByZXR1cm5zIHZhcmlhYmxlcyAqYXMgZGVmaW5lZCosIHNvIGEgSmluamEtdmFsdWVkIGBpbnRlcm5hbF9pbnRlcmZhY2VgIGNhbWUgYmFjayBhcyB0aGUgcmF3IGB7eyAuLi4gfX1gLiBJdCB0aGVuIHJlc29sdmVkIHRoYXQgYnkgaGFuZDogYSByZWdleCBjYXB0dXJlZCB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IGB7eyAuLi4gfX1gIGFuZCB0aGUgZG90dGVkIHBhdGggd2FzIHdhbGtlZCB0aHJvdWdoIHRoZSBhbnNpYmxlIGZhY3RzLgoKVGhhdCBjb3ZlcnMgZXhhY3RseSBvbmUgc2hhcGUg4oCUIGEgc2luZ2xlIGV4cHJlc3Npb24gd2hvc2UgZG90dGVkIHBhdGggaXMgcm9vdGVkIGluIGZhY3RzLCBpLmUuIHRoZSB0ZXN0YmVkJ3MgYGludGVybmFsX2ludGVyZmFjZTogInt7IGFuc2libGVfbG9jYWwudGVzdGJlZF9uZXR3b3JrX2RldmljZXMubWFuYWdlbWVudCB9fSJgIOKAlCBhbmQgbm90aGluZyBlbHNlOgoKLSBBbiBgaW50ZXJuYWxfaW50ZXJmYWNlYCBwb2ludGluZyBhdCBhbiAqKmludmVudG9yeSB2YXJpYWJsZSoqIGZhaWxzLCBiZWNhdXNlIHRoZSB3YWxrIG9ubHkgbG9va3MgaW4gdGhlIGZhY3RzOiBgQ291bGQgbm90IHJlc29sdmUgdGVtcGxhdGUgJ3t7IHNvbWVfdmFyIH19JyBmcm9tIGZhY3RzIGZvciA8aG9zdD5gLiBUaGlzIGlzIHdoYXQgdGhlIHJlcG9ydGVyIGhpdC4KLSBBICoqbWl4ZWQgbGl0ZXJhbCBhbmQgdGVtcGxhdGUqKiBzdWNoIGFzIGB2bGFue3sgdmxhbl9pZCB9fWAgaXMgcGFzc2VkIHRocm91Z2ggdmVyYmF0aW0sIGJlY2F1c2UgYHJlLm1hdGNoYCByZXF1aXJlcyBge3tgIGF0IG9mZnNldCAwOyB0aGUgbG9va3VwIHRoZW4gYXNrcyBmb3IgYSBmYWN0IG5hbWVkIGBhbnNpYmxlX3ZsYW57eyB2bGFuX2lkIH19YC4KLSBUaGUgcmVnZXggaXMgKip1bmFuY2hvcmVkKiosIHNvIGB7eyBiYXNlIH19LjEwMGAgbWF0Y2hlcyBvbmx5IHRoZSBsZWFkaW5nIGV4cHJlc3Npb24gYW5kIHNpbGVudGx5IGRpc2NhcmRzIHRoZSBgLjEwMGAgdGFpbCwgcmVzb2x2aW5nIHRvIHRoZSAqd3JvbmcgaW50ZXJmYWNlKiDigJQgYSB3cm9uZyBhbnN3ZXIgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCi0gRmlsdGVycywgYGhvc3R2YXJzYCBsb29rdXBzIGFuZCBgZGVmYXVsdCgpYCBhcmUgbm90IGV2YWx1YXRlZCBhdCBhbGwuCgojIyMgVGhlIGZpeAoKRGVsZWdhdGUgdGhlIGxvb2t1cCB0byBBbnNpYmxlLCB3aGljaCBpcyB3aGF0IGBvc2lzbS9kZWZhdWx0c2AgYGFsbC9SRUFETUUubWRgICgiQ29uc3VtaW5nIHRoZXNlIHZhbHVlcyBmcm9tIGNvZGUiKSBwcmVzY3JpYmVzIGZvciBleHRlcm5hbCBjb25zdW1lcnMgb2YgdGhlc2UgdmFyaWFibGVzLiBUaGUgc3VwcG9ydGVkIHNldCBiZWNvbWVzICJ3aGF0ZXZlciBKaW5qYTIgc3VwcG9ydHMiIGluc3RlYWQgb2YgYSBsaXN0IG9mIGFudGljaXBhdGVkIHNoYXBlcy4gVGhlIHJlc29sdmVyIGdvZXMgYXdheSwgYWxvbmcgd2l0aCB0aGUgc3Vic2VxdWVudCB3YWxrIGZyb20gaW50ZXJmYWNlIG5hbWUgdG8gYGFuc2libGVfPG5hbWU+YCB0byBgaXB2NC5hZGRyZXNzYCwgc2luY2UgdGhlIGV4cHJlc3Npb24gY292ZXJzIGFsbCBvZiBpdC4KCmByZXNvbHZlX2luX2hvc3RfY29udGV4dCgpYCBoYXMgQW5zaWJsZSB0ZW1wbGF0ZSB0aGUgZXhwcmVzc2lvbiBhbmQgYGNvcHlgIHRoZSByZXN1bHQgaW50byBhIGZpbGUsIHJ1biB3aXRoIGAtYyBsb2NhbGAgc28gdGhlIG1vZHVsZSBleGVjdXRlcyBvbiB0aGUgY29udHJvbGxlcjogbm8gY29ubmVjdGlvbiBpcyBtYWRlLCBhIG5vZGUgdGhhdCBpcyBkb3duIHN0aWxsIHJlc29sdmVzLCBhbmQgdGhlIHZhbHVlIGlzIHJlYWQgYmFjayBieXRlLWV4YWN0IHJhdGhlciB0aGFuIHBhcnNlZCBvdXQgb2YgaHVtYW4tcmVhZGFibGUgb3V0cHV0LgoKVGhlIHBhY2thZ2UgcnVucyB1bmRlciBtb3JlIHRoYW4gb25lIGFuc2libGUtY29yZSDigJQgMi4xOS4xMSBpbiBpdHMgb3duIGltYWdlLCAyLjE4LnggaW4gdGhlIG9zaXNtLWFuc2libGUsIGtvbGxhLWFuc2libGUgYW5kIGNlcGgtYW5zaWJsZSBpbWFnZXMg4oCUIHNvIHRoZSBsb29rdXAgYXZvaWRzIGV2ZXJ5IHN1cmZhY2Ugd2hlcmUgdGhvc2UgZGlmZmVyOgoKLSBGYWN0cyB0cmF2ZWwgYXMgKipleHRyYSB2YXJzKiosIG5vdCBhIGZhY3QtY2FjaGUgcGx1Z2luLiBUaGUgYHJlZGlzYCBwbHVnaW4gbGl2ZXMgaW4gYGNvbW11bml0eS5nZW5lcmFsYCwgd2hpY2ggaXMgbm90IGluc3RhbGxlZCBoZXJlLCBhbmQgYSBganNvbmZpbGVgIGNhY2hlIGlzIGhvbm91cmVkIGJ5IGFuIGFkLWhvYyBsb29rdXAgb24gMi4xOCBidXQgKipub3QqKiBvbiAyLjE5LgotIFRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgKipmaWxlKiosIG5vdCBhIGNhbGxiYWNrLiBDYWxsYmFjayB3b3JkaW5nIGFuZCBzdHJlYW0gZGlmZmVyIGJldHdlZW4gdGhlIHR3bywgYW5kIGAtLXRyZWVgIGlzIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwgaW4gMi4yMy4KLSBTdWNjZXNzIGlzIGRlY2lkZWQgYnkgdGhlICoqcmV0dXJuIGNvZGUqKiwgbmV2ZXIgYnkgbWF0Y2hpbmcgYW4gZXJyb3Igc3RyaW5nOiB0aGUgdW5kZWZpbmVkLXZhcmlhYmxlIHNlbnRpbmVsIGlzIGBWQVJJQUJMRSBJUyBOT1QgREVGSU5FRCFgIG9uIDIuMTggYW5kIGA8PGVycm9yMS0neCcgaXMgdW5kZWZpbmVkPj5gIG9uIDIuMTkuCgpUaGUgcmVzb2x2ZWQgdmFsdWUgaXMgdmFsaWRhdGVkIGFzIGFuIElQdjQgYWRkcmVzcyBiZWZvcmUgdXNlLCBzbyBhIG5vbi1hZGRyZXNzIHN0cmluZyBjYW5ub3QgYmUgcGFzc2VkIG9uIGFzIG9uZS4KCiMjIyBDb3ZlcmFnZQoKVGhlIGB4ZmFpbChzdHJpY3Q9VHJ1ZSlgIGNhc2UgYWRkZWQgaW4gdGhlIHByZXZpb3VzIFBSIHBhc3NlcyBub3csIHNvIGl0cyBtYXJrZXIgZ29lcyDigJQgd2l0aCBgc3RyaWN0YCBzZXQsIGxlYXZpbmcgaXQgd291bGQgZmFpbCB0aGUgc3VpdGUgb24gdGhlIHVuZXhwZWN0ZWQgcGFzcy4gVGhhdCB0cmFuc2l0aW9uIGlzIHRoZSBkZW1vbnN0cmF0aW9uOiB0aGUgc2hhcGVzIHRoYXQgYWxyZWFkeSB3b3JrZWQgYXJlIHN0aWxsIGNvdmVyZWQgYnkgdGhlIHNhbWUgdGVzdHMsIGFuZCB0aGUgb25lIHRoYXQgZGlkIG5vdCBub3cgcGFzc2VzIGFnYWluc3QgcmVhbCBBbnNpYmxlLgoKVGhlIHR3byByZW1haW5pbmcgdW5pdCB0ZXN0cyB0aGF0IGRlc2NyaWJlZCBvbmx5IHRoZSBkZWxldGVkIHJlc29sdmVyJ3MgaW50ZXJuYWxzIChhIGZhY3RzLXdhbGsgeWllbGRpbmcgYSBub24tc3RyaW5nLCBhbmQgaGl0dGluZyBhIG5vbi1kaWN0KSBnbyB3aXRoIHRoZSBjb2RlIHRoZXkgY292ZXJlZCDigJQgQW5zaWJsZSBoYXMgbm8gc3VjaCBmYWlsdXJlIG1vZGVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGV4cHJlc3MgYXQgdGhlIGludGVncmF0aW9uIGxldmVsLgoKKipWZXJpZmljYXRpb24uKiogQWdhaW5zdCBhbnNpYmxlLWNvcmUgMi4xOC45ICoqYW5kKiogMi4xOS4xMTogdGhlIHJlcG9ydGVkIHNoYXBlLCBhIGRvdHRlZCBpbnRlcmZhY2UgbmFtZSwgYSBkYXNoZWQgb25lLCB0aGUgZmFjdC1kZXJpdmVkIHNoYXBlIHRoZSBvbGQgcmVzb2x2ZXIgc3VwcG9ydGVkLCBhbmQgYSBtaXNzaW5nIGZhY3QuCgpPbmUgYmVoYXZpb3VyIGNoYW5nZSBmb3IgcmV2aWV3OiBhIG1pc3NpbmcgYGludGVybmFsX2ludGVyZmFjZWAgaXMgbm93IHJlcG9ydGVkIHRocm91Z2ggQW5zaWJsZSdzIHVuZGVmaW5lZC12YXJpYWJsZSBtZXNzYWdlIHJhdGhlciB0aGFuIGEgZGVkaWNhdGVkIG9uZS4KCmBvc2lzbSBzdGF0dXMgcmFiYml0bXFgIHNoYXJlcyB0aGUgaGVscGVyIGFuZCBpcyBmaXhlZCB3aXRoIGl0LgoKRml4ZXM6CgotIG9zaXNtL2lzc3VlcyMxNDI1Cgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQo=
      patchset: 386e9767517aff6dbfd888e92fcea12629b33268
      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/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 1fc563fe2fe4276823d3b83ef7821132b2f5fa89
          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: b7c70f39598a39998dbbc6f833779355630f3a39
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/test-setup.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: 1fc563fe2fe4276823d3b83ef7821132b2f5fa89
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2578/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
