b998651452b7c019638376b7e3373ea4a9fdd8e5
[integration.git] / deployment / aks / cloud.sh
1 #!/bin/bash
2 # Copyright 2019 AT&T Intellectual Property. All rights reserved.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 #         http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
17
18 NO_PROMPT=0
19 NO_INSTALL=0
20 NO_VALIDATE=0
21 POST_INSTALL=0
22 OVERRIDE=0
23
24 OPENSTACK_CLI_POD="os-cli-0"
25
26 if [ ! -f $DIR/cloud.conf ]; then
27   echo "cloud.conf not found, exiting..."
28   exit 1
29 fi
30
31 . $DIR/cloud.conf
32
33 while test $# -gt 0; do
34   case "$1" in
35     -h|--help)
36       echo "./cloud.sh [options]"
37       echo " "
38       echo " "
39       echo "options:"
40       echo "-f, --no-prompt           executes with no prompt for confirmation"
41       echo "-n, --no-install          don't install ONAP"
42       echo "-o, --override            create integration override for robot configuration"
43       echo "-d, --no-validate         dont validate pre-reqs before executing deployment"
44       echo "-p, --post-install        execute post-install scripts"
45       echo "-h, --help                provide brief overview of script"
46       echo " "
47       echo "This script deploys a cloud environment in Azure."
48       echo "It: "
49       echo "- Uses Azure Kubernetes Service (AKS) to bootstrap a kubernetes cluster."
50       echo "- Creates a VM with an external disk to be used as NFS storage."
51       echo "- Creates a VM and installs DevStack, to be used with ONAP."
52       echo "- Launches ONAP onto the AKS Cluster via OOM."
53       echo "- Configures Networking, SSH Access, and Security Group Rules"
54       echo ""
55       exit 0
56       ;;
57     -f|--no-prompt)
58       shift
59       NO_PROMPT=1
60       ;;
61     -n|--no-install)
62       shift
63       NO_INSTALL=1
64       ;;
65     -o|--override)
66       shift
67       OVERRIDE=1
68       ;;
69     -d|--no-validate)
70       shift
71       NO_VALIDATE=1
72       ;;
73     -p|--post-install)
74       shift
75       POST_INSTALL=1
76       ;;
77     *)
78       echo "Unknown Argument. Try running with --help ."
79       exit 0
80       ;;
81   esac
82 done
83
84 if [ $NO_VALIDATE = 0 ]; then
85   $DIR/pre_install.sh "$AKS_K8_VERSION" "$LOCATION"
86   if [ $? -ne 0 ]; then
87     exit 1
88   fi
89 fi
90
91 cat <<EOF
92
93 Here are the parameters to be used in this build:
94
95 # GLOBAL PARAMS
96 LOCATION                = "$LOCATION"
97 USER_PUBLIC_IP_PREFIX   = "$USER_PUBLIC_IP_PREFIX"
98 BUILD_DIR               = "$BUILD_DIR"
99
100 # AKS PARAMS
101 AKS_RESOURCE_GROUP_NAME = "$AKS_RESOURCE_GROUP_NAME"
102 AKS_NAME                = "$AKS_NAME"
103 AKS_K8_VERSION          = "$AKS_K8_VERSION"
104 AKS_NODE_COUNT          = "$AKS_NODE_COUNT"
105 AKS_NODE_SIZE           = "$AKS_NODE_SIZE"
106 AKS_DNS_PREFIX          = "$AKS_DNS_PREFIX"
107 AKS_POD_CIDR            = "$AKS_POD_CIDR"
108 AKS_NODE_CIDR           = "$AKS_NODE_CIDR"
109 AKS_SERVICE_CIDR        = "$AKS_SERVICE_CIDR"
110 AKS_DNS_IP              = "$AKS_DNS_IP"
111 AKS_VNET_NAME           = "$AKS_VNET_NAME"
112 AKS_ADMIN_USER=         = "$AKS_ADMIN_USER"
113
114 # NFS PARAMS
115 NFS_NAME                = "$NFS_NAME"
116 NFS_RG                  = "$NFS_RG"
117 NFS_VM_SIZE             = "$NFS_VM_SIZE"
118 NFS_LOCATION            = "$NFS_LOCATION"
119 NFS_CIDR                = "$NFS_CIDR"
120 NFS_ADMIN_USER          = "$NFS_ADMIN_USER"
121 NFS_VNET_NAME           = "$NFS_VNET_NAME"
122 NFS_SUBNET_NAME         = "$NFS_SUBNET_NAME"
123 NFS_DISK_SIZE           = "$NFS_DISK_SIZE"
124
125 # DEVSTACK PARAMS
126 DEVSTACK_NAME           = "$DEVSTACK_NAME"
127 DEVSTACK_RG             = "$DEVSTACK_RG"
128 DEVSTACK_VM_SIZE        = "$DEVSTACK_VM_SIZE"
129 DEVSTACK_LOCATION       = "$DEVSTACK_LOCATION"
130 DEVSTACK_CIDR           = "$DEVSTACK_CIDR"
131 DEVSTACK_PRIVATE_IP     = "$DEVSTACK_PRIVATE_IP"
132 DEVSTACK_ADMIN_USER     = "$DEVSTACK_ADMIN_USER"
133 DEVSTACK_VNET_NAME      = "$DEVSTACK_VNET_NAME"
134 DEVSTACK_SUBNET_NAME    = "$DEVSTACK_SUBNET_NAME"
135 DEVSTACK_DISK_SIZE      = "$DEVSTACK_DISK_SIZE"
136 DEVSTACK_BRANCH         = "$DEVSTACK_BRANCH"
137 OPENSTACK_USER          = "$OPENSTACK_USER"
138 OPENSTACK_PASS          = "$OPENSTACK_PASS"
139 OPENSTACK_TENANT        = "$OPENSTACK_TENANT"
140 IMAGE_LIST              = "$IMAGE_LIST"
141
142 # ONAP PARAMS
143 CLLI                    = "$CLLI"
144 CLOUD_OWNER             = "$CLOUD_OWNER"
145 CLOUD_REGION            = "$CLOUD_REGION"
146 CUSTOMER                = "$CUSTOMER"
147 SUBSCRIBER              = "$SUBSCRIBER"
148 SERVICE_TYPE            = "$SERVICE_TYPE"
149 AZ                      = "$AZ"
150 OE                      = "$OE"
151 LOB                     = "$LOB"
152 PLATFORM                = "$PLATFORM"
153 OS_ID                   = "$OS_ID"
154 OS_TENANT_ROLE          = "$OS_TENANT_ROLE"
155 OS_KEYSTONE             = "$OS_KEYSTONE"
156 OPENSTACK_REGION        = "$OPENSTACK_REGION"
157 PROJECT                 = "$PROJECT"
158 OOM_BRANCH              = "$OOM_BRANCH"
159 CHART_VERSION           = "$CHART_VERSION"
160 OOM_OVERRIDES           = "$OOM_OVERRIDES"
161 DOCKER_REPOSITORY       = "$DOCKER_REPOSITORY"
162
163 EOF
164
165 if [ $NO_PROMPT = 0 ]; then
166   read -p "Would you like to proceed? [y/n]" -n 1 -r
167   echo " "
168   if [[ ! $REPLY =~ ^[Yy]$ ]]
169   then
170       exit 0
171   fi
172 fi
173
174 echo "Starting instantiation. This will take a little while..."
175 sleep 3
176
177 set -x
178 set -e
179
180 mkdir -p $BUILD_DIR
181
182 echo "#!/bin/bash" > $BUILD_DIR/clean.sh
183 echo "" >> $BUILD_DIR/clean.sh
184 chmod 755 $BUILD_DIR/clean.sh
185
186 ssh-keygen -t rsa -N "" -f $BUILD_DIR/id_rsa
187
188 PUBLIC_KEY=$BUILD_DIR/id_rsa.pub
189 PRIVATE_KEY=$BUILD_DIR/id_rsa
190
191
192 echo "az group delete --resource-group $DEVSTACK_RG --yes" >> $BUILD_DIR/clean.sh
193 echo "" >> $BUILD_DIR/clean.sh
194
195 echo "Creating DEVSTACK Server $DEVSTACK_NAME in $LOCATION"
196 $DIR/create_devstack.sh --name "$DEVSTACK_NAME" \
197                         --resource-group "$DEVSTACK_RG" \
198                         --size "$DEVSTACK_VM_SIZE" \
199                         --location "$DEVSTACK_LOCATION" \
200                         --cidr "$DEVSTACK_CIDR" \
201                         --admin-user "$DEVSTACK_ADMIN_USER" \
202                         --directory "$BUILD_DIR" \
203                         --vnet-name "$DEVSTACK_VNET_NAME" \
204                         --public-key "$PUBLIC_KEY" \
205                         --user-public-ip "$USER_PUBLIC_IP_PREFIX" \
206                         --devstack-private-ip "$DEVSTACK_PRIVATE_IP" \
207                         --devstack-subnet-name "$DEVSTACK_SUBNET_NAME" \
208                         --devstack-disk-size "$DEVSTACK_DISK_SIZE" \
209                         --openstack-username "$OPENSTACK_USER" \
210                         --openstack-password "$OPENSTACK_PASS" \
211                         --openstack-tenant "$OPENSTACK_TENANT" \
212                         --image-list "$IMAGE_LIST" \
213                         --devstack-branch "$DEVSTACK_BRANCH" \
214                         --no-prompt
215
216
217 echo "az group delete --resource-group $NFS_RG --yes" >> $BUILD_DIR/clean.sh
218 echo "" >> $BUILD_DIR/clean.sh
219
220 echo "Creating NFS Server $NFS_NAME in $LOCATION"
221 $DIR/create_nfs.sh --name "$NFS_NAME" \
222                    --resource-group "$NFS_RG" \
223                    --size "$NFS_VM_SIZE" \
224                    --location "$NFS_LOCATION" \
225                    --cidr "$NFS_CIDR" \
226                    --admin-user "$NFS_ADMIN_USER" \
227                    --directory "$BUILD_DIR" \
228                    --vnet-name "$NFS_VNET_NAME" \
229                    --public-key "$PUBLIC_KEY" \
230                    --user-public-ip "$USER_PUBLIC_IP_PREFIX" \
231                    --nfs-subnet-name "$NFS_SUBNET_NAME" \
232                    --aks-node-cidr "$AKS_NODE_CIDR" \
233                    --nfs-disk-size "$NFS_DISK_SIZE" \
234                    --no-prompt
235
236
237 echo "az group delete --resource-group $AKS_RESOURCE_GROUP_NAME --yes" >> $BUILD_DIR/clean.sh
238 echo "" >> $BUILD_DIR/clean.sh
239
240 echo "Creating AKS $AKS_NAME in $LOCATION"
241 $DIR/create_aks.sh --name "$AKS_NAME" \
242                    --resource-group "$AKS_RESOURCE_GROUP_NAME" \
243                    --kube-version "$AKS_K8_VERSION" \
244                    --location "$LOCATION" \
245                    --node-count "$AKS_NODE_COUNT" \
246                    --size "$AKS_NODE_SIZE" \
247                    --service-cidr "$AKS_SERVICE_CIDR" \
248                    --pod-cidr "$AKS_POD_CIDR" \
249                    --dns-ip "$AKS_DNS_IP" \
250                    --node-cidr "$AKS_NODE_CIDR" \
251                    --vnet-name "$AKS_VNET_NAME" \
252                    --user-public-ip "$USER_PUBLIC_IP_PREFIX" \
253                    --public-key "$PUBLIC_KEY" \
254                    --admin-user "$AKS_ADMIN_USER" \
255                    --no-prompt
256
257
258 AKS_MANAGEMENT_RESOURCE_GROUP_NAME=`az group list --query "[?starts_with(name, 'MC_${AKS_RESOURCE_GROUP_NAME}')].name | [0]" --output tsv`
259 AKS_VNET_ID=`az network vnet show --resource-group ${AKS_RESOURCE_GROUP_NAME} --name ${AKS_VNET_NAME} --query 'id' --output tsv`
260 NFS_VNET_ID=`az network vnet show --name ${NFS_VNET_NAME}  --resource-group ${NFS_RG} --query "id" --output tsv`
261 DEVSTACK_VNET_ID=`az network vnet show --name ${DEVSTACK_VNET_NAME}  --resource-group ${DEVSTACK_RG} --query "id" --output tsv`
262 AKS_ROUTE_TABLE_NAME=`az resource list --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} --resource-type "Microsoft.Network/routeTables" --query "[0] | name" --output tsv`
263 DEVSTACK_PRIVATE_IP=`az vm show --name ${DEVSTACK_NAME} --resource-group ${DEVSTACK_RG} -d  --query "privateIps" --output tsv`
264 NFS_PRIVATE_IP=`az vm show --name ${NFS_NAME} --resource-group ${NFS_RG} -d  --query "privateIps" --output tsv`
265 NFS_PUBLIC_IP=`az vm show --name ${NFS_NAME} --resource-group ${NFS_RG} -d  --query "publicIps" --output tsv`
266 DEVSTACK_PUBLIC_IP=`az vm show --name ${DEVSTACK_NAME} --resource-group ${DEVSTACK_RG} -d  --query "publicIps" --output tsv`
267
268 # adding public ip to  aks
269 NIC_NAME0=`az resource list --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} --resource-type "Microsoft.Network/networkInterfaces" --query "[0] | name" --output tsv`
270 AKS_NSG_NAME=`az resource list --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} --resource-type "Microsoft.Network/networkSecurityGroups" --query "[0] | name" --output tsv`
271 $DIR/create_public_ip.sh "AKSPUBLICIP1" "$AKS_MANAGEMENT_RESOURCE_GROUP_NAME" "$NIC_NAME0"
272 $DIR/create_sg_rule.sh "$AKS_MANAGEMENT_RESOURCE_GROUP_NAME" "$AKS_NSG_NAME" '*' "30000-32000" "$USER_PUBLIC_IP_PREFIX" '*' '*' "ONAP" "120"
273
274 AKS_PUBLIC_IP_ADDRESS=`az network public-ip show --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} -n AKSPUBLICIP1 --query "ipAddress" --output tsv`
275
276 ### Peering networks ###
277 # peering requires source = VNet NAME, destination = VNet ID
278
279 echo "creating peering from AKS Vnet to NFS Vnet..."
280 $DIR/create_peering.sh "$AKS_VNET_NAME" \
281                        "$AKS_RESOURCE_GROUP_NAME" \
282                        "$NFS_VNET_ID" \
283                        "kube-to-nfs"
284
285 echo "creating peering from AKS Vnet to Devstack Vnet..."
286 $DIR/create_peering.sh "$AKS_VNET_NAME" \
287                        "$AKS_RESOURCE_GROUP_NAME" \
288                        "$DEVSTACK_VNET_ID" \
289                        "kube-to-devstack"
290
291 echo "creating peering from NFS Vnet to AKS Vnet..."
292 $DIR/create_peering.sh "$NFS_VNET_NAME" \
293                        "$NFS_RG" \
294                        "$AKS_VNET_ID" \
295                        "nfs-to-kube"
296
297 echo "creating peering from NFS Vnet to AKS Vnet..."
298 $DIR/create_peering.sh "$DEVSTACK_VNET_NAME" \
299                        "$DEVSTACK_RG" \
300                        "$AKS_VNET_ID" \
301                        "devstack-to-kube"
302
303
304 ### Adding next hop to kubernetes for devstack ###
305 echo "creating route from AKS Vnet to Devstack Vnet..."
306 $DIR/create_route.sh "$DEVSTACK_CIDR" \
307                      "guestvms" \
308                      "$AKS_MANAGEMENT_RESOURCE_GROUP_NAME" \
309                      "$AKS_ROUTE_TABLE_NAME" \
310                      "$DEVSTACK_PRIVATE_IP"
311
312
313
314 # TODO
315 # Lets find a better place for this
316 az aks get-credentials --resource-group "$AKS_RESOURCE_GROUP_NAME" \
317                        --name "$AKS_NAME" \
318                        --file "$BUILD_DIR"/"kubeconfig"
319
320 $DIR/configure_nfs_pod.sh "$PRIVATE_KEY" \
321                           "$BUILD_DIR"/"kubeconfig" \
322                           "$NFS_PRIVATE_IP" \
323                           "$AKS_ADMIN_USER"
324
325 # TODO
326 # add this to post-install or post-configure phase
327 # to support adding multiple devstacks to same ONAP
328 cat > "$BUILD_DIR/openstack_rc" <<EOF
329 export OS_USERNAME="$OPENSTACK_USER"
330 export OS_PROJECT_NAME="$OPENSTACK_TENANT"
331 export OS_AUTH_URL="http://$DEVSTACK_PRIVATE_IP/identity"
332 export OS_PASSWORD="$OPENSTACK_PASS"
333 export OS_USER_DOMAIN_NAME=default
334 export OS_PROJECT_DOMAIN_ID=default
335 EOF
336
337 $DIR/util/create_openstack_cli.sh "$BUILD_DIR/kubeconfig" \
338                                   "$BUILD_DIR/openstack_rc" \
339                                   "$OPENSTACK_CLI_POD"
340
341
342 if [ $OVERRIDE = 1 ]; then
343
344 $DIR/util/create_integration_override.sh "$BUILD_DIR" \
345                                          "$OPENSTACK_CLI_POD" \
346                                          "$BUILD_DIR/openstack_rc" \
347                                          "$DOCKER_REPOSITORY" \
348                                          "$NFS_PRIVATE_IP" \
349                                          "$AKS_PUBLIC_IP_ADDRESS" \
350                                          "$BUILD_DIR/kubeconfig"
351
352 fi
353
354
355 if [ $NO_INSTALL = 0 ]; then
356
357 ### Starting OOM install ###
358 echo "Installing ONAP..."
359 $DIR/create_onap.sh "$BUILD" \
360                     "$BUILD_DIR/kubeconfig" \
361                     "$OOM_BRANCH" \
362                     "$BUILD_DIR" \
363                     "$CHART_VERSION" \
364                     "$OOM_OVERRIDES"
365
366 fi
367
368
369 set +x
370
371 cat > "$BUILD_DIR/deployment.notes" <<EOF
372 ==================================================================
373 Phew, all done (yay!). ONAP and DevStack might still be installing
374 but here are the access details...
375
376 --------DEVSTACK ACCESS--------
377 ssh -i ${PRIVATE_KEY} ${DEVSTACK_ADMIN_USER}@${DEVSTACK_PUBLIC_IP}
378 horizon: http://${DEVSTACK_PUBLIC_IP}
379 cli: kubectl exec $OPENSTACK_CLI_POD -- sh -lc "<openstack command>"
380
381 --------NFS ACCESS--------
382 ssh -i ${PRIVATE_KEY} ${NFS_ADMIN_USER}@${NFS_PUBLIC_IP}
383
384 --------KUBERNETES ACCESS--------
385 kubeconfig: export KUBECONFIG=$BUILD_DIR/kubeconfig
386 dashboard: az aks browse --resource-group ${AKS_RESOURCE_GROUP_NAME} --name ${AKS_NAME}
387
388 --------BUILD DETAILS--------
389 Build directory: $BUILD_DIR
390 Integration repo: $BUILD_DIR/integration
391 OOM repo: $BUILD_DIR/oom
392
393 --------ADD TO /etc/hosts--------
394 $AKS_PUBLIC_IP_ADDRESS portal.api.simpledemo.onap.org
395 $AKS_PUBLIC_IP_ADDRESS sdc.api.simpledemo.onap.org
396 $AKS_PUBLIC_IP_ADDRESS sdc.api.fe.simpledemo.onap.org
397 $AKS_PUBLIC_IP_ADDRESS sdc.api.be.simpledemo.onap.org
398 $AKS_PUBLIC_IP_ADDRESS vid.api.simpledemo.onap.org
399 $AKS_PUBLIC_IP_ADDRESS policy.api.simpledemo.onap.org
400 $AKS_PUBLIC_IP_ADDRESS aai.api.simpledemo.onap.org
401 $AKS_PUBLIC_IP_ADDRESS cli.api.simpledemo.onap.org
402 $AKS_PUBLIC_IP_ADDRESS so.api.simpledemo.onap.org
403 $AKS_PUBLIC_IP_ADDRESS so.monitoring.api.simpledemo.onap.org
404 $AKS_PUBLIC_IP_ADDRESS so-monitoring
405 $AKS_PUBLIC_IP_ADDRESS sdnc.api.simpledemo.onap.org
406 $AKS_PUBLIC_IP_ADDRESS clamp.api.simpledemo.onap.org
407 $AKS_PUBLIC_IP_ADDRESS dcae.api.simpledemo.onap.org
408 $AKS_PUBLIC_IP_ADDRESS appc.api.simpledemo.onap.org
409 $AKS_PUBLIC_IP_ADDRESS aaf.api.simpledemo.onap.org
410 $AKS_PUBLIC_IP_ADDRESS portal-sdk.simpledemo.onap.org
411 $AKS_PUBLIC_IP_ADDRESS robot.api.simpledemo.onap.org
412 $AKS_PUBLIC_IP_ADDRESS msb.api.discovery.simpledemo.onap.org
413 $AKS_PUBLIC_IP_ADDRESS msb.api.simpledemo.onap.org
414 $AKS_PUBLIC_IP_ADDRESS aai.ui.simpledemo.onap.org
415 $AKS_PUBLIC_IP_ADDRESS policy.api.simpledemo.onap.org
416
417 EOF
418
419 cat "$BUILD_DIR/deployment.notes"
420
421
422 if [ $POST_INSTALL = 1 ]; then
423
424 echo "Executing post installation scripts..."
425 sleep 3
426
427 cat > "$BUILD_DIR/onap.conf" <<EOF
428 export CLLI=$CLLI
429 export CLOUD_OWNER=$CLOUD_OWNER
430 export CLOUD_REGION=$CLOUD_REGION
431 export OPENSTACK_IP=$DEVSTACK_PRIVATE_IP
432 export OPENSTACK_USER=$OPENSTACK_USER
433 export OPENSTACK_PASS=$OPENSTACK_PASS
434 export OPENSTACK_TENANT=$OPENSTACK_TENANT
435 export OPENSTACK_REGION=$OPENSTACK_REGION
436 export CUSTOMER=$CUSTOMER
437 export SUBSCRIBER=$SUBSCRIBER
438 export SERVICE_TYPE=$SERVICE_TYPE
439 export AZ=$AZ
440 export OE=$OE
441 export LOB=$LOB
442 export PLATFORM=$PLATFORM
443 export PROJECT=$PROJECT
444 export OS_ID=$OS_ID
445 export OS_TENANT_ROLE=$OS_TENANT_ROLE
446 export OS_KEYSTONE=$OS_KEYSTONE
447 export KUBECONFIG=$BUILD_DIR/kubeconfig
448 export NFS_PRIVATE_IP=$NFS_PRIVATE_IP
449 export DEVSTACK_PRIVATE_IP=$DEVSTACK_PRIVATE_IP
450 export PRIVATE_KEY=$PRIVATE_KEY
451 EOF
452
453 $DIR/post_install.sh "$BUILD_DIR/onap.conf" "$DIR/cloud.conf"
454
455 fi