+function generate_osmclient_script () {
+ echo "docker run -ti --network net${OSM_STACK_NAME} ${DOCKER_REGISTRY_URL}${DOCKER_USER}/osmclient:${OSM_DOCKER_TAG}" | $WORKDIR_SUDO tee $OSM_DOCKER_WORK_DIR/osm
+ $WORKDIR_SUDO chmod +x "$OSM_DOCKER_WORK_DIR/osm"
+ echo "osmclient sidecar container can be found at: $OSM_DOCKER_WORK_DIR/osm"
+}
+
+#installs kubernetes packages
+function install_kube() {
+ sudo apt-get update && sudo apt-get install -y apt-transport-https
+ curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
+ sudo add-apt-repository "deb https://apt.kubernetes.io/ kubernetes-xenial main"
+ sudo apt-get update
+ echo "Installing Kubernetes Packages ..."
+ K8S_VERSION=1.23.3-00
+ sudo apt-get install -y kubelet=${K8S_VERSION} kubeadm=${K8S_VERSION} kubectl=${K8S_VERSION}
+ cat << EOF | sudo tee -a /etc/default/kubelet
+ KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs"
+EOF
+ sudo apt-mark hold kubelet kubeadm kubectl
+}
+
+#initializes kubernetes control plane
+function init_kubeadm() {
+ sudo swapoff -a
+ sudo sed -i.bak '/.*none.*swap/s/^\(.*\)$/#\1/g' /etc/fstab
+ sudo kubeadm init --config $1
+ sleep 5
+}
+
+function kube_config_dir() {
+ [ ! -d $K8S_MANIFEST_DIR ] && FATAL "Cannot Install Kubernetes"
+ mkdir -p $HOME/.kube
+ sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
+ sudo chown $(id -u):$(id -g) $HOME/.kube/config
+}
+
+function install_k8s_storageclass() {
+ echo "Installing open-iscsi"
+ sudo apt-get update
+ sudo apt-get install open-iscsi
+ sudo systemctl enable --now iscsid
+ echo "Installing OpenEBS"
+ helm repo add openebs https://openebs.github.io/charts
+ helm repo update
+ helm install --create-namespace --namespace openebs openebs openebs/openebs --version 3.1.0
+ helm ls -n openebs
+ local storageclass_timeout=400
+ local counter=0
+ local storageclass_ready=""
+ echo "Waiting for storageclass"
+ while (( counter < storageclass_timeout ))
+ do
+ kubectl get storageclass openebs-hostpath &> /dev/null
+
+ if [ $? -eq 0 ] ; then
+ echo "Storageclass available"
+ storageclass_ready="y"
+ break
+ else
+ counter=$((counter + 15))
+ sleep 15
+ fi
+ done
+ [ -n "$storageclass_ready" ] || FATAL "Storageclass not ready after $storageclass_timeout seconds. Cannot install openebs"
+ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
+}
+
+function install_k8s_metallb() {
+ METALLB_IP_RANGE=$DEFAULT_IP/32
+ kubectl apply -f ${OSM_DEVOPS}/installers/k8s/metallb/metallb.yaml \
+ || FATAL "Cannot install MetalLB"
+ echo "apiVersion: v1
+kind: ConfigMap
+metadata:
+ namespace: metallb-system
+ name: config
+data:
+ config: |
+ address-pools:
+ - name: default
+ protocol: layer2
+ addresses:
+ - $METALLB_IP_RANGE" | kubectl apply -f - \
+ || FATAL "Cannot apply MetalLB ConfigMap"
+}
+
+#installs metallb from helm
+function install_helm_metallb() {
+ METALLB_IP_RANGE=$DEFAULT_IP/32
+ echo "configInline:
+ address-pools:
+ - name: default
+ protocol: layer2
+ addresses:
+ - $METALLB_IP_RANGE" | sudo tee -a $OSM_DOCKER_WORK_DIR/metallb-config.yaml
+ helm repo add metallb https://metallb.github.io/metallb
+ helm repo update
+ helm install --create-namespace --namespace metallb-system metallb metallb/metallb -f $OSM_DOCKER_WORK_DIR/metallb-config.yaml
+}
+
+#checks openebs and metallb readiness
+function check_for_readiness() {
+ # Default input values
+ sampling_period=2 # seconds
+ time_for_readiness=20 # seconds ready
+ time_for_failure=200 # seconds broken
+ OPENEBS_NAMESPACE=openebs
+ METALLB_NAMESPACE=metallb-system
+ # STACK_NAME=osm # By default, "osm"
+
+ # Equivalent number of samples
+ oks_threshold=$((time_for_readiness/${sampling_period})) # No. ok samples to declare the system ready
+ failures_threshold=$((time_for_failure/${sampling_period})) # No. nok samples to declare the system broken
+ failures_in_a_row=0
+ oks_in_a_row=0
+
+ ####################################################################################
+ # Loop to check system readiness
+ ####################################################################################
+ while [[ (${failures_in_a_row} -lt ${failures_threshold}) && (${oks_in_a_row} -lt ${oks_threshold}) ]]
+ do
+ # State of OpenEBS
+ OPENEBS_STATE=$(kubectl get pod -n ${OPENEBS_NAMESPACE} --no-headers 2>&1)
+ OPENEBS_READY=$(echo "${OPENEBS_STATE}" | awk '$2=="1/1" || $2=="2/2" {printf ("%s\t%s\t\n", $1, $2)}')
+ OPENEBS_NOT_READY=$(echo "${OPENEBS_STATE}" | awk '$2!="1/1" && $2!="2/2" {printf ("%s\t%s\t\n", $1, $2)}')
+ COUNT_OPENEBS_READY=$(echo "${OPENEBS_READY}"| grep -v -e '^$' | wc -l)
+ COUNT_OPENEBS_NOT_READY=$(echo "${OPENEBS_NOT_READY}" | grep -v -e '^$' | wc -l)
+
+ # State of MetalLB
+ METALLB_STATE=$(kubectl get pod -n ${METALLB_NAMESPACE} --no-headers 2>&1)
+ METALLB_READY=$(echo "${METALLB_STATE}" | awk '$2=="1/1" || $2=="2/2" {printf ("%s\t%s\t\n", $1, $2)}')
+ METALLB_NOT_READY=$(echo "${METALLB_STATE}" | awk '$2!="1/1" && $2!="2/2" {printf ("%s\t%s\t\n", $1, $2)}')
+ COUNT_METALLB_READY=$(echo "${METALLB_READY}" | grep -v -e '^$' | wc -l)
+ COUNT_METALLB_NOT_READY=$(echo "${METALLB_NOT_READY}" | grep -v -e '^$' | wc -l)
+
+ # OK sample
+ if [[ $((${COUNT_OPENEBS_NOT_READY}+${COUNT_METALLB_NOT_READY})) -eq 0 ]]
+ then
+ ((++oks_in_a_row))
+ failures_in_a_row=0
+ echo -ne ===\> Successful checks: "${oks_in_a_row}"/${oks_threshold}\\r
+ # NOK sample
+ else
+ ((++failures_in_a_row))
+ oks_in_a_row=0
+ echo
+ echo Bootstraping... "${failures_in_a_row}" checks of ${failures_threshold}
+
+ # Reports failed pods in OpenEBS
+ if [[ "${COUNT_OPENEBS_NOT_READY}" -ne 0 ]]
+ then
+ echo "OpenEBS: Waiting for ${COUNT_OPENEBS_NOT_READY} of $((${COUNT_OPENEBS_NOT_READY}+${COUNT_OPENEBS_READY})) pods to be ready:"
+ echo "${OPENEBS_NOT_READY}"
+ echo
+ fi
+
+ # Reports failed statefulsets
+ if [[ "${COUNT_METALLB_NOT_READY}" -ne 0 ]]
+ then
+ echo "MetalLB: Waiting for ${COUNT_METALLB_NOT_READY} of $((${COUNT_METALLB_NOT_READY}+${COUNT_METALLB_READY})) pods to be ready:"
+ echo "${METALLB_NOT_READY}"
+ echo
+ fi
+ fi
+
+ #------------ NEXT SAMPLE
+ sleep ${sampling_period}
+ done
+
+ ####################################################################################
+ # OUTCOME
+ ####################################################################################
+ if [[ (${failures_in_a_row} -ge ${failures_threshold}) ]]
+ then
+ echo
+ FATAL "K8S CLUSTER IS BROKEN"
+ else
+ echo
+ echo "K8S CLUSTER IS READY"
+ fi
+}
+
+#deploys flannel as daemonsets
+function deploy_cni_provider() {
+ CNI_DIR="$(mktemp -d -q --tmpdir "flannel.XXXXXX")"
+ trap 'rm -rf "${CNI_DIR}"' EXIT
+ wget -q https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml -P $CNI_DIR
+ kubectl apply -f $CNI_DIR
+ [ $? -ne 0 ] && FATAL "Cannot Install Flannel"
+}
+
+#creates secrets from env files which will be used by containers
+function kube_secrets(){
+ kubectl create ns $OSM_STACK_NAME
+ kubectl create secret generic lcm-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/lcm.env
+ kubectl create secret generic mon-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/mon.env
+ kubectl create secret generic nbi-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/nbi.env
+ kubectl create secret generic ro-db-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/ro-db.env
+ kubectl create secret generic ro-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/ro.env
+ kubectl create secret generic keystone-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/keystone.env
+ kubectl create secret generic pol-secret -n $OSM_STACK_NAME --from-env-file=$OSM_DOCKER_WORK_DIR/pol.env
+}
+
+#taints K8s master node
+function taint_master_node() {
+ K8S_MASTER=$(kubectl get nodes | awk '$3~/master/'| awk '{print $1}')
+ kubectl taint node $K8S_MASTER node-role.kubernetes.io/master:NoSchedule-
+ sleep 5
+}
+
+#deploys osm pods and services
+function deploy_osm_services() {
+ kubectl apply -n $OSM_STACK_NAME -f $OSM_K8S_WORK_DIR
+}
+
+#deploy charmed services
+function deploy_charmed_services() {
+ juju add-model $OSM_STACK_NAME $OSM_VCA_K8S_CLOUDNAME
+ juju deploy ch:mongodb-k8s -m $OSM_STACK_NAME
+}
+
+function deploy_osm_pla_service() {
+ # corresponding to namespace_vol
+ $WORKDIR_SUDO sed -i "s#path: /var/lib/osm#path: $OSM_NAMESPACE_VOL#g" $OSM_DOCKER_WORK_DIR/osm_pla/pla.yaml
+ # corresponding to deploy_osm_services
+ kubectl apply -n $OSM_STACK_NAME -f $OSM_DOCKER_WORK_DIR/osm_pla
+}
+
+#Install Helm v3
+#Helm releases can be found here: https://github.com/helm/helm/releases
+function install_helm() {
+ HELM_VERSION="v3.7.2"
+ if ! [[ "$(helm version --short 2>/dev/null)" =~ ^v3.* ]]; then
+ # Helm is not installed. Install helm
+ echo "Helm3 is not installed, installing ..."
+ curl https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz --output helm-${HELM_VERSION}.tar.gz
+ tar -zxvf helm-${HELM_VERSION}.tar.gz
+ sudo mv linux-amd64/helm /usr/local/bin/helm
+ rm -r linux-amd64
+ rm helm-${HELM_VERSION}.tar.gz
+ else
+ echo "Helm3 is already installed. Skipping installation..."
+ fi
+ helm repo add stable https://charts.helm.sh/stable
+ helm repo update
+}
+
+function parse_yaml() {
+ TAG=$1
+ shift
+ services=$@
+ for module in $services; do
+ if [ "$module" == "pla" ]; then
+ if [ -n "$INSTALL_PLA" ]; then
+ echo "Updating K8s manifest file from opensourcemano\/${module}:.* to ${DOCKER_REGISTRY_URL}${DOCKER_USER}\/${module}:${TAG}"
+ $WORKDIR_SUDO sed -i "s#opensourcemano/pla:.*#${DOCKER_REGISTRY_URL}${DOCKER_USER}/pla:${TAG}#g" ${OSM_DOCKER_WORK_DIR}/osm_pla/pla.yaml
+ fi
+ else
+ echo "Updating K8s manifest file from opensourcemano\/${module}:.* to ${DOCKER_REGISTRY_URL}${DOCKER_USER}\/${module}:${TAG}"
+ $WORKDIR_SUDO sed -i "s#opensourcemano/${module}:.*#${DOCKER_REGISTRY_URL}${DOCKER_USER}/${module}:${TAG}#g" ${OSM_K8S_WORK_DIR}/${module}.yaml
+ fi
+ done
+}
+
+function update_manifest_files() {
+ osm_services="nbi lcm ro pol mon ng-ui keystone pla"
+ list_of_services=""
+ for module in $osm_services; do
+ module_upper="${module^^}"
+ if ! echo $TO_REBUILD | grep -q $module_upper ; then
+ list_of_services="$list_of_services $module"
+ fi
+ done
+ if [ ! "$OSM_DOCKER_TAG" == "10" ]; then
+ parse_yaml $OSM_DOCKER_TAG $list_of_services
+ fi
+ if [ -n "$MODULE_DOCKER_TAG" ]; then
+ parse_yaml $MODULE_DOCKER_TAG $list_of_services_to_rebuild
+ fi
+}
+
+function namespace_vol() {
+ osm_services="nbi lcm ro pol mon kafka mysql prometheus"
+ for osm in $osm_services; do
+ $WORKDIR_SUDO sed -i "s#path: /var/lib/osm#path: $OSM_NAMESPACE_VOL#g" $OSM_K8S_WORK_DIR/$osm.yaml
+ done
+}
+