From 9bfaf421dbe7efd891ea141ac2141d508ef18cd7 Mon Sep 17 00:00:00 2001
From: Ricardo Rocha <rocha.porto@gmail.com>
Date: Wed, 10 Nov 2021 09:13:58 +0100
Subject: [PATCH 1/4] [cern] Add dual stack support

---
 .../kubernetes/fragments/calico-service.sh    | 17 ++++++++++--
 .../fragments/configure-kubernetes-master.sh  | 27 ++++++++++++++-----
 .../fragments/configure-kubernetes-minion.sh  | 16 +++++++++--
 .../kubernetes/fragments/core-dns-service.sh  | 14 ++++++++--
 .../kubernetes/fragments/make-cert.sh         |  1 +
 .../fragments/write-heat-params-master.sh     |  2 ++
 .../kubernetes/fragments/write-heat-params.sh |  1 +
 .../drivers/heat/k8s_fedora_template_def.py   |  1 +
 .../templates/kubecluster.yaml                | 13 +++++++++
 .../templates/kubemaster.yaml                 | 11 ++++++++
 .../templates/kubeminion.yaml                 |  5 ++++
 11 files changed, 96 insertions(+), 12 deletions(-)

diff --git a/magnum/drivers/common/templates/kubernetes/fragments/calico-service.sh b/magnum/drivers/common/templates/kubernetes/fragments/calico-service.sh
index 936cd89b3..dd238a031 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/calico-service.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/calico-service.sh
@@ -6,6 +6,17 @@ set +x
 . /etc/sysconfig/heat-params
 set -x
 
+kube_min_version=$(echo "${KUBE_TAG}" | cut -d'.' -f2)
+if [ "$kube_min_version" -ge "21" ]; then
+	ASSIGN_IP="\"assign_ipv4\": \"true\",\n              \"assign_ipv6\": \"true\""
+	FELIX_IPV6SUPPORT="true"
+	IP6_EXTRAS="- name: CALICO_IPV6POOL_CIDR\n              value: '2001:4860::0/108'\n            - name: IP6\n              value: autodetect\n"
+else
+	ASSIGN_IP="\"assign_ipv4\": \"true\""
+	FELIX_IPV6SUPPORT="false"
+	IP6_EXTRAS=""
+fi
+
 if [ "$NETWORK_DRIVER" = "calico" ]; then
     _prefix=${CONTAINER_INFRA_PREFIX:-quay.io/calico/}
 
@@ -280,7 +291,8 @@ data:
           "nodename": "__KUBERNETES_NODE_NAME__",
           "mtu": __CNI_MTU__,
           "ipam": {
-              "type": "calico-ipam"
+              "type": "calico-ipam",
+              $(echo -e "${ASSIGN_IP}")
           },
           "policy": {
               "type": "k8s"
@@ -470,7 +482,8 @@ spec:
               value: "ACCEPT"
             # Disable IPv6 on Kubernetes.
             - name: FELIX_IPV6SUPPORT
-              value: "false"
+              value: "${FELIX_IPV6SUPPORT}"
+            $(echo -e "${IP6_EXTRAS}")
             # Set Felix logging to "info"
             - name: FELIX_LOGSEVERITYSCREEN
               value: "info"
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh b/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh
index e5d8f4f5a..00968dcc4 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh
@@ -25,8 +25,20 @@ $ssh_cmd rm -rf /opt/cni/*
 $ssh_cmd mkdir -p /opt/cni/bin
 $ssh_cmd mkdir -p /etc/cni/net.d/
 
+kube_min_version=$(echo "${KUBE_TAG}" | cut -d'.' -f2)
+if [ "$kube_min_version" -ge "21" ]; then
+	CLUSTER_CIDR="${PODS_NETWORK_CIDR},${PODS_NETWORK6_CIDR}"
+	PORTAL_CIDR="${PORTAL_NETWORK_CIDR},${PORTAL_NETWORK6_CIDR}"
+	NODE_CIDR_MASK_SIZE_IPV6="--node-cidr-mask-size-ipv6=108"
+else
+	CLUSTER_CIDR="${PODS_NETWORK_CIDR}"
+	PORTAL_CIDR="${PORTAL_NETWORK_CIDR}"
+	NODE_CIDR_MASK_SIZE_IPV6=""
+fi
+
 if [ "$NETWORK_DRIVER" = "calico" ]; then
     echo "net.ipv4.conf.all.rp_filter = 1" >> /etc/sysctl.conf
+    echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
     $ssh_cmd sysctl -p
     if [ "`systemctl status NetworkManager.service | grep -o "Active: active"`" = "Active: active" ]; then
         CALICO_NM=/etc/NetworkManager/conf.d/calico.conf
@@ -45,6 +57,9 @@ elif [ "$NETWORK_DRIVER" = "flannel" ]; then
     echo "vxlan" > /etc/modules-load.d/vxlan.conf
 fi
 
+if [ "$kube_min_version" -ge "21" ]; then
+    $ssh_cmd 'ip a | grep 2001; while [ $? -ne 0 ]; do systemctl restart NetworkManager; sleep 5; ip a | grep 2001; done'
+fi
 
 KUBE_MASTER_URI="https://127.0.0.1:$KUBE_API_PORT"
 mkdir -p /srv/magnum/kubernetes/
@@ -291,7 +306,7 @@ CERT_DIR=/etc/kubernetes/certs
 
 # kube-proxy config
 PROXY_KUBECONFIG=/etc/kubernetes/proxy-kubeconfig.yaml
-KUBE_PROXY_ARGS="--kubeconfig=${PROXY_KUBECONFIG} --cluster-cidr=${PODS_NETWORK_CIDR} --hostname-override=${INSTANCE_NAME}"
+KUBE_PROXY_ARGS="--kubeconfig=${PROXY_KUBECONFIG} --cluster-cidr="${CLUSTER_CIDR}" --hostname-override=${INSTANCE_NAME}"
 cat > /etc/kubernetes/proxy << EOF
 KUBE_PROXY_ARGS="${KUBE_PROXY_ARGS} ${KUBEPROXY_OPTIONS}"
 EOF
@@ -387,7 +402,7 @@ fi
 
 if [ "$(echo $KUBE_CSI_ENABLED | tr '[:upper:]' '[:lower:]')" == "true" ]; then
     if [[ ! $KUBEAPI_OPTIONS == *"--feature-gates="* ]]; then
-        KUBE_API_ARGS="$KUBE_API_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true"
+        KUBE_API_ARGS="$KUBE_API_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true,IPv6DualStack=true,EndpointSlice=true"
     fi
     if [[ ! $KUBEAPI_OPTIONS == *"--runtime-config="* ]]; then
         KUBE_API_ARGS="$KUBE_API_ARGS --runtime-config=storage.k8s.io/v1alpha1=true"
@@ -421,7 +436,7 @@ fi
 
 sed -i '
     /^KUBE_API_ADDRESS=/ s/=.*/="'"${KUBE_API_ADDRESS}"'"/
-    /^KUBE_SERVICE_ADDRESSES=/ s|=.*|="--service-cluster-ip-range='"$PORTAL_NETWORK_CIDR"'"|
+    /^KUBE_SERVICE_ADDRESSES=/ s|=.*|="--service-cluster-ip-range='"${PORTAL_CIDR}"'"|
     /^KUBE_API_ARGS=/ s|=.*|="'"${KUBE_API_ARGS}"'"|
     /^KUBE_ETCD_SERVERS=/ s/=.*/="--etcd-servers=http:\/\/127.0.0.1:2379"/
     /^KUBE_ADMISSION_CONTROL=/ s/=.*/="'"${KUBE_ADMISSION_CONTROL}"'"/
@@ -459,7 +474,7 @@ export KUBECONFIG=${ADMIN_KUBECONFIG}
 KUBE_CONTROLLER_MANAGER_ARGS="--leader-elect=true --kubeconfig=/etc/kubernetes/admin.conf"
 KUBE_CONTROLLER_MANAGER_ARGS="$KUBE_CONTROLLER_MANAGER_ARGS --cluster-name=${CLUSTER_UUID}"
 KUBE_CONTROLLER_MANAGER_ARGS="${KUBE_CONTROLLER_MANAGER_ARGS} --allocate-node-cidrs=true"
-KUBE_CONTROLLER_MANAGER_ARGS="${KUBE_CONTROLLER_MANAGER_ARGS} --cluster-cidr=${PODS_NETWORK_CIDR}"
+KUBE_CONTROLLER_MANAGER_ARGS="${KUBE_CONTROLLER_MANAGER_ARGS} --cluster-cidr=${CLUSTER_CIDR} ${NODE_CIDR_MASK_SIZE_IPV6}"
 KUBE_CONTROLLER_MANAGER_ARGS="$KUBE_CONTROLLER_MANAGER_ARGS $KUBECONTROLLER_OPTIONS"
 if [ -n "${ADMISSION_CONTROL_LIST}" ] && [ "${TLS_DISABLED}" == "False" ]; then
     KUBE_CONTROLLER_MANAGER_ARGS="$KUBE_CONTROLLER_MANAGER_ARGS --service-account-private-key-file=$CERT_DIR/service_account_private.key --root-ca-file=$CERT_DIR/ca.crt"
@@ -479,7 +494,7 @@ fi
 
 if [ "$(echo $KUBE_CSI_ENABLED | tr '[:upper:]' '[:lower:]')" == "true" ]; then
     if [[ ! $KUBECONTROLLER_OPTIONS == *"--feature-gates="* ]]; then
-        KUBE_CONTROLLER_MANAGER_ARGS="$KUBE_CONTROLLER_MANAGER_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true"
+        KUBE_CONTROLLER_MANAGER_ARGS="$KUBE_CONTROLLER_MANAGER_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true,IPv6DualStack=true,EndpointSlice=true"
     fi
 fi
 
@@ -509,7 +524,7 @@ fi
 
 if [ "$(echo $KUBE_CSI_ENABLED | tr '[:upper:]' '[:lower:]')" == "true" ]; then
     if [[ ! $KUBELET_OPTIONS == *"--feature-gates="* ]]; then
-        KUBELET_ARGS="$KUBELET_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true"
+        KUBELET_ARGS="$KUBELET_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true,IPv6DualStack=true,EndpointSlice=true"
     fi
 fi
 
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-minion.sh b/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-minion.sh
index 0d62e1e9a..b1238e637 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-minion.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-minion.sh
@@ -27,8 +27,16 @@ $ssh_cmd mkdir -p /opt/cni/bin
 $ssh_cmd mkdir -p /etc/cni/net.d/
 _addtl_mounts=',{"type":"bind","source":"/opt/cni","destination":"/opt/cni","options":["bind","rw","slave","mode=777"]},{"type":"bind","source":"/var/lib/docker","destination":"/var/lib/docker","options":["bind","rw","slave","mode=755"]}'
 
+kube_min_version=$(echo "${KUBE_TAG}" | cut -d'.' -f2)
+if [ "$kube_min_version" -ge "21" ]; then
+	CLUSTER_CIDR="${PODS_NETWORK_CIDR},${PODS_NETWORK6_CIDR}"
+else
+	CLUSTER_CIDR="${PODS_NETWORK_CIDR}"
+fi
+
 if [ "$NETWORK_DRIVER" = "calico" ]; then
     echo "net.ipv4.conf.all.rp_filter = 1" >> /etc/sysctl.conf
+    echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
     $ssh_cmd sysctl -p
     if [ "$($ssh_cmd systemctl status NetworkManager.service | grep -o "Active: active")" = "Active: active" ]; then
         CALICO_NM=/etc/NetworkManager/conf.d/calico.conf
@@ -47,6 +55,10 @@ elif [ "$NETWORK_DRIVER" = "flannel" ]; then
     echo "vxlan" > /etc/modules-load.d/vxlan.conf
 fi
 
+if [ "$kube_min_version" -ge "21" ]; then
+    $ssh_cmd 'ip a | grep 2001; while [ $? -ne 0 ]; do systemctl restart NetworkManager; sleep 5; ip a | grep 2001; done'
+fi
+
 mkdir -p /srv/magnum/kubernetes/
 cat > /etc/kubernetes/config <<EOF
 KUBE_LOGTOSTDERR="--logtostderr=true"
@@ -295,7 +307,7 @@ KUBELET_ARGS="${KUBELET_ARGS} --network-plugin=cni --cni-conf-dir=/etc/cni/net.d
 
 if [ "$(echo $KUBE_CSI_ENABLED | tr '[:upper:]' '[:lower:]')" == "true" ]; then
     if [[ ! $KUBELET_OPTIONS == *"--feature-gates="* ]]; then
-        KUBELET_ARGS="$KUBELET_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true"
+        KUBELET_ARGS="$KUBELET_ARGS --feature-gates=KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true,IPv6DualStack=true,EndpointSlice=true"
     fi
 fi
 
@@ -306,7 +318,7 @@ sed -i '
     /^KUBELET_ARGS=/ s|=.*|="'"${KUBELET_ARGS}"'"|
 ' /etc/kubernetes/kubelet
 
-KUBE_PROXY_ARGS="--kubeconfig=${PROXY_KUBECONFIG} --cluster-cidr=${PODS_NETWORK_CIDR} --hostname-override=${INSTANCE_NAME}"
+KUBE_PROXY_ARGS="--kubeconfig=${PROXY_KUBECONFIG} --cluster-cidr="${CLUSTER_CIDR}" --hostname-override=${INSTANCE_NAME}"
 cat > /etc/kubernetes/proxy << EOF
 KUBE_PROXY_ARGS="${KUBE_PROXY_ARGS} ${KUBEPROXY_OPTIONS}"
 EOF
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/core-dns-service.sh b/magnum/drivers/common/templates/kubernetes/fragments/core-dns-service.sh
index 808c316c6..84c582508 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/core-dns-service.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/core-dns-service.sh
@@ -5,8 +5,17 @@ printf "Starting to run ${step}\n"
 
 _dns_prefix=${CONTAINER_INFRA_PREFIX:-docker.io/coredns/}
 _autoscaler_prefix=${CONTAINER_INFRA_PREFIX:-gcr.io/google_containers/}
-
 CORE_DNS=/srv/magnum/kubernetes/manifests/kube-coredns.yaml
+
+kube_min_version=$(echo "${KUBE_TAG}" | cut -d'.' -f2)
+if [ "$kube_min_version" -ge "21" ]; then
+    DNS_LIST="${DNS_CLUSTER_DOMAIN} ${PORTAL_NETWORK_CIDR} ${PORTAL_NETWORK6_CIDR} ${PODS_NETWORK_CIDR} ${PODS_NETWORK6_CIDR}"
+	IP_FAMILY_POLICY="ipFamilyPolicy: RequireDualStack"
+else
+    DNS_LIST="${DNS_CLUSTER_DOMAIN} ${PORTAL_NETWORK_CIDR} ${PODS_NETWORK_CIDR}"
+	IP_FAMILY_POLICY=""
+fi
+
 [ -f ${CORE_DNS} ] || {
     echo "Writing File: $CORE_DNS"
     mkdir -p $(dirname ${CORE_DNS})
@@ -71,7 +80,7 @@ data:
         errors
         log stdout
         health
-        kubernetes ${DNS_CLUSTER_DOMAIN} ${PORTAL_NETWORK_CIDR} ${PODS_NETWORK_CIDR} {
+        kubernetes ${DNS_LIST} {
            pods verified
            fallthrough in-addr.arpa ip6.arpa
         }
@@ -192,6 +201,7 @@ metadata:
     kubernetes.io/cluster-service: "true"
     kubernetes.io/name: "CoreDNS"
 spec:
+  ${IP_FAMILY_POLICY}
   selector:
     k8s-app: kube-dns
   clusterIP: ${DNS_SERVICE_IP}
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/make-cert.sh b/magnum/drivers/common/templates/kubernetes/fragments/make-cert.sh
index 2089f0833..223ae0dc5 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/make-cert.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/make-cert.sh
@@ -67,6 +67,7 @@ fi
 sans="${sans},IP:127.0.0.1"
 
 KUBE_SERVICE_IP=$(echo $PORTAL_NETWORK_CIDR | awk 'BEGIN{FS="[./]"; OFS="."}{print $1,$2,$3,$4 + 1}')
+# TODO: need ip6 here?
 
 sans="${sans},IP:${KUBE_SERVICE_IP}"
 
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params-master.sh b/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params-master.sh
index e05eabbab..d2d6eb515 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params-master.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params-master.sh
@@ -29,7 +29,9 @@ FLANNEL_NETWORK_CIDR="$FLANNEL_NETWORK_CIDR"
 FLANNEL_NETWORK_SUBNETLEN="$FLANNEL_NETWORK_SUBNETLEN"
 FLANNEL_BACKEND="$FLANNEL_BACKEND"
 PODS_NETWORK_CIDR="$PODS_NETWORK_CIDR"
+PODS_NETWORK6_CIDR="$PODS_NETWORK6_CIDR"
 PORTAL_NETWORK_CIDR="$PORTAL_NETWORK_CIDR"
+PORTAL_NETWORK6_CIDR="$PORTAL_NETWORK6_CIDR"
 ADMISSION_CONTROL_LIST="$ADMISSION_CONTROL_LIST"
 ETCD_DISCOVERY_URL="$ETCD_DISCOVERY_URL"
 USERNAME="$USERNAME"
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params.sh b/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params.sh
index 94ada8bd0..93b1e2e29 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/write-heat-params.sh
@@ -44,6 +44,7 @@ WAIT_CURL="$WAIT_CURL"
 KUBE_TAG="$KUBE_TAG"
 FLANNEL_NETWORK_CIDR="$FLANNEL_NETWORK_CIDR"
 PODS_NETWORK_CIDR="$PODS_NETWORK_CIDR"
+PODS_NETWORK6_CIDR="$PODS_NETWORK6_CIDR"
 KUBE_VERSION="$KUBE_VERSION"
 TRUSTEE_USER_ID="$TRUSTEE_USER_ID"
 TRUSTEE_PASSWORD="$TRUSTEE_PASSWORD"
diff --git a/magnum/drivers/heat/k8s_fedora_template_def.py b/magnum/drivers/heat/k8s_fedora_template_def.py
index dcdfe978d..c85e91be8 100644
--- a/magnum/drivers/heat/k8s_fedora_template_def.py
+++ b/magnum/drivers/heat/k8s_fedora_template_def.py
@@ -58,6 +58,7 @@ class K8sFedoraTemplateDefinition(k8s_template_def.K8sTemplateDefinition):
         if cluster_template.network_driver == 'calico':
             extra_params["pods_network_cidr"] = \
                 cluster.labels.get('calico_ipv4pool', '192.168.0.0/16')
+            extra_params["pods_network6_cidr"] = '2001:4860::0/108'
 
         # check cloud provider and cinder options. If cinder is selected,
         # the cloud provider needs to be enabled.
diff --git a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml
index e37d675a2..5a9e39c32 100644
--- a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml
+++ b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml
@@ -182,6 +182,12 @@ parameters:
       address range used by kubernetes for service portals
     default: 10.254.0.0/16
 
+  portal_network6_cidr:
+    type: string
+    description: >
+      address range used by kubernetes for service portals
+    default: "fd5e:d3bb:de2e::/108"
+
   network_driver:
     type: string
     description: network driver to use for instantiating container networks
@@ -593,6 +599,10 @@ parameters:
     type: string
     description: Configure the IP pool/range from which pod IPs will be chosen
 
+  pods_network6_cidr:
+    type: string
+    description: Configure the IP pool/range from which pod IPs will be chosen
+
   ingress_controller:
     type: string
     description: >
@@ -1271,6 +1281,7 @@ resources:
           system_pods_initial_delay: {get_param: system_pods_initial_delay}
           system_pods_timeout: {get_param: system_pods_timeout}
           portal_network_cidr: {get_param: portal_network_cidr}
+          portal_network6_cidr: {get_param: portal_network6_cidr}
           admission_control_list: {get_param: admission_control_list}
           discovery_url: {get_param: discovery_url}
           cluster_uuid: {get_param: cluster_uuid}
@@ -1323,6 +1334,7 @@ resources:
           calico_ipv4pool: {get_param: calico_ipv4pool}
           calico_ipv4pool_ipip: {get_param: calico_ipv4pool_ipip}
           pods_network_cidr: {get_param: pods_network_cidr}
+          pods_network6_cidr: {get_param: pods_network6_cidr}
           ingress_controller: {get_param: ingress_controller}
           ingress_controller_role: {get_param: ingress_controller_role}
           octavia_ingress_controller_tag: {get_param: octavia_ingress_controller_tag}
@@ -1593,6 +1605,7 @@ resources:
           nodes_server_group_id: {get_resource: worker_nodes_server_group}
           availability_zone: {get_param: availability_zone}
           pods_network_cidr: {get_param: pods_network_cidr}
+          pods_network6_cidr: {get_param: pods_network6_cidr}
           kubelet_options: {get_param: kubelet_options}
           kubeproxy_options: {get_param: kubeproxy_options}
           octavia_enabled: {get_param: octavia_enabled}
diff --git a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml
index 130e138af..f593adcda 100644
--- a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml
+++ b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml
@@ -56,6 +56,11 @@ parameters:
     description: >
       address range used by kubernetes for service portals
 
+  portal_network6_cidr:
+    type: string
+    description: >
+      address range used by kubernetes for service portals
+
   kube_allow_priv:
     type: string
     description: >
@@ -393,6 +398,10 @@ parameters:
     type: string
     description: Configure the IP pool/range from which pod IPs will be chosen
 
+  pods_network6_cidr:
+    type: string
+    description: Configure the IP pool/range from which pod IPs will be chosen
+
   ingress_controller:
     type: string
     description: >
@@ -936,7 +945,9 @@ resources:
                   "$SYSTEM_PODS_INITIAL_DELAY": {get_param: system_pods_initial_delay}
                   "$SYSTEM_PODS_TIMEOUT": {get_param: system_pods_timeout}
                   "$PODS_NETWORK_CIDR": {get_param: pods_network_cidr}
+                  "$PODS_NETWORK6_CIDR": {get_param: pods_network6_cidr}
                   "$PORTAL_NETWORK_CIDR": {get_param: portal_network_cidr}
+                  "$PORTAL_NETWORK6_CIDR": {get_param: portal_network6_cidr}
                   "$ADMISSION_CONTROL_LIST": {get_param: admission_control_list}
                   "$ETCD_DISCOVERY_URL": {get_param: discovery_url}
                   "$AUTH_URL": {get_param: auth_url}
diff --git a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubeminion.yaml b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubeminion.yaml
index b15a0ca53..dae78b075 100644
--- a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubeminion.yaml
+++ b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubeminion.yaml
@@ -274,6 +274,10 @@ parameters:
     type: string
     description: Configure the IP pool/range from which pod IPs will be chosen
 
+  pods_network6_cidr:
+    type: string
+    description: Configure the IP pool/range from which pod IPs will be chosen
+
   kubelet_options:
     type: string
     description: >
@@ -466,6 +470,7 @@ resources:
                   $KUBE_TAG: {get_param: kube_tag}
                   $FLANNEL_NETWORK_CIDR: {get_param: flannel_network_cidr}
                   $PODS_NETWORK_CIDR: {get_param: pods_network_cidr}
+                  $PODS_NETWORK6_CIDR: {get_param: pods_network6_cidr}
                   $KUBE_VERSION: {get_param: kube_version}
                   $TRUSTEE_USER_ID: {get_param: trustee_user_id}
                   $TRUSTEE_PASSWORD: {get_param: trustee_password}
-- 
GitLab


From fd296ed195a13d09a3e310b7db873afae092b4ce Mon Sep 17 00:00:00 2001
From: Ricardo Rocha <rocha.porto@gmail.com>
Date: Wed, 24 Nov 2021 12:55:39 +0100
Subject: [PATCH 2/4] [cern] fix snapshot params in kubecluster

---
 .../k8s_fedora_coreos_v1/templates/kubecluster.yaml       | 8 ++++----
 .../k8s_fedora_coreos_v1/templates/kubemaster.yaml        | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml
index 5a9e39c32..33af4b643 100644
--- a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml
+++ b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubecluster.yaml
@@ -1122,25 +1122,25 @@ parameters:
     description: base64 encoded helm values for the cern meta chart
     default: ""
 
-  snapshot_controller_enabled: {get_param: snapshot_controller_enabled}
+  snapshot_controller_enabled:
     type: boolean
     description: >
       Indicates whether snapshot controller should be started.
     default: false
 
-  snapshot_controller_version: {get_param: snapshot_controller_version}
+  snapshot_controller_version:
     type: string
     description: >
       Indicates the version of snapshot controller to use.
     default: "v0.2.0"
 
-  snapshot_validation_webhook_enabled: {get_param: snapshot_validation_webhook_enabled}
+  snapshot_validation_webhook_enabled:
     type: boolean
     description: >
       Indicates whether snapshot validation webhook should be started.
     default: false
 
-  snapshot_validation_webhook_version: {get_param: snapshot_validation_webhook_version}
+  snapshot_validation_webhook_version:
     type: string
     description: >
       Indicates the version of snapshot validation webhook to use.
diff --git a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml
index f593adcda..4667dc576 100644
--- a/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml
+++ b/magnum/drivers/k8s_fedora_coreos_v1/templates/kubemaster.yaml
@@ -834,25 +834,25 @@ parameters:
     description: The cern username of the user that creates the cluster
     default: ''
 
-  snapshot_controller_enabled: {get_param: snapshot_controller_enabled}
+  snapshot_controller_enabled:
     type: boolean
     description: >
       Indicates whether snapshot controller should be started.
     default: false
 
-  snapshot_controller_version: {get_param: snapshot_controller_version}
+  snapshot_controller_version:
     type: string
     description: >
       Indicates the version of snapshot controller to use.
     default: "v0.2.0"
 
-  snapshot_validation_webhook_enabled: {get_param: snapshot_validation_webhook_enabled}
+  snapshot_validation_webhook_enabled:
     type: boolean
     description: >
       Indicates whether snapshot validation webhook should be started.
     default: false
 
-  snapshot_validation_webhook_version: {get_param: snapshot_validation_webhook_version}
+  snapshot_validation_webhook_version:
     type: string
     description: >
       Indicates the version of snapshot validation webhook to use.
-- 
GitLab


From 648d0156a1ce7d2e2f2c91e6ddcbc2f52e7095eb Mon Sep 17 00:00:00 2001
From: Ricardo Rocha <rocha.porto@gmail.com>
Date: Wed, 24 Nov 2021 14:56:06 +0100
Subject: [PATCH 3/4] [cern] v1 for authorization resources, csidriver cvmfs

Move out of auth resources v1beta1, add csidriver definition to cvmfs
script since we moved cephfs csi to helm.

Restart network manager until we get an ipv6.
---
 .../kubernetes/fragments/configure-kubernetes-master.sh     | 2 +-
 .../common/templates/kubernetes/fragments/cvmfs-csi-1x.sh   | 4 ++--
 .../templates/kubernetes/fragments/enable-keystone-auth.sh  | 4 ++--
 .../kubernetes/fragments/kube-apiserver-to-kubelet-role.sh  | 6 +++---
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh b/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh
index 00968dcc4..5021c595a 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/configure-kubernetes-master.sh
@@ -50,7 +50,7 @@ if [ "$NETWORK_DRIVER" = "calico" ]; then
 unmanaged-devices=interface-name:cali*;interface-name:tunl*
 EOF
 }
-        systemctl restart NetworkManager
+        $ssh_cmd systemctl restart NetworkManager
     fi
 elif [ "$NETWORK_DRIVER" = "flannel" ]; then
     $ssh_cmd modprobe vxlan
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/cvmfs-csi-1x.sh b/magnum/drivers/common/templates/kubernetes/fragments/cvmfs-csi-1x.sh
index 4e94358c0..f2d989a56 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/cvmfs-csi-1x.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/cvmfs-csi-1x.sh
@@ -14,7 +14,7 @@ metadata:
   name: cvmfs-csi-nodeplugin
   namespace: kube-system
 ---
-apiVersion: policy/v1beta1
+apiVersion: policy/v1
 kind: PodSecurityPolicy
 metadata:
   name: cvmfs.privileged
@@ -242,7 +242,7 @@ roleRef:
   name: cvmfs-external-provisioner-cfg
   apiGroup: rbac.authorization.k8s.io
 ---
-apiVersion: storage.k8s.io/v1beta1
+apiVersion: storage.k8s.io/v1
 kind: CSIDriver
 metadata:
   name: csi-cvmfsplugin
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/enable-keystone-auth.sh b/magnum/drivers/common/templates/kubernetes/fragments/enable-keystone-auth.sh
index 2dd345ea4..8c3c2384e 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/enable-keystone-auth.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/enable-keystone-auth.sh
@@ -21,7 +21,7 @@ metadata:
   name: k8s-keystone-auth
   namespace: kube-system
 ---
-apiVersion: rbac.authorization.k8s.io/v1beta1
+apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
 metadata:
   labels:
@@ -39,7 +39,7 @@ rules:
   - list
   - watch
 ---
-apiVersion: rbac.authorization.k8s.io/v1beta1
+apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
   annotations:
diff --git a/magnum/drivers/common/templates/kubernetes/fragments/kube-apiserver-to-kubelet-role.sh b/magnum/drivers/common/templates/kubernetes/fragments/kube-apiserver-to-kubelet-role.sh
index 562c515d7..0b2c55a3a 100644
--- a/magnum/drivers/common/templates/kubernetes/fragments/kube-apiserver-to-kubelet-role.sh
+++ b/magnum/drivers/common/templates/kubernetes/fragments/kube-apiserver-to-kubelet-role.sh
@@ -12,7 +12,7 @@ do
 done
 
 cat <<EOF | kubectl apply --validate=false -f -
-apiVersion: rbac.authorization.k8s.io/v1beta1
+apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
 metadata:
   annotations:
@@ -34,7 +34,7 @@ rules:
 EOF
 
 cat <<EOF | kubectl apply --validate=false -f -
-apiVersion: rbac.authorization.k8s.io/v1beta1
+apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
   name: system:kube-apiserver
@@ -62,7 +62,7 @@ metadata:
   name: admin
   namespace: kube-system
 ---
-apiVersion: rbac.authorization.k8s.io/v1beta1
+apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
   name: admin
-- 
GitLab


From fe60a02a7b5f865527adb86d73e63a86f784e30a Mon Sep 17 00:00:00 2001
From: Ricardo Rocha <rocha.porto@gmail.com>
Date: Thu, 25 Nov 2021 13:46:12 +0100
Subject: [PATCH 4/4] [cern] move metrics-server to umbrella chart

---
 magnum/drivers/common/templates/kubernetes/helm/cern-chart.sh  | 2 ++
 .../drivers/common/templates/kubernetes/helm/metrics-server.sh | 3 ++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/magnum/drivers/common/templates/kubernetes/helm/cern-chart.sh b/magnum/drivers/common/templates/kubernetes/helm/cern-chart.sh
index fbc158625..4be926b7d 100644
--- a/magnum/drivers/common/templates/kubernetes/helm/cern-chart.sh
+++ b/magnum/drivers/common/templates/kubernetes/helm/cern-chart.sh
@@ -123,6 +123,8 @@ ${NVIDIA_GPU_VALUES}
         tag: ${TRAEFIK_INGRESS_CONTROLLER_TAG}
       nodeSelector:
         role: ${INGRESS_CONTROLLER_ROLE}
+    metrics-server:
+      enabled: ${METRICS_SERVER_ENABLED}
 EOF
 fi
 
diff --git a/magnum/drivers/common/templates/kubernetes/helm/metrics-server.sh b/magnum/drivers/common/templates/kubernetes/helm/metrics-server.sh
index 38d9043a6..e78e10e41 100755
--- a/magnum/drivers/common/templates/kubernetes/helm/metrics-server.sh
+++ b/magnum/drivers/common/templates/kubernetes/helm/metrics-server.sh
@@ -10,7 +10,8 @@ printf "Starting to run ${step}\n"
 ###############################################################################
 CHART_NAME="metrics-server"
 
-if [ "$(echo ${METRICS_SERVER_ENABLED} | tr '[:upper:]' '[:lower:]')" = "true" ]; then
+if [ "$(echo ${METRICS_SERVER_ENABLED} | tr '[:upper:]' '[:lower:]')" = "true" ] && \
+   [[ ( $(echo ${CERN_CHART_VERSION} | cut -d. -f2) -lt 9 ) ]]; then
 
     HELM_MODULE_CONFIG_FILE="/srv/magnum/kubernetes/helm/${CHART_NAME}.yaml"
     [ -f ${HELM_MODULE_CONFIG_FILE} ] || {
-- 
GitLab