all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.49
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      configure_swap_size: 8192
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
          /etc/magnum/magnum.conf:
            cluster_template:
              kubernetes_allowed_network_drivers: calico,cilium
              kubernetes_default_network_driver: calico
            nova_client:
              api_version: 2.15
          /etc/manila/manila.conf:
            generic:
              connect_share_server_to_tenant_network: true
              driver_handles_share_servers: true
      devstack_localrc:
        ADMIN_PASSWORD: secretadmin
        DATABASE_PASSWORD: secretdatabase
        DEBUG_LIBVIRT_COREDUMPS: true
        DISABLE_AMP_IMAGE_BUILD: true
        ENABLE_SYSCTL_MEM_TUNING: true
        ENABLE_SYSCTL_NET_TUNING: true
        ENABLE_ZSWAP: true
        ERROR_ON_CLONE: true
        FIXED_RANGE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        GIT_BASE: https://github.com
        HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
        MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
        MANILA_ENABLED_BACKENDS: generic
        MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
        NETWORK_GATEWAY: 10.1.0.1
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        NOVA_VNC_ENABLED: true
        OCTAVIA_NODE: api
        OVN_DBS_LOG_LEVEL: dbg
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        RABBIT_PASSWORD: secretrabbit
        SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4'']
          }}'
        SERVICE_PASSWORD: secretservice
        SWIFT_HASH: 1234123412341234
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
      devstack_plugins:
        barbican: https://github.com/openstack/barbican
        magnum: https://review.opendev.org/openstack/magnum
        magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
        manila: https://github.com/openstack/manila
        octavia: https://github.com/openstack/octavia
        ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
      devstack_services:
        base: false
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        dstat: false
        etcd3: true
        file_tracker: true
        g-api: true
        horizon: false
        key: true
        memory_tracker: true
        mysql: true
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        o-api: true
        o-da: true
        o-hk: true
        octavia: true
        openstack-cli-server: true
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        placement-api: true
        q-ovn-agent: true
        q-svc: true
        rabbit: true
        s-account: false
        s-container: false
        s-object: false
        s-proxy: false
        tempest: false
        tls-proxy: true
      extensions_to_txt:
        auto: true
        conf: true
        localrc: true
        log: true
        stackenv: true
      image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
        kube_tag }}.qcow2
      kube_tag: v1.34.7
      network_driver: cilium
      nodepool:
        az: nova
        cloud: public
        external_id: 8239425f-05ff-4c97-ad3e-fae846978ea2
        host_id: 6782d36b49969b8e83d63aec7c00c7f3fbf4fe3934e38116e588005f
        interface_ip: 199.204.45.49
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.49
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.49
        public_ipv6: 2604:e100:1:0:f816:3eff:fe2e:78f5
        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: 8239425f-05ff-4c97-ad3e-fae846978ea2
        host_id: 6782d36b49969b8e83d63aec7c00c7f3fbf4fe3934e38116e588005f
        interface_ip: 199.204.45.49
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.49
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.49
        public_ipv6: 2604:e100:1:0:f816:3eff:fe2e:78f5
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    configure_swap_size: 8192
    devstack_local_conf:
      post-config:
        $NEUTRON_CONF:
          DEFAULT:
            global_physnet_mtu: '{{ external_bridge_mtu }}'
        /etc/magnum/magnum.conf:
          cluster_template:
            kubernetes_allowed_network_drivers: calico,cilium
            kubernetes_default_network_driver: calico
          nova_client:
            api_version: 2.15
        /etc/manila/manila.conf:
          generic:
            connect_share_server_to_tenant_network: true
            driver_handles_share_servers: true
    devstack_localrc:
      ADMIN_PASSWORD: secretadmin
      DATABASE_PASSWORD: secretdatabase
      DEBUG_LIBVIRT_COREDUMPS: true
      DISABLE_AMP_IMAGE_BUILD: true
      ENABLE_SYSCTL_MEM_TUNING: true
      ENABLE_SYSCTL_NET_TUNING: true
      ENABLE_ZSWAP: true
      ERROR_ON_CLONE: true
      FIXED_RANGE: 10.1.0.0/20
      FLOATING_RANGE: 172.24.5.0/24
      GIT_BASE: https://github.com
      HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
      LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
      LOGFILE: /opt/stack/logs/devstacklog.txt
      LOG_COLOR: false
      MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
      MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
      MANILA_ENABLED_BACKENDS: generic
      MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
      NETWORK_GATEWAY: 10.1.0.1
      NOVA_LIBVIRT_TB_CACHE_SIZE: 128
      NOVA_VNC_ENABLED: true
      OCTAVIA_NODE: api
      OVN_DBS_LOG_LEVEL: dbg
      PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
      PUBLIC_NETWORK_GATEWAY: 172.24.5.1
      RABBIT_PASSWORD: secretrabbit
      SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      SERVICE_PASSWORD: secretservice
      SWIFT_HASH: 1234123412341234
      SWIFT_REPLICAS: 1
      SWIFT_START_ALL_SERVICES: false
      VERBOSE: true
      VERBOSE_NO_TIMESTAMP: true
    devstack_plugins:
      barbican: https://github.com/openstack/barbican
      magnum: https://review.opendev.org/openstack/magnum
      magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
      manila: https://github.com/openstack/manila
      octavia: https://github.com/openstack/octavia
      ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
    devstack_services:
      base: false
      c-api: true
      c-bak: true
      c-sch: true
      c-vol: true
      dstat: false
      etcd3: true
      file_tracker: true
      g-api: true
      horizon: false
      key: true
      memory_tracker: true
      mysql: true
      n-api: true
      n-api-meta: true
      n-cond: true
      n-cpu: true
      n-novnc: true
      n-sch: true
      o-api: true
      o-da: true
      o-hk: true
      octavia: true
      openstack-cli-server: true
      ovn-controller: true
      ovn-northd: true
      ovs-vswitchd: true
      ovsdb-server: true
      placement-api: true
      q-ovn-agent: true
      q-svc: true
      rabbit: true
      s-account: false
      s-container: false
      s-object: false
      s-proxy: false
      tempest: false
      tls-proxy: true
    extensions_to_txt:
      auto: true
      conf: true
      localrc: true
      log: true
      stackenv: true
    image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
      kube_tag }}.qcow2
    kube_tag: v1.34.7
    network_driver: cilium
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job openstack-multinode-fips explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#17>'
      - '<Job devstack-base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#368>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#502>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#545>'
      - '<Job magnum-cluster-api-devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-hydrophone explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#60>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#90>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7-cilium explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#102>'
      - '<Job magnum-cluster-api-hydrophone-v1.34.7-cilium explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: b285eba473714fd2a260a04218d4d80d
      build_refs:
      - branch: main
        change: '1013'
        change_message: "feat: configurable kubelet flags via kubelet_extra_args cluster
          label\n\n## Problem\n\nOperators have no way to tune kubelet runtime configuration
          through the Magnum cluster_template / cluster label surface. The most common
          knob they need is `--max-pods`: kubeadm/kubelet defaults to **110**, which
          is too low for high-density node groups \u2014 BM with many small pods,
          GPU nodes hosting many sidecars, all-in-one dev/test workloads, etc.\n\nThe
          current workaround is to SSH to every node and edit `/var/lib/kubelet/config.yaml`
          by hand after the cluster is up. That:\n- doesn't survive rolling-replace,\n-
          has to be repeated after every node group scale-up, and\n- is exactly the
          kind of post-hoc fix-up CAPI was meant to eliminate.\n\n## Solution\n\nAdd
          a new `kubeletConfig` ClusterClass feature that forwards operator-supplied
          kubelet flags into `kubeletExtraArgs` at all three node-registration sites:\n\n|
          Site | Path |\n|---|---|\n| KubeadmControlPlaneTemplate `initConfiguration`
          | first control-plane node |\n| KubeadmControlPlaneTemplate `joinConfiguration`
          | additional control-plane nodes |\n| KubeadmConfigTemplate `joinConfiguration`
          (default-worker) | workers |\n\nThis release exposes a single field \u2014
          **`max_pods`** \u2014 mapped to kubelet \\`--max-pods=<N>\\`.\n\n### Why
          a struct, not a flat scalar?\n\nThe Rust type is \\`struct KubeletConfig
          { max_pods: String }\\` rather than a top-level \\`maxPods\\`. This intentionally
          leaves room to add more kubelet knobs without another schema change:\n-
          \\`systemReserved\\` / \\`kubeReserved\\`\n- \\`evictionHard\\` / \\`evictionSoft\\`\n-
          \\`podPidsLimit\\`\n- \\`maxOpenFiles\\`\n- \\`registerWithTaints\\`\n\nEach
          future knob is one new field on \\`KubeletConfig\\` plus one more JSON-patch
          in \\`kubelet_config.rs\\`.\n\n## Operator UX\n\n\\`\\`\\`bash\nopenstack
          coe cluster template create my-template \\\\\n    --labels max_pods=250,kube_tag=v1.34.3\n\\`\\`\\`\n\n##
          Behaviour\n\n- Operator passes \\`--labels max_pods=250\\` on the cluster
          template or cluster.\n- Magnum reads the label and sets the \\`kubeletConfig.maxPods\\`
          CAPI topology variable (defaults to \\`\\\"\\\"\\` when unset).\n- The patch
          is gated by \\`enabledIf\\` so existing clusters that never set the label
          are **completely untouched** (no spurious rollouts).\n- Empty string and
          the literal \\`\\\"0\\\"\\` are both treated as 'do not patch'.\n\n## Tests\n\n-
          3 new unit tests in \\`src/features/kubelet_config.rs\\` covering explicit
          value, unset, and explicit \\\"0\\\".\n- \\`src/resources.rs\\` topology-variable
          count bumped from 39 to 40, and a \\`kubeletConfig\\` assertion added.\n\n\\`\\`\\`\ntest
          result: ok. 145 passed; 0 failed\n\\`\\`\\`\n\n## Why draft?\n\nOpening
          as **draft** to gather feedback on:\n1. **Naming** \u2014 \\`kubeletConfig\\`
          (struct) vs \\`maxPods\\` (flat scalar). I went with the struct for future
          extensibility but happy to flatten if reviewers prefer.\n2. **Label name**
          \u2014 chose \\`max_pods\\` to match the kubelet flag spelling (\\`--max-pods\\`);
          could also be \\`kubelet_max_pods\\` to namespace it.\n3. **Validation**
          \u2014 currently no server-side check that \\`max_pods\\` is a positive
          integer. Should this be validated at the Magnum API layer or left to the
          kubelet to reject?\n4. **Scope** \u2014 happy to add 1-2 more knobs (e.g.
          \\`systemReserved\\`, \\`podPidsLimit\\`) in the same PR if reviewers want
          it landed as a more complete API.\n\n## Related\n\nCloses the kubelet-\\`maxPods\\`
          foot-gun tracked as gap #4 in [vexxhost/atmosphere bm-mcapi-fixes branch](https://github.com/vexxhost/atmosphere/tree/bm-mcapi-fixes/roles/ironic_emulator_nodes)."
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
        patchset: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
        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: 05a087afca0f4633b2e643cb6fdb39a2
      buildset_refs:
      - branch: main
        change: '1013'
        change_message: "feat: configurable kubelet flags via kubelet_extra_args cluster
          label\n\n## Problem\n\nOperators have no way to tune kubelet runtime configuration
          through the Magnum cluster_template / cluster label surface. The most common
          knob they need is `--max-pods`: kubeadm/kubelet defaults to **110**, which
          is too low for high-density node groups \u2014 BM with many small pods,
          GPU nodes hosting many sidecars, all-in-one dev/test workloads, etc.\n\nThe
          current workaround is to SSH to every node and edit `/var/lib/kubelet/config.yaml`
          by hand after the cluster is up. That:\n- doesn't survive rolling-replace,\n-
          has to be repeated after every node group scale-up, and\n- is exactly the
          kind of post-hoc fix-up CAPI was meant to eliminate.\n\n## Solution\n\nAdd
          a new `kubeletConfig` ClusterClass feature that forwards operator-supplied
          kubelet flags into `kubeletExtraArgs` at all three node-registration sites:\n\n|
          Site | Path |\n|---|---|\n| KubeadmControlPlaneTemplate `initConfiguration`
          | first control-plane node |\n| KubeadmControlPlaneTemplate `joinConfiguration`
          | additional control-plane nodes |\n| KubeadmConfigTemplate `joinConfiguration`
          (default-worker) | workers |\n\nThis release exposes a single field \u2014
          **`max_pods`** \u2014 mapped to kubelet \\`--max-pods=<N>\\`.\n\n### Why
          a struct, not a flat scalar?\n\nThe Rust type is \\`struct KubeletConfig
          { max_pods: String }\\` rather than a top-level \\`maxPods\\`. This intentionally
          leaves room to add more kubelet knobs without another schema change:\n-
          \\`systemReserved\\` / \\`kubeReserved\\`\n- \\`evictionHard\\` / \\`evictionSoft\\`\n-
          \\`podPidsLimit\\`\n- \\`maxOpenFiles\\`\n- \\`registerWithTaints\\`\n\nEach
          future knob is one new field on \\`KubeletConfig\\` plus one more JSON-patch
          in \\`kubelet_config.rs\\`.\n\n## Operator UX\n\n\\`\\`\\`bash\nopenstack
          coe cluster template create my-template \\\\\n    --labels max_pods=250,kube_tag=v1.34.3\n\\`\\`\\`\n\n##
          Behaviour\n\n- Operator passes \\`--labels max_pods=250\\` on the cluster
          template or cluster.\n- Magnum reads the label and sets the \\`kubeletConfig.maxPods\\`
          CAPI topology variable (defaults to \\`\\\"\\\"\\` when unset).\n- The patch
          is gated by \\`enabledIf\\` so existing clusters that never set the label
          are **completely untouched** (no spurious rollouts).\n- Empty string and
          the literal \\`\\\"0\\\"\\` are both treated as 'do not patch'.\n\n## Tests\n\n-
          3 new unit tests in \\`src/features/kubelet_config.rs\\` covering explicit
          value, unset, and explicit \\\"0\\\".\n- \\`src/resources.rs\\` topology-variable
          count bumped from 39 to 40, and a \\`kubeletConfig\\` assertion added.\n\n\\`\\`\\`\ntest
          result: ok. 145 passed; 0 failed\n\\`\\`\\`\n\n## Why draft?\n\nOpening
          as **draft** to gather feedback on:\n1. **Naming** \u2014 \\`kubeletConfig\\`
          (struct) vs \\`maxPods\\` (flat scalar). I went with the struct for future
          extensibility but happy to flatten if reviewers prefer.\n2. **Label name**
          \u2014 chose \\`max_pods\\` to match the kubelet flag spelling (\\`--max-pods\\`);
          could also be \\`kubelet_max_pods\\` to namespace it.\n3. **Validation**
          \u2014 currently no server-side check that \\`max_pods\\` is a positive
          integer. Should this be validated at the Magnum API layer or left to the
          kubelet to reject?\n4. **Scope** \u2014 happy to add 1-2 more knobs (e.g.
          \\`systemReserved\\`, \\`podPidsLimit\\`) in the same PR if reviewers want
          it landed as a more complete API.\n\n## Related\n\nCloses the kubelet-\\`maxPods\\`
          foot-gun tracked as gap #4 in [vexxhost/atmosphere bm-mcapi-fixes branch](https://github.com/vexxhost/atmosphere/tree/bm-mcapi-fixes/roles/ironic_emulator_nodes)."
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
        patchset: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
        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: "feat: configurable kubelet flags via kubelet_extra_args cluster
        label\n\n## Problem\n\nOperators have no way to tune kubelet runtime configuration
        through the Magnum cluster_template / cluster label surface. The most common
        knob they need is `--max-pods`: kubeadm/kubelet defaults to **110**, which
        is too low for high-density node groups \u2014 BM with many small pods, GPU
        nodes hosting many sidecars, all-in-one dev/test workloads, etc.\n\nThe current
        workaround is to SSH to every node and edit `/var/lib/kubelet/config.yaml`
        by hand after the cluster is up. That:\n- doesn't survive rolling-replace,\n-
        has to be repeated after every node group scale-up, and\n- is exactly the
        kind of post-hoc fix-up CAPI was meant to eliminate.\n\n## Solution\n\nAdd
        a new `kubeletConfig` ClusterClass feature that forwards operator-supplied
        kubelet flags into `kubeletExtraArgs` at all three node-registration sites:\n\n|
        Site | Path |\n|---|---|\n| KubeadmControlPlaneTemplate `initConfiguration`
        | first control-plane node |\n| KubeadmControlPlaneTemplate `joinConfiguration`
        | additional control-plane nodes |\n| KubeadmConfigTemplate `joinConfiguration`
        (default-worker) | workers |\n\nThis release exposes a single field \u2014
        **`max_pods`** \u2014 mapped to kubelet \\`--max-pods=<N>\\`.\n\n### Why a
        struct, not a flat scalar?\n\nThe Rust type is \\`struct KubeletConfig { max_pods:
        String }\\` rather than a top-level \\`maxPods\\`. This intentionally leaves
        room to add more kubelet knobs without another schema change:\n- \\`systemReserved\\`
        / \\`kubeReserved\\`\n- \\`evictionHard\\` / \\`evictionSoft\\`\n- \\`podPidsLimit\\`\n-
        \\`maxOpenFiles\\`\n- \\`registerWithTaints\\`\n\nEach future knob is one
        new field on \\`KubeletConfig\\` plus one more JSON-patch in \\`kubelet_config.rs\\`.\n\n##
        Operator UX\n\n\\`\\`\\`bash\nopenstack coe cluster template create my-template
        \\\\\n    --labels max_pods=250,kube_tag=v1.34.3\n\\`\\`\\`\n\n## Behaviour\n\n-
        Operator passes \\`--labels max_pods=250\\` on the cluster template or cluster.\n-
        Magnum reads the label and sets the \\`kubeletConfig.maxPods\\` CAPI topology
        variable (defaults to \\`\\\"\\\"\\` when unset).\n- The patch is gated by
        \\`enabledIf\\` so existing clusters that never set the label are **completely
        untouched** (no spurious rollouts).\n- Empty string and the literal \\`\\\"0\\\"\\`
        are both treated as 'do not patch'.\n\n## Tests\n\n- 3 new unit tests in \\`src/features/kubelet_config.rs\\`
        covering explicit value, unset, and explicit \\\"0\\\".\n- \\`src/resources.rs\\`
        topology-variable count bumped from 39 to 40, and a \\`kubeletConfig\\` assertion
        added.\n\n\\`\\`\\`\ntest result: ok. 145 passed; 0 failed\n\\`\\`\\`\n\n##
        Why draft?\n\nOpening as **draft** to gather feedback on:\n1. **Naming** \u2014
        \\`kubeletConfig\\` (struct) vs \\`maxPods\\` (flat scalar). I went with the
        struct for future extensibility but happy to flatten if reviewers prefer.\n2.
        **Label name** \u2014 chose \\`max_pods\\` to match the kubelet flag spelling
        (\\`--max-pods\\`); could also be \\`kubelet_max_pods\\` to namespace it.\n3.
        **Validation** \u2014 currently no server-side check that \\`max_pods\\` is
        a positive integer. Should this be validated at the Magnum API layer or left
        to the kubelet to reject?\n4. **Scope** \u2014 happy to add 1-2 more knobs
        (e.g. \\`systemReserved\\`, \\`podPidsLimit\\`) in the same PR if reviewers
        want it landed as a more complete API.\n\n## Related\n\nCloses the kubelet-\\`maxPods\\`
        foot-gun tracked as gap #4 in [vexxhost/atmosphere bm-mcapi-fixes branch](https://github.com/vexxhost/atmosphere/tree/bm-mcapi-fixes/roles/ironic_emulator_nodes)."
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
      child_jobs: []
      commit_id: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
      event_id: 84311780-5033-11f1-8ac2-4c4e91f95de6
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/b285eba473714fd2a260a04218d4d80d/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/b285eba473714fd2a260a04218d4d80d/work/logs
        result_data_file: /var/lib/zuul/builds/b285eba473714fd2a260a04218d4d80d/work/results.json
        src_root: /var/lib/zuul/builds/b285eba473714fd2a260a04218d4d80d/work/src
        work_root: /var/lib/zuul/builds/b285eba473714fd2a260a04218d4d80d/work
      include_vars: []
      items:
      - branch: main
        change: '1013'
        change_message: "feat: configurable kubelet flags via kubelet_extra_args cluster
          label\n\n## Problem\n\nOperators have no way to tune kubelet runtime configuration
          through the Magnum cluster_template / cluster label surface. The most common
          knob they need is `--max-pods`: kubeadm/kubelet defaults to **110**, which
          is too low for high-density node groups \u2014 BM with many small pods,
          GPU nodes hosting many sidecars, all-in-one dev/test workloads, etc.\n\nThe
          current workaround is to SSH to every node and edit `/var/lib/kubelet/config.yaml`
          by hand after the cluster is up. That:\n- doesn't survive rolling-replace,\n-
          has to be repeated after every node group scale-up, and\n- is exactly the
          kind of post-hoc fix-up CAPI was meant to eliminate.\n\n## Solution\n\nAdd
          a new `kubeletConfig` ClusterClass feature that forwards operator-supplied
          kubelet flags into `kubeletExtraArgs` at all three node-registration sites:\n\n|
          Site | Path |\n|---|---|\n| KubeadmControlPlaneTemplate `initConfiguration`
          | first control-plane node |\n| KubeadmControlPlaneTemplate `joinConfiguration`
          | additional control-plane nodes |\n| KubeadmConfigTemplate `joinConfiguration`
          (default-worker) | workers |\n\nThis release exposes a single field \u2014
          **`max_pods`** \u2014 mapped to kubelet \\`--max-pods=<N>\\`.\n\n### Why
          a struct, not a flat scalar?\n\nThe Rust type is \\`struct KubeletConfig
          { max_pods: String }\\` rather than a top-level \\`maxPods\\`. This intentionally
          leaves room to add more kubelet knobs without another schema change:\n-
          \\`systemReserved\\` / \\`kubeReserved\\`\n- \\`evictionHard\\` / \\`evictionSoft\\`\n-
          \\`podPidsLimit\\`\n- \\`maxOpenFiles\\`\n- \\`registerWithTaints\\`\n\nEach
          future knob is one new field on \\`KubeletConfig\\` plus one more JSON-patch
          in \\`kubelet_config.rs\\`.\n\n## Operator UX\n\n\\`\\`\\`bash\nopenstack
          coe cluster template create my-template \\\\\n    --labels max_pods=250,kube_tag=v1.34.3\n\\`\\`\\`\n\n##
          Behaviour\n\n- Operator passes \\`--labels max_pods=250\\` on the cluster
          template or cluster.\n- Magnum reads the label and sets the \\`kubeletConfig.maxPods\\`
          CAPI topology variable (defaults to \\`\\\"\\\"\\` when unset).\n- The patch
          is gated by \\`enabledIf\\` so existing clusters that never set the label
          are **completely untouched** (no spurious rollouts).\n- Empty string and
          the literal \\`\\\"0\\\"\\` are both treated as 'do not patch'.\n\n## Tests\n\n-
          3 new unit tests in \\`src/features/kubelet_config.rs\\` covering explicit
          value, unset, and explicit \\\"0\\\".\n- \\`src/resources.rs\\` topology-variable
          count bumped from 39 to 40, and a \\`kubeletConfig\\` assertion added.\n\n\\`\\`\\`\ntest
          result: ok. 145 passed; 0 failed\n\\`\\`\\`\n\n## Why draft?\n\nOpening
          as **draft** to gather feedback on:\n1. **Naming** \u2014 \\`kubeletConfig\\`
          (struct) vs \\`maxPods\\` (flat scalar). I went with the struct for future
          extensibility but happy to flatten if reviewers prefer.\n2. **Label name**
          \u2014 chose \\`max_pods\\` to match the kubelet flag spelling (\\`--max-pods\\`);
          could also be \\`kubelet_max_pods\\` to namespace it.\n3. **Validation**
          \u2014 currently no server-side check that \\`max_pods\\` is a positive
          integer. Should this be validated at the Magnum API layer or left to the
          kubelet to reject?\n4. **Scope** \u2014 happy to add 1-2 more knobs (e.g.
          \\`systemReserved\\`, \\`podPidsLimit\\`) in the same PR if reviewers want
          it landed as a more complete API.\n\n## Related\n\nCloses the kubelet-\\`maxPods\\`
          foot-gun tracked as gap #4 in [vexxhost/atmosphere bm-mcapi-fixes branch](https://github.com/vexxhost/atmosphere/tree/bm-mcapi-fixes/roles/ironic_emulator_nodes)."
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1013
        commit_id: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
        patchset: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      job: magnum-cluster-api-hydrophone-v1.34.7-cilium
      jobtags: []
      max_attempts: 3
      message: ZmVhdDogY29uZmlndXJhYmxlIGt1YmVsZXQgZmxhZ3MgdmlhIGt1YmVsZXRfZXh0cmFfYXJncyBjbHVzdGVyIGxhYmVsCgojIyBQcm9ibGVtCgpPcGVyYXRvcnMgaGF2ZSBubyB3YXkgdG8gdHVuZSBrdWJlbGV0IHJ1bnRpbWUgY29uZmlndXJhdGlvbiB0aHJvdWdoIHRoZSBNYWdudW0gY2x1c3Rlcl90ZW1wbGF0ZSAvIGNsdXN0ZXIgbGFiZWwgc3VyZmFjZS4gVGhlIG1vc3QgY29tbW9uIGtub2IgdGhleSBuZWVkIGlzIGAtLW1heC1wb2RzYDoga3ViZWFkbS9rdWJlbGV0IGRlZmF1bHRzIHRvICoqMTEwKiosIHdoaWNoIGlzIHRvbyBsb3cgZm9yIGhpZ2gtZGVuc2l0eSBub2RlIGdyb3VwcyDigJQgQk0gd2l0aCBtYW55IHNtYWxsIHBvZHMsIEdQVSBub2RlcyBob3N0aW5nIG1hbnkgc2lkZWNhcnMsIGFsbC1pbi1vbmUgZGV2L3Rlc3Qgd29ya2xvYWRzLCBldGMuCgpUaGUgY3VycmVudCB3b3JrYXJvdW5kIGlzIHRvIFNTSCB0byBldmVyeSBub2RlIGFuZCBlZGl0IGAvdmFyL2xpYi9rdWJlbGV0L2NvbmZpZy55YW1sYCBieSBoYW5kIGFmdGVyIHRoZSBjbHVzdGVyIGlzIHVwLiBUaGF0OgotIGRvZXNuJ3Qgc3Vydml2ZSByb2xsaW5nLXJlcGxhY2UsCi0gaGFzIHRvIGJlIHJlcGVhdGVkIGFmdGVyIGV2ZXJ5IG5vZGUgZ3JvdXAgc2NhbGUtdXAsIGFuZAotIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgcG9zdC1ob2MgZml4LXVwIENBUEkgd2FzIG1lYW50IHRvIGVsaW1pbmF0ZS4KCiMjIFNvbHV0aW9uCgpBZGQgYSBuZXcgYGt1YmVsZXRDb25maWdgIENsdXN0ZXJDbGFzcyBmZWF0dXJlIHRoYXQgZm9yd2FyZHMgb3BlcmF0b3Itc3VwcGxpZWQga3ViZWxldCBmbGFncyBpbnRvIGBrdWJlbGV0RXh0cmFBcmdzYCBhdCBhbGwgdGhyZWUgbm9kZS1yZWdpc3RyYXRpb24gc2l0ZXM6Cgp8IFNpdGUgfCBQYXRoIHwKfC0tLXwtLS18CnwgS3ViZWFkbUNvbnRyb2xQbGFuZVRlbXBsYXRlIGBpbml0Q29uZmlndXJhdGlvbmAgfCBmaXJzdCBjb250cm9sLXBsYW5lIG5vZGUgfAp8IEt1YmVhZG1Db250cm9sUGxhbmVUZW1wbGF0ZSBgam9pbkNvbmZpZ3VyYXRpb25gIHwgYWRkaXRpb25hbCBjb250cm9sLXBsYW5lIG5vZGVzIHwKfCBLdWJlYWRtQ29uZmlnVGVtcGxhdGUgYGpvaW5Db25maWd1cmF0aW9uYCAoZGVmYXVsdC13b3JrZXIpIHwgd29ya2VycyB8CgpUaGlzIHJlbGVhc2UgZXhwb3NlcyBhIHNpbmdsZSBmaWVsZCDigJQgKipgbWF4X3BvZHNgKiog4oCUIG1hcHBlZCB0byBrdWJlbGV0IFxgLS1tYXgtcG9kcz08Tj5cYC4KCiMjIyBXaHkgYSBzdHJ1Y3QsIG5vdCBhIGZsYXQgc2NhbGFyPwoKVGhlIFJ1c3QgdHlwZSBpcyBcYHN0cnVjdCBLdWJlbGV0Q29uZmlnIHsgbWF4X3BvZHM6IFN0cmluZyB9XGAgcmF0aGVyIHRoYW4gYSB0b3AtbGV2ZWwgXGBtYXhQb2RzXGAuIFRoaXMgaW50ZW50aW9uYWxseSBsZWF2ZXMgcm9vbSB0byBhZGQgbW9yZSBrdWJlbGV0IGtub2JzIHdpdGhvdXQgYW5vdGhlciBzY2hlbWEgY2hhbmdlOgotIFxgc3lzdGVtUmVzZXJ2ZWRcYCAvIFxga3ViZVJlc2VydmVkXGAKLSBcYGV2aWN0aW9uSGFyZFxgIC8gXGBldmljdGlvblNvZnRcYAotIFxgcG9kUGlkc0xpbWl0XGAKLSBcYG1heE9wZW5GaWxlc1xgCi0gXGByZWdpc3RlcldpdGhUYWludHNcYAoKRWFjaCBmdXR1cmUga25vYiBpcyBvbmUgbmV3IGZpZWxkIG9uIFxgS3ViZWxldENvbmZpZ1xgIHBsdXMgb25lIG1vcmUgSlNPTi1wYXRjaCBpbiBcYGt1YmVsZXRfY29uZmlnLnJzXGAuCgojIyBPcGVyYXRvciBVWAoKXGBcYFxgYmFzaApvcGVuc3RhY2sgY29lIGNsdXN0ZXIgdGVtcGxhdGUgY3JlYXRlIG15LXRlbXBsYXRlIFxcCiAgICAtLWxhYmVscyBtYXhfcG9kcz0yNTAsa3ViZV90YWc9djEuMzQuMwpcYFxgXGAKCiMjIEJlaGF2aW91cgoKLSBPcGVyYXRvciBwYXNzZXMgXGAtLWxhYmVscyBtYXhfcG9kcz0yNTBcYCBvbiB0aGUgY2x1c3RlciB0ZW1wbGF0ZSBvciBjbHVzdGVyLgotIE1hZ251bSByZWFkcyB0aGUgbGFiZWwgYW5kIHNldHMgdGhlIFxga3ViZWxldENvbmZpZy5tYXhQb2RzXGAgQ0FQSSB0b3BvbG9neSB2YXJpYWJsZSAoZGVmYXVsdHMgdG8gXGBcIlwiXGAgd2hlbiB1bnNldCkuCi0gVGhlIHBhdGNoIGlzIGdhdGVkIGJ5IFxgZW5hYmxlZElmXGAgc28gZXhpc3RpbmcgY2x1c3RlcnMgdGhhdCBuZXZlciBzZXQgdGhlIGxhYmVsIGFyZSAqKmNvbXBsZXRlbHkgdW50b3VjaGVkKiogKG5vIHNwdXJpb3VzIHJvbGxvdXRzKS4KLSBFbXB0eSBzdHJpbmcgYW5kIHRoZSBsaXRlcmFsIFxgXCIwXCJcYCBhcmUgYm90aCB0cmVhdGVkIGFzICdkbyBub3QgcGF0Y2gnLgoKIyMgVGVzdHMKCi0gMyBuZXcgdW5pdCB0ZXN0cyBpbiBcYHNyYy9mZWF0dXJlcy9rdWJlbGV0X2NvbmZpZy5yc1xgIGNvdmVyaW5nIGV4cGxpY2l0IHZhbHVlLCB1bnNldCwgYW5kIGV4cGxpY2l0IFwiMFwiLgotIFxgc3JjL3Jlc291cmNlcy5yc1xgIHRvcG9sb2d5LXZhcmlhYmxlIGNvdW50IGJ1bXBlZCBmcm9tIDM5IHRvIDQwLCBhbmQgYSBcYGt1YmVsZXRDb25maWdcYCBhc3NlcnRpb24gYWRkZWQuCgpcYFxgXGAKdGVzdCByZXN1bHQ6IG9rLiAxNDUgcGFzc2VkOyAwIGZhaWxlZApcYFxgXGAKCiMjIFdoeSBkcmFmdD8KCk9wZW5pbmcgYXMgKipkcmFmdCoqIHRvIGdhdGhlciBmZWVkYmFjayBvbjoKMS4gKipOYW1pbmcqKiDigJQgXGBrdWJlbGV0Q29uZmlnXGAgKHN0cnVjdCkgdnMgXGBtYXhQb2RzXGAgKGZsYXQgc2NhbGFyKS4gSSB3ZW50IHdpdGggdGhlIHN0cnVjdCBmb3IgZnV0dXJlIGV4dGVuc2liaWxpdHkgYnV0IGhhcHB5IHRvIGZsYXR0ZW4gaWYgcmV2aWV3ZXJzIHByZWZlci4KMi4gKipMYWJlbCBuYW1lKiog4oCUIGNob3NlIFxgbWF4X3BvZHNcYCB0byBtYXRjaCB0aGUga3ViZWxldCBmbGFnIHNwZWxsaW5nIChcYC0tbWF4LXBvZHNcYCk7IGNvdWxkIGFsc28gYmUgXGBrdWJlbGV0X21heF9wb2RzXGAgdG8gbmFtZXNwYWNlIGl0LgozLiAqKlZhbGlkYXRpb24qKiDigJQgY3VycmVudGx5IG5vIHNlcnZlci1zaWRlIGNoZWNrIHRoYXQgXGBtYXhfcG9kc1xgIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4gU2hvdWxkIHRoaXMgYmUgdmFsaWRhdGVkIGF0IHRoZSBNYWdudW0gQVBJIGxheWVyIG9yIGxlZnQgdG8gdGhlIGt1YmVsZXQgdG8gcmVqZWN0Pwo0LiAqKlNjb3BlKiog4oCUIGhhcHB5IHRvIGFkZCAxLTIgbW9yZSBrbm9icyAoZS5nLiBcYHN5c3RlbVJlc2VydmVkXGAsIFxgcG9kUGlkc0xpbWl0XGApIGluIHRoZSBzYW1lIFBSIGlmIHJldmlld2VycyB3YW50IGl0IGxhbmRlZCBhcyBhIG1vcmUgY29tcGxldGUgQVBJLgoKIyMgUmVsYXRlZAoKQ2xvc2VzIHRoZSBrdWJlbGV0LVxgbWF4UG9kc1xgIGZvb3QtZ3VuIHRyYWNrZWQgYXMgZ2FwICM0IGluIFt2ZXh4aG9zdC9hdG1vc3BoZXJlIGJtLW1jYXBpLWZpeGVzIGJyYW5jaF0oaHR0cHM6Ly9naXRodWIuY29tL3ZleHhob3N0L2F0bW9zcGhlcmUvdHJlZS9ibS1tY2FwaS1maXhlcy9yb2xlcy9pcm9uaWNfZW11bGF0b3Jfbm9kZXMpLg==
      override_checkout: master
      patchset: 6945fcd37d14c80e2e413b00c8af1f2b71a5cd85
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 79fe3eb1d01f8ac5739b0b7bc4759c407b6e248d
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: 81ed81ebbee6642f0959d6dd0480ed42ab383e30
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: 26e5947a427032d10118c88870adef4b7b95d3ee
          untrusted/project_2/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          untrusted/project_3/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 79fe3eb1d01f8ac5739b0b7bc4759c407b6e248d
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: d302f1ac8ee62df0d5814634d6430d7e8b792205
        playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/run.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_5/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/post.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_5/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/post.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/post_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_4/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_2/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_2/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_2/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_2/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_3/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_3/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_3/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_3/role_2/zuul-jobs/roles
        pre_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/pre.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_0/role_2/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/pre.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_4/zuul-jobs/roles
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/pre.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_2/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_2/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_5/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/magnum-cluster-api
        name: vexxhost/magnum-cluster-api
        short_name: magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
      projects:
        github.com/novnc/novnc:
          canonical_hostname: github.com
          canonical_name: github.com/novnc/novnc
          checkout: master
          checkout_description: job override ref
          commit: 8e1ebdffba02e651c399dacef841f8941f6ad6e4
          name: novnc/novnc
          required: true
          short_name: novnc
          src_dir: src/github.com/novnc/novnc
        github.com/vexxhost/magnum-cluster-api:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          checkout: main
          checkout_description: zuul branch
          commit: d302f1ac8ee62df0d5814634d6430d7e8b792205
          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: 2cc3f45017ceaada08e88a1cfb7e2fcb433b3e80
          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: d7515145399b45d23ff00e64b5ef9fc6ae55788e
          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: 81ed81ebbee6642f0959d6dd0480ed42ab383e30
          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: 65ec841ee94eff387affcd0df3fc7ec623b9b099
          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: bfa1c563e2349f55a663fcf6dd7aee2d9f6c31fe
          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: a6779b0edae3e4beaad496c4dd3ef4918878a644
          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: 7184b3bae701f0c69f49a393c591fb27c027e3e8
          name: openstack/nova
          required: true
          short_name: nova
          src_dir: src/opendev.org/openstack/nova
        opendev.org/openstack/octavia:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/octavia
          checkout: master
          checkout_description: job override ref
          commit: d16fa5e723701c95cf97a3e9ea57b3856e09aaa7
          name: openstack/octavia
          required: true
          short_name: octavia
          src_dir: src/opendev.org/openstack/octavia
        opendev.org/openstack/os-test-images:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/os-test-images
          checkout: master
          checkout_description: job override ref
          commit: 5d0367e03788764f41da8effffa14e3eac513201
          name: openstack/os-test-images
          required: true
          short_name: os-test-images
          src_dir: src/opendev.org/openstack/os-test-images
        opendev.org/openstack/ovn-octavia-provider:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/ovn-octavia-provider
          checkout: master
          checkout_description: job override ref
          commit: 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: bfc9dbc2aa9a113c12e591a87f774a6d986a981f
          name: openstack/python-magnumclient
          required: true
          short_name: python-magnumclient
          src_dir: src/opendev.org/openstack/python-magnumclient
        opendev.org/openstack/requirements:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/requirements
          checkout: master
          checkout_description: job override ref
          commit: 016f93e7ade7ccd65f23b34f720439a65fccb772
          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: 3b6a83b776ca2abaa357e0524e3b2431b7c18eb9
          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
