25bc781c6d46c03335698cac3f6efeacf85dd3b8
[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 api-slas.robot"
33 POLICY_PAP_ROBOT="pap-test.robot pap-slas.robot"
34 POLICY_APEX_PDP_ROBOT="apex-pdp-test.robot apex-slas.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 SET_VALUES=""
46
47 DISTRIBUTION_CSAR=${WORKSPACE}/csit/resources/tests/data/csar
48 DIST_TEMP_FOLDER=/tmp/distribution
49
50 export PROJECT=""
51 export ROBOT_FILE=""
52 export ROBOT_LOG_DIR=${WORKSPACE}/csit/archives
53 export READINESS_CONTAINERS=()
54
55 function spin_microk8s_cluster() {
56     echo "Verify if Microk8s cluster is running.."
57     microk8s version
58     exitcode="${?}"
59
60     if [ "$exitcode" -ne 0 ]; then
61         echo "Microk8s cluster not available, Spinning up the cluster.."
62         sudo snap install microk8s --classic --channel=1.25/stable
63
64         if [ "${?}" -ne 0 ]; then
65             echo "Failed to install kubernetes cluster. Aborting.."
66             return 1
67         fi
68         echo "Microk8s cluster installed successfully"
69         sudo usermod -a -G microk8s $USER
70         echo "Enabling DNS and helm3 plugins"
71         sudo microk8s.enable dns helm3 hostpath-storage
72         echo "Creating configuration file for Microk8s"
73         sudo mkdir -p $HOME/.kube
74         sudo chown -R $USER:$USER $HOME/.kube
75         sudo microk8s kubectl config view --raw >$HOME/.kube/config
76         sudo chmod 600 $HOME/.kube/config
77         echo "K8s installation completed"
78         echo "----------------------------------------"
79     else
80         echo "K8s cluster is already running"
81         echo "----------------------------------------"
82         return 0
83     fi
84
85 }
86
87 function teardown_cluster() {
88     echo "Removing k8s cluster and k8s configuration file"
89     sudo microk8s helm uninstall csit-policy
90     sudo microk8s helm uninstall prometheus
91     sudo microk8s helm uninstall csit-robot
92     rm -rf ${WORKSPACE}/helm/policy/Chart.lock
93     sudo rm -rf /dockerdata-nfs/mariadb-galera/
94     echo "K8s Cluster removed"
95     echo "Clean up docker"
96     docker image prune -f
97 }
98
99 function build_robot_image() {
100     echo "Build docker image for robot framework"
101     cd ${WORKSPACE}/csit/resources || exit
102     clone_models
103     if [ "${PROJECT}" == "distribution" ] || [ "${PROJECT}" == "policy-distribution" ]; then
104         copy_csar_file
105     fi
106     echo "Build robot framework docker image"
107     docker login -u docker -p docker nexus3.onap.org:10001
108     docker build . --file Dockerfile \
109         --build-arg CSIT_SCRIPT="$CSIT_SCRIPT" \
110         --build-arg ROBOT_FILE="$ROBOT_FILE" \
111         --tag "${ROBOT_DOCKER_IMAGE}" --no-cache
112     echo "---------------------------------------------"
113 }
114
115 function start_csit() {
116     build_robot_image
117     if [ "${?}" -eq 0 ]; then
118         echo "Importing robot image into microk8s registry"
119         docker save -o policy-csit-robot.tar ${ROBOT_DOCKER_IMAGE}:latest
120         sudo microk8s ctr image import policy-csit-robot.tar
121         rm -rf ${WORKSPACE}/csit/resources/policy-csit-robot.tar
122         rm -rf ${WORKSPACE}/csit/resources/tests/models/
123         echo "---------------------------------------------"
124         echo "Installing Robot framework pod for running CSIT"
125         cd ${WORKSPACE}/helm
126         mkdir -p ${ROBOT_LOG_DIR}
127         sudo microk8s helm install csit-robot robot --set robot="$ROBOT_FILE" --set "readiness={${READINESS_CONTAINERS[*]}}" --set robotLogDir=$ROBOT_LOG_DIR
128         print_robot_log
129         teardown_cluster
130     fi
131 }
132
133 function print_robot_log() {
134     count_pods=0
135     while [[ ${count_pods} -eq 0 ]]; do
136         echo "Waiting for pods to come up..."
137         sleep 5
138         count_pods=$(sudo microk8s kubectl get pods --output name | wc -l)
139     done
140     sudo microk8s kubectl get po
141     robotpod=$(sudo microk8s kubectl get po | grep policy-csit)
142     podName=$(echo "$robotpod" | awk '{print $1}')
143     echo "The robot tests will begin once the policy components {${READINESS_CONTAINERS[*]}} are up and running..."
144     sudo microk8s kubectl wait --for=jsonpath='{.status.phase}'=Running --timeout=10m pod/"$podName"
145     sudo microk8s kubectl logs -f "$podName"
146     echo "Please check the logs of policy-csit-robot pod for the test execution results"
147 }
148
149 function clone_models() {
150     GERRIT_BRANCH=$(awk -F= '$1 == "defaultbranch" { print $2 }' "${WORKSPACE}"/.gitreview)
151     echo GERRIT_BRANCH="${GERRIT_BRANCH}"
152     # download models examples
153     git clone -b "${GERRIT_BRANCH}" --single-branch https://github.com/onap/policy-models.git "${WORKSPACE}"/csit/resources/tests/models
154
155     # create a couple of variations of the policy definitions
156     sed -e 's!Measurement_vGMUX!ADifferentValue!' \
157         tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.json \
158         >tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.v1_2.json
159
160     sed -e 's!"version": "1.0.0"!"version": "2.0.0"!' \
161         -e 's!"policy-version": 1!"policy-version": 2!' \
162         tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.json \
163         >tests/models/models-examples/src/main/resources/policies/vCPE.policy.monitoring.input.tosca.v2.json
164 }
165
166 function copy_csar_file() {
167     zip -F ${DISTRIBUTION_CSAR}/sample_csar_with_apex_policy.csar \
168         --out ${DISTRIBUTION_CSAR}/csar_temp.csar -q
169     # Remake temp directory
170     sudo rm -rf "${DIST_TEMP_FOLDER}"
171     sudo mkdir "${DIST_TEMP_FOLDER}"
172     sudo cp ${DISTRIBUTION_CSAR}/csar_temp.csar ${DISTRIBUTION_CSAR}/temp.csar
173     sudo mv ${DISTRIBUTION_CSAR}/temp.csar ${DIST_TEMP_FOLDER}/sample_csar_with_apex_policy.csar
174 }
175
176 function get_robot_file() {
177     case $PROJECT in
178
179     clamp | policy-clamp)
180         export ROBOT_FILE=$POLICY_CLAMP_ROBOT
181         export READINESS_CONTAINERS=($POLICY_CLAMP_CONTAINER)
182         ;;
183
184     api | policy-api)
185         export ROBOT_FILE=$POLICY_API_ROBOT
186         export READINESS_CONTAINERS=($POLICY_API_CONTAINER)
187         ;;
188
189     pap | policy-pap)
190         export ROBOT_FILE=$POLICY_PAP_ROBOT
191         export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_PAP_CONTAINER,$POLICY_API_CONTAINER,$POLICY_DROOLS_CONTAINER,
192             $POLICY_XACML_CONTAINER)
193         ;;
194
195     apex-pdp | policy-apex-pdp)
196         export ROBOT_FILE=$POLICY_APEX_PDP_ROBOT
197         export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER)
198         ;;
199
200     xacml-pdp | policy-xacml-pdp)
201         export ROBOT_FILE=($POLICY_XACML_PDP_ROBOT)
202         export READINESS_CONTAINERS=($POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER,$POLICY_XACML_CONTAINER)
203         ;;
204
205     drools-pdp | policy-drools-pdp)
206         export ROBOT_FILE=($POLICY_DROOLS_PDP_ROBOT)
207         export READINESS_CONTAINERS=($POLICY_DROOLS_CONTAINER)
208         ;;
209
210     distribution | policy-distribution)
211         export ROBOT_FILE=($POLICY_DISTRIBUTION_ROBOT)
212         export READINESS_CONTAINERS=($POLICY_APEX_CONTAINER,$POLICY_API_CONTAINER,$POLICY_PAP_CONTAINER,
213             $POLICY_DISTRIBUTION_CONTAINER)
214         ;;
215
216     *)
217         echo "unknown project supplied"
218         ;;
219     esac
220
221 }
222
223 function set_charts() {
224     case $PROJECT in
225
226     clamp | policy-clamp)
227         export SET_VALUES="--set $POLICY_CLAMP_CONTAINER.enabled=true"
228         ;;
229
230     api | policy-api)
231         export SET_VALUES="--set $POLICY_API_CONTAINER.enabled=true"
232         ;;
233
234     pap | policy-pap)
235         export SET_VALUES="--set $POLICY_APEX_CONTAINER.enabled=true --set $POLICY_PAP_CONTAINER.enabled=true --set $POLICY_API_CONTAINER.enabled=true 
236     --set $POLICY_DROOLS_CONTAINER.enabled=true --set $POLICY_XACML_CONTAINER.enabled=true"
237         ;;
238
239     apex-pdp | policy-apex-pdp)
240         export SET_VALUES="--set $POLICY_APEX_CONTAINER.enabled=true --set $POLICY_PAP_CONTAINER.enabled=true --set $POLICY_API_CONTAINER.enabled=true"
241         ;;
242
243     xacml-pdp | policy-xacml-pdp)
244         export SET_VALUES="--set $POLICY_PAP_CONTAINER.enabled=true --set $POLICY_API_CONTAINER.enabled=true --set $POLICY_XACML_CONTAINER.enabled=true"
245         ;;
246
247     drools-pdp | policy-drools-pdp)
248         export SET_VALUES="--set $POLICY_DROOLS_CONTAINER.enabled=true"
249         ;;
250
251     distribution | policy-distribution)
252         export SET_VALUES="--set $POLICY_APEX_CONTAINER.enabled=true --set $POLICY_PAP_CONTAINER.enabled=true --set $POLICY_API_CONTAINER.enabled=true 
253     --set $POLICY_DISTRIBUTION_CONTAINER.enabled=true"
254         ;;
255
256     *)
257         echo "all charts to be deployed"
258         ;;
259     esac
260
261 }
262
263 OPERATION="$1"
264 PROJECT="$2"
265
266 if [ $OPERATION == "install" ]; then
267     spin_microk8s_cluster
268     if [ "${?}" -eq 0 ]; then
269         set_charts
270         echo "Installing policy helm charts in the default namespace"
271         cd ${WORKSPACE}/helm || exit
272         sudo microk8s helm dependency build policy
273         sudo microk8s helm install csit-policy policy ${SET_VALUES}
274         sudo microk8s helm install prometheus prometheus
275         echo "Policy chart installation completed"
276         echo "-------------------------------------------"
277     fi
278
279     if [ "$PROJECT" ]; then
280         export $PROJECT
281         export ROBOT_LOG_DIR=${WORKSPACE}/csit/archives/${PROJECT}
282         get_robot_file
283         echo "CSIT will be invoked from $ROBOT_FILE"
284         echo "Readiness containers: ${READINESS_CONTAINERS[*]}"
285         echo "-------------------------------------------"
286         start_csit
287     else
288         echo "No project supplied for running CSIT"
289     fi
290
291 elif [ $OPERATION == "uninstall" ]; then
292     teardown_cluster
293 else
294     echo "Invalid arguments provided. Usage: $0 [option..] {install {project} | uninstall}"
295 fi