all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.53
      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_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
        kube_tag }}.qcow2
      kube_tag: v1.33.11
      network_driver: calico
      nodepool:
        az: nova
        cloud: public
        external_id: 74ffb3e0-a2fe-429e-a8d1-bb150383494e
        host_id: be92abac58cdf319c41ec3044bb265315879370c10aa7110cfdbfb5f
        interface_ip: 199.204.45.53
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.53
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.53
        public_ipv6: 2604:e100:1:0:f816:3eff:fe1e:3267
        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: 74ffb3e0-a2fe-429e-a8d1-bb150383494e
        host_id: be92abac58cdf319c41ec3044bb265315879370c10aa7110cfdbfb5f
        interface_ip: 199.204.45.53
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.53
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.53
        public_ipv6: 2604:e100:1:0:f816:3eff:fe1e:3267
        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_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
      kube_tag }}.qcow2
    kube_tag: v1.33.11
    network_driver: calico
    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/jobs.yaml@main#60>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#72>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11-calico explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#78>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11-calico explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 605825a80ce94696bcda144ce6a3849e
      build_refs:
      - branch: main
        change: '1015'
        change_message: "feat: extra_cloud_init \u2014 operator-controlled files +
          pre/post-kubeadm commands\n\n## Summary\r\n\r\nAdds three new Magnum labels
          for cloud-init passthrough on every cluster node, working uniformly on **VM
          and bare-metal** substrates:\r\n\r\n- `extra_files` \u2014 base64-encoded
          YAML/JSON list of files to drop on the node.\r\n- `extra_pre_kubeadm_commands`
          \u2014 `;;`-separated shell commands run **before** `kubeadm init/join`.\r\n-
          `extra_post_kubeadm_commands` \u2014 `;;`-separated shell commands run **after**
          `kubeadm init/join`.\r\n\r\nAll three honor cluster-level **and** node-group-level
          labels; node-group entries are appended after cluster entries.\r\n\r\n##
          Driving use case\r\n\r\nApply a custom `netplan` configuration before `kubeadm`
          runs so multi-NIC / VLAN / bonded layouts come up first:\r\n\r\n```bash\r\nPAYLOAD=$(base64
          -w0 <<'EOF'\r\n- path: /etc/netplan/99-mcapi.yaml\r\n  permissions: \"0600\"\r\n
          \ content: |\r\n    network:\r\n      version: 2\r\n      ethernets:\r\n
          \       enp4s0: { dhcp4: true, mtu: 1450 }\r\nEOF\r\n)\r\nopenstack coe
          cluster create ... --labels \\\r\n  extra_files=$PAYLOAD,\\\r\n  extra_pre_kubeadm_commands=\"netplan
          generate;;netplan apply;;sleep 3\"\r\n```\r\n\r\nThe same plumbing supports
          any operator-injected file or command (CA bundles, sysctl tweaks, etc.)
          without rebuilding the node image.\r\n\r\n## Implementation notes\r\n\r\n-
          **Slot-based ClusterClassPatches.** 10 file slots, 16 pre-command slots,
          16 post-command slots.  Each slot has its own `enabledIf: gt (len .extraXxx)
          <i>` gate and emits an `op: add` against the parent list path.  Per-element
          appends were chosen over parent-replace because `preKubeadmCommands` is
          shared with `containerd_config`, `keystone_auth`, and `operating_system`
          features \u2014 replacing it would clobber them.\r\n- **Python helpers**
          in `magnum_cluster_api/utils.py` validate paths (must be absolute), normalize
          ownership/permissions, base64-encode raw `content` (or pass through pre-encoded),
          split commands on `;;`, and enforce per-list caps that mirror the Rust slot
          counts.\r\n- **`build.rs`** gains an `extract_vec_inner()` helper so a user-defined
          `Vec<ExtraFile>` gets qualified correctly in the generated `Values` struct.\r\n\r\n##
          Tests\r\n\r\n- `cargo test --lib`: 146/146 passing (4 new in `extra_cloud_init`).\r\n-
          `pytest magnum_cluster_api/tests/unit/test_utils.py::TestExtraCloudInit`:
          13/13 passing \u2014 empty defaults, base64 round-trip, NG merge, validation
          errors, and cap enforcement.\r\n\r\n## Out of scope (follow-ups)\r\n\r\n-
          GPU Operator addon (planned as a separate PR \u2014 substrate-agnostic GPU
          scheduling via the NVIDIA GPU Operator helm chart).\r\n- Per-NG override
          of the *cluster*-level entries (currently NG entries are *appended*, not
          overriding).\r\n\r\n## Status\r\n\r\n**Draft.**  Slot-based ClusterClass
          shape needs a smoke test on a real cluster (test target: atmospehre aio
          ovn) before marking ready.\r\n\r\n---\r\n\r\nCompanion PR: [vexxhost/capo-image-elements#158](https://github.com/vexxhost/capo-image-elements/pull/158)
          (publish raw alongside qcow2 \u2014 needed for Ironic BM)."
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1015
        commit_id: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        patchset: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        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: 71a2e9e173db45879de437013f3ea594
      buildset_refs:
      - branch: main
        change: '1015'
        change_message: "feat: extra_cloud_init \u2014 operator-controlled files +
          pre/post-kubeadm commands\n\n## Summary\r\n\r\nAdds three new Magnum labels
          for cloud-init passthrough on every cluster node, working uniformly on **VM
          and bare-metal** substrates:\r\n\r\n- `extra_files` \u2014 base64-encoded
          YAML/JSON list of files to drop on the node.\r\n- `extra_pre_kubeadm_commands`
          \u2014 `;;`-separated shell commands run **before** `kubeadm init/join`.\r\n-
          `extra_post_kubeadm_commands` \u2014 `;;`-separated shell commands run **after**
          `kubeadm init/join`.\r\n\r\nAll three honor cluster-level **and** node-group-level
          labels; node-group entries are appended after cluster entries.\r\n\r\n##
          Driving use case\r\n\r\nApply a custom `netplan` configuration before `kubeadm`
          runs so multi-NIC / VLAN / bonded layouts come up first:\r\n\r\n```bash\r\nPAYLOAD=$(base64
          -w0 <<'EOF'\r\n- path: /etc/netplan/99-mcapi.yaml\r\n  permissions: \"0600\"\r\n
          \ content: |\r\n    network:\r\n      version: 2\r\n      ethernets:\r\n
          \       enp4s0: { dhcp4: true, mtu: 1450 }\r\nEOF\r\n)\r\nopenstack coe
          cluster create ... --labels \\\r\n  extra_files=$PAYLOAD,\\\r\n  extra_pre_kubeadm_commands=\"netplan
          generate;;netplan apply;;sleep 3\"\r\n```\r\n\r\nThe same plumbing supports
          any operator-injected file or command (CA bundles, sysctl tweaks, etc.)
          without rebuilding the node image.\r\n\r\n## Implementation notes\r\n\r\n-
          **Slot-based ClusterClassPatches.** 10 file slots, 16 pre-command slots,
          16 post-command slots.  Each slot has its own `enabledIf: gt (len .extraXxx)
          <i>` gate and emits an `op: add` against the parent list path.  Per-element
          appends were chosen over parent-replace because `preKubeadmCommands` is
          shared with `containerd_config`, `keystone_auth`, and `operating_system`
          features \u2014 replacing it would clobber them.\r\n- **Python helpers**
          in `magnum_cluster_api/utils.py` validate paths (must be absolute), normalize
          ownership/permissions, base64-encode raw `content` (or pass through pre-encoded),
          split commands on `;;`, and enforce per-list caps that mirror the Rust slot
          counts.\r\n- **`build.rs`** gains an `extract_vec_inner()` helper so a user-defined
          `Vec<ExtraFile>` gets qualified correctly in the generated `Values` struct.\r\n\r\n##
          Tests\r\n\r\n- `cargo test --lib`: 146/146 passing (4 new in `extra_cloud_init`).\r\n-
          `pytest magnum_cluster_api/tests/unit/test_utils.py::TestExtraCloudInit`:
          13/13 passing \u2014 empty defaults, base64 round-trip, NG merge, validation
          errors, and cap enforcement.\r\n\r\n## Out of scope (follow-ups)\r\n\r\n-
          GPU Operator addon (planned as a separate PR \u2014 substrate-agnostic GPU
          scheduling via the NVIDIA GPU Operator helm chart).\r\n- Per-NG override
          of the *cluster*-level entries (currently NG entries are *appended*, not
          overriding).\r\n\r\n## Status\r\n\r\n**Draft.**  Slot-based ClusterClass
          shape needs a smoke test on a real cluster (test target: atmospehre aio
          ovn) before marking ready.\r\n\r\n---\r\n\r\nCompanion PR: [vexxhost/capo-image-elements#158](https://github.com/vexxhost/capo-image-elements/pull/158)
          (publish raw alongside qcow2 \u2014 needed for Ironic BM)."
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1015
        commit_id: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        patchset: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        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: '1015'
      change_message: "feat: extra_cloud_init \u2014 operator-controlled files + pre/post-kubeadm
        commands\n\n## Summary\r\n\r\nAdds three new Magnum labels for cloud-init
        passthrough on every cluster node, working uniformly on **VM and bare-metal**
        substrates:\r\n\r\n- `extra_files` \u2014 base64-encoded YAML/JSON list of
        files to drop on the node.\r\n- `extra_pre_kubeadm_commands` \u2014 `;;`-separated
        shell commands run **before** `kubeadm init/join`.\r\n- `extra_post_kubeadm_commands`
        \u2014 `;;`-separated shell commands run **after** `kubeadm init/join`.\r\n\r\nAll
        three honor cluster-level **and** node-group-level labels; node-group entries
        are appended after cluster entries.\r\n\r\n## Driving use case\r\n\r\nApply
        a custom `netplan` configuration before `kubeadm` runs so multi-NIC / VLAN
        / bonded layouts come up first:\r\n\r\n```bash\r\nPAYLOAD=$(base64 -w0 <<'EOF'\r\n-
        path: /etc/netplan/99-mcapi.yaml\r\n  permissions: \"0600\"\r\n  content:
        |\r\n    network:\r\n      version: 2\r\n      ethernets:\r\n        enp4s0:
        { dhcp4: true, mtu: 1450 }\r\nEOF\r\n)\r\nopenstack coe cluster create ...
        --labels \\\r\n  extra_files=$PAYLOAD,\\\r\n  extra_pre_kubeadm_commands=\"netplan
        generate;;netplan apply;;sleep 3\"\r\n```\r\n\r\nThe same plumbing supports
        any operator-injected file or command (CA bundles, sysctl tweaks, etc.) without
        rebuilding the node image.\r\n\r\n## Implementation notes\r\n\r\n- **Slot-based
        ClusterClassPatches.** 10 file slots, 16 pre-command slots, 16 post-command
        slots.  Each slot has its own `enabledIf: gt (len .extraXxx) <i>` gate and
        emits an `op: add` against the parent list path.  Per-element appends were
        chosen over parent-replace because `preKubeadmCommands` is shared with `containerd_config`,
        `keystone_auth`, and `operating_system` features \u2014 replacing it would
        clobber them.\r\n- **Python helpers** in `magnum_cluster_api/utils.py` validate
        paths (must be absolute), normalize ownership/permissions, base64-encode raw
        `content` (or pass through pre-encoded), split commands on `;;`, and enforce
        per-list caps that mirror the Rust slot counts.\r\n- **`build.rs`** gains
        an `extract_vec_inner()` helper so a user-defined `Vec<ExtraFile>` gets qualified
        correctly in the generated `Values` struct.\r\n\r\n## Tests\r\n\r\n- `cargo
        test --lib`: 146/146 passing (4 new in `extra_cloud_init`).\r\n- `pytest magnum_cluster_api/tests/unit/test_utils.py::TestExtraCloudInit`:
        13/13 passing \u2014 empty defaults, base64 round-trip, NG merge, validation
        errors, and cap enforcement.\r\n\r\n## Out of scope (follow-ups)\r\n\r\n-
        GPU Operator addon (planned as a separate PR \u2014 substrate-agnostic GPU
        scheduling via the NVIDIA GPU Operator helm chart).\r\n- Per-NG override of
        the *cluster*-level entries (currently NG entries are *appended*, not overriding).\r\n\r\n##
        Status\r\n\r\n**Draft.**  Slot-based ClusterClass shape needs a smoke test
        on a real cluster (test target: atmospehre aio ovn) before marking ready.\r\n\r\n---\r\n\r\nCompanion
        PR: [vexxhost/capo-image-elements#158](https://github.com/vexxhost/capo-image-elements/pull/158)
        (publish raw alongside qcow2 \u2014 needed for Ironic BM)."
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1015
      child_jobs: []
      commit_id: f9f7168f85a95429eb6ee376b1329b84da7b22dd
      event_id: b25c39f0-4a25-11f1-98c4-ed59965a451b
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/605825a80ce94696bcda144ce6a3849e/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/605825a80ce94696bcda144ce6a3849e/work/logs
        result_data_file: /var/lib/zuul/builds/605825a80ce94696bcda144ce6a3849e/work/results.json
        src_root: /var/lib/zuul/builds/605825a80ce94696bcda144ce6a3849e/work/src
        work_root: /var/lib/zuul/builds/605825a80ce94696bcda144ce6a3849e/work
      include_vars: []
      items:
      - branch: main
        change: '1015'
        change_message: "feat: extra_cloud_init \u2014 operator-controlled files +
          pre/post-kubeadm commands\n\n## Summary\r\n\r\nAdds three new Magnum labels
          for cloud-init passthrough on every cluster node, working uniformly on **VM
          and bare-metal** substrates:\r\n\r\n- `extra_files` \u2014 base64-encoded
          YAML/JSON list of files to drop on the node.\r\n- `extra_pre_kubeadm_commands`
          \u2014 `;;`-separated shell commands run **before** `kubeadm init/join`.\r\n-
          `extra_post_kubeadm_commands` \u2014 `;;`-separated shell commands run **after**
          `kubeadm init/join`.\r\n\r\nAll three honor cluster-level **and** node-group-level
          labels; node-group entries are appended after cluster entries.\r\n\r\n##
          Driving use case\r\n\r\nApply a custom `netplan` configuration before `kubeadm`
          runs so multi-NIC / VLAN / bonded layouts come up first:\r\n\r\n```bash\r\nPAYLOAD=$(base64
          -w0 <<'EOF'\r\n- path: /etc/netplan/99-mcapi.yaml\r\n  permissions: \"0600\"\r\n
          \ content: |\r\n    network:\r\n      version: 2\r\n      ethernets:\r\n
          \       enp4s0: { dhcp4: true, mtu: 1450 }\r\nEOF\r\n)\r\nopenstack coe
          cluster create ... --labels \\\r\n  extra_files=$PAYLOAD,\\\r\n  extra_pre_kubeadm_commands=\"netplan
          generate;;netplan apply;;sleep 3\"\r\n```\r\n\r\nThe same plumbing supports
          any operator-injected file or command (CA bundles, sysctl tweaks, etc.)
          without rebuilding the node image.\r\n\r\n## Implementation notes\r\n\r\n-
          **Slot-based ClusterClassPatches.** 10 file slots, 16 pre-command slots,
          16 post-command slots.  Each slot has its own `enabledIf: gt (len .extraXxx)
          <i>` gate and emits an `op: add` against the parent list path.  Per-element
          appends were chosen over parent-replace because `preKubeadmCommands` is
          shared with `containerd_config`, `keystone_auth`, and `operating_system`
          features \u2014 replacing it would clobber them.\r\n- **Python helpers**
          in `magnum_cluster_api/utils.py` validate paths (must be absolute), normalize
          ownership/permissions, base64-encode raw `content` (or pass through pre-encoded),
          split commands on `;;`, and enforce per-list caps that mirror the Rust slot
          counts.\r\n- **`build.rs`** gains an `extract_vec_inner()` helper so a user-defined
          `Vec<ExtraFile>` gets qualified correctly in the generated `Values` struct.\r\n\r\n##
          Tests\r\n\r\n- `cargo test --lib`: 146/146 passing (4 new in `extra_cloud_init`).\r\n-
          `pytest magnum_cluster_api/tests/unit/test_utils.py::TestExtraCloudInit`:
          13/13 passing \u2014 empty defaults, base64 round-trip, NG merge, validation
          errors, and cap enforcement.\r\n\r\n## Out of scope (follow-ups)\r\n\r\n-
          GPU Operator addon (planned as a separate PR \u2014 substrate-agnostic GPU
          scheduling via the NVIDIA GPU Operator helm chart).\r\n- Per-NG override
          of the *cluster*-level entries (currently NG entries are *appended*, not
          overriding).\r\n\r\n## Status\r\n\r\n**Draft.**  Slot-based ClusterClass
          shape needs a smoke test on a real cluster (test target: atmospehre aio
          ovn) before marking ready.\r\n\r\n---\r\n\r\nCompanion PR: [vexxhost/capo-image-elements#158](https://github.com/vexxhost/capo-image-elements/pull/158)
          (publish raw alongside qcow2 \u2014 needed for Ironic BM)."
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1015
        commit_id: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        patchset: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        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.11-calico
      jobtags: []
      max_attempts: 3
      message: ZmVhdDogZXh0cmFfY2xvdWRfaW5pdCDigJQgb3BlcmF0b3ItY29udHJvbGxlZCBmaWxlcyArIHByZS9wb3N0LWt1YmVhZG0gY29tbWFuZHMKCiMjIFN1bW1hcnkNCg0KQWRkcyB0aHJlZSBuZXcgTWFnbnVtIGxhYmVscyBmb3IgY2xvdWQtaW5pdCBwYXNzdGhyb3VnaCBvbiBldmVyeSBjbHVzdGVyIG5vZGUsIHdvcmtpbmcgdW5pZm9ybWx5IG9uICoqVk0gYW5kIGJhcmUtbWV0YWwqKiBzdWJzdHJhdGVzOg0KDQotIGBleHRyYV9maWxlc2Ag4oCUIGJhc2U2NC1lbmNvZGVkIFlBTUwvSlNPTiBsaXN0IG9mIGZpbGVzIHRvIGRyb3Agb24gdGhlIG5vZGUuDQotIGBleHRyYV9wcmVfa3ViZWFkbV9jb21tYW5kc2Ag4oCUIGA7O2Atc2VwYXJhdGVkIHNoZWxsIGNvbW1hbmRzIHJ1biAqKmJlZm9yZSoqIGBrdWJlYWRtIGluaXQvam9pbmAuDQotIGBleHRyYV9wb3N0X2t1YmVhZG1fY29tbWFuZHNgIOKAlCBgOztgLXNlcGFyYXRlZCBzaGVsbCBjb21tYW5kcyBydW4gKiphZnRlcioqIGBrdWJlYWRtIGluaXQvam9pbmAuDQoNCkFsbCB0aHJlZSBob25vciBjbHVzdGVyLWxldmVsICoqYW5kKiogbm9kZS1ncm91cC1sZXZlbCBsYWJlbHM7IG5vZGUtZ3JvdXAgZW50cmllcyBhcmUgYXBwZW5kZWQgYWZ0ZXIgY2x1c3RlciBlbnRyaWVzLg0KDQojIyBEcml2aW5nIHVzZSBjYXNlDQoNCkFwcGx5IGEgY3VzdG9tIGBuZXRwbGFuYCBjb25maWd1cmF0aW9uIGJlZm9yZSBga3ViZWFkbWAgcnVucyBzbyBtdWx0aS1OSUMgLyBWTEFOIC8gYm9uZGVkIGxheW91dHMgY29tZSB1cCBmaXJzdDoNCg0KYGBgYmFzaA0KUEFZTE9BRD0kKGJhc2U2NCAtdzAgPDwnRU9GJw0KLSBwYXRoOiAvZXRjL25ldHBsYW4vOTktbWNhcGkueWFtbA0KICBwZXJtaXNzaW9uczogIjA2MDAiDQogIGNvbnRlbnQ6IHwNCiAgICBuZXR3b3JrOg0KICAgICAgdmVyc2lvbjogMg0KICAgICAgZXRoZXJuZXRzOg0KICAgICAgICBlbnA0czA6IHsgZGhjcDQ6IHRydWUsIG10dTogMTQ1MCB9DQpFT0YNCikNCm9wZW5zdGFjayBjb2UgY2x1c3RlciBjcmVhdGUgLi4uIC0tbGFiZWxzIFwNCiAgZXh0cmFfZmlsZXM9JFBBWUxPQUQsXA0KICBleHRyYV9wcmVfa3ViZWFkbV9jb21tYW5kcz0ibmV0cGxhbiBnZW5lcmF0ZTs7bmV0cGxhbiBhcHBseTs7c2xlZXAgMyINCmBgYA0KDQpUaGUgc2FtZSBwbHVtYmluZyBzdXBwb3J0cyBhbnkgb3BlcmF0b3ItaW5qZWN0ZWQgZmlsZSBvciBjb21tYW5kIChDQSBidW5kbGVzLCBzeXNjdGwgdHdlYWtzLCBldGMuKSB3aXRob3V0IHJlYnVpbGRpbmcgdGhlIG5vZGUgaW1hZ2UuDQoNCiMjIEltcGxlbWVudGF0aW9uIG5vdGVzDQoNCi0gKipTbG90LWJhc2VkIENsdXN0ZXJDbGFzc1BhdGNoZXMuKiogMTAgZmlsZSBzbG90cywgMTYgcHJlLWNvbW1hbmQgc2xvdHMsIDE2IHBvc3QtY29tbWFuZCBzbG90cy4gIEVhY2ggc2xvdCBoYXMgaXRzIG93biBgZW5hYmxlZElmOiBndCAobGVuIC5leHRyYVh4eCkgPGk+YCBnYXRlIGFuZCBlbWl0cyBhbiBgb3A6IGFkZGAgYWdhaW5zdCB0aGUgcGFyZW50IGxpc3QgcGF0aC4gIFBlci1lbGVtZW50IGFwcGVuZHMgd2VyZSBjaG9zZW4gb3ZlciBwYXJlbnQtcmVwbGFjZSBiZWNhdXNlIGBwcmVLdWJlYWRtQ29tbWFuZHNgIGlzIHNoYXJlZCB3aXRoIGBjb250YWluZXJkX2NvbmZpZ2AsIGBrZXlzdG9uZV9hdXRoYCwgYW5kIGBvcGVyYXRpbmdfc3lzdGVtYCBmZWF0dXJlcyDigJQgcmVwbGFjaW5nIGl0IHdvdWxkIGNsb2JiZXIgdGhlbS4NCi0gKipQeXRob24gaGVscGVycyoqIGluIGBtYWdudW1fY2x1c3Rlcl9hcGkvdXRpbHMucHlgIHZhbGlkYXRlIHBhdGhzIChtdXN0IGJlIGFic29sdXRlKSwgbm9ybWFsaXplIG93bmVyc2hpcC9wZXJtaXNzaW9ucywgYmFzZTY0LWVuY29kZSByYXcgYGNvbnRlbnRgIChvciBwYXNzIHRocm91Z2ggcHJlLWVuY29kZWQpLCBzcGxpdCBjb21tYW5kcyBvbiBgOztgLCBhbmQgZW5mb3JjZSBwZXItbGlzdCBjYXBzIHRoYXQgbWlycm9yIHRoZSBSdXN0IHNsb3QgY291bnRzLg0KLSAqKmBidWlsZC5yc2AqKiBnYWlucyBhbiBgZXh0cmFjdF92ZWNfaW5uZXIoKWAgaGVscGVyIHNvIGEgdXNlci1kZWZpbmVkIGBWZWM8RXh0cmFGaWxlPmAgZ2V0cyBxdWFsaWZpZWQgY29ycmVjdGx5IGluIHRoZSBnZW5lcmF0ZWQgYFZhbHVlc2Agc3RydWN0Lg0KDQojIyBUZXN0cw0KDQotIGBjYXJnbyB0ZXN0IC0tbGliYDogMTQ2LzE0NiBwYXNzaW5nICg0IG5ldyBpbiBgZXh0cmFfY2xvdWRfaW5pdGApLg0KLSBgcHl0ZXN0IG1hZ251bV9jbHVzdGVyX2FwaS90ZXN0cy91bml0L3Rlc3RfdXRpbHMucHk6OlRlc3RFeHRyYUNsb3VkSW5pdGA6IDEzLzEzIHBhc3Npbmcg4oCUIGVtcHR5IGRlZmF1bHRzLCBiYXNlNjQgcm91bmQtdHJpcCwgTkcgbWVyZ2UsIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgY2FwIGVuZm9yY2VtZW50Lg0KDQojIyBPdXQgb2Ygc2NvcGUgKGZvbGxvdy11cHMpDQoNCi0gR1BVIE9wZXJhdG9yIGFkZG9uIChwbGFubmVkIGFzIGEgc2VwYXJhdGUgUFIg4oCUIHN1YnN0cmF0ZS1hZ25vc3RpYyBHUFUgc2NoZWR1bGluZyB2aWEgdGhlIE5WSURJQSBHUFUgT3BlcmF0b3IgaGVsbSBjaGFydCkuDQotIFBlci1ORyBvdmVycmlkZSBvZiB0aGUgKmNsdXN0ZXIqLWxldmVsIGVudHJpZXMgKGN1cnJlbnRseSBORyBlbnRyaWVzIGFyZSAqYXBwZW5kZWQqLCBub3Qgb3ZlcnJpZGluZykuDQoNCiMjIFN0YXR1cw0KDQoqKkRyYWZ0LioqICBTbG90LWJhc2VkIENsdXN0ZXJDbGFzcyBzaGFwZSBuZWVkcyBhIHNtb2tlIHRlc3Qgb24gYSByZWFsIGNsdXN0ZXIgKHRlc3QgdGFyZ2V0OiBhdG1vc3BlaHJlIGFpbyBvdm4pIGJlZm9yZSBtYXJraW5nIHJlYWR5Lg0KDQotLS0NCg0KQ29tcGFuaW9uIFBSOiBbdmV4eGhvc3QvY2Fwby1pbWFnZS1lbGVtZW50cyMxNThdKGh0dHBzOi8vZ2l0aHViLmNvbS92ZXh4aG9zdC9jYXBvLWltYWdlLWVsZW1lbnRzL3B1bGwvMTU4KSAocHVibGlzaCByYXcgYWxvbmdzaWRlIHFjb3cyIOKAlCBuZWVkZWQgZm9yIElyb25pYyBCTSku
      override_checkout: master
      patchset: f9f7168f85a95429eb6ee376b1329b84da7b22dd
      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: 79fe3eb1d01f8ac5739b0b7bc4759c407b6e248d
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: 03ece8f88040be9b0b14dd1cfe93076ad2419a80
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: 74b9cec5beecc1fc5bc89251ac9de475824e2cbb
          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: 79fe3eb1d01f8ac5739b0b7bc4759c407b6e248d
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: f9f7168f85a95429eb6ee376b1329b84da7b22dd
        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: 8e1ebdffba02e651c399dacef841f8941f6ad6e4
          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: f9f7168f85a95429eb6ee376b1329b84da7b22dd
          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: b3aafefb15bb6243e31f6dac2943caf85175cdb0
          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: 11c1a009150b803b115fb13fd9ab2a684bd9ea15
          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: 03ece8f88040be9b0b14dd1cfe93076ad2419a80
          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: 38e838bfff43925f2470d51aa53b0b3ec6d545e6
          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: 2230026f77a8ed50493d2d58be9120910ceb2089
          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: 2835f79f52a3a68f314421c8bcef4d407433d0be
          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: a0c36c69929376c580f652b928599dda1b039afb
          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: be6db3977def39fad33a1d3da824f9d027fd5ea9
          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: ff4ea2dea9fa5d14662d11f7399be12ca0d3e5ce
          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: d16fa5e723701c95cf97a3e9ea57b3856e09aaa7
          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: 41ca5b1bab1e87365ac5381179609191a7ce446e
          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: e3db398fba279721121892323e6260c6932797c1
          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: bfc9dbc2aa9a113c12e591a87f774a6d986a981f
          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: a86c570516b474980fbcb590530412e403ce4e1d
          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: ae89a535aadad6d77c07c12ef4b58eb4470decdb
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/1015/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
