all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.157
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      configure_swap_size: 8192
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
          /etc/magnum/magnum.conf:
            cluster_template:
              kubernetes_allowed_network_drivers: calico,cilium
              kubernetes_default_network_driver: calico
            nova_client:
              api_version: 2.15
          /etc/manila/manila.conf:
            generic:
              connect_share_server_to_tenant_network: true
              driver_handles_share_servers: true
      devstack_localrc:
        ADMIN_PASSWORD: secretadmin
        DATABASE_PASSWORD: secretdatabase
        DEBUG_LIBVIRT_COREDUMPS: true
        DISABLE_AMP_IMAGE_BUILD: true
        ENABLE_SYSCTL_MEM_TUNING: true
        ENABLE_SYSCTL_NET_TUNING: true
        ENABLE_ZSWAP: true
        ERROR_ON_CLONE: true
        FIXED_RANGE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        GIT_BASE: https://github.com
        HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
        MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
        MANILA_ENABLED_BACKENDS: generic
        MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
        NETWORK_GATEWAY: 10.1.0.1
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        NOVA_VNC_ENABLED: true
        OCTAVIA_NODE: api
        OVN_DBS_LOG_LEVEL: dbg
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        RABBIT_PASSWORD: secretrabbit
        SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4'']
          }}'
        SERVICE_PASSWORD: secretservice
        SWIFT_HASH: 1234123412341234
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
      devstack_plugins:
        barbican: https://github.com/openstack/barbican
        magnum: https://review.opendev.org/openstack/magnum
        magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
        manila: https://github.com/openstack/manila
        octavia: https://github.com/openstack/octavia
        ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
      devstack_services:
        base: false
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        dstat: false
        etcd3: true
        file_tracker: true
        g-api: true
        horizon: false
        key: true
        memory_tracker: true
        mysql: true
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        o-api: true
        o-da: true
        o-hk: true
        octavia: true
        openstack-cli-server: true
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        placement-api: true
        q-ovn-agent: true
        q-svc: true
        rabbit: true
        s-account: false
        s-container: false
        s-object: false
        s-proxy: false
        tempest: false
        tls-proxy: true
      extensions_to_txt:
        auto: true
        conf: true
        localrc: true
        log: true
        stackenv: true
      image_release: 2026.05-7
      image_url: https://github.com/vexxhost/capo-image-elements/releases/download/{{
        image_release }}/ubuntu-22.04-{{ kube_tag }}.qcow2
      kube_tag: v1.33.12
      network_driver: cilium
      nodepool:
        az: nova
        cloud: public
        external_id: 0465ad81-d40f-42a0-beca-dda36e8fefb6
        host_id: 86d6bbee9a590b753878988beec61ed4d37fe4ff9ff09e01cc4e099b
        interface_ip: 199.204.45.157
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.157
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.157
        public_ipv6: 2604:e100:1:0:f816:3eff:feaf:9fea
        region: ca-ymq-1
        slot: null
      zuul_copy_output:
        /etc/ceph: logs
        /etc/glusterfs/glusterd.vol: logs
        /etc/libvirt: logs
        /etc/lvm: logs
        /etc/resolv.conf: logs
        /etc/sudoers: logs
        /etc/sudoers.d: logs
        /var/log/ceph: logs
        /var/log/glusterfs: logs
        /var/log/libvirt: logs
        /var/log/mysql: logs
        /var/log/openvswitch: logs
        /var/log/postgresql: logs
        /var/log/rabbitmq: logs
        /var/log/unbound.log: logs
        '{{ devstack_conf_dir }}/.localrc.auto': logs
        '{{ devstack_conf_dir }}/.stackenv': logs
        '{{ devstack_conf_dir }}/local.conf': logs
        '{{ devstack_conf_dir }}/localrc': logs
        '{{ devstack_full_log}}': logs
        '{{ devstack_log_dir }}/atop': logs
        '{{ devstack_log_dir }}/devstacklog.txt': logs
        '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
        '{{ devstack_log_dir }}/dstat-csv.log': logs
        '{{ devstack_log_dir }}/qemu.coredump': logs
        '{{ devstack_log_dir }}/tcpdump.pcap': logs
        '{{ devstack_log_dir }}/worlddump-latest.txt': logs
        '{{ stage_dir }}/apache': logs
        '{{ stage_dir }}/apache_config': logs
        '{{ stage_dir }}/audit.log': logs
        '{{ stage_dir }}/core': logs
        '{{ stage_dir }}/deprecations.log': logs
        '{{ stage_dir }}/df.txt': logs
        '{{ stage_dir }}/dpkg-l.txt': logs
        '{{ stage_dir }}/etc': logs
        '{{ stage_dir }}/iptables.txt': logs
        '{{ stage_dir }}/listen53.txt': logs
        '{{ stage_dir }}/mount.txt': logs
        '{{ stage_dir }}/performance.json': logs
        '{{ stage_dir }}/pip2-freeze.txt': logs
        '{{ stage_dir }}/pip3-freeze.txt': logs
        '{{ stage_dir }}/rpm-qa.txt': logs
        '{{ stage_dir }}/services.txt': logs
        '{{ stage_dir }}/verify_tempest_conf.log': logs
      zuul_node:
        az: nova
        cloud: public
        external_id: 0465ad81-d40f-42a0-beca-dda36e8fefb6
        host_id: 86d6bbee9a590b753878988beec61ed4d37fe4ff9ff09e01cc4e099b
        interface_ip: 199.204.45.157
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.157
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.157
        public_ipv6: 2604:e100:1:0:f816:3eff:feaf:9fea
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    configure_swap_size: 8192
    devstack_local_conf:
      post-config:
        $NEUTRON_CONF:
          DEFAULT:
            global_physnet_mtu: '{{ external_bridge_mtu }}'
        /etc/magnum/magnum.conf:
          cluster_template:
            kubernetes_allowed_network_drivers: calico,cilium
            kubernetes_default_network_driver: calico
          nova_client:
            api_version: 2.15
        /etc/manila/manila.conf:
          generic:
            connect_share_server_to_tenant_network: true
            driver_handles_share_servers: true
    devstack_localrc:
      ADMIN_PASSWORD: secretadmin
      DATABASE_PASSWORD: secretdatabase
      DEBUG_LIBVIRT_COREDUMPS: true
      DISABLE_AMP_IMAGE_BUILD: true
      ENABLE_SYSCTL_MEM_TUNING: true
      ENABLE_SYSCTL_NET_TUNING: true
      ENABLE_ZSWAP: true
      ERROR_ON_CLONE: true
      FIXED_RANGE: 10.1.0.0/20
      FLOATING_RANGE: 172.24.5.0/24
      GIT_BASE: https://github.com
      HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
      LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
      LOGFILE: /opt/stack/logs/devstacklog.txt
      LOG_COLOR: false
      MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
      MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
      MANILA_ENABLED_BACKENDS: generic
      MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
      NETWORK_GATEWAY: 10.1.0.1
      NOVA_LIBVIRT_TB_CACHE_SIZE: 128
      NOVA_VNC_ENABLED: true
      OCTAVIA_NODE: api
      OVN_DBS_LOG_LEVEL: dbg
      PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
      PUBLIC_NETWORK_GATEWAY: 172.24.5.1
      RABBIT_PASSWORD: secretrabbit
      SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      SERVICE_PASSWORD: secretservice
      SWIFT_HASH: 1234123412341234
      SWIFT_REPLICAS: 1
      SWIFT_START_ALL_SERVICES: false
      VERBOSE: true
      VERBOSE_NO_TIMESTAMP: true
    devstack_plugins:
      barbican: https://github.com/openstack/barbican
      magnum: https://review.opendev.org/openstack/magnum
      magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
      manila: https://github.com/openstack/manila
      octavia: https://github.com/openstack/octavia
      ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
    devstack_services:
      base: false
      c-api: true
      c-bak: true
      c-sch: true
      c-vol: true
      dstat: false
      etcd3: true
      file_tracker: true
      g-api: true
      horizon: false
      key: true
      memory_tracker: true
      mysql: true
      n-api: true
      n-api-meta: true
      n-cond: true
      n-cpu: true
      n-novnc: true
      n-sch: true
      o-api: true
      o-da: true
      o-hk: true
      octavia: true
      openstack-cli-server: true
      ovn-controller: true
      ovn-northd: true
      ovs-vswitchd: true
      ovsdb-server: true
      placement-api: true
      q-ovn-agent: true
      q-svc: true
      rabbit: true
      s-account: false
      s-container: false
      s-object: false
      s-proxy: false
      tempest: false
      tls-proxy: true
    extensions_to_txt:
      auto: true
      conf: true
      localrc: true
      log: true
      stackenv: true
    image_release: 2026.05-7
    image_url: https://github.com/vexxhost/capo-image-elements/releases/download/{{
      image_release }}/ubuntu-22.04-{{ kube_tag }}.qcow2
    kube_tag: v1.33.12
    network_driver: cilium
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job openstack-multinode-fips explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#17>'
      - '<Job devstack-base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#368>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#502>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#545>'
      - '<Job magnum-cluster-api-devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-hydrophone explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#23>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.12 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#34>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.12-cilium explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#45>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.12-cilium explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 4b07e32b4e604215beda674075c01dd4
      build_refs:
      - branch: main
        change: '1016'
        change_message: "fix(labels): merge cluster_template labels into sparse cluster.labels\n\n##
          Summary\n\nMagnum `cluster create --labels` replaces, rather than merges,
          cluster-template labels. When an operator creates a cluster with sparse
          custom labels, the stored cluster row can miss labels required by the Rust
          `ClusterLabels` extractor, such as `kube_tag`.\n\nThis PR fills those missing
          template-derived labels before the Rust create/delete paths and persists
          the completed label dict on create.\n\n## Fix\n\n- Add `utils.fill_missing_labels_from_template(cluster)`
          to fill missing labels without overriding user-provided cluster labels.\n-
          Prefer `cluster.labels_skipped` before `cluster.cluster_template.labels`,
          matching Magnum's stored representation for template-only labels on sparse-label
          creates.\n- Invoke the helper before Rust create/delete paths.\n- Persist
          the filled label dict during create when it changes, so later status/health
          monitor reads see the completed labels from Magnum storage.\n- Tolerate
          CAPI `Cluster` objects that do not yet have `status.conditions` during early
          reconciliation.\n\nThis absorbs the label/status pieces from draft PR #1070
          while keeping the PR #1016 persistence path as the base.\n\n## Repro\n\n1.
          Create a cluster template with labels like `kube_tag`, `fixed_subnet_cidr`,
          and `octavia_provider`.\n2. Run `openstack coe cluster create --labels audit_log_enabled=true`
          while omitting those template labels.\n3. The sparse cluster row can later
          fail Rust label extraction with `KeyError: 'kube_tag'`, especially in status/health
          monitor or delete paths.\n\n## Validation\n\n```bash\nuv run --python 3.10
          pytest \\\n  magnum_cluster_api/tests/unit/test_utils.py \\\n  -q -k 'FillMissingLabelsFromTemplate'\n#
          5 passed, 16 deselected\n\nuv run --python 3.10 pytest \\\n  magnum_cluster_api/tests/unit/test_driver.py
          \\\n  -q -k 'persists_template_labels or test_create_cluster'\n# 8 passed,
          32 deselected\n\ngit diff --check\n# passed\n\nuv build --wheel\n# built
          magnum_cluster_api-0.36.6-cp38-abi3-linux_x86_64.whl\n```\n\nMain AIO validation
          on `38.108.68.251`:\n\n- Built and rolled `ghcr.io/vexxhost/magnum:mcapi-pr1016-6edb0c0a-main`
          from this PR head.\n- Build-time checks verified the installed package contains
          `labels_skipped` and safe `obj.get(\"status\", {}).get(\"conditions\", [])`
          lookup.\n- Magnum API, conductor, and mCAPI proxy rolled out successfully.\n-
          Live conductor in-process probe passed:\n  - sparse labels filled from `labels_skipped`
          first, then template labels\n  - missing CAPI `status.conditions` produced
          an empty status map instead of `KeyError`\n- Final cluster and cluster-template
          lists were empty.\n\nv6.9.0 stable AIO validation on `38.108.68.67`:\n\n-
          Existing fixed v0.36.2 image includes the same logical label/status fixes
          with PR #1039 + PR #1040.\n- Live conductor probe passed for `labels_skipped`
          label merge and missing CAPI `status.conditions`.\n- Re-ran `/root/mcapi-v0362-pr1039-1040-fd48-lifecycle.sh`
          in tmux session `mcapi-v0362-pr1039-1040-fd48-pr1016-validate-20260617-023934`.\n-
          Sparse-label cluster create reached `CREATE_COMPLETE` at `2026-06-17T02:48:27Z`.\n-
          Kubeconfig showed control-plane and worker nodes Ready on Kubernetes `v1.34.3`.\n-
          Resize to zero workers reached `UPDATE_COMPLETE` at `2026-06-17T02:48:52Z`.\n-
          CA rotate returned the known unsupported HTTP 400 and credential rotate
          returned the known HTTP 405/rc=0 behavior.\n- Delete completed at `2026-06-17T02:50:47Z`.\n-
          Final cluster and cluster-template lists were empty.\n\n## Notes\n\n- The
          full guest lifecycle on the main AIO remains limited by the previously documented
          `pause:3.9` registry/DNS path, so the main-node validation here is the direct
          deployed-code probe plus rollout health.\n- This supersedes draft PR #1051,
          which duplicated the same label fallback after unrelated fixes were dropped.\n-
          Originally fixed as part of #1015 commit `1930573` alongside unrelated `extra_cloud_init`
          fixes; split out here so the label fallback can land independently.\n\nSigned-off-by:
          Rico Lin <rlin@vexxhost.com>\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1016
        commit_id: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
        patchset: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      buildset: add09b8314c14394ab7b96dbc148eaa7
      buildset_refs:
      - branch: main
        change: '1016'
        change_message: "fix(labels): merge cluster_template labels into sparse cluster.labels\n\n##
          Summary\n\nMagnum `cluster create --labels` replaces, rather than merges,
          cluster-template labels. When an operator creates a cluster with sparse
          custom labels, the stored cluster row can miss labels required by the Rust
          `ClusterLabels` extractor, such as `kube_tag`.\n\nThis PR fills those missing
          template-derived labels before the Rust create/delete paths and persists
          the completed label dict on create.\n\n## Fix\n\n- Add `utils.fill_missing_labels_from_template(cluster)`
          to fill missing labels without overriding user-provided cluster labels.\n-
          Prefer `cluster.labels_skipped` before `cluster.cluster_template.labels`,
          matching Magnum's stored representation for template-only labels on sparse-label
          creates.\n- Invoke the helper before Rust create/delete paths.\n- Persist
          the filled label dict during create when it changes, so later status/health
          monitor reads see the completed labels from Magnum storage.\n- Tolerate
          CAPI `Cluster` objects that do not yet have `status.conditions` during early
          reconciliation.\n\nThis absorbs the label/status pieces from draft PR #1070
          while keeping the PR #1016 persistence path as the base.\n\n## Repro\n\n1.
          Create a cluster template with labels like `kube_tag`, `fixed_subnet_cidr`,
          and `octavia_provider`.\n2. Run `openstack coe cluster create --labels audit_log_enabled=true`
          while omitting those template labels.\n3. The sparse cluster row can later
          fail Rust label extraction with `KeyError: 'kube_tag'`, especially in status/health
          monitor or delete paths.\n\n## Validation\n\n```bash\nuv run --python 3.10
          pytest \\\n  magnum_cluster_api/tests/unit/test_utils.py \\\n  -q -k 'FillMissingLabelsFromTemplate'\n#
          5 passed, 16 deselected\n\nuv run --python 3.10 pytest \\\n  magnum_cluster_api/tests/unit/test_driver.py
          \\\n  -q -k 'persists_template_labels or test_create_cluster'\n# 8 passed,
          32 deselected\n\ngit diff --check\n# passed\n\nuv build --wheel\n# built
          magnum_cluster_api-0.36.6-cp38-abi3-linux_x86_64.whl\n```\n\nMain AIO validation
          on `38.108.68.251`:\n\n- Built and rolled `ghcr.io/vexxhost/magnum:mcapi-pr1016-6edb0c0a-main`
          from this PR head.\n- Build-time checks verified the installed package contains
          `labels_skipped` and safe `obj.get(\"status\", {}).get(\"conditions\", [])`
          lookup.\n- Magnum API, conductor, and mCAPI proxy rolled out successfully.\n-
          Live conductor in-process probe passed:\n  - sparse labels filled from `labels_skipped`
          first, then template labels\n  - missing CAPI `status.conditions` produced
          an empty status map instead of `KeyError`\n- Final cluster and cluster-template
          lists were empty.\n\nv6.9.0 stable AIO validation on `38.108.68.67`:\n\n-
          Existing fixed v0.36.2 image includes the same logical label/status fixes
          with PR #1039 + PR #1040.\n- Live conductor probe passed for `labels_skipped`
          label merge and missing CAPI `status.conditions`.\n- Re-ran `/root/mcapi-v0362-pr1039-1040-fd48-lifecycle.sh`
          in tmux session `mcapi-v0362-pr1039-1040-fd48-pr1016-validate-20260617-023934`.\n-
          Sparse-label cluster create reached `CREATE_COMPLETE` at `2026-06-17T02:48:27Z`.\n-
          Kubeconfig showed control-plane and worker nodes Ready on Kubernetes `v1.34.3`.\n-
          Resize to zero workers reached `UPDATE_COMPLETE` at `2026-06-17T02:48:52Z`.\n-
          CA rotate returned the known unsupported HTTP 400 and credential rotate
          returned the known HTTP 405/rc=0 behavior.\n- Delete completed at `2026-06-17T02:50:47Z`.\n-
          Final cluster and cluster-template lists were empty.\n\n## Notes\n\n- The
          full guest lifecycle on the main AIO remains limited by the previously documented
          `pause:3.9` registry/DNS path, so the main-node validation here is the direct
          deployed-code probe plus rollout health.\n- This supersedes draft PR #1051,
          which duplicated the same label fallback after unrelated fixes were dropped.\n-
          Originally fixed as part of #1015 commit `1930573` alongside unrelated `extra_cloud_init`
          fixes; split out here so the label fallback can land independently.\n\nSigned-off-by:
          Rico Lin <rlin@vexxhost.com>\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1016
        commit_id: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
        patchset: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      change: '1016'
      change_message: "fix(labels): merge cluster_template labels into sparse cluster.labels\n\n##
        Summary\n\nMagnum `cluster create --labels` replaces, rather than merges,
        cluster-template labels. When an operator creates a cluster with sparse custom
        labels, the stored cluster row can miss labels required by the Rust `ClusterLabels`
        extractor, such as `kube_tag`.\n\nThis PR fills those missing template-derived
        labels before the Rust create/delete paths and persists the completed label
        dict on create.\n\n## Fix\n\n- Add `utils.fill_missing_labels_from_template(cluster)`
        to fill missing labels without overriding user-provided cluster labels.\n-
        Prefer `cluster.labels_skipped` before `cluster.cluster_template.labels`,
        matching Magnum's stored representation for template-only labels on sparse-label
        creates.\n- Invoke the helper before Rust create/delete paths.\n- Persist
        the filled label dict during create when it changes, so later status/health
        monitor reads see the completed labels from Magnum storage.\n- Tolerate CAPI
        `Cluster` objects that do not yet have `status.conditions` during early reconciliation.\n\nThis
        absorbs the label/status pieces from draft PR #1070 while keeping the PR #1016
        persistence path as the base.\n\n## Repro\n\n1. Create a cluster template
        with labels like `kube_tag`, `fixed_subnet_cidr`, and `octavia_provider`.\n2.
        Run `openstack coe cluster create --labels audit_log_enabled=true` while omitting
        those template labels.\n3. The sparse cluster row can later fail Rust label
        extraction with `KeyError: 'kube_tag'`, especially in status/health monitor
        or delete paths.\n\n## Validation\n\n```bash\nuv run --python 3.10 pytest
        \\\n  magnum_cluster_api/tests/unit/test_utils.py \\\n  -q -k 'FillMissingLabelsFromTemplate'\n#
        5 passed, 16 deselected\n\nuv run --python 3.10 pytest \\\n  magnum_cluster_api/tests/unit/test_driver.py
        \\\n  -q -k 'persists_template_labels or test_create_cluster'\n# 8 passed,
        32 deselected\n\ngit diff --check\n# passed\n\nuv build --wheel\n# built magnum_cluster_api-0.36.6-cp38-abi3-linux_x86_64.whl\n```\n\nMain
        AIO validation on `38.108.68.251`:\n\n- Built and rolled `ghcr.io/vexxhost/magnum:mcapi-pr1016-6edb0c0a-main`
        from this PR head.\n- Build-time checks verified the installed package contains
        `labels_skipped` and safe `obj.get(\"status\", {}).get(\"conditions\", [])`
        lookup.\n- Magnum API, conductor, and mCAPI proxy rolled out successfully.\n-
        Live conductor in-process probe passed:\n  - sparse labels filled from `labels_skipped`
        first, then template labels\n  - missing CAPI `status.conditions` produced
        an empty status map instead of `KeyError`\n- Final cluster and cluster-template
        lists were empty.\n\nv6.9.0 stable AIO validation on `38.108.68.67`:\n\n-
        Existing fixed v0.36.2 image includes the same logical label/status fixes
        with PR #1039 + PR #1040.\n- Live conductor probe passed for `labels_skipped`
        label merge and missing CAPI `status.conditions`.\n- Re-ran `/root/mcapi-v0362-pr1039-1040-fd48-lifecycle.sh`
        in tmux session `mcapi-v0362-pr1039-1040-fd48-pr1016-validate-20260617-023934`.\n-
        Sparse-label cluster create reached `CREATE_COMPLETE` at `2026-06-17T02:48:27Z`.\n-
        Kubeconfig showed control-plane and worker nodes Ready on Kubernetes `v1.34.3`.\n-
        Resize to zero workers reached `UPDATE_COMPLETE` at `2026-06-17T02:48:52Z`.\n-
        CA rotate returned the known unsupported HTTP 400 and credential rotate returned
        the known HTTP 405/rc=0 behavior.\n- Delete completed at `2026-06-17T02:50:47Z`.\n-
        Final cluster and cluster-template lists were empty.\n\n## Notes\n\n- The
        full guest lifecycle on the main AIO remains limited by the previously documented
        `pause:3.9` registry/DNS path, so the main-node validation here is the direct
        deployed-code probe plus rollout health.\n- This supersedes draft PR #1051,
        which duplicated the same label fallback after unrelated fixes were dropped.\n-
        Originally fixed as part of #1015 commit `1930573` alongside unrelated `extra_cloud_init`
        fixes; split out here so the label fallback can land independently.\n\nSigned-off-by:
        Rico Lin <rlin@vexxhost.com>\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1016
      child_jobs: []
      commit_id: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
      event_id: 5e442780-6a0d-11f1-908c-870c05e639e1
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/4b07e32b4e604215beda674075c01dd4/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/4b07e32b4e604215beda674075c01dd4/work/logs
        result_data_file: /var/lib/zuul/builds/4b07e32b4e604215beda674075c01dd4/work/results.json
        src_root: /var/lib/zuul/builds/4b07e32b4e604215beda674075c01dd4/work/src
        work_root: /var/lib/zuul/builds/4b07e32b4e604215beda674075c01dd4/work
      include_vars: []
      items:
      - branch: main
        change: '1016'
        change_message: "fix(labels): merge cluster_template labels into sparse cluster.labels\n\n##
          Summary\n\nMagnum `cluster create --labels` replaces, rather than merges,
          cluster-template labels. When an operator creates a cluster with sparse
          custom labels, the stored cluster row can miss labels required by the Rust
          `ClusterLabels` extractor, such as `kube_tag`.\n\nThis PR fills those missing
          template-derived labels before the Rust create/delete paths and persists
          the completed label dict on create.\n\n## Fix\n\n- Add `utils.fill_missing_labels_from_template(cluster)`
          to fill missing labels without overriding user-provided cluster labels.\n-
          Prefer `cluster.labels_skipped` before `cluster.cluster_template.labels`,
          matching Magnum's stored representation for template-only labels on sparse-label
          creates.\n- Invoke the helper before Rust create/delete paths.\n- Persist
          the filled label dict during create when it changes, so later status/health
          monitor reads see the completed labels from Magnum storage.\n- Tolerate
          CAPI `Cluster` objects that do not yet have `status.conditions` during early
          reconciliation.\n\nThis absorbs the label/status pieces from draft PR #1070
          while keeping the PR #1016 persistence path as the base.\n\n## Repro\n\n1.
          Create a cluster template with labels like `kube_tag`, `fixed_subnet_cidr`,
          and `octavia_provider`.\n2. Run `openstack coe cluster create --labels audit_log_enabled=true`
          while omitting those template labels.\n3. The sparse cluster row can later
          fail Rust label extraction with `KeyError: 'kube_tag'`, especially in status/health
          monitor or delete paths.\n\n## Validation\n\n```bash\nuv run --python 3.10
          pytest \\\n  magnum_cluster_api/tests/unit/test_utils.py \\\n  -q -k 'FillMissingLabelsFromTemplate'\n#
          5 passed, 16 deselected\n\nuv run --python 3.10 pytest \\\n  magnum_cluster_api/tests/unit/test_driver.py
          \\\n  -q -k 'persists_template_labels or test_create_cluster'\n# 8 passed,
          32 deselected\n\ngit diff --check\n# passed\n\nuv build --wheel\n# built
          magnum_cluster_api-0.36.6-cp38-abi3-linux_x86_64.whl\n```\n\nMain AIO validation
          on `38.108.68.251`:\n\n- Built and rolled `ghcr.io/vexxhost/magnum:mcapi-pr1016-6edb0c0a-main`
          from this PR head.\n- Build-time checks verified the installed package contains
          `labels_skipped` and safe `obj.get(\"status\", {}).get(\"conditions\", [])`
          lookup.\n- Magnum API, conductor, and mCAPI proxy rolled out successfully.\n-
          Live conductor in-process probe passed:\n  - sparse labels filled from `labels_skipped`
          first, then template labels\n  - missing CAPI `status.conditions` produced
          an empty status map instead of `KeyError`\n- Final cluster and cluster-template
          lists were empty.\n\nv6.9.0 stable AIO validation on `38.108.68.67`:\n\n-
          Existing fixed v0.36.2 image includes the same logical label/status fixes
          with PR #1039 + PR #1040.\n- Live conductor probe passed for `labels_skipped`
          label merge and missing CAPI `status.conditions`.\n- Re-ran `/root/mcapi-v0362-pr1039-1040-fd48-lifecycle.sh`
          in tmux session `mcapi-v0362-pr1039-1040-fd48-pr1016-validate-20260617-023934`.\n-
          Sparse-label cluster create reached `CREATE_COMPLETE` at `2026-06-17T02:48:27Z`.\n-
          Kubeconfig showed control-plane and worker nodes Ready on Kubernetes `v1.34.3`.\n-
          Resize to zero workers reached `UPDATE_COMPLETE` at `2026-06-17T02:48:52Z`.\n-
          CA rotate returned the known unsupported HTTP 400 and credential rotate
          returned the known HTTP 405/rc=0 behavior.\n- Delete completed at `2026-06-17T02:50:47Z`.\n-
          Final cluster and cluster-template lists were empty.\n\n## Notes\n\n- The
          full guest lifecycle on the main AIO remains limited by the previously documented
          `pause:3.9` registry/DNS path, so the main-node validation here is the direct
          deployed-code probe plus rollout health.\n- This supersedes draft PR #1051,
          which duplicated the same label fallback after unrelated fixes were dropped.\n-
          Originally fixed as part of #1015 commit `1930573` alongside unrelated `extra_cloud_init`
          fixes; split out here so the label fallback can land independently.\n\nSigned-off-by:
          Rico Lin <rlin@vexxhost.com>\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1016
        commit_id: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
        patchset: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      job: magnum-cluster-api-hydrophone-v1.33.12-cilium
      jobtags: []
      max_attempts: 3
      message: Zml4KGxhYmVscyk6IG1lcmdlIGNsdXN0ZXJfdGVtcGxhdGUgbGFiZWxzIGludG8gc3BhcnNlIGNsdXN0ZXIubGFiZWxzCgojIyBTdW1tYXJ5CgpNYWdudW0gYGNsdXN0ZXIgY3JlYXRlIC0tbGFiZWxzYCByZXBsYWNlcywgcmF0aGVyIHRoYW4gbWVyZ2VzLCBjbHVzdGVyLXRlbXBsYXRlIGxhYmVscy4gV2hlbiBhbiBvcGVyYXRvciBjcmVhdGVzIGEgY2x1c3RlciB3aXRoIHNwYXJzZSBjdXN0b20gbGFiZWxzLCB0aGUgc3RvcmVkIGNsdXN0ZXIgcm93IGNhbiBtaXNzIGxhYmVscyByZXF1aXJlZCBieSB0aGUgUnVzdCBgQ2x1c3RlckxhYmVsc2AgZXh0cmFjdG9yLCBzdWNoIGFzIGBrdWJlX3RhZ2AuCgpUaGlzIFBSIGZpbGxzIHRob3NlIG1pc3NpbmcgdGVtcGxhdGUtZGVyaXZlZCBsYWJlbHMgYmVmb3JlIHRoZSBSdXN0IGNyZWF0ZS9kZWxldGUgcGF0aHMgYW5kIHBlcnNpc3RzIHRoZSBjb21wbGV0ZWQgbGFiZWwgZGljdCBvbiBjcmVhdGUuCgojIyBGaXgKCi0gQWRkIGB1dGlscy5maWxsX21pc3NpbmdfbGFiZWxzX2Zyb21fdGVtcGxhdGUoY2x1c3RlcilgIHRvIGZpbGwgbWlzc2luZyBsYWJlbHMgd2l0aG91dCBvdmVycmlkaW5nIHVzZXItcHJvdmlkZWQgY2x1c3RlciBsYWJlbHMuCi0gUHJlZmVyIGBjbHVzdGVyLmxhYmVsc19za2lwcGVkYCBiZWZvcmUgYGNsdXN0ZXIuY2x1c3Rlcl90ZW1wbGF0ZS5sYWJlbHNgLCBtYXRjaGluZyBNYWdudW0ncyBzdG9yZWQgcmVwcmVzZW50YXRpb24gZm9yIHRlbXBsYXRlLW9ubHkgbGFiZWxzIG9uIHNwYXJzZS1sYWJlbCBjcmVhdGVzLgotIEludm9rZSB0aGUgaGVscGVyIGJlZm9yZSBSdXN0IGNyZWF0ZS9kZWxldGUgcGF0aHMuCi0gUGVyc2lzdCB0aGUgZmlsbGVkIGxhYmVsIGRpY3QgZHVyaW5nIGNyZWF0ZSB3aGVuIGl0IGNoYW5nZXMsIHNvIGxhdGVyIHN0YXR1cy9oZWFsdGggbW9uaXRvciByZWFkcyBzZWUgdGhlIGNvbXBsZXRlZCBsYWJlbHMgZnJvbSBNYWdudW0gc3RvcmFnZS4KLSBUb2xlcmF0ZSBDQVBJIGBDbHVzdGVyYCBvYmplY3RzIHRoYXQgZG8gbm90IHlldCBoYXZlIGBzdGF0dXMuY29uZGl0aW9uc2AgZHVyaW5nIGVhcmx5IHJlY29uY2lsaWF0aW9uLgoKVGhpcyBhYnNvcmJzIHRoZSBsYWJlbC9zdGF0dXMgcGllY2VzIGZyb20gZHJhZnQgUFIgIzEwNzAgd2hpbGUga2VlcGluZyB0aGUgUFIgIzEwMTYgcGVyc2lzdGVuY2UgcGF0aCBhcyB0aGUgYmFzZS4KCiMjIFJlcHJvCgoxLiBDcmVhdGUgYSBjbHVzdGVyIHRlbXBsYXRlIHdpdGggbGFiZWxzIGxpa2UgYGt1YmVfdGFnYCwgYGZpeGVkX3N1Ym5ldF9jaWRyYCwgYW5kIGBvY3RhdmlhX3Byb3ZpZGVyYC4KMi4gUnVuIGBvcGVuc3RhY2sgY29lIGNsdXN0ZXIgY3JlYXRlIC0tbGFiZWxzIGF1ZGl0X2xvZ19lbmFibGVkPXRydWVgIHdoaWxlIG9taXR0aW5nIHRob3NlIHRlbXBsYXRlIGxhYmVscy4KMy4gVGhlIHNwYXJzZSBjbHVzdGVyIHJvdyBjYW4gbGF0ZXIgZmFpbCBSdXN0IGxhYmVsIGV4dHJhY3Rpb24gd2l0aCBgS2V5RXJyb3I6ICdrdWJlX3RhZydgLCBlc3BlY2lhbGx5IGluIHN0YXR1cy9oZWFsdGggbW9uaXRvciBvciBkZWxldGUgcGF0aHMuCgojIyBWYWxpZGF0aW9uCgpgYGBiYXNoCnV2IHJ1biAtLXB5dGhvbiAzLjEwIHB5dGVzdCBcCiAgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF91dGlscy5weSBcCiAgLXEgLWsgJ0ZpbGxNaXNzaW5nTGFiZWxzRnJvbVRlbXBsYXRlJwojIDUgcGFzc2VkLCAxNiBkZXNlbGVjdGVkCgp1diBydW4gLS1weXRob24gMy4xMCBweXRlc3QgXAogIG1hZ251bV9jbHVzdGVyX2FwaS90ZXN0cy91bml0L3Rlc3RfZHJpdmVyLnB5IFwKICAtcSAtayAncGVyc2lzdHNfdGVtcGxhdGVfbGFiZWxzIG9yIHRlc3RfY3JlYXRlX2NsdXN0ZXInCiMgOCBwYXNzZWQsIDMyIGRlc2VsZWN0ZWQKCmdpdCBkaWZmIC0tY2hlY2sKIyBwYXNzZWQKCnV2IGJ1aWxkIC0td2hlZWwKIyBidWlsdCBtYWdudW1fY2x1c3Rlcl9hcGktMC4zNi42LWNwMzgtYWJpMy1saW51eF94ODZfNjQud2hsCmBgYAoKTWFpbiBBSU8gdmFsaWRhdGlvbiBvbiBgMzguMTA4LjY4LjI1MWA6CgotIEJ1aWx0IGFuZCByb2xsZWQgYGdoY3IuaW8vdmV4eGhvc3QvbWFnbnVtOm1jYXBpLXByMTAxNi02ZWRiMGMwYS1tYWluYCBmcm9tIHRoaXMgUFIgaGVhZC4KLSBCdWlsZC10aW1lIGNoZWNrcyB2ZXJpZmllZCB0aGUgaW5zdGFsbGVkIHBhY2thZ2UgY29udGFpbnMgYGxhYmVsc19za2lwcGVkYCBhbmQgc2FmZSBgb2JqLmdldCgic3RhdHVzIiwge30pLmdldCgiY29uZGl0aW9ucyIsIFtdKWAgbG9va3VwLgotIE1hZ251bSBBUEksIGNvbmR1Y3RvciwgYW5kIG1DQVBJIHByb3h5IHJvbGxlZCBvdXQgc3VjY2Vzc2Z1bGx5LgotIExpdmUgY29uZHVjdG9yIGluLXByb2Nlc3MgcHJvYmUgcGFzc2VkOgogIC0gc3BhcnNlIGxhYmVscyBmaWxsZWQgZnJvbSBgbGFiZWxzX3NraXBwZWRgIGZpcnN0LCB0aGVuIHRlbXBsYXRlIGxhYmVscwogIC0gbWlzc2luZyBDQVBJIGBzdGF0dXMuY29uZGl0aW9uc2AgcHJvZHVjZWQgYW4gZW1wdHkgc3RhdHVzIG1hcCBpbnN0ZWFkIG9mIGBLZXlFcnJvcmAKLSBGaW5hbCBjbHVzdGVyIGFuZCBjbHVzdGVyLXRlbXBsYXRlIGxpc3RzIHdlcmUgZW1wdHkuCgp2Ni45LjAgc3RhYmxlIEFJTyB2YWxpZGF0aW9uIG9uIGAzOC4xMDguNjguNjdgOgoKLSBFeGlzdGluZyBmaXhlZCB2MC4zNi4yIGltYWdlIGluY2x1ZGVzIHRoZSBzYW1lIGxvZ2ljYWwgbGFiZWwvc3RhdHVzIGZpeGVzIHdpdGggUFIgIzEwMzkgKyBQUiAjMTA0MC4KLSBMaXZlIGNvbmR1Y3RvciBwcm9iZSBwYXNzZWQgZm9yIGBsYWJlbHNfc2tpcHBlZGAgbGFiZWwgbWVyZ2UgYW5kIG1pc3NpbmcgQ0FQSSBgc3RhdHVzLmNvbmRpdGlvbnNgLgotIFJlLXJhbiBgL3Jvb3QvbWNhcGktdjAzNjItcHIxMDM5LTEwNDAtZmQ0OC1saWZlY3ljbGUuc2hgIGluIHRtdXggc2Vzc2lvbiBgbWNhcGktdjAzNjItcHIxMDM5LTEwNDAtZmQ0OC1wcjEwMTYtdmFsaWRhdGUtMjAyNjA2MTctMDIzOTM0YC4KLSBTcGFyc2UtbGFiZWwgY2x1c3RlciBjcmVhdGUgcmVhY2hlZCBgQ1JFQVRFX0NPTVBMRVRFYCBhdCBgMjAyNi0wNi0xN1QwMjo0ODoyN1pgLgotIEt1YmVjb25maWcgc2hvd2VkIGNvbnRyb2wtcGxhbmUgYW5kIHdvcmtlciBub2RlcyBSZWFkeSBvbiBLdWJlcm5ldGVzIGB2MS4zNC4zYC4KLSBSZXNpemUgdG8gemVybyB3b3JrZXJzIHJlYWNoZWQgYFVQREFURV9DT01QTEVURWAgYXQgYDIwMjYtMDYtMTdUMDI6NDg6NTJaYC4KLSBDQSByb3RhdGUgcmV0dXJuZWQgdGhlIGtub3duIHVuc3VwcG9ydGVkIEhUVFAgNDAwIGFuZCBjcmVkZW50aWFsIHJvdGF0ZSByZXR1cm5lZCB0aGUga25vd24gSFRUUCA0MDUvcmM9MCBiZWhhdmlvci4KLSBEZWxldGUgY29tcGxldGVkIGF0IGAyMDI2LTA2LTE3VDAyOjUwOjQ3WmAuCi0gRmluYWwgY2x1c3RlciBhbmQgY2x1c3Rlci10ZW1wbGF0ZSBsaXN0cyB3ZXJlIGVtcHR5LgoKIyMgTm90ZXMKCi0gVGhlIGZ1bGwgZ3Vlc3QgbGlmZWN5Y2xlIG9uIHRoZSBtYWluIEFJTyByZW1haW5zIGxpbWl0ZWQgYnkgdGhlIHByZXZpb3VzbHkgZG9jdW1lbnRlZCBgcGF1c2U6My45YCByZWdpc3RyeS9ETlMgcGF0aCwgc28gdGhlIG1haW4tbm9kZSB2YWxpZGF0aW9uIGhlcmUgaXMgdGhlIGRpcmVjdCBkZXBsb3llZC1jb2RlIHByb2JlIHBsdXMgcm9sbG91dCBoZWFsdGguCi0gVGhpcyBzdXBlcnNlZGVzIGRyYWZ0IFBSICMxMDUxLCB3aGljaCBkdXBsaWNhdGVkIHRoZSBzYW1lIGxhYmVsIGZhbGxiYWNrIGFmdGVyIHVucmVsYXRlZCBmaXhlcyB3ZXJlIGRyb3BwZWQuCi0gT3JpZ2luYWxseSBmaXhlZCBhcyBwYXJ0IG9mICMxMDE1IGNvbW1pdCBgMTkzMDU3M2AgYWxvbmdzaWRlIHVucmVsYXRlZCBgZXh0cmFfY2xvdWRfaW5pdGAgZml4ZXM7IHNwbGl0IG91dCBoZXJlIHNvIHRoZSBsYWJlbCBmYWxsYmFjayBjYW4gbGFuZCBpbmRlcGVuZGVudGx5LgoKU2lnbmVkLW9mZi1ieTogUmljbyBMaW4gPHJsaW5AdmV4eGhvc3QuY29tPgo=
      override_checkout: master
      patchset: 5ac4c317fb6fb6e84c292b123d892a0b167feae7
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 82e3e8b1292a25e38235bb92b157992d326531d1
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: 37fb911deef99dce62bfce22cce767b821a23bb1
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: fd9e34d76181633827d5705dc02fadb789fe3bf7
          untrusted/project_2/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          untrusted/project_3/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 82e3e8b1292a25e38235bb92b157992d326531d1
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: ed9d0995597e18d226389d4a2bd84c340b64a06f
        playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/run.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_5/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/post.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_5/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/post.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/post_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_4/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_2/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_2/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_2/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_2/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_3/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_3/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_3/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_3/role_2/zuul-jobs/roles
        pre_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/pre.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_0/role_2/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/pre.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_4/zuul-jobs/roles
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/pre.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_2/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_2/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_5/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/magnum-cluster-api
        name: vexxhost/magnum-cluster-api
        short_name: magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
      projects:
        github.com/novnc/novnc:
          canonical_hostname: github.com
          canonical_name: github.com/novnc/novnc
          checkout: master
          checkout_description: job override ref
          commit: 7c36fabe599e053c5a81e98e091ac636f6c1e174
          name: novnc/novnc
          required: true
          short_name: novnc
          src_dir: src/github.com/novnc/novnc
        github.com/vexxhost/magnum-cluster-api:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          checkout: main
          checkout_description: zuul branch
          commit: ed9d0995597e18d226389d4a2bd84c340b64a06f
          name: vexxhost/magnum-cluster-api
          required: false
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        opendev.org/openstack/barbican:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/barbican
          checkout: master
          checkout_description: job override ref
          commit: a9b738f9c21e41c123e60dfe02888477c9886603
          name: openstack/barbican
          required: true
          short_name: barbican
          src_dir: src/opendev.org/openstack/barbican
        opendev.org/openstack/cinder:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/cinder
          checkout: master
          checkout_description: job override ref
          commit: f59cf1c9b974d6ef24e51c4f87b8dff076a7222b
          name: openstack/cinder
          required: true
          short_name: cinder
          src_dir: src/opendev.org/openstack/cinder
        opendev.org/openstack/devstack:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/devstack
          checkout: master
          checkout_description: job override ref
          commit: 37fb911deef99dce62bfce22cce767b821a23bb1
          name: openstack/devstack
          required: true
          short_name: devstack
          src_dir: src/opendev.org/openstack/devstack
        opendev.org/openstack/glance:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/glance
          checkout: master
          checkout_description: job override ref
          commit: edf97a1b5b6790f7e79315a11c3f70cc92553ef8
          name: openstack/glance
          required: true
          short_name: glance
          src_dir: src/opendev.org/openstack/glance
        opendev.org/openstack/keystone:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/keystone
          checkout: master
          checkout_description: job override ref
          commit: 8e78573a95426f194789f7a13e9f298f1133faf1
          name: openstack/keystone
          required: true
          short_name: keystone
          src_dir: src/opendev.org/openstack/keystone
        opendev.org/openstack/magnum:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/magnum
          checkout: master
          checkout_description: job override ref
          commit: b9a40a6f0ecd692a1fe7cc0f18454413505b44df
          name: openstack/magnum
          required: true
          short_name: magnum
          src_dir: src/opendev.org/openstack/magnum
        opendev.org/openstack/manila:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/manila
          checkout: master
          checkout_description: job override ref
          commit: 5cf57fbe77c3ede8914294524fefd4f2134c2d40
          name: openstack/manila
          required: true
          short_name: manila
          src_dir: src/opendev.org/openstack/manila
        opendev.org/openstack/neutron:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/neutron
          checkout: master
          checkout_description: job override ref
          commit: 5c095ee6e162f6820b3b8dae1f783f9cf4c74764
          name: openstack/neutron
          required: true
          short_name: neutron
          src_dir: src/opendev.org/openstack/neutron
        opendev.org/openstack/nova:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/nova
          checkout: master
          checkout_description: job override ref
          commit: 9e069e30b372376a8de96a8c78f38dc7b64cae9b
          name: openstack/nova
          required: true
          short_name: nova
          src_dir: src/opendev.org/openstack/nova
        opendev.org/openstack/octavia:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/octavia
          checkout: master
          checkout_description: job override ref
          commit: 9ff4683c8212e4c043af69f1b5ebadc21651dc58
          name: openstack/octavia
          required: true
          short_name: octavia
          src_dir: src/opendev.org/openstack/octavia
        opendev.org/openstack/os-test-images:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/os-test-images
          checkout: master
          checkout_description: job override ref
          commit: 5d0367e03788764f41da8effffa14e3eac513201
          name: openstack/os-test-images
          required: true
          short_name: os-test-images
          src_dir: src/opendev.org/openstack/os-test-images
        opendev.org/openstack/ovn-octavia-provider:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/ovn-octavia-provider
          checkout: master
          checkout_description: job override ref
          commit: 890b6266450916ddf9ef8c0a157f3fe4eb03e7a5
          name: openstack/ovn-octavia-provider
          required: true
          short_name: ovn-octavia-provider
          src_dir: src/opendev.org/openstack/ovn-octavia-provider
        opendev.org/openstack/placement:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/placement
          checkout: master
          checkout_description: job override ref
          commit: 3cba66c70ce49e31e582c8d03e945017f38fcf11
          name: openstack/placement
          required: true
          short_name: placement
          src_dir: src/opendev.org/openstack/placement
        opendev.org/openstack/python-magnumclient:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/python-magnumclient
          checkout: master
          checkout_description: job override ref
          commit: 0cee96126c3fed1df41976493c17e4b54923ae5d
          name: openstack/python-magnumclient
          required: true
          short_name: python-magnumclient
          src_dir: src/opendev.org/openstack/python-magnumclient
        opendev.org/openstack/requirements:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/requirements
          checkout: master
          checkout_description: job override ref
          commit: b83fbd73926b84db0c913b943f72c71c1cadc641
          name: openstack/requirements
          required: true
          short_name: requirements
          src_dir: src/opendev.org/openstack/requirements
        opendev.org/openstack/swift:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/swift
          checkout: master
          checkout_description: job override ref
          commit: bab1688e2c91cb9866c714ee77bb8c45f6885e7b
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/1016/head
      resources: {}
      tenant: oss
      timeout: 7200
      topic: null
      voting: true
    zuul_copy_output:
      /etc/ceph: logs
      /etc/glusterfs/glusterd.vol: logs
      /etc/libvirt: logs
      /etc/lvm: logs
      /etc/resolv.conf: logs
      /etc/sudoers: logs
      /etc/sudoers.d: logs
      /var/log/ceph: logs
      /var/log/glusterfs: logs
      /var/log/libvirt: logs
      /var/log/mysql: logs
      /var/log/openvswitch: logs
      /var/log/postgresql: logs
      /var/log/rabbitmq: logs
      /var/log/unbound.log: logs
      '{{ devstack_conf_dir }}/.localrc.auto': logs
      '{{ devstack_conf_dir }}/.stackenv': logs
      '{{ devstack_conf_dir }}/local.conf': logs
      '{{ devstack_conf_dir }}/localrc': logs
      '{{ devstack_full_log}}': logs
      '{{ devstack_log_dir }}/atop': logs
      '{{ devstack_log_dir }}/devstacklog.txt': logs
      '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
      '{{ devstack_log_dir }}/dstat-csv.log': logs
      '{{ devstack_log_dir }}/qemu.coredump': logs
      '{{ devstack_log_dir }}/tcpdump.pcap': logs
      '{{ devstack_log_dir }}/worlddump-latest.txt': logs
      '{{ stage_dir }}/apache': logs
      '{{ stage_dir }}/apache_config': logs
      '{{ stage_dir }}/audit.log': logs
      '{{ stage_dir }}/core': logs
      '{{ stage_dir }}/deprecations.log': logs
      '{{ stage_dir }}/df.txt': logs
      '{{ stage_dir }}/dpkg-l.txt': logs
      '{{ stage_dir }}/etc': logs
      '{{ stage_dir }}/iptables.txt': logs
      '{{ stage_dir }}/listen53.txt': logs
      '{{ stage_dir }}/mount.txt': logs
      '{{ stage_dir }}/performance.json': logs
      '{{ stage_dir }}/pip2-freeze.txt': logs
      '{{ stage_dir }}/pip3-freeze.txt': logs
      '{{ stage_dir }}/rpm-qa.txt': logs
      '{{ stage_dir }}/services.txt': logs
      '{{ stage_dir }}/verify_tempest_conf.log': logs
