all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.157
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      configure_swap_size: 8192
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
          /etc/magnum/magnum.conf:
            cluster_template:
              kubernetes_allowed_network_drivers: calico,cilium
              kubernetes_default_network_driver: calico
            nova_client:
              api_version: 2.15
          /etc/manila/manila.conf:
            generic:
              connect_share_server_to_tenant_network: true
              driver_handles_share_servers: true
      devstack_localrc:
        ADMIN_PASSWORD: secretadmin
        DATABASE_PASSWORD: secretdatabase
        DEBUG_LIBVIRT_COREDUMPS: true
        DISABLE_AMP_IMAGE_BUILD: true
        ENABLE_SYSCTL_MEM_TUNING: true
        ENABLE_SYSCTL_NET_TUNING: true
        ENABLE_ZSWAP: true
        ERROR_ON_CLONE: true
        FIXED_RANGE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        GIT_BASE: https://github.com
        HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
        MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
        MANILA_ENABLED_BACKENDS: generic
        MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
        NETWORK_GATEWAY: 10.1.0.1
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        NOVA_VNC_ENABLED: true
        OCTAVIA_NODE: api
        OVN_DBS_LOG_LEVEL: dbg
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        RABBIT_PASSWORD: secretrabbit
        SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4'']
          }}'
        SERVICE_PASSWORD: secretservice
        SWIFT_HASH: 1234123412341234
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
      devstack_plugins:
        barbican: https://github.com/openstack/barbican
        magnum: https://review.opendev.org/openstack/magnum
        magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
        manila: https://github.com/openstack/manila
        octavia: https://github.com/openstack/octavia
        ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
      devstack_services:
        base: false
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        dstat: false
        etcd3: true
        file_tracker: true
        g-api: true
        horizon: false
        key: true
        memory_tracker: true
        mysql: true
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        o-api: true
        o-da: true
        o-hk: true
        octavia: true
        openstack-cli-server: true
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        placement-api: true
        q-ovn-agent: true
        q-svc: true
        rabbit: true
        s-account: false
        s-container: false
        s-object: false
        s-proxy: false
        tempest: false
        tls-proxy: true
      extensions_to_txt:
        auto: true
        conf: true
        localrc: true
        log: true
        stackenv: true
      image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
        kube_tag }}.qcow2
      kube_tag: v1.34.7
      network_driver: cilium
      nodepool:
        az: nova
        cloud: public
        external_id: d7ec8bbd-9a36-4f18-9498-5f6779b0c5ce
        host_id: 86d6bbee9a590b753878988beec61ed4d37fe4ff9ff09e01cc4e099b
        interface_ip: 199.204.45.157
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.157
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.157
        public_ipv6: 2604:e100:1:0:f816:3eff:fea2:a3e6
        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: d7ec8bbd-9a36-4f18-9498-5f6779b0c5ce
        host_id: 86d6bbee9a590b753878988beec61ed4d37fe4ff9ff09e01cc4e099b
        interface_ip: 199.204.45.157
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.157
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.157
        public_ipv6: 2604:e100:1:0:f816:3eff:fea2:a3e6
        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.34.7
    network_driver: cilium
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job openstack-multinode-fips explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#17>'
      - '<Job devstack-base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#368>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#502>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#545>'
      - '<Job magnum-cluster-api-devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-hydrophone explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#60>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#90>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7-cilium explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#102>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7-cilium explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: f5a1cb4f0dfd4296892dde1c865670e9
      build_refs:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\n\n## Usage\n\nOperators define reusable
          profiles in the management Kubernetes cluster using `ConfigMap/mcapi-config-profiles`,
          normally in the `magnum-system` namespace. Users select those profiles through
          cluster template labels.\n\nCluster-wide profile:\n\n```bash\nopenstack
          coe cluster template create k8s-bm-gpu \\\n  ...same base template options...
          \\\n  --labels config_profile=profile-gpu\n\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nCluster default plus
          a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster template create
          k8s-bm-gpu \\\n  ...same base template options... \\\n  --labels config_profile=profile-standard
          \\\n  --labels nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
          coe cluster create bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nPassing
          `config_profile` or `nodegroup_config_profile_set` directly through `openstack
          coe cluster create --labels` is rejected unless the value exactly matches
          the selected cluster template. These are bootstrap-time selectors; changing
          the cluster row label later would not rerun cloud-init or kubeadm on existing
          nodes. To change these labels after cluster creation, create a new cluster
          template that selects the desired profile and run Magnum cluster upgrade.
          Magnum cluster update does not support real label changes.\n\n## Problem\n\nBaremetal
          and GPU-oriented Kubernetes clusters need declarative node bootstrap and
          kubelet tuning that survives node replacement, scale-up, and rolling upgrades.
          The older options are not good production interfaces:\n\n- post-create SSH
          edits to node files are not declarative and do not survive node replacement;\n-
          `kubeletExtraArgs` is a CLI flag path, while these settings belong in structured
          kubelet configuration;\n- arbitrary JSON/YAML in Magnum labels would make
          labels an untyped config transport and would be difficult to validate safely;\n-
          exposing every kubelet or cloud-init field as an individual Magnum label
          would create a large and unstable user-facing label surface.\n\n## Solution\n\nPR
          #1013 exposes node bootstrap customization through operator-managed config
          profiles.\n\nA profile can include:\n\n- `kubeletConfig`\n- `files`\n- `preKubeadmCommands`\n-
          `postKubeadmCommands`\n\nMagnum renders kubelet config as `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`,
          adds the kubeadm patch directory, and appends profile files/commands into
          CAPI kubeadm bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`;
          profiles must not set those fields. Profiles must use the structured wrapper
          fields above. Unwrapped kubelet-only YAML such as `maxPods: 250` is rejected.\n\n```yaml\napiVersion:
          v1\nkind: ConfigMap\nmetadata:\n  name: mcapi-config-profiles\n  namespace:
          magnum-system\ndata:\n  profile-standard: |\n    kubeletConfig:\n      maxPods:
          110\n    files:\n      - path: /etc/atmosphere/profile-role\n        content:
          standard\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-standard.sh\n
          \   postKubeadmCommands:\n      - echo standard-post >/var/log/atmosphere/config-profile-post\n\n
          \ profile-gpu: |\n    kubeletConfig:\n      cpuManagerPolicy: static\n      cpuManagerPolicyOptions:\n
          \       full-pcpus-only: \"true\"\n      memoryManagerPolicy: Static\n      topologyManagerPolicy:
          single-numa-node\n      topologyManagerScope: pod\n      reservedSystemCPUs:
          0-1\n      maxPods: 250\n    files:\n      - path: /etc/atmosphere/profile-role\n
          \       content: gpu\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-gpu.sh\n
          \   postKubeadmCommands:\n      - echo gpu-post >/var/log/atmosphere/config-profile-post\n\n
          \ profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n        profile:
          profile-gpu\n```\n\nUsers select predefined profiles with two cluster template
          labels:\n\n| Label | Example | Effect |\n|---|---|---|\n| `config_profile`
          | `profile-standard` | Selects the cluster-wide default profile rendered
          as the `configProfile` ClusterClass topology variable. |\n| `nodegroup_config_profile_set`
          | `profile-bm-gpu-layout` | Selects an operator-defined nodegroup layout
          that renders MachineDeployment-level `configProfile` overrides. |\n\nThere
          are no per-field kubelet labels, no arbitrary user JSON passthrough, and
          no compatibility aliases for names that only existed in the unmerged PR
          history. Missing profiles, invalid YAML, reserved fields, invalid file entries,
          unknown nodegroup profile references, and cluster-create selector overrides
          fail validation before CAPI rendering.\n\nThis covers the PR #1015 use case
          through profiles. A single operator-managed profile can write files and
          run pre/post kubeadm commands for every node in the cluster, and a nodegroup
          layout can apply a different profile only to GPU workers while controllers
          and other workers keep the standard profile. This avoids exposing `extra_files`
          or command labels directly to users.\n\n## Scope Split\n\nThis PR was rewritten
          to keep only the config-profile work. The unrelated compatibility and cleanup
          commits that used to be stacked here were moved into draft PR #1051: https://github.com/vexxhost/magnum-cluster-api/pull/1051\n\nPR
          #1051 intentionally keeps those extracted fixes as separate commits so they
          can be reviewed, split, or discarded independently later.\n\n## Documentation\n\n-
          `docs/user/labels.md` documents the selector labels, their cluster-template
          source of truth, and the supported profile fields.\n- `docs/user/use-cases.md`
          shows operator-defined profiles and user selection through cluster templates.\n-
          `docs/developer/cluster-topology.md` documents how profiles map to topology
          variables and MachineDeployment overrides.\n- The internal validation note
          under `notes/logs/mcapi` documents the detailed OVS/OVN AIO runbook and
          recovery details.\n\n## Validation\n\nLocal validation after the split:\n\n```bash\nuvx
          --python 3.12 pre-commit run --all-files\n# passed\n\ncargo test kubelet_config
          --quiet\n# 2 passed\n\ncargo test containerd_config --quiet\n# 2 passed\n\nuv
          run --python 3.10 pytest magnum_cluster_api/tests/unit/test_utils.py -q
          -k 'ConfigProfile or config_profile or kubelet_config'\n# 30 passed, 16
          deselected, 7 warnings\n\n# trailer audit across PR #1013 stack\n# 10 commits,
          0 failures\n```\n\nReal-case AIO validation on the config-profile code path
          before the split:\n\n- Rolled Magnum API/conductor/proxy images built from
          the config-profile branch into one OVS AIO and one OVN AIO.\n- Verified
          cluster-create selector override rejection on both backends: trying to pass
          `config_profile=profile-gpu` at cluster create time against a template selecting
          another value failed before CAPI rendering.\n- Verified fresh cluster create
          with selector labels only on the cluster template passed PR #1013 validation/rendering
          on both backends; the validation environments then stopped on exhausted
          OpenStack server-group quota before node creation.\n- Verified an upgrade/update
          path on both backends through Magnum cluster upgrade to a template selecting
          `profile-safe`. Both clusters reached `UPDATE_COMPLETE`; CAPI reported `TopologyReconciled=True`
          and `RollingOut=False`; workload control-plane and worker nodes were Ready.\n-
          Verified rendered topology content for the converged profile, including
          `maxPods: 111`, profile-managed files, profile `preKubeadmCommands`, and
          profile `postKubeadmCommands` while preserving existing bootstrap commands.\n-
          Verified the aggressive `profile-gpu` content renders the expected kubelet
          patch, files, and pre/post commands. It is not a valid runtime profile for
          the non-GPU VM AIO workers, so convergence testing used `profile-safe`;
          final GPU runtime settings still need validation on real GPU or bare-metal
          nodes.\n- The live upgrade test found and fixed a worker bootstrap edge
          case: Cluster API can prune empty worker command arrays, so the first worker
          profile command must create the list before later commands append to it.
          That fix remains included in this PR as `fix: seed worker config profile
          command arrays`.\n\nPR #1015 is already closed and superseded by this config-profile
          model.\n\nSigned-off-by: Rico Lin <rico@vexxhost.com>"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        patchset: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        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: c7705a9a9dfb45a2b08b63b090236af9
      buildset_refs:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\n\n## Usage\n\nOperators define reusable
          profiles in the management Kubernetes cluster using `ConfigMap/mcapi-config-profiles`,
          normally in the `magnum-system` namespace. Users select those profiles through
          cluster template labels.\n\nCluster-wide profile:\n\n```bash\nopenstack
          coe cluster template create k8s-bm-gpu \\\n  ...same base template options...
          \\\n  --labels config_profile=profile-gpu\n\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nCluster default plus
          a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster template create
          k8s-bm-gpu \\\n  ...same base template options... \\\n  --labels config_profile=profile-standard
          \\\n  --labels nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
          coe cluster create bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nPassing
          `config_profile` or `nodegroup_config_profile_set` directly through `openstack
          coe cluster create --labels` is rejected unless the value exactly matches
          the selected cluster template. These are bootstrap-time selectors; changing
          the cluster row label later would not rerun cloud-init or kubeadm on existing
          nodes. To change these labels after cluster creation, create a new cluster
          template that selects the desired profile and run Magnum cluster upgrade.
          Magnum cluster update does not support real label changes.\n\n## Problem\n\nBaremetal
          and GPU-oriented Kubernetes clusters need declarative node bootstrap and
          kubelet tuning that survives node replacement, scale-up, and rolling upgrades.
          The older options are not good production interfaces:\n\n- post-create SSH
          edits to node files are not declarative and do not survive node replacement;\n-
          `kubeletExtraArgs` is a CLI flag path, while these settings belong in structured
          kubelet configuration;\n- arbitrary JSON/YAML in Magnum labels would make
          labels an untyped config transport and would be difficult to validate safely;\n-
          exposing every kubelet or cloud-init field as an individual Magnum label
          would create a large and unstable user-facing label surface.\n\n## Solution\n\nPR
          #1013 exposes node bootstrap customization through operator-managed config
          profiles.\n\nA profile can include:\n\n- `kubeletConfig`\n- `files`\n- `preKubeadmCommands`\n-
          `postKubeadmCommands`\n\nMagnum renders kubelet config as `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`,
          adds the kubeadm patch directory, and appends profile files/commands into
          CAPI kubeadm bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`;
          profiles must not set those fields. Profiles must use the structured wrapper
          fields above. Unwrapped kubelet-only YAML such as `maxPods: 250` is rejected.\n\n```yaml\napiVersion:
          v1\nkind: ConfigMap\nmetadata:\n  name: mcapi-config-profiles\n  namespace:
          magnum-system\ndata:\n  profile-standard: |\n    kubeletConfig:\n      maxPods:
          110\n    files:\n      - path: /etc/atmosphere/profile-role\n        content:
          standard\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-standard.sh\n
          \   postKubeadmCommands:\n      - echo standard-post >/var/log/atmosphere/config-profile-post\n\n
          \ profile-gpu: |\n    kubeletConfig:\n      cpuManagerPolicy: static\n      cpuManagerPolicyOptions:\n
          \       full-pcpus-only: \"true\"\n      memoryManagerPolicy: Static\n      topologyManagerPolicy:
          single-numa-node\n      topologyManagerScope: pod\n      reservedSystemCPUs:
          0-1\n      maxPods: 250\n    files:\n      - path: /etc/atmosphere/profile-role\n
          \       content: gpu\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-gpu.sh\n
          \   postKubeadmCommands:\n      - echo gpu-post >/var/log/atmosphere/config-profile-post\n\n
          \ profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n        profile:
          profile-gpu\n```\n\nUsers select predefined profiles with two cluster template
          labels:\n\n| Label | Example | Effect |\n|---|---|---|\n| `config_profile`
          | `profile-standard` | Selects the cluster-wide default profile rendered
          as the `configProfile` ClusterClass topology variable. |\n| `nodegroup_config_profile_set`
          | `profile-bm-gpu-layout` | Selects an operator-defined nodegroup layout
          that renders MachineDeployment-level `configProfile` overrides. |\n\nThere
          are no per-field kubelet labels, no arbitrary user JSON passthrough, and
          no compatibility aliases for names that only existed in the unmerged PR
          history. Missing profiles, invalid YAML, reserved fields, invalid file entries,
          unknown nodegroup profile references, and cluster-create selector overrides
          fail validation before CAPI rendering.\n\nThis covers the PR #1015 use case
          through profiles. A single operator-managed profile can write files and
          run pre/post kubeadm commands for every node in the cluster, and a nodegroup
          layout can apply a different profile only to GPU workers while controllers
          and other workers keep the standard profile. This avoids exposing `extra_files`
          or command labels directly to users.\n\n## Scope Split\n\nThis PR was rewritten
          to keep only the config-profile work. The unrelated compatibility and cleanup
          commits that used to be stacked here were moved into draft PR #1051: https://github.com/vexxhost/magnum-cluster-api/pull/1051\n\nPR
          #1051 intentionally keeps those extracted fixes as separate commits so they
          can be reviewed, split, or discarded independently later.\n\n## Documentation\n\n-
          `docs/user/labels.md` documents the selector labels, their cluster-template
          source of truth, and the supported profile fields.\n- `docs/user/use-cases.md`
          shows operator-defined profiles and user selection through cluster templates.\n-
          `docs/developer/cluster-topology.md` documents how profiles map to topology
          variables and MachineDeployment overrides.\n- The internal validation note
          under `notes/logs/mcapi` documents the detailed OVS/OVN AIO runbook and
          recovery details.\n\n## Validation\n\nLocal validation after the split:\n\n```bash\nuvx
          --python 3.12 pre-commit run --all-files\n# passed\n\ncargo test kubelet_config
          --quiet\n# 2 passed\n\ncargo test containerd_config --quiet\n# 2 passed\n\nuv
          run --python 3.10 pytest magnum_cluster_api/tests/unit/test_utils.py -q
          -k 'ConfigProfile or config_profile or kubelet_config'\n# 30 passed, 16
          deselected, 7 warnings\n\n# trailer audit across PR #1013 stack\n# 10 commits,
          0 failures\n```\n\nReal-case AIO validation on the config-profile code path
          before the split:\n\n- Rolled Magnum API/conductor/proxy images built from
          the config-profile branch into one OVS AIO and one OVN AIO.\n- Verified
          cluster-create selector override rejection on both backends: trying to pass
          `config_profile=profile-gpu` at cluster create time against a template selecting
          another value failed before CAPI rendering.\n- Verified fresh cluster create
          with selector labels only on the cluster template passed PR #1013 validation/rendering
          on both backends; the validation environments then stopped on exhausted
          OpenStack server-group quota before node creation.\n- Verified an upgrade/update
          path on both backends through Magnum cluster upgrade to a template selecting
          `profile-safe`. Both clusters reached `UPDATE_COMPLETE`; CAPI reported `TopologyReconciled=True`
          and `RollingOut=False`; workload control-plane and worker nodes were Ready.\n-
          Verified rendered topology content for the converged profile, including
          `maxPods: 111`, profile-managed files, profile `preKubeadmCommands`, and
          profile `postKubeadmCommands` while preserving existing bootstrap commands.\n-
          Verified the aggressive `profile-gpu` content renders the expected kubelet
          patch, files, and pre/post commands. It is not a valid runtime profile for
          the non-GPU VM AIO workers, so convergence testing used `profile-safe`;
          final GPU runtime settings still need validation on real GPU or bare-metal
          nodes.\n- The live upgrade test found and fixed a worker bootstrap edge
          case: Cluster API can prune empty worker command arrays, so the first worker
          profile command must create the list before later commands append to it.
          That fix remains included in this PR as `fix: seed worker config profile
          command arrays`.\n\nPR #1015 is already closed and superseded by this config-profile
          model.\n\nSigned-off-by: Rico Lin <rico@vexxhost.com>"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        patchset: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        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: '1013'
      change_message: "Support config profiles\n\n## Usage\n\nOperators define reusable
        profiles in the management Kubernetes cluster using `ConfigMap/mcapi-config-profiles`,
        normally in the `magnum-system` namespace. Users select those profiles through
        cluster template labels.\n\nCluster-wide profile:\n\n```bash\nopenstack coe
        cluster template create k8s-bm-gpu \\\n  ...same base template options...
        \\\n  --labels config_profile=profile-gpu\n\nopenstack coe cluster create
        bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nCluster default plus a
        GPU nodegroup layout:\n\n```bash\nopenstack coe cluster template create k8s-bm-gpu
        \\\n  ...same base template options... \\\n  --labels config_profile=profile-standard
        \\\n  --labels nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
        coe cluster create bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nPassing
        `config_profile` or `nodegroup_config_profile_set` directly through `openstack
        coe cluster create --labels` is rejected unless the value exactly matches
        the selected cluster template. These are bootstrap-time selectors; changing
        the cluster row label later would not rerun cloud-init or kubeadm on existing
        nodes. To change these labels after cluster creation, create a new cluster
        template that selects the desired profile and run Magnum cluster upgrade.
        Magnum cluster update does not support real label changes.\n\n## Problem\n\nBaremetal
        and GPU-oriented Kubernetes clusters need declarative node bootstrap and kubelet
        tuning that survives node replacement, scale-up, and rolling upgrades. The
        older options are not good production interfaces:\n\n- post-create SSH edits
        to node files are not declarative and do not survive node replacement;\n-
        `kubeletExtraArgs` is a CLI flag path, while these settings belong in structured
        kubelet configuration;\n- arbitrary JSON/YAML in Magnum labels would make
        labels an untyped config transport and would be difficult to validate safely;\n-
        exposing every kubelet or cloud-init field as an individual Magnum label would
        create a large and unstable user-facing label surface.\n\n## Solution\n\nPR
        #1013 exposes node bootstrap customization through operator-managed config
        profiles.\n\nA profile can include:\n\n- `kubeletConfig`\n- `files`\n- `preKubeadmCommands`\n-
        `postKubeadmCommands`\n\nMagnum renders kubelet config as `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`,
        adds the kubeadm patch directory, and appends profile files/commands into
        CAPI kubeadm bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`;
        profiles must not set those fields. Profiles must use the structured wrapper
        fields above. Unwrapped kubelet-only YAML such as `maxPods: 250` is rejected.\n\n```yaml\napiVersion:
        v1\nkind: ConfigMap\nmetadata:\n  name: mcapi-config-profiles\n  namespace:
        magnum-system\ndata:\n  profile-standard: |\n    kubeletConfig:\n      maxPods:
        110\n    files:\n      - path: /etc/atmosphere/profile-role\n        content:
        standard\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-standard.sh\n
        \   postKubeadmCommands:\n      - echo standard-post >/var/log/atmosphere/config-profile-post\n\n
        \ profile-gpu: |\n    kubeletConfig:\n      cpuManagerPolicy: static\n      cpuManagerPolicyOptions:\n
        \       full-pcpus-only: \"true\"\n      memoryManagerPolicy: Static\n      topologyManagerPolicy:
        single-numa-node\n      topologyManagerScope: pod\n      reservedSystemCPUs:
        0-1\n      maxPods: 250\n    files:\n      - path: /etc/atmosphere/profile-role\n
        \       content: gpu\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-gpu.sh\n
        \   postKubeadmCommands:\n      - echo gpu-post >/var/log/atmosphere/config-profile-post\n\n
        \ profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n        profile:
        profile-gpu\n```\n\nUsers select predefined profiles with two cluster template
        labels:\n\n| Label | Example | Effect |\n|---|---|---|\n| `config_profile`
        | `profile-standard` | Selects the cluster-wide default profile rendered as
        the `configProfile` ClusterClass topology variable. |\n| `nodegroup_config_profile_set`
        | `profile-bm-gpu-layout` | Selects an operator-defined nodegroup layout that
        renders MachineDeployment-level `configProfile` overrides. |\n\nThere are
        no per-field kubelet labels, no arbitrary user JSON passthrough, and no compatibility
        aliases for names that only existed in the unmerged PR history. Missing profiles,
        invalid YAML, reserved fields, invalid file entries, unknown nodegroup profile
        references, and cluster-create selector overrides fail validation before CAPI
        rendering.\n\nThis covers the PR #1015 use case through profiles. A single
        operator-managed profile can write files and run pre/post kubeadm commands
        for every node in the cluster, and a nodegroup layout can apply a different
        profile only to GPU workers while controllers and other workers keep the standard
        profile. This avoids exposing `extra_files` or command labels directly to
        users.\n\n## Scope Split\n\nThis PR was rewritten to keep only the config-profile
        work. The unrelated compatibility and cleanup commits that used to be stacked
        here were moved into draft PR #1051: https://github.com/vexxhost/magnum-cluster-api/pull/1051\n\nPR
        #1051 intentionally keeps those extracted fixes as separate commits so they
        can be reviewed, split, or discarded independently later.\n\n## Documentation\n\n-
        `docs/user/labels.md` documents the selector labels, their cluster-template
        source of truth, and the supported profile fields.\n- `docs/user/use-cases.md`
        shows operator-defined profiles and user selection through cluster templates.\n-
        `docs/developer/cluster-topology.md` documents how profiles map to topology
        variables and MachineDeployment overrides.\n- The internal validation note
        under `notes/logs/mcapi` documents the detailed OVS/OVN AIO runbook and recovery
        details.\n\n## Validation\n\nLocal validation after the split:\n\n```bash\nuvx
        --python 3.12 pre-commit run --all-files\n# passed\n\ncargo test kubelet_config
        --quiet\n# 2 passed\n\ncargo test containerd_config --quiet\n# 2 passed\n\nuv
        run --python 3.10 pytest magnum_cluster_api/tests/unit/test_utils.py -q -k
        'ConfigProfile or config_profile or kubelet_config'\n# 30 passed, 16 deselected,
        7 warnings\n\n# trailer audit across PR #1013 stack\n# 10 commits, 0 failures\n```\n\nReal-case
        AIO validation on the config-profile code path before the split:\n\n- Rolled
        Magnum API/conductor/proxy images built from the config-profile branch into
        one OVS AIO and one OVN AIO.\n- Verified cluster-create selector override
        rejection on both backends: trying to pass `config_profile=profile-gpu` at
        cluster create time against a template selecting another value failed before
        CAPI rendering.\n- Verified fresh cluster create with selector labels only
        on the cluster template passed PR #1013 validation/rendering on both backends;
        the validation environments then stopped on exhausted OpenStack server-group
        quota before node creation.\n- Verified an upgrade/update path on both backends
        through Magnum cluster upgrade to a template selecting `profile-safe`. Both
        clusters reached `UPDATE_COMPLETE`; CAPI reported `TopologyReconciled=True`
        and `RollingOut=False`; workload control-plane and worker nodes were Ready.\n-
        Verified rendered topology content for the converged profile, including `maxPods:
        111`, profile-managed files, profile `preKubeadmCommands`, and profile `postKubeadmCommands`
        while preserving existing bootstrap commands.\n- Verified the aggressive `profile-gpu`
        content renders the expected kubelet patch, files, and pre/post commands.
        It is not a valid runtime profile for the non-GPU VM AIO workers, so convergence
        testing used `profile-safe`; final GPU runtime settings still need validation
        on real GPU or bare-metal nodes.\n- The live upgrade test found and fixed
        a worker bootstrap edge case: Cluster API can prune empty worker command arrays,
        so the first worker profile command must create the list before later commands
        append to it. That fix remains included in this PR as `fix: seed worker config
        profile command arrays`.\n\nPR #1015 is already closed and superseded by this
        config-profile model.\n\nSigned-off-by: Rico Lin <rico@vexxhost.com>"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
      child_jobs: []
      commit_id: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
      event_id: 6f00f8a0-5aae-11f1-8d59-6be64b3b5d40
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/f5a1cb4f0dfd4296892dde1c865670e9/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/f5a1cb4f0dfd4296892dde1c865670e9/work/logs
        result_data_file: /var/lib/zuul/builds/f5a1cb4f0dfd4296892dde1c865670e9/work/results.json
        src_root: /var/lib/zuul/builds/f5a1cb4f0dfd4296892dde1c865670e9/work/src
        work_root: /var/lib/zuul/builds/f5a1cb4f0dfd4296892dde1c865670e9/work
      include_vars: []
      items:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\n\n## Usage\n\nOperators define reusable
          profiles in the management Kubernetes cluster using `ConfigMap/mcapi-config-profiles`,
          normally in the `magnum-system` namespace. Users select those profiles through
          cluster template labels.\n\nCluster-wide profile:\n\n```bash\nopenstack
          coe cluster template create k8s-bm-gpu \\\n  ...same base template options...
          \\\n  --labels config_profile=profile-gpu\n\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nCluster default plus
          a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster template create
          k8s-bm-gpu \\\n  ...same base template options... \\\n  --labels config_profile=profile-standard
          \\\n  --labels nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
          coe cluster create bm-gpu \\\n  --cluster-template k8s-bm-gpu\n```\n\nPassing
          `config_profile` or `nodegroup_config_profile_set` directly through `openstack
          coe cluster create --labels` is rejected unless the value exactly matches
          the selected cluster template. These are bootstrap-time selectors; changing
          the cluster row label later would not rerun cloud-init or kubeadm on existing
          nodes. To change these labels after cluster creation, create a new cluster
          template that selects the desired profile and run Magnum cluster upgrade.
          Magnum cluster update does not support real label changes.\n\n## Problem\n\nBaremetal
          and GPU-oriented Kubernetes clusters need declarative node bootstrap and
          kubelet tuning that survives node replacement, scale-up, and rolling upgrades.
          The older options are not good production interfaces:\n\n- post-create SSH
          edits to node files are not declarative and do not survive node replacement;\n-
          `kubeletExtraArgs` is a CLI flag path, while these settings belong in structured
          kubelet configuration;\n- arbitrary JSON/YAML in Magnum labels would make
          labels an untyped config transport and would be difficult to validate safely;\n-
          exposing every kubelet or cloud-init field as an individual Magnum label
          would create a large and unstable user-facing label surface.\n\n## Solution\n\nPR
          #1013 exposes node bootstrap customization through operator-managed config
          profiles.\n\nA profile can include:\n\n- `kubeletConfig`\n- `files`\n- `preKubeadmCommands`\n-
          `postKubeadmCommands`\n\nMagnum renders kubelet config as `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`,
          adds the kubeadm patch directory, and appends profile files/commands into
          CAPI kubeadm bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`;
          profiles must not set those fields. Profiles must use the structured wrapper
          fields above. Unwrapped kubelet-only YAML such as `maxPods: 250` is rejected.\n\n```yaml\napiVersion:
          v1\nkind: ConfigMap\nmetadata:\n  name: mcapi-config-profiles\n  namespace:
          magnum-system\ndata:\n  profile-standard: |\n    kubeletConfig:\n      maxPods:
          110\n    files:\n      - path: /etc/atmosphere/profile-role\n        content:
          standard\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-standard.sh\n
          \   postKubeadmCommands:\n      - echo standard-post >/var/log/atmosphere/config-profile-post\n\n
          \ profile-gpu: |\n    kubeletConfig:\n      cpuManagerPolicy: static\n      cpuManagerPolicyOptions:\n
          \       full-pcpus-only: \"true\"\n      memoryManagerPolicy: Static\n      topologyManagerPolicy:
          single-numa-node\n      topologyManagerScope: pod\n      reservedSystemCPUs:
          0-1\n      maxPods: 250\n    files:\n      - path: /etc/atmosphere/profile-role\n
          \       content: gpu\n    preKubeadmCommands:\n      - bash /etc/atmosphere/profile-gpu.sh\n
          \   postKubeadmCommands:\n      - echo gpu-post >/var/log/atmosphere/config-profile-post\n\n
          \ profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n        profile:
          profile-gpu\n```\n\nUsers select predefined profiles with two cluster template
          labels:\n\n| Label | Example | Effect |\n|---|---|---|\n| `config_profile`
          | `profile-standard` | Selects the cluster-wide default profile rendered
          as the `configProfile` ClusterClass topology variable. |\n| `nodegroup_config_profile_set`
          | `profile-bm-gpu-layout` | Selects an operator-defined nodegroup layout
          that renders MachineDeployment-level `configProfile` overrides. |\n\nThere
          are no per-field kubelet labels, no arbitrary user JSON passthrough, and
          no compatibility aliases for names that only existed in the unmerged PR
          history. Missing profiles, invalid YAML, reserved fields, invalid file entries,
          unknown nodegroup profile references, and cluster-create selector overrides
          fail validation before CAPI rendering.\n\nThis covers the PR #1015 use case
          through profiles. A single operator-managed profile can write files and
          run pre/post kubeadm commands for every node in the cluster, and a nodegroup
          layout can apply a different profile only to GPU workers while controllers
          and other workers keep the standard profile. This avoids exposing `extra_files`
          or command labels directly to users.\n\n## Scope Split\n\nThis PR was rewritten
          to keep only the config-profile work. The unrelated compatibility and cleanup
          commits that used to be stacked here were moved into draft PR #1051: https://github.com/vexxhost/magnum-cluster-api/pull/1051\n\nPR
          #1051 intentionally keeps those extracted fixes as separate commits so they
          can be reviewed, split, or discarded independently later.\n\n## Documentation\n\n-
          `docs/user/labels.md` documents the selector labels, their cluster-template
          source of truth, and the supported profile fields.\n- `docs/user/use-cases.md`
          shows operator-defined profiles and user selection through cluster templates.\n-
          `docs/developer/cluster-topology.md` documents how profiles map to topology
          variables and MachineDeployment overrides.\n- The internal validation note
          under `notes/logs/mcapi` documents the detailed OVS/OVN AIO runbook and
          recovery details.\n\n## Validation\n\nLocal validation after the split:\n\n```bash\nuvx
          --python 3.12 pre-commit run --all-files\n# passed\n\ncargo test kubelet_config
          --quiet\n# 2 passed\n\ncargo test containerd_config --quiet\n# 2 passed\n\nuv
          run --python 3.10 pytest magnum_cluster_api/tests/unit/test_utils.py -q
          -k 'ConfigProfile or config_profile or kubelet_config'\n# 30 passed, 16
          deselected, 7 warnings\n\n# trailer audit across PR #1013 stack\n# 10 commits,
          0 failures\n```\n\nReal-case AIO validation on the config-profile code path
          before the split:\n\n- Rolled Magnum API/conductor/proxy images built from
          the config-profile branch into one OVS AIO and one OVN AIO.\n- Verified
          cluster-create selector override rejection on both backends: trying to pass
          `config_profile=profile-gpu` at cluster create time against a template selecting
          another value failed before CAPI rendering.\n- Verified fresh cluster create
          with selector labels only on the cluster template passed PR #1013 validation/rendering
          on both backends; the validation environments then stopped on exhausted
          OpenStack server-group quota before node creation.\n- Verified an upgrade/update
          path on both backends through Magnum cluster upgrade to a template selecting
          `profile-safe`. Both clusters reached `UPDATE_COMPLETE`; CAPI reported `TopologyReconciled=True`
          and `RollingOut=False`; workload control-plane and worker nodes were Ready.\n-
          Verified rendered topology content for the converged profile, including
          `maxPods: 111`, profile-managed files, profile `preKubeadmCommands`, and
          profile `postKubeadmCommands` while preserving existing bootstrap commands.\n-
          Verified the aggressive `profile-gpu` content renders the expected kubelet
          patch, files, and pre/post commands. It is not a valid runtime profile for
          the non-GPU VM AIO workers, so convergence testing used `profile-safe`;
          final GPU runtime settings still need validation on real GPU or bare-metal
          nodes.\n- The live upgrade test found and fixed a worker bootstrap edge
          case: Cluster API can prune empty worker command arrays, so the first worker
          profile command must create the list before later commands append to it.
          That fix remains included in this PR as `fix: seed worker config profile
          command arrays`.\n\nPR #1015 is already closed and superseded by this config-profile
          model.\n\nSigned-off-by: Rico Lin <rico@vexxhost.com>"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        patchset: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        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.34.7-cilium
      jobtags: []
      max_attempts: 3
      message: U3VwcG9ydCBjb25maWcgcHJvZmlsZXMKCiMjIFVzYWdlCgpPcGVyYXRvcnMgZGVmaW5lIHJldXNhYmxlIHByb2ZpbGVzIGluIHRoZSBtYW5hZ2VtZW50IEt1YmVybmV0ZXMgY2x1c3RlciB1c2luZyBgQ29uZmlnTWFwL21jYXBpLWNvbmZpZy1wcm9maWxlc2AsIG5vcm1hbGx5IGluIHRoZSBgbWFnbnVtLXN5c3RlbWAgbmFtZXNwYWNlLiBVc2VycyBzZWxlY3QgdGhvc2UgcHJvZmlsZXMgdGhyb3VnaCBjbHVzdGVyIHRlbXBsYXRlIGxhYmVscy4KCkNsdXN0ZXItd2lkZSBwcm9maWxlOgoKYGBgYmFzaApvcGVuc3RhY2sgY29lIGNsdXN0ZXIgdGVtcGxhdGUgY3JlYXRlIGs4cy1ibS1ncHUgXAogIC4uLnNhbWUgYmFzZSB0ZW1wbGF0ZSBvcHRpb25zLi4uIFwKICAtLWxhYmVscyBjb25maWdfcHJvZmlsZT1wcm9maWxlLWdwdQoKb3BlbnN0YWNrIGNvZSBjbHVzdGVyIGNyZWF0ZSBibS1ncHUgXAogIC0tY2x1c3Rlci10ZW1wbGF0ZSBrOHMtYm0tZ3B1CmBgYAoKQ2x1c3RlciBkZWZhdWx0IHBsdXMgYSBHUFUgbm9kZWdyb3VwIGxheW91dDoKCmBgYGJhc2gKb3BlbnN0YWNrIGNvZSBjbHVzdGVyIHRlbXBsYXRlIGNyZWF0ZSBrOHMtYm0tZ3B1IFwKICAuLi5zYW1lIGJhc2UgdGVtcGxhdGUgb3B0aW9ucy4uLiBcCiAgLS1sYWJlbHMgY29uZmlnX3Byb2ZpbGU9cHJvZmlsZS1zdGFuZGFyZCBcCiAgLS1sYWJlbHMgbm9kZWdyb3VwX2NvbmZpZ19wcm9maWxlX3NldD1wcm9maWxlLWJtLWdwdS1sYXlvdXQKCm9wZW5zdGFjayBjb2UgY2x1c3RlciBjcmVhdGUgYm0tZ3B1IFwKICAtLWNsdXN0ZXItdGVtcGxhdGUgazhzLWJtLWdwdQpgYGAKClBhc3NpbmcgYGNvbmZpZ19wcm9maWxlYCBvciBgbm9kZWdyb3VwX2NvbmZpZ19wcm9maWxlX3NldGAgZGlyZWN0bHkgdGhyb3VnaCBgb3BlbnN0YWNrIGNvZSBjbHVzdGVyIGNyZWF0ZSAtLWxhYmVsc2AgaXMgcmVqZWN0ZWQgdW5sZXNzIHRoZSB2YWx1ZSBleGFjdGx5IG1hdGNoZXMgdGhlIHNlbGVjdGVkIGNsdXN0ZXIgdGVtcGxhdGUuIFRoZXNlIGFyZSBib290c3RyYXAtdGltZSBzZWxlY3RvcnM7IGNoYW5naW5nIHRoZSBjbHVzdGVyIHJvdyBsYWJlbCBsYXRlciB3b3VsZCBub3QgcmVydW4gY2xvdWQtaW5pdCBvciBrdWJlYWRtIG9uIGV4aXN0aW5nIG5vZGVzLiBUbyBjaGFuZ2UgdGhlc2UgbGFiZWxzIGFmdGVyIGNsdXN0ZXIgY3JlYXRpb24sIGNyZWF0ZSBhIG5ldyBjbHVzdGVyIHRlbXBsYXRlIHRoYXQgc2VsZWN0cyB0aGUgZGVzaXJlZCBwcm9maWxlIGFuZCBydW4gTWFnbnVtIGNsdXN0ZXIgdXBncmFkZS4gTWFnbnVtIGNsdXN0ZXIgdXBkYXRlIGRvZXMgbm90IHN1cHBvcnQgcmVhbCBsYWJlbCBjaGFuZ2VzLgoKIyMgUHJvYmxlbQoKQmFyZW1ldGFsIGFuZCBHUFUtb3JpZW50ZWQgS3ViZXJuZXRlcyBjbHVzdGVycyBuZWVkIGRlY2xhcmF0aXZlIG5vZGUgYm9vdHN0cmFwIGFuZCBrdWJlbGV0IHR1bmluZyB0aGF0IHN1cnZpdmVzIG5vZGUgcmVwbGFjZW1lbnQsIHNjYWxlLXVwLCBhbmQgcm9sbGluZyB1cGdyYWRlcy4gVGhlIG9sZGVyIG9wdGlvbnMgYXJlIG5vdCBnb29kIHByb2R1Y3Rpb24gaW50ZXJmYWNlczoKCi0gcG9zdC1jcmVhdGUgU1NIIGVkaXRzIHRvIG5vZGUgZmlsZXMgYXJlIG5vdCBkZWNsYXJhdGl2ZSBhbmQgZG8gbm90IHN1cnZpdmUgbm9kZSByZXBsYWNlbWVudDsKLSBga3ViZWxldEV4dHJhQXJnc2AgaXMgYSBDTEkgZmxhZyBwYXRoLCB3aGlsZSB0aGVzZSBzZXR0aW5ncyBiZWxvbmcgaW4gc3RydWN0dXJlZCBrdWJlbGV0IGNvbmZpZ3VyYXRpb247Ci0gYXJiaXRyYXJ5IEpTT04vWUFNTCBpbiBNYWdudW0gbGFiZWxzIHdvdWxkIG1ha2UgbGFiZWxzIGFuIHVudHlwZWQgY29uZmlnIHRyYW5zcG9ydCBhbmQgd291bGQgYmUgZGlmZmljdWx0IHRvIHZhbGlkYXRlIHNhZmVseTsKLSBleHBvc2luZyBldmVyeSBrdWJlbGV0IG9yIGNsb3VkLWluaXQgZmllbGQgYXMgYW4gaW5kaXZpZHVhbCBNYWdudW0gbGFiZWwgd291bGQgY3JlYXRlIGEgbGFyZ2UgYW5kIHVuc3RhYmxlIHVzZXItZmFjaW5nIGxhYmVsIHN1cmZhY2UuCgojIyBTb2x1dGlvbgoKUFIgIzEwMTMgZXhwb3NlcyBub2RlIGJvb3RzdHJhcCBjdXN0b21pemF0aW9uIHRocm91Z2ggb3BlcmF0b3ItbWFuYWdlZCBjb25maWcgcHJvZmlsZXMuCgpBIHByb2ZpbGUgY2FuIGluY2x1ZGU6CgotIGBrdWJlbGV0Q29uZmlnYAotIGBmaWxlc2AKLSBgcHJlS3ViZWFkbUNvbW1hbmRzYAotIGBwb3N0S3ViZWFkbUNvbW1hbmRzYAoKTWFnbnVtIHJlbmRlcnMga3ViZWxldCBjb25maWcgYXMgYC9ldGMva3ViZXJuZXRlcy9wYXRjaGVzL2t1YmVsZXRjb25maWd1cmF0aW9uK21lcmdlLnlhbWxgLCBhZGRzIHRoZSBrdWJlYWRtIHBhdGNoIGRpcmVjdG9yeSwgYW5kIGFwcGVuZHMgcHJvZmlsZSBmaWxlcy9jb21tYW5kcyBpbnRvIENBUEkga3ViZWFkbSBib290c3RyYXAgZmllbGRzLiBNYWdudW0gb3ducyBgYXBpVmVyc2lvbmAsIGBraW5kYCwgYW5kIGBub2RlZ3JvdXBzYDsgcHJvZmlsZXMgbXVzdCBub3Qgc2V0IHRob3NlIGZpZWxkcy4gUHJvZmlsZXMgbXVzdCB1c2UgdGhlIHN0cnVjdHVyZWQgd3JhcHBlciBmaWVsZHMgYWJvdmUuIFVud3JhcHBlZCBrdWJlbGV0LW9ubHkgWUFNTCBzdWNoIGFzIGBtYXhQb2RzOiAyNTBgIGlzIHJlamVjdGVkLgoKYGBgeWFtbAphcGlWZXJzaW9uOiB2MQpraW5kOiBDb25maWdNYXAKbWV0YWRhdGE6CiAgbmFtZTogbWNhcGktY29uZmlnLXByb2ZpbGVzCiAgbmFtZXNwYWNlOiBtYWdudW0tc3lzdGVtCmRhdGE6CiAgcHJvZmlsZS1zdGFuZGFyZDogfAogICAga3ViZWxldENvbmZpZzoKICAgICAgbWF4UG9kczogMTEwCiAgICBmaWxlczoKICAgICAgLSBwYXRoOiAvZXRjL2F0bW9zcGhlcmUvcHJvZmlsZS1yb2xlCiAgICAgICAgY29udGVudDogc3RhbmRhcmQKICAgIHByZUt1YmVhZG1Db21tYW5kczoKICAgICAgLSBiYXNoIC9ldGMvYXRtb3NwaGVyZS9wcm9maWxlLXN0YW5kYXJkLnNoCiAgICBwb3N0S3ViZWFkbUNvbW1hbmRzOgogICAgICAtIGVjaG8gc3RhbmRhcmQtcG9zdCA+L3Zhci9sb2cvYXRtb3NwaGVyZS9jb25maWctcHJvZmlsZS1wb3N0CgogIHByb2ZpbGUtZ3B1OiB8CiAgICBrdWJlbGV0Q29uZmlnOgogICAgICBjcHVNYW5hZ2VyUG9saWN5OiBzdGF0aWMKICAgICAgY3B1TWFuYWdlclBvbGljeU9wdGlvbnM6CiAgICAgICAgZnVsbC1wY3B1cy1vbmx5OiAidHJ1ZSIKICAgICAgbWVtb3J5TWFuYWdlclBvbGljeTogU3RhdGljCiAgICAgIHRvcG9sb2d5TWFuYWdlclBvbGljeTogc2luZ2xlLW51bWEtbm9kZQogICAgICB0b3BvbG9neU1hbmFnZXJTY29wZTogcG9kCiAgICAgIHJlc2VydmVkU3lzdGVtQ1BVczogMC0xCiAgICAgIG1heFBvZHM6IDI1MAogICAgZmlsZXM6CiAgICAgIC0gcGF0aDogL2V0Yy9hdG1vc3BoZXJlL3Byb2ZpbGUtcm9sZQogICAgICAgIGNvbnRlbnQ6IGdwdQogICAgcHJlS3ViZWFkbUNvbW1hbmRzOgogICAgICAtIGJhc2ggL2V0Yy9hdG1vc3BoZXJlL3Byb2ZpbGUtZ3B1LnNoCiAgICBwb3N0S3ViZWFkbUNvbW1hbmRzOgogICAgICAtIGVjaG8gZ3B1LXBvc3QgPi92YXIvbG9nL2F0bW9zcGhlcmUvY29uZmlnLXByb2ZpbGUtcG9zdAoKICBwcm9maWxlLWJtLWdwdS1sYXlvdXQ6IHwKICAgIG5vZGVncm91cHM6CiAgICAgIGdwdS13b3JrZXJzOgogICAgICAgIHByb2ZpbGU6IHByb2ZpbGUtZ3B1CmBgYAoKVXNlcnMgc2VsZWN0IHByZWRlZmluZWQgcHJvZmlsZXMgd2l0aCB0d28gY2x1c3RlciB0ZW1wbGF0ZSBsYWJlbHM6Cgp8IExhYmVsIHwgRXhhbXBsZSB8IEVmZmVjdCB8CnwtLS18LS0tfC0tLXwKfCBgY29uZmlnX3Byb2ZpbGVgIHwgYHByb2ZpbGUtc3RhbmRhcmRgIHwgU2VsZWN0cyB0aGUgY2x1c3Rlci13aWRlIGRlZmF1bHQgcHJvZmlsZSByZW5kZXJlZCBhcyB0aGUgYGNvbmZpZ1Byb2ZpbGVgIENsdXN0ZXJDbGFzcyB0b3BvbG9neSB2YXJpYWJsZS4gfAp8IGBub2RlZ3JvdXBfY29uZmlnX3Byb2ZpbGVfc2V0YCB8IGBwcm9maWxlLWJtLWdwdS1sYXlvdXRgIHwgU2VsZWN0cyBhbiBvcGVyYXRvci1kZWZpbmVkIG5vZGVncm91cCBsYXlvdXQgdGhhdCByZW5kZXJzIE1hY2hpbmVEZXBsb3ltZW50LWxldmVsIGBjb25maWdQcm9maWxlYCBvdmVycmlkZXMuIHwKClRoZXJlIGFyZSBubyBwZXItZmllbGQga3ViZWxldCBsYWJlbHMsIG5vIGFyYml0cmFyeSB1c2VyIEpTT04gcGFzc3Rocm91Z2gsIGFuZCBubyBjb21wYXRpYmlsaXR5IGFsaWFzZXMgZm9yIG5hbWVzIHRoYXQgb25seSBleGlzdGVkIGluIHRoZSB1bm1lcmdlZCBQUiBoaXN0b3J5LiBNaXNzaW5nIHByb2ZpbGVzLCBpbnZhbGlkIFlBTUwsIHJlc2VydmVkIGZpZWxkcywgaW52YWxpZCBmaWxlIGVudHJpZXMsIHVua25vd24gbm9kZWdyb3VwIHByb2ZpbGUgcmVmZXJlbmNlcywgYW5kIGNsdXN0ZXItY3JlYXRlIHNlbGVjdG9yIG92ZXJyaWRlcyBmYWlsIHZhbGlkYXRpb24gYmVmb3JlIENBUEkgcmVuZGVyaW5nLgoKVGhpcyBjb3ZlcnMgdGhlIFBSICMxMDE1IHVzZSBjYXNlIHRocm91Z2ggcHJvZmlsZXMuIEEgc2luZ2xlIG9wZXJhdG9yLW1hbmFnZWQgcHJvZmlsZSBjYW4gd3JpdGUgZmlsZXMgYW5kIHJ1biBwcmUvcG9zdCBrdWJlYWRtIGNvbW1hbmRzIGZvciBldmVyeSBub2RlIGluIHRoZSBjbHVzdGVyLCBhbmQgYSBub2RlZ3JvdXAgbGF5b3V0IGNhbiBhcHBseSBhIGRpZmZlcmVudCBwcm9maWxlIG9ubHkgdG8gR1BVIHdvcmtlcnMgd2hpbGUgY29udHJvbGxlcnMgYW5kIG90aGVyIHdvcmtlcnMga2VlcCB0aGUgc3RhbmRhcmQgcHJvZmlsZS4gVGhpcyBhdm9pZHMgZXhwb3NpbmcgYGV4dHJhX2ZpbGVzYCBvciBjb21tYW5kIGxhYmVscyBkaXJlY3RseSB0byB1c2Vycy4KCiMjIFNjb3BlIFNwbGl0CgpUaGlzIFBSIHdhcyByZXdyaXR0ZW4gdG8ga2VlcCBvbmx5IHRoZSBjb25maWctcHJvZmlsZSB3b3JrLiBUaGUgdW5yZWxhdGVkIGNvbXBhdGliaWxpdHkgYW5kIGNsZWFudXAgY29tbWl0cyB0aGF0IHVzZWQgdG8gYmUgc3RhY2tlZCBoZXJlIHdlcmUgbW92ZWQgaW50byBkcmFmdCBQUiAjMTA1MTogaHR0cHM6Ly9naXRodWIuY29tL3ZleHhob3N0L21hZ251bS1jbHVzdGVyLWFwaS9wdWxsLzEwNTEKClBSICMxMDUxIGludGVudGlvbmFsbHkga2VlcHMgdGhvc2UgZXh0cmFjdGVkIGZpeGVzIGFzIHNlcGFyYXRlIGNvbW1pdHMgc28gdGhleSBjYW4gYmUgcmV2aWV3ZWQsIHNwbGl0LCBvciBkaXNjYXJkZWQgaW5kZXBlbmRlbnRseSBsYXRlci4KCiMjIERvY3VtZW50YXRpb24KCi0gYGRvY3MvdXNlci9sYWJlbHMubWRgIGRvY3VtZW50cyB0aGUgc2VsZWN0b3IgbGFiZWxzLCB0aGVpciBjbHVzdGVyLXRlbXBsYXRlIHNvdXJjZSBvZiB0cnV0aCwgYW5kIHRoZSBzdXBwb3J0ZWQgcHJvZmlsZSBmaWVsZHMuCi0gYGRvY3MvdXNlci91c2UtY2FzZXMubWRgIHNob3dzIG9wZXJhdG9yLWRlZmluZWQgcHJvZmlsZXMgYW5kIHVzZXIgc2VsZWN0aW9uIHRocm91Z2ggY2x1c3RlciB0ZW1wbGF0ZXMuCi0gYGRvY3MvZGV2ZWxvcGVyL2NsdXN0ZXItdG9wb2xvZ3kubWRgIGRvY3VtZW50cyBob3cgcHJvZmlsZXMgbWFwIHRvIHRvcG9sb2d5IHZhcmlhYmxlcyBhbmQgTWFjaGluZURlcGxveW1lbnQgb3ZlcnJpZGVzLgotIFRoZSBpbnRlcm5hbCB2YWxpZGF0aW9uIG5vdGUgdW5kZXIgYG5vdGVzL2xvZ3MvbWNhcGlgIGRvY3VtZW50cyB0aGUgZGV0YWlsZWQgT1ZTL09WTiBBSU8gcnVuYm9vayBhbmQgcmVjb3ZlcnkgZGV0YWlscy4KCiMjIFZhbGlkYXRpb24KCkxvY2FsIHZhbGlkYXRpb24gYWZ0ZXIgdGhlIHNwbGl0OgoKYGBgYmFzaAp1dnggLS1weXRob24gMy4xMiBwcmUtY29tbWl0IHJ1biAtLWFsbC1maWxlcwojIHBhc3NlZAoKY2FyZ28gdGVzdCBrdWJlbGV0X2NvbmZpZyAtLXF1aWV0CiMgMiBwYXNzZWQKCmNhcmdvIHRlc3QgY29udGFpbmVyZF9jb25maWcgLS1xdWlldAojIDIgcGFzc2VkCgp1diBydW4gLS1weXRob24gMy4xMCBweXRlc3QgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF91dGlscy5weSAtcSAtayAnQ29uZmlnUHJvZmlsZSBvciBjb25maWdfcHJvZmlsZSBvciBrdWJlbGV0X2NvbmZpZycKIyAzMCBwYXNzZWQsIDE2IGRlc2VsZWN0ZWQsIDcgd2FybmluZ3MKCiMgdHJhaWxlciBhdWRpdCBhY3Jvc3MgUFIgIzEwMTMgc3RhY2sKIyAxMCBjb21taXRzLCAwIGZhaWx1cmVzCmBgYAoKUmVhbC1jYXNlIEFJTyB2YWxpZGF0aW9uIG9uIHRoZSBjb25maWctcHJvZmlsZSBjb2RlIHBhdGggYmVmb3JlIHRoZSBzcGxpdDoKCi0gUm9sbGVkIE1hZ251bSBBUEkvY29uZHVjdG9yL3Byb3h5IGltYWdlcyBidWlsdCBmcm9tIHRoZSBjb25maWctcHJvZmlsZSBicmFuY2ggaW50byBvbmUgT1ZTIEFJTyBhbmQgb25lIE9WTiBBSU8uCi0gVmVyaWZpZWQgY2x1c3Rlci1jcmVhdGUgc2VsZWN0b3Igb3ZlcnJpZGUgcmVqZWN0aW9uIG9uIGJvdGggYmFja2VuZHM6IHRyeWluZyB0byBwYXNzIGBjb25maWdfcHJvZmlsZT1wcm9maWxlLWdwdWAgYXQgY2x1c3RlciBjcmVhdGUgdGltZSBhZ2FpbnN0IGEgdGVtcGxhdGUgc2VsZWN0aW5nIGFub3RoZXIgdmFsdWUgZmFpbGVkIGJlZm9yZSBDQVBJIHJlbmRlcmluZy4KLSBWZXJpZmllZCBmcmVzaCBjbHVzdGVyIGNyZWF0ZSB3aXRoIHNlbGVjdG9yIGxhYmVscyBvbmx5IG9uIHRoZSBjbHVzdGVyIHRlbXBsYXRlIHBhc3NlZCBQUiAjMTAxMyB2YWxpZGF0aW9uL3JlbmRlcmluZyBvbiBib3RoIGJhY2tlbmRzOyB0aGUgdmFsaWRhdGlvbiBlbnZpcm9ubWVudHMgdGhlbiBzdG9wcGVkIG9uIGV4aGF1c3RlZCBPcGVuU3RhY2sgc2VydmVyLWdyb3VwIHF1b3RhIGJlZm9yZSBub2RlIGNyZWF0aW9uLgotIFZlcmlmaWVkIGFuIHVwZ3JhZGUvdXBkYXRlIHBhdGggb24gYm90aCBiYWNrZW5kcyB0aHJvdWdoIE1hZ251bSBjbHVzdGVyIHVwZ3JhZGUgdG8gYSB0ZW1wbGF0ZSBzZWxlY3RpbmcgYHByb2ZpbGUtc2FmZWAuIEJvdGggY2x1c3RlcnMgcmVhY2hlZCBgVVBEQVRFX0NPTVBMRVRFYDsgQ0FQSSByZXBvcnRlZCBgVG9wb2xvZ3lSZWNvbmNpbGVkPVRydWVgIGFuZCBgUm9sbGluZ091dD1GYWxzZWA7IHdvcmtsb2FkIGNvbnRyb2wtcGxhbmUgYW5kIHdvcmtlciBub2RlcyB3ZXJlIFJlYWR5LgotIFZlcmlmaWVkIHJlbmRlcmVkIHRvcG9sb2d5IGNvbnRlbnQgZm9yIHRoZSBjb252ZXJnZWQgcHJvZmlsZSwgaW5jbHVkaW5nIGBtYXhQb2RzOiAxMTFgLCBwcm9maWxlLW1hbmFnZWQgZmlsZXMsIHByb2ZpbGUgYHByZUt1YmVhZG1Db21tYW5kc2AsIGFuZCBwcm9maWxlIGBwb3N0S3ViZWFkbUNvbW1hbmRzYCB3aGlsZSBwcmVzZXJ2aW5nIGV4aXN0aW5nIGJvb3RzdHJhcCBjb21tYW5kcy4KLSBWZXJpZmllZCB0aGUgYWdncmVzc2l2ZSBgcHJvZmlsZS1ncHVgIGNvbnRlbnQgcmVuZGVycyB0aGUgZXhwZWN0ZWQga3ViZWxldCBwYXRjaCwgZmlsZXMsIGFuZCBwcmUvcG9zdCBjb21tYW5kcy4gSXQgaXMgbm90IGEgdmFsaWQgcnVudGltZSBwcm9maWxlIGZvciB0aGUgbm9uLUdQVSBWTSBBSU8gd29ya2Vycywgc28gY29udmVyZ2VuY2UgdGVzdGluZyB1c2VkIGBwcm9maWxlLXNhZmVgOyBmaW5hbCBHUFUgcnVudGltZSBzZXR0aW5ncyBzdGlsbCBuZWVkIHZhbGlkYXRpb24gb24gcmVhbCBHUFUgb3IgYmFyZS1tZXRhbCBub2Rlcy4KLSBUaGUgbGl2ZSB1cGdyYWRlIHRlc3QgZm91bmQgYW5kIGZpeGVkIGEgd29ya2VyIGJvb3RzdHJhcCBlZGdlIGNhc2U6IENsdXN0ZXIgQVBJIGNhbiBwcnVuZSBlbXB0eSB3b3JrZXIgY29tbWFuZCBhcnJheXMsIHNvIHRoZSBmaXJzdCB3b3JrZXIgcHJvZmlsZSBjb21tYW5kIG11c3QgY3JlYXRlIHRoZSBsaXN0IGJlZm9yZSBsYXRlciBjb21tYW5kcyBhcHBlbmQgdG8gaXQuIFRoYXQgZml4IHJlbWFpbnMgaW5jbHVkZWQgaW4gdGhpcyBQUiBhcyBgZml4OiBzZWVkIHdvcmtlciBjb25maWcgcHJvZmlsZSBjb21tYW5kIGFycmF5c2AuCgpQUiAjMTAxNSBpcyBhbHJlYWR5IGNsb3NlZCBhbmQgc3VwZXJzZWRlZCBieSB0aGlzIGNvbmZpZy1wcm9maWxlIG1vZGVsLgoKU2lnbmVkLW9mZi1ieTogUmljbyBMaW4gPHJpY29AdmV4eGhvc3QuY29tPg==
      override_checkout: master
      patchset: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
      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: 84f2fc3ee76cddcb6edcdb6522be7099dce97c53
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: 348c7ff425450b0356e1d84589143dce260be74a
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: d69725d9d48c11491f06185d708bb2a1ebacd544
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: aebda82f8822e38db5bbd25ab31ea110792e8c2b
          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: 84f2fc3ee76cddcb6edcdb6522be7099dce97c53
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: 348c7ff425450b0356e1d84589143dce260be74a
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
        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: fc5b83c08fbaee38ac448b90eb034002b4fc4ff1
          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: f42eb4e1e31e3dde641acbac015f8a08acbeeff7
          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: 27e3961bf1fab83f83e953964ebd5658e7d1236f
          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: 2ef4fadbca5ed10390926e56bba309cf34b4d4a0
          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: d69725d9d48c11491f06185d708bb2a1ebacd544
          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: eac2fa47f26da3515c7a1e8c91226750517c52d4
          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: 6687822520afa1386e41fe7357ce2f0c4076603c
          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: 4a392b68344dd3e3010ea3c0c74681d81589872c
          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: e0504685dd6d5aa399f528518267fc48ad8d93c1
          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: 380f657b5102707a3da676478e72fd96691e966b
          name: openstack/nova
          required: true
          short_name: nova
          src_dir: src/opendev.org/openstack/nova
        opendev.org/openstack/octavia:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/octavia
          checkout: master
          checkout_description: job override ref
          commit: 9ff4683c8212e4c043af69f1b5ebadc21651dc58
          name: openstack/octavia
          required: true
          short_name: octavia
          src_dir: src/opendev.org/openstack/octavia
        opendev.org/openstack/os-test-images:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/os-test-images
          checkout: master
          checkout_description: job override ref
          commit: 5d0367e03788764f41da8effffa14e3eac513201
          name: openstack/os-test-images
          required: true
          short_name: os-test-images
          src_dir: src/opendev.org/openstack/os-test-images
        opendev.org/openstack/ovn-octavia-provider:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/ovn-octavia-provider
          checkout: master
          checkout_description: job override ref
          commit: d0a7783cd02566847600d5db1c330e6865594331
          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: d2727844011a8f144c818556ed7e8d43f756576f
          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: b80aea157f95e9fa6ed14a2d44f9d0cf6ff9332d
          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: 8e9e0fd11bb217df4805941213bfde90be420370
          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: 887ec0bcf71af0b1e27f65ee032fac9b4b489b9d
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/1013/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
