Skip to content

Commit

Permalink
Merge pull request #2612 from ty-dc/e2e/calico-latest
Browse files Browse the repository at this point in the history
e2e: Support calico version use the latest
  • Loading branch information
weizhoublue authored Nov 17, 2023
2 parents 078a3c7 + 4795a43 commit 9a799c0
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 50 deletions.
2 changes: 1 addition & 1 deletion test/Makefile.defs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ E2E_MULTUS_IMAGE_NAME ?= $(E2E_MULTUS_IMAGE_REGISTER)/k8snetworkplumbingwg/multu


#================= calico
CALICO_VERSION ?= v3.25.0
CALICO_VERSION ?=

ifeq ($(E2E_CHINA_IMAGE_REGISTRY),true)
CALICO_IMAGE_REPO ?= docker.m.daocloud.io
Expand Down
152 changes: 103 additions & 49 deletions test/scripts/install-default-cni.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,15 @@ echo "$CURRENT_FILENAME : INSTALL_CILIUM $INSTALL_CILIUM "
[ -z "$CLUSTER_PATH" ] && echo "error, miss CLUSTER_PATH" && exit 1
echo "$CURRENT_FILENAME : CLUSTER_PATH $CLUSTER_PATH "

export CALICO_VERSION=${CALICO_VERSION:-"v3.25.0"}
DEST_CALICO_YAML_DIR=${PROJECT_ROOT_PATH}/test/.tmp/yamls
rm -rf ${DEST_CALICO_YAML_DIR}
mkdir -p ${DEST_CALICO_YAML_DIR}

CALICO_YAML=${DEST_CALICO_YAML_DIR}/calico.yaml
CALICO_CONFIG=${DEST_CALICO_YAML_DIR}/calico_config.yaml
CALICO_NODE=${DEST_CALICO_YAML_DIR}/calico_node.yaml

