all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe7f:f6e1
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      docker_image: frontend
      docker_namespace: osism
      docker_registry: osism.harbor.regio.digital
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 230e14dd-aaeb-47c1-98be-0e5d20b9384a
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe7f:f6e1
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.108
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.230
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe7f:f6e1
        region: null
        slot: null
      repository: osism/osism
  vars:
    docker_image: frontend
    docker_namespace: osism
    docker_registry: osism.harbor.regio.digital
    repository: osism/osism
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job container-image-python-osism-frontend-build explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: osism/python-osism/.zuul.yaml@main#87>'
      - '<Job container-image-python-osism-frontend-build explicit: None implied:
        None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 0db455a0dffd48349c6cbedfacd929d0
      build_refs:
      - branch: main
        change: '2499'
        change_message: "test: guard run_ansible_in_environment arg word-splitting\n\n##
          What\n\nAdds a unit-test regression guard for the argument-joining behaviour
          of\n`run_ansible_in_environment` in `osism/tasks/__init__.py`. **Test only
          \u2014 no\nbehaviour change.**\n\n## Why\n\n`run_ansible_in_environment`
          joins a *list* of arguments with plain spaces\n(`\" \".join(arguments)`)
          and runs the result through\n`subprocess.Popen(..., shell=True)`, so `/bin/sh`
          word-splits each element into\nseparate argv. Several callers deliberately
          rely on this \u2014 they pack multiple\nshell words into a **single** list
          element:\n\n- `commands/set.py`, `commands/noset.py`: `[\"-e status=True\",
          f\"-l {host}\"]`\n- `commands/validate.py`: `\"-e kolla_action=config_validate\"`\n-
          `commands/apply.py`: `[f\"-e kolla_action={action}\"] + arguments`\n\nThe
          `run-<environment>.sh` scripts forward args via `\"$@\"` (no re-split),
          so the\nouter-shell split is load-bearing.\n\nThis makes the join fragile
          in a non-obvious way: a value containing a shell\nmetacharacter (e.g. `tempest_include_regex=(A|B)`)
          breaks at `/bin/sh`\n(`Syntax error: \"(\" unexpected`). The tempting one-line
          \"fix\" \u2014\n`\" \".join(shlex.quote(a) for a in arguments)` \u2014 would
          **regress** the callers\nabove by gluing `-e status=True` into a single
          token, and the existing\n`test_run_ansible_list_arguments_joined` would
          not catch it (it uses only\nsingle-word elements, on which `shlex.quote`
          is a no-op).\n\n## What the guard does\n\nPins the multi-token behaviour:
          a space-containing element must stay word-split\nand must **not** be per-element
          quoted. It fails under a naive per-element\n`shlex.quote`, and its comment
          records the safe alternatives (split each element\non whitespace first *then*
          quote, or normalise the callers to emit already-split\ntokens) so a future
          metacharacter-safety fix is done without breaking the\nsplit-dependent callers.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2499
        commit_id: a2d13cc6f34a92420abac52c8176401bce14f534
        patchset: a2d13cc6f34a92420abac52c8176401bce14f534
        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: 4be20c1ef4384d83b7c66bbe7da7f330
      buildset_refs:
      - branch: main
        change: '2499'
        change_message: "test: guard run_ansible_in_environment arg word-splitting\n\n##
          What\n\nAdds a unit-test regression guard for the argument-joining behaviour
          of\n`run_ansible_in_environment` in `osism/tasks/__init__.py`. **Test only
          \u2014 no\nbehaviour change.**\n\n## Why\n\n`run_ansible_in_environment`
          joins a *list* of arguments with plain spaces\n(`\" \".join(arguments)`)
          and runs the result through\n`subprocess.Popen(..., shell=True)`, so `/bin/sh`
          word-splits each element into\nseparate argv. Several callers deliberately
          rely on this \u2014 they pack multiple\nshell words into a **single** list
          element:\n\n- `commands/set.py`, `commands/noset.py`: `[\"-e status=True\",
          f\"-l {host}\"]`\n- `commands/validate.py`: `\"-e kolla_action=config_validate\"`\n-
          `commands/apply.py`: `[f\"-e kolla_action={action}\"] + arguments`\n\nThe
          `run-<environment>.sh` scripts forward args via `\"$@\"` (no re-split),
          so the\nouter-shell split is load-bearing.\n\nThis makes the join fragile
          in a non-obvious way: a value containing a shell\nmetacharacter (e.g. `tempest_include_regex=(A|B)`)
          breaks at `/bin/sh`\n(`Syntax error: \"(\" unexpected`). The tempting one-line
          \"fix\" \u2014\n`\" \".join(shlex.quote(a) for a in arguments)` \u2014 would
          **regress** the callers\nabove by gluing `-e status=True` into a single
          token, and the existing\n`test_run_ansible_list_arguments_joined` would
          not catch it (it uses only\nsingle-word elements, on which `shlex.quote`
          is a no-op).\n\n## What the guard does\n\nPins the multi-token behaviour:
          a space-containing element must stay word-split\nand must **not** be per-element
          quoted. It fails under a naive per-element\n`shlex.quote`, and its comment
          records the safe alternatives (split each element\non whitespace first *then*
          quote, or normalise the callers to emit already-split\ntokens) so a future
          metacharacter-safety fix is done without breaking the\nsplit-dependent callers.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2499
        commit_id: a2d13cc6f34a92420abac52c8176401bce14f534
        patchset: a2d13cc6f34a92420abac52c8176401bce14f534
        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: '2499'
      change_message: "test: guard run_ansible_in_environment arg word-splitting\n\n##
        What\n\nAdds a unit-test regression guard for the argument-joining behaviour
        of\n`run_ansible_in_environment` in `osism/tasks/__init__.py`. **Test only
        \u2014 no\nbehaviour change.**\n\n## Why\n\n`run_ansible_in_environment` joins
        a *list* of arguments with plain spaces\n(`\" \".join(arguments)`) and runs
        the result through\n`subprocess.Popen(..., shell=True)`, so `/bin/sh` word-splits
        each element into\nseparate argv. Several callers deliberately rely on this
        \u2014 they pack multiple\nshell words into a **single** list element:\n\n-
        `commands/set.py`, `commands/noset.py`: `[\"-e status=True\", f\"-l {host}\"]`\n-
        `commands/validate.py`: `\"-e kolla_action=config_validate\"`\n- `commands/apply.py`:
        `[f\"-e kolla_action={action}\"] + arguments`\n\nThe `run-<environment>.sh`
        scripts forward args via `\"$@\"` (no re-split), so the\nouter-shell split
        is load-bearing.\n\nThis makes the join fragile in a non-obvious way: a value
        containing a shell\nmetacharacter (e.g. `tempest_include_regex=(A|B)`) breaks
        at `/bin/sh`\n(`Syntax error: \"(\" unexpected`). The tempting one-line \"fix\"
        \u2014\n`\" \".join(shlex.quote(a) for a in arguments)` \u2014 would **regress**
        the callers\nabove by gluing `-e status=True` into a single token, and the
        existing\n`test_run_ansible_list_arguments_joined` would not catch it (it
        uses only\nsingle-word elements, on which `shlex.quote` is a no-op).\n\n##
        What the guard does\n\nPins the multi-token behaviour: a space-containing
        element must stay word-split\nand must **not** be per-element quoted. It fails
        under a naive per-element\n`shlex.quote`, and its comment records the safe
        alternatives (split each element\non whitespace first *then* quote, or normalise
        the callers to emit already-split\ntokens) so a future metacharacter-safety
        fix is done without breaking the\nsplit-dependent callers.\n\n\U0001F916 Generated
        with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2499
      child_jobs: []
      commit_id: a2d13cc6f34a92420abac52c8176401bce14f534
      event_id: 099e77e0-850f-11f1-9a95-4882340614af
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/0db455a0dffd48349c6cbedfacd929d0/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/0db455a0dffd48349c6cbedfacd929d0/work/logs
        result_data_file: /var/lib/zuul/builds/0db455a0dffd48349c6cbedfacd929d0/work/results.json
        src_root: /var/lib/zuul/builds/0db455a0dffd48349c6cbedfacd929d0/work/src
        work_root: /var/lib/zuul/builds/0db455a0dffd48349c6cbedfacd929d0/work
      include_vars: []
      items:
      - branch: main
        change: '2499'
        change_message: "test: guard run_ansible_in_environment arg word-splitting\n\n##
          What\n\nAdds a unit-test regression guard for the argument-joining behaviour
          of\n`run_ansible_in_environment` in `osism/tasks/__init__.py`. **Test only
          \u2014 no\nbehaviour change.**\n\n## Why\n\n`run_ansible_in_environment`
          joins a *list* of arguments with plain spaces\n(`\" \".join(arguments)`)
          and runs the result through\n`subprocess.Popen(..., shell=True)`, so `/bin/sh`
          word-splits each element into\nseparate argv. Several callers deliberately
          rely on this \u2014 they pack multiple\nshell words into a **single** list
          element:\n\n- `commands/set.py`, `commands/noset.py`: `[\"-e status=True\",
          f\"-l {host}\"]`\n- `commands/validate.py`: `\"-e kolla_action=config_validate\"`\n-
          `commands/apply.py`: `[f\"-e kolla_action={action}\"] + arguments`\n\nThe
          `run-<environment>.sh` scripts forward args via `\"$@\"` (no re-split),
          so the\nouter-shell split is load-bearing.\n\nThis makes the join fragile
          in a non-obvious way: a value containing a shell\nmetacharacter (e.g. `tempest_include_regex=(A|B)`)
          breaks at `/bin/sh`\n(`Syntax error: \"(\" unexpected`). The tempting one-line
          \"fix\" \u2014\n`\" \".join(shlex.quote(a) for a in arguments)` \u2014 would
          **regress** the callers\nabove by gluing `-e status=True` into a single
          token, and the existing\n`test_run_ansible_list_arguments_joined` would
          not catch it (it uses only\nsingle-word elements, on which `shlex.quote`
          is a no-op).\n\n## What the guard does\n\nPins the multi-token behaviour:
          a space-containing element must stay word-split\nand must **not** be per-element
          quoted. It fails under a naive per-element\n`shlex.quote`, and its comment
          records the safe alternatives (split each element\non whitespace first *then*
          quote, or normalise the callers to emit already-split\ntokens) so a future
          metacharacter-safety fix is done without breaking the\nsplit-dependent callers.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2499
        commit_id: a2d13cc6f34a92420abac52c8176401bce14f534
        patchset: a2d13cc6f34a92420abac52c8176401bce14f534
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
        topic: null
      job: container-image-python-osism-frontend-build
      jobtags: []
      max_attempts: 3
      message: dGVzdDogZ3VhcmQgcnVuX2Fuc2libGVfaW5fZW52aXJvbm1lbnQgYXJnIHdvcmQtc3BsaXR0aW5nCgojIyBXaGF0CgpBZGRzIGEgdW5pdC10ZXN0IHJlZ3Jlc3Npb24gZ3VhcmQgZm9yIHRoZSBhcmd1bWVudC1qb2luaW5nIGJlaGF2aW91ciBvZgpgcnVuX2Fuc2libGVfaW5fZW52aXJvbm1lbnRgIGluIGBvc2lzbS90YXNrcy9fX2luaXRfXy5weWAuICoqVGVzdCBvbmx5IOKAlCBubwpiZWhhdmlvdXIgY2hhbmdlLioqCgojIyBXaHkKCmBydW5fYW5zaWJsZV9pbl9lbnZpcm9ubWVudGAgam9pbnMgYSAqbGlzdCogb2YgYXJndW1lbnRzIHdpdGggcGxhaW4gc3BhY2VzCihgIiAiLmpvaW4oYXJndW1lbnRzKWApIGFuZCBydW5zIHRoZSByZXN1bHQgdGhyb3VnaApgc3VicHJvY2Vzcy5Qb3BlbiguLi4sIHNoZWxsPVRydWUpYCwgc28gYC9iaW4vc2hgIHdvcmQtc3BsaXRzIGVhY2ggZWxlbWVudCBpbnRvCnNlcGFyYXRlIGFyZ3YuIFNldmVyYWwgY2FsbGVycyBkZWxpYmVyYXRlbHkgcmVseSBvbiB0aGlzIOKAlCB0aGV5IHBhY2sgbXVsdGlwbGUKc2hlbGwgd29yZHMgaW50byBhICoqc2luZ2xlKiogbGlzdCBlbGVtZW50OgoKLSBgY29tbWFuZHMvc2V0LnB5YCwgYGNvbW1hbmRzL25vc2V0LnB5YDogYFsiLWUgc3RhdHVzPVRydWUiLCBmIi1sIHtob3N0fSJdYAotIGBjb21tYW5kcy92YWxpZGF0ZS5weWA6IGAiLWUga29sbGFfYWN0aW9uPWNvbmZpZ192YWxpZGF0ZSJgCi0gYGNvbW1hbmRzL2FwcGx5LnB5YDogYFtmIi1lIGtvbGxhX2FjdGlvbj17YWN0aW9ufSJdICsgYXJndW1lbnRzYAoKVGhlIGBydW4tPGVudmlyb25tZW50Pi5zaGAgc2NyaXB0cyBmb3J3YXJkIGFyZ3MgdmlhIGAiJEAiYCAobm8gcmUtc3BsaXQpLCBzbyB0aGUKb3V0ZXItc2hlbGwgc3BsaXQgaXMgbG9hZC1iZWFyaW5nLgoKVGhpcyBtYWtlcyB0aGUgam9pbiBmcmFnaWxlIGluIGEgbm9uLW9idmlvdXMgd2F5OiBhIHZhbHVlIGNvbnRhaW5pbmcgYSBzaGVsbAptZXRhY2hhcmFjdGVyIChlLmcuIGB0ZW1wZXN0X2luY2x1ZGVfcmVnZXg9KEF8QilgKSBicmVha3MgYXQgYC9iaW4vc2hgCihgU3ludGF4IGVycm9yOiAiKCIgdW5leHBlY3RlZGApLiBUaGUgdGVtcHRpbmcgb25lLWxpbmUgImZpeCIg4oCUCmAiICIuam9pbihzaGxleC5xdW90ZShhKSBmb3IgYSBpbiBhcmd1bWVudHMpYCDigJQgd291bGQgKipyZWdyZXNzKiogdGhlIGNhbGxlcnMKYWJvdmUgYnkgZ2x1aW5nIGAtZSBzdGF0dXM9VHJ1ZWAgaW50byBhIHNpbmdsZSB0b2tlbiwgYW5kIHRoZSBleGlzdGluZwpgdGVzdF9ydW5fYW5zaWJsZV9saXN0X2FyZ3VtZW50c19qb2luZWRgIHdvdWxkIG5vdCBjYXRjaCBpdCAoaXQgdXNlcyBvbmx5CnNpbmdsZS13b3JkIGVsZW1lbnRzLCBvbiB3aGljaCBgc2hsZXgucXVvdGVgIGlzIGEgbm8tb3ApLgoKIyMgV2hhdCB0aGUgZ3VhcmQgZG9lcwoKUGlucyB0aGUgbXVsdGktdG9rZW4gYmVoYXZpb3VyOiBhIHNwYWNlLWNvbnRhaW5pbmcgZWxlbWVudCBtdXN0IHN0YXkgd29yZC1zcGxpdAphbmQgbXVzdCAqKm5vdCoqIGJlIHBlci1lbGVtZW50IHF1b3RlZC4gSXQgZmFpbHMgdW5kZXIgYSBuYWl2ZSBwZXItZWxlbWVudApgc2hsZXgucXVvdGVgLCBhbmQgaXRzIGNvbW1lbnQgcmVjb3JkcyB0aGUgc2FmZSBhbHRlcm5hdGl2ZXMgKHNwbGl0IGVhY2ggZWxlbWVudApvbiB3aGl0ZXNwYWNlIGZpcnN0ICp0aGVuKiBxdW90ZSwgb3Igbm9ybWFsaXNlIHRoZSBjYWxsZXJzIHRvIGVtaXQgYWxyZWFkeS1zcGxpdAp0b2tlbnMpIHNvIGEgZnV0dXJlIG1ldGFjaGFyYWN0ZXItc2FmZXR5IGZpeCBpcyBkb25lIHdpdGhvdXQgYnJlYWtpbmcgdGhlCnNwbGl0LWRlcGVuZGVudCBjYWxsZXJzLgoK8J+kliBHZW5lcmF0ZWQgd2l0aCBbQ2xhdWRlIENvZGVdKGh0dHBzOi8vY2xhdWRlLmNvbS9jbGF1ZGUtY29kZSk=
      patchset: a2d13cc6f34a92420abac52c8176401bce14f534
      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: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 11cc524b48007642ec2c7e2549bd0b471b7ccd5d
          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: 1d71e58c93442038e695a5d883d57a603182c7ae
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/build.yml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_1/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_2/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_3/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_3/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/python-osism
        name: osism/python-osism
        short_name: python-osism
        src_dir: src/github.com/osism/python-osism
      projects:
        github.com/osism/python-osism:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          checkout: main
          checkout_description: zuul branch
          commit: 11cc524b48007642ec2c7e2549bd0b471b7ccd5d
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2499/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
