3 ##############################################################################
4 # Copyright (c) 2017 Ericsson AB, Mirantis Inc. and others.
5 # jonas.bjurel@ericsson.com
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Apache License, Version 2.0
8 # which accompanies this distribution, and is available at
9 # http://www.apache.org/licenses/LICENSE-2.0
10 ##############################################################################
12 ############################################################################
13 # BEGIN of Exit handlers
20 # End of Exit handlers
21 ############################################################################
23 ############################################################################
24 # BEGIN of usage description
29 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
30 `basename $0`: Deploys the Fuel@OPNFV stack
32 usage: `basename $0` -b base-uri [-B PXE Bridge] [-f] [-F] [-H] -l lab-name -p pod-name -s deploy-scenario [-S image-dir] [-T timeout] -i iso
33 -s deployment-scenario [-S optional Deploy-scenario path URI]
34 [-R optional local relen repo (containing deployment Scenarios]
37 -b Base-uri for the stack-configuration structure
38 -B PXE Bridge for booting of Fuel master
40 -f Deploy on existing Fuel master
41 -e Do not launch environment deployment
42 -F Do only create a Fuel master
43 -h Print this message and exit
46 -L Deployment log path and file name
48 -s Deploy-scenario short-name/base-file-name
49 -S Storage dir for VM images
50 -T Timeout, in minutes, for the deploy.
54 Deploys the Fuel@OPNFV stack on the indicated lab resource
56 This script provides the Fuel@OPNFV deployment abstraction
57 It depends on the OPNFV official configuration directory/file structure
58 and provides a fairly simple mechanism to execute a deployment.
59 Input parameters to the build script is:
60 -b Base URI to the configuration directory (needs to be provided in a URI
61 style, it can be a local resource: file:// or a remote resource http(s)://)
62 -B PXE Bridge for booting of Fuel master. It can be specified several times,
63 or as a comma separated list of bridges, or both: -B br1 -B br2,br3
64 One NIC connected to each specified bridge will be created in the Fuel VM,
65 in the same order as provided in the command line. The default is pxebr.
66 -d Dry-run - Produces deploy config files (config/dea.yaml and
67 config/dha.yaml), but does not execute deploy
68 -f Deploy on existing Fuel master
69 -e Do not launch environment deployment
70 -F Do only create a Fuel master
71 -h Print this message and exit
72 -H Do not run fuel built in health-check after successfull deployment
73 -l Lab name as defined in the configuration directory, e.g. lf
74 -L Deployment log path and name, eg. -L /home/jenkins/logs/job888.log.tar.gz
75 -p POD name as defined in the configuration directory, e.g. pod-1
76 -s Deployment-scenario, this points to a deployment/test scenario file as
77 defined in the configuration directory:
78 e.g fuel-ocl-heat-ceilometer_scenario_0.0.1.yaml
79 or a deployment short-name as defined by scenario.yaml in the deployment
81 -S Storage dir for VM images, default is fuel/deploy/images
82 -T Timeout, in minutes, for the deploy. It defaults to using the DEPLOY_TIMEOUT
83 environment variable when defined, or to the default in deploy.py otherwise
84 -i .iso image to be deployed (needs to be provided in a URI
85 style, it can be a local resource: file:// or a remote resource http(s)://)
87 NOTE: Root priviledges are needed for this script to run
91 sudo `basename $0` -b file:///home/jenkins/lab-config -l lf -p pod1 -s ha_odl-l3_heat_ceilometer -i file:///home/jenkins/myiso.iso
96 # END of usage description
97 ############################################################################
99 ############################################################################
100 # BEGIN of deployment clean-up
103 echo "Cleaning up deploy tmp directories"
104 rm -rf ${SCRIPT_PATH}/ISO
107 # END of deployment clean-up
108 ############################################################################
110 ############################################################################
111 # BEGIN of shorthand variables for internal use
113 SCRIPT_PATH=$(readlink -f $(dirname ${BASH_SOURCE[0]}))
114 DEPLOY_DIR=$(cd ${SCRIPT_PATH}/../mcp/scripts; pwd)
118 FUEL_CREATION_ONLY=''
119 NO_DEPLOY_ENVIRONMENT=''
122 if ! [ -z $DEPLOY_TIMEOUT ]; then
123 DEPLOY_TIMEOUT="-dt $DEPLOY_TIMEOUT"
128 # END of variables to customize
129 ############################################################################
131 ############################################################################
134 while getopts "b:B:dfFHl:L:p:s:S:T:i:he" OPTION
138 BASE_CONFIG_URI=${OPTARG}
139 if [[ ! $BASE_CONFIG_URI == file://* ]] && \
140 [[ ! $BASE_CONFIG_URI == http://* ]] && \
141 [[ ! $BASE_CONFIG_URI == https://* ]] && \
142 [[ ! $BASE_CONFIG_URI == ftp://* ]]; then
143 echo "-b $BASE_CONFIG_URI - Not given in URI style"
149 for bridge in ${OPTARG//,/ }; do
150 PXE_BRIDGE+=" -b $bridge"
157 USE_EXISTING_FUEL='-nf'
160 FUEL_CREATION_ONLY='-fo'
163 NO_DEPLOY_ENVIRONMENT='-nde'
166 NO_HEALTH_CHECK='-nh'
172 DEPLOY_LOG="-log ${OPTARG}"
178 DEPLOY_SCENARIO=${OPTARG}
181 if [[ ${OPTARG} ]]; then
182 STORAGE_DIR="-s ${OPTARG}"
186 DEPLOY_TIMEOUT="-dt ${OPTARG}"
190 if [[ ! $ISO == file://* ]] && \
191 [[ ! $ISO == http://* ]] && \
192 [[ ! $ISO == https://* ]] && \
193 [[ ! $ISO == ftp://* ]]; then
194 echo "-i $ISO - Not given in URI style"
204 echo "${OPTION} is not a valid argument"
205 echo "Arguments not according to new argument style"
206 echo "Trying old-style compatibility mode"
207 pushd ${DEPLOY_DIR} > /dev/null
208 python deploy.py "$@"
215 if [[ $EUID -ne 0 ]]; then
216 echo "This script must be run as root" 1>&2
220 # Enable the automatic exit trap
221 trap do_exit SIGINT SIGTERM EXIT
223 # Set no restrictive umask so that Jenkins can removeeee any residuals
228 pushd ${DEPLOY_DIR} > /dev/null
229 # Prepare the deploy config files based on lab/pod information, deployment
232 # Install required packages
233 [ -n "$(command -v apt-get)" ] && apt-get install -y mkisofs curl virtinst cpu-checker qemu-kvm
234 [ -n "$(command -v yum)" ] && yum install -y genisoimage curl virt-install qemu-kvm
236 # Check scenario file existence
237 if [[ ! -f ../config/${DEPLOY_SCENARIO}.yaml ]]; then
238 echo "[WARN] ${DEPLOY_SCENARIO}.yaml not found, setting simplest scenario"
239 DEPLOY_SCENARIO='os-nosdn-nofeature-noha'
242 # Get required infra deployment data
244 eval $(parse_yaml ../config/defaults.yaml)
245 eval $(parse_yaml ../config/${DEPLOY_SCENARIO}.yaml)
247 declare -A virtual_nodes_ram virtual_nodes_vcpus
248 for node in "${virtual_nodes[@]}"; do
249 virtual_custom_ram="virtual_${node}_ram"
250 virtual_custom_vcpus="virtual_${node}_vcpus"
251 virtual_nodes_ram[$node]=${!virtual_custom_ram:-$virtual_default_ram}
252 virtual_nodes_vcpus[$node]=${!virtual_custom_vcpus:-$virtual_default_vcpus}
255 export CLUSTER_DOMAIN=$cluster_domain
256 export SSH_KEY=${SSH_KEY:-mcp.rsa}
257 export SALT_MASTER=${SALT_MASTER_IP:-192.168.10.100}
258 export SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${SSH_KEY}"
262 prepare_vms virtual_nodes $base_image
264 create_vms virtual_nodes virtual_nodes_ram virtual_nodes_vcpus
266 start_vms virtual_nodes
271 # Openstack cluster setup
272 for state in "${cluster_states[@]}"; do
274 ssh ${SSH_OPTS} ubuntu@${SALT_MASTER} sudo /root/fuel/mcp/config/states/$state
277 ## Disable Fuel deployment engine
279 # echo "python deploy-config.py -dha ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dha.yaml -deab file://${DEPLOY_DIR}/config/dea_base.yaml -deao ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dea-pod-override.yaml -scenario-base-uri file://${DEPLOY_DIR}/scenario -scenario ${DEPLOY_SCENARIO} -plugins file://${DEPLOY_DIR}/config/plugins -output ${SCRIPT_PATH}/config"
281 # python deploy-config.py -dha ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dha.yaml -deab file://${DEPLOY_DIR}/config/dea_base.yaml -deao ${BASE_CONFIG_URI}/labs/${TARGET_LAB}/${TARGET_POD}/fuel/config/dea-pod-override.yaml -scenario-base-uri file://${DEPLOY_DIR}/scenario -scenario ${DEPLOY_SCENARIO} -plugins file://${DEPLOY_DIR}/config/plugins -output ${SCRIPT_PATH}/config
283 # if [ $DRY_RUN -eq 0 ]; then
284 # # Download iso if it doesn't already exists locally
285 # if [[ $ISO == file://* ]]; then
288 # mkdir -p ${SCRIPT_PATH}/ISO
289 # curl -o ${SCRIPT_PATH}/ISO/image.iso $ISO
290 # ISO=${SCRIPT_PATH}/ISO/image.iso
293 # echo "python deploy.py $DEPLOY_LOG $STORAGE_DIR $PXE_BRIDGE $USE_EXISTING_FUEL $FUEL_CREATION_ONLY $NO_HEALTH_CHECK $NO_DEPLOY_ENVIRONMENT -dea ${SCRIPT_PATH}/config/dea.yaml -dha ${SCRIPT_PATH}/config/dha.yaml -iso $ISO $DEPLOY_TIMEOUT"
294 # python deploy.py $DEPLOY_LOG $STORAGE_DIR $PXE_BRIDGE $USE_EXISTING_FUEL $FUEL_CREATION_ONLY $NO_HEALTH_CHECK $NO_DEPLOY_ENVIRONMENT -dea ${SCRIPT_PATH}/config/dea.yaml -dha ${SCRIPT_PATH}/config/dha.yaml -iso $ISO $DEPLOY_TIMEOUT
300 ############################################################################