all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fea1:b0c7
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 2eca6164-6aa2-4e65-899e-5f5bd97daf17
        host_id: 4ba4344415ca7057d9956ea5de826bbc0b830981e82c0e0f191fa07b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fea1:b0c7
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.226
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.124
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fea1:b0c7
        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 hadolint explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#37>'
      - '<Job hadolint explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: eda94238fede49db84c44ee5da0085f3
      build_refs:
      - branch: main
        change: '2588'
        change_message: "inventory: resolve via a controller action plugin\n\n`resolve_in_host_context()`
          fails for every host whose\n`ansible_python_interpreter` does not also exist
          on the controller. In the\n`osismclient` image that is every host, so `osism
          status messaging` reports all\nRabbitMQ nodes unresolvable on a perfectly
          healthy cluster.\n\nFollows on from:\n\n- osism/python-osism#2578\n- osism/python-osism#2579\n\n##
          The bug\n\nThe helper templated its expression with `ansible <host> -c local
          -m copy`. The\n`-c local` is deliberate and right \u2014 the module runs
          on the controller, so no\nconnection is made and the lookup also works for
          hosts that are down.\n\nBut `-c local` only decides **where** the module
          runs. Ansible still picks the\ninterpreter from the *target host's* `ansible_python_interpreter`,
          which\n`osism/defaults` sets to `/usr/bin/python3`. That path is correct
          on the nodes\nand need not exist on the controller \u2014 and it does not
          exist in `osismclient`,\nwhere the CLI actually runs (`/usr/local/bin/osism`
          execs\n`docker exec -i \u2026 osismclient osism`):\n\n```\nFailed to get
          information on remote file (/tmp/osism-resolve-\u2026/value):\n  /bin/sh:
          /usr/bin/python3: not found\n```\n\nAnsible reports that against the host
          context, so the error names the host and\nreads as if the node were broken.
          The node is fine; so is RabbitMQ.\n\n`osism-ansible` *does* have `/usr/bin/python3`,
          which is likely why this went\nunnoticed \u2014 only the client container
          is affected.\n\nReproducible without RabbitMQ, inside `osismclient`:\n\n```sh\nansible
          testbed-node-0 -i /ansible/inventory/hosts.yml -c local \\\n  -m copy -a
          '{\"content\":\"{{ 40 + 2 }}\",\"dest\":\"/tmp/v\"}'\n```\n\n## The fix\n\nRun
          the resolution through a controller-side **action plugin**. An action\nplugin
          executes on the controller by design and launches no module, so no\ninterpreter
          is selected at all \u2014 while Ansible still templates the task\narguments
          in the target host's variable context, which is the property this\nhelper
          exists for. The failure mode is removed rather than compensated for, and\nany
          future caller benefits.\n\n## Alternatives rejected\n\n**Override the interpreter
          with an extra var.** Removes the crash, but extra\nvars outrank every other
          source, so it does not merely steer module execution \u2014\nit replaces
          the *value* of `ansible_python_interpreter` during templating. Any\nexpression
          reading that variable would get the controller's answer instead of\nthe
          host's: a silently wrong result from a helper whose whole purpose is to\nevaluate
          in the host's context. Measured against real Ansible, resolving\n`ansible_python_interpreter`
          for a host declaring `/usr/bin/python3` returned\nthe controller's virtualenv
          python.\n\n**Add `/usr/bin/python3` to the `osismclient` image.** Smaller,
          but it only\ncovers hosts using the default. The value is a *default*, not
          a constant \u2014\nOSISM's own testbed sets a venv interpreter \u2014 so
          a host declaring one still\nfails on a controller that has `/usr/bin/python3`
          (verified). It would also\nleave the code dependent on an image detail,
          so anything running the CLI\noutside that image stays broken.\n\n## Testing\n\nNew
          integration tests drive the public function against **real Ansible**; the\nexisting
          unit tests mock `subprocess` and can only pin the shape of the command,\nnot
          what Ansible does with it. They cover host-context evaluation, resolution\nunder
          three target interpreters (default, venv, absent), the host's own\ninterpreter
          reading back unchanged, and a non-string result.\n\n- `pytest tests/integration/`
          \u2014 56 passed\n- `pytest tests/unit/` \u2014 3132 passed, 4 xfailed\n-
          flake8 + black clean\n\n**Verified on a live cluster** by patching the module
          into the running\n`osismclient` container: `osism status messaging` goes
          from `Failed to get\nRabbitMQ node addresses` to reading each node's management
          API on its resolved\naddress and reporting the cluster healthy (3 nodes,
          no partitions). The full\ninfrastructure check suite then passed 7/7. The
          container was restored to the\nshipped version afterwards.\n\nDraft: not
          yet reviewed by anyone but its authors.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2588
        commit_id: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
        patchset: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
        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: 295453a5e88f441b97246796fda39ac4
      buildset_refs:
      - branch: main
        change: '2588'
        change_message: "inventory: resolve via a controller action plugin\n\n`resolve_in_host_context()`
          fails for every host whose\n`ansible_python_interpreter` does not also exist
          on the controller. In the\n`osismclient` image that is every host, so `osism
          status messaging` reports all\nRabbitMQ nodes unresolvable on a perfectly
          healthy cluster.\n\nFollows on from:\n\n- osism/python-osism#2578\n- osism/python-osism#2579\n\n##
          The bug\n\nThe helper templated its expression with `ansible <host> -c local
          -m copy`. The\n`-c local` is deliberate and right \u2014 the module runs
          on the controller, so no\nconnection is made and the lookup also works for
          hosts that are down.\n\nBut `-c local` only decides **where** the module
          runs. Ansible still picks the\ninterpreter from the *target host's* `ansible_python_interpreter`,
          which\n`osism/defaults` sets to `/usr/bin/python3`. That path is correct
          on the nodes\nand need not exist on the controller \u2014 and it does not
          exist in `osismclient`,\nwhere the CLI actually runs (`/usr/local/bin/osism`
          execs\n`docker exec -i \u2026 osismclient osism`):\n\n```\nFailed to get
          information on remote file (/tmp/osism-resolve-\u2026/value):\n  /bin/sh:
          /usr/bin/python3: not found\n```\n\nAnsible reports that against the host
          context, so the error names the host and\nreads as if the node were broken.
          The node is fine; so is RabbitMQ.\n\n`osism-ansible` *does* have `/usr/bin/python3`,
          which is likely why this went\nunnoticed \u2014 only the client container
          is affected.\n\nReproducible without RabbitMQ, inside `osismclient`:\n\n```sh\nansible
          testbed-node-0 -i /ansible/inventory/hosts.yml -c local \\\n  -m copy -a
          '{\"content\":\"{{ 40 + 2 }}\",\"dest\":\"/tmp/v\"}'\n```\n\n## The fix\n\nRun
          the resolution through a controller-side **action plugin**. An action\nplugin
          executes on the controller by design and launches no module, so no\ninterpreter
          is selected at all \u2014 while Ansible still templates the task\narguments
          in the target host's variable context, which is the property this\nhelper
          exists for. The failure mode is removed rather than compensated for, and\nany
          future caller benefits.\n\n## Alternatives rejected\n\n**Override the interpreter
          with an extra var.** Removes the crash, but extra\nvars outrank every other
          source, so it does not merely steer module execution \u2014\nit replaces
          the *value* of `ansible_python_interpreter` during templating. Any\nexpression
          reading that variable would get the controller's answer instead of\nthe
          host's: a silently wrong result from a helper whose whole purpose is to\nevaluate
          in the host's context. Measured against real Ansible, resolving\n`ansible_python_interpreter`
          for a host declaring `/usr/bin/python3` returned\nthe controller's virtualenv
          python.\n\n**Add `/usr/bin/python3` to the `osismclient` image.** Smaller,
          but it only\ncovers hosts using the default. The value is a *default*, not
          a constant \u2014\nOSISM's own testbed sets a venv interpreter \u2014 so
          a host declaring one still\nfails on a controller that has `/usr/bin/python3`
          (verified). It would also\nleave the code dependent on an image detail,
          so anything running the CLI\noutside that image stays broken.\n\n## Testing\n\nNew
          integration tests drive the public function against **real Ansible**; the\nexisting
          unit tests mock `subprocess` and can only pin the shape of the command,\nnot
          what Ansible does with it. They cover host-context evaluation, resolution\nunder
          three target interpreters (default, venv, absent), the host's own\ninterpreter
          reading back unchanged, and a non-string result.\n\n- `pytest tests/integration/`
          \u2014 56 passed\n- `pytest tests/unit/` \u2014 3132 passed, 4 xfailed\n-
          flake8 + black clean\n\n**Verified on a live cluster** by patching the module
          into the running\n`osismclient` container: `osism status messaging` goes
          from `Failed to get\nRabbitMQ node addresses` to reading each node's management
          API on its resolved\naddress and reporting the cluster healthy (3 nodes,
          no partitions). The full\ninfrastructure check suite then passed 7/7. The
          container was restored to the\nshipped version afterwards.\n\nDraft: not
          yet reviewed by anyone but its authors.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2588
        commit_id: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
        patchset: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
        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: '2588'
      change_message: "inventory: resolve via a controller action plugin\n\n`resolve_in_host_context()`
        fails for every host whose\n`ansible_python_interpreter` does not also exist
        on the controller. In the\n`osismclient` image that is every host, so `osism
        status messaging` reports all\nRabbitMQ nodes unresolvable on a perfectly
        healthy cluster.\n\nFollows on from:\n\n- osism/python-osism#2578\n- osism/python-osism#2579\n\n##
        The bug\n\nThe helper templated its expression with `ansible <host> -c local
        -m copy`. The\n`-c local` is deliberate and right \u2014 the module runs on
        the controller, so no\nconnection is made and the lookup also works for hosts
        that are down.\n\nBut `-c local` only decides **where** the module runs. Ansible
        still picks the\ninterpreter from the *target host's* `ansible_python_interpreter`,
        which\n`osism/defaults` sets to `/usr/bin/python3`. That path is correct on
        the nodes\nand need not exist on the controller \u2014 and it does not exist
        in `osismclient`,\nwhere the CLI actually runs (`/usr/local/bin/osism` execs\n`docker
        exec -i \u2026 osismclient osism`):\n\n```\nFailed to get information on remote
        file (/tmp/osism-resolve-\u2026/value):\n  /bin/sh: /usr/bin/python3: not
        found\n```\n\nAnsible reports that against the host context, so the error
        names the host and\nreads as if the node were broken. The node is fine; so
        is RabbitMQ.\n\n`osism-ansible` *does* have `/usr/bin/python3`, which is likely
        why this went\nunnoticed \u2014 only the client container is affected.\n\nReproducible
        without RabbitMQ, inside `osismclient`:\n\n```sh\nansible testbed-node-0 -i
        /ansible/inventory/hosts.yml -c local \\\n  -m copy -a '{\"content\":\"{{
        40 + 2 }}\",\"dest\":\"/tmp/v\"}'\n```\n\n## The fix\n\nRun the resolution
        through a controller-side **action plugin**. An action\nplugin executes on
        the controller by design and launches no module, so no\ninterpreter is selected
        at all \u2014 while Ansible still templates the task\narguments in the target
        host's variable context, which is the property this\nhelper exists for. The
        failure mode is removed rather than compensated for, and\nany future caller
        benefits.\n\n## Alternatives rejected\n\n**Override the interpreter with an
        extra var.** Removes the crash, but extra\nvars outrank every other source,
        so it does not merely steer module execution \u2014\nit replaces the *value*
        of `ansible_python_interpreter` during templating. Any\nexpression reading
        that variable would get the controller's answer instead of\nthe host's: a
        silently wrong result from a helper whose whole purpose is to\nevaluate in
        the host's context. Measured against real Ansible, resolving\n`ansible_python_interpreter`
        for a host declaring `/usr/bin/python3` returned\nthe controller's virtualenv
        python.\n\n**Add `/usr/bin/python3` to the `osismclient` image.** Smaller,
        but it only\ncovers hosts using the default. The value is a *default*, not
        a constant \u2014\nOSISM's own testbed sets a venv interpreter \u2014 so a
        host declaring one still\nfails on a controller that has `/usr/bin/python3`
        (verified). It would also\nleave the code dependent on an image detail, so
        anything running the CLI\noutside that image stays broken.\n\n## Testing\n\nNew
        integration tests drive the public function against **real Ansible**; the\nexisting
        unit tests mock `subprocess` and can only pin the shape of the command,\nnot
        what Ansible does with it. They cover host-context evaluation, resolution\nunder
        three target interpreters (default, venv, absent), the host's own\ninterpreter
        reading back unchanged, and a non-string result.\n\n- `pytest tests/integration/`
        \u2014 56 passed\n- `pytest tests/unit/` \u2014 3132 passed, 4 xfailed\n-
        flake8 + black clean\n\n**Verified on a live cluster** by patching the module
        into the running\n`osismclient` container: `osism status messaging` goes from
        `Failed to get\nRabbitMQ node addresses` to reading each node's management
        API on its resolved\naddress and reporting the cluster healthy (3 nodes, no
        partitions). The full\ninfrastructure check suite then passed 7/7. The container
        was restored to the\nshipped version afterwards.\n\nDraft: not yet reviewed
        by anyone but its authors.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2588
      child_jobs: []
      commit_id: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
      event_id: e494cbb0-92a2-11f1-9d2c-758bea004311
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/eda94238fede49db84c44ee5da0085f3/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/eda94238fede49db84c44ee5da0085f3/work/logs
        result_data_file: /var/lib/zuul/builds/eda94238fede49db84c44ee5da0085f3/work/results.json
        src_root: /var/lib/zuul/builds/eda94238fede49db84c44ee5da0085f3/work/src
        work_root: /var/lib/zuul/builds/eda94238fede49db84c44ee5da0085f3/work
      include_vars: []
      items:
      - branch: main
        change: '2588'
        change_message: "inventory: resolve via a controller action plugin\n\n`resolve_in_host_context()`
          fails for every host whose\n`ansible_python_interpreter` does not also exist
          on the controller. In the\n`osismclient` image that is every host, so `osism
          status messaging` reports all\nRabbitMQ nodes unresolvable on a perfectly
          healthy cluster.\n\nFollows on from:\n\n- osism/python-osism#2578\n- osism/python-osism#2579\n\n##
          The bug\n\nThe helper templated its expression with `ansible <host> -c local
          -m copy`. The\n`-c local` is deliberate and right \u2014 the module runs
          on the controller, so no\nconnection is made and the lookup also works for
          hosts that are down.\n\nBut `-c local` only decides **where** the module
          runs. Ansible still picks the\ninterpreter from the *target host's* `ansible_python_interpreter`,
          which\n`osism/defaults` sets to `/usr/bin/python3`. That path is correct
          on the nodes\nand need not exist on the controller \u2014 and it does not
          exist in `osismclient`,\nwhere the CLI actually runs (`/usr/local/bin/osism`
          execs\n`docker exec -i \u2026 osismclient osism`):\n\n```\nFailed to get
          information on remote file (/tmp/osism-resolve-\u2026/value):\n  /bin/sh:
          /usr/bin/python3: not found\n```\n\nAnsible reports that against the host
          context, so the error names the host and\nreads as if the node were broken.
          The node is fine; so is RabbitMQ.\n\n`osism-ansible` *does* have `/usr/bin/python3`,
          which is likely why this went\nunnoticed \u2014 only the client container
          is affected.\n\nReproducible without RabbitMQ, inside `osismclient`:\n\n```sh\nansible
          testbed-node-0 -i /ansible/inventory/hosts.yml -c local \\\n  -m copy -a
          '{\"content\":\"{{ 40 + 2 }}\",\"dest\":\"/tmp/v\"}'\n```\n\n## The fix\n\nRun
          the resolution through a controller-side **action plugin**. An action\nplugin
          executes on the controller by design and launches no module, so no\ninterpreter
          is selected at all \u2014 while Ansible still templates the task\narguments
          in the target host's variable context, which is the property this\nhelper
          exists for. The failure mode is removed rather than compensated for, and\nany
          future caller benefits.\n\n## Alternatives rejected\n\n**Override the interpreter
          with an extra var.** Removes the crash, but extra\nvars outrank every other
          source, so it does not merely steer module execution \u2014\nit replaces
          the *value* of `ansible_python_interpreter` during templating. Any\nexpression
          reading that variable would get the controller's answer instead of\nthe
          host's: a silently wrong result from a helper whose whole purpose is to\nevaluate
          in the host's context. Measured against real Ansible, resolving\n`ansible_python_interpreter`
          for a host declaring `/usr/bin/python3` returned\nthe controller's virtualenv
          python.\n\n**Add `/usr/bin/python3` to the `osismclient` image.** Smaller,
          but it only\ncovers hosts using the default. The value is a *default*, not
          a constant \u2014\nOSISM's own testbed sets a venv interpreter \u2014 so
          a host declaring one still\nfails on a controller that has `/usr/bin/python3`
          (verified). It would also\nleave the code dependent on an image detail,
          so anything running the CLI\noutside that image stays broken.\n\n## Testing\n\nNew
          integration tests drive the public function against **real Ansible**; the\nexisting
          unit tests mock `subprocess` and can only pin the shape of the command,\nnot
          what Ansible does with it. They cover host-context evaluation, resolution\nunder
          three target interpreters (default, venv, absent), the host's own\ninterpreter
          reading back unchanged, and a non-string result.\n\n- `pytest tests/integration/`
          \u2014 56 passed\n- `pytest tests/unit/` \u2014 3132 passed, 4 xfailed\n-
          flake8 + black clean\n\n**Verified on a live cluster** by patching the module
          into the running\n`osismclient` container: `osism status messaging` goes
          from `Failed to get\nRabbitMQ node addresses` to reading each node's management
          API on its resolved\naddress and reporting the cluster healthy (3 nodes,
          no partitions). The full\ninfrastructure check suite then passed 7/7. The
          container was restored to the\nshipped version afterwards.\n\nDraft: not
          yet reviewed by anyone but its authors.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2588
        commit_id: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
        patchset: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
        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: hadolint
      jobtags: []
      max_attempts: 3
      message: aW52ZW50b3J5OiByZXNvbHZlIHZpYSBhIGNvbnRyb2xsZXIgYWN0aW9uIHBsdWdpbgoKYHJlc29sdmVfaW5faG9zdF9jb250ZXh0KClgIGZhaWxzIGZvciBldmVyeSBob3N0IHdob3NlCmBhbnNpYmxlX3B5dGhvbl9pbnRlcnByZXRlcmAgZG9lcyBub3QgYWxzbyBleGlzdCBvbiB0aGUgY29udHJvbGxlci4gSW4gdGhlCmBvc2lzbWNsaWVudGAgaW1hZ2UgdGhhdCBpcyBldmVyeSBob3N0LCBzbyBgb3Npc20gc3RhdHVzIG1lc3NhZ2luZ2AgcmVwb3J0cyBhbGwKUmFiYml0TVEgbm9kZXMgdW5yZXNvbHZhYmxlIG9uIGEgcGVyZmVjdGx5IGhlYWx0aHkgY2x1c3Rlci4KCkZvbGxvd3Mgb24gZnJvbToKCi0gb3Npc20vcHl0aG9uLW9zaXNtIzI1NzgKLSBvc2lzbS9weXRob24tb3Npc20jMjU3OQoKIyMgVGhlIGJ1ZwoKVGhlIGhlbHBlciB0ZW1wbGF0ZWQgaXRzIGV4cHJlc3Npb24gd2l0aCBgYW5zaWJsZSA8aG9zdD4gLWMgbG9jYWwgLW0gY29weWAuIFRoZQpgLWMgbG9jYWxgIGlzIGRlbGliZXJhdGUgYW5kIHJpZ2h0IOKAlCB0aGUgbW9kdWxlIHJ1bnMgb24gdGhlIGNvbnRyb2xsZXIsIHNvIG5vCmNvbm5lY3Rpb24gaXMgbWFkZSBhbmQgdGhlIGxvb2t1cCBhbHNvIHdvcmtzIGZvciBob3N0cyB0aGF0IGFyZSBkb3duLgoKQnV0IGAtYyBsb2NhbGAgb25seSBkZWNpZGVzICoqd2hlcmUqKiB0aGUgbW9kdWxlIHJ1bnMuIEFuc2libGUgc3RpbGwgcGlja3MgdGhlCmludGVycHJldGVyIGZyb20gdGhlICp0YXJnZXQgaG9zdCdzKiBgYW5zaWJsZV9weXRob25faW50ZXJwcmV0ZXJgLCB3aGljaApgb3Npc20vZGVmYXVsdHNgIHNldHMgdG8gYC91c3IvYmluL3B5dGhvbjNgLiBUaGF0IHBhdGggaXMgY29ycmVjdCBvbiB0aGUgbm9kZXMKYW5kIG5lZWQgbm90IGV4aXN0IG9uIHRoZSBjb250cm9sbGVyIOKAlCBhbmQgaXQgZG9lcyBub3QgZXhpc3QgaW4gYG9zaXNtY2xpZW50YCwKd2hlcmUgdGhlIENMSSBhY3R1YWxseSBydW5zIChgL3Vzci9sb2NhbC9iaW4vb3Npc21gIGV4ZWNzCmBkb2NrZXIgZXhlYyAtaSDigKYgb3Npc21jbGllbnQgb3Npc21gKToKCmBgYApGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIG9uIHJlbW90ZSBmaWxlICgvdG1wL29zaXNtLXJlc29sdmUt4oCmL3ZhbHVlKToKICAvYmluL3NoOiAvdXNyL2Jpbi9weXRob24zOiBub3QgZm91bmQKYGBgCgpBbnNpYmxlIHJlcG9ydHMgdGhhdCBhZ2FpbnN0IHRoZSBob3N0IGNvbnRleHQsIHNvIHRoZSBlcnJvciBuYW1lcyB0aGUgaG9zdCBhbmQKcmVhZHMgYXMgaWYgdGhlIG5vZGUgd2VyZSBicm9rZW4uIFRoZSBub2RlIGlzIGZpbmU7IHNvIGlzIFJhYmJpdE1RLgoKYG9zaXNtLWFuc2libGVgICpkb2VzKiBoYXZlIGAvdXNyL2Jpbi9weXRob24zYCwgd2hpY2ggaXMgbGlrZWx5IHdoeSB0aGlzIHdlbnQKdW5ub3RpY2VkIOKAlCBvbmx5IHRoZSBjbGllbnQgY29udGFpbmVyIGlzIGFmZmVjdGVkLgoKUmVwcm9kdWNpYmxlIHdpdGhvdXQgUmFiYml0TVEsIGluc2lkZSBgb3Npc21jbGllbnRgOgoKYGBgc2gKYW5zaWJsZSB0ZXN0YmVkLW5vZGUtMCAtaSAvYW5zaWJsZS9pbnZlbnRvcnkvaG9zdHMueW1sIC1jIGxvY2FsIFwKICAtbSBjb3B5IC1hICd7ImNvbnRlbnQiOiJ7eyA0MCArIDIgfX0iLCJkZXN0IjoiL3RtcC92In0nCmBgYAoKIyMgVGhlIGZpeAoKUnVuIHRoZSByZXNvbHV0aW9uIHRocm91Z2ggYSBjb250cm9sbGVyLXNpZGUgKiphY3Rpb24gcGx1Z2luKiouIEFuIGFjdGlvbgpwbHVnaW4gZXhlY3V0ZXMgb24gdGhlIGNvbnRyb2xsZXIgYnkgZGVzaWduIGFuZCBsYXVuY2hlcyBubyBtb2R1bGUsIHNvIG5vCmludGVycHJldGVyIGlzIHNlbGVjdGVkIGF0IGFsbCDigJQgd2hpbGUgQW5zaWJsZSBzdGlsbCB0ZW1wbGF0ZXMgdGhlIHRhc2sKYXJndW1lbnRzIGluIHRoZSB0YXJnZXQgaG9zdCdzIHZhcmlhYmxlIGNvbnRleHQsIHdoaWNoIGlzIHRoZSBwcm9wZXJ0eSB0aGlzCmhlbHBlciBleGlzdHMgZm9yLiBUaGUgZmFpbHVyZSBtb2RlIGlzIHJlbW92ZWQgcmF0aGVyIHRoYW4gY29tcGVuc2F0ZWQgZm9yLCBhbmQKYW55IGZ1dHVyZSBjYWxsZXIgYmVuZWZpdHMuCgojIyBBbHRlcm5hdGl2ZXMgcmVqZWN0ZWQKCioqT3ZlcnJpZGUgdGhlIGludGVycHJldGVyIHdpdGggYW4gZXh0cmEgdmFyLioqIFJlbW92ZXMgdGhlIGNyYXNoLCBidXQgZXh0cmEKdmFycyBvdXRyYW5rIGV2ZXJ5IG90aGVyIHNvdXJjZSwgc28gaXQgZG9lcyBub3QgbWVyZWx5IHN0ZWVyIG1vZHVsZSBleGVjdXRpb24g4oCUCml0IHJlcGxhY2VzIHRoZSAqdmFsdWUqIG9mIGBhbnNpYmxlX3B5dGhvbl9pbnRlcnByZXRlcmAgZHVyaW5nIHRlbXBsYXRpbmcuIEFueQpleHByZXNzaW9uIHJlYWRpbmcgdGhhdCB2YXJpYWJsZSB3b3VsZCBnZXQgdGhlIGNvbnRyb2xsZXIncyBhbnN3ZXIgaW5zdGVhZCBvZgp0aGUgaG9zdCdzOiBhIHNpbGVudGx5IHdyb25nIHJlc3VsdCBmcm9tIGEgaGVscGVyIHdob3NlIHdob2xlIHB1cnBvc2UgaXMgdG8KZXZhbHVhdGUgaW4gdGhlIGhvc3QncyBjb250ZXh0LiBNZWFzdXJlZCBhZ2FpbnN0IHJlYWwgQW5zaWJsZSwgcmVzb2x2aW5nCmBhbnNpYmxlX3B5dGhvbl9pbnRlcnByZXRlcmAgZm9yIGEgaG9zdCBkZWNsYXJpbmcgYC91c3IvYmluL3B5dGhvbjNgIHJldHVybmVkCnRoZSBjb250cm9sbGVyJ3MgdmlydHVhbGVudiBweXRob24uCgoqKkFkZCBgL3Vzci9iaW4vcHl0aG9uM2AgdG8gdGhlIGBvc2lzbWNsaWVudGAgaW1hZ2UuKiogU21hbGxlciwgYnV0IGl0IG9ubHkKY292ZXJzIGhvc3RzIHVzaW5nIHRoZSBkZWZhdWx0LiBUaGUgdmFsdWUgaXMgYSAqZGVmYXVsdCosIG5vdCBhIGNvbnN0YW50IOKAlApPU0lTTSdzIG93biB0ZXN0YmVkIHNldHMgYSB2ZW52IGludGVycHJldGVyIOKAlCBzbyBhIGhvc3QgZGVjbGFyaW5nIG9uZSBzdGlsbApmYWlscyBvbiBhIGNvbnRyb2xsZXIgdGhhdCBoYXMgYC91c3IvYmluL3B5dGhvbjNgICh2ZXJpZmllZCkuIEl0IHdvdWxkIGFsc28KbGVhdmUgdGhlIGNvZGUgZGVwZW5kZW50IG9uIGFuIGltYWdlIGRldGFpbCwgc28gYW55dGhpbmcgcnVubmluZyB0aGUgQ0xJCm91dHNpZGUgdGhhdCBpbWFnZSBzdGF5cyBicm9rZW4uCgojIyBUZXN0aW5nCgpOZXcgaW50ZWdyYXRpb24gdGVzdHMgZHJpdmUgdGhlIHB1YmxpYyBmdW5jdGlvbiBhZ2FpbnN0ICoqcmVhbCBBbnNpYmxlKio7IHRoZQpleGlzdGluZyB1bml0IHRlc3RzIG1vY2sgYHN1YnByb2Nlc3NgIGFuZCBjYW4gb25seSBwaW4gdGhlIHNoYXBlIG9mIHRoZSBjb21tYW5kLApub3Qgd2hhdCBBbnNpYmxlIGRvZXMgd2l0aCBpdC4gVGhleSBjb3ZlciBob3N0LWNvbnRleHQgZXZhbHVhdGlvbiwgcmVzb2x1dGlvbgp1bmRlciB0aHJlZSB0YXJnZXQgaW50ZXJwcmV0ZXJzIChkZWZhdWx0LCB2ZW52LCBhYnNlbnQpLCB0aGUgaG9zdCdzIG93bgppbnRlcnByZXRlciByZWFkaW5nIGJhY2sgdW5jaGFuZ2VkLCBhbmQgYSBub24tc3RyaW5nIHJlc3VsdC4KCi0gYHB5dGVzdCB0ZXN0cy9pbnRlZ3JhdGlvbi9gIOKAlCA1NiBwYXNzZWQKLSBgcHl0ZXN0IHRlc3RzL3VuaXQvYCDigJQgMzEzMiBwYXNzZWQsIDQgeGZhaWxlZAotIGZsYWtlOCArIGJsYWNrIGNsZWFuCgoqKlZlcmlmaWVkIG9uIGEgbGl2ZSBjbHVzdGVyKiogYnkgcGF0Y2hpbmcgdGhlIG1vZHVsZSBpbnRvIHRoZSBydW5uaW5nCmBvc2lzbWNsaWVudGAgY29udGFpbmVyOiBgb3Npc20gc3RhdHVzIG1lc3NhZ2luZ2AgZ29lcyBmcm9tIGBGYWlsZWQgdG8gZ2V0ClJhYmJpdE1RIG5vZGUgYWRkcmVzc2VzYCB0byByZWFkaW5nIGVhY2ggbm9kZSdzIG1hbmFnZW1lbnQgQVBJIG9uIGl0cyByZXNvbHZlZAphZGRyZXNzIGFuZCByZXBvcnRpbmcgdGhlIGNsdXN0ZXIgaGVhbHRoeSAoMyBub2Rlcywgbm8gcGFydGl0aW9ucykuIFRoZSBmdWxsCmluZnJhc3RydWN0dXJlIGNoZWNrIHN1aXRlIHRoZW4gcGFzc2VkIDcvNy4gVGhlIGNvbnRhaW5lciB3YXMgcmVzdG9yZWQgdG8gdGhlCnNoaXBwZWQgdmVyc2lvbiBhZnRlcndhcmRzLgoKRHJhZnQ6IG5vdCB5ZXQgcmV2aWV3ZWQgYnkgYW55b25lIGJ1dCBpdHMgYXV0aG9ycy4KCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUp
      patchset: 0a4c015d9fac644b50225e9b0d8b651d67c18ca0
      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/hadolint/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: 8e77257d76b246a6bb5f161152f4de184afd5b8d
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2588/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
