#!/bin/bash flavor_name="${1}" image_name="${2}" network_id="${3}" keypair_name="${4}" instance_name="${5}" ext_network_name="${6}" if [ "${flavor_name}" == "" ]; then echo "No flavor name supplied." >&2 exit 1 elif [ "${image_name}" == "" ]; then echo "No image name supplied." >&2 exit 1 elif [ "${network_id}" == "" ]; then echo "No network ID supplied." >&2 exit 1 elif [ "${keypair_name}" == "" ]; then echo "No keypair name supplied." >&2 exit 1 elif [ "${instance_name}" == "" ]; then echo "No instance name supplied." >&2 exit 1 elif [ "${ext_network_name}" == "" ]; then echo "No ext network name supplied." >&2 exit 1 fi associate_floating_ip () { for line in $(openstack floating ip list | grep -F 'None' | sed -e 's/ //g'); do floating_ip_id=$(echo ${line} | awk -F\| '{print $2;}') floating_ip=$(echo ${line} | awk -F\| '{print $3;}') floating_ip_port=$(echo ${line} | awk -F\| '{print $5;}') if [ "${floating_ip_port}" == "None" ]; then nova floating-ip-associate "${1}" "${floating_ip}" >/dev/null 2>&1 echo "${floating_ip}" return 0 fi done return 1 } image_id=$(openstack image list --limit 1000 --public 2>/dev/null | grep -F " ${image_name} " | awk '{print $2;}') if [ "${image_id}" == "" ]; then echo "Could not find id for image ${image_name}" >&2 exit 1 fi instance_number=1 for num in $(openstack server list --limit 1000 2>/dev/null | grep -F "${instance_name}" | awk '{print $4;}' | awk -F- '{print $4;}' | sort); do if (( "${num}" == ${instance_number} )); then instance_number=$(expr ${instance_number} + 1) fi done # TODO: rewrite with openstack server create instance_id=$(nova boot \ --flavor "${flavor_name}" \ --block-device source=image,id=${image_id},dest=volume,size=20,shutdown=preserve,bootindex=0 \ --nic net-id="${network_id}" \ --security-groups "default-grp,dns,galera,vertx,web" \ --key-name "${keypair_name}" \ --user-data "data/etc/cloud/cloud.cfg" \ --poll \ "${instance_name}-${instance_number}" \ | grep -F ' id ' | awk '{print $4;}') if [ "${instance_id}" == "" ]; then echo "Instance creation did not return an ID." >&2 exit 1 fi floating_ip_assigned=$(associate_floating_ip ${instance_id}) if (( ${?} == 1 )); then openstack floating ip create ${ext_network_name} >/dev/null 2>&1 if (( ${?} == 0 )); then floating_ip_assigned=$(associate_floating_ip ${instance_id}) if (( ${?} == 1 )); then echo "Could not associate floating IP." >&2 exit 1 fi fi fi # TODO: rewrite with openstackclient command for sec in default-grp dns galera vertx web; do nova add-secgroup ${instance_id} ${sec} >/dev/null 2>&1 done echo "${floating_ip_assigned}" echo "${instance_name}-${instance_number}" exit 0