#!/bin/bash ############################################################################## # Copyright (c) 2015 Tim Rozet (Red Hat), Dan Radez (Red Hat) and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## # Deploy script to install provisioning server for OPNFV Apex # author: Dan Radez (dradez@redhat.com) # author: Tim Rozet (trozet@redhat.com) # # Based on RDO Manager http://www.rdoproject.org set -e ##VARIABLES reset=$(tput sgr0 || echo "") blue=$(tput setaf 4 || echo "") red=$(tput setaf 1 || echo "") green=$(tput setaf 2 || echo "") interactive="FALSE" ping_site="8.8.8.8" ntp_server="pool.ntp.org" net_isolation_enabled="TRUE" post_config="TRUE" debug="FALSE" declare -i CNT declare UNDERCLOUD declare -A deploy_options_array declare -a performance_options declare -A NET_MAP SSH_OPTIONS=(-o StrictHostKeyChecking=no -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -o LogLevel=error) DEPLOY_OPTIONS="" CONFIG=${CONFIG:-'/var/opt/opnfv'} RESOURCES=${RESOURCES:-"$CONFIG/images"} LIB=${LIB:-"$CONFIG/lib"} OPNFV_NETWORK_TYPES="admin_network private_network public_network storage_network api_network" VM_CPUS=4 VM_RAM=8 VM_COMPUTES=2 # Netmap used to map networks to OVS bridge names NET_MAP['admin_network']="br-admin" NET_MAP['private_network']="br-private" NET_MAP['public_network']="br-public" NET_MAP['storage_network']="br-storage" NET_MAP['api_network']="br-api" ext_net_type="interface" ip_address_family=4 # Libraries lib_files=( $LIB/common-functions.sh $LIB/configure-deps-functions.sh $LIB/parse-functions.sh $LIB/virtual-setup-functions.sh $LIB/undercloud-functions.sh $LIB/utility-functions.sh $LIB/installer/onos/onos_gw_mac_update.sh ) for lib_file in ${lib_files[@]}; do if ! source $lib_file; then echo -e "${red}ERROR: Failed to source $lib_file${reset}" exit 1 fi done ##FUNCTIONS ##checks if prefix exists in string ##params: string, prefix ##usage: contains_prefix "deploy_setting_launcher=1" "deploy_setting" contains_prefix() { local mystr=$1 local prefix=$2 if echo $mystr | grep -E "^$prefix.*$" > /dev/null; then return 0 else return 1 fi } ##verify internet connectivity #params: none function verify_internet { if ping -c 2 $ping_site > /dev/null; then if ping -c 2 www.google.com > /dev/null; then echo "${blue}Internet connectivity detected${reset}" return 0 else echo "${red}Internet connectivity detected, but DNS lookup failed${reset}" return 1 fi else echo "${red}No internet connectivity detected${reset}" return 1 fi } ##preping it for deployment and launch the deploy ##params: none function undercloud_prep_overcloud_deploy { if [[ "${#deploy_options_array[@]}" -eq 0 || "${deploy_options_array['sdn_controller']}" == 'opendaylight' ]]; then if [ "${deploy_options_array['sdn_l3']}" == 'True' ]; then DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight_l3.yaml" elif [ "${deploy_options_array['sfc']}" == 'True' ]; then DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight_sfc.yaml" elif [ "${deploy_options_array['vpn']}" == 'True' ]; then DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight_sdnvpn.yaml" elif [ "${deploy_options_array['vpp']}" == 'True' ]; then DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight_fdio.yaml" else DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight.yaml" fi SDN_IMAGE=opendaylight if [ "${deploy_options_array['sfc']}" == 'True' ]; then SDN_IMAGE+=-sfc if [ ! -f $RESOURCES/overcloud-full-${SDN_IMAGE}.qcow2 ]; then echo "${red} $RESOURCES/overcloud-full-${SDN_IMAGE}.qcow2 is required to execute an SFC deployment." echo "Please install the opnfv-apex-opendaylight-sfc package to provide this overcloud image for deployment.${reset}" exit 1 fi fi elif [ "${deploy_options_array['sdn_controller']}" == 'opendaylight-external' ]; then DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/opendaylight-external.yaml" SDN_IMAGE=opendaylight elif [ "${deploy_options_array['sdn_controller']}" == 'onos' ]; then DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/onos.yaml" SDN_IMAGE=onos elif [ "${deploy_options_array['sdn_controller']}" == 'opencontrail' ]; then echo -e "${red}ERROR: OpenContrail is currently unsupported...exiting${reset}" exit 1 elif [[ -z "${deploy_options_array['sdn_controller']}" || "${deploy_options_array['sdn_controller']}" == 'False' ]]; then echo -e "${blue}INFO: SDN Controller disabled...will deploy nosdn scenario${reset}" SDN_IMAGE=opendaylight else echo "${red}Invalid sdn_controller: ${deploy_options_array['sdn_controller']}${reset}" echo "${red}Valid choices are opendaylight, opendaylight-external, onos, opencontrail, False, or null${reset}" exit 1 fi # Make sure the correct overcloud image is available if [ ! -f $RESOURCES/overcloud-full-${SDN_IMAGE}.qcow2 ]; then echo "${red} $RESOURCES/overcloud-full-${SDN_IMAGE}.qcow2 is required to execute your deployment." echo "Both ONOS and OpenDaylight are currently deployed from this image." echo "Please install the opnfv-apex package to provide this overcloud image for deployment.${reset}" exit 1 fi echo "Copying overcloud image to Undercloud" ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" "rm -f overcloud-full.qcow2" scp ${SSH_OPTIONS[@]} $RESOURCES/overcloud-full-${SDN_IMAGE}.qcow2 "stack@$UNDERCLOUD":overcloud-full.qcow2 # Install ovs-dpdk inside the overcloud image if it is enabled. if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then # install dpdk packages before ovs echo -e "${blue}INFO: Enabling kernel modules for dpdk inside overcloud image${reset}" ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" < vfio_pci.modules #!/bin/bash exec /sbin/modprobe vfio_pci >/dev/null 2>&1 EOF cat << EOF > uio_pci_generic.modules #!/bin/bash exec /sbin/modprobe uio_pci_generic >/dev/null 2>&1 EOF LIBGUESTFS_BACKEND=direct virt-customize --upload vfio_pci.modules:/etc/sysconfig/modules/ \ --upload uio_pci_generic.modules:/etc/sysconfig/modules/ \ --run-command "chmod 0755 /etc/sysconfig/modules/vfio_pci.modules" \ --run-command "chmod 0755 /etc/sysconfig/modules/uio_pci_generic.modules" \ --run-command "yum install -y /root/dpdk_rpms/*" \ -a overcloud-full.qcow2 EOI elif [ "${deploy_options_array['dataplane']}" != 'ovs' ]; then echo "${red}${deploy_options_array['dataplane']} not supported${reset}" exit 1 fi # Set ODL version accordingly if [[ "${deploy_options_array['sdn_controller']}" == 'opendaylight' && "${deploy_options_array['odl_version']}" == 'boron' ]]; then ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" < /home/stack/Compute-ironic-python-agent.initramfs chown stack /home/stack/Compute-ironic-python-agent.initramfs if [ ! -f /home/stack/Controller-kernel_params.txt ]; then touch /home/stack/Controller-kernel_params.txt chown stack /home/stack/Controller-kernel_params.txt fi /bin/cp -f /home/stack/Controller-kernel_params.txt tmp/kernel_params.txt echo "Controller params set: " cat tmp/kernel_params.txt find . | cpio -o -H newc | gzip > /home/stack/Controller-ironic-python-agent.initramfs chown stack /home/stack/Controller-ironic-python-agent.initramfs popd /bin/rm -rf ipa/ EOI DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/numa.yaml" fi # make sure ceph is installed DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml" # scale compute nodes according to inventory total_nodes=$(ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" "cat /home/stack/instackenv.json | grep -c memory") # check if HA is enabled if [[ "$ha_enabled" == "True" ]]; then DEPLOY_OPTIONS+=" --control-scale 3" compute_nodes=$((total_nodes - 3)) DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/puppet-pacemaker.yaml" else compute_nodes=$((total_nodes - 1)) fi if [ "$compute_nodes" -le 0 ]; then echo -e "${red}ERROR: Invalid number of compute nodes: ${compute_nodes}. Check your inventory file.${reset}" exit 1 else echo -e "${blue}INFO: Number of compute nodes set for deployment: ${compute_nodes}${reset}" DEPLOY_OPTIONS+=" --compute-scale ${compute_nodes}" fi if [[ "$net_isolation_enabled" == "TRUE" ]]; then #DEPLOY_OPTIONS+=" -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml" DEPLOY_OPTIONS+=" -e network-environment.yaml" fi if [[ "$ha_enabled" == "True" ]] || [[ "$net_isolation_enabled" == "TRUE" ]]; then DEPLOY_OPTIONS+=" --ntp-server $ntp_server" fi if [[ ! "$virtual" == "TRUE" ]]; then DEPLOY_OPTIONS+=" --control-flavor control --compute-flavor compute" else DEPLOY_OPTIONS+=" -e virtual-environment.yaml" fi DEPLOY_OPTIONS+=" -e opnfv-environment.yaml" echo -e "${blue}INFO: Deploy options set:\n${DEPLOY_OPTIONS}${reset}" ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" < deploy_command << EOF openstack overcloud deploy --templates $DEPLOY_OPTIONS --timeout 90 EOF EOI if [ "$interactive" == "TRUE" ]; then if ! prompt_user "Overcloud Deployment"; then echo -e "${blue}INFO: User requests exit${reset}" exit 0 fi fi ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" </dev/null; then $(typeset -f debug_stack) debug_stack exit 1 fi EOI # Configure DPDK if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <> ~/.ssh/authorized_keys' done EOI if [ "${deploy_options_array['dataplane']}" == 'ovs_dpdk' ]; then echo -e "${blue}INFO: Bringing up br-phy and ovs-agent for dpdk compute nodes...${reset}" compute_nodes=$(undercloud_connect stack "source stackrc; nova list | grep compute | wc -l") i=0 while [ "$i" -lt "$compute_nodes" ]; do overcloud_connect compute${i} "sudo ifup br-phy; sudo systemctl restart neutron-openvswitch-agent" i=$((i + 1)) done fi ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" <