Initial version of the k0rdent toolset
Main changes:
* fixed init-workspace.sh to be executed on k0rdent
* fixed running of cfg-checker for nets and pings
* removed some openstack-related scripts
* created the Dockerfile docker-container-toolset-full
Related-PROD: K0RQA-15
Change-Id: Ib57a3b2a1d47e3a0f48951eb3def71839322a46d
diff --git a/k8s/workspace/init-workspace.sh b/k8s/workspace/init-workspace.sh
index e85b0c3..f8ec98a 100644
--- a/k8s/workspace/init-workspace.sh
+++ b/k8s/workspace/init-workspace.sh
@@ -3,56 +3,27 @@
function ewriteln() {
echo ${1} | tee -a $MY_PROJFOLDER/env.sh
}
-function qkeystone() {
- keystone_pod=$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml get pod -n openstack -o=custom-columns=NAME:.metadata.name | grep keystone-client)
- # echo "# Running 'kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec {} -c keystone-client --stdin -- "${1}"'"
- kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec ${keystone_pod} -c keystone-client --stdin -- '${1}'
-}
-function get_conformance_image_tag() {
- kubeconfig_path=$1
- k8s_server_version=$(kubectl --kubeconfig="$kubeconfig_path" version -o json 2>/dev/null | jq -r '.serverVersion.gitVersion')
- k8s_short_version=${k8s_server_version:1:4}
- image_tag=""
- case $k8s_short_version in
- "1.18")
- image_tag="1.18.9-16"
- ;;
- "1.19")
- image_tag="1.19.2-1"
- ;;
- "1.20")
- image_tag="1.20.6-4"
- ;;
- "1.21")
- image_tag="1.21.9-4"
- ;;
- "1.24")
- image_tag="1.24.4-2"
- ;;
- "1.27")
- image_tag="1.27.16-4"
- ;;
- esac
- echo "$image_tag"
-}
+exec 2> >(while read line; do echo -e "\033[0;31m$line\033[0m" >&2; done)
export MY_PROJFOLDER=/artifacts
echo "# Using folder '$MY_PROJFOLDER'"
cd $MY_PROJFOLDER
[ ! -d envs ] && mkdir envs
+[ ! -d envs/checkers ] && mkdir envs/checkers
+[ ! -d envs/kubeconfigs ] && mkdir envs/kubeconfigs
[ ! -d yamls ] && mkdir yamls
[ ! -d reports ] && mkdir reports
[ ! -d tmp ] && mkdir tmp
-# move mcc konfig to default place
-if [ -f $MY_PROJFOLDER/mcc-kubeconfig.yaml ]; then
- mv $MY_PROJFOLDER/mcc-kubeconfig.yaml $MY_PROJFOLDER/envs/mcc-kubeconfig.yaml
+# move mgmt (k0rdent mothership) k8s konfig to default place
+if [ -f $MY_PROJFOLDER/mgmt-kubeconfig.yaml ]; then
+ mv $MY_PROJFOLDER/mgmt-kubeconfig.yaml $MY_PROJFOLDER/envs/kubeconfigs/mgmt-kubeconfig.yaml
fi
if [ -f $MY_PROJFOLDER/node.key ]; then
mv $MY_PROJFOLDER/node.key $MY_PROJFOLDER/envs/node.key
fi
-if [ ! -f $MY_PROJFOLDER/envs/mcc-kubeconfig.yaml ]; then
- echo "ERROR: MCC kubeconfig not found either at '$MY_PROJFOLDER/mcc-kubeconfig.yaml' or '$MY_PROJFOLDER/envs/mcc-kubeconfig.yaml'"
+if [ ! -f $MY_PROJFOLDER/envs/kubeconfigs/mgmt-kubeconfig.yaml ]; then
+ echo "ERROR: k0rdent mgmt cluster (mothership) kubeconfig was not found either at '$MY_PROJFOLDER/mgmt-kubeconfig.yaml' or '$MY_PROJFOLDER/envs/kubeconfigs/mgmt-kubeconfig.yaml'"
exit 1
fi
echo " "
@@ -60,7 +31,7 @@
### prepare needed variables
echo "# Updating '$MY_PROJFOLDER/env.sh'"
-export KUBECONFIG=$MY_PROJFOLDER/envs/mcc-kubeconfig.yaml
+export KUBECONFIG=$MY_PROJFOLDER/envs/kubeconfigs/mgmt-kubeconfig.yaml
if [ ! -f $MY_PROJFOLDER/env.sh ]; then
touch $MY_PROJFOLDER/env.sh
else
@@ -71,57 +42,46 @@
### Edit the following lines to set the client name, floating network name, IAM writer password
ewriteln "export MY_CLIENTNAME='ClientName'"
ewriteln "export MY_CLIENTSHORTNAME='clname'"
-ewriteln "export MY_PROJNAME='MOS_DEPLOY'"
-CUSTOM_PUBLIC_NET_NAME=""
-ewriteln "export WRITER_PASSWORD=''" # IAM (Keycloak) writer password
+ewriteln "export MY_PROJNAME='K0RDENT_DEPLOY'"
### Setting the project directory
ewriteln "export MY_PROJFOLDER=/artifacts"
-# NS & CLUSTER
-printf "\n\n# Getting namespace and cluster"
-nn=( $(kubectl get cluster -A --no-headers -o=custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace | grep -v default) )
-echo "# Extracted data: '${nn[@]}'"
-vNS="${nn[1]}"
-vCLUSTER="${nn[0]}"
-ewriteln "export MOS_NS=${vNS}"
-ewriteln "export MOS_CLUSTER=${vCLUSTER}"
-echo "# Extracted NS: '${vNS}'"
-echo "# Extracted CLUSTER: '${vCLUSTER}'"
+printf "\n\n# Getting ready ClusterDeployments"
+printf "\n# For each ready cld, getting namespace and cluster"
+kubectl get cld -A --no-headers | awk '$3 == "True" {print $1, $2}' | while read -r namespace name; do
+ echo " -> Processing $name in namespace $namespace..."
+ kubeconfig_secret="${name}-kubeconfig"
+ kubeconfig_file="$MY_PROJFOLDER/envs/kubeconfigs/${name}-kubeconfig.yaml"
-printf "\n\n# Writing additional options"
+ echo " -> Fetching kubeconfig to $kubeconfig_file"
+ kubectl -n "$namespace" get secret "$kubeconfig_secret" \
+ -o jsonpath='{.data.value}' | base64 -d > "$kubeconfig_file"
+
+ rc_file="$MY_PROJFOLDER/envs/${name}rc"
+ echo " -> Generating RC file at $rc_file"
+ cat <<EOF > "$rc_file"
+#!/bin/bash
+export KUBECONFIG=$MY_PROJFOLDER/envs/kubeconfigs/${name}-kubeconfig.yaml
+export CHILD_CLUSTER_NAME=${name}
+export CHILD_CLUSTER_NS=${namespace}
+EOF
+
+ chmod +x "$rc_file"
+done
+
+printf "\n\n# Writing additional options\n"
ewriteln "export SI_BINARIES_DIR=$(which helm | rev | cut -d'/' -f2- | rev)"
ewriteln "export HELM_BINARY_PATH=$(which helm)"
-ewriteln "export K8S_CONFORMANCE_CONCURRENCY=10"
-printf "\n\n# Writing additional options for K8S conformance tests for MCC cluster...\n"
-mcc_kubeconfig_path="$MY_PROJFOLDER/envs/mcc-kubeconfig.yaml"
-mcc_conformance_image_tag=$(get_conformance_image_tag "$mcc_kubeconfig_path")
-if [ -z "$mcc_conformance_image_tag" ]; then
- echo "Could not identify K8S_CONFORMANCE_IMAGE_VERSION for MCC."
-fi
-mcc_conformance_image_url="mirantis.azurecr.io/lcm/kubernetes/k8s-conformance:v${mcc_conformance_image_tag}"
-ewriteln "export MCC_K8S_CONFORMANCE_IMAGE_VERSION='${mcc_conformance_image_tag}'"
-ewriteln "export MCC_K8S_CONFORMANCE_IMAGE_URL='${mcc_conformance_image_url}'"
-
-# getting IAM Keycloak URL
-ewriteln "export KEYCLOAK_URL=$(kubectl get cluster kaas-mgmt -o jsonpath='{.status.providerStatus.helm.releases.iam.keycloak.url}')"
-
-# extract MOS kubeconfig
-echo " "
-printf "\n\nExtracting mos-kubeconfig.yaml"
-if [[ ! -z ${vCLUSTER+x} ]]; then
- kubectl --kubeconfig $MY_PROJFOLDER/envs/mcc-kubeconfig.yaml -n ${vNS} get secrets ${vCLUSTER}-kubeconfig -o jsonpath='{.data.admin\.conf}' | base64 -d | sed 's/:5443/:443/g' | tee $MY_PROJFOLDER/envs/mos-kubeconfig.yaml
-else
- echo "MOS_CLUSTER variable empty/invalid: '${vCLUSTER}'"
-fi
# generate additional files
-printf "\n\nPreparing additional files"
+printf "\n\n# Preparing additional files\n"
# copy files
cp -v /opt/res-files/k8s/workspace/* $MY_PROJFOLDER/envs/
[ ! -d $MY_PROJFOLDER/scripts ] && mkdir $MY_PROJFOLDER/scripts
mv -v $MY_PROJFOLDER/envs/*.sh $MY_PROJFOLDER/scripts/
+mv -v $MY_PROJFOLDER/envs/*.env $MY_PROJFOLDER/envs/checkers
cp -v /opt/res-files/k8s/yamls/qa-rally.yaml $MY_PROJFOLDER/yamls
cp -v /opt/res-files/k8s/yamls/qa-res.yaml $MY_PROJFOLDER/yamls
@@ -131,81 +91,51 @@
# remove duplicate init
rm -v $MY_PROJFOLDER/scripts/init-workspace.sh
# update IP Addresses
-mccip=$(cat $MY_PROJFOLDER/envs/mcc-kubeconfig.yaml | grep server | cut -d':' -f3 | cut -d'/' -f3)
-echo "-> MCC Server IP is: ${mccip}"
-sed -i "s/ip_address/$mccip/g" $MY_PROJFOLDER/envs/mcc-checker.env
+mgmt_ip=$(cat $MY_PROJFOLDER/envs/kubeconfigs/mgmt-kubeconfig.yaml | grep server | cut -d':' -f3 | cut -d'/' -f3)
+echo " -> MGMT (Mothership) Server IP is: ${mgmt_ip}"
+sed -i "s/ip_address/$mgmt_ip/g" $MY_PROJFOLDER/envs/checkers/mgmt-checker.env
-if [ -f $MY_PROJFOLDER/envs/mos-kubeconfig.yaml ]; then
- mosip=$(cat $MY_PROJFOLDER/envs/mos-kubeconfig.yaml | grep server | cut -d':' -f3 | cut -d'/' -f3)
- echo "-> MOS Server IP is: ${mosip}"
- sed -i "s/ip_address/$mosip/g" $MY_PROJFOLDER/envs/mos-checker.env
- vSC="$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml get sc | grep default | cut -d' ' -f1)"
- echo "-> Storage class is ${vSC}"
- echo "# Updating resources yaml "
- sed -i "s/storage_class/${vSC}/g" $MY_PROJFOLDER/yamls/qa-res.yaml
- echo " "
- ewriteln "export MOS_SC=${vSC}"
+printf "\n\n# Preparing checker.env files for each child cluster, getting default SC...\n"
+ENV_DIR="$MY_PROJFOLDER/envs"
+CHECKERS_DIR="$MY_PROJFOLDER/envs/checkers"
+for kubeconfig_path in "$ENV_DIR"/kubeconfigs/*-kubeconfig.yaml; do
+ [[ -e "$kubeconfig_path" ]] || continue
+ name=$(basename "$kubeconfig_path" -kubeconfig.yaml)
- ewriteln "export OSH_DEPLOYMENT_NAME=$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack get openstackdeployment --no-headers | cut -d' ' -f1)"
- ewriteln "export SI_BINARIES_DIR=$(which helm | rev | cut -d'/' -f2- | rev)"
- ewriteln "export HELM_BINARY_PATH=$(which helm)"
+ echo "# Processing cluster - getting K8S IP: $name"
+ child_ip=$(grep server "$kubeconfig_path" | cut -d':' -f3 | cut -d'/' -f3)
+ echo " -> Cluster ${name} Server IP is: ${child_ip}"
- printf "\n\n# Writing additional options for K8S conformance tests for MOS cluster...\n"
- mos_kubeconfig_path="$MY_PROJFOLDER/envs/mos-kubeconfig.yaml"
- mos_conformance_image_tag=$(get_conformance_image_tag "$mos_kubeconfig_path")
- if [ -z "$mos_conformance_image_tag" ]; then
- echo "Could not identify K8S_CONFORMANCE_IMAGE_VERSION for MOS."
- fi
- mos_conformance_image_url="mirantis.azurecr.io/lcm/kubernetes/k8s-conformance:v${mos_conformance_image_tag}"
- ewriteln "export MOS_K8S_CONFORMANCE_IMAGE_VERSION='${mos_conformance_image_tag}'"
- ewriteln "export MOS_K8S_CONFORMANCE_IMAGE_URL='${mos_conformance_image_url}'"
+ checker_env="$CHECKERS_DIR/${name}-checker.env"
+ cp $CHECKERS_DIR/child-checker.env ${checker_env}
+ echo " -> Generating checker.env for $name"
+ sed -i "s/ip_address/${child_ip}/g" "$checker_env"
- echo " "
- keystone_pod=$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml get pod -n openstack -o=custom-columns=NAME:.metadata.name | grep keystone-client)
- if [ -n "${CUSTOM_PUBLIC_NET_NAME:-}" ]; then
- # if CUSTOM_PUBLIC_NET_NAME is set to some specific net, check it is present on the cloud
- echo "# Checking that the external network ${CUSTOM_PUBLIC_NET_NAME} is present on the cloud"
- cmd="openstack network show ${CUSTOM_PUBLIC_NET_NAME} -c id -f value 2>/dev/null"
- echo "# Running 'kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec ${keystone_pod} -c keystone-client --stdin -- sh -c '${cmd}'"
- network_exists=$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec "${keystone_pod}" -c keystone-client --stdin -- sh -c "${cmd}")
- if [ -n "$network_exists" ]; then
- echo "# Setting TEMPEST_CUSTOM_PUBLIC_NET to ${CUSTOM_PUBLIC_NET_NAME}"
- ewriteln "export TEMPEST_CUSTOM_PUBLIC_NET=${CUSTOM_PUBLIC_NET_NAME}"
- else
- echo "The custom external (floating) network ${CUSTOM_PUBLIC_NET_NAME} is not found on the cloud. Set CUSTOM_PUBLIC_NET_NAME=\"\" to automatically pick some public network."
- exit 1
- fi
+ default_sc=$(kubectl --kubeconfig "$kubeconfig_path" get sc 2>/dev/null | grep 'default' || true)
+
+ if [[ -n "$default_sc" ]]; then
+ vSC=$(echo "$default_sc" | awk '{print $1}')
+ echo " -> Default storage class: $vSC"
else
- # else if it is not set by the QA engineer, let's extract the first external network and use it
- echo "# Extracting network: taking the first found external network"
- cmd="openstack network list --external -c Name -f value | head -n1"
- echo "# Running 'kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec ${keystone_pod} -c keystone-client --stdin -- sh -c '${cmd}'"
- vPUBNET=$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec ${keystone_pod} -c keystone-client --stdin -- sh -c "${cmd}")
- echo "-> 'openstack network list --external -c Name -f value | head -n1': '${vPUBNET}'"
- ewriteln "export TEMPEST_CUSTOM_PUBLIC_NET=${vPUBNET}"
+ vSC=""
+ echo " -> No default storage class found."
fi
- echo "# Extracting volume types"
- cmd_all="openstack volume type list -f value -c Name"
- vVOLTYPES=( $(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec ${keystone_pod} -c keystone-client --stdin -- ${cmd_all}) )
- echo "# Volume types available: ${vVOLTYPES[@]}"
- cmd_default="openstack volume type list -f value -c Name --default"
- vVOLTYPE=$(kubectl --kubeconfig $MY_PROJFOLDER/envs/mos-kubeconfig.yaml -n openstack exec ${keystone_pod} -c keystone-client --stdin -- ${cmd_default})
- echo "# Default volume type used: ${vVOLTYPE}"
- ewriteln "export TEMPEST_CUSTOM_VOLUME_TYPE=${vVOLTYPE}"
- # hardcoded values
- ewriteln "# export TEMPEST_CUSTOM_FLAVOR=cvp.tiny"
- ewriteln "# export TEMPEST_CUSTOM_IMAGE=cvp.cirros.61"
- ewriteln "# export TEMPEST_CUSTOM_IMAGE_ALT=cvp.cirros.62"
- #prepare tempest custom yaml
- cp /opt/res-files/k8s/yamls/tempest_custom.yaml.clean $MY_PROJFOLDER/yamls/tempest_custom.yaml
- ewriteln 'export TEMPEST_CUSTOM_PARAMETERS=$(cat $MY_PROJFOLDER/yamls/tempest_custom.yaml)'
-fi
+ rc_file="$ENV_DIR/${name}rc"
+
+ if [[ -f "$rc_file" ]]; then
+ echo " -> Updating RC file: $rc_file"
+ echo "export CHILD_SC=${vSC}" >> "$rc_file"
+ else
+ echo "# RC file not found for $name — skipping."
+ fi
+
+done
# Aliases
ewriteln 'alias k=kubectl'
# end
echo " "
-echo "# Done!"
+echo "# ✅ Done!"