Browse code

Merge remote-tracking branch 'origin/build_kvm' into build_kvm

Anthony Young authored on 2011/10/20 09:26:07
Showing 2 changed files
... ...
@@ -1,18 +1,32 @@
1 1
 #!/usr/bin/env bash
2 2
 
3
+UBUNTU_VERSION=`cat /etc/lsb-release | grep CODENAME | sed 's/.*=//g'`
4
+if [ ! "oneiric" = "$UBUNTU_VERSION" ]; then
5
+    echo "This script only works with oneiric"
6
+    exit 1
7
+fi
8
+
3 9
 # Echo commands
4 10
 set -o xtrace
5 11
 
6 12
 # Keep track of the current directory
7 13
 TOOLS_DIR=$(cd $(dirname "$0") && pwd)
14
+TOP_DIR=$TOOLS_DIR/..
8 15
 
16
+# Configure the root password of the vm
9 17
 ROOT_PASSWORD=${ROOT_PASSWORD:password}
10
-PERSIST_DIR=${PERSIST_DIR:-/opt/kvmstack}
11
-IMAGES_DIR=$PERSIST_DIR/images
12
-mkdir -p $UEC_DIR
18
+
19
+# Where to store files and instances
20
+KVMSTACK_DIR=${KVMSTACK_DIR:-/opt/kvmstack}
21
+
22
+# Where to store images
23
+IMAGES_DIR=$KVMSTACK_DIR/images
24
+
25
+# Create images dir
26
+mkdir -p $IMAGES_DIR
13 27
 
14 28
 # Move to top devstack dir
15
-cd ..
29
+cd $TOP_DIR
16 30
 
17 31
 # Abort if localrc is not set
18 32
 if [ ! -e ./localrc ]; then
... ...
@@ -24,26 +38,34 @@ fi
24 24
 # Source params
25 25
 source ./stackrc
26 26
 
27
-# Base image (oneiric by default)
28
-IMAGE_FNAME=natty.raw
29
-IMAGE_NAME=natty
27
+# Base image (natty by default)
28
+DIST_NAME=${DIST_NAME:-natty}
29
+IMAGE_FNAME=$DIST_NAME.raw
30
+
31
+# Original version of built image
32
+BASE_IMAGE=$KVMSTACK_DIR/images/natty.raw
30 33
 
31
-BASE_IMAGE=$PERSIST_DIR/images/natty.raw
32
-BASE_IMAGE_COPY=$IMAGES_DIR/$IMAGE_NAME.raw.copy
34
+# Copy of base image, which we pre-install with tasty treats
35
+BASE_IMAGE_COPY=$IMAGES_DIR/$DIST_NAME.raw.copy
33 36
 
37
+# Name of our instance, used by libvirt
34 38
 VM_NAME=${VM_NAME:-kvmstack}
39
+
40
+# Mop up after previous runs
35 41
 virsh shutdown $VM_NAME
36 42
 virsh destroy $VM_NAME
37 43
 
38
-VM_DIR=$PERSIST_DIR/instances/$VM_NAME
44
+# Where this vm is stored
45
+VM_DIR=$KVMSTACK_DIR/instances/$VM_NAME
39 46
 
47
+# Create vm dir
40 48
 mkdir -p $VM_DIR
41 49
 
42
-# Where to mount
50
+# Mount point into copied base image
43 51
 COPY_DIR=$VM_DIR/copy
44 52
 mkdir -p $COPY_DIR
45 53
 
46
-
54
+# Create the base image if it does not yet exist
47 55
 if [ ! -e $IMAGES_DIR/$IMAGE_FNAME ]; then
48 56
     cd $TOOLS_DIR
49 57
     ./make_image.sh -m -r 5000  natty raw
... ...
@@ -51,6 +73,12 @@ if [ ! -e $IMAGES_DIR/$IMAGE_FNAME ]; then
51 51
     cd $TOP_DIR
52 52
 fi
53 53
 
