all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe5b:ba06
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 77a40321-c913-4e63-887b-ef2a5685bdbd
        host_id: ec4f54fa666de9bc553bc59c41683f12345b665d0b1af00d715e7318
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe5b:ba06
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.127
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.141
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe5b:ba06
        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 check-shell-syntax explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#17>'
      - '<Job check-shell-syntax explicit: None implied: None source: osism/generics/.zuul.yaml@main#123>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: e56c6cbd6fc3494099f0b8059ebe9b6f
      build_refs:
      - branch: main
        change: '599'
        change_message: "inventory: add neutron 2025.2 service groups\n\n## What\n\nAdd
          three kolla inventory groups to `inventory/51-kolla`, all mapping to `control`
          (mirroring `neutron-server`):\n\n- `[neutron-rpc-server:children]`\n- `[neutron-periodic-worker:children]`\n-
          `[neutron-ovn-maintenance-worker:children]`\n\n## Why\n\nkolla-ansible `stable/2025.2`
          split three new, default-enabled services out of `neutron-server`, each
          carrying `host_in_groups: \"{{ inventory_hostname in groups['<name>'] }}\"`.
          Building the haproxy-config `with_dict` loop templates the whole `neutron_services`
          dict, so every entry's `host_in_groups` is evaluated; a lookup on a group
          absent from this inventory aborts templating with `'dict object' has no
          attribute 'neutron-rpc-server'` (the \"dict object\" is the `groups` var,
          not `neutron_services`).\n\nThis inventory shipped `neutron-server` but
          never gained the three new groups, so **`testbed-upgrade-stable-next-ubuntu-24.04`
          fails during \"Run upgrade\"** once the 2025.2 neutron role is in play.
          The failure surfaces on `neutron-rpc-server` first only because templating
          stops at the first missing key \u2014 the other two groups are the same
          gap and would surface next.\n\n`stable/2025.2 ansible/inventory/multinode`
          places all three under `control`, which this change matches.\n\n## Context\n\nThis
          is one wall in a 2025.2-upgrade \"gauntlet\" of new-service wiring deficits:
          each cleared blocker exposes the next. The immediately preceding wall was
          the keystone-httpd image (`'docker_image_url' is undefined`). Image overrides
          for these neutron services already exist in `osism/defaults`; this closes
          the remaining **inventory-group** side.\n\n## Timeline (observed)\n\n| Date
          | Failure point |\n|------|---------------|\n| 06-19 / 06-20 | keystone-httpd
          image (`docker_image_url` undefined) \u2014 before neutron |\n| 06-21 |
          this gap (`neutron-rpc-server` group) \u2014 first reached |\n| 06-22 /
          06-23 | masked by earlier pre-neutron failures (SSH timeout, bootstrap)
          |\n| 06-24 | this gap again |\n\n## Caveat\n\nWon't go quiet until merged
          **and** the nightly manager picks up the new `osism.generics` tag via gilt.
          Clearing neutron may expose whatever is immediately downstream \u2014 but
          the static wiring gap is closed here."
        change_url: https://github.com/osism/generics/pull/599
        commit_id: 079a3c07e913001a43fb445f753c98da88d54eb9
        patchset: 079a3c07e913001a43fb445f753c98da88d54eb9
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/generics
          name: osism/generics
          short_name: generics
        src_dir: src/github.com/osism/generics
        topic: null
      buildset: 8fccaee520464139b5f81b5f7d0939fd
      buildset_refs:
      - branch: main
        change: '599'
        change_message: "inventory: add neutron 2025.2 service groups\n\n## What\n\nAdd
          three kolla inventory groups to `inventory/51-kolla`, all mapping to `control`
          (mirroring `neutron-server`):\n\n- `[neutron-rpc-server:children]`\n- `[neutron-periodic-worker:children]`\n-
          `[neutron-ovn-maintenance-worker:children]`\n\n## Why\n\nkolla-ansible `stable/2025.2`
          split three new, default-enabled services out of `neutron-server`, each
          carrying `host_in_groups: \"{{ inventory_hostname in groups['<name>'] }}\"`.
          Building the haproxy-config `with_dict` loop templates the whole `neutron_services`
          dict, so every entry's `host_in_groups` is evaluated; a lookup on a group
          absent from this inventory aborts templating with `'dict object' has no
          attribute 'neutron-rpc-server'` (the \"dict object\" is the `groups` var,
          not `neutron_services`).\n\nThis inventory shipped `neutron-server` but
          never gained the three new groups, so **`testbed-upgrade-stable-next-ubuntu-24.04`
          fails during \"Run upgrade\"** once the 2025.2 neutron role is in play.
          The failure surfaces on `neutron-rpc-server` first only because templating
          stops at the first missing key \u2014 the other two groups are the same
          gap and would surface next.\n\n`stable/2025.2 ansible/inventory/multinode`
          places all three under `control`, which this change matches.\n\n## Context\n\nThis
          is one wall in a 2025.2-upgrade \"gauntlet\" of new-service wiring deficits:
          each cleared blocker exposes the next. The immediately preceding wall was
          the keystone-httpd image (`'docker_image_url' is undefined`). Image overrides
          for these neutron services already exist in `osism/defaults`; this closes
          the remaining **inventory-group** side.\n\n## Timeline (observed)\n\n| Date
          | Failure point |\n|------|---------------|\n| 06-19 / 06-20 | keystone-httpd
          image (`docker_image_url` undefined) \u2014 before neutron |\n| 06-21 |
          this gap (`neutron-rpc-server` group) \u2014 first reached |\n| 06-22 /
          06-23 | masked by earlier pre-neutron failures (SSH timeout, bootstrap)
          |\n| 06-24 | this gap again |\n\n## Caveat\n\nWon't go quiet until merged
          **and** the nightly manager picks up the new `osism.generics` tag via gilt.
          Clearing neutron may expose whatever is immediately downstream \u2014 but
          the static wiring gap is closed here."
        change_url: https://github.com/osism/generics/pull/599
        commit_id: 079a3c07e913001a43fb445f753c98da88d54eb9
        patchset: 079a3c07e913001a43fb445f753c98da88d54eb9
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/generics
          name: osism/generics
          short_name: generics
        src_dir: src/github.com/osism/generics
        topic: null
      change: '599'
      change_message: "inventory: add neutron 2025.2 service groups\n\n## What\n\nAdd
        three kolla inventory groups to `inventory/51-kolla`, all mapping to `control`
        (mirroring `neutron-server`):\n\n- `[neutron-rpc-server:children]`\n- `[neutron-periodic-worker:children]`\n-
        `[neutron-ovn-maintenance-worker:children]`\n\n## Why\n\nkolla-ansible `stable/2025.2`
        split three new, default-enabled services out of `neutron-server`, each carrying
        `host_in_groups: \"{{ inventory_hostname in groups['<name>'] }}\"`. Building
        the haproxy-config `with_dict` loop templates the whole `neutron_services`
        dict, so every entry's `host_in_groups` is evaluated; a lookup on a group
        absent from this inventory aborts templating with `'dict object' has no attribute
        'neutron-rpc-server'` (the \"dict object\" is the `groups` var, not `neutron_services`).\n\nThis
        inventory shipped `neutron-server` but never gained the three new groups,
        so **`testbed-upgrade-stable-next-ubuntu-24.04` fails during \"Run upgrade\"**
        once the 2025.2 neutron role is in play. The failure surfaces on `neutron-rpc-server`
        first only because templating stops at the first missing key \u2014 the other
        two groups are the same gap and would surface next.\n\n`stable/2025.2 ansible/inventory/multinode`
        places all three under `control`, which this change matches.\n\n## Context\n\nThis
        is one wall in a 2025.2-upgrade \"gauntlet\" of new-service wiring deficits:
        each cleared blocker exposes the next. The immediately preceding wall was
        the keystone-httpd image (`'docker_image_url' is undefined`). Image overrides
        for these neutron services already exist in `osism/defaults`; this closes
        the remaining **inventory-group** side.\n\n## Timeline (observed)\n\n| Date
        | Failure point |\n|------|---------------|\n| 06-19 / 06-20 | keystone-httpd
        image (`docker_image_url` undefined) \u2014 before neutron |\n| 06-21 | this
        gap (`neutron-rpc-server` group) \u2014 first reached |\n| 06-22 / 06-23 |
        masked by earlier pre-neutron failures (SSH timeout, bootstrap) |\n| 06-24
        | this gap again |\n\n## Caveat\n\nWon't go quiet until merged **and** the
        nightly manager picks up the new `osism.generics` tag via gilt. Clearing neutron
        may expose whatever is immediately downstream \u2014 but the static wiring
        gap is closed here."
      change_url: https://github.com/osism/generics/pull/599
      child_jobs: []
      commit_id: 079a3c07e913001a43fb445f753c98da88d54eb9
      event_id: 843a19d0-6f90-11f1-832e-7c9d48f86dfd
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/e56c6cbd6fc3494099f0b8059ebe9b6f/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/e56c6cbd6fc3494099f0b8059ebe9b6f/work/logs
        result_data_file: /var/lib/zuul/builds/e56c6cbd6fc3494099f0b8059ebe9b6f/work/results.json
        src_root: /var/lib/zuul/builds/e56c6cbd6fc3494099f0b8059ebe9b6f/work/src
        work_root: /var/lib/zuul/builds/e56c6cbd6fc3494099f0b8059ebe9b6f/work
      include_vars: []
      items:
      - branch: main
        change: '599'
        change_message: "inventory: add neutron 2025.2 service groups\n\n## What\n\nAdd
          three kolla inventory groups to `inventory/51-kolla`, all mapping to `control`
          (mirroring `neutron-server`):\n\n- `[neutron-rpc-server:children]`\n- `[neutron-periodic-worker:children]`\n-
          `[neutron-ovn-maintenance-worker:children]`\n\n## Why\n\nkolla-ansible `stable/2025.2`
          split three new, default-enabled services out of `neutron-server`, each
          carrying `host_in_groups: \"{{ inventory_hostname in groups['<name>'] }}\"`.
          Building the haproxy-config `with_dict` loop templates the whole `neutron_services`
          dict, so every entry's `host_in_groups` is evaluated; a lookup on a group
          absent from this inventory aborts templating with `'dict object' has no
          attribute 'neutron-rpc-server'` (the \"dict object\" is the `groups` var,
          not `neutron_services`).\n\nThis inventory shipped `neutron-server` but
          never gained the three new groups, so **`testbed-upgrade-stable-next-ubuntu-24.04`
          fails during \"Run upgrade\"** once the 2025.2 neutron role is in play.
          The failure surfaces on `neutron-rpc-server` first only because templating
          stops at the first missing key \u2014 the other two groups are the same
          gap and would surface next.\n\n`stable/2025.2 ansible/inventory/multinode`
          places all three under `control`, which this change matches.\n\n## Context\n\nThis
          is one wall in a 2025.2-upgrade \"gauntlet\" of new-service wiring deficits:
          each cleared blocker exposes the next. The immediately preceding wall was
          the keystone-httpd image (`'docker_image_url' is undefined`). Image overrides
          for these neutron services already exist in `osism/defaults`; this closes
          the remaining **inventory-group** side.\n\n## Timeline (observed)\n\n| Date
          | Failure point |\n|------|---------------|\n| 06-19 / 06-20 | keystone-httpd
          image (`docker_image_url` undefined) \u2014 before neutron |\n| 06-21 |
          this gap (`neutron-rpc-server` group) \u2014 first reached |\n| 06-22 /
          06-23 | masked by earlier pre-neutron failures (SSH timeout, bootstrap)
          |\n| 06-24 | this gap again |\n\n## Caveat\n\nWon't go quiet until merged
          **and** the nightly manager picks up the new `osism.generics` tag via gilt.
          Clearing neutron may expose whatever is immediately downstream \u2014 but
          the static wiring gap is closed here."
        change_url: https://github.com/osism/generics/pull/599
        commit_id: 079a3c07e913001a43fb445f753c98da88d54eb9
        patchset: 079a3c07e913001a43fb445f753c98da88d54eb9
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/generics
          name: osism/generics
          short_name: generics
          src_dir: src/github.com/osism/generics
        topic: null
      job: check-shell-syntax
      jobtags: []
      max_attempts: 3
      message: aW52ZW50b3J5OiBhZGQgbmV1dHJvbiAyMDI1LjIgc2VydmljZSBncm91cHMKCiMjIFdoYXQKCkFkZCB0aHJlZSBrb2xsYSBpbnZlbnRvcnkgZ3JvdXBzIHRvIGBpbnZlbnRvcnkvNTEta29sbGFgLCBhbGwgbWFwcGluZyB0byBgY29udHJvbGAgKG1pcnJvcmluZyBgbmV1dHJvbi1zZXJ2ZXJgKToKCi0gYFtuZXV0cm9uLXJwYy1zZXJ2ZXI6Y2hpbGRyZW5dYAotIGBbbmV1dHJvbi1wZXJpb2RpYy13b3JrZXI6Y2hpbGRyZW5dYAotIGBbbmV1dHJvbi1vdm4tbWFpbnRlbmFuY2Utd29ya2VyOmNoaWxkcmVuXWAKCiMjIFdoeQoKa29sbGEtYW5zaWJsZSBgc3RhYmxlLzIwMjUuMmAgc3BsaXQgdGhyZWUgbmV3LCBkZWZhdWx0LWVuYWJsZWQgc2VydmljZXMgb3V0IG9mIGBuZXV0cm9uLXNlcnZlcmAsIGVhY2ggY2FycnlpbmcgYGhvc3RfaW5fZ3JvdXBzOiAie3sgaW52ZW50b3J5X2hvc3RuYW1lIGluIGdyb3Vwc1snPG5hbWU+J10gfX0iYC4gQnVpbGRpbmcgdGhlIGhhcHJveHktY29uZmlnIGB3aXRoX2RpY3RgIGxvb3AgdGVtcGxhdGVzIHRoZSB3aG9sZSBgbmV1dHJvbl9zZXJ2aWNlc2AgZGljdCwgc28gZXZlcnkgZW50cnkncyBgaG9zdF9pbl9ncm91cHNgIGlzIGV2YWx1YXRlZDsgYSBsb29rdXAgb24gYSBncm91cCBhYnNlbnQgZnJvbSB0aGlzIGludmVudG9yeSBhYm9ydHMgdGVtcGxhdGluZyB3aXRoIGAnZGljdCBvYmplY3QnIGhhcyBubyBhdHRyaWJ1dGUgJ25ldXRyb24tcnBjLXNlcnZlcidgICh0aGUgImRpY3Qgb2JqZWN0IiBpcyB0aGUgYGdyb3Vwc2AgdmFyLCBub3QgYG5ldXRyb25fc2VydmljZXNgKS4KClRoaXMgaW52ZW50b3J5IHNoaXBwZWQgYG5ldXRyb24tc2VydmVyYCBidXQgbmV2ZXIgZ2FpbmVkIHRoZSB0aHJlZSBuZXcgZ3JvdXBzLCBzbyAqKmB0ZXN0YmVkLXVwZ3JhZGUtc3RhYmxlLW5leHQtdWJ1bnR1LTI0LjA0YCBmYWlscyBkdXJpbmcgIlJ1biB1cGdyYWRlIioqIG9uY2UgdGhlIDIwMjUuMiBuZXV0cm9uIHJvbGUgaXMgaW4gcGxheS4gVGhlIGZhaWx1cmUgc3VyZmFjZXMgb24gYG5ldXRyb24tcnBjLXNlcnZlcmAgZmlyc3Qgb25seSBiZWNhdXNlIHRlbXBsYXRpbmcgc3RvcHMgYXQgdGhlIGZpcnN0IG1pc3Npbmcga2V5IOKAlCB0aGUgb3RoZXIgdHdvIGdyb3VwcyBhcmUgdGhlIHNhbWUgZ2FwIGFuZCB3b3VsZCBzdXJmYWNlIG5leHQuCgpgc3RhYmxlLzIwMjUuMiBhbnNpYmxlL2ludmVudG9yeS9tdWx0aW5vZGVgIHBsYWNlcyBhbGwgdGhyZWUgdW5kZXIgYGNvbnRyb2xgLCB3aGljaCB0aGlzIGNoYW5nZSBtYXRjaGVzLgoKIyMgQ29udGV4dAoKVGhpcyBpcyBvbmUgd2FsbCBpbiBhIDIwMjUuMi11cGdyYWRlICJnYXVudGxldCIgb2YgbmV3LXNlcnZpY2Ugd2lyaW5nIGRlZmljaXRzOiBlYWNoIGNsZWFyZWQgYmxvY2tlciBleHBvc2VzIHRoZSBuZXh0LiBUaGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHdhbGwgd2FzIHRoZSBrZXlzdG9uZS1odHRwZCBpbWFnZSAoYCdkb2NrZXJfaW1hZ2VfdXJsJyBpcyB1bmRlZmluZWRgKS4gSW1hZ2Ugb3ZlcnJpZGVzIGZvciB0aGVzZSBuZXV0cm9uIHNlcnZpY2VzIGFscmVhZHkgZXhpc3QgaW4gYG9zaXNtL2RlZmF1bHRzYDsgdGhpcyBjbG9zZXMgdGhlIHJlbWFpbmluZyAqKmludmVudG9yeS1ncm91cCoqIHNpZGUuCgojIyBUaW1lbGluZSAob2JzZXJ2ZWQpCgp8IERhdGUgfCBGYWlsdXJlIHBvaW50IHwKfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS18CnwgMDYtMTkgLyAwNi0yMCB8IGtleXN0b25lLWh0dHBkIGltYWdlIChgZG9ja2VyX2ltYWdlX3VybGAgdW5kZWZpbmVkKSDigJQgYmVmb3JlIG5ldXRyb24gfAp8IDA2LTIxIHwgdGhpcyBnYXAgKGBuZXV0cm9uLXJwYy1zZXJ2ZXJgIGdyb3VwKSDigJQgZmlyc3QgcmVhY2hlZCB8CnwgMDYtMjIgLyAwNi0yMyB8IG1hc2tlZCBieSBlYXJsaWVyIHByZS1uZXV0cm9uIGZhaWx1cmVzIChTU0ggdGltZW91dCwgYm9vdHN0cmFwKSB8CnwgMDYtMjQgfCB0aGlzIGdhcCBhZ2FpbiB8CgojIyBDYXZlYXQKCldvbid0IGdvIHF1aWV0IHVudGlsIG1lcmdlZCAqKmFuZCoqIHRoZSBuaWdodGx5IG1hbmFnZXIgcGlja3MgdXAgdGhlIG5ldyBgb3Npc20uZ2VuZXJpY3NgIHRhZyB2aWEgZ2lsdC4gQ2xlYXJpbmcgbmV1dHJvbiBtYXkgZXhwb3NlIHdoYXRldmVyIGlzIGltbWVkaWF0ZWx5IGRvd25zdHJlYW0g4oCUIGJ1dCB0aGUgc3RhdGljIHdpcmluZyBnYXAgaXMgY2xvc2VkIGhlcmUu
      patchset: 079a3c07e913001a43fb445f753c98da88d54eb9
      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/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          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
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/check-shell-syntax/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/generics
        name: osism/generics
        short_name: generics
        src_dir: src/github.com/osism/generics
      projects:
        github.com/osism/generics:
          canonical_hostname: github.com
          canonical_name: github.com/osism/generics
          checkout: main
          checkout_description: zuul branch
          commit: 9ff4d0f5bbe8fe5d846331234fcd8f5737171abb
          name: osism/generics
          required: false
          short_name: generics
          src_dir: src/github.com/osism/generics
      ref: refs/pull/599/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
