#!/bin/bash # # Copyright 2018 Tieto # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Script for automated deployment of ONAP with Kubernetes at OPNFV LAAS # environment. # # Usage: # onap-deploy.sh # # where and are IP addresses of servers to be used # for ONAP installation. # # NOTE: Following must be assured for all MASTER and SLAVE servers before # onap-deploy.sh execution: # 1) ssh access without a password # 2) an user account with password-less sudo access must be # available - default user is "opnfv" # # Configuration # DOCKER_VERSION=17.03 RANCHER_VERSION=1.6.14 RANCHER_CLI_VER=0.6.11 KUBECTL_VERSION=1.8.10 HELM_VERSION=2.8.2 MASTER=$1 SERVERS=$* shift SLAVES=$* BRANCH='beijing' ENVIRON='onap' SSH_USER=${SSH_USER:-"opnfv"} SSH_OPTIONS='-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' # by defalult install full ONAP installation ONAP_COMPONENT_DISABLE=${ONAP_COMPONENT_DISABLE:-""} # example of minimal ONAP installation #ONAP_COMPONENT_DISABLE="clamp cli consul dcaegen2 esr log msb multicloud nbi oof policy uui vfc vnfsdk" # use identity file from the environment SSH_IDENTITY if [ -n "$SSH_IDENTITY" ] ; then SSH_OPTIONS="-i $SSH_IDENTITY $SSH_OPTIONS" fi # # Installation # # use standalone K8S master if there are enough VMs available for the K8S cluster SERVERS_COUNT=$(echo $SERVERS | wc -w) if [ $SERVERS_COUNT -gt 2 ] ; then RANCHER_SLAVES=$SLAVES else RANCHER_SLAVES=$SERVERS fi echo "INSTALLATION TOPOLOGY:" echo "Rancher Master: $MASTER" echo "Rancher Slaves: $RANCHER_SLAVES" echo echo "INSTALLING DOCKER ON ALL MACHINES" echo "$SERVERS" for MACHINE in $SERVERS; do ssh $SSH_OPTIONS $SSH_USER@"$MACHINE" "bash -s" < /etc/systemd/system/docker.service.d/docker.conf systemctl daemon-reload systemctl restart docker apt-mark hold docker-ce for SERVER in $SERVERS; do echo "\$SERVER $ENVIRON\$(echo \$SERVER | cut -d. -f 4 )" >> /etc/hosts done hostname $ENVIRON\$(echo $MACHINE | cut -d. -f 4 ) echo "DOCKER INSTALLED ON $MACHINE" DOCKERINSTALL done wait echo "INSTALLING RANCHER ON MASTER" echo "$MASTER" ssh $SSH_OPTIONS $SSH_USER@"$MASTER" "bash -s" <>/etc/exports service nfs-kernel-server restart echo "Waiting 10 minutes for Rancher to setup at \$(date)" sleep 10m echo "Installing RANCHER CLI, KUBERNETES ENV on RANCHER" wget https://github.com/rancher/cli/releases/download/v${RANCHER_CLI_VER}-rc2\ /rancher-linux-amd64-v${RANCHER_CLI_VER}-rc2.tar.gz tar -zxvf rancher-linux-amd64-v${RANCHER_CLI_VER}-rc2.tar.gz cp rancher-v${RANCHER_CLI_VER}-rc2/rancher . API_RESPONSE=\`curl -s 'http://127.0.0.1:8080/v2-beta/apikey'\ -d '{"type":"apikey","accountId":"1a1","name":"autoinstall",\ "description":"autoinstall","created":null,"kind":null,\ "removeTime":null,"removed":null,"uuid":null}'\` # Extract and store token echo "API_RESPONSE: \${API_RESPONSE}" KEY_PUBLIC=\`echo \${API_RESPONSE} | jq -r .publicValue\` KEY_SECRET=\`echo \${API_RESPONSE} | jq -r .secretValue\` echo "publicValue: \$KEY_PUBLIC secretValue: \$KEY_SECRET" export RANCHER_URL=http://${MASTER}:8080 export RANCHER_ACCESS_KEY=\$KEY_PUBLIC export RANCHER_SECRET_KEY=\$KEY_SECRET ./rancher env ls echo "Creating kubernetes environment named ${ENVIRON}" ./rancher env create -t kubernetes $ENVIRON > kube_env_id.json PROJECT_ID=\$( ~/.kube/config echo "docker run --rm --privileged\ -v /var/run/docker.sock:/var/run/docker.sock\ -v /var/lib/rancher:/var/lib/rancher\ \$REGISTRATION_DOCKER\ \$RANCHER_URL/v1/scripts/\$REGISTRATION_TOKEN"\ > /tmp/rancher_register_host chown $SSH_USER /tmp/rancher_register_host RANCHERINSTALL echo "REGISTER TOKEN" HOSTREGTOKEN=$(ssh $SSH_OPTIONS $SSH_USER@"$MASTER" cat /tmp/rancher_register_host) echo "$HOSTREGTOKEN" echo "REGISTERING HOSTS WITH RANCHER ENVIRONMENT '$ENVIRON'" echo "$RANCHER_SLAVES" for MACHINE in $RANCHER_SLAVES; do ssh $SSH_OPTIONS $SSH_USER@"$MACHINE" "bash -s" <> /etc/fstab mount -a mount | grep dockerdata-nfs CONFIGURENFS done wait echo "DEPLOYING OOM ON RANCHER WITH MASTER" echo "$MASTER" TMP_POD_LIST='/tmp/onap_pod_list.txt' ssh $SSH_OPTIONS $SSH_USER@"$MASTER" "bash -s" </dev/null & echo "Waiting for helm setup for 5 min at \$(date)" sleep 5m helm version helm repo add local http://127.0.0.1:8879 helm repo list make all if ( ! helm install local/onap -n dev --namespace $ENVIRON) ; then echo "ONAP installation has failed at \$(date)" exit 1 fi cd ../../ echo "Waiting for ONAP pods to be up \$(date)" echo "Ignore failure of sdnc-ansible-server, see SDNC-443" function get_onap_pods() { kubectl get pods --namespace $ENVIRON > $TMP_POD_LIST return \$(cat $TMP_POD_LIST | wc -l) } FAILED_PODS_LIMIT=1 # maximal number of failed ONAP PODs ALL_PODS_LIMIT=20 # minimum ONAP PODs to be up & running WAIT_PERIOD=60 # wait period in seconds MAX_WAIT_TIME=\$((3600*3)) # max wait time in seconds MAX_WAIT_PERIODS=\$((\$MAX_WAIT_TIME/\$WAIT_PERIOD)) COUNTER=0 get_onap_pods ALL_PODS=\$? PENDING=\$(grep -E '0/|1/2' $TMP_POD_LIST | wc -l) while [ \$PENDING -gt \$FAILED_PODS_LIMIT -o \$ALL_PODS -lt \$ALL_PODS_LIMIT ]; do # print header every 20th line if [ \$COUNTER -eq \$((\$COUNTER/20*20)) ] ; then printf "%-3s %-29s %-3s/%s\n" "Nr." "Datetime of check" "Err" "Total PODs" fi COUNTER=\$((\$COUNTER+1)) printf "%3s %-29s %3s/%-3s\n" \$COUNTER "\$(date)" \$PENDING \$ALL_PODS sleep \$WAIT_PERIOD if [ "\$MAX_WAIT_PERIODS" -eq \$COUNTER ]; then FAILED_PODS_LIMIT=800 ALL_PODS_LIMIT=0 fi get_onap_pods ALL_PODS=\$? PENDING=\$(grep -E '0/|1/2' $TMP_POD_LIST | wc -l) done get_onap_pods cp $TMP_POD_LIST ~/onap_all_pods.txt echo echo "========================" echo "ONAP INSTALLATION REPORT" echo "========================" echo echo "List of Failed PODs" echo "-------------------" grep -E '0/|1/2' $TMP_POD_LIST | tee ~/onap_failed_pods.txt echo echo "Summary:" echo "--------" echo " PODs Failed: \$(cat ~/onap_failed_pods.txt | wc -l)" echo " PODs Total: \$(cat ~/onap_all_pods.txt | wc -l)" echo echo "ONAP health TC results" echo "----------------------" cd oom/kubernetes/robot ./ete-k8s.sh $ENVIRON health | tee ~/onap_health.txt echo "===============================" echo "END OF ONAP INSTALLATION REPORT" echo "===============================" OOMDEPLOY echo "Finished install, ruturned from Master at $(date)" exit 0