all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.116
      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: calico
      nodepool:
        az: nova
        cloud: public
        external_id: ed42d7bb-9054-44e2-87ac-1ff5f04781c2
        host_id: f5d41c99f3f50a7a02e8c9e081443c73166af207792dcb8ee7f694ca
        interface_ip: 199.204.45.116
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.116
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.116
        public_ipv6: 2604:e100:1:0:f816:3eff:fedc:380c
        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: ed42d7bb-9054-44e2-87ac-1ff5f04781c2
        host_id: f5d41c99f3f50a7a02e8c9e081443c73166af207792dcb8ee7f694ca
        interface_ip: 199.204.45.116
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.116
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.116
        public_ipv6: 2604:e100:1:0:f816:3eff:fedc:380c
        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: 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.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-calico explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#96>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7-calico explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: c72f284b8317486baed31a95d8738e71
      build_refs:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\n\n## Problem\n\nBaremetal and GPU-oriented
          Kubernetes clusters need kubelet CPU, topology, and pod-density 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 `/var/lib/kubelet/config.yaml`
          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
          field as an individual Magnum label would create a large and unstable user-facing
          label surface.\n\n## Solution\n\nPR #1013 exposes kubelet tuning through
          operator-managed profiles.\n\nOperators define reusable profiles in the
          management Kubernetes cluster using `ConfigMap/mcapi-kubelet-config-profiles`,
          normally in the `magnum-system` namespace. Each kubelet profile is a kubeadm
          `KubeletConfiguration` fragment. Magnum renders `apiVersion` and `kind`,
          so profiles must not set those fields. `nodegroups` remains reserved for
          layout profiles.\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n
          \ name: mcapi-kubelet-config-profiles\n  namespace: magnum-system\ndata:\n
          \ profile-standard: |\n    maxPods: 110\n\n  profile-gpu: |\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\n  profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n
          \       kubeletConfigProfile: profile-gpu\n```\n\nUsers select predefined
          profiles with two labels:\n\n| Label | Example | Effect |\n|---|---|---|\n|
          `kubelet_config_profile` | `profile-standard` | Selects the cluster-wide
          kubelet profile rendered as the `kubeletConfig` ClusterClass topology variable.
          |\n| `kubelet_nodegroup_config_profile_set` | `profile-bm-gpu-layout` |
          Selects an operator-defined nodegroup layout that renders MachineDeployment-level
          `kubeletConfig` overrides. |\n\nThere are no per-field kubelet labels and
          no arbitrary kubelet JSON passthrough from users. The user-facing surface
          is still only named profile selection. If a profile is missing, contains
          invalid YAML, tries to set Magnum-owned `apiVersion`/`kind`, mixes `nodegroups`
          into a kubelet profile, or a nodegroup layout references an unknown profile,
          mcapi fails validation before rendering CAPI resources.\n\nWhen a profile
          is selected, mcapi renders `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
          into kubeadm bootstrap config and points kubeadm init/join at `/etc/kubernetes/patches`.\n\n##
          Usage\n\nCluster-wide profile:\n\n```bash\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-gpu\n```\n\nCluster
          default plus a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-standard
          \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n```\n\nTo
          change kubelet configuration 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```bash\nopenstack
          coe cluster template create k8s-bm-gpu-v2 \\\n  ...same base template options...
          \\\n  --labels kubelet_config_profile=profile-gpu \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
          coe cluster upgrade bm-gpu k8s-bm-gpu-v2\n```\n\n## Documentation\n\nThe
          docs cover both operator and user flow:\n\n- `docs/user/labels.md` lists
          only the two supported selector labels.\n- `docs/user/use-cases.md` shows
          how an operator defines kubelet config fragments and how users select them.\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_utils.py::TestKubeletConfigLabels
          magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override
          magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
          magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_create_cluster\ncargo
          test kubelet_config\ncargo test test_convert_values_to_cluster_topology_variables\nuvx
          pre-commit run --all-files\n```\n\nLatest local validation for the dynamic-profile
          update:\n\n```bash\nuvx pre-commit run --all-files\ncargo test kubelet_config\ncargo
          test test_convert_values_to_cluster_topology_variables\nuv run --python
          3.10 pytest magnum_cluster_api/tests/unit/test_utils.py::TestKubeletConfigLabels
          magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override\n```\n\nLive
          AIO OVN validation in the live environment:\n\n- Built and deployed a temporary
          Magnum image from this PR branch.\n- Created `ConfigMap/mcapi-kubelet-config-profiles`
          in `magnum-system`.\n- Created a cluster with `kubelet_config_profile=profile-standard`
          and `kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout`.\n- Added
          a `gpu-workers` nodegroup.\n- Upgraded the cluster through templates using
          updated `kubelet_config_profile` values.\n- Create, nodegroup creation,
          and upgrade all reached complete states.\n- Final Magnum `cluster show`
          persisted the upgraded selector labels.\n- Rendered CAPI topology had cluster-level
          `kubeletConfig.maxPods=150` and `gpu-workers` override `maxPods=250`, `cpuManagerPolicy=static`,
          `topologyManagerPolicy=single-numa-node`, `reservedSystemCPUs=0-1`.\n- Workload
          node capacity confirmed the real kubelet effect: control plane `pods=150`,
          default worker `pods=150`, `gpu-workers` `pods=250`.\n\nThe live AIO environment
          validation also caught and fixed one upgrade persistence bug: the driver
          rendered the updated profile into CAPI, but the user-visible Magnum `cluster.labels`
          row stayed stale because in-place dict mutation did not mark the labels
          field dirty. The fix reassigns the labels dict before saving and adds unit
          coverage for that dirty-field behavior.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
        patchset: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
        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: 2d08e396e3434489b8a7b0c09f6b9d7a
      buildset_refs:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\n\n## Problem\n\nBaremetal and GPU-oriented
          Kubernetes clusters need kubelet CPU, topology, and pod-density 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 `/var/lib/kubelet/config.yaml`
          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
          field as an individual Magnum label would create a large and unstable user-facing
          label surface.\n\n## Solution\n\nPR #1013 exposes kubelet tuning through
          operator-managed profiles.\n\nOperators define reusable profiles in the
          management Kubernetes cluster using `ConfigMap/mcapi-kubelet-config-profiles`,
          normally in the `magnum-system` namespace. Each kubelet profile is a kubeadm
          `KubeletConfiguration` fragment. Magnum renders `apiVersion` and `kind`,
          so profiles must not set those fields. `nodegroups` remains reserved for
          layout profiles.\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n
          \ name: mcapi-kubelet-config-profiles\n  namespace: magnum-system\ndata:\n
          \ profile-standard: |\n    maxPods: 110\n\n  profile-gpu: |\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\n  profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n
          \       kubeletConfigProfile: profile-gpu\n```\n\nUsers select predefined
          profiles with two labels:\n\n| Label | Example | Effect |\n|---|---|---|\n|
          `kubelet_config_profile` | `profile-standard` | Selects the cluster-wide
          kubelet profile rendered as the `kubeletConfig` ClusterClass topology variable.
          |\n| `kubelet_nodegroup_config_profile_set` | `profile-bm-gpu-layout` |
          Selects an operator-defined nodegroup layout that renders MachineDeployment-level
          `kubeletConfig` overrides. |\n\nThere are no per-field kubelet labels and
          no arbitrary kubelet JSON passthrough from users. The user-facing surface
          is still only named profile selection. If a profile is missing, contains
          invalid YAML, tries to set Magnum-owned `apiVersion`/`kind`, mixes `nodegroups`
          into a kubelet profile, or a nodegroup layout references an unknown profile,
          mcapi fails validation before rendering CAPI resources.\n\nWhen a profile
          is selected, mcapi renders `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
          into kubeadm bootstrap config and points kubeadm init/join at `/etc/kubernetes/patches`.\n\n##
          Usage\n\nCluster-wide profile:\n\n```bash\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-gpu\n```\n\nCluster
          default plus a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-standard
          \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n```\n\nTo
          change kubelet configuration 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```bash\nopenstack
          coe cluster template create k8s-bm-gpu-v2 \\\n  ...same base template options...
          \\\n  --labels kubelet_config_profile=profile-gpu \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
          coe cluster upgrade bm-gpu k8s-bm-gpu-v2\n```\n\n## Documentation\n\nThe
          docs cover both operator and user flow:\n\n- `docs/user/labels.md` lists
          only the two supported selector labels.\n- `docs/user/use-cases.md` shows
          how an operator defines kubelet config fragments and how users select them.\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_utils.py::TestKubeletConfigLabels
          magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override
          magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
          magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_create_cluster\ncargo
          test kubelet_config\ncargo test test_convert_values_to_cluster_topology_variables\nuvx
          pre-commit run --all-files\n```\n\nLatest local validation for the dynamic-profile
          update:\n\n```bash\nuvx pre-commit run --all-files\ncargo test kubelet_config\ncargo
          test test_convert_values_to_cluster_topology_variables\nuv run --python
          3.10 pytest magnum_cluster_api/tests/unit/test_utils.py::TestKubeletConfigLabels
          magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override\n```\n\nLive
          AIO OVN validation in the live environment:\n\n- Built and deployed a temporary
          Magnum image from this PR branch.\n- Created `ConfigMap/mcapi-kubelet-config-profiles`
          in `magnum-system`.\n- Created a cluster with `kubelet_config_profile=profile-standard`
          and `kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout`.\n- Added
          a `gpu-workers` nodegroup.\n- Upgraded the cluster through templates using
          updated `kubelet_config_profile` values.\n- Create, nodegroup creation,
          and upgrade all reached complete states.\n- Final Magnum `cluster show`
          persisted the upgraded selector labels.\n- Rendered CAPI topology had cluster-level
          `kubeletConfig.maxPods=150` and `gpu-workers` override `maxPods=250`, `cpuManagerPolicy=static`,
          `topologyManagerPolicy=single-numa-node`, `reservedSystemCPUs=0-1`.\n- Workload
          node capacity confirmed the real kubelet effect: control plane `pods=150`,
          default worker `pods=150`, `gpu-workers` `pods=250`.\n\nThe live AIO environment
          validation also caught and fixed one upgrade persistence bug: the driver
          rendered the updated profile into CAPI, but the user-visible Magnum `cluster.labels`
          row stayed stale because in-place dict mutation did not mark the labels
          field dirty. The fix reassigns the labels dict before saving and adds unit
          coverage for that dirty-field behavior.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
        patchset: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
        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 kubelet CPU, topology, and pod-density 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 `/var/lib/kubelet/config.yaml`
        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 field
        as an individual Magnum label would create a large and unstable user-facing
        label surface.\n\n## Solution\n\nPR #1013 exposes kubelet tuning through operator-managed
        profiles.\n\nOperators define reusable profiles in the management Kubernetes
        cluster using `ConfigMap/mcapi-kubelet-config-profiles`, normally in the `magnum-system`
        namespace. Each kubelet profile is a kubeadm `KubeletConfiguration` fragment.
        Magnum renders `apiVersion` and `kind`, so profiles must not set those fields.
        `nodegroups` remains reserved for layout profiles.\n\n```yaml\napiVersion:
        v1\nkind: ConfigMap\nmetadata:\n  name: mcapi-kubelet-config-profiles\n  namespace:
        magnum-system\ndata:\n  profile-standard: |\n    maxPods: 110\n\n  profile-gpu:
        |\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\n
        \ profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n        kubeletConfigProfile:
        profile-gpu\n```\n\nUsers select predefined profiles with two labels:\n\n|
        Label | Example | Effect |\n|---|---|---|\n| `kubelet_config_profile` | `profile-standard`
        | Selects the cluster-wide kubelet profile rendered as the `kubeletConfig`
        ClusterClass topology variable. |\n| `kubelet_nodegroup_config_profile_set`
        | `profile-bm-gpu-layout` | Selects an operator-defined nodegroup layout that
        renders MachineDeployment-level `kubeletConfig` overrides. |\n\nThere are
        no per-field kubelet labels and no arbitrary kubelet JSON passthrough from
        users. The user-facing surface is still only named profile selection. If a
        profile is missing, contains invalid YAML, tries to set Magnum-owned `apiVersion`/`kind`,
        mixes `nodegroups` into a kubelet profile, or a nodegroup layout references
        an unknown profile, mcapi fails validation before rendering CAPI resources.\n\nWhen
        a profile is selected, mcapi renders `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
        into kubeadm bootstrap config and points kubeadm init/join at `/etc/kubernetes/patches`.\n\n##
        Usage\n\nCluster-wide profile:\n\n```bash\nopenstack coe cluster create bm-gpu
        \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-gpu\n```\n\nCluster
        default plus a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster create
        bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-standard
        \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n```\n\nTo
        change kubelet configuration 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```bash\nopenstack
        coe cluster template create k8s-bm-gpu-v2 \\\n  ...same base template options...
        \\\n  --labels kubelet_config_profile=profile-gpu \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
        coe cluster upgrade bm-gpu k8s-bm-gpu-v2\n```\n\n## Documentation\n\nThe docs
        cover both operator and user flow:\n\n- `docs/user/labels.md` lists only the
        two supported selector labels.\n- `docs/user/use-cases.md` shows how an operator
        defines kubelet config fragments and how users select them.\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_utils.py::TestKubeletConfigLabels
        magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override
        magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
        magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_create_cluster\ncargo
        test kubelet_config\ncargo test test_convert_values_to_cluster_topology_variables\nuvx
        pre-commit run --all-files\n```\n\nLatest local validation for the dynamic-profile
        update:\n\n```bash\nuvx pre-commit run --all-files\ncargo test kubelet_config\ncargo
        test test_convert_values_to_cluster_topology_variables\nuv run --python 3.10
        pytest magnum_cluster_api/tests/unit/test_utils.py::TestKubeletConfigLabels
        magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override\n```\n\nLive
        AIO OVN validation in the live environment:\n\n- Built and deployed a temporary
        Magnum image from this PR branch.\n- Created `ConfigMap/mcapi-kubelet-config-profiles`
        in `magnum-system`.\n- Created a cluster with `kubelet_config_profile=profile-standard`
        and `kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout`.\n- Added
        a `gpu-workers` nodegroup.\n- Upgraded the cluster through templates using
        updated `kubelet_config_profile` values.\n- Create, nodegroup creation, and
        upgrade all reached complete states.\n- Final Magnum `cluster show` persisted
        the upgraded selector labels.\n- Rendered CAPI topology had cluster-level
        `kubeletConfig.maxPods=150` and `gpu-workers` override `maxPods=250`, `cpuManagerPolicy=static`,
        `topologyManagerPolicy=single-numa-node`, `reservedSystemCPUs=0-1`.\n- Workload
        node capacity confirmed the real kubelet effect: control plane `pods=150`,
        default worker `pods=150`, `gpu-workers` `pods=250`.\n\nThe live AIO environment
        validation also caught and fixed one upgrade persistence bug: the driver rendered
        the updated profile into CAPI, but the user-visible Magnum `cluster.labels`
        row stayed stale because in-place dict mutation did not mark the labels field
        dirty. The fix reassigns the labels dict before saving and adds unit coverage
        for that dirty-field behavior.\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
      child_jobs: []
      commit_id: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
      event_id: d3c289e0-58db-11f1-9134-05d59ddabbdd
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/c72f284b8317486baed31a95d8738e71/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/c72f284b8317486baed31a95d8738e71/work/logs
        result_data_file: /var/lib/zuul/builds/c72f284b8317486baed31a95d8738e71/work/results.json
        src_root: /var/lib/zuul/builds/c72f284b8317486baed31a95d8738e71/work/src
        work_root: /var/lib/zuul/builds/c72f284b8317486baed31a95d8738e71/work
      include_vars: []
      items:
      - branch: main
        change: '1013'
        change_message: "Support config profiles\n\n## Problem\n\nBaremetal and GPU-oriented
          Kubernetes clusters need kubelet CPU, topology, and pod-density 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 `/var/lib/kubelet/config.yaml`
          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
          field as an individual Magnum label would create a large and unstable user-facing
          label surface.\n\n## Solution\n\nPR #1013 exposes kubelet tuning through
          operator-managed profiles.\n\nOperators define reusable profiles in the
          management Kubernetes cluster using `ConfigMap/mcapi-kubelet-config-profiles`,
          normally in the `magnum-system` namespace. Each kubelet profile is a kubeadm
          `KubeletConfiguration` fragment. Magnum renders `apiVersion` and `kind`,
          so profiles must not set those fields. `nodegroups` remains reserved for
          layout profiles.\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n
          \ name: mcapi-kubelet-config-profiles\n  namespace: magnum-system\ndata:\n
          \ profile-standard: |\n    maxPods: 110\n\n  profile-gpu: |\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\n  profile-bm-gpu-layout: |\n    nodegroups:\n      gpu-workers:\n
          \       kubeletConfigProfile: profile-gpu\n```\n\nUsers select predefined
          profiles with two labels:\n\n| Label | Example | Effect |\n|---|---|---|\n|
          `kubelet_config_profile` | `profile-standard` | Selects the cluster-wide
          kubelet profile rendered as the `kubeletConfig` ClusterClass topology variable.
          |\n| `kubelet_nodegroup_config_profile_set` | `profile-bm-gpu-layout` |
          Selects an operator-defined nodegroup layout that renders MachineDeployment-level
          `kubeletConfig` overrides. |\n\nThere are no per-field kubelet labels and
          no arbitrary kubelet JSON passthrough from users. The user-facing surface
          is still only named profile selection. If a profile is missing, contains
          invalid YAML, tries to set Magnum-owned `apiVersion`/`kind`, mixes `nodegroups`
          into a kubelet profile, or a nodegroup layout references an unknown profile,
          mcapi fails validation before rendering CAPI resources.\n\nWhen a profile
          is selected, mcapi renders `/etc/kubernetes/patches/kubeletconfiguration+merge.yaml`
          into kubeadm bootstrap config and points kubeadm init/join at `/etc/kubernetes/patches`.\n\n##
          Usage\n\nCluster-wide profile:\n\n```bash\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-gpu\n```\n\nCluster
          default plus a GPU nodegroup layout:\n\n```bash\nopenstack coe cluster create
          bm-gpu \\\n  --cluster-template k8s-bm \\\n  --labels kubelet_config_profile=profile-standard
          \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n```\n\nTo
          change kubelet configuration 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```bash\nopenstack
          coe cluster template create k8s-bm-gpu-v2 \\\n  ...same base template options...
          \\\n  --labels kubelet_config_profile=profile-gpu \\\n  --labels kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout\n\nopenstack
          coe cluster upgrade bm-gpu k8s-bm-gpu-v2\n```\n\n## Documentation\n\nThe
          docs cover both operator and user flow:\n\n- `docs/user/labels.md` lists
          only the two supported selector labels.\n- `docs/user/use-cases.md` shows
          how an operator defines kubelet config fragments and how users select them.\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_utils.py::TestKubeletConfigLabels
          magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override
          magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_upgrade_cluster_persists_kubelet_selector_labels
          magnum_cluster_api/tests/unit/test_driver.py::TestDriver::test_create_cluster\ncargo
          test kubelet_config\ncargo test test_convert_values_to_cluster_topology_variables\nuvx
          pre-commit run --all-files\n```\n\nLatest local validation for the dynamic-profile
          update:\n\n```bash\nuvx pre-commit run --all-files\ncargo test kubelet_config\ncargo
          test test_convert_values_to_cluster_topology_variables\nuv run --python
          3.10 pytest magnum_cluster_api/tests/unit/test_utils.py::TestKubeletConfigLabels
          magnum_cluster_api/tests/unit/test_resources.py::test_generate_machine_deployments_with_nodegroup_kubelet_override\n```\n\nLive
          AIO OVN validation in the live environment:\n\n- Built and deployed a temporary
          Magnum image from this PR branch.\n- Created `ConfigMap/mcapi-kubelet-config-profiles`
          in `magnum-system`.\n- Created a cluster with `kubelet_config_profile=profile-standard`
          and `kubelet_nodegroup_config_profile_set=profile-bm-gpu-layout`.\n- Added
          a `gpu-workers` nodegroup.\n- Upgraded the cluster through templates using
          updated `kubelet_config_profile` values.\n- Create, nodegroup creation,
          and upgrade all reached complete states.\n- Final Magnum `cluster show`
          persisted the upgraded selector labels.\n- Rendered CAPI topology had cluster-level
          `kubeletConfig.maxPods=150` and `gpu-workers` override `maxPods=250`, `cpuManagerPolicy=static`,
          `topologyManagerPolicy=single-numa-node`, `reservedSystemCPUs=0-1`.\n- Workload
          node capacity confirmed the real kubelet effect: control plane `pods=150`,
          default worker `pods=150`, `gpu-workers` `pods=250`.\n\nThe live AIO environment
          validation also caught and fixed one upgrade persistence bug: the driver
          rendered the updated profile into CAPI, but the user-visible Magnum `cluster.labels`
          row stayed stale because in-place dict mutation did not mark the labels
          field dirty. The fix reassigns the labels dict before saving and adds unit
          coverage for that dirty-field behavior.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
        patchset: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
        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-calico
      jobtags: []
      max_attempts: 3
      message: U3VwcG9ydCBjb25maWcgcHJvZmlsZXMKCiMjIFByb2JsZW0KCkJhcmVtZXRhbCBhbmQgR1BVLW9yaWVudGVkIEt1YmVybmV0ZXMgY2x1c3RlcnMgbmVlZCBrdWJlbGV0IENQVSwgdG9wb2xvZ3ksIGFuZCBwb2QtZGVuc2l0eSB0dW5pbmcgdGhhdCBzdXJ2aXZlcyBub2RlIHJlcGxhY2VtZW50LCBzY2FsZS11cCwgYW5kIHJvbGxpbmcgdXBncmFkZXMuIFRoZSBvbGRlciBvcHRpb25zIGFyZSBub3QgZ29vZCBwcm9kdWN0aW9uIGludGVyZmFjZXM6CgotIHBvc3QtY3JlYXRlIFNTSCBlZGl0cyB0byBgL3Zhci9saWIva3ViZWxldC9jb25maWcueWFtbGAgYXJlIG5vdCBkZWNsYXJhdGl2ZSBhbmQgZG8gbm90IHN1cnZpdmUgbm9kZSByZXBsYWNlbWVudDsKLSBga3ViZWxldEV4dHJhQXJnc2AgaXMgYSBDTEkgZmxhZyBwYXRoLCB3aGlsZSB0aGVzZSBzZXR0aW5ncyBiZWxvbmcgaW4gc3RydWN0dXJlZCBrdWJlbGV0IGNvbmZpZ3VyYXRpb247Ci0gYXJiaXRyYXJ5IEpTT04vWUFNTCBpbiBNYWdudW0gbGFiZWxzIHdvdWxkIG1ha2UgbGFiZWxzIGFuIHVudHlwZWQgY29uZmlnIHRyYW5zcG9ydCBhbmQgd291bGQgYmUgZGlmZmljdWx0IHRvIHZhbGlkYXRlIHNhZmVseTsKLSBleHBvc2luZyBldmVyeSBrdWJlbGV0IGZpZWxkIGFzIGFuIGluZGl2aWR1YWwgTWFnbnVtIGxhYmVsIHdvdWxkIGNyZWF0ZSBhIGxhcmdlIGFuZCB1bnN0YWJsZSB1c2VyLWZhY2luZyBsYWJlbCBzdXJmYWNlLgoKIyMgU29sdXRpb24KClBSICMxMDEzIGV4cG9zZXMga3ViZWxldCB0dW5pbmcgdGhyb3VnaCBvcGVyYXRvci1tYW5hZ2VkIHByb2ZpbGVzLgoKT3BlcmF0b3JzIGRlZmluZSByZXVzYWJsZSBwcm9maWxlcyBpbiB0aGUgbWFuYWdlbWVudCBLdWJlcm5ldGVzIGNsdXN0ZXIgdXNpbmcgYENvbmZpZ01hcC9tY2FwaS1rdWJlbGV0LWNvbmZpZy1wcm9maWxlc2AsIG5vcm1hbGx5IGluIHRoZSBgbWFnbnVtLXN5c3RlbWAgbmFtZXNwYWNlLiBFYWNoIGt1YmVsZXQgcHJvZmlsZSBpcyBhIGt1YmVhZG0gYEt1YmVsZXRDb25maWd1cmF0aW9uYCBmcmFnbWVudC4gTWFnbnVtIHJlbmRlcnMgYGFwaVZlcnNpb25gIGFuZCBga2luZGAsIHNvIHByb2ZpbGVzIG11c3Qgbm90IHNldCB0aG9zZSBmaWVsZHMuIGBub2RlZ3JvdXBzYCByZW1haW5zIHJlc2VydmVkIGZvciBsYXlvdXQgcHJvZmlsZXMuCgpgYGB5YW1sCmFwaVZlcnNpb246IHYxCmtpbmQ6IENvbmZpZ01hcAptZXRhZGF0YToKICBuYW1lOiBtY2FwaS1rdWJlbGV0LWNvbmZpZy1wcm9maWxlcwogIG5hbWVzcGFjZTogbWFnbnVtLXN5c3RlbQpkYXRhOgogIHByb2ZpbGUtc3RhbmRhcmQ6IHwKICAgIG1heFBvZHM6IDExMAoKICBwcm9maWxlLWdwdTogfAogICAgY3B1TWFuYWdlclBvbGljeTogc3RhdGljCiAgICBjcHVNYW5hZ2VyUG9saWN5T3B0aW9uczoKICAgICAgZnVsbC1wY3B1cy1vbmx5OiAidHJ1ZSIKICAgIG1lbW9yeU1hbmFnZXJQb2xpY3k6IFN0YXRpYwogICAgdG9wb2xvZ3lNYW5hZ2VyUG9saWN5OiBzaW5nbGUtbnVtYS1ub2RlCiAgICB0b3BvbG9neU1hbmFnZXJTY29wZTogcG9kCiAgICByZXNlcnZlZFN5c3RlbUNQVXM6IDAtMQogICAgbWF4UG9kczogMjUwCgogIHByb2ZpbGUtYm0tZ3B1LWxheW91dDogfAogICAgbm9kZWdyb3VwczoKICAgICAgZ3B1LXdvcmtlcnM6CiAgICAgICAga3ViZWxldENvbmZpZ1Byb2ZpbGU6IHByb2ZpbGUtZ3B1CmBgYAoKVXNlcnMgc2VsZWN0IHByZWRlZmluZWQgcHJvZmlsZXMgd2l0aCB0d28gbGFiZWxzOgoKfCBMYWJlbCB8IEV4YW1wbGUgfCBFZmZlY3QgfAp8LS0tfC0tLXwtLS18CnwgYGt1YmVsZXRfY29uZmlnX3Byb2ZpbGVgIHwgYHByb2ZpbGUtc3RhbmRhcmRgIHwgU2VsZWN0cyB0aGUgY2x1c3Rlci13aWRlIGt1YmVsZXQgcHJvZmlsZSByZW5kZXJlZCBhcyB0aGUgYGt1YmVsZXRDb25maWdgIENsdXN0ZXJDbGFzcyB0b3BvbG9neSB2YXJpYWJsZS4gfAp8IGBrdWJlbGV0X25vZGVncm91cF9jb25maWdfcHJvZmlsZV9zZXRgIHwgYHByb2ZpbGUtYm0tZ3B1LWxheW91dGAgfCBTZWxlY3RzIGFuIG9wZXJhdG9yLWRlZmluZWQgbm9kZWdyb3VwIGxheW91dCB0aGF0IHJlbmRlcnMgTWFjaGluZURlcGxveW1lbnQtbGV2ZWwgYGt1YmVsZXRDb25maWdgIG92ZXJyaWRlcy4gfAoKVGhlcmUgYXJlIG5vIHBlci1maWVsZCBrdWJlbGV0IGxhYmVscyBhbmQgbm8gYXJiaXRyYXJ5IGt1YmVsZXQgSlNPTiBwYXNzdGhyb3VnaCBmcm9tIHVzZXJzLiBUaGUgdXNlci1mYWNpbmcgc3VyZmFjZSBpcyBzdGlsbCBvbmx5IG5hbWVkIHByb2ZpbGUgc2VsZWN0aW9uLiBJZiBhIHByb2ZpbGUgaXMgbWlzc2luZywgY29udGFpbnMgaW52YWxpZCBZQU1MLCB0cmllcyB0byBzZXQgTWFnbnVtLW93bmVkIGBhcGlWZXJzaW9uYC9ga2luZGAsIG1peGVzIGBub2RlZ3JvdXBzYCBpbnRvIGEga3ViZWxldCBwcm9maWxlLCBvciBhIG5vZGVncm91cCBsYXlvdXQgcmVmZXJlbmNlcyBhbiB1bmtub3duIHByb2ZpbGUsIG1jYXBpIGZhaWxzIHZhbGlkYXRpb24gYmVmb3JlIHJlbmRlcmluZyBDQVBJIHJlc291cmNlcy4KCldoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkLCBtY2FwaSByZW5kZXJzIGAvZXRjL2t1YmVybmV0ZXMvcGF0Y2hlcy9rdWJlbGV0Y29uZmlndXJhdGlvbittZXJnZS55YW1sYCBpbnRvIGt1YmVhZG0gYm9vdHN0cmFwIGNvbmZpZyBhbmQgcG9pbnRzIGt1YmVhZG0gaW5pdC9qb2luIGF0IGAvZXRjL2t1YmVybmV0ZXMvcGF0Y2hlc2AuCgojIyBVc2FnZQoKQ2x1c3Rlci13aWRlIHByb2ZpbGU6CgpgYGBiYXNoCm9wZW5zdGFjayBjb2UgY2x1c3RlciBjcmVhdGUgYm0tZ3B1IFwKICAtLWNsdXN0ZXItdGVtcGxhdGUgazhzLWJtIFwKICAtLWxhYmVscyBrdWJlbGV0X2NvbmZpZ19wcm9maWxlPXByb2ZpbGUtZ3B1CmBgYAoKQ2x1c3RlciBkZWZhdWx0IHBsdXMgYSBHUFUgbm9kZWdyb3VwIGxheW91dDoKCmBgYGJhc2gKb3BlbnN0YWNrIGNvZSBjbHVzdGVyIGNyZWF0ZSBibS1ncHUgXAogIC0tY2x1c3Rlci10ZW1wbGF0ZSBrOHMtYm0gXAogIC0tbGFiZWxzIGt1YmVsZXRfY29uZmlnX3Byb2ZpbGU9cHJvZmlsZS1zdGFuZGFyZCBcCiAgLS1sYWJlbHMga3ViZWxldF9ub2RlZ3JvdXBfY29uZmlnX3Byb2ZpbGVfc2V0PXByb2ZpbGUtYm0tZ3B1LWxheW91dApgYGAKClRvIGNoYW5nZSBrdWJlbGV0IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgY2x1c3RlciBjcmVhdGlvbiwgY3JlYXRlIGEgbmV3IGNsdXN0ZXIgdGVtcGxhdGUgdGhhdCBzZWxlY3RzIHRoZSBkZXNpcmVkIHByb2ZpbGUgYW5kIHJ1biBNYWdudW0gY2x1c3RlciB1cGdyYWRlLiBNYWdudW0gY2x1c3RlciB1cGRhdGUgZG9lcyBub3Qgc3VwcG9ydCByZWFsIGxhYmVsIGNoYW5nZXMuCgpgYGBiYXNoCm9wZW5zdGFjayBjb2UgY2x1c3RlciB0ZW1wbGF0ZSBjcmVhdGUgazhzLWJtLWdwdS12MiBcCiAgLi4uc2FtZSBiYXNlIHRlbXBsYXRlIG9wdGlvbnMuLi4gXAogIC0tbGFiZWxzIGt1YmVsZXRfY29uZmlnX3Byb2ZpbGU9cHJvZmlsZS1ncHUgXAogIC0tbGFiZWxzIGt1YmVsZXRfbm9kZWdyb3VwX2NvbmZpZ19wcm9maWxlX3NldD1wcm9maWxlLWJtLWdwdS1sYXlvdXQKCm9wZW5zdGFjayBjb2UgY2x1c3RlciB1cGdyYWRlIGJtLWdwdSBrOHMtYm0tZ3B1LXYyCmBgYAoKIyMgRG9jdW1lbnRhdGlvbgoKVGhlIGRvY3MgY292ZXIgYm90aCBvcGVyYXRvciBhbmQgdXNlciBmbG93OgoKLSBgZG9jcy91c2VyL2xhYmVscy5tZGAgbGlzdHMgb25seSB0aGUgdHdvIHN1cHBvcnRlZCBzZWxlY3RvciBsYWJlbHMuCi0gYGRvY3MvdXNlci91c2UtY2FzZXMubWRgIHNob3dzIGhvdyBhbiBvcGVyYXRvciBkZWZpbmVzIGt1YmVsZXQgY29uZmlnIGZyYWdtZW50cyBhbmQgaG93IHVzZXJzIHNlbGVjdCB0aGVtLgotIGBkb2NzL2RldmVsb3Blci9jbHVzdGVyLXRvcG9sb2d5Lm1kYCBkb2N1bWVudHMgaG93IHByb2ZpbGVzIG1hcCB0byB0b3BvbG9neSB2YXJpYWJsZXMgYW5kIE1hY2hpbmVEZXBsb3ltZW50IG92ZXJyaWRlcy4KCiMjIFZhbGlkYXRpb24KCkxvY2FsIHZhbGlkYXRpb246CgpgYGBiYXNoCnV2IHJ1biAtLXB5dGhvbiAzLjEwIHB5dGVzdCBtYWdudW1fY2x1c3Rlcl9hcGkvdGVzdHMvdW5pdC90ZXN0X3V0aWxzLnB5OjpUZXN0S3ViZWxldENvbmZpZ0xhYmVscyBtYWdudW1fY2x1c3Rlcl9hcGkvdGVzdHMvdW5pdC90ZXN0X3Jlc291cmNlcy5weTo6dGVzdF9nZW5lcmF0ZV9tYWNoaW5lX2RlcGxveW1lbnRzX3dpdGhfbm9kZWdyb3VwX2t1YmVsZXRfb3ZlcnJpZGUgbWFnbnVtX2NsdXN0ZXJfYXBpL3Rlc3RzL3VuaXQvdGVzdF9kcml2ZXIucHk6OlRlc3REcml2ZXI6OnRlc3RfdXBncmFkZV9jbHVzdGVyX3BlcnNpc3RzX2t1YmVsZXRfc2VsZWN0b3JfbGFiZWxzIG1hZ251bV9jbHVzdGVyX2FwaS90ZXN0cy91bml0L3Rlc3RfZHJpdmVyLnB5OjpUZXN0RHJpdmVyOjp0ZXN0X2NyZWF0ZV9jbHVzdGVyCmNhcmdvIHRlc3Qga3ViZWxldF9jb25maWcKY2FyZ28gdGVzdCB0ZXN0X2NvbnZlcnRfdmFsdWVzX3RvX2NsdXN0ZXJfdG9wb2xvZ3lfdmFyaWFibGVzCnV2eCBwcmUtY29tbWl0IHJ1biAtLWFsbC1maWxlcwpgYGAKCkxhdGVzdCBsb2NhbCB2YWxpZGF0aW9uIGZvciB0aGUgZHluYW1pYy1wcm9maWxlIHVwZGF0ZToKCmBgYGJhc2gKdXZ4IHByZS1jb21taXQgcnVuIC0tYWxsLWZpbGVzCmNhcmdvIHRlc3Qga3ViZWxldF9jb25maWcKY2FyZ28gdGVzdCB0ZXN0X2NvbnZlcnRfdmFsdWVzX3RvX2NsdXN0ZXJfdG9wb2xvZ3lfdmFyaWFibGVzCnV2IHJ1biAtLXB5dGhvbiAzLjEwIHB5dGVzdCBtYWdudW1fY2x1c3Rlcl9hcGkvdGVzdHMvdW5pdC90ZXN0X3V0aWxzLnB5OjpUZXN0S3ViZWxldENvbmZpZ0xhYmVscyBtYWdudW1fY2x1c3Rlcl9hcGkvdGVzdHMvdW5pdC90ZXN0X3Jlc291cmNlcy5weTo6dGVzdF9nZW5lcmF0ZV9tYWNoaW5lX2RlcGxveW1lbnRzX3dpdGhfbm9kZWdyb3VwX2t1YmVsZXRfb3ZlcnJpZGUKYGBgCgpMaXZlIEFJTyBPVk4gdmFsaWRhdGlvbiBpbiB0aGUgbGl2ZSBlbnZpcm9ubWVudDoKCi0gQnVpbHQgYW5kIGRlcGxveWVkIGEgdGVtcG9yYXJ5IE1hZ251bSBpbWFnZSBmcm9tIHRoaXMgUFIgYnJhbmNoLgotIENyZWF0ZWQgYENvbmZpZ01hcC9tY2FwaS1rdWJlbGV0LWNvbmZpZy1wcm9maWxlc2AgaW4gYG1hZ251bS1zeXN0ZW1gLgotIENyZWF0ZWQgYSBjbHVzdGVyIHdpdGggYGt1YmVsZXRfY29uZmlnX3Byb2ZpbGU9cHJvZmlsZS1zdGFuZGFyZGAgYW5kIGBrdWJlbGV0X25vZGVncm91cF9jb25maWdfcHJvZmlsZV9zZXQ9cHJvZmlsZS1ibS1ncHUtbGF5b3V0YC4KLSBBZGRlZCBhIGBncHUtd29ya2Vyc2Agbm9kZWdyb3VwLgotIFVwZ3JhZGVkIHRoZSBjbHVzdGVyIHRocm91Z2ggdGVtcGxhdGVzIHVzaW5nIHVwZGF0ZWQgYGt1YmVsZXRfY29uZmlnX3Byb2ZpbGVgIHZhbHVlcy4KLSBDcmVhdGUsIG5vZGVncm91cCBjcmVhdGlvbiwgYW5kIHVwZ3JhZGUgYWxsIHJlYWNoZWQgY29tcGxldGUgc3RhdGVzLgotIEZpbmFsIE1hZ251bSBgY2x1c3RlciBzaG93YCBwZXJzaXN0ZWQgdGhlIHVwZ3JhZGVkIHNlbGVjdG9yIGxhYmVscy4KLSBSZW5kZXJlZCBDQVBJIHRvcG9sb2d5IGhhZCBjbHVzdGVyLWxldmVsIGBrdWJlbGV0Q29uZmlnLm1heFBvZHM9MTUwYCBhbmQgYGdwdS13b3JrZXJzYCBvdmVycmlkZSBgbWF4UG9kcz0yNTBgLCBgY3B1TWFuYWdlclBvbGljeT1zdGF0aWNgLCBgdG9wb2xvZ3lNYW5hZ2VyUG9saWN5PXNpbmdsZS1udW1hLW5vZGVgLCBgcmVzZXJ2ZWRTeXN0ZW1DUFVzPTAtMWAuCi0gV29ya2xvYWQgbm9kZSBjYXBhY2l0eSBjb25maXJtZWQgdGhlIHJlYWwga3ViZWxldCBlZmZlY3Q6IGNvbnRyb2wgcGxhbmUgYHBvZHM9MTUwYCwgZGVmYXVsdCB3b3JrZXIgYHBvZHM9MTUwYCwgYGdwdS13b3JrZXJzYCBgcG9kcz0yNTBgLgoKVGhlIGxpdmUgQUlPIGVudmlyb25tZW50IHZhbGlkYXRpb24gYWxzbyBjYXVnaHQgYW5kIGZpeGVkIG9uZSB1cGdyYWRlIHBlcnNpc3RlbmNlIGJ1ZzogdGhlIGRyaXZlciByZW5kZXJlZCB0aGUgdXBkYXRlZCBwcm9maWxlIGludG8gQ0FQSSwgYnV0IHRoZSB1c2VyLXZpc2libGUgTWFnbnVtIGBjbHVzdGVyLmxhYmVsc2Agcm93IHN0YXllZCBzdGFsZSBiZWNhdXNlIGluLXBsYWNlIGRpY3QgbXV0YXRpb24gZGlkIG5vdCBtYXJrIHRoZSBsYWJlbHMgZmllbGQgZGlydHkuIFRoZSBmaXggcmVhc3NpZ25zIHRoZSBsYWJlbHMgZGljdCBiZWZvcmUgc2F2aW5nIGFuZCBhZGRzIHVuaXQgY292ZXJhZ2UgZm9yIHRoYXQgZGlydHktZmllbGQgYmVoYXZpb3IuCg==
      override_checkout: master
      patchset: b66c0ea1af02808ce3b9d2ff209831c44fe90f59
      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: 472b1693fd3dc8e3cf98bdefd3a55503750b48aa
          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: f4060836a6774007a1c84f1ef7d23d765844a55c
        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: f4060836a6774007a1c84f1ef7d23d765844a55c
          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: 2d1ea8606784cb7e1147e869a79f6be7e8466236
          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: 472b1693fd3dc8e3cf98bdefd3a55503750b48aa
          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: b1a6575e5bc27d44ec5e28f796fa86e37f94538c
          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: 5eb91ab57250495edb1ad5896f31da00de2424a8
          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: c4d398d8a67a19709effa318a9127b049671f01c
          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
