all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 162.253.55.36
      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.32.12
      network_driver: calico
      nodepool:
        az: nova
        cloud: public
        external_id: 8a2e2daf-1179-4f90-9879-3c2727b1b7a9
        host_id: 7cb77d063530dedbf6983b78a36ec607482cf1d282610499e8bd9357
        interface_ip: 162.253.55.36
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 162.253.55.36
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.36
        public_ipv6: 2604:e100:1:0:f816:3eff:fe3e:e454
        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: 8a2e2daf-1179-4f90-9879-3c2727b1b7a9
        host_id: 7cb77d063530dedbf6983b78a36ec607482cf1d282610499e8bd9357
        interface_ip: 162.253.55.36
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 162.253.55.36
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.36
        public_ipv6: 2604:e100:1:0:f816:3eff:fe3e:e454
        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.32.12
    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#426>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#558>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#601>'
      - '<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.32.12 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#72>'
      - '<Job magnum-cluster-api-hydrophone-v1.32.12-calico explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#78>'
      - '<Job magnum-cluster-api-hydrophone-v1.32.12-calico explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 0fcb7d4e743a4a50b32ef9bad3d79ba6
      build_refs:
      - branch: main
        change: '897'
        change_message: "fix: skip proxy file patches when no proxy is configured\n\nWhen
          no proxy is configured, `generate_systemd_proxy_config()` and `generate_apt_proxy_config()`
          return empty strings. After base64 encoding, these become empty `systemdProxyConfig`/`aptProxyConfig`
          cluster variables, which CAPI v1.10+ rejects because `kubeadmConfigSpec.files[].content`
          must be at least 1 char (`+kubebuilder:validation:MinLength=1` was added
          to the `File.Content` field in CAPI v1.10).\n\n```\nspec.kubeadmConfigSpec.files[3].content:
          Invalid value: \"\":\n  spec.kubeadmConfigSpec.files[3].content in body
          should be at least 1 chars long\n```\n\nRather than injecting placeholder
          content, the fix uses `enabled_if` conditions on the Rust ClusterClass patches
          so proxy file patches are skipped entirely when no proxy is configured.
          This follows the same pattern already used by `imageRepository` and `apiServerFloatingIP`
          features.\n\n- **`src/features/containerd_config.rs`**: Split the `systemdProxyConfig`
          file patch into a separate `ClusterClassPatches` with `enabled_if: {{ if
          ne .systemdProxyConfig \"\" }}true{{end}}`, so the proxy file is only injected
          when a proxy is actually configured. The `containerdConfig` file and `preKubeadmCommands`
          remain always-applied.\n- **`src/features/operating_system.rs`**: Split
          the `aptProxyConfig` file patch into a separate `ClusterClassPatches` with
          `enabled_if: {{ if and (eq .operatingSystem \"ubuntu\") (ne .aptProxyConfig
          \"\") }}true{{end}}`, so the apt proxy file is only injected for Ubuntu
          when a proxy is configured.\n- **`magnum_cluster_api/utils.py`**: No changes
          needed \u2014 functions correctly return `\"\"` when no proxy is configured,
          and the Rust-side `enabled_if` prevents the empty value from being used.\n-
          **`magnum_cluster_api/tests/unit/test_utils.py`**: Added test coverage for
          both proxy-configured and no-proxy cases.\n- Added Rust tests for both with-proxy
          and without-proxy scenarios in both features.\n\n<!-- START COPILOT ORIGINAL
          PROMPT -->\n\n\n\n<details>\n\n<summary>Original prompt</summary>\n\n> \n>
          ----\n> \n> *This section details on the original issue you should resolve*\n>
          \n> <issue_title>bug: cluster creation failed</issue_title>\n> <issue_description>Context:
          \n> Someone posted about finding bugs on  https://www.reddit.com/r/openstack/comments/1rwmtky/magnum_vexxhost_capi_driver_bug/\n>
          \n> This is the error message:\n> ```\n>     v1beta1:\n>       conditions:\n>
          \      - lastTransitionTime: \"2026-03-17T21:36:20Z\"\n>         message:
          'error reconciling the Cluster topology: failed to create KubeadmControlPlane.controlplane.cluster.x-k8s.io:\n>
          FieldValueInvalid: spec.kubeadmConfigSpec.files[3].content: Invalid value:
          \"\": spec.kubeadmConfigSpec.files[3].content in body should be at least
          1\n>           chars long FieldValueInvalid: spec.kubeadmConfigSpec.files[5].content:
          Invalid\n>           value: \"\": spec.kubeadmConfigSpec.files[5].content
          in body should be at least 1 chars long'\n>         reason: TopologyReconcileFailed\n>
          \        severity: Error\n>         status: \"False\"\n>         type: TopologyReconciled\n>
          ```\n> \n> The error above can be fixed my manually adding (using edit)
          a # to these 2 labels of the cluster:\n> ```\n>     - name: systemdProxyConfig\n>
          \      value: \"\"\n>     - name: aptProxyConfig\n>       value: \"\"\n>
          ```\n> \n> Cluster template and cluster creation:\n> ```\n> openstack coe
          cluster template create k8s-noble-2 --image noble-k8s --keypair okey --external-network
          external-net --flavor m4.small --master-flavor m4.small --network-driver
          calico --coe kubernetes --labels systemd_proxy_config=\"#\",apt_proxy_config=\"#\"\n>
          \n> openstack coe cluster create --cluster-template k8s-noble-2 --master-count
          1 --node-count 1 --labels kube_tag=v1.35.2,server_group_policies=affinity,octavia_provider=amphora
          cluster-cluster-2\n> ```</issue_description>\n> \n> ## Comments on the Issue
          (you are @copilot in this section)\n> \n> <comments>\n> </comments>\n> \n\n\n</details>\n\n\n\n<!--
          START COPILOT CODING AGENT SUFFIX -->\n\n- Fixes vexxhost/magnum-cluster-api#896\n\n<!--
          START COPILOT CODING AGENT TIPS -->\n---\n\n\u2728 Let Copilot coding agent
          [set things up for you](https://github.com/vexxhost/magnum-cluster-api/issues/new?title=\u2728+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
          \u2014 coding agent works faster and does higher quality work when set up
          for your repo.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/897
        commit_id: ca899259023bddc30846ef791e877ce0b3141974
        patchset: ca899259023bddc30846ef791e877ce0b3141974
        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: 98dbd5b5f7be4b50979ba44097cb791c
      buildset_refs:
      - branch: main
        change: '897'
        change_message: "fix: skip proxy file patches when no proxy is configured\n\nWhen
          no proxy is configured, `generate_systemd_proxy_config()` and `generate_apt_proxy_config()`
          return empty strings. After base64 encoding, these become empty `systemdProxyConfig`/`aptProxyConfig`
          cluster variables, which CAPI v1.10+ rejects because `kubeadmConfigSpec.files[].content`
          must be at least 1 char (`+kubebuilder:validation:MinLength=1` was added
          to the `File.Content` field in CAPI v1.10).\n\n```\nspec.kubeadmConfigSpec.files[3].content:
          Invalid value: \"\":\n  spec.kubeadmConfigSpec.files[3].content in body
          should be at least 1 chars long\n```\n\nRather than injecting placeholder
          content, the fix uses `enabled_if` conditions on the Rust ClusterClass patches
          so proxy file patches are skipped entirely when no proxy is configured.
          This follows the same pattern already used by `imageRepository` and `apiServerFloatingIP`
          features.\n\n- **`src/features/containerd_config.rs`**: Split the `systemdProxyConfig`
          file patch into a separate `ClusterClassPatches` with `enabled_if: {{ if
          ne .systemdProxyConfig \"\" }}true{{end}}`, so the proxy file is only injected
          when a proxy is actually configured. The `containerdConfig` file and `preKubeadmCommands`
          remain always-applied.\n- **`src/features/operating_system.rs`**: Split
          the `aptProxyConfig` file patch into a separate `ClusterClassPatches` with
          `enabled_if: {{ if and (eq .operatingSystem \"ubuntu\") (ne .aptProxyConfig
          \"\") }}true{{end}}`, so the apt proxy file is only injected for Ubuntu
          when a proxy is configured.\n- **`magnum_cluster_api/utils.py`**: No changes
          needed \u2014 functions correctly return `\"\"` when no proxy is configured,
          and the Rust-side `enabled_if` prevents the empty value from being used.\n-
          **`magnum_cluster_api/tests/unit/test_utils.py`**: Added test coverage for
          both proxy-configured and no-proxy cases.\n- Added Rust tests for both with-proxy
          and without-proxy scenarios in both features.\n\n<!-- START COPILOT ORIGINAL
          PROMPT -->\n\n\n\n<details>\n\n<summary>Original prompt</summary>\n\n> \n>
          ----\n> \n> *This section details on the original issue you should resolve*\n>
          \n> <issue_title>bug: cluster creation failed</issue_title>\n> <issue_description>Context:
          \n> Someone posted about finding bugs on  https://www.reddit.com/r/openstack/comments/1rwmtky/magnum_vexxhost_capi_driver_bug/\n>
          \n> This is the error message:\n> ```\n>     v1beta1:\n>       conditions:\n>
          \      - lastTransitionTime: \"2026-03-17T21:36:20Z\"\n>         message:
          'error reconciling the Cluster topology: failed to create KubeadmControlPlane.controlplane.cluster.x-k8s.io:\n>
          FieldValueInvalid: spec.kubeadmConfigSpec.files[3].content: Invalid value:
          \"\": spec.kubeadmConfigSpec.files[3].content in body should be at least
          1\n>           chars long FieldValueInvalid: spec.kubeadmConfigSpec.files[5].content:
          Invalid\n>           value: \"\": spec.kubeadmConfigSpec.files[5].content
          in body should be at least 1 chars long'\n>         reason: TopologyReconcileFailed\n>
          \        severity: Error\n>         status: \"False\"\n>         type: TopologyReconciled\n>
          ```\n> \n> The error above can be fixed my manually adding (using edit)
          a # to these 2 labels of the cluster:\n> ```\n>     - name: systemdProxyConfig\n>
          \      value: \"\"\n>     - name: aptProxyConfig\n>       value: \"\"\n>
          ```\n> \n> Cluster template and cluster creation:\n> ```\n> openstack coe
          cluster template create k8s-noble-2 --image noble-k8s --keypair okey --external-network
          external-net --flavor m4.small --master-flavor m4.small --network-driver
          calico --coe kubernetes --labels systemd_proxy_config=\"#\",apt_proxy_config=\"#\"\n>
          \n> openstack coe cluster create --cluster-template k8s-noble-2 --master-count
          1 --node-count 1 --labels kube_tag=v1.35.2,server_group_policies=affinity,octavia_provider=amphora
          cluster-cluster-2\n> ```</issue_description>\n> \n> ## Comments on the Issue
          (you are @copilot in this section)\n> \n> <comments>\n> </comments>\n> \n\n\n</details>\n\n\n\n<!--
          START COPILOT CODING AGENT SUFFIX -->\n\n- Fixes vexxhost/magnum-cluster-api#896\n\n<!--
          START COPILOT CODING AGENT TIPS -->\n---\n\n\u2728 Let Copilot coding agent
          [set things up for you](https://github.com/vexxhost/magnum-cluster-api/issues/new?title=\u2728+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
          \u2014 coding agent works faster and does higher quality work when set up
          for your repo.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/897
        commit_id: ca899259023bddc30846ef791e877ce0b3141974
        patchset: ca899259023bddc30846ef791e877ce0b3141974
        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: '897'
      change_message: "fix: skip proxy file patches when no proxy is configured\n\nWhen
        no proxy is configured, `generate_systemd_proxy_config()` and `generate_apt_proxy_config()`
        return empty strings. After base64 encoding, these become empty `systemdProxyConfig`/`aptProxyConfig`
        cluster variables, which CAPI v1.10+ rejects because `kubeadmConfigSpec.files[].content`
        must be at least 1 char (`+kubebuilder:validation:MinLength=1` was added to
        the `File.Content` field in CAPI v1.10).\n\n```\nspec.kubeadmConfigSpec.files[3].content:
        Invalid value: \"\":\n  spec.kubeadmConfigSpec.files[3].content in body should
        be at least 1 chars long\n```\n\nRather than injecting placeholder content,
        the fix uses `enabled_if` conditions on the Rust ClusterClass patches so proxy
        file patches are skipped entirely when no proxy is configured. This follows
        the same pattern already used by `imageRepository` and `apiServerFloatingIP`
        features.\n\n- **`src/features/containerd_config.rs`**: Split the `systemdProxyConfig`
        file patch into a separate `ClusterClassPatches` with `enabled_if: {{ if ne
        .systemdProxyConfig \"\" }}true{{end}}`, so the proxy file is only injected
        when a proxy is actually configured. The `containerdConfig` file and `preKubeadmCommands`
        remain always-applied.\n- **`src/features/operating_system.rs`**: Split the
        `aptProxyConfig` file patch into a separate `ClusterClassPatches` with `enabled_if:
        {{ if and (eq .operatingSystem \"ubuntu\") (ne .aptProxyConfig \"\") }}true{{end}}`,
        so the apt proxy file is only injected for Ubuntu when a proxy is configured.\n-
        **`magnum_cluster_api/utils.py`**: No changes needed \u2014 functions correctly
        return `\"\"` when no proxy is configured, and the Rust-side `enabled_if`
        prevents the empty value from being used.\n- **`magnum_cluster_api/tests/unit/test_utils.py`**:
        Added test coverage for both proxy-configured and no-proxy cases.\n- Added
        Rust tests for both with-proxy and without-proxy scenarios in both features.\n\n<!--
        START COPILOT ORIGINAL PROMPT -->\n\n\n\n<details>\n\n<summary>Original prompt</summary>\n\n>
        \n> ----\n> \n> *This section details on the original issue you should resolve*\n>
        \n> <issue_title>bug: cluster creation failed</issue_title>\n> <issue_description>Context:
        \n> Someone posted about finding bugs on  https://www.reddit.com/r/openstack/comments/1rwmtky/magnum_vexxhost_capi_driver_bug/\n>
        \n> This is the error message:\n> ```\n>     v1beta1:\n>       conditions:\n>
        \      - lastTransitionTime: \"2026-03-17T21:36:20Z\"\n>         message:
        'error reconciling the Cluster topology: failed to create KubeadmControlPlane.controlplane.cluster.x-k8s.io:\n>
        FieldValueInvalid: spec.kubeadmConfigSpec.files[3].content: Invalid value:
        \"\": spec.kubeadmConfigSpec.files[3].content in body should be at least 1\n>
        \          chars long FieldValueInvalid: spec.kubeadmConfigSpec.files[5].content:
        Invalid\n>           value: \"\": spec.kubeadmConfigSpec.files[5].content
        in body should be at least 1 chars long'\n>         reason: TopologyReconcileFailed\n>
        \        severity: Error\n>         status: \"False\"\n>         type: TopologyReconciled\n>
        ```\n> \n> The error above can be fixed my manually adding (using edit) a
        # to these 2 labels of the cluster:\n> ```\n>     - name: systemdProxyConfig\n>
        \      value: \"\"\n>     - name: aptProxyConfig\n>       value: \"\"\n> ```\n>
        \n> Cluster template and cluster creation:\n> ```\n> openstack coe cluster
        template create k8s-noble-2 --image noble-k8s --keypair okey --external-network
        external-net --flavor m4.small --master-flavor m4.small --network-driver calico
        --coe kubernetes --labels systemd_proxy_config=\"#\",apt_proxy_config=\"#\"\n>
        \n> openstack coe cluster create --cluster-template k8s-noble-2 --master-count
        1 --node-count 1 --labels kube_tag=v1.35.2,server_group_policies=affinity,octavia_provider=amphora
        cluster-cluster-2\n> ```</issue_description>\n> \n> ## Comments on the Issue
        (you are @copilot in this section)\n> \n> <comments>\n> </comments>\n> \n\n\n</details>\n\n\n\n<!--
        START COPILOT CODING AGENT SUFFIX -->\n\n- Fixes vexxhost/magnum-cluster-api#896\n\n<!--
        START COPILOT CODING AGENT TIPS -->\n---\n\n\u2728 Let Copilot coding agent
        [set things up for you](https://github.com/vexxhost/magnum-cluster-api/issues/new?title=\u2728+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
        \u2014 coding agent works faster and does higher quality work when set up
        for your repo.\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/897
      child_jobs: []
      commit_id: ca899259023bddc30846ef791e877ce0b3141974
      event_id: 7a777510-22ff-11f1-851c-24b7cea3e9ae
      executor:
        hostname: 0a8996d2b663
        inventory_file: /var/lib/zuul/builds/0fcb7d4e743a4a50b32ef9bad3d79ba6/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/0fcb7d4e743a4a50b32ef9bad3d79ba6/work/logs
        result_data_file: /var/lib/zuul/builds/0fcb7d4e743a4a50b32ef9bad3d79ba6/work/results.json
        src_root: /var/lib/zuul/builds/0fcb7d4e743a4a50b32ef9bad3d79ba6/work/src
        work_root: /var/lib/zuul/builds/0fcb7d4e743a4a50b32ef9bad3d79ba6/work
      include_vars: []
      items:
      - branch: main
        change: '897'
        change_message: "fix: skip proxy file patches when no proxy is configured\n\nWhen
          no proxy is configured, `generate_systemd_proxy_config()` and `generate_apt_proxy_config()`
          return empty strings. After base64 encoding, these become empty `systemdProxyConfig`/`aptProxyConfig`
          cluster variables, which CAPI v1.10+ rejects because `kubeadmConfigSpec.files[].content`
          must be at least 1 char (`+kubebuilder:validation:MinLength=1` was added
          to the `File.Content` field in CAPI v1.10).\n\n```\nspec.kubeadmConfigSpec.files[3].content:
          Invalid value: \"\":\n  spec.kubeadmConfigSpec.files[3].content in body
          should be at least 1 chars long\n```\n\nRather than injecting placeholder
          content, the fix uses `enabled_if` conditions on the Rust ClusterClass patches
          so proxy file patches are skipped entirely when no proxy is configured.
          This follows the same pattern already used by `imageRepository` and `apiServerFloatingIP`
          features.\n\n- **`src/features/containerd_config.rs`**: Split the `systemdProxyConfig`
          file patch into a separate `ClusterClassPatches` with `enabled_if: {{ if
          ne .systemdProxyConfig \"\" }}true{{end}}`, so the proxy file is only injected
          when a proxy is actually configured. The `containerdConfig` file and `preKubeadmCommands`
          remain always-applied.\n- **`src/features/operating_system.rs`**: Split
          the `aptProxyConfig` file patch into a separate `ClusterClassPatches` with
          `enabled_if: {{ if and (eq .operatingSystem \"ubuntu\") (ne .aptProxyConfig
          \"\") }}true{{end}}`, so the apt proxy file is only injected for Ubuntu
          when a proxy is configured.\n- **`magnum_cluster_api/utils.py`**: No changes
          needed \u2014 functions correctly return `\"\"` when no proxy is configured,
          and the Rust-side `enabled_if` prevents the empty value from being used.\n-
          **`magnum_cluster_api/tests/unit/test_utils.py`**: Added test coverage for
          both proxy-configured and no-proxy cases.\n- Added Rust tests for both with-proxy
          and without-proxy scenarios in both features.\n\n<!-- START COPILOT ORIGINAL
          PROMPT -->\n\n\n\n<details>\n\n<summary>Original prompt</summary>\n\n> \n>
          ----\n> \n> *This section details on the original issue you should resolve*\n>
          \n> <issue_title>bug: cluster creation failed</issue_title>\n> <issue_description>Context:
          \n> Someone posted about finding bugs on  https://www.reddit.com/r/openstack/comments/1rwmtky/magnum_vexxhost_capi_driver_bug/\n>
          \n> This is the error message:\n> ```\n>     v1beta1:\n>       conditions:\n>
          \      - lastTransitionTime: \"2026-03-17T21:36:20Z\"\n>         message:
          'error reconciling the Cluster topology: failed to create KubeadmControlPlane.controlplane.cluster.x-k8s.io:\n>
          FieldValueInvalid: spec.kubeadmConfigSpec.files[3].content: Invalid value:
          \"\": spec.kubeadmConfigSpec.files[3].content in body should be at least
          1\n>           chars long FieldValueInvalid: spec.kubeadmConfigSpec.files[5].content:
          Invalid\n>           value: \"\": spec.kubeadmConfigSpec.files[5].content
          in body should be at least 1 chars long'\n>         reason: TopologyReconcileFailed\n>
          \        severity: Error\n>         status: \"False\"\n>         type: TopologyReconciled\n>
          ```\n> \n> The error above can be fixed my manually adding (using edit)
          a # to these 2 labels of the cluster:\n> ```\n>     - name: systemdProxyConfig\n>
          \      value: \"\"\n>     - name: aptProxyConfig\n>       value: \"\"\n>
          ```\n> \n> Cluster template and cluster creation:\n> ```\n> openstack coe
          cluster template create k8s-noble-2 --image noble-k8s --keypair okey --external-network
          external-net --flavor m4.small --master-flavor m4.small --network-driver
          calico --coe kubernetes --labels systemd_proxy_config=\"#\",apt_proxy_config=\"#\"\n>
          \n> openstack coe cluster create --cluster-template k8s-noble-2 --master-count
          1 --node-count 1 --labels kube_tag=v1.35.2,server_group_policies=affinity,octavia_provider=amphora
          cluster-cluster-2\n> ```</issue_description>\n> \n> ## Comments on the Issue
          (you are @copilot in this section)\n> \n> <comments>\n> </comments>\n> \n\n\n</details>\n\n\n\n<!--
          START COPILOT CODING AGENT SUFFIX -->\n\n- Fixes vexxhost/magnum-cluster-api#896\n\n<!--
          START COPILOT CODING AGENT TIPS -->\n---\n\n\u2728 Let Copilot coding agent
          [set things up for you](https://github.com/vexxhost/magnum-cluster-api/issues/new?title=\u2728+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
          \u2014 coding agent works faster and does higher quality work when set up
          for your repo.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/897
        commit_id: ca899259023bddc30846ef791e877ce0b3141974
        patchset: ca899259023bddc30846ef791e877ce0b3141974
        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.32.12-calico
      jobtags: []
      max_attempts: 3
      message: Zml4OiBza2lwIHByb3h5IGZpbGUgcGF0Y2hlcyB3aGVuIG5vIHByb3h5IGlzIGNvbmZpZ3VyZWQKCldoZW4gbm8gcHJveHkgaXMgY29uZmlndXJlZCwgYGdlbmVyYXRlX3N5c3RlbWRfcHJveHlfY29uZmlnKClgIGFuZCBgZ2VuZXJhdGVfYXB0X3Byb3h5X2NvbmZpZygpYCByZXR1cm4gZW1wdHkgc3RyaW5ncy4gQWZ0ZXIgYmFzZTY0IGVuY29kaW5nLCB0aGVzZSBiZWNvbWUgZW1wdHkgYHN5c3RlbWRQcm94eUNvbmZpZ2AvYGFwdFByb3h5Q29uZmlnYCBjbHVzdGVyIHZhcmlhYmxlcywgd2hpY2ggQ0FQSSB2MS4xMCsgcmVqZWN0cyBiZWNhdXNlIGBrdWJlYWRtQ29uZmlnU3BlYy5maWxlc1tdLmNvbnRlbnRgIG11c3QgYmUgYXQgbGVhc3QgMSBjaGFyIChgK2t1YmVidWlsZGVyOnZhbGlkYXRpb246TWluTGVuZ3RoPTFgIHdhcyBhZGRlZCB0byB0aGUgYEZpbGUuQ29udGVudGAgZmllbGQgaW4gQ0FQSSB2MS4xMCkuCgpgYGAKc3BlYy5rdWJlYWRtQ29uZmlnU3BlYy5maWxlc1szXS5jb250ZW50OiBJbnZhbGlkIHZhbHVlOiAiIjoKICBzcGVjLmt1YmVhZG1Db25maWdTcGVjLmZpbGVzWzNdLmNvbnRlbnQgaW4gYm9keSBzaG91bGQgYmUgYXQgbGVhc3QgMSBjaGFycyBsb25nCmBgYAoKUmF0aGVyIHRoYW4gaW5qZWN0aW5nIHBsYWNlaG9sZGVyIGNvbnRlbnQsIHRoZSBmaXggdXNlcyBgZW5hYmxlZF9pZmAgY29uZGl0aW9ucyBvbiB0aGUgUnVzdCBDbHVzdGVyQ2xhc3MgcGF0Y2hlcyBzbyBwcm94eSBmaWxlIHBhdGNoZXMgYXJlIHNraXBwZWQgZW50aXJlbHkgd2hlbiBubyBwcm94eSBpcyBjb25maWd1cmVkLiBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhbHJlYWR5IHVzZWQgYnkgYGltYWdlUmVwb3NpdG9yeWAgYW5kIGBhcGlTZXJ2ZXJGbG9hdGluZ0lQYCBmZWF0dXJlcy4KCi0gKipgc3JjL2ZlYXR1cmVzL2NvbnRhaW5lcmRfY29uZmlnLnJzYCoqOiBTcGxpdCB0aGUgYHN5c3RlbWRQcm94eUNvbmZpZ2AgZmlsZSBwYXRjaCBpbnRvIGEgc2VwYXJhdGUgYENsdXN0ZXJDbGFzc1BhdGNoZXNgIHdpdGggYGVuYWJsZWRfaWY6IHt7IGlmIG5lIC5zeXN0ZW1kUHJveHlDb25maWcgIiIgfX10cnVle3tlbmR9fWAsIHNvIHRoZSBwcm94eSBmaWxlIGlzIG9ubHkgaW5qZWN0ZWQgd2hlbiBhIHByb3h5IGlzIGFjdHVhbGx5IGNvbmZpZ3VyZWQuIFRoZSBgY29udGFpbmVyZENvbmZpZ2AgZmlsZSBhbmQgYHByZUt1YmVhZG1Db21tYW5kc2AgcmVtYWluIGFsd2F5cy1hcHBsaWVkLgotICoqYHNyYy9mZWF0dXJlcy9vcGVyYXRpbmdfc3lzdGVtLnJzYCoqOiBTcGxpdCB0aGUgYGFwdFByb3h5Q29uZmlnYCBmaWxlIHBhdGNoIGludG8gYSBzZXBhcmF0ZSBgQ2x1c3RlckNsYXNzUGF0Y2hlc2Agd2l0aCBgZW5hYmxlZF9pZjoge3sgaWYgYW5kIChlcSAub3BlcmF0aW5nU3lzdGVtICJ1YnVudHUiKSAobmUgLmFwdFByb3h5Q29uZmlnICIiKSB9fXRydWV7e2VuZH19YCwgc28gdGhlIGFwdCBwcm94eSBmaWxlIGlzIG9ubHkgaW5qZWN0ZWQgZm9yIFVidW50dSB3aGVuIGEgcHJveHkgaXMgY29uZmlndXJlZC4KLSAqKmBtYWdudW1fY2x1c3Rlcl9hcGkvdXRpbHMucHlgKio6IE5vIGNoYW5nZXMgbmVlZGVkIOKAlCBmdW5jdGlvbnMgY29ycmVjdGx5IHJldHVybiBgIiJgIHdoZW4gbm8gcHJveHkgaXMgY29uZmlndXJlZCwgYW5kIHRoZSBSdXN0LXNpZGUgYGVuYWJsZWRfaWZgIHByZXZlbnRzIHRoZSBlbXB0eSB2YWx1ZSBmcm9tIGJlaW5nIHVzZWQuCi0gKipgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF91dGlscy5weWAqKjogQWRkZWQgdGVzdCBjb3ZlcmFnZSBmb3IgYm90aCBwcm94eS1jb25maWd1cmVkIGFuZCBuby1wcm94eSBjYXNlcy4KLSBBZGRlZCBSdXN0IHRlc3RzIGZvciBib3RoIHdpdGgtcHJveHkgYW5kIHdpdGhvdXQtcHJveHkgc2NlbmFyaW9zIGluIGJvdGggZmVhdHVyZXMuCgo8IS0tIFNUQVJUIENPUElMT1QgT1JJR0lOQUwgUFJPTVBUIC0tPgoKCgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pk9yaWdpbmFsIHByb21wdDwvc3VtbWFyeT4KCj4gCj4gLS0tLQo+IAo+ICpUaGlzIHNlY3Rpb24gZGV0YWlscyBvbiB0aGUgb3JpZ2luYWwgaXNzdWUgeW91IHNob3VsZCByZXNvbHZlKgo+IAo+IDxpc3N1ZV90aXRsZT5idWc6IGNsdXN0ZXIgY3JlYXRpb24gZmFpbGVkPC9pc3N1ZV90aXRsZT4KPiA8aXNzdWVfZGVzY3JpcHRpb24+Q29udGV4dDogCj4gU29tZW9uZSBwb3N0ZWQgYWJvdXQgZmluZGluZyBidWdzIG9uICBodHRwczovL3d3dy5yZWRkaXQuY29tL3Ivb3BlbnN0YWNrL2NvbW1lbnRzLzFyd210a3kvbWFnbnVtX3ZleHhob3N0X2NhcGlfZHJpdmVyX2J1Zy8KPiAKPiBUaGlzIGlzIHRoZSBlcnJvciBtZXNzYWdlOgo+IGBgYAo+ICAgICB2MWJldGExOgo+ICAgICAgIGNvbmRpdGlvbnM6Cj4gICAgICAgLSBsYXN0VHJhbnNpdGlvblRpbWU6ICIyMDI2LTAzLTE3VDIxOjM2OjIwWiIKPiAgICAgICAgIG1lc3NhZ2U6ICdlcnJvciByZWNvbmNpbGluZyB0aGUgQ2x1c3RlciB0b3BvbG9neTogZmFpbGVkIHRvIGNyZWF0ZSBLdWJlYWRtQ29udHJvbFBsYW5lLmNvbnRyb2xwbGFuZS5jbHVzdGVyLngtazhzLmlvOgo+IEZpZWxkVmFsdWVJbnZhbGlkOiBzcGVjLmt1YmVhZG1Db25maWdTcGVjLmZpbGVzWzNdLmNvbnRlbnQ6IEludmFsaWQgdmFsdWU6ICIiOiBzcGVjLmt1YmVhZG1Db25maWdTcGVjLmZpbGVzWzNdLmNvbnRlbnQgaW4gYm9keSBzaG91bGQgYmUgYXQgbGVhc3QgMQo+ICAgICAgICAgICBjaGFycyBsb25nIEZpZWxkVmFsdWVJbnZhbGlkOiBzcGVjLmt1YmVhZG1Db25maWdTcGVjLmZpbGVzWzVdLmNvbnRlbnQ6IEludmFsaWQKPiAgICAgICAgICAgdmFsdWU6ICIiOiBzcGVjLmt1YmVhZG1Db25maWdTcGVjLmZpbGVzWzVdLmNvbnRlbnQgaW4gYm9keSBzaG91bGQgYmUgYXQgbGVhc3QgMSBjaGFycyBsb25nJwo+ICAgICAgICAgcmVhc29uOiBUb3BvbG9neVJlY29uY2lsZUZhaWxlZAo+ICAgICAgICAgc2V2ZXJpdHk6IEVycm9yCj4gICAgICAgICBzdGF0dXM6ICJGYWxzZSIKPiAgICAgICAgIHR5cGU6IFRvcG9sb2d5UmVjb25jaWxlZAo+IGBgYAo+IAo+IFRoZSBlcnJvciBhYm92ZSBjYW4gYmUgZml4ZWQgbXkgbWFudWFsbHkgYWRkaW5nICh1c2luZyBlZGl0KSBhICMgdG8gdGhlc2UgMiBsYWJlbHMgb2YgdGhlIGNsdXN0ZXI6Cj4gYGBgCj4gICAgIC0gbmFtZTogc3lzdGVtZFByb3h5Q29uZmlnCj4gICAgICAgdmFsdWU6ICIiCj4gICAgIC0gbmFtZTogYXB0UHJveHlDb25maWcKPiAgICAgICB2YWx1ZTogIiIKPiBgYGAKPiAKPiBDbHVzdGVyIHRlbXBsYXRlIGFuZCBjbHVzdGVyIGNyZWF0aW9uOgo+IGBgYAo+IG9wZW5zdGFjayBjb2UgY2x1c3RlciB0ZW1wbGF0ZSBjcmVhdGUgazhzLW5vYmxlLTIgLS1pbWFnZSBub2JsZS1rOHMgLS1rZXlwYWlyIG9rZXkgLS1leHRlcm5hbC1uZXR3b3JrIGV4dGVybmFsLW5ldCAtLWZsYXZvciBtNC5zbWFsbCAtLW1hc3Rlci1mbGF2b3IgbTQuc21hbGwgLS1uZXR3b3JrLWRyaXZlciBjYWxpY28gLS1jb2Uga3ViZXJuZXRlcyAtLWxhYmVscyBzeXN0ZW1kX3Byb3h5X2NvbmZpZz0iIyIsYXB0X3Byb3h5X2NvbmZpZz0iIyIKPiAKPiBvcGVuc3RhY2sgY29lIGNsdXN0ZXIgY3JlYXRlIC0tY2x1c3Rlci10ZW1wbGF0ZSBrOHMtbm9ibGUtMiAtLW1hc3Rlci1jb3VudCAxIC0tbm9kZS1jb3VudCAxIC0tbGFiZWxzIGt1YmVfdGFnPXYxLjM1LjIsc2VydmVyX2dyb3VwX3BvbGljaWVzPWFmZmluaXR5LG9jdGF2aWFfcHJvdmlkZXI9YW1waG9yYSBjbHVzdGVyLWNsdXN0ZXItMgo+IGBgYDwvaXNzdWVfZGVzY3JpcHRpb24+Cj4gCj4gIyMgQ29tbWVudHMgb24gdGhlIElzc3VlICh5b3UgYXJlIEBjb3BpbG90IGluIHRoaXMgc2VjdGlvbikKPiAKPiA8Y29tbWVudHM+Cj4gPC9jb21tZW50cz4KPiAKCgo8L2RldGFpbHM+CgoKCjwhLS0gU1RBUlQgQ09QSUxPVCBDT0RJTkcgQUdFTlQgU1VGRklYIC0tPgoKLSBGaXhlcyB2ZXh4aG9zdC9tYWdudW0tY2x1c3Rlci1hcGkjODk2Cgo8IS0tIFNUQVJUIENPUElMT1QgQ09ESU5HIEFHRU5UIFRJUFMgLS0+Ci0tLQoK4pyoIExldCBDb3BpbG90IGNvZGluZyBhZ2VudCBbc2V0IHRoaW5ncyB1cCBmb3IgeW91XShodHRwczovL2dpdGh1Yi5jb20vdmV4eGhvc3QvbWFnbnVtLWNsdXN0ZXItYXBpL2lzc3Vlcy9uZXc/dGl0bGU94pyoK1NldCt1cCtDb3BpbG90K2luc3RydWN0aW9ucyZib2R5PUNvbmZpZ3VyZSUyMGluc3RydWN0aW9ucyUyMGZvciUyMHRoaXMlMjByZXBvc2l0b3J5JTIwYXMlMjBkb2N1bWVudGVkJTIwaW4lMjAlNUJCZXN0JTIwcHJhY3RpY2VzJTIwZm9yJTIwQ29waWxvdCUyMGNvZGluZyUyMGFnZW50JTIwaW4lMjB5b3VyJTIwcmVwb3NpdG9yeSU1RCUyOGh0dHBzOi8vZ2guaW8vY29waWxvdC1jb2RpbmctYWdlbnQtdGlwcyUyOSUyRSUwQSUwQSUzQ09uYm9hcmQlMjB0aGlzJTIwcmVwbyUzRSZhc3NpZ25lZXM9Y29waWxvdCkg4oCUIGNvZGluZyBhZ2VudCB3b3JrcyBmYXN0ZXIgYW5kIGRvZXMgaGlnaGVyIHF1YWxpdHkgd29yayB3aGVuIHNldCB1cCBmb3IgeW91ciByZXBvLgo=
      override_checkout: master
      patchset: ca899259023bddc30846ef791e877ce0b3141974
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          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: 416d27e89e0c1891921fee2a692086eb8fcd0307
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: 66d74bbbd6770c9ee1f9179cf69c1687197f2a5a
          untrusted/project_2/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          untrusted/project_3/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          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: ca899259023bddc30846ef791e877ce0b3141974
        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: ca899259023bddc30846ef791e877ce0b3141974
          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: f8a331a40eb21e6c8f37e07794d57aa98b120af9
          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: 5d195faec3edabeeffd379f5a27327db9a1e8eb3
          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: 416d27e89e0c1891921fee2a692086eb8fcd0307
          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: 8d6f68d7de89c1e2891f530f99609fc0b15e7dee
          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: 3526925ae34a66e626bec985628a421a7694168e
          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: 75ca7d532cd6894ac79a4633bfa19842547d372c
          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: cea701dbd13a4e84c2b6d4ad771de0f1425ca2ea
          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: 60ac6e1a3855b46f5d58082333c21b5036305b58
          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: 7e0f18ff2baaf6aec89eb300b6942c488541da7e
          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: 79cf1f787fa9c03adba8575dc94324b97963f84e
          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: 732466071706ef5c3e651ece1bbb16380ed4da0f
          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: bb067082abc8bf3676a8c7e6ae8fa91a2c84b9cb
          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: e63f0b3d68770d4792e1606ff8fe924b3f25b7f9
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/897/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
