2 # Copyright 2019 AT&T Intellectual Property. All rights reserved.
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
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
16 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
24 OPENSTACK_CLI_POD="os-cli-0"
26 if [ ! -f $DIR/cloud.conf ]; then
27 echo "cloud.conf not found, exiting..."
33 while test $# -gt 0; do
36 echo "./cloud.sh [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"
47 echo "This script deploys a cloud environment in Azure."
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"
78 echo "Unknown Argument. Try running with --help ."
84 if [ $NO_VALIDATE = 0 ]; then
85 $DIR/pre_install.sh "$AKS_K8_VERSION" "$LOCATION"
93 Here are the parameters to be used in this build:
96 LOCATION = "$LOCATION"
97 USER_PUBLIC_IP_PREFIX = "$USER_PUBLIC_IP_PREFIX"
98 BUILD_DIR = "$BUILD_DIR"
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"
115 NFS_NAME = "$NFS_NAME"
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"
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"
144 CLOUD_OWNER = "$CLOUD_OWNER"
145 CLOUD_REGION = "$CLOUD_REGION"
146 CUSTOMER = "$CUSTOMER"
147 SUBSCRIBER = "$SUBSCRIBER"
148 SERVICE_TYPE = "$SERVICE_TYPE"
152 PLATFORM = "$PLATFORM"
154 OS_TENANT_ROLE = "$OS_TENANT_ROLE"
155 OS_KEYSTONE = "$OS_KEYSTONE"
156 OPENSTACK_REGION = "$OPENSTACK_REGION"
158 OOM_BRANCH = "$OOM_BRANCH"
159 CHART_VERSION = "$CHART_VERSION"
160 OOM_OVERRIDES = "$OOM_OVERRIDES"
161 DOCKER_REPOSITORY = "$DOCKER_REPOSITORY"
162 MASTER_PASSWORD = "$MASTER_PASSWORD"
166 if [ $NO_PROMPT = 0 ]; then
167 read -p "Would you like to proceed? [y/n]" -n 1 -r
169 if [[ ! $REPLY =~ ^[Yy]$ ]]
175 echo "Starting instantiation. This will take a little while..."
183 echo "#!/bin/bash" > $BUILD_DIR/clean.sh
184 echo "" >> $BUILD_DIR/clean.sh
185 chmod 755 $BUILD_DIR/clean.sh
187 ssh-keygen -t rsa -N "" -f $BUILD_DIR/id_rsa
189 PUBLIC_KEY=$BUILD_DIR/id_rsa.pub
190 PRIVATE_KEY=$BUILD_DIR/id_rsa
193 echo "az group delete --resource-group $DEVSTACK_RG --yes" >> $BUILD_DIR/clean.sh
194 echo "" >> $BUILD_DIR/clean.sh
196 echo "Creating DEVSTACK Server $DEVSTACK_NAME in $LOCATION"
197 $DIR/create_devstack.sh --name "$DEVSTACK_NAME" \
198 --resource-group "$DEVSTACK_RG" \
199 --size "$DEVSTACK_VM_SIZE" \
200 --location "$DEVSTACK_LOCATION" \
201 --cidr "$DEVSTACK_CIDR" \
202 --admin-user "$DEVSTACK_ADMIN_USER" \
203 --directory "$BUILD_DIR" \
204 --vnet-name "$DEVSTACK_VNET_NAME" \
205 --public-key "$PUBLIC_KEY" \
206 --user-public-ip "$USER_PUBLIC_IP_PREFIX" \
207 --devstack-private-ip "$DEVSTACK_PRIVATE_IP" \
208 --devstack-subnet-name "$DEVSTACK_SUBNET_NAME" \
209 --devstack-disk-size "$DEVSTACK_DISK_SIZE" \
210 --openstack-username "$OPENSTACK_USER" \
211 --openstack-password "$OPENSTACK_PASS" \
212 --openstack-tenant "$OPENSTACK_TENANT" \
213 --image-list "$IMAGE_LIST" \
214 --devstack-branch "$DEVSTACK_BRANCH" \
218 echo "az group delete --resource-group $NFS_RG --yes" >> $BUILD_DIR/clean.sh
219 echo "" >> $BUILD_DIR/clean.sh
221 echo "Creating NFS Server $NFS_NAME in $LOCATION"
222 $DIR/create_nfs.sh --name "$NFS_NAME" \
223 --resource-group "$NFS_RG" \
224 --size "$NFS_VM_SIZE" \
225 --location "$NFS_LOCATION" \
227 --admin-user "$NFS_ADMIN_USER" \
228 --directory "$BUILD_DIR" \
229 --vnet-name "$NFS_VNET_NAME" \
230 --public-key "$PUBLIC_KEY" \
231 --user-public-ip "$USER_PUBLIC_IP_PREFIX" \
232 --nfs-subnet-name "$NFS_SUBNET_NAME" \
233 --aks-node-cidr "$AKS_NODE_CIDR" \
234 --nfs-disk-size "$NFS_DISK_SIZE" \
238 echo "az group delete --resource-group $AKS_RESOURCE_GROUP_NAME --yes" >> $BUILD_DIR/clean.sh
239 echo "" >> $BUILD_DIR/clean.sh
241 echo "Creating AKS $AKS_NAME in $LOCATION"
242 $DIR/create_aks.sh --name "$AKS_NAME" \
243 --resource-group "$AKS_RESOURCE_GROUP_NAME" \
244 --kube-version "$AKS_K8_VERSION" \
245 --location "$LOCATION" \
246 --node-count "$AKS_NODE_COUNT" \
247 --size "$AKS_NODE_SIZE" \
248 --service-cidr "$AKS_SERVICE_CIDR" \
249 --pod-cidr "$AKS_POD_CIDR" \
250 --dns-ip "$AKS_DNS_IP" \
251 --node-cidr "$AKS_NODE_CIDR" \
252 --vnet-name "$AKS_VNET_NAME" \
253 --user-public-ip "$USER_PUBLIC_IP_PREFIX" \
254 --public-key "$PUBLIC_KEY" \
255 --admin-user "$AKS_ADMIN_USER" \
259 AKS_MANAGEMENT_RESOURCE_GROUP_NAME=`az group list --query "[?starts_with(name, 'MC_${AKS_RESOURCE_GROUP_NAME}')].name | [0]" --output tsv`
260 AKS_VNET_ID=`az network vnet show --resource-group ${AKS_RESOURCE_GROUP_NAME} --name ${AKS_VNET_NAME} --query 'id' --output tsv`
261 NFS_VNET_ID=`az network vnet show --name ${NFS_VNET_NAME} --resource-group ${NFS_RG} --query "id" --output tsv`
262 DEVSTACK_VNET_ID=`az network vnet show --name ${DEVSTACK_VNET_NAME} --resource-group ${DEVSTACK_RG} --query "id" --output tsv`
263 AKS_ROUTE_TABLE_NAME=`az resource list --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} --resource-type "Microsoft.Network/routeTables" --query "[0] | name" --output tsv`
264 DEVSTACK_PRIVATE_IP=`az vm show --name ${DEVSTACK_NAME} --resource-group ${DEVSTACK_RG} -d --query "privateIps" --output tsv`
265 NFS_PRIVATE_IP=`az vm show --name ${NFS_NAME} --resource-group ${NFS_RG} -d --query "privateIps" --output tsv`
266 NFS_PUBLIC_IP=`az vm show --name ${NFS_NAME} --resource-group ${NFS_RG} -d --query "publicIps" --output tsv`
267 DEVSTACK_PUBLIC_IP=`az vm show --name ${DEVSTACK_NAME} --resource-group ${DEVSTACK_RG} -d --query "publicIps" --output tsv`
269 # adding public ip to aks
270 NIC_NAME0=`az resource list --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} --resource-type "Microsoft.Network/networkInterfaces" --query "[0] | name" --output tsv`
271 AKS_NSG_NAME=`az resource list --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} --resource-type "Microsoft.Network/networkSecurityGroups" --query "[0] | name" --output tsv`
272 $DIR/create_public_ip.sh "AKSPUBLICIP1" "$AKS_MANAGEMENT_RESOURCE_GROUP_NAME" "$NIC_NAME0"
273 $DIR/create_sg_rule.sh "$AKS_MANAGEMENT_RESOURCE_GROUP_NAME" "$AKS_NSG_NAME" '*' "30000-32000" "$USER_PUBLIC_IP_PREFIX" '*' '*' "ONAP" "120"
275 AKS_PUBLIC_IP_ADDRESS=`az network public-ip show --resource-group ${AKS_MANAGEMENT_RESOURCE_GROUP_NAME} -n AKSPUBLICIP1 --query "ipAddress" --output tsv`
277 ### Peering networks ###
278 # peering requires source = VNet NAME, destination = VNet ID
280 echo "creating peering from AKS Vnet to NFS Vnet..."
281 $DIR/create_peering.sh "$AKS_VNET_NAME" \
282 "$AKS_RESOURCE_GROUP_NAME" \
286 echo "creating peering from AKS Vnet to Devstack Vnet..."
287 $DIR/create_peering.sh "$AKS_VNET_NAME" \
288 "$AKS_RESOURCE_GROUP_NAME" \
289 "$DEVSTACK_VNET_ID" \
292 echo "creating peering from NFS Vnet to AKS Vnet..."
293 $DIR/create_peering.sh "$NFS_VNET_NAME" \
298 echo "creating peering from NFS Vnet to AKS Vnet..."
299 $DIR/create_peering.sh "$DEVSTACK_VNET_NAME" \
305 ### Adding next hop to kubernetes for devstack ###
306 echo "creating route from AKS Vnet to Devstack Vnet..."
307 $DIR/create_route.sh "$DEVSTACK_CIDR" \
309 "$AKS_MANAGEMENT_RESOURCE_GROUP_NAME" \
310 "$AKS_ROUTE_TABLE_NAME" \
311 "$DEVSTACK_PRIVATE_IP"
316 # Lets find a better place for this
317 az aks get-credentials --resource-group "$AKS_RESOURCE_GROUP_NAME" \
319 --file "$BUILD_DIR"/"kubeconfig"
321 $DIR/configure_nfs_pod.sh "$PRIVATE_KEY" \
322 "$BUILD_DIR"/"kubeconfig" \
327 # add this to post-install or post-configure phase
328 # to support adding multiple devstacks to same ONAP
329 cat > "$BUILD_DIR/openstack_rc" <<EOF
330 export OS_USERNAME="$OPENSTACK_USER"
331 export OS_PROJECT_NAME="$OPENSTACK_TENANT"
332 export OS_AUTH_URL="http://$DEVSTACK_PRIVATE_IP/identity"
333 export OS_PASSWORD="$OPENSTACK_PASS"
334 export OS_USER_DOMAIN_NAME=default
335 export OS_PROJECT_DOMAIN_ID=default
338 $DIR/util/create_openstack_cli.sh "$BUILD_DIR/kubeconfig" \
339 "$BUILD_DIR/openstack_rc" \
343 if [ $OVERRIDE = 1 ]; then
345 $DIR/util/create_integration_override.sh "$BUILD_DIR" \
346 "$OPENSTACK_CLI_POD" \
347 "$BUILD_DIR/openstack_rc" \
348 "$DOCKER_REPOSITORY" \
350 "$AKS_PUBLIC_IP_ADDRESS" \
351 "$BUILD_DIR/kubeconfig" \
357 if [ $NO_INSTALL = 0 ]; then
359 ### Starting OOM install ###
360 echo "Installing ONAP..."
361 $DIR/create_onap.sh "$BUILD" \
362 "$BUILD_DIR/kubeconfig" \
374 cat > "$BUILD_DIR/deployment.notes" <<EOF
375 ==================================================================
376 Phew, all done (yay!). ONAP and DevStack might still be installing
377 but here are the access details...
379 --------DEVSTACK ACCESS--------
380 ssh -i ${PRIVATE_KEY} ${DEVSTACK_ADMIN_USER}@${DEVSTACK_PUBLIC_IP}
381 horizon: http://${DEVSTACK_PUBLIC_IP}
382 cli: kubectl exec $OPENSTACK_CLI_POD -- sh -lc "<openstack command>"
384 --------NFS ACCESS--------
385 ssh -i ${PRIVATE_KEY} ${NFS_ADMIN_USER}@${NFS_PUBLIC_IP}
387 --------KUBERNETES ACCESS--------
388 kubeconfig: export KUBECONFIG=$BUILD_DIR/kubeconfig
389 dashboard: az aks browse --resource-group ${AKS_RESOURCE_GROUP_NAME} --name ${AKS_NAME}
391 --------BUILD DETAILS--------
392 Build directory: $BUILD_DIR
393 Integration repo: $BUILD_DIR/integration
394 OOM repo: $BUILD_DIR/oom
396 --------ADD TO /etc/hosts--------
397 $AKS_PUBLIC_IP_ADDRESS portal.api.simpledemo.onap.org
398 $AKS_PUBLIC_IP_ADDRESS sdc.api.simpledemo.onap.org
399 $AKS_PUBLIC_IP_ADDRESS sdc.api.fe.simpledemo.onap.org
400 $AKS_PUBLIC_IP_ADDRESS sdc.api.be.simpledemo.onap.org
401 $AKS_PUBLIC_IP_ADDRESS vid.api.simpledemo.onap.org
402 $AKS_PUBLIC_IP_ADDRESS policy.api.simpledemo.onap.org
403 $AKS_PUBLIC_IP_ADDRESS aai.api.simpledemo.onap.org
404 $AKS_PUBLIC_IP_ADDRESS cli.api.simpledemo.onap.org
405 $AKS_PUBLIC_IP_ADDRESS so.api.simpledemo.onap.org
406 $AKS_PUBLIC_IP_ADDRESS so.monitoring.api.simpledemo.onap.org
407 $AKS_PUBLIC_IP_ADDRESS so-monitoring
408 $AKS_PUBLIC_IP_ADDRESS sdnc.api.simpledemo.onap.org
409 $AKS_PUBLIC_IP_ADDRESS clamp.api.simpledemo.onap.org
410 $AKS_PUBLIC_IP_ADDRESS dcae.api.simpledemo.onap.org
411 $AKS_PUBLIC_IP_ADDRESS appc.api.simpledemo.onap.org
412 $AKS_PUBLIC_IP_ADDRESS aaf.api.simpledemo.onap.org
413 $AKS_PUBLIC_IP_ADDRESS portal-sdk.simpledemo.onap.org
414 $AKS_PUBLIC_IP_ADDRESS robot.api.simpledemo.onap.org
415 $AKS_PUBLIC_IP_ADDRESS msb.api.discovery.simpledemo.onap.org
416 $AKS_PUBLIC_IP_ADDRESS msb.api.simpledemo.onap.org
417 $AKS_PUBLIC_IP_ADDRESS aai.ui.simpledemo.onap.org
418 $AKS_PUBLIC_IP_ADDRESS policy.api.simpledemo.onap.org
422 cat "$BUILD_DIR/deployment.notes"
425 if [ $POST_INSTALL = 1 ]; then
427 echo "Executing post installation scripts..."
430 cat > "$BUILD_DIR/onap.conf" <<EOF
432 export CLOUD_OWNER=$CLOUD_OWNER
433 export CLOUD_REGION=$CLOUD_REGION
434 export OPENSTACK_IP=$DEVSTACK_PRIVATE_IP
435 export OPENSTACK_USER=$OPENSTACK_USER
436 export OPENSTACK_PASS=$OPENSTACK_PASS
437 export OPENSTACK_TENANT=$OPENSTACK_TENANT
438 export OPENSTACK_REGION=$OPENSTACK_REGION
439 export CUSTOMER=$CUSTOMER
440 export SUBSCRIBER=$SUBSCRIBER
441 export SERVICE_TYPE=$SERVICE_TYPE
445 export PLATFORM=$PLATFORM
446 export PROJECT=$PROJECT
448 export OS_TENANT_ROLE=$OS_TENANT_ROLE
449 export OS_KEYSTONE=$OS_KEYSTONE
450 export KUBECONFIG=$BUILD_DIR/kubeconfig
451 export NFS_PRIVATE_IP=$NFS_PRIVATE_IP
452 export DEVSTACK_PRIVATE_IP=$DEVSTACK_PRIVATE_IP
453 export PRIVATE_KEY=$PRIVATE_KEY
456 $DIR/post_install.sh "$BUILD_DIR/onap.conf" "$DIR/cloud.conf"