summaryrefslogtreecommitdiff
path: root/files/instance.sh
blob: 6526ded79de47c6165e43580113f2a6309cb0cd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/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