all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe9d:42a0
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 26ae0b95-f0db-42e1-8491-1fdf227e2c2e
        host_id: 5afd8fc909abddfe2ce3a956a91bbe56629648b7209fd0acfa541862
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe9d:42a0
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.110
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.196
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe9d:42a0
        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-unit-tests explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#133>'
      - '<Job python-osism-unit-tests explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#138>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 2b76099474244ea79da6619de982bf2d
      build_refs:
      - branch: main
        change: '2392'
        change_message: "Add an osism openstack command that wraps the OpenStack CLI\n\n##
          Summary\n\nAdds an `osism openstack` command that transparently wraps the
          OpenStack\nCLI from inside the osism container image. It passes all subcommands
          and\nparameters straight through to the `openstack` client, defaults to
          the\n`admin` cloud, and lets the cloud be selected with `--cloud`.\n\nCredentials
          are loaded the same way the flavor-manager and image-manager\ndo \u2014
          via `setup_cloud_environment`/`get_cloud_helpers` from\n`osism/tasks/openstack.py`,
          which decrypts `secrets.yml`/`secure.yml`\nfrom the configuration repository.
          This removes the need for a separate\nopenstack container that cannot read
          the encrypted `secure.yml`.\n\nThe command runs the client in-process (`subprocess.run`),
          structurally\nmirroring the existing `osism openstack stress` command, so
          stdout/stderr\nand the exit code pass through unmodified \u2014 the behaviour
          an operator\nexpects from a transparent wrapper.\n\nCloses #2391\n\n## Changes
          (in commit order)\n\n1. **Declare `python-openstackclient` runtime dependency**
          \u2014\n   `requirements.txt`. The `openstack` binary the command shells
          out to\n   ships with `python-openstackclient`, which was not a declared\n
          \  dependency (only the `openstacksdk` library was). Pinned to `9.0.0`,\n
          \  the highest release compatible with the pinned `openstacksdk==4.10.0`\n
          \  (it requires `openstacksdk>=4.6.0`; 10.x requires `>=4.12.0`/`>=4.14.0`\n
          \  and would conflict).\n2. **Add and register `osism openstack` passthrough
          command** \u2014\n   `osism/commands/openstack.py` + `setup.cfg`. The command
          and its entry\n   point land together so the CLI is never half-registered.
          `--os-cloud`\n   is injected so the client selects the profile whose password\n
          \  `setup_cloud_environment` wrote into the temporary `clouds.yaml`.\n   Both
          `openstack` and the existing `openstack stress` entry points are\n   registered;
          cliff resolves the longest matching command prefix, so\n   `openstack stress`
          keeps routing to `OpenStackStress` while\n   `openstack server list` routes
          to the new command.\n3. **Add unit tests** \u2014 `tests/unit/commands/test_openstack.py`.
          Cover\n   argument passthrough with the default `admin` cloud, `--cloud`\n
          \  selection, the setup-failure short circuit, exit-code propagation, a\n
          \  missing `openstack` binary, and the cliff routing coexistence with\n
          \  `openstack stress`.\n4. **Document `osism openstack` in CHANGELOG** \u2014
          `CHANGELOG.md`.\n\n## Notes for reviewers\n\n- **Execution model.** The
          issue says load credentials \"the same way the\n  flavor-manager and image-manager
          do,\" which dispatch a Celery task on\n  the `openstack` worker queue. This
          change reuses the *same credential\n  helpers* but runs the client **in-process**
          (like `osism openstack\n  stress`) rather than via a Celery task. Only the
          in-process model\n  delivers a true transparent wrapper \u2014 real exit
          codes and stdio/TTY\n  passthrough; a Celery round-trip would stream output
          through Redis and\n  lose exit-code/interactivity transparency.\n- **`stress`
          is now a reserved word under `osism openstack`.** Plain\n  `openstack` has
          no `stress` subcommand, so nothing real is lost.\n- **Working directory.**
          `setup_cloud_environment` `os.chdir(\"/tmp\")`, so\n  relative paths in
          passed-through commands resolve against `/tmp`. This\n  is pre-existing
          behaviour shared with `stress`/the managers, not\n  introduced here.\n\n---\n\n_Drafted
          by [planwerk-review](https://github.com/planwerk/planwerk-review) e69a237
          with Claude:claude-opus-4-8_\n"
        change_url: https://github.com/osism/python-osism/pull/2392
        commit_id: 92ec67ea982c3289720ed7fda3f0163937369877
        patchset: 92ec67ea982c3289720ed7fda3f0163937369877
        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: 4733d1c61fde4ce1b10e3ff8bee90ef0
      buildset_refs:
      - branch: main
        change: '2392'
        change_message: "Add an osism openstack command that wraps the OpenStack CLI\n\n##
          Summary\n\nAdds an `osism openstack` command that transparently wraps the
          OpenStack\nCLI from inside the osism container image. It passes all subcommands
          and\nparameters straight through to the `openstack` client, defaults to
          the\n`admin` cloud, and lets the cloud be selected with `--cloud`.\n\nCredentials
          are loaded the same way the flavor-manager and image-manager\ndo \u2014
          via `setup_cloud_environment`/`get_cloud_helpers` from\n`osism/tasks/openstack.py`,
          which decrypts `secrets.yml`/`secure.yml`\nfrom the configuration repository.
          This removes the need for a separate\nopenstack container that cannot read
          the encrypted `secure.yml`.\n\nThe command runs the client in-process (`subprocess.run`),
          structurally\nmirroring the existing `osism openstack stress` command, so
          stdout/stderr\nand the exit code pass through unmodified \u2014 the behaviour
          an operator\nexpects from a transparent wrapper.\n\nCloses #2391\n\n## Changes
          (in commit order)\n\n1. **Declare `python-openstackclient` runtime dependency**
          \u2014\n   `requirements.txt`. The `openstack` binary the command shells
          out to\n   ships with `python-openstackclient`, which was not a declared\n
          \  dependency (only the `openstacksdk` library was). Pinned to `9.0.0`,\n
          \  the highest release compatible with the pinned `openstacksdk==4.10.0`\n
          \  (it requires `openstacksdk>=4.6.0`; 10.x requires `>=4.12.0`/`>=4.14.0`\n
          \  and would conflict).\n2. **Add and register `osism openstack` passthrough
          command** \u2014\n   `osism/commands/openstack.py` + `setup.cfg`. The command
          and its entry\n   point land together so the CLI is never half-registered.
          `--os-cloud`\n   is injected so the client selects the profile whose password\n
          \  `setup_cloud_environment` wrote into the temporary `clouds.yaml`.\n   Both
          `openstack` and the existing `openstack stress` entry points are\n   registered;
          cliff resolves the longest matching command prefix, so\n   `openstack stress`
          keeps routing to `OpenStackStress` while\n   `openstack server list` routes
          to the new command.\n3. **Add unit tests** \u2014 `tests/unit/commands/test_openstack.py`.
          Cover\n   argument passthrough with the default `admin` cloud, `--cloud`\n
          \  selection, the setup-failure short circuit, exit-code propagation, a\n
          \  missing `openstack` binary, and the cliff routing coexistence with\n
          \  `openstack stress`.\n4. **Document `osism openstack` in CHANGELOG** \u2014
          `CHANGELOG.md`.\n\n## Notes for reviewers\n\n- **Execution model.** The
          issue says load credentials \"the same way the\n  flavor-manager and image-manager
          do,\" which dispatch a Celery task on\n  the `openstack` worker queue. This
          change reuses the *same credential\n  helpers* but runs the client **in-process**
          (like `osism openstack\n  stress`) rather than via a Celery task. Only the
          in-process model\n  delivers a true transparent wrapper \u2014 real exit
          codes and stdio/TTY\n  passthrough; a Celery round-trip would stream output
          through Redis and\n  lose exit-code/interactivity transparency.\n- **`stress`
          is now a reserved word under `osism openstack`.** Plain\n  `openstack` has
          no `stress` subcommand, so nothing real is lost.\n- **Working directory.**
          `setup_cloud_environment` `os.chdir(\"/tmp\")`, so\n  relative paths in
          passed-through commands resolve against `/tmp`. This\n  is pre-existing
          behaviour shared with `stress`/the managers, not\n  introduced here.\n\n---\n\n_Drafted
          by [planwerk-review](https://github.com/planwerk/planwerk-review) e69a237
          with Claude:claude-opus-4-8_\n"
        change_url: https://github.com/osism/python-osism/pull/2392
        commit_id: 92ec67ea982c3289720ed7fda3f0163937369877
        patchset: 92ec67ea982c3289720ed7fda3f0163937369877
        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: '2392'
      change_message: "Add an osism openstack command that wraps the OpenStack CLI\n\n##
        Summary\n\nAdds an `osism openstack` command that transparently wraps the
        OpenStack\nCLI from inside the osism container image. It passes all subcommands
        and\nparameters straight through to the `openstack` client, defaults to the\n`admin`
        cloud, and lets the cloud be selected with `--cloud`.\n\nCredentials are loaded
        the same way the flavor-manager and image-manager\ndo \u2014 via `setup_cloud_environment`/`get_cloud_helpers`
        from\n`osism/tasks/openstack.py`, which decrypts `secrets.yml`/`secure.yml`\nfrom
        the configuration repository. This removes the need for a separate\nopenstack
        container that cannot read the encrypted `secure.yml`.\n\nThe command runs
        the client in-process (`subprocess.run`), structurally\nmirroring the existing
        `osism openstack stress` command, so stdout/stderr\nand the exit code pass
        through unmodified \u2014 the behaviour an operator\nexpects from a transparent
        wrapper.\n\nCloses #2391\n\n## Changes (in commit order)\n\n1. **Declare `python-openstackclient`
        runtime dependency** \u2014\n   `requirements.txt`. The `openstack` binary
        the command shells out to\n   ships with `python-openstackclient`, which was
        not a declared\n   dependency (only the `openstacksdk` library was). Pinned
        to `9.0.0`,\n   the highest release compatible with the pinned `openstacksdk==4.10.0`\n
        \  (it requires `openstacksdk>=4.6.0`; 10.x requires `>=4.12.0`/`>=4.14.0`\n
        \  and would conflict).\n2. **Add and register `osism openstack` passthrough
        command** \u2014\n   `osism/commands/openstack.py` + `setup.cfg`. The command
        and its entry\n   point land together so the CLI is never half-registered.
        `--os-cloud`\n   is injected so the client selects the profile whose password\n
        \  `setup_cloud_environment` wrote into the temporary `clouds.yaml`.\n   Both
        `openstack` and the existing `openstack stress` entry points are\n   registered;
        cliff resolves the longest matching command prefix, so\n   `openstack stress`
        keeps routing to `OpenStackStress` while\n   `openstack server list` routes
        to the new command.\n3. **Add unit tests** \u2014 `tests/unit/commands/test_openstack.py`.
        Cover\n   argument passthrough with the default `admin` cloud, `--cloud`\n
        \  selection, the setup-failure short circuit, exit-code propagation, a\n
        \  missing `openstack` binary, and the cliff routing coexistence with\n   `openstack
        stress`.\n4. **Document `osism openstack` in CHANGELOG** \u2014 `CHANGELOG.md`.\n\n##
        Notes for reviewers\n\n- **Execution model.** The issue says load credentials
        \"the same way the\n  flavor-manager and image-manager do,\" which dispatch
        a Celery task on\n  the `openstack` worker queue. This change reuses the *same
        credential\n  helpers* but runs the client **in-process** (like `osism openstack\n
        \ stress`) rather than via a Celery task. Only the in-process model\n  delivers
        a true transparent wrapper \u2014 real exit codes and stdio/TTY\n  passthrough;
        a Celery round-trip would stream output through Redis and\n  lose exit-code/interactivity
        transparency.\n- **`stress` is now a reserved word under `osism openstack`.**
        Plain\n  `openstack` has no `stress` subcommand, so nothing real is lost.\n-
        **Working directory.** `setup_cloud_environment` `os.chdir(\"/tmp\")`, so\n
        \ relative paths in passed-through commands resolve against `/tmp`. This\n
        \ is pre-existing behaviour shared with `stress`/the managers, not\n  introduced
        here.\n\n---\n\n_Drafted by [planwerk-review](https://github.com/planwerk/planwerk-review)
        e69a237 with Claude:claude-opus-4-8_\n"
      change_url: https://github.com/osism/python-osism/pull/2392
      child_jobs: []
      commit_id: 92ec67ea982c3289720ed7fda3f0163937369877
      event_id: f52b2b70-6b0d-11f1-91c0-2de4cb3813d5
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/2b76099474244ea79da6619de982bf2d/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/2b76099474244ea79da6619de982bf2d/work/logs
        result_data_file: /var/lib/zuul/builds/2b76099474244ea79da6619de982bf2d/work/results.json
        src_root: /var/lib/zuul/builds/2b76099474244ea79da6619de982bf2d/work/src
        work_root: /var/lib/zuul/builds/2b76099474244ea79da6619de982bf2d/work
      include_vars: []
      items:
      - branch: main
        change: '2392'
        change_message: "Add an osism openstack command that wraps the OpenStack CLI\n\n##
          Summary\n\nAdds an `osism openstack` command that transparently wraps the
          OpenStack\nCLI from inside the osism container image. It passes all subcommands
          and\nparameters straight through to the `openstack` client, defaults to
          the\n`admin` cloud, and lets the cloud be selected with `--cloud`.\n\nCredentials
          are loaded the same way the flavor-manager and image-manager\ndo \u2014
          via `setup_cloud_environment`/`get_cloud_helpers` from\n`osism/tasks/openstack.py`,
          which decrypts `secrets.yml`/`secure.yml`\nfrom the configuration repository.
          This removes the need for a separate\nopenstack container that cannot read
          the encrypted `secure.yml`.\n\nThe command runs the client in-process (`subprocess.run`),
          structurally\nmirroring the existing `osism openstack stress` command, so
          stdout/stderr\nand the exit code pass through unmodified \u2014 the behaviour
          an operator\nexpects from a transparent wrapper.\n\nCloses #2391\n\n## Changes
          (in commit order)\n\n1. **Declare `python-openstackclient` runtime dependency**
          \u2014\n   `requirements.txt`. The `openstack` binary the command shells
          out to\n   ships with `python-openstackclient`, which was not a declared\n
          \  dependency (only the `openstacksdk` library was). Pinned to `9.0.0`,\n
          \  the highest release compatible with the pinned `openstacksdk==4.10.0`\n
          \  (it requires `openstacksdk>=4.6.0`; 10.x requires `>=4.12.0`/`>=4.14.0`\n
          \  and would conflict).\n2. **Add and register `osism openstack` passthrough
          command** \u2014\n   `osism/commands/openstack.py` + `setup.cfg`. The command
          and its entry\n   point land together so the CLI is never half-registered.
          `--os-cloud`\n   is injected so the client selects the profile whose password\n
          \  `setup_cloud_environment` wrote into the temporary `clouds.yaml`.\n   Both
          `openstack` and the existing `openstack stress` entry points are\n   registered;
          cliff resolves the longest matching command prefix, so\n   `openstack stress`
          keeps routing to `OpenStackStress` while\n   `openstack server list` routes
          to the new command.\n3. **Add unit tests** \u2014 `tests/unit/commands/test_openstack.py`.
          Cover\n   argument passthrough with the default `admin` cloud, `--cloud`\n
          \  selection, the setup-failure short circuit, exit-code propagation, a\n
          \  missing `openstack` binary, and the cliff routing coexistence with\n
          \  `openstack stress`.\n4. **Document `osism openstack` in CHANGELOG** \u2014
          `CHANGELOG.md`.\n\n## Notes for reviewers\n\n- **Execution model.** The
          issue says load credentials \"the same way the\n  flavor-manager and image-manager
          do,\" which dispatch a Celery task on\n  the `openstack` worker queue. This
          change reuses the *same credential\n  helpers* but runs the client **in-process**
          (like `osism openstack\n  stress`) rather than via a Celery task. Only the
          in-process model\n  delivers a true transparent wrapper \u2014 real exit
          codes and stdio/TTY\n  passthrough; a Celery round-trip would stream output
          through Redis and\n  lose exit-code/interactivity transparency.\n- **`stress`
          is now a reserved word under `osism openstack`.** Plain\n  `openstack` has
          no `stress` subcommand, so nothing real is lost.\n- **Working directory.**
          `setup_cloud_environment` `os.chdir(\"/tmp\")`, so\n  relative paths in
          passed-through commands resolve against `/tmp`. This\n  is pre-existing
          behaviour shared with `stress`/the managers, not\n  introduced here.\n\n---\n\n_Drafted
          by [planwerk-review](https://github.com/planwerk/planwerk-review) e69a237
          with Claude:claude-opus-4-8_\n"
        change_url: https://github.com/osism/python-osism/pull/2392
        commit_id: 92ec67ea982c3289720ed7fda3f0163937369877
        patchset: 92ec67ea982c3289720ed7fda3f0163937369877
        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-unit-tests
      jobtags: []
      max_attempts: 3
      message: QWRkIGFuIG9zaXNtIG9wZW5zdGFjayBjb21tYW5kIHRoYXQgd3JhcHMgdGhlIE9wZW5TdGFjayBDTEkKCiMjIFN1bW1hcnkKCkFkZHMgYW4gYG9zaXNtIG9wZW5zdGFja2AgY29tbWFuZCB0aGF0IHRyYW5zcGFyZW50bHkgd3JhcHMgdGhlIE9wZW5TdGFjawpDTEkgZnJvbSBpbnNpZGUgdGhlIG9zaXNtIGNvbnRhaW5lciBpbWFnZS4gSXQgcGFzc2VzIGFsbCBzdWJjb21tYW5kcyBhbmQKcGFyYW1ldGVycyBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZSBgb3BlbnN0YWNrYCBjbGllbnQsIGRlZmF1bHRzIHRvIHRoZQpgYWRtaW5gIGNsb3VkLCBhbmQgbGV0cyB0aGUgY2xvdWQgYmUgc2VsZWN0ZWQgd2l0aCBgLS1jbG91ZGAuCgpDcmVkZW50aWFscyBhcmUgbG9hZGVkIHRoZSBzYW1lIHdheSB0aGUgZmxhdm9yLW1hbmFnZXIgYW5kIGltYWdlLW1hbmFnZXIKZG8g4oCUIHZpYSBgc2V0dXBfY2xvdWRfZW52aXJvbm1lbnRgL2BnZXRfY2xvdWRfaGVscGVyc2AgZnJvbQpgb3Npc20vdGFza3Mvb3BlbnN0YWNrLnB5YCwgd2hpY2ggZGVjcnlwdHMgYHNlY3JldHMueW1sYC9gc2VjdXJlLnltbGAKZnJvbSB0aGUgY29uZmlndXJhdGlvbiByZXBvc2l0b3J5LiBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUKb3BlbnN0YWNrIGNvbnRhaW5lciB0aGF0IGNhbm5vdCByZWFkIHRoZSBlbmNyeXB0ZWQgYHNlY3VyZS55bWxgLgoKVGhlIGNvbW1hbmQgcnVucyB0aGUgY2xpZW50IGluLXByb2Nlc3MgKGBzdWJwcm9jZXNzLnJ1bmApLCBzdHJ1Y3R1cmFsbHkKbWlycm9yaW5nIHRoZSBleGlzdGluZyBgb3Npc20gb3BlbnN0YWNrIHN0cmVzc2AgY29tbWFuZCwgc28gc3Rkb3V0L3N0ZGVycgphbmQgdGhlIGV4aXQgY29kZSBwYXNzIHRocm91Z2ggdW5tb2RpZmllZCDigJQgdGhlIGJlaGF2aW91ciBhbiBvcGVyYXRvcgpleHBlY3RzIGZyb20gYSB0cmFuc3BhcmVudCB3cmFwcGVyLgoKQ2xvc2VzICMyMzkxCgojIyBDaGFuZ2VzIChpbiBjb21taXQgb3JkZXIpCgoxLiAqKkRlY2xhcmUgYHB5dGhvbi1vcGVuc3RhY2tjbGllbnRgIHJ1bnRpbWUgZGVwZW5kZW5jeSoqIOKAlAogICBgcmVxdWlyZW1lbnRzLnR4dGAuIFRoZSBgb3BlbnN0YWNrYCBiaW5hcnkgdGhlIGNvbW1hbmQgc2hlbGxzIG91dCB0bwogICBzaGlwcyB3aXRoIGBweXRob24tb3BlbnN0YWNrY2xpZW50YCwgd2hpY2ggd2FzIG5vdCBhIGRlY2xhcmVkCiAgIGRlcGVuZGVuY3kgKG9ubHkgdGhlIGBvcGVuc3RhY2tzZGtgIGxpYnJhcnkgd2FzKS4gUGlubmVkIHRvIGA5LjAuMGAsCiAgIHRoZSBoaWdoZXN0IHJlbGVhc2UgY29tcGF0aWJsZSB3aXRoIHRoZSBwaW5uZWQgYG9wZW5zdGFja3Nkaz09NC4xMC4wYAogICAoaXQgcmVxdWlyZXMgYG9wZW5zdGFja3Nkaz49NC42LjBgOyAxMC54IHJlcXVpcmVzIGA+PTQuMTIuMGAvYD49NC4xNC4wYAogICBhbmQgd291bGQgY29uZmxpY3QpLgoyLiAqKkFkZCBhbmQgcmVnaXN0ZXIgYG9zaXNtIG9wZW5zdGFja2AgcGFzc3Rocm91Z2ggY29tbWFuZCoqIOKAlAogICBgb3Npc20vY29tbWFuZHMvb3BlbnN0YWNrLnB5YCArIGBzZXR1cC5jZmdgLiBUaGUgY29tbWFuZCBhbmQgaXRzIGVudHJ5CiAgIHBvaW50IGxhbmQgdG9nZXRoZXIgc28gdGhlIENMSSBpcyBuZXZlciBoYWxmLXJlZ2lzdGVyZWQuIGAtLW9zLWNsb3VkYAogICBpcyBpbmplY3RlZCBzbyB0aGUgY2xpZW50IHNlbGVjdHMgdGhlIHByb2ZpbGUgd2hvc2UgcGFzc3dvcmQKICAgYHNldHVwX2Nsb3VkX2Vudmlyb25tZW50YCB3cm90ZSBpbnRvIHRoZSB0ZW1wb3JhcnkgYGNsb3Vkcy55YW1sYC4KICAgQm90aCBgb3BlbnN0YWNrYCBhbmQgdGhlIGV4aXN0aW5nIGBvcGVuc3RhY2sgc3RyZXNzYCBlbnRyeSBwb2ludHMgYXJlCiAgIHJlZ2lzdGVyZWQ7IGNsaWZmIHJlc29sdmVzIHRoZSBsb25nZXN0IG1hdGNoaW5nIGNvbW1hbmQgcHJlZml4LCBzbwogICBgb3BlbnN0YWNrIHN0cmVzc2Aga2VlcHMgcm91dGluZyB0byBgT3BlblN0YWNrU3RyZXNzYCB3aGlsZQogICBgb3BlbnN0YWNrIHNlcnZlciBsaXN0YCByb3V0ZXMgdG8gdGhlIG5ldyBjb21tYW5kLgozLiAqKkFkZCB1bml0IHRlc3RzKiog4oCUIGB0ZXN0cy91bml0L2NvbW1hbmRzL3Rlc3Rfb3BlbnN0YWNrLnB5YC4gQ292ZXIKICAgYXJndW1lbnQgcGFzc3Rocm91Z2ggd2l0aCB0aGUgZGVmYXVsdCBgYWRtaW5gIGNsb3VkLCBgLS1jbG91ZGAKICAgc2VsZWN0aW9uLCB0aGUgc2V0dXAtZmFpbHVyZSBzaG9ydCBjaXJjdWl0LCBleGl0LWNvZGUgcHJvcGFnYXRpb24sIGEKICAgbWlzc2luZyBgb3BlbnN0YWNrYCBiaW5hcnksIGFuZCB0aGUgY2xpZmYgcm91dGluZyBjb2V4aXN0ZW5jZSB3aXRoCiAgIGBvcGVuc3RhY2sgc3RyZXNzYC4KNC4gKipEb2N1bWVudCBgb3Npc20gb3BlbnN0YWNrYCBpbiBDSEFOR0VMT0cqKiDigJQgYENIQU5HRUxPRy5tZGAuCgojIyBOb3RlcyBmb3IgcmV2aWV3ZXJzCgotICoqRXhlY3V0aW9uIG1vZGVsLioqIFRoZSBpc3N1ZSBzYXlzIGxvYWQgY3JlZGVudGlhbHMgInRoZSBzYW1lIHdheSB0aGUKICBmbGF2b3ItbWFuYWdlciBhbmQgaW1hZ2UtbWFuYWdlciBkbywiIHdoaWNoIGRpc3BhdGNoIGEgQ2VsZXJ5IHRhc2sgb24KICB0aGUgYG9wZW5zdGFja2Agd29ya2VyIHF1ZXVlLiBUaGlzIGNoYW5nZSByZXVzZXMgdGhlICpzYW1lIGNyZWRlbnRpYWwKICBoZWxwZXJzKiBidXQgcnVucyB0aGUgY2xpZW50ICoqaW4tcHJvY2VzcyoqIChsaWtlIGBvc2lzbSBvcGVuc3RhY2sKICBzdHJlc3NgKSByYXRoZXIgdGhhbiB2aWEgYSBDZWxlcnkgdGFzay4gT25seSB0aGUgaW4tcHJvY2VzcyBtb2RlbAogIGRlbGl2ZXJzIGEgdHJ1ZSB0cmFuc3BhcmVudCB3cmFwcGVyIOKAlCByZWFsIGV4aXQgY29kZXMgYW5kIHN0ZGlvL1RUWQogIHBhc3N0aHJvdWdoOyBhIENlbGVyeSByb3VuZC10cmlwIHdvdWxkIHN0cmVhbSBvdXRwdXQgdGhyb3VnaCBSZWRpcyBhbmQKICBsb3NlIGV4aXQtY29kZS9pbnRlcmFjdGl2aXR5IHRyYW5zcGFyZW5jeS4KLSAqKmBzdHJlc3NgIGlzIG5vdyBhIHJlc2VydmVkIHdvcmQgdW5kZXIgYG9zaXNtIG9wZW5zdGFja2AuKiogUGxhaW4KICBgb3BlbnN0YWNrYCBoYXMgbm8gYHN0cmVzc2Agc3ViY29tbWFuZCwgc28gbm90aGluZyByZWFsIGlzIGxvc3QuCi0gKipXb3JraW5nIGRpcmVjdG9yeS4qKiBgc2V0dXBfY2xvdWRfZW52aXJvbm1lbnRgIGBvcy5jaGRpcigiL3RtcCIpYCwgc28KICByZWxhdGl2ZSBwYXRocyBpbiBwYXNzZWQtdGhyb3VnaCBjb21tYW5kcyByZXNvbHZlIGFnYWluc3QgYC90bXBgLiBUaGlzCiAgaXMgcHJlLWV4aXN0aW5nIGJlaGF2aW91ciBzaGFyZWQgd2l0aCBgc3RyZXNzYC90aGUgbWFuYWdlcnMsIG5vdAogIGludHJvZHVjZWQgaGVyZS4KCi0tLQoKX0RyYWZ0ZWQgYnkgW3BsYW53ZXJrLXJldmlld10oaHR0cHM6Ly9naXRodWIuY29tL3BsYW53ZXJrL3BsYW53ZXJrLXJldmlldykgZTY5YTIzNyB3aXRoIENsYXVkZTpjbGF1ZGUtb3B1cy00LThfCg==
      patchset: 92ec67ea982c3289720ed7fda3f0163937369877
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 3d5c7b5973754999f7005857a00ce9168944f0f1
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 40ce664207a7cc7cf1e1cef2ea3aa90d6ab98d15
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 3d5c7b5973754999f7005857a00ce9168944f0f1
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
          untrusted/project_3/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/test-unit.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: 40ce664207a7cc7cf1e1cef2ea3aa90d6ab98d15
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2392/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
