5eacc62a35d7b7b6fe449bcf156078600ae57cdd
[policy/docker.git] / csit / run-k8s-csit-enable.sh
1 #!/bin/bash
2 #
3 # ============LICENSE_START====================================================
4 #  Copyright (C) 2022-2023 Nordix Foundation.
5 # =============================================================================
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 #      http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 # SPDX-License-Identifier: Apache-2.0
19 # ============LICENSE_END======================================================
20
21 # This script spins up kubernetes cluster in Microk8s for deploying policy helm charts.
22 # Runs CSITs in kubernetes.
23
24 if [ -z "${WORKSPACE}" ]; then
25     WORKSPACE=$(git rev-parse --show-toplevel)
26     export WORKSPACE
27 fi
28
29 CSIT_SCRIPT="scripts/run-test.sh"
30 ROBOT_DOCKER_IMAGE="policy-csit-robot"
31 POLICY_CLAMP_ROBOT="policy-clamp-test.robot"
32 POLICY_API_ROBOT="api-test.robot"
33 POLICY_PAP_ROBOT="pap-test.robot pap-slas.robot"
34 POLICY_APEX_PDP_ROBOT="apex-pdp-test.robot"
35 POLICY_XACML_PDP_ROBOT="xacml-pdp-test.robot"
36 POLICY_DROOLS_PDP_ROBOT="drools-pdp-test.robot"
37 POLICY_DISTRIBUTION_ROBOT="distribution-test.robot"
38 POLICY_API_CONTAINER="policy-api"
39 POLICY_PAP_CONTAINER="policy-pap"
40 POLICY_CLAMP_CONTAINER="policy-clamp-runtime-acm"
41 POLICY_APEX_CONTAINER="policy-apex-pdp"
42 POLICY_DROOLS_CONTAINER="policy-drools-pdp"
43 POLICY_XACML_CONTAINER="policy-xacml-pdp"
44 POLICY_DISTRIBUTION_CONTAINER="policy-distribution"
45
46 DISTRIBUTION_CSAR=${WORKSPACE}/csit/resources/tests/data/csar
47 DIST_TEMP_FOLDER=/tmp/distribution
48
49 export PROJECT=""
50 export ROBOT_FILE=""
51 export ROBOT_LOG_DIR=${WORKSPACE}/csit/archives
52 export READINESS_CONTAINERS=()
53
54 function spin_microk8s_cluster () {
55     echo "Verify if Microk8s cluster is running.."
56     microk8s version
57     exitcode="${?}"
58
59     if [ "$exitcode" -ne 0 ];  then
60         echo "Microk8s cluster not available, Spinning up the cluster.."
61         sudo snap install microk8s --classic --channel=1.25/stable
62
63               if [ "${?}" -ne 0 ];  then
64                   echo "Failed to install kubernetes cluster. Aborting.."
65                         return 1
66         fi
67         echo "Microk8s cluster installed successfully"
68         sudo usermod -a -G microk8s $USER
69         echo "Enabling DNS and helm3 plugins"
70         sudo microk8s.enable dns helm3 hostpath-storage
71         echo "Creating configuration file for Microk8s"
72         sudo mkdir -p $HOME/.kube;
73         sudo chown -R $USER:$USER $HOME/.kube
74         sudo microk8s kubectl config view --raw > $HOME/.kube/config
75         sudo chmod 600 $HOME/.kube/config
76         echo "K8s installation completed"
77         echo "----------------------------------------"
78     else
79         echo "K8s cluster is already running"
80         echo "----------------------------------------"
81               return 0
82     fi
83
84 }
85
86
87 function teardown_cluster () {
88     echo "Removing k8s cluster and k8s configuration file"
89     sudo snap remove microk8s;rm -rf $HOME/.kube/config
90     sudo rm -rf /dockerdata-nfs/mariadb-galera/
91     echo "K8s Cluster removed"
92     echo "Clean up docker"
93     docker system prune -af
94 }
95
96
97 function build_robot_image () {
98     echo "Build docker image for robot framework"
99     cd ${WORKSPACE}/csit/resources || exit;
100     clone_models
101     if [ "${PROJECT}" == "distribution" ] || [ "${PROJECT}" == "policy-distribution" ]; then
102       copy_csar_file
103     fi
104     echo "Build robot framework docker image"
105     docker login -u docker -p docker nexus3.onap.org:10001
106     docker build . --file Dockerfile \
107         --build-arg CSIT_SCRIPT="$CSIT_SCRIPT" \
108         --build-arg ROBOT_FILE="$ROBOT_FILE"  \
109         --tag "${ROBOT_DOCKER_IMAGE}" --no-cache
110     echo "---------------------------------------------"
111     echo "Importing robot image into microk8s registry"
112     docker save -o policy-csit-robot.tar ${ROBOT_DOCKER_IMAGE}:latest
113     sudo microk8s ctr image import policy-csit-robot.tar
114 }
115
116
117 function start_csit () {
118     build_robot_image
119     if [ "${?}" -eq 0 ]; then
120         rm -rf ${WORKSPACE}/csit/resources/policy-csit-robot.tar
121         rm -rf ${WORKSPACE}/csit/resources/tests/models/
122         echo "---------------------------------------------"
123         echo "Installing Robot framework pod for running CSIT"
124         cd ${WORKSPACE}/helm
125         mkdir -p ${ROBOT_LOG_DIR}
126         sudo microk8s helm install csit-robot robot --set robot="$ROBOT_FILE" --set "readiness={${READINESS_CONTAINERS[*]}}" --set robotLogDir=$ROBOT_LOG_DIR;
127         print_robot_log
128   fi
129 }
130
131
132 function print_robot_log () {
133     count_pods=0
134     while [[ ${count_pods} -eq 0 ]]; do
135         echo "Waiting for pods to come up..."
136         sleep 5
137         count_pods=$(sudo microk8s kubectl get pods --output name | wc -l)
138     done
139     robotpod=$(sudo microk8s kubectl get po | grep policy-csit)
140     podName=$(echo "$robotpod" | awk '{print $1}')
141     echo "The robot tests will begin once the policy components {${READINESS_CONTAINERS[*]}} are up and running..."
142     sudo microk8s kubectl wait --for=jsonpath='{.status.phase}'=Running --timeout=700s pod/"$podName"
143     sudo microk8s kubectl logs -f "$podName"
144     echo "Please check the logs of policy-csit-robot pod for the test execution results"
145 }
146
147
148 function clone_models () {
149     GERRIT_BRANCH=$(awk -F= '$1 == "defaultbranch" { print $2 }' "${WORKSPACE}"/.gitreview)
150     echo GERRIT_BRANCH="${GERRIT_BRANCH}"
151     # download models examples
152     git clone -b "${GERRIT_BRANCH}" --single-branch https://github.com/onap/policy-models.git "${WORKSPACE}"/csit/resources/tests/models
153
154     # create a couple of variations of the policy definitions
155     sed -e 's!Measurement_vGMUX!ADifferentValue!' \
156             tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.json \
157         >tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.v1_2.json
158
159     sed -e 's!"version": "1.0.0"!"version": "2.0.0"!' \
160            -e 's!"policy-version": 1!"policy-version": 2!' \
161            tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.json \
162         >tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.v2.json
163 }
164
165 function copy_csar_file () {
166   zip -F ${DISTRIBUTION_CSAR}/sample_csar_with_apex_policy.csar \
167     --out ${DISTRIBUTION_CSAR}/csar_temp.csar -q
168   # Remake temp directory
169   sudo rm -rf "${DIST_TEMP_FOLDER}"
170   sudo mkdir "${DIST_TEMP_FOLDER}"
171   sudo cp ${DISTRIBUTION_CSAR}/csar_temp.csar  ${DISTRIBUTION_CSAR}/temp.csar
172   sudo mv ${DISTRIBUTION_CSAR}/temp.csar  ${DIST_TEMP_FOLDER}/sample_csar_with_apex_policy.csar
173 }
174
175 function get_robot_file () {
176   case $PROJECT in
177
178   clamp | policy-clamp)
179     export ROBOT_FILE=$POLICY_CLAMP_ROBOT
180     export READINESS_CONTAINERS=($POLICY_CLAMP_CONTAINER)
181     ;;
182
183   api | policy-api)
184     export ROBOT_FILE=$POLICY_API_ROBOT
185     export READINESS_CONTAINERS=($POLICY_API_CONTAINER)
186     ;;
187
188   pap | policy-pap)
189     export ROBOT_FILE=$POLICY_PAP_ROBOT
190     export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_PAP_CONTAINER,$POLICY_API_CONTAINER,$POLICY_DROOLS_CONTAINER,
191     $POLICY_XACML_CONTAINER)
192     ;;
193
194   apex-pdp | policy-apex-pdp)
195     export ROBOT_FILE=$POLICY_APEX_PDP_ROBOT
196     export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER)
197     ;;
198
199   xacml-pdp | policy-xacml-pdp)
200     export ROBOT_FILE=($POLICY_XACML_PDP_ROBOT)
201     export READINESS_CONTAINERS=($POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER,$POLICY_XACML_CONTAINER)
202     ;;
203
204   drools-pdp | policy-drools-pdp)
205     export ROBOT_FILE=($POLICY_DROOLS_PDP_ROBOT)
206     export READINESS_CONTAINERS=($POLICY_DROOLS_CONTAINER)
207     ;;
208
209   distribution | policy-distribution)
210     export ROBOT_FILE=($POLICY_DISTRIBUTION_ROBOT)
211     export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER,
212     $POLICY_DISTRIBUTION_CONTAINER)
213     ;;
214
215   *)
216     echo "unknown project supplied"
217     ;;
218 esac
219
220 }
221
222
223 if [ $1 == "install" ];  then
224     spin_microk8s_cluster
225     if [ "${?}" -eq 0 ];  then
226         echo "Installing policy helm charts in the default namespace"
227         cd ${WORKSPACE}/helm || exit;
228         sudo microk8s helm dependency build policy
229         sudo microk8s helm install csit-policy policy
230         sudo microk8s helm install prometheus prometheus
231         echo "Policy chart installation completed"
232             echo "-------------------------------------------"
233     fi
234
235     if [ "$2" ]; then
236         export PROJECT=$2
237         export ROBOT_LOG_DIR=${WORKSPACE}/csit/archives/${PROJECT}
238         get_robot_file
239         echo "CSIT will be invoked from $ROBOT_FILE"
240         echo "Readiness containers: ${READINESS_CONTAINERS[*]}"
241         echo "-------------------------------------------"
242         start_csit
243     else
244         echo "No project supplied for running CSIT"
245     fi
246
247 elif [ $1 == "uninstall" ];  then
248     teardown_cluster
249 else
250     echo "Invalid arguments provided. Usage: $0 [option..] {install {project} | uninstall}"
251 fi
252