54
+# Create a copy of the base image
55
+if [ ! -e $BASE_IMAGE_COPY ]; then
56
+    cp -p $BASE_IMAGE $BASE_IMAGE_COPY
57
+fi
58
+
59
+# Unmount the copied base image
54 60
 function unmount_images() {
55 61
     # unmount the filesystem
56 62
     while df | grep -q $COPY_DIR; do
... ...
@@ -59,25 +87,22 @@ function unmount_images() {
59 59
     done
60 60
 }
61 61
 
62
-# unmount from failed runs
62
+# Unmount from failed runs
63 63
 unmount_images
64 64
 
65
-function kill_tail() {
65
+# Ctrl-c catcher
66
+function kill_unmount() {
66 67
     unmount_images
67 68
     exit 1
68 69
 }
69 70
 
70
-if [ ! -e $BASE_IMAGE_COPY ]; then
71
-    cp -p $BASE_IMAGE $BASE_IMAGE_COPY
72
-fi
73
-
74 71
 # Install deps
75
-apt-get install -y kvm libvirt-bin kpartx
72
+apt-get install -y --force-yes kvm libvirt-bin kpartx
76 73
 
77 74
 # Let Ctrl-c kill tail and exit
78
-trap kill_tail SIGINT
75
+trap kill_unmount SIGINT
79 76
 
80
-# Where code will live in image
77
+# Where Openstack code will live in image
81 78
 DEST=${DEST:-/opt/stack}
82 79
 
83 80
 # Mount the file system
... ...
@@ -121,15 +146,20 @@ git_clone $OPENSTACKX_REPO $COPY_DIR/$DEST/openstackx $OPENSTACKX_BRANCH
121 121
 git_clone $KEYSTONE_REPO $COPY_DIR/$DEST/keystone $KEYSTONE_BRANCH
122 122
 git_clone $NOVNC_REPO $COPY_DIR/$DEST/noVNC $NOVNC_BRANCH
123 123
 
124
-# unmount the filesystems
124
+# Back to devstack
125
+cd $TOP_DIR
126
+
127
+# Unmount the filesystems
125 128
 unmount_images
126 129
 
127
-rm -f $VM_DIR/kernel
130
+# Clean up old runs
131
+cd $VM_DIR
128 132
 rm -f $VM_DIR/disk
129 133
 
130
-cd $VM_DIR
134
+# Clean up old instance data
131 135
 qemu-img create -f qcow2 -b $BASE_IMAGE_COPY disk
132 136
 
137
+# Network configuration variables
133 138
 BRIDGE=${BRIDGE:-br0}
134 139
 CONTAINER=${CONTAINER:-STACK}
135 140
 CONTAINER_IP=${CONTAINER_IP:-192.168.1.50}
... ...
@@ -138,7 +168,7 @@ CONTAINER_NETMASK=${CONTAINER_NETMASK:-255.255.255.0}
138 138
 CONTAINER_GATEWAY=${CONTAINER_GATEWAY:-192.168.1.1}
139 139
 CONTAINER_MAC=${CONTAINER_MAC:-02:16:3e:07:70:d7}
140 140
 
141
-# Create configuration
141
+# libvirt.xml configuration
142 142
 LIBVIRT_XML=libvirt.xml
143 143
 cat > $LIBVIRT_XML <<EOF
144 144
 <domain type='kvm'>
... ...
@@ -146,11 +176,8 @@ cat > $LIBVIRT_XML <<EOF
146 146
     <memory>1524288</memory>
147 147
     <os>
148 148
             <type>hvm</type>
149
+            <boot dev='hd'/>
149 150
             <bootmenu enable='yes'/>
150
-<!--
151
-            <kernel>$VM_DIR/kernel</kernel>
152
-                <cmdline>root=/dev/vda console=ttyS0</cmdline>
153 151
     </os>
154 152
     <features>
155 153
         <acpi/>
... ...
@@ -189,14 +216,18 @@ cat > $LIBVIRT_XML <<EOF
189 189
 </domain>
190 190
 EOF
191 191
 
192
+# Mount point for instance fs
192 193
 ROOTFS=$VM_DIR/root
193 194
 mkdir -p $ROOTFS
194 195
 
196
+# Make sure we have nbd-ness
195 197
 modprobe nbd max_part=63
196 198
 
199
+# Clean up from previous runs
197 200
 umount $ROOTFS || echo 'ok'
198 201
 qemu-nbd -d /dev/nbd5 || echo 'ok'
199 202
 
203
+# Mount the instance
200 204
 qemu-nbd -c /dev/nbd5 disk
201 205
 mount /dev/nbd5 $ROOTFS -o offset=32256 -t ext4
202 206
 
... ...
@@ -213,15 +244,12 @@ iface eth0 inet static
213 213
         gateway $CONTAINER_GATEWAY
214 214
 EOF
215 215
 
216
+# User configuration for the instance
216 217
 chroot $ROOTFS groupadd libvirtd
217 218
 chroot $ROOTFS useradd stack -s /bin/bash -d $DEST -G libvirtd
218 219
 cp -pr $TOOLS_DIR/.. $ROOTFS/$DEST/devstack
219 220
 echo "root:$ROOT_PASSWORD" | chroot $ROOTFS chpasswd
220
-
221
-# a simple password - pass
222 221
 echo "stack:pass" | chroot $ROOTFS chpasswd
223
-
224
-# stack requires)
225 222
 echo "stack ALL=(ALL) NOPASSWD: ALL" >> $ROOTFS/etc/sudoers
226 223
 
227 224
 # Gracefully cp only if source file/dir exists
... ...
@@ -245,7 +273,6 @@ fi
245 245
 RUN_SH=$ROOTFS/$DEST/run.sh
246 246
 cat > $RUN_SH <<EOF
247 247
 #!/usr/bin/env bash
248
-sleep 1
249 248
 
250 249
 # Kill any existing screens
251 250
 killall screen
... ...
@@ -261,16 +288,22 @@ echo >> /$DEST/run.sh.log
261 261
 echo >> /$DEST/run.sh.log
262 262
 echo "All done! Time to start clicking." >> /$DEST/run.sh.log
263 263
 EOF
264
-
265
-# Make the run.sh executable
266 264
 chmod 755 $RUN_SH
267 265
 
268 266
 # Make runner launch on boot
269 267
 RC_LOCAL=$ROOTFS/etc/init.d/local
270 268
 cat > $RC_LOCAL <<EOF
271 269
 #!/bin/sh -e
270
+# Reboot if this is our first run to enable console log on natty :(
271
+if [ ! -e /root/firstlaunch ]; then
272
+    touch /root/firstlaunch
273
+#    reboot
274
+    exit 0
275
+fi
272 276
 su -c "$DEST/run.sh" stack
273 277
 EOF
278
+chmod +x $RC_LOCAL
279
+chroot $ROOTFS sudo update-rc.d local defaults 80
274 280
 
275 281
 # Make our ip address hostnames look nice at the command prompt
276 282
 echo "export PS1='${debian_chroot:+($debian_chroot)}\\u@\\H:\\w\\$ '" >> $ROOTFS/$DEST/.bashrc
... ...
@@ -279,13 +312,52 @@ echo "export PS1='${debian_chroot:+($debian_chroot)}\\u@\\H:\\w\\$ '" >> $ROOTFS
279 279
 # Give stack ownership over $DEST so it may do the work needed
280 280
 chroot $ROOTFS chown -R stack $DEST
281 281
 
282
-chmod +x $RC_LOCAL
283
-chroot $ROOTFS sudo update-rc.d local defaults 80
284
-
282
+# Change boot params so that we get a console log
285 283
 sudo sed -e "s/quiet splash/splash console=ttyS0 console=ttyS1,19200n8/g" -i $ROOTFS/boot/grub/menu.lst
286 284
 
287
-umount $ROOTFS
285
+# Unmount
286
+umount $ROOTFS || echo 'ok'
288 287
 qemu-nbd -d /dev/nbd5
289 288
 
290
-cd $VM_DIR
291
-virsh create libvirt.xml
289
+# Create the instance
290
+cd $VM_DIR && virsh create libvirt.xml
291
+
292
+# Tail the console log till we are done
293
+WAIT_TILL_LAUNCH=${WAIT_TILL_LAUNCH:-0}
294
+if [ "$WAIT_TILL_LAUNCH" = "1" ]; then
295
+    # Done creating the container, let's tail the log
296
+    echo
297
+    echo "============================================================="
298
+    echo "                          -- YAY! --"
299
+    echo "============================================================="
300
+    echo
301
+    echo "We're done launching the vm, about to start tailing the"
302
+    echo "stack.sh log. It will take a second or two to start."
303
+    echo
304
+    echo "Just CTRL-C at any time to stop tailing."
305
+
306
+    while [ ! -e "$VM_DIR/console.log" ]; do
307
+      sleep 1
308
+    done
309
+
310
+    tail -F $VM_DIR/console.log &
311
+
312
+    TAIL_PID=$!
313
+
314
+    function kill_tail() {
315
+        kill $TAIL_PID
316
+        exit 1
317
+    }
318
+ 
319
+    # Let Ctrl-c kill tail and exit
320
+    trap kill_tail SIGINT
321
+
322
+    echo "Waiting stack.sh to finish..."
323
+    while ! cat $VM_DIR/console.log | grep -q 'stack.sh completed' ; do
324
+        sleep 5
325
+    done
326
+
327
+    kill $TAIL_PID
328
+    echo ""
329
+    echo "Finished - Zip-a-dee Doo-dah!"
330
+fi
... ...
@@ -110,7 +110,7 @@ esac
110 110
 
111 111
 # Install stuff if necessary
112 112
 if [ -z `which vmbuilder` ]; then
113
-    sudo apt-get install ubuntu-vm-builder
113
+    sudo apt-get install -y ubuntu-vm-builder
114 114
 fi
115 115
 
116 116
 if [ -n "$CHROOTONLY" ]; then