export CALICO_VERSION=${CALICO_VERSION:-""}
export INSTALL_TIME_OUT=${INSTALL_TIME_OUT:-"600s"}
export CALICO_IMAGE_REPO=${CALICO_IMAGE_REPO:-"docker.io"}
export CALICO_AUTODETECTION_METHOD=${CALICO_AUTODETECTION_METHOD:-"kubernetes-internal-ip"}
Expand All @@ -47,67 +55,113 @@ CILIUM_CLUSTER_POD_SUBNET_V6=${CILIUM_CLUSTER_POD_SUBNET_V6:-"fd00:10:244::/112"

function install_calico() {
cp ${PROJECT_ROOT_PATH}/test/yamls/calico.yaml $CLUSTER_PATH/calico.yaml
if [ -z "${CALICO_VERSION}" ]; then
[ -n "${HTTP_PROXY}" ] && CALICO_VERSION=$(curl --retry 3 -x "${HTTP_PROXY}" -s https://api.github.com/repos/projectcalico/calico/releases/latest | jq -r '.tag_name')
[ -z "${HTTP_PROXY}" ] && CALICO_VERSION=$(curl --retry 3 -s https://api.github.com/repos/projectcalico/calico/releases/latest | jq -r '.tag_name')
[ "${CALICO_VERSION}" == "null" ] && { echo "failed get calico version"; exit 1; }
else
CALICO_VERSION=${CALICO_VERSION}
fi
echo "install calico version ${CALICO_VERSION}"
[ -n "${HTTP_PROXY}" ] && curl --retry 3 -x "${HTTP_PROXY}" -Lo ${CALICO_YAML} https://raw.githubusercontent.com/projectcalico/calico/${CALICO_VERSION}/manifests/calico.yaml
[ -z "${HTTP_PROXY}" ] && curl --retry 3 -Lo ${CALICO_YAML} https://raw.githubusercontent.com/projectcalico/calico/${CALICO_VERSION}/manifests/calico.yaml

# set registry
if [ -n "${CALICO_IMAGE_REPO}" ]; then
grep -q -e ".*image:.*docker.io" ${CALICO_YAML} || { echo "failed find image"; exit 1; }
${SED_COMMAND} -i -E 's?(.*image:.*)(docker.io)(.*)?\1'"${CALICO_IMAGE_REPO}"'\3?g' ${CALICO_YAML}
fi

# accelerate local cluster , in case that it times out to wait calico ready
IMAGE_LIST=`cat ${CALICO_YAML} | grep "image: " | awk '{print \$2}' | sort | uniq | tr '\n' ' ' | tr '\r' ' ' `
echo "image: ${IMAGE_LIST}"
for IMAGE in ${IMAGE_LIST} ; do
echo "load calico image ${IMAGE} to kind cluster"
docker pull ${IMAGE}
kind load docker-image ${IMAGE} --name ${E2E_CLUSTER_NAME}
done

export KUBECONFIG=${E2E_KUBECONFIG}
kubectl apply -f ${CALICO_YAML}
sleep 3

kubectl wait --for=condition=ready -l k8s-app=calico-node --timeout=${INSTALL_TIME_OUT} pod -n kube-system
kubectl get po -n kube-system
echo -e "\033[35m Succeed to install Calico \033[0m"

echo -e "\033[35m Patch Calico \033[0m"
kubectl -n kube-system get cm calico-config -oyaml > ${CALICO_CONFIG}
kubectl -n kube-system get ds calico-node -oyaml > ${CALICO_NODE}

case ${E2E_IP_FAMILY} in
ipv4)
export CALICO_CNI_ASSIGN_IPV4=true
export CALICO_CNI_ASSIGN_IPV6=false
export CALICO_IP_AUTODETECT=autodetect
export CALICO_IP6_AUTODETECT=none
export CALICO_FELIX_IPV6SUPPORT=false
export CALICO_IPV6POOL_VXLAN=Never
# set configmap
configYaml=$(yq '.data.cni_network_config' ${CALICO_CONFIG} | yq '.plugins[0].ipam = {"type": "calico-ipam", "assign_ipv4": "true", "assign_ipv6": "false"}' --output-format=json)
configYaml=$configYaml yq e '.data.cni_network_config |= strenv(configYaml)' -i ${CALICO_CONFIG}
${SED_COMMAND} -i 's/"mtu": "__CNI_MTU__"/"mtu": __CNI_MTU__/g' ${CALICO_CONFIG}
kubectl -n kube-system patch cm calico-config --patch "$(cat ${CALICO_CONFIG})" || { echo "failed to patch calico configmap"; exit 1; }
;;
ipv6)
export CALICO_CNI_ASSIGN_IPV4=false
export CALICO_CNI_ASSIGN_IPV6=true
export CALICO_IP_AUTODETECT=none
export CALICO_IP6_AUTODETECT=autodetect
export CALICO_FELIX_IPV6SUPPORT=true
export CALICO_IPV6POOL_VXLAN=Always
# set configmap
configYaml=$(yq '.data.cni_network_config' ${CALICO_CONFIG} | yq '.plugins[0].ipam = {"type": "calico-ipam", "assign_ipv4": "false", "assign_ipv6": "true"}' --output-format=json)
configYaml=$configYaml yq e '.data.cni_network_config |= strenv(configYaml)' -i ${CALICO_CONFIG}
${SED_COMMAND} -i 's/"mtu": "__CNI_MTU__"/"mtu": __CNI_MTU__/g' ${CALICO_CONFIG}
kubectl -n kube-system patch cm calico-config --patch "$(cat ${CALICO_CONFIG})" || { echo "failed to patch calico configmap"; exit 1; }

# set calico-node env
grep -q "FELIX_IPV6SUPPORT" ${CALICO_NODE} || { echo "failed find FELIX_IPV6SUPPORT"; exit 1; }
${SED_COMMAND} -i -E '/FELIX_IPV6SUPPORT/{n;s/value: "false"/value: "true"/}' ${CALICO_NODE}

grep -q "value: autodetect" ${CALICO_NODE} || { echo "failed find autodetect"; exit 1; }
${SED_COMMAND} -i '/value: autodetect/a\ - name: IP6\n\ value: autodetect' ${CALICO_NODE}
kubectl -n kube-system patch ds calico-node --patch "$(cat ${CALICO_NODE})" || { echo "failed to patch calico-node"; exit 1; }
;;
dual)
export CALICO_CNI_ASSIGN_IPV4=true
export CALICO_CNI_ASSIGN_IPV6=true
export CALICO_IP_AUTODETECT=autodetect
export CALICO_IP6_AUTODETECT=autodetect
export CALICO_FELIX_IPV6SUPPORT=true
export CALICO_IPV6POOL_VXLAN=Always
# set configmap
configYaml=$(yq '.data.cni_network_config' ${CALICO_CONFIG} | yq '.plugins[0].ipam = {"type": "calico-ipam", "assign_ipv4": "true", "assign_ipv6": "true"}' --output-format=json)
configYaml=$configYaml yq e '.data.cni_network_config |= strenv(configYaml)' -i ${CALICO_CONFIG}
${SED_COMMAND} -i 's/"mtu": "__CNI_MTU__"/"mtu": __CNI_MTU__/g' ${CALICO_CONFIG}
kubectl -n kube-system patch cm calico-config --patch "$(cat ${CALICO_CONFIG})" || { echo "failed to patch calico configmap"; exit 1; }

# set calico-node env
grep -q "FELIX_IPV6SUPPORT" ${CALICO_NODE} || { echo "failed find FELIX_IPV6SUPPORT"; exit 1; }
${SED_COMMAND} -i -E '/FELIX_IPV6SUPPORT/{n;s/value: "false"/value: "true"/}' ${CALICO_NODE}
grep -q "value: autodetect" ${CALICO_NODE} || { echo "failed find autodetect"; exit 1; }
${SED_COMMAND} -i '/value: autodetect/a\ - name: IP6\n\ value: autodetect' ${CALICO_NODE}
kubectl -n kube-system patch ds calico-node --patch "$(cat ${CALICO_NODE})" || { echo "failed to patch calico-node"; exit 1; }
;;
*)
echo "the value of E2E_IP_FAMILY: ipv4 or ipv6 or dual"
exit 1
esac
kubectl patch felixconfigurations.crd.projectcalico.org default --type='merge' -p '{"spec":{"chainInsertMode":"Append"}}' || { echo "failed to patch calico chainInsertMode"; exit 1; }

