all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.248
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      configure_swap_size: 8192
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
          /etc/magnum/magnum.conf:
            cluster_template:
              kubernetes_allowed_network_drivers: calico,cilium
              kubernetes_default_network_driver: calico
            nova_client:
              api_version: 2.15
          /etc/manila/manila.conf:
            generic:
              connect_share_server_to_tenant_network: true
              driver_handles_share_servers: true
      devstack_localrc:
        ADMIN_PASSWORD: secretadmin
        DATABASE_PASSWORD: secretdatabase
        DEBUG_LIBVIRT_COREDUMPS: true
        DISABLE_AMP_IMAGE_BUILD: true
        ENABLE_SYSCTL_MEM_TUNING: true
        ENABLE_SYSCTL_NET_TUNING: true
        ENABLE_ZSWAP: true
        ERROR_ON_CLONE: true
        FIXED_RANGE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        GIT_BASE: https://github.com
        HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
        MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
        MANILA_ENABLED_BACKENDS: generic
        MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
        NETWORK_GATEWAY: 10.1.0.1
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        NOVA_VNC_ENABLED: true
        OCTAVIA_NODE: api
        OVN_DBS_LOG_LEVEL: dbg
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        RABBIT_PASSWORD: secretrabbit
        SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4'']
          }}'
        SERVICE_PASSWORD: secretservice
        SWIFT_HASH: 1234123412341234
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
      devstack_plugins:
        barbican: https://github.com/openstack/barbican
        magnum: https://review.opendev.org/openstack/magnum
        magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
        manila: https://github.com/openstack/manila
        octavia: https://github.com/openstack/octavia
        ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
      devstack_services:
        base: false
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        dstat: false
        etcd3: true
        file_tracker: true
        g-api: true
        horizon: false
        key: true
        memory_tracker: true
        mysql: true
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        o-api: true
        o-da: true
        o-hk: true
        octavia: true
        openstack-cli-server: true
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        placement-api: true
        q-ovn-agent: true
        q-svc: true
        rabbit: true
        s-account: false
        s-container: false
        s-object: false
        s-proxy: false
        tempest: false
        tls-proxy: true
      extensions_to_txt:
        auto: true
        conf: true
        localrc: true
        log: true
        stackenv: true
      image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
        kube_tag }}.qcow2
      kube_tag: v1.33.11
      network_driver: calico
      nodepool:
        az: nova
        cloud: public
        external_id: 7895be90-b75c-4fd1-8262-a4be544f51f0
        host_id: fe6a549c934f5f67345b1bd07db2b4711c0ee4717d98054273574436
        interface_ip: 199.204.45.248
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.248
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.248
        public_ipv6: 2604:e100:1:0:f816:3eff:fe95:e5cd
        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: 7895be90-b75c-4fd1-8262-a4be544f51f0
        host_id: fe6a549c934f5f67345b1bd07db2b4711c0ee4717d98054273574436
        interface_ip: 199.204.45.248
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.248
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.248
        public_ipv6: 2604:e100:1:0:f816:3eff:fe95:e5cd
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    configure_swap_size: 8192
    devstack_local_conf:
      post-config:
        $NEUTRON_CONF:
          DEFAULT:
            global_physnet_mtu: '{{ external_bridge_mtu }}'
        /etc/magnum/magnum.conf:
          cluster_template:
            kubernetes_allowed_network_drivers: calico,cilium
            kubernetes_default_network_driver: calico
          nova_client:
            api_version: 2.15
        /etc/manila/manila.conf:
          generic:
            connect_share_server_to_tenant_network: true
            driver_handles_share_servers: true
    devstack_localrc:
      ADMIN_PASSWORD: secretadmin
      DATABASE_PASSWORD: secretdatabase
      DEBUG_LIBVIRT_COREDUMPS: true
      DISABLE_AMP_IMAGE_BUILD: true
      ENABLE_SYSCTL_MEM_TUNING: true
      ENABLE_SYSCTL_NET_TUNING: true
      ENABLE_ZSWAP: true
      ERROR_ON_CLONE: true
      FIXED_RANGE: 10.1.0.0/20
      FLOATING_RANGE: 172.24.5.0/24
      GIT_BASE: https://github.com
      HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
      LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
      LOGFILE: /opt/stack/logs/devstacklog.txt
      LOG_COLOR: false
      MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
      MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
      MANILA_ENABLED_BACKENDS: generic
      MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
      NETWORK_GATEWAY: 10.1.0.1
      NOVA_LIBVIRT_TB_CACHE_SIZE: 128
      NOVA_VNC_ENABLED: true
      OCTAVIA_NODE: api
      OVN_DBS_LOG_LEVEL: dbg
      PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
      PUBLIC_NETWORK_GATEWAY: 172.24.5.1
      RABBIT_PASSWORD: secretrabbit
      SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      SERVICE_PASSWORD: secretservice
      SWIFT_HASH: 1234123412341234
      SWIFT_REPLICAS: 1
      SWIFT_START_ALL_SERVICES: false
      VERBOSE: true
      VERBOSE_NO_TIMESTAMP: true
    devstack_plugins:
      barbican: https://github.com/openstack/barbican
      magnum: https://review.opendev.org/openstack/magnum
      magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
      manila: https://github.com/openstack/manila
      octavia: https://github.com/openstack/octavia
      ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
    devstack_services:
      base: false
      c-api: true
      c-bak: true
      c-sch: true
      c-vol: true
      dstat: false
      etcd3: true
      file_tracker: true
      g-api: true
      horizon: false
      key: true
      memory_tracker: true
      mysql: true
      n-api: true
      n-api-meta: true
      n-cond: true
      n-cpu: true
      n-novnc: true
      n-sch: true
      o-api: true
      o-da: true
      o-hk: true
      octavia: true
      openstack-cli-server: true
      ovn-controller: true
      ovn-northd: true
      ovs-vswitchd: true
      ovsdb-server: true
      placement-api: true
      q-ovn-agent: true
      q-svc: true
      rabbit: true
      s-account: false
      s-container: false
      s-object: false
      s-proxy: false
      tempest: false
      tls-proxy: true
    extensions_to_txt:
      auto: true
      conf: true
      localrc: true
      log: true
      stackenv: true
    image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
      kube_tag }}.qcow2
    kube_tag: v1.33.11
    network_driver: calico
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job openstack-multinode-fips explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#17>'
      - '<Job devstack-base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#368>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#502>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#545>'
      - '<Job magnum-cluster-api-devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-hydrophone explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#60>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#72>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11-calico explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#78>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11-calico explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: bfab11006bc7419ea1d087ade8f4147d
      build_refs:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\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## 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\nTo
          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## 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 renders files/commands into CAPI kubeadm
          bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`; profiles
          must not set those fields.\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. The user-facing surface is named profile selection, and the operator
          controls the profile contents. Missing profiles, invalid YAML, reserved
          fields, invalid file entries, and unknown nodegroup profile references fail
          validation before CAPI rendering.\n\n## Documentation\n\n- `docs/user/labels.md`
          documents the selector labels and profile fields.\n- `docs/user/use-cases.md`
          shows operator-defined profiles and user selection.\n- `docs/developer/cluster-topology.md`
          documents how profiles map to topology variables and MachineDeployment overrides.\n\n##
          Validation\n\nLocal validation:\n\n```bash\nuv run --python 3.10 pytest
          magnum_cluster_api/tests/unit/test_resources.py magnum_cluster_api/tests/unit/test_utils.py
          magnum_cluster_api/tests/unit/test_integrations_common.py magnum_cluster_api/tests/unit/test_integrations_cinder.py
          -q\nKUBECONFIG=<temporary test kubeconfig> uv run --python 3.10 pytest magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
          -q\ncargo test kubelet_config --quiet\ncargo test containerd_config --quiet\ngit
          diff --check\n```\n\nReal-case AIO validation:\n\n- Deployed temporary Magnum
          conductor images from this PR branch on one OVS AIO and one OVN AIO.\n-
          Created `ConfigMap/mcapi-config-profiles` in the management cluster with:\n
          \ - `profile-standard` for baseline workers and control-plane nodes;\n  -
          `profile-gpu` for GPU workers;\n  - `profile-bm-gpu-layout` mapping `gpu-workers`
          to `profile-gpu`.\n- Created cluster templates with `config_profile=profile-standard`
          and `nodegroup_config_profile_set=profile-bm-gpu-layout`, then created clusters
          from those templates through the Magnum/OpenStack API.\n- Verified the Magnum
          cluster creation path produced CAPI topology successfully on both network
          backends.\n- Verified the cluster-wide profile rendered into the control
          plane and default worker bootstrap data:\n  - kubelet patch file at `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
          with `maxPods: 110`;\n  - kubeadm patch directory wiring for init and join;\n
          \ - profile-managed files under `/etc/atmosphere`;\n  - profile `preKubeadmCommands`
          and `postKubeadmCommands` without dropping existing bootstrap commands.\n-
          Created a `gpu-workers` nodegroup through the Magnum/OpenStack API on both
          AIOs.\n- Verified each `gpu-workers` MachineDeployment received a MachineDeployment-level
          `configProfile` override instead of the cluster default.\n- Verified the
          GPU worker bootstrap rendered GPU-specific content:\n  - kubelet patch with
          `cpuManagerPolicy: static`, `topologyManagerPolicy: single-numa-node`, `reservedSystemCPUs:
          0-1`, and `maxPods: 250`;\n  - GPU-specific profile files;\n  - GPU-specific
          pre/post kubeadm commands.\n- Verified both AIOs accepted nodegroup creation
          and CAPI provisioned the GPU worker machines; final nodegroup readiness
          was still converging during the validation window.\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\nSigned-off-by: Rico
          Lin <rico@vexxhost.com>\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
        patchset: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
        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: d5a9e17d1ee044deb0c2ea35df1e6354
      buildset_refs:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\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## 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\nTo
          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## 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 renders files/commands into CAPI kubeadm
          bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`; profiles
          must not set those fields.\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. The user-facing surface is named profile selection, and the operator
          controls the profile contents. Missing profiles, invalid YAML, reserved
          fields, invalid file entries, and unknown nodegroup profile references fail
          validation before CAPI rendering.\n\n## Documentation\n\n- `docs/user/labels.md`
          documents the selector labels and profile fields.\n- `docs/user/use-cases.md`
          shows operator-defined profiles and user selection.\n- `docs/developer/cluster-topology.md`
          documents how profiles map to topology variables and MachineDeployment overrides.\n\n##
          Validation\n\nLocal validation:\n\n```bash\nuv run --python 3.10 pytest
          magnum_cluster_api/tests/unit/test_resources.py magnum_cluster_api/tests/unit/test_utils.py
          magnum_cluster_api/tests/unit/test_integrations_common.py magnum_cluster_api/tests/unit/test_integrations_cinder.py
          -q\nKUBECONFIG=<temporary test kubeconfig> uv run --python 3.10 pytest magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
          -q\ncargo test kubelet_config --quiet\ncargo test containerd_config --quiet\ngit
          diff --check\n```\n\nReal-case AIO validation:\n\n- Deployed temporary Magnum
          conductor images from this PR branch on one OVS AIO and one OVN AIO.\n-
          Created `ConfigMap/mcapi-config-profiles` in the management cluster with:\n
          \ - `profile-standard` for baseline workers and control-plane nodes;\n  -
          `profile-gpu` for GPU workers;\n  - `profile-bm-gpu-layout` mapping `gpu-workers`
          to `profile-gpu`.\n- Created cluster templates with `config_profile=profile-standard`
          and `nodegroup_config_profile_set=profile-bm-gpu-layout`, then created clusters
          from those templates through the Magnum/OpenStack API.\n- Verified the Magnum
          cluster creation path produced CAPI topology successfully on both network
          backends.\n- Verified the cluster-wide profile rendered into the control
          plane and default worker bootstrap data:\n  - kubelet patch file at `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
          with `maxPods: 110`;\n  - kubeadm patch directory wiring for init and join;\n
          \ - profile-managed files under `/etc/atmosphere`;\n  - profile `preKubeadmCommands`
          and `postKubeadmCommands` without dropping existing bootstrap commands.\n-
          Created a `gpu-workers` nodegroup through the Magnum/OpenStack API on both
          AIOs.\n- Verified each `gpu-workers` MachineDeployment received a MachineDeployment-level
          `configProfile` override instead of the cluster default.\n- Verified the
          GPU worker bootstrap rendered GPU-specific content:\n  - kubelet patch with
          `cpuManagerPolicy: static`, `topologyManagerPolicy: single-numa-node`, `reservedSystemCPUs:
          0-1`, and `maxPods: 250`;\n  - GPU-specific profile files;\n  - GPU-specific
          pre/post kubeadm commands.\n- Verified both AIOs accepted nodegroup creation
          and CAPI provisioned the GPU worker machines; final nodegroup readiness
          was still converging during the validation window.\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\nSigned-off-by: Rico
          Lin <rico@vexxhost.com>\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
        patchset: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
        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## 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## 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\nTo 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## 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 renders files/commands into CAPI kubeadm
        bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`; profiles
        must not set those fields.\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. The user-facing
        surface is named profile selection, and the operator controls the profile
        contents. Missing profiles, invalid YAML, reserved fields, invalid file entries,
        and unknown nodegroup profile references fail validation before CAPI rendering.\n\n##
        Documentation\n\n- `docs/user/labels.md` documents the selector labels and
        profile fields.\n- `docs/user/use-cases.md` shows operator-defined profiles
        and user selection.\n- `docs/developer/cluster-topology.md` documents how
        profiles map to topology variables and MachineDeployment overrides.\n\n##
        Validation\n\nLocal validation:\n\n```bash\nuv run --python 3.10 pytest magnum_cluster_api/tests/unit/test_resources.py
        magnum_cluster_api/tests/unit/test_utils.py magnum_cluster_api/tests/unit/test_integrations_common.py
        magnum_cluster_api/tests/unit/test_integrations_cinder.py -q\nKUBECONFIG=<temporary
        test kubeconfig> uv run --python 3.10 pytest magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
        -q\ncargo test kubelet_config --quiet\ncargo test containerd_config --quiet\ngit
        diff --check\n```\n\nReal-case AIO validation:\n\n- Deployed temporary Magnum
        conductor images from this PR branch on one OVS AIO and one OVN AIO.\n- Created
        `ConfigMap/mcapi-config-profiles` in the management cluster with:\n  - `profile-standard`
        for baseline workers and control-plane nodes;\n  - `profile-gpu` for GPU workers;\n
        \ - `profile-bm-gpu-layout` mapping `gpu-workers` to `profile-gpu`.\n- Created
        cluster templates with `config_profile=profile-standard` and `nodegroup_config_profile_set=profile-bm-gpu-layout`,
        then created clusters from those templates through the Magnum/OpenStack API.\n-
        Verified the Magnum cluster creation path produced CAPI topology successfully
        on both network backends.\n- Verified the cluster-wide profile rendered into
        the control plane and default worker bootstrap data:\n  - kubelet patch file
        at `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml` with `maxPods:
        110`;\n  - kubeadm patch directory wiring for init and join;\n  - profile-managed
        files under `/etc/atmosphere`;\n  - profile `preKubeadmCommands` and `postKubeadmCommands`
        without dropping existing bootstrap commands.\n- Created a `gpu-workers` nodegroup
        through the Magnum/OpenStack API on both AIOs.\n- Verified each `gpu-workers`
        MachineDeployment received a MachineDeployment-level `configProfile` override
        instead of the cluster default.\n- Verified the GPU worker bootstrap rendered
        GPU-specific content:\n  - kubelet patch with `cpuManagerPolicy: static`,
        `topologyManagerPolicy: single-numa-node`, `reservedSystemCPUs: 0-1`, and
        `maxPods: 250`;\n  - GPU-specific profile files;\n  - GPU-specific pre/post
        kubeadm commands.\n- Verified both AIOs accepted nodegroup creation and CAPI
        provisioned the GPU worker machines; final nodegroup readiness was still converging
        during the validation window.\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\nSigned-off-by: Rico Lin <rico@vexxhost.com>\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
      child_jobs: []
      commit_id: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
      event_id: 85828ee0-5914-11f1-8f54-8b6149dce565
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/bfab11006bc7419ea1d087ade8f4147d/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/bfab11006bc7419ea1d087ade8f4147d/work/logs
        result_data_file: /var/lib/zuul/builds/bfab11006bc7419ea1d087ade8f4147d/work/results.json
        src_root: /var/lib/zuul/builds/bfab11006bc7419ea1d087ade8f4147d/work/src
        work_root: /var/lib/zuul/builds/bfab11006bc7419ea1d087ade8f4147d/work
      include_vars: []
      items:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\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## 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\nTo
          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## 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 renders files/commands into CAPI kubeadm
          bootstrap fields. Magnum owns `apiVersion`, `kind`, and `nodegroups`; profiles
          must not set those fields.\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. The user-facing surface is named profile selection, and the operator
          controls the profile contents. Missing profiles, invalid YAML, reserved
          fields, invalid file entries, and unknown nodegroup profile references fail
          validation before CAPI rendering.\n\n## Documentation\n\n- `docs/user/labels.md`
          documents the selector labels and profile fields.\n- `docs/user/use-cases.md`
          shows operator-defined profiles and user selection.\n- `docs/developer/cluster-topology.md`
          documents how profiles map to topology variables and MachineDeployment overrides.\n\n##
          Validation\n\nLocal validation:\n\n```bash\nuv run --python 3.10 pytest
          magnum_cluster_api/tests/unit/test_resources.py magnum_cluster_api/tests/unit/test_utils.py
          magnum_cluster_api/tests/unit/test_integrations_common.py magnum_cluster_api/tests/unit/test_integrations_cinder.py
          -q\nKUBECONFIG=<temporary test kubeconfig> uv run --python 3.10 pytest magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
          -q\ncargo test kubelet_config --quiet\ncargo test containerd_config --quiet\ngit
          diff --check\n```\n\nReal-case AIO validation:\n\n- Deployed temporary Magnum
          conductor images from this PR branch on one OVS AIO and one OVN AIO.\n-
          Created `ConfigMap/mcapi-config-profiles` in the management cluster with:\n
          \ - `profile-standard` for baseline workers and control-plane nodes;\n  -
          `profile-gpu` for GPU workers;\n  - `profile-bm-gpu-layout` mapping `gpu-workers`
          to `profile-gpu`.\n- Created cluster templates with `config_profile=profile-standard`
          and `nodegroup_config_profile_set=profile-bm-gpu-layout`, then created clusters
          from those templates through the Magnum/OpenStack API.\n- Verified the Magnum
          cluster creation path produced CAPI topology successfully on both network
          backends.\n- Verified the cluster-wide profile rendered into the control
          plane and default worker bootstrap data:\n  - kubelet patch file at `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
          with `maxPods: 110`;\n  - kubeadm patch directory wiring for init and join;\n
          \ - profile-managed files under `/etc/atmosphere`;\n  - profile `preKubeadmCommands`
          and `postKubeadmCommands` without dropping existing bootstrap commands.\n-
          Created a `gpu-workers` nodegroup through the Magnum/OpenStack API on both
          AIOs.\n- Verified each `gpu-workers` MachineDeployment received a MachineDeployment-level
          `configProfile` override instead of the cluster default.\n- Verified the
          GPU worker bootstrap rendered GPU-specific content:\n  - kubelet patch with
          `cpuManagerPolicy: static`, `topologyManagerPolicy: single-numa-node`, `reservedSystemCPUs:
          0-1`, and `maxPods: 250`;\n  - GPU-specific profile files;\n  - GPU-specific
          pre/post kubeadm commands.\n- Verified both AIOs accepted nodegroup creation
          and CAPI provisioned the GPU worker machines; final nodegroup readiness
          was still converging during the validation window.\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\nSigned-off-by: Rico
          Lin <rico@vexxhost.com>\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
        patchset: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      job: magnum-cluster-api-hydrophone-v1.33.11-calico
      jobtags: []
      max_attempts: 3
      message: U3VwcG9ydCBjb25maWcgcHJvZmlsZXMKCiMjIFByb2JsZW0KCkJhcmVtZXRhbCBhbmQgR1BVLW9yaWVudGVkIEt1YmVybmV0ZXMgY2x1c3RlcnMgbmVlZCBkZWNsYXJhdGl2ZSBub2RlIGJvb3RzdHJhcCBhbmQga3ViZWxldCB0dW5pbmcgdGhhdCBzdXJ2aXZlcyBub2RlIHJlcGxhY2VtZW50LCBzY2FsZS11cCwgYW5kIHJvbGxpbmcgdXBncmFkZXMuIFRoZSBvbGRlciBvcHRpb25zIGFyZSBub3QgZ29vZCBwcm9kdWN0aW9uIGludGVyZmFjZXM6CgotIHBvc3QtY3JlYXRlIFNTSCBlZGl0cyB0byBub2RlIGZpbGVzIGFyZSBub3QgZGVjbGFyYXRpdmUgYW5kIGRvIG5vdCBzdXJ2aXZlIG5vZGUgcmVwbGFjZW1lbnQ7Ci0gYGt1YmVsZXRFeHRyYUFyZ3NgIGlzIGEgQ0xJIGZsYWcgcGF0aCwgd2hpbGUgdGhlc2Ugc2V0dGluZ3MgYmVsb25nIGluIHN0cnVjdHVyZWQga3ViZWxldCBjb25maWd1cmF0aW9uOwotIGFyYml0cmFyeSBKU09OL1lBTUwgaW4gTWFnbnVtIGxhYmVscyB3b3VsZCBtYWtlIGxhYmVscyBhbiB1bnR5cGVkIGNvbmZpZyB0cmFuc3BvcnQgYW5kIHdvdWxkIGJlIGRpZmZpY3VsdCB0byB2YWxpZGF0ZSBzYWZlbHk7Ci0gZXhwb3NpbmcgZXZlcnkga3ViZWxldCBvciBjbG91ZC1pbml0IGZpZWxkIGFzIGFuIGluZGl2aWR1YWwgTWFnbnVtIGxhYmVsIHdvdWxkIGNyZWF0ZSBhIGxhcmdlIGFuZCB1bnN0YWJsZSB1c2VyLWZhY2luZyBsYWJlbCBzdXJmYWNlLgoKIyMgVXNhZ2UKCk9wZXJhdG9ycyBkZWZpbmUgcmV1c2FibGUgcHJvZmlsZXMgaW4gdGhlIG1hbmFnZW1lbnQgS3ViZXJuZXRlcyBjbHVzdGVyIHVzaW5nIGBDb25maWdNYXAvbWNhcGktY29uZmlnLXByb2ZpbGVzYCwgbm9ybWFsbHkgaW4gdGhlIGBtYWdudW0tc3lzdGVtYCBuYW1lc3BhY2UuIFVzZXJzIHNlbGVjdCB0aG9zZSBwcm9maWxlcyB0aHJvdWdoIGNsdXN0ZXIgdGVtcGxhdGUgbGFiZWxzLgoKQ2x1c3Rlci13aWRlIHByb2ZpbGU6CgpgYGBiYXNoCm9wZW5zdGFjayBjb2UgY2x1c3RlciB0ZW1wbGF0ZSBjcmVhdGUgazhzLWJtLWdwdSBcCiAgLi4uc2FtZSBiYXNlIHRlbXBsYXRlIG9wdGlvbnMuLi4gXAogIC0tbGFiZWxzIGNvbmZpZ19wcm9maWxlPXByb2ZpbGUtZ3B1CgpvcGVuc3RhY2sgY29lIGNsdXN0ZXIgY3JlYXRlIGJtLWdwdSBcCiAgLS1jbHVzdGVyLXRlbXBsYXRlIGs4cy1ibS1ncHUKYGBgCgpDbHVzdGVyIGRlZmF1bHQgcGx1cyBhIEdQVSBub2RlZ3JvdXAgbGF5b3V0OgoKYGBgYmFzaApvcGVuc3RhY2sgY29lIGNsdXN0ZXIgdGVtcGxhdGUgY3JlYXRlIGs4cy1ibS1ncHUgXAogIC4uLnNhbWUgYmFzZSB0ZW1wbGF0ZSBvcHRpb25zLi4uIFwKICAtLWxhYmVscyBjb25maWdfcHJvZmlsZT1wcm9maWxlLXN0YW5kYXJkIFwKICAtLWxhYmVscyBub2RlZ3JvdXBfY29uZmlnX3Byb2ZpbGVfc2V0PXByb2ZpbGUtYm0tZ3B1LWxheW91dAoKb3BlbnN0YWNrIGNvZSBjbHVzdGVyIGNyZWF0ZSBibS1ncHUgXAogIC0tY2x1c3Rlci10ZW1wbGF0ZSBrOHMtYm0tZ3B1CmBgYAoKVG8gY2hhbmdlIHRoZXNlIGxhYmVscyBhZnRlciBjbHVzdGVyIGNyZWF0aW9uLCBjcmVhdGUgYSBuZXcgY2x1c3RlciB0ZW1wbGF0ZSB0aGF0IHNlbGVjdHMgdGhlIGRlc2lyZWQgcHJvZmlsZSBhbmQgcnVuIE1hZ251bSBjbHVzdGVyIHVwZ3JhZGUuIE1hZ251bSBjbHVzdGVyIHVwZGF0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlYWwgbGFiZWwgY2hhbmdlcy4KCiMjIFNvbHV0aW9uCgpQUiAjMTAxMyBleHBvc2VzIG5vZGUgYm9vdHN0cmFwIGN1c3RvbWl6YXRpb24gdGhyb3VnaCBvcGVyYXRvci1tYW5hZ2VkIGNvbmZpZyBwcm9maWxlcy4KCkEgcHJvZmlsZSBjYW4gaW5jbHVkZToKCi0gYGt1YmVsZXRDb25maWdgCi0gYGZpbGVzYAotIGBwcmVLdWJlYWRtQ29tbWFuZHNgCi0gYHBvc3RLdWJlYWRtQ29tbWFuZHNgCgpNYWdudW0gcmVuZGVycyBrdWJlbGV0IGNvbmZpZyBhcyBgL2V0Yy9rdWJlcm5ldGVzL3BhdGNoZXMva3ViZWxldGNvbmZpZ3VyYXRpb24rbWVyZ2UueWFtbGAsIGFkZHMgdGhlIGt1YmVhZG0gcGF0Y2ggZGlyZWN0b3J5LCBhbmQgcmVuZGVycyBmaWxlcy9jb21tYW5kcyBpbnRvIENBUEkga3ViZWFkbSBib290c3RyYXAgZmllbGRzLiBNYWdudW0gb3ducyBgYXBpVmVyc2lvbmAsIGBraW5kYCwgYW5kIGBub2RlZ3JvdXBzYDsgcHJvZmlsZXMgbXVzdCBub3Qgc2V0IHRob3NlIGZpZWxkcy4KCmBgYHlhbWwKYXBpVmVyc2lvbjogdjEKa2luZDogQ29uZmlnTWFwCm1ldGFkYXRhOgogIG5hbWU6IG1jYXBpLWNvbmZpZy1wcm9maWxlcwogIG5hbWVzcGFjZTogbWFnbnVtLXN5c3RlbQpkYXRhOgogIHByb2ZpbGUtc3RhbmRhcmQ6IHwKICAgIGt1YmVsZXRDb25maWc6CiAgICAgIG1heFBvZHM6IDExMAogICAgZmlsZXM6CiAgICAgIC0gcGF0aDogL2V0Yy9hdG1vc3BoZXJlL3Byb2ZpbGUtcm9sZQogICAgICAgIGNvbnRlbnQ6IHN0YW5kYXJkCiAgICBwcmVLdWJlYWRtQ29tbWFuZHM6CiAgICAgIC0gYmFzaCAvZXRjL2F0bW9zcGhlcmUvcHJvZmlsZS1zdGFuZGFyZC5zaAogICAgcG9zdEt1YmVhZG1Db21tYW5kczoKICAgICAgLSBlY2hvIHN0YW5kYXJkLXBvc3QgPi92YXIvbG9nL2F0bW9zcGhlcmUvY29uZmlnLXByb2ZpbGUtcG9zdAoKICBwcm9maWxlLWdwdTogfAogICAga3ViZWxldENvbmZpZzoKICAgICAgY3B1TWFuYWdlclBvbGljeTogc3RhdGljCiAgICAgIGNwdU1hbmFnZXJQb2xpY3lPcHRpb25zOgogICAgICAgIGZ1bGwtcGNwdXMtb25seTogInRydWUiCiAgICAgIG1lbW9yeU1hbmFnZXJQb2xpY3k6IFN0YXRpYwogICAgICB0b3BvbG9neU1hbmFnZXJQb2xpY3k6IHNpbmdsZS1udW1hLW5vZGUKICAgICAgdG9wb2xvZ3lNYW5hZ2VyU2NvcGU6IHBvZAogICAgICByZXNlcnZlZFN5c3RlbUNQVXM6IDAtMQogICAgICBtYXhQb2RzOiAyNTAKICAgIGZpbGVzOgogICAgICAtIHBhdGg6IC9ldGMvYXRtb3NwaGVyZS9wcm9maWxlLXJvbGUKICAgICAgICBjb250ZW50OiBncHUKICAgIHByZUt1YmVhZG1Db21tYW5kczoKICAgICAgLSBiYXNoIC9ldGMvYXRtb3NwaGVyZS9wcm9maWxlLWdwdS5zaAogICAgcG9zdEt1YmVhZG1Db21tYW5kczoKICAgICAgLSBlY2hvIGdwdS1wb3N0ID4vdmFyL2xvZy9hdG1vc3BoZXJlL2NvbmZpZy1wcm9maWxlLXBvc3QKCiAgcHJvZmlsZS1ibS1ncHUtbGF5b3V0OiB8CiAgICBub2RlZ3JvdXBzOgogICAgICBncHUtd29ya2VyczoKICAgICAgICBwcm9maWxlOiBwcm9maWxlLWdwdQpgYGAKClVzZXJzIHNlbGVjdCBwcmVkZWZpbmVkIHByb2ZpbGVzIHdpdGggdHdvIGNsdXN0ZXIgdGVtcGxhdGUgbGFiZWxzOgoKfCBMYWJlbCB8IEV4YW1wbGUgfCBFZmZlY3QgfAp8LS0tfC0tLXwtLS18CnwgYGNvbmZpZ19wcm9maWxlYCB8IGBwcm9maWxlLXN0YW5kYXJkYCB8IFNlbGVjdHMgdGhlIGNsdXN0ZXItd2lkZSBkZWZhdWx0IHByb2ZpbGUgcmVuZGVyZWQgYXMgdGhlIGBjb25maWdQcm9maWxlYCBDbHVzdGVyQ2xhc3MgdG9wb2xvZ3kgdmFyaWFibGUuIHwKfCBgbm9kZWdyb3VwX2NvbmZpZ19wcm9maWxlX3NldGAgfCBgcHJvZmlsZS1ibS1ncHUtbGF5b3V0YCB8IFNlbGVjdHMgYW4gb3BlcmF0b3ItZGVmaW5lZCBub2RlZ3JvdXAgbGF5b3V0IHRoYXQgcmVuZGVycyBNYWNoaW5lRGVwbG95bWVudC1sZXZlbCBgY29uZmlnUHJvZmlsZWAgb3ZlcnJpZGVzLiB8CgpUaGVyZSBhcmUgbm8gcGVyLWZpZWxkIGt1YmVsZXQgbGFiZWxzLCBubyBhcmJpdHJhcnkgdXNlciBKU09OIHBhc3N0aHJvdWdoLCBhbmQgbm8gY29tcGF0aWJpbGl0eSBhbGlhc2VzIGZvciBuYW1lcyB0aGF0IG9ubHkgZXhpc3RlZCBpbiB0aGUgdW5tZXJnZWQgUFIgaGlzdG9yeS4gVGhlIHVzZXItZmFjaW5nIHN1cmZhY2UgaXMgbmFtZWQgcHJvZmlsZSBzZWxlY3Rpb24sIGFuZCB0aGUgb3BlcmF0b3IgY29udHJvbHMgdGhlIHByb2ZpbGUgY29udGVudHMuIE1pc3NpbmcgcHJvZmlsZXMsIGludmFsaWQgWUFNTCwgcmVzZXJ2ZWQgZmllbGRzLCBpbnZhbGlkIGZpbGUgZW50cmllcywgYW5kIHVua25vd24gbm9kZWdyb3VwIHByb2ZpbGUgcmVmZXJlbmNlcyBmYWlsIHZhbGlkYXRpb24gYmVmb3JlIENBUEkgcmVuZGVyaW5nLgoKIyMgRG9jdW1lbnRhdGlvbgoKLSBgZG9jcy91c2VyL2xhYmVscy5tZGAgZG9jdW1lbnRzIHRoZSBzZWxlY3RvciBsYWJlbHMgYW5kIHByb2ZpbGUgZmllbGRzLgotIGBkb2NzL3VzZXIvdXNlLWNhc2VzLm1kYCBzaG93cyBvcGVyYXRvci1kZWZpbmVkIHByb2ZpbGVzIGFuZCB1c2VyIHNlbGVjdGlvbi4KLSBgZG9jcy9kZXZlbG9wZXIvY2x1c3Rlci10b3BvbG9neS5tZGAgZG9jdW1lbnRzIGhvdyBwcm9maWxlcyBtYXAgdG8gdG9wb2xvZ3kgdmFyaWFibGVzIGFuZCBNYWNoaW5lRGVwbG95bWVudCBvdmVycmlkZXMuCgojIyBWYWxpZGF0aW9uCgpMb2NhbCB2YWxpZGF0aW9uOgoKYGBgYmFzaAp1diBydW4gLS1weXRob24gMy4xMCBweXRlc3QgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF9yZXNvdXJjZXMucHkgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF91dGlscy5weSBtYWdudW1fY2x1c3Rlcl9hcGkvdGVzdHMvdW5pdC90ZXN0X2ludGVncmF0aW9uc19jb21tb24ucHkgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF9pbnRlZ3JhdGlvbnNfY2luZGVyLnB5IC1xCktVQkVDT05GSUc9PHRlbXBvcmFyeSB0ZXN0IGt1YmVjb25maWc+IHV2IHJ1biAtLXB5dGhvbiAzLjEwIHB5dGVzdCBtYWdudW1fY2x1c3Rlcl9hcGkvdGVzdHMvdW5pdC90ZXN0X2RyaXZlci5weTo6VGVzdERyaXZlcjo6dGVzdF91cGdyYWRlX2NsdXN0ZXJfcGVyc2lzdHNfa3ViZWxldF9zZWxlY3Rvcl9sYWJlbHMgLXEKY2FyZ28gdGVzdCBrdWJlbGV0X2NvbmZpZyAtLXF1aWV0CmNhcmdvIHRlc3QgY29udGFpbmVyZF9jb25maWcgLS1xdWlldApnaXQgZGlmZiAtLWNoZWNrCmBgYAoKUmVhbC1jYXNlIEFJTyB2YWxpZGF0aW9uOgoKLSBEZXBsb3llZCB0ZW1wb3JhcnkgTWFnbnVtIGNvbmR1Y3RvciBpbWFnZXMgZnJvbSB0aGlzIFBSIGJyYW5jaCBvbiBvbmUgT1ZTIEFJTyBhbmQgb25lIE9WTiBBSU8uCi0gQ3JlYXRlZCBgQ29uZmlnTWFwL21jYXBpLWNvbmZpZy1wcm9maWxlc2AgaW4gdGhlIG1hbmFnZW1lbnQgY2x1c3RlciB3aXRoOgogIC0gYHByb2ZpbGUtc3RhbmRhcmRgIGZvciBiYXNlbGluZSB3b3JrZXJzIGFuZCBjb250cm9sLXBsYW5lIG5vZGVzOwogIC0gYHByb2ZpbGUtZ3B1YCBmb3IgR1BVIHdvcmtlcnM7CiAgLSBgcHJvZmlsZS1ibS1ncHUtbGF5b3V0YCBtYXBwaW5nIGBncHUtd29ya2Vyc2AgdG8gYHByb2ZpbGUtZ3B1YC4KLSBDcmVhdGVkIGNsdXN0ZXIgdGVtcGxhdGVzIHdpdGggYGNvbmZpZ19wcm9maWxlPXByb2ZpbGUtc3RhbmRhcmRgIGFuZCBgbm9kZWdyb3VwX2NvbmZpZ19wcm9maWxlX3NldD1wcm9maWxlLWJtLWdwdS1sYXlvdXRgLCB0aGVuIGNyZWF0ZWQgY2x1c3RlcnMgZnJvbSB0aG9zZSB0ZW1wbGF0ZXMgdGhyb3VnaCB0aGUgTWFnbnVtL09wZW5TdGFjayBBUEkuCi0gVmVyaWZpZWQgdGhlIE1hZ251bSBjbHVzdGVyIGNyZWF0aW9uIHBhdGggcHJvZHVjZWQgQ0FQSSB0b3BvbG9neSBzdWNjZXNzZnVsbHkgb24gYm90aCBuZXR3b3JrIGJhY2tlbmRzLgotIFZlcmlmaWVkIHRoZSBjbHVzdGVyLXdpZGUgcHJvZmlsZSByZW5kZXJlZCBpbnRvIHRoZSBjb250cm9sIHBsYW5lIGFuZCBkZWZhdWx0IHdvcmtlciBib290c3RyYXAgZGF0YToKICAtIGt1YmVsZXQgcGF0Y2ggZmlsZSBhdCBgL2V0Yy9rdWJlcm5ldGVzL3BhdGNoZXMva3ViZWxldGNvbmZpZ3VyYXRpb24rbWVyZ2UueWFtbGAgd2l0aCBgbWF4UG9kczogMTEwYDsKICAtIGt1YmVhZG0gcGF0Y2ggZGlyZWN0b3J5IHdpcmluZyBmb3IgaW5pdCBhbmQgam9pbjsKICAtIHByb2ZpbGUtbWFuYWdlZCBmaWxlcyB1bmRlciBgL2V0Yy9hdG1vc3BoZXJlYDsKICAtIHByb2ZpbGUgYHByZUt1YmVhZG1Db21tYW5kc2AgYW5kIGBwb3N0S3ViZWFkbUNvbW1hbmRzYCB3aXRob3V0IGRyb3BwaW5nIGV4aXN0aW5nIGJvb3RzdHJhcCBjb21tYW5kcy4KLSBDcmVhdGVkIGEgYGdwdS13b3JrZXJzYCBub2RlZ3JvdXAgdGhyb3VnaCB0aGUgTWFnbnVtL09wZW5TdGFjayBBUEkgb24gYm90aCBBSU9zLgotIFZlcmlmaWVkIGVhY2ggYGdwdS13b3JrZXJzYCBNYWNoaW5lRGVwbG95bWVudCByZWNlaXZlZCBhIE1hY2hpbmVEZXBsb3ltZW50LWxldmVsIGBjb25maWdQcm9maWxlYCBvdmVycmlkZSBpbnN0ZWFkIG9mIHRoZSBjbHVzdGVyIGRlZmF1bHQuCi0gVmVyaWZpZWQgdGhlIEdQVSB3b3JrZXIgYm9vdHN0cmFwIHJlbmRlcmVkIEdQVS1zcGVjaWZpYyBjb250ZW50OgogIC0ga3ViZWxldCBwYXRjaCB3aXRoIGBjcHVNYW5hZ2VyUG9saWN5OiBzdGF0aWNgLCBgdG9wb2xvZ3lNYW5hZ2VyUG9saWN5OiBzaW5nbGUtbnVtYS1ub2RlYCwgYHJlc2VydmVkU3lzdGVtQ1BVczogMC0xYCwgYW5kIGBtYXhQb2RzOiAyNTBgOwogIC0gR1BVLXNwZWNpZmljIHByb2ZpbGUgZmlsZXM7CiAgLSBHUFUtc3BlY2lmaWMgcHJlL3Bvc3Qga3ViZWFkbSBjb21tYW5kcy4KLSBWZXJpZmllZCBib3RoIEFJT3MgYWNjZXB0ZWQgbm9kZWdyb3VwIGNyZWF0aW9uIGFuZCBDQVBJIHByb3Zpc2lvbmVkIHRoZSBHUFUgd29ya2VyIG1hY2hpbmVzOyBmaW5hbCBub2RlZ3JvdXAgcmVhZGluZXNzIHdhcyBzdGlsbCBjb252ZXJnaW5nIGR1cmluZyB0aGUgdmFsaWRhdGlvbiB3aW5kb3cuCgpUaGlzIGNvdmVycyB0aGUgUFIgIzEwMTUgdXNlIGNhc2UgdGhyb3VnaCBwcm9maWxlcy4gQSBzaW5nbGUgb3BlcmF0b3ItbWFuYWdlZCBwcm9maWxlIGNhbiB3cml0ZSBmaWxlcyBhbmQgcnVuIHByZS9wb3N0IGt1YmVhZG0gY29tbWFuZHMgZm9yIGV2ZXJ5IG5vZGUgaW4gdGhlIGNsdXN0ZXIsIGFuZCBhIG5vZGVncm91cCBsYXlvdXQgY2FuIGFwcGx5IGEgZGlmZmVyZW50IHByb2ZpbGUgb25seSB0byBHUFUgd29ya2VycyB3aGlsZSBjb250cm9sbGVycyBhbmQgb3RoZXIgd29ya2VycyBrZWVwIHRoZSBzdGFuZGFyZCBwcm9maWxlLiBUaGlzIGF2b2lkcyBleHBvc2luZyBgZXh0cmFfZmlsZXNgIG9yIGNvbW1hbmQgbGFiZWxzIGRpcmVjdGx5IHRvIHVzZXJzLgoKU2lnbmVkLW9mZi1ieTogUmljbyBMaW4gPHJpY29AdmV4eGhvc3QuY29tPgo=
      override_checkout: master
      patchset: 6de86f1ba00aca8b5ec5682e4431e5a1cb66eaf9
      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: d92d463b41a57b3a411e83e5bc8bc029788d1d2b
          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: efb5b0e4da07560d72d604b789a3cece6586476e
          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: d92d463b41a57b3a411e83e5bc8bc029788d1d2b
          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: ebaf2cb38784c4827431dc6f7f296504d678880e
        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: ebaf2cb38784c4827431dc6f7f296504d678880e
          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: f96e68006c2a46903c5c001139f29012e68d7a5d
          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: 15bcf475966eab62a638e2663144fbe4b03bedb7
          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: efb5b0e4da07560d72d604b789a3cece6586476e
          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: 4df4d5752f279635b65688f9fd6d97801f78b805
          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: c48ba2b4e9bce498bbe30d90375408286904f8d8
          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: 98082a797fdfa0e710218072b2f6ed8bcb981d57
          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: a95648476f1c3fc47b41ca0fb95ba9bcfdcc135c
          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: ca8749f344168ad1c4e07fdfd24e68ca04c57eae
          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
