d6254ac32e9cd81c946b1491502778284a4f8d5e
[multicloud/k8s.git] / kud / tests / plugin_fw_v2.sh
1 #!/bin/bash
2 # SPDX-license-identifier: Apache-2.0
3 ##############################################################################
4 # Copyright (c) 2020
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11 set -o errexit
12 set -o nounset
13 set -o pipefail
14
15 source _common_test.sh
16 source _functions.sh
17 source _functions.sh
18
19 # TODO KUBECONFIG may be a list of paths
20 kubeconfig_path="${KUBECONFIG:-$HOME/.kube/config}"
21
22 clusters="${KUD_PLUGIN_FW_CLUSTERS:-$(cat <<EOF
23 [
24   {
25     "metadata": {
26       "name": "edge01",
27       "description": "description of edge01",
28       "userData1": "edge01 user data 1",
29       "userData2": "edge01 user data 2"
30     },
31     "file": "$kubeconfig_path"
32   }
33 ]
34 EOF
35 )}"
36
37 function cluster_names {
38     echo $clusters | jq -e -r '.[].metadata.name'
39 }
40
41 function cluster_metadata {
42     cat<<EOF | jq .
43 {
44   "metadata": $(echo $clusters | jq -e -r --arg name "$1" '.[]|select(.metadata.name==$name)|.metadata')
45 }
46 EOF
47 }
48
49 function cluster_file {
50     echo $clusters | jq -e -r --arg name "$1" '.[]|select(.metadata.name==$name)|.file'
51 }
52
53 ARGS=()
54 while [[ $# -gt 0 ]]; do
55     arg="$1"
56
57     case $arg in
58         "--external" )
59             service_host=$(kubectl cluster-info | grep "Kubernetes master" | \
60                 awk -F ":" '{print $2}' | awk -F "//" '{print $2}')
61             shift
62             ;;
63         * )
64             ARGS+=("$1")
65             shift
66             ;;
67     esac
68 done
69 set -- "${ARGS[@]}" # restore positional parameters
70
71 service_host=${service_host:-"localhost"}
72
73 CSAR_DIR="/opt/csar"
74 csar_id="4bf66240-a0be-4ce2-aebd-a01df7725f16"
75
76 demo_folder=$test_folder/../demo
77
78 function populate_CSAR_compositevfw_helm {
79     _checks_args "$1"
80     pushd "${CSAR_DIR}/$1"
81     print_msg "Create Helm Chart Archives for compositevfw"
82     rm -f *.tar.gz
83     tar -czf packetgen.tar.gz -C $demo_folder/composite-firewall packetgen
84     tar -czf firewall.tar.gz -C $demo_folder/composite-firewall firewall
85     tar -czf sink.tar.gz -C $demo_folder/composite-firewall sink
86     tar -czf profile.tar.gz -C $demo_folder/composite-firewall manifest.yaml override_values.yaml
87     popd
88 }
89
90 project="testvfw"
91 composite_app="compositevfw"
92 version="v1"
93 deployment_intent_group="vfw_deployment_intent_group"
94
95 function setup {
96     install_deps
97     populate_CSAR_compositevfw_helm "$csar_id"
98     cat <<EOF >plugin_fw_v2_config.yaml
99 orchestrator:
100   host: ${service_host}
101   port: 30415
102 clm:
103   host: ${service_host}
104   port: 30461
105 ncm:
106   host: ${service_host}
107   port: 30431
108 ovnaction:
109   host: ${service_host}
110   port: 30471
111 dcm:
112   host: ${service_host}
113   port: 30477
114 gac:
115   host: ${service_host}
116   port: 30491
117 dtc:
118  host: ${service_host}
119  port: 30481
120 EOF
121     cat <<EOF >plugin_fw_v2_values.yaml
122 ClusterProvider: vfw-cluster-provider
123 ClusterLabel: LabelA
124 Clusters:
125 EOF
126     echo $clusters | jq -r '.[] | "- Name: \(.metadata.name)\n  KubeConfig: \(.file)"' >>plugin_fw_v2_values.yaml
127     cat <<EOF >>plugin_fw_v2_values.yaml
128 EmcoProviderNetwork: emco-private-net
129 UnprotectedProviderNetwork: unprotected-private-net
130 ProtectedNetwork: protected-private-net
131 Project: ${project}
132 LogicalCloud: lcadmin
133 CompositeApp: ${composite_app}
134 Version: ${version}
135 PackagesPath: ${CSAR_DIR}/${csar_id}
136 CompositeProfile: vfw_composite-profile
137 DeploymentIntentGroup: ${deployment_intent_group}
138 Release: fw0
139 DeploymentIntentsInGroup: vfw_deploy_intents
140 GenericPlacementIntent: generic-placement-intent
141 OvnActionIntent: vfw_ovnaction_intent
142 EOF
143 }
144
145 function call_emcoctl {
146     rc=$1
147     shift
148     # retry due to known issue with emcoctl and instantiating/terminating multiple resources
149     try=0
150     until [[ $(emcoctl $@ | awk '/Response Code:/ {code=$3} END{print code}') =~ $rc ]]; do
151         if [[ $try -lt 10 ]]; then
152             sleep 1s
153         else
154             return 1
155         fi
156         try=$((try + 1))
157     done
158     return 0
159 }
160
161 function createData {
162     call_emcoctl 2.. --config plugin_fw_v2_config.yaml apply -f plugin_fw_v2.yaml -v plugin_fw_v2_values.yaml
163 }
164
165 function getData {
166     emcoctl --config plugin_fw_v2_config.yaml get -f plugin_fw_v2.yaml -v plugin_fw_v2_values.yaml
167 }
168
169 function deleteData {
170     call_emcoctl 4.. --config plugin_fw_v2_config.yaml delete -f plugin_fw_v2.yaml -v plugin_fw_v2_values.yaml
171 }
172
173 function statusVfw {
174     emcoctl --config plugin_fw_v2_config.yaml get projects/${project}/composite-apps/${composite_app}/${version}/deployment-intent-groups/${deployment_intent_group}/status
175 }
176
177 function waitForVfw {
178     for try in {0..59}; do
179         sleep 1
180         new_phase="$(emcoctl --config plugin_fw_v2_config.yaml get projects/${project}/composite-apps/${composite_app}/${version}/deployment-intent-groups/${deployment_intent_group}/status | awk '/Response: / {print $2}' | jq -r .status)"
181         echo "$(date +%H:%M:%S) - Filter=[$*] : $new_phase"
182         if [[ "$new_phase" == "$1" ]]; then
183             return 0
184         fi
185     done
186 }
187
188 function usage {
189     echo "Usage: $0 setup|create|get|destroy|status"
190     echo "    setup - creates the emcoctl files and packages needed for vfw"
191     echo "    create - creates all ncm, ovnaction, clm resources needed for vfw"
192     echo "    get - queries all resources in ncm, ovnaction, clm resources created for vfw"
193     echo "    destroy - deletes all resources in ncm, ovnaction, clm resources created for vfw"
194     echo "    status - get status of deployed resources"
195     echo ""
196     echo "    a reasonable test sequence:"
197     echo "    1.  setup"
198     echo "    2.  create"
199     echo "    3.  destroy"
200
201     exit
202 }
203
204 if [[ "$#" -gt 0 ]] ; then
205     case "$1" in
206         "setup" ) setup ;;
207         "create" ) createData ;;
208         "get" ) getData ;;
209         "status" ) statusVfw ;;
210         "wait" ) waitForVfw "Instantiated" ;;
211         "delete" ) deleteData ;;
212         *) usage ;;
213     esac
214 else
215     setup
216     createData
217
218     print_msg "[BEGIN] Basic checks for instantiated resource"
219     print_msg "Wait for deployment to be instantiated"
220     waitForVfw "Instantiated"
221     for name in $(cluster_names); do
222         print_msg "Check that networks were created on cluster $name"
223         file=$(cluster_file "$name")
224         KUBECONFIG=$file kubectl get network protected-private-net -o name
225         KUBECONFIG=$file kubectl get providernetwork emco-private-net -o name
226         KUBECONFIG=$file kubectl get providernetwork unprotected-private-net -o name
227     done
228     for name in $(cluster_names); do
229         print_msg "Wait for all pods to start on cluster $name"
230         file=$(cluster_file "$name")
231         KUBECONFIG=$file kubectl wait pod -l release=fw0 --for=condition=Ready
232     done
233     # TODO: Provide some health check to verify vFW work
234     print_msg "Not waiting for vFW to fully install as no further checks are implemented in testcase"
235     #print_msg "Waiting 8minutes for vFW installation"
236     #sleep 8m
237     print_msg "[END] Basic checks for instantiated resource"
238
239     print_msg "Delete deployment"
240     deleteData
241 fi