orchestra team mailing list archive
-
orchestra team
-
Mailing list archive
-
Message #00339
[Merge] lp:~jtv/orchestra/odev-executable into lp:~orchestra/orchestra/odev
Jeroen T. Vermeulen has proposed merging lp:~jtv/orchestra/odev-executable into lp:~orchestra/orchestra/odev.
Requested reviews:
Scott Moser (smoser)
For more details, see:
https://code.launchpad.net/~jtv/orchestra/odev-executable/+merge/90516
Here's a bundle of changes I made locally:
* Fix a stupid mistake I made in the architecture-guessing code in setup.py. It broke.
* Reduce wget's progress output. It's nice to have some, but the volume was insane.
* Turn HOWTO into a proper script. The difference is small, the convenience great.
* Wait a bit between firing up Cobbler and populating its database.
* Clean up bits of code. Easier to follow, I hope.
This gives me an odev setup that I can get running just by executing HOWTO. There's been just one wart so far: I had "sleep 10" in the HOWTO before, and I guess that wasn't enough. The setup.py run to populate the database would fail with "no route to host," but afterwards I could ssh in and also access the web UI. I guess it just needs a little longer; 20 seconds is a wild stab in the dark.
Jeroen
--
https://code.launchpad.net/~jtv/orchestra/odev-executable/+merge/90516
Your team orchestra is subscribed to branch lp:~orchestra/orchestra/odev.
=== modified file 'HOWTO' (properties changed: -x to +x)
--- HOWTO 2012-01-25 14:54:08 +0000
+++ HOWTO 2012-01-27 19:52:03 +0000
@@ -1,46 +1,57 @@
+#! /bin/bash -e
+#
+# This file documents how to get odev running on your system. But it's also
+# a script; you may find that you can just run it and get a working setup.
+#
## install some dependencies
-$ pkgs=""
-$ pkgs="$pkgs genisoimage coreutils" # for cloud-init's 'make-iso'
-$ pkgs="$pkgs python-libvirt libvirt-bin" # for libvirt interaction
-$ pkgs="$pkgs socat" # for libvirt-> cobbler
-$ pkgs="$pkgs python-cheetah" # for setup.py
+pkgs=""
+pkgs="$pkgs genisoimage coreutils" # for cloud-init's 'make-iso'
+pkgs="$pkgs python-libvirt libvirt-bin" # for libvirt interaction
+pkgs="$pkgs socat" # for libvirt-> cobbler
+pkgs="$pkgs python-cheetah" # for setup.py
-$ sudo apt-get update
-$ sudo apt-get install -y $pkgs </dev/null
+sudo apt-get update -qq || /bin/true
+sudo apt-get install -y $pkgs </dev/null
## add your user to libvirtd group
-$ sudo adduser $USER libvirtd
-$ sudo adduser $USER kvm # this is really only necessary for zimmer-build
+sudo adduser $USER libvirtd
+sudo adduser $USER kvm # this is really only necessary for zimmer-build
##
## NOTE: you have to log out and log back in for this to take affect
##
## build a zimmer image by following readme in zimmer-build
-$ cd zimmer-build
-$ ./build zimmer-disk0.img
-$ cd ..
+cd zimmer-build
+./build zimmer-disk0.img
+cd ..
## create libvirt xml files for nodes, zimmer, network
-$ ./setup.py libvirt-setup
+./setup.py libvirt-setup
## start odev-net network
-$ virsh -c qemu:///system net-start odev-net
+virsh -c qemu:///system net-start odev-net
## create zimmer disk image qcow backing against pristine version
-$ qemu-img create -f qcow2 -b zimmer-build/zimmer-disk0.img zimmer-disk0.img
+qemu-img create -f qcow2 -b zimmer-build/zimmer-disk0.img zimmer-disk0.img
## start zimmer instance / orchestra server
-$ virsh -c qemu:///system start zimmer
-
-## Now,
-## * you can ssh ubuntu@192.168.123.2 (password passw0rd)
-## Then run 'ssh-import-id' or sudo.
-## * http://192.168.123.2/cobbler_web should have cobbler web ui,
-## log in with 'cobbler:xcobbler'
+virsh -c qemu:///system start zimmer
+
+echo
+echo "Starting orchestra server."
+echo "You can now ssh ubuntu@192.168.123.2 (password: passw0rd)."
+echo "If you do that, you may run 'ssh-import-id' to import your ssh key."
+echo
+echo "Access the cobbler UI on http://192.168.123.2/cobbler_web"
+echo "and log in with 'cobbler:xcobbler'."
+
+## Give the server some time to start up.
+sleep 20
+echo
## populate the nodes into the cobbler server
-$ ./setup.py cobbler-setup
+./setup.py cobbler-setup
## * libvirt from the cobbler system:
## after 'cobbler-setup' above is done, the cobbler system will know about
@@ -52,7 +63,7 @@
## to forward tcp connections on 192.168.123.1:65001 to the libvirt unix
## socket . It restricts connections to zimmer's IP address.
-$ socat -d -d \
+socat -d -d \
TCP4-LISTEN:65001,bind=192.168.123.1,range=192.168.123.2/32,fork \
UNIX-CONNECT:/var/run/libvirt/libvirt-sock
=== modified file 'setup.py'
--- setup.py 2012-01-26 16:41:33 +0000
+++ setup.py 2012-01-27 19:52:03 +0000
@@ -1,12 +1,9 @@
#!/usr/bin/python
import yaml
-import Cheetah
import os
import re
import sys
-import copy
-import pprint
import libvirt
from Cheetah.Template import Template
import subprocess
@@ -49,7 +46,8 @@
return ret
def toLibVirtXml(self):
- return(Template(file=self.template, searchList=[self.dictInfo()]).respond())
+ template = Template(file=self.template, searchList=[self.dictInfo()])
+ return template.respond()
class Node(Domain):
def _setcfg(self, cfg, num):
@@ -71,7 +69,8 @@
self.mem = cfg['mem'] * 1024
def renderSysDom(config, syscfg, stype="node"):
- return(Template(file=syscfg['template'], searchList=[config, syscfg]).respond())
+ template = Template(file=syscfg['template'], searchList=[config, syscfg])
+ return template.respond()
# cobbler:
# ip: 2 # ip address must be in dhcp range
@@ -172,8 +171,7 @@
"""Get the system architecture for use in the cobbler setup profile."""
# This should, for any given system, match what the zimmer-build
# script does to determine the right architecture.
- arch_text = subprocess.check_output(
- ['/bin/uname', '-m'], stdout=subprocess.PIPE)
+ arch_text = subprocess.check_output(['/bin/uname', '-m'])
if re.match('i.86', arch_text):
return 'i386'
else:
@@ -186,12 +184,12 @@
profile = "precise-%s-juju" % arch
cob = System(config, "zimmer")
- server = xmlrpclib.Server("http://%s/cobbler_api" % cob.ipaddr)
+ cobbler_url = "http://%s/cobbler_api" % cob.ipaddr
+ print("Connecting to %s." % cobbler_url)
+ server = xmlrpclib.Server(cobbler_url)
token = server.login("cobbler","xcobbler")
- systems = [ ]
- for node in NODES_RANGE:
- systems.append(Node(config, node))
+ systems = [Node(config, node) for node in NODES_RANGE]
for system in systems:
cobbler_addsystem(server, token, system, profile, hostip)
@@ -201,17 +199,17 @@
cfg_file = "settings.cfg"
if len(sys.argv) == 1:
- print "Usage: setup.py action\n action one of: libvirt-setup, cobbler-setup"
+ print(
+ "Usage: setup.py action\n"
+ "action one of: libvirt-setup, cobbler-setup")
sys.exit(1)
config = yaml_loadf(cfg_file)
if sys.argv[1] == "libvirt-setup":
libvirt_setup(config)
- sys.exit(0)
elif sys.argv[1] == "cobbler-setup":
cobbler_setup(config)
- sys.exit(0)
if __name__ == '__main__':
main()
=== modified file 'zimmer-build/build'
--- zimmer-build/build 2012-01-26 17:08:39 +0000
+++ zimmer-build/build 2012-01-27 19:52:03 +0000
@@ -74,6 +74,34 @@
error "${@}"
}
+# Strip directory path or URL from image name, and ensure a suffix of ".zimg".
+# So /tmp/foo.img, http://foo.bar/downloads/foo.zimg, and foo all become
+# "foo.zimg".
+base_zimg_name() {
+ local BASE_NAME
+ BASE_NAME="${1##*/}"
+ BASE_NAME="${BASE_NAME%.img}"
+ echo "${BASE_NAME%.zimg}.zimg"
+}
+
+# Download image file.
+# Parameters: source URL, filename to save to, directory to save to.
+download_img() {
+ local SOURCE DESTINATION
+ SOURCE="$1"
+ DESTINATION="$2"
+
+ if test -f "$DESTINATION"
+ then
+ fail "please delete $DESTINATION first or use --zimg|--img"
+ fi
+
+ debug 0 "downloading $SOURCE to $DESTINATION"
+ wget --progress=dot:mega "$SOURCE" -O "$DESTINATION.partial" &&
+ mv -- "$DESTINATION.partial" "$DESTINATION" ||
+ fail "failed to get $SOURCE"
+}
+
short_opts="ho:v"
long_opts="help,ci-bzr:,img:,log:,ud-file:,verbose,zimg:"
getopt_out=$(getopt --name "${0##*/}" \
@@ -123,44 +151,33 @@
fail "failed to make tempdir"
trap cleanup EXIT
-[ -d "$save_d" ] || mkdir -p "$save_d" || fail "failed to mkdir $save_d"
+mkdir -p "$save_d" || fail "failed to mkdir $save_d"
if [ -n "$img" ]; then
# if img was given, then we assume good, its the backing image
[ -f "$img" ] || fail "$img (--img) is not a file"
debug 0 "using $img as uncompressed image"
else
- if [ -n "$zimg" ]; then
- case "$zimg" in
- http://*|https://*)
- o_zimg="${zimg}"
- zimg="${save_d}/${o_zimg##*/}"
- zimg=${zimg%.img}; zimg=${zimg%.zimg}.zimg
- [ -f "$zimg" ] &&
- fail "please delete $zimg first or use --zimg|--img"
- debug 0 "downloading $o_zimg to $zimg"
- wget "$o_zimg" -O "$zimg.partial" &&
- mv "$zimg.partial" "$zimg" || fail "failed to get $o_zimg"
- ;;
- file://*)
- o_zimg=${zimg}
- zimg=${zimg#file://}
- debug 0 "using file $o_zimg as zimg"
- [ -f "$zimg" ] || fail "$zimg is not a file"
- ;;
- *) [ -f "$zimg" ] || fail "$zimg is not a file"
- debug 0 "using file $o_zimg as zimg"
- ;;
- esac
- else
- zimg="${save_d}/${DEF_ZIMG##*/}"
- zimg=${zimg%.img}; zimg=${zimg%.zimg}.zimg
- [ -f "$zimg" ] &&
- fail "please delete $zimg first or use --zimg|--img"
- debug 0 "downloading $DEF_ZIMG to $zimg"
- wget "$DEF_ZIMG" -O "$zimg.partial" &&
- mv "$zimg.partial" "$zimg" || fail "failed to get $DEF_ZIMG"
- fi
+ if [ -z "$zimg" ]
+ then
+ zimg="$DEF_ZIMG"
+ fi
+ case "$zimg" in
+ http://*|https://*)
+ o_zimg="${zimg}"
+ zimg="${save_d}/`base_zimg_name ${zimg}`"
+ download_img "$o_zimg" "$zimg"
+ ;;
+ file://*)
+ o_zimg=${zimg}
+ zimg=${zimg#file://}
+ debug 0 "using file $o_zimg as zimg"
+ [ -f "$zimg" ] || fail "$zimg is not a file"
+ ;;
+ *) [ -f "$zimg" ] || fail "$zimg is not a file"
+ debug 0 "using file $o_zimg as zimg"
+ ;;
+ esac
img=${zimg%.zimg}.img
debug 0 "creating uncompressed img $img from $zimg"
qemu-img convert -O qcow2 "$zimg" "$img"
Follow ups