blob: be4aa16394bf6f8121f9f3ad637dcba0bf6794ca [file] [log] [blame]
Anthony Youngb62b4ca2011-10-26 22:29:08 -07001#!/bin/bash
2
Mate Lakat0b3804b2013-05-07 16:58:17 +01003# This script must be run on a XenServer or XCP machine
John Garbuttdaadf742012-04-27 18:28:28 +01004#
5# It creates a DomU VM that runs OpenStack services
6#
7# For more details see: README.md
8
Renuka Apte0af143b2012-04-02 15:46:53 -07009set -o errexit
Mate Lakat0b3804b2013-05-07 16:58:17 +010010set -o nounset
John Garbuttdaadf742012-04-27 18:28:28 +010011set -o xtrace
Renuka Apte0af143b2012-04-02 15:46:53 -070012
Anthony Youngb62b4ca2011-10-26 22:29:08 -070013# Abort if localrc is not set
14if [ ! -e ../../localrc ]; then
15 echo "You must have a localrc with ALL necessary passwords defined before proceeding."
16 echo "See the xen README for required passwords."
17 exit 1
18fi
19
Anthony Youngaf6ed6b2011-11-02 07:50:27 -050020# This directory
Mate Lakata8bf0f22013-03-07 18:37:31 +000021THIS_DIR=$(cd $(dirname "$0") && pwd)
Anthony Youngaf6ed6b2011-11-02 07:50:27 -050022
Anthony Youngb3e2f332012-03-16 17:01:49 -070023# Source lower level functions
Mate Lakata8bf0f22013-03-07 18:37:31 +000024. $THIS_DIR/../../functions
Anthony Youngb3e2f332012-03-16 17:01:49 -070025
John Garbuttdaadf742012-04-27 18:28:28 +010026# Include onexit commands
Mate Lakata8bf0f22013-03-07 18:37:31 +000027. $THIS_DIR/scripts/on_exit.sh
John Garbuttdaadf742012-04-27 18:28:28 +010028
Mate Lakat57e3da92013-03-22 16:34:05 +000029# xapi functions
30. $THIS_DIR/functions
31
John Garbuttdaadf742012-04-27 18:28:28 +010032#
33# Get Settings
34#
35
Anthony Youngb3e2f332012-03-16 17:01:49 -070036# Source params - override xenrc params in your localrc to suit your taste
Mate Lakat0b3804b2013-05-07 16:58:17 +010037source $THIS_DIR/xenrc
Anthony Youngaf6ed6b2011-11-02 07:50:27 -050038
Renuka Apte0af143b2012-04-02 15:46:53 -070039xe_min()
40{
41 local cmd="$1"
42 shift
43 xe "$cmd" --minimal "$@"
44}
Anthony Youngb62b4ca2011-10-26 22:29:08 -070045
John Garbuttdaadf742012-04-27 18:28:28 +010046#
47# Prepare Dom0
48# including installing XenAPI plugins
49#
50
Mate Lakata8bf0f22013-03-07 18:37:31 +000051cd $THIS_DIR
John Garbuttdaadf742012-04-27 18:28:28 +010052
Mate Lakat57e3da92013-03-22 16:34:05 +000053# Install plugins
John Garbuttdaadf742012-04-27 18:28:28 +010054
Mate Lakat57e3da92013-03-22 16:34:05 +000055## Nova plugins
56NOVA_ZIPBALL_URL=${NOVA_ZIPBALL_URL:-$(zip_snapshot_location $NOVA_REPO $NOVA_BRANCH)}
57install_xapi_plugins_from_zipball $NOVA_ZIPBALL_URL
Maru Newby2298ca42012-10-25 23:46:42 +000058
Mate Lakat57e3da92013-03-22 16:34:05 +000059## Install the netwrap xapi plugin to support agent control of dom0 networking
Maru Newby2298ca42012-10-25 23:46:42 +000060if [[ "$ENABLED_SERVICES" =~ "q-agt" && "$Q_PLUGIN" = "openvswitch" ]]; then
Mate Lakat57e3da92013-03-22 16:34:05 +000061 QUANTUM_ZIPBALL_URL=${QUANTUM_ZIPBALL_URL:-$(zip_snapshot_location $QUANTUM_REPO $QUANTUM_BRANCH)}
62 install_xapi_plugins_from_zipball $QUANTUM_ZIPBALL_URL
Maru Newby2298ca42012-10-25 23:46:42 +000063fi
64
Mate Lakat57e3da92013-03-22 16:34:05 +000065create_directory_for_kernels
John Garbuttdaadf742012-04-27 18:28:28 +010066
67#
68# Configure Networking
69#
Mate Lakat9e326772013-05-08 16:42:22 +010070setup_network "$VM_BRIDGE_OR_NET_NAME"
71setup_network "$MGT_BRIDGE_OR_NET_NAME"
72setup_network "$PUB_BRIDGE_OR_NET_NAME"
Anthony Youngb62b4ca2011-10-26 22:29:08 -070073
Mate Lakatf652e0f2013-05-21 18:12:48 +010074# With quantum, one more network is required, which is internal to the
75# hypervisor, and used by the VMs
76if is_service_enabled quantum; then
77 setup_network "$XEN_INT_BRIDGE_OR_NET_NAME"
78fi
79
Mate Lakat9e326772013-05-08 16:42:22 +010080if parameter_is_specified "FLAT_NETWORK_BRIDGE"; then
81 cat >&2 << EOF
82ERROR: FLAT_NETWORK_BRIDGE is specified in localrc file
83This is considered as an error, as its value will be derived from the
84VM_BRIDGE_OR_NET_NAME variable's value.
85EOF
86 exit 1
Anthony Youngb62b4ca2011-10-26 22:29:08 -070087fi
88
Mate Lakat9e326772013-05-08 16:42:22 +010089if ! xenapi_is_listening_on "$MGT_BRIDGE_OR_NET_NAME"; then
90 cat >&2 << EOF
91ERROR: XenAPI does not have an assigned IP address on the management network.
92please review your XenServer network configuration / localrc file.
93EOF
94 exit 1
95fi
96
97HOST_IP=$(xenapi_ip_on "$MGT_BRIDGE_OR_NET_NAME")
John Garbuttdaadf742012-04-27 18:28:28 +010098
99# Set up ip forwarding, but skip on xcp-xapi
John Garbuttd8f1a872012-06-26 11:16:38 +0100100if [ -a /etc/sysconfig/network ]; then
John Garbuttdaadf742012-04-27 18:28:28 +0100101 if ! grep -q "FORWARD_IPV4=YES" /etc/sysconfig/network; then
102 # FIXME: This doesn't work on reboot!
103 echo "FORWARD_IPV4=YES" >> /etc/sysconfig/network
104 fi
105fi
Anthony Youngb62b4ca2011-10-26 22:29:08 -0700106# Also, enable ip forwarding in rc.local, since the above trick isn't working
107if ! grep -q "echo 1 >/proc/sys/net/ipv4/ip_forward" /etc/rc.local; then
108 echo "echo 1 >/proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
109fi
Anthony Youngb62b4ca2011-10-26 22:29:08 -0700110# Enable ip forwarding at runtime as well
111echo 1 > /proc/sys/net/ipv4/ip_forward
112
John Garbuttdaadf742012-04-27 18:28:28 +0100113
114#
Anthony Young346e4912011-11-05 00:22:47 -0500115# Shutdown previous runs
John Garbuttdaadf742012-04-27 18:28:28 +0100116#
117
Anthony Young346e4912011-11-05 00:22:47 -0500118DO_SHUTDOWN=${DO_SHUTDOWN:-1}
John Garbuttdaadf742012-04-27 18:28:28 +0100119CLEAN_TEMPLATES=${CLEAN_TEMPLATES:-false}
Anthony Young346e4912011-11-05 00:22:47 -0500120if [ "$DO_SHUTDOWN" = "1" ]; then
Anthony Young40b57372011-11-05 00:30:07 -0500121 # Shutdown all domU's that created previously
John Garbuttdaadf742012-04-27 18:28:28 +0100122 clean_templates_arg=""
123 if $CLEAN_TEMPLATES; then
124 clean_templates_arg="--remove-templates"
125 fi
126 ./scripts/uninstall-os-vpx.sh $clean_templates_arg
Anthony Young346e4912011-11-05 00:22:47 -0500127
128 # Destroy any instances that were launched
129 for uuid in `xe vm-list | grep -1 instance | grep uuid | sed "s/.*\: //g"`; do
130 echo "Shutting down nova instance $uuid"
131 xe vm-unpause uuid=$uuid || true
Armando Migliaccio7a5f7f22012-04-20 22:58:00 +0100132 xe vm-shutdown uuid=$uuid || true
Anthony Young346e4912011-11-05 00:22:47 -0500133 xe vm-destroy uuid=$uuid
134 done
Anthony Youngfa4ecc62011-11-11 10:23:22 -0800135
136 # Destroy orphaned vdis
137 for uuid in `xe vdi-list | grep -1 Glance | grep uuid | sed "s/.*\: //g"`; do
138 xe vdi-destroy uuid=$uuid
139 done
Anthony Young346e4912011-11-05 00:22:47 -0500140fi
Anthony Youngb62b4ca2011-10-26 22:29:08 -0700141
Renuka Apte0af143b2012-04-02 15:46:53 -0700142
John Garbuttdaadf742012-04-27 18:28:28 +0100143#
144# Create Ubuntu VM template
145# and/or create VM from template
146#
Renuka Apte0af143b2012-04-02 15:46:53 -0700147
John Garbuttdaadf742012-04-27 18:28:28 +0100148GUEST_NAME=${GUEST_NAME:-"DevStackOSDomU"}
John Garbuttd8f1a872012-06-26 11:16:38 +0100149TNAME="devstack_template"
John Garbuttdaadf742012-04-27 18:28:28 +0100150SNAME_PREPARED="template_prepared"
151SNAME_FIRST_BOOT="before_first_boot"
152
153function wait_for_VM_to_halt() {
Bob Ball63c6c2b2013-01-24 13:13:51 +0000154 set +x
155 echo "Waiting for the VM to halt. Progress in-VM can be checked with vncviewer:"
156 mgmt_ip=$(echo $XENAPI_CONNECTION_URL | tr -d -c '1234567890.')
157 domid=$(xe vm-list name-label="$GUEST_NAME" params=dom-id minimal=true)
158 port=$(xenstore-read /local/domain/$domid/console/vnc-port)
159 echo "vncviewer -via $mgmt_ip localhost:${port:2}"
Renuka Apte0af143b2012-04-02 15:46:53 -0700160 while true
161 do
162 state=$(xe_min vm-list name-label="$GUEST_NAME" power-state=halted)
163 if [ -n "$state" ]
164 then
165 break
166 else
Bob Ball63c6c2b2013-01-24 13:13:51 +0000167 echo -n "."
John Garbuttdaadf742012-04-27 18:28:28 +0100168 sleep 20
Renuka Apte0af143b2012-04-02 15:46:53 -0700169 fi
170 done
Bob Ball63c6c2b2013-01-24 13:13:51 +0000171 set -x
John Garbuttdaadf742012-04-27 18:28:28 +0100172}
Renuka Apte0af143b2012-04-02 15:46:53 -0700173
John Garbuttdaadf742012-04-27 18:28:28 +0100174templateuuid=$(xe template-list name-label="$TNAME")
175if [ -z "$templateuuid" ]; then
176 #
177 # Install Ubuntu over network
178 #
179
John Garbuttdaadf742012-04-27 18:28:28 +0100180 # always update the preseed file, incase we have a newer one
181 PRESEED_URL=${PRESEED_URL:-""}
182 if [ -z "$PRESEED_URL" ]; then
183 PRESEED_URL="${HOST_IP}/devstackubuntupreseed.cfg"
184 HTTP_SERVER_LOCATION="/opt/xensource/www"
185 if [ ! -e $HTTP_SERVER_LOCATION ]; then
186 HTTP_SERVER_LOCATION="/var/www/html"
187 mkdir -p $HTTP_SERVER_LOCATION
188 fi
Mate Lakata8bf0f22013-03-07 18:37:31 +0000189 cp -f $THIS_DIR/devstackubuntupreseed.cfg $HTTP_SERVER_LOCATION
Mate Lakatd3740f72013-05-09 15:02:21 +0100190
191 sed \
192 -e "s,\(d-i mirror/http/hostname string\).*,\1 $UBUNTU_INST_HTTP_HOSTNAME,g" \
193 -e "s,\(d-i mirror/http/directory string\).*,\1 $UBUNTU_INST_HTTP_DIRECTORY,g" \
194 -e "s,\(d-i mirror/http/proxy string\).*,\1 $UBUNTU_INST_HTTP_PROXY,g" \
195 -i "${HTTP_SERVER_LOCATION}/devstackubuntupreseed.cfg"
John Garbuttdaadf742012-04-27 18:28:28 +0100196 fi
197
John Garbuttd8f1a872012-06-26 11:16:38 +0100198 # Update the template
Mate Lakata8bf0f22013-03-07 18:37:31 +0000199 $THIS_DIR/scripts/install_ubuntu_template.sh $PRESEED_URL
John Garbuttdaadf742012-04-27 18:28:28 +0100200
201 # create a new VM with the given template
202 # creating the correct VIFs and metadata
Mate Lakat9e326772013-05-08 16:42:22 +0100203 $THIS_DIR/scripts/install-os-vpx.sh \
204 -t "$UBUNTU_INST_TEMPLATE_NAME" \
205 -v "$VM_BRIDGE_OR_NET_NAME" \
206 -m "$MGT_BRIDGE_OR_NET_NAME" \
207 -p "$PUB_BRIDGE_OR_NET_NAME" \
208 -l "$GUEST_NAME" \
Mate Lakat8ff33ce2013-05-30 13:26:58 +0100209 -r "$OSDOMU_MEM_MB"
John Garbuttdaadf742012-04-27 18:28:28 +0100210
211 # wait for install to finish
212 wait_for_VM_to_halt
213
214 # set VM to restart after a reboot
Renuka Apte0af143b2012-04-02 15:46:53 -0700215 vm_uuid=$(xe_min vm-list name-label="$GUEST_NAME")
216 xe vm-param-set actions-after-reboot=Restart uuid="$vm_uuid"
217
John Garbuttdaadf742012-04-27 18:28:28 +0100218 #
219 # Prepare VM for DevStack
220 #
221
222 # Install XenServer tools, and other such things
Mate Lakata8bf0f22013-03-07 18:37:31 +0000223 $THIS_DIR/prepare_guest_template.sh "$GUEST_NAME"
John Garbuttdaadf742012-04-27 18:28:28 +0100224
225 # start the VM to run the prepare steps
226 xe vm-start vm="$GUEST_NAME"
227
228 # Wait for prep script to finish and shutdown system
229 wait_for_VM_to_halt
230
Renuka Apte0af143b2012-04-02 15:46:53 -0700231 # Make template from VM
John Garbuttdaadf742012-04-27 18:28:28 +0100232 snuuid=$(xe vm-snapshot vm="$GUEST_NAME" new-name-label="$SNAME_PREPARED")
233 xe snapshot-clone uuid=$snuuid new-name-label="$TNAME"
234else
235 #
236 # Template already installed, create VM from template
237 #
238 vm_uuid=$(xe vm-install template="$TNAME" new-name-label="$GUEST_NAME")
Renuka Apte0af143b2012-04-02 15:46:53 -0700239fi
240
Mate Lakat5a56cd62013-06-17 13:54:43 +0100241## Setup network cards
242# Wipe out all
243destroy_all_vifs_of "$GUEST_NAME"
244# Tenant network
245add_interface "$GUEST_NAME" "$VM_BRIDGE_OR_NET_NAME" "$VM_DEV_NR"
246# Management network
247add_interface "$GUEST_NAME" "$MGT_BRIDGE_OR_NET_NAME" "$MGT_DEV_NR"
248# Public network
249add_interface "$GUEST_NAME" "$PUB_BRIDGE_OR_NET_NAME" "$PUB_DEV_NR"
John Garbuttdaadf742012-04-27 18:28:28 +0100250
251#
252# Inject DevStack inside VM disk
253#
Mate Lakata8bf0f22013-03-07 18:37:31 +0000254$THIS_DIR/build_xva.sh "$GUEST_NAME"
Renuka Apte0af143b2012-04-02 15:46:53 -0700255
Mate Lakatf652e0f2013-05-21 18:12:48 +0100256# Attach a network interface for the integration network (so that the bridge
Mate Lakat8ff33ce2013-05-30 13:26:58 +0100257# is created by XenServer). This is required for Quantum. Also pass that as a
258# kernel parameter for DomU
Mate Lakatf652e0f2013-05-21 18:12:48 +0100259if is_service_enabled quantum; then
Mate Lakat5a56cd62013-06-17 13:54:43 +0100260 add_interface "$GUEST_NAME" "$XEN_INT_BRIDGE_OR_NET_NAME" $XEN_INT_DEV_NR
Mate Lakat8ff33ce2013-05-30 13:26:58 +0100261
262 XEN_INTEGRATION_BRIDGE=$(bridge_for "$XEN_INT_BRIDGE_OR_NET_NAME")
263 append_kernel_cmdline \
264 "$GUEST_NAME" \
265 "xen_integration_bridge=${XEN_INTEGRATION_BRIDGE}"
Mate Lakatf652e0f2013-05-21 18:12:48 +0100266fi
267
Mate Lakat8ff33ce2013-05-30 13:26:58 +0100268FLAT_NETWORK_BRIDGE=$(bridge_for "$VM_BRIDGE_OR_NET_NAME")
269append_kernel_cmdline "$GUEST_NAME" "flat_network_bridge=${FLAT_NETWORK_BRIDGE}"
270
John Garbuttdaadf742012-04-27 18:28:28 +0100271# create a snapshot before the first boot
272# to allow a quick re-run with the same settings
273xe vm-snapshot vm="$GUEST_NAME" new-name-label="$SNAME_FIRST_BOOT"
274
John Garbuttdaadf742012-04-27 18:28:28 +0100275#
276# Run DevStack VM
277#
Renuka Apte0af143b2012-04-02 15:46:53 -0700278xe vm-start vm="$GUEST_NAME"
Anthony Young3eb8f592011-10-26 23:11:52 -0700279
John Garbuttdaadf742012-04-27 18:28:28 +0100280function ssh_no_check() {
281 ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$@"
282}
283
Mate Lakat86446762013-05-12 18:34:29 +0100284# Get hold of the Management IP of OpenStack VM
285OS_VM_MANAGEMENT_ADDRESS=$MGT_IP
286if [ $OS_VM_MANAGEMENT_ADDRESS == "dhcp" ]; then
Mate Lakat5a56cd62013-06-17 13:54:43 +0100287 OS_VM_MANAGEMENT_ADDRESS=$(find_ip_by_name $GUEST_NAME $MGT_DEV_NR)
Mate Lakat86446762013-05-12 18:34:29 +0100288fi
289
290# Get hold of the Service IP of OpenStack VM
Mate Lakat5a56cd62013-06-17 13:54:43 +0100291if [ $HOST_IP_IFACE == "eth${MGT_DEV_NR}" ]; then
Mate Lakat86446762013-05-12 18:34:29 +0100292 OS_VM_SERVICES_ADDRESS=$MGT_IP
John Garbuttdaadf742012-04-27 18:28:28 +0100293 if [ $MGT_IP == "dhcp" ]; then
Mate Lakat5a56cd62013-06-17 13:54:43 +0100294 OS_VM_SERVICES_ADDRESS=$(find_ip_by_name $GUEST_NAME $MGT_DEV_NR)
John Garbuttdaadf742012-04-27 18:28:28 +0100295 fi
296else
Mate Lakat86446762013-05-12 18:34:29 +0100297 OS_VM_SERVICES_ADDRESS=$PUB_IP
John Garbuttdaadf742012-04-27 18:28:28 +0100298 if [ $PUB_IP == "dhcp" ]; then
Mate Lakat5a56cd62013-06-17 13:54:43 +0100299 OS_VM_SERVICES_ADDRESS=$(find_ip_by_name $GUEST_NAME $PUB_DEV_NR)
John Garbuttdaadf742012-04-27 18:28:28 +0100300 fi
Renuka Aptec56885a2012-02-29 16:09:26 -0800301fi
302
Anthony Young1de18c62011-11-01 14:19:18 -0500303# If we have copied our ssh credentials, use ssh to monitor while the installation runs
304WAIT_TILL_LAUNCH=${WAIT_TILL_LAUNCH:-1}
John Garbuttdaadf742012-04-27 18:28:28 +0100305COPYENV=${COPYENV:-1}
Anthony Young1de18c62011-11-01 14:19:18 -0500306if [ "$WAIT_TILL_LAUNCH" = "1" ] && [ -e ~/.ssh/id_rsa.pub ] && [ "$COPYENV" = "1" ]; then
Bob Ball7fcc1572013-02-20 15:56:25 +0000307 set +x
Anthony Young1de18c62011-11-01 14:19:18 -0500308
Bob Ball7fcc1572013-02-20 15:56:25 +0000309 echo "VM Launched - Waiting for startup script"
John Garbuttdaadf742012-04-27 18:28:28 +0100310 # wait for log to appear
Mate Lakat86446762013-05-12 18:34:29 +0100311 while ! ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "[ -e run.sh.log ]"; do
John Garbuttdaadf742012-04-27 18:28:28 +0100312 sleep 10
Anthony Young1de18c62011-11-01 14:19:18 -0500313 done
Bob Ball7fcc1572013-02-20 15:56:25 +0000314 echo -n "Running"
Mate Lakat86446762013-05-12 18:34:29 +0100315 while [ `ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS pgrep -c run.sh` -ge 1 ]
Mate Lakat9efcf602012-12-19 10:23:06 +0000316 do
John Garbuttdaadf742012-04-27 18:28:28 +0100317 sleep 10
Mate Lakat9efcf602012-12-19 10:23:06 +0000318 echo -n "."
Anthony Young1de18c62011-11-01 14:19:18 -0500319 done
Mate Lakat9efcf602012-12-19 10:23:06 +0000320 echo "done!"
321 set -x
Anthony Young1de18c62011-11-01 14:19:18 -0500322
Mate Lakat9efcf602012-12-19 10:23:06 +0000323 # output the run.sh.log
Mate Lakat86446762013-05-12 18:34:29 +0100324 ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS 'cat run.sh.log'
Anthony Young1de18c62011-11-01 14:19:18 -0500325
Mate Lakat9efcf602012-12-19 10:23:06 +0000326 # Fail if the expected text is not found
Mate Lakat86446762013-05-12 18:34:29 +0100327 ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS 'cat run.sh.log' | grep -q 'stack.sh completed in'
Mate Lakat9efcf602012-12-19 10:23:06 +0000328
Bob Ball63c6c2b2013-01-24 13:13:51 +0000329 set +x
John Garbuttdaadf742012-04-27 18:28:28 +0100330 echo "################################################################################"
Anthony Young1de18c62011-11-01 14:19:18 -0500331 echo ""
John Garbuttdaadf742012-04-27 18:28:28 +0100332 echo "All Finished!"
333 echo "You can visit the OpenStack Dashboard"
Mate Lakat86446762013-05-12 18:34:29 +0100334 echo "at http://$OS_VM_SERVICES_ADDRESS, and contact other services at the usual ports."
Anthony Young1de18c62011-11-01 14:19:18 -0500335else
Bob Ball63c6c2b2013-01-24 13:13:51 +0000336 set +x
Anthony Young1de18c62011-11-01 14:19:18 -0500337 echo "################################################################################"
338 echo ""
339 echo "All Finished!"
340 echo "Now, you can monitor the progress of the stack.sh installation by "
341 echo "tailing /opt/stack/run.sh.log from within your domU."
342 echo ""
Mate Lakat86446762013-05-12 18:34:29 +0100343 echo "ssh into your domU now: 'ssh stack@$OS_VM_MANAGEMENT_ADDRESS' using your password"
Anthony Young1de18c62011-11-01 14:19:18 -0500344 echo "and then do: 'tail -f /opt/stack/run.sh.log'"
345 echo ""
346 echo "When the script completes, you can then visit the OpenStack Dashboard"
Mate Lakat86446762013-05-12 18:34:29 +0100347 echo "at http://$OS_VM_SERVICES_ADDRESS, and contact other services at the usual ports."
Anthony Young1de18c62011-11-01 14:19:18 -0500348fi