# restart calico pod
kubectl -n kube-system delete pod -l k8s-app=calico-node --force --grace-period=0 && sleep 3
kubectl wait --for=condition=ready -l k8s-app=calico-node --timeout=${INSTALL_TIME_OUT} pod -n kube-system
kubectl -n kube-system delete pod -l k8s-app=calico-kube-controllers --force --grace-period=0 && sleep 3
kubectl wait --for=condition=ready -l k8s-app=calico-kube-controllers --timeout=${INSTALL_TIME_OUT} pod -n kube-system
echo -e "\033[35m ===> Succeed to patch calico \033[0m"

# Update calico's podcidr so that it is inconsistent with the cluster's podcidr.
case ${E2E_IP_FAMILY} in
ipv4)
kubectl patch ippools default-ipv4-ippool --patch '{"spec": {"cidr": "'"${CALICO_IPV4POOL_CIDR}"'"}}' --type=merge
;;
ipv6)
kubectl patch ippools default-ipv6-ippool --patch '{"spec": {"cidr": "'"${CALICO_IPV6POOL_CIDR}"'"}}' --type=merge
;;
dual)
kubectl patch ippools default-ipv4-ippool --patch '{"spec": {"cidr": "'"${CALICO_IPV4POOL_CIDR}"'"}}' --type=merge
kubectl patch ippools default-ipv6-ippool --patch '{"spec": {"cidr": "'"${CALICO_IPV6POOL_CIDR}"'"}}' --type=merge
;;
*)
echo "the value of E2E_IP_FAMILY: ipv4 or ipv6 or dual"
exit 1
esac

if [ ${OS} == "darwin" ]; then SED_COMMAND=gsed ; fi

ENV_LIST=`env | egrep "^CALICO_" `
for env in ${ENV_LIST}; do
KEY="${env%%=*}"
VALUE="${env#*=}"
echo $KEY $VALUE
${SED_COMMAND} -i "s?<<${KEY}>>?${VALUE}?g" ${CLUSTER_PATH}/calico.yaml
done

CALICO_IMAGE_LIST=`cat ${CLUSTER_PATH}/calico.yaml | grep 'image: ' | tr -d '"' | awk '{print $2}'`
[ -z "${CALICO_IMAGE_LIST}" ] && echo "can't found image of calico" && exit 1
LOCAL_IMAGE_LIST=`docker images | awk '{printf("%s:%s\n",$1,$2)}'`

for CALICO_IMAGE in ${CALICO_IMAGE_LIST}; do
if ! grep ${CALICO_IMAGE} <<< ${LOCAL_IMAGE_LIST} ; then
echo "===> docker pull ${CALICO_IMAGE} "
docker pull ${CALICO_IMAGE}
fi
echo "===> load image ${CALICO_IMAGE} to kind..."
kind load docker-image ${CALICO_IMAGE} --name ${E2E_CLUSTER_NAME}
done

kubectl apply -f ${CLUSTER_PATH}/calico.yaml --kubeconfig ${E2E_KUBECONFIG}

sleep 5

kubectl wait --for=condition=ready -l k8s-app=calico-node --timeout=${INSTALL_TIME_OUT} pod -n kube-system --kubeconfig ${E2E_KUBECONFIG}

echo -e "\033[35m ===> Succeed to install calico \033[0m"
echo -e "\033[35m ===> clean tmp \033[0m"
rm -rf ${DEST_CALICO_YAML_DIR}
}

function install_cilium() {
Expand Down

0 comments on commit 9a799c0

Please sign in to comment.