diff --git a/util/vm/build.py b/util/vm/build.py index 4cd257f2e0a4abd16ac30957589a5ada4da6452e..b874e05a763e2c0eb34bcb81cea665e601092b66 100755 --- a/util/vm/build.py +++ b/util/vm/build.py @@ -35,6 +35,7 @@ from subprocess import check_output, call, Popen from tempfile import mkdtemp from time import time, strftime, localtime +from lxml import etree import argparse pexpect = None # For code check - imported dynamically @@ -47,10 +48,10 @@ isoURLs = { 'precise32server': 'http://mirrors.kernel.org/ubuntu-releases/12.04/' - 'ubuntu-12.04-server-i386.iso', + 'ubuntu-12.04.3-server-i386.iso', 'precise64server': 'http://mirrors.kernel.org/ubuntu-releases/12.04/' - 'ubuntu-12.04-server-amd64.iso', + 'ubuntu-12.04.3-server-amd64.iso', 'quetzal32server': 'http://mirrors.kernel.org/ubuntu-releases/12.10/' 'ubuntu-12.10-server-i386.iso', @@ -125,6 +126,9 @@ def findiso( flavor ): if not path.exists( iso ) or ( stat( iso )[ ST_MODE ] & 0777 != 0444 ): log( '* Retrieving', url ) run( 'curl -C - -o %s %s' % ( iso, url ) ) + if 'ISO' not in run( 'file ' + iso ): + os.remove( iso ) + raise Exception( 'findiso: could not download iso from ' + url ) # Write-protect iso, signaling it is complete log( '* Write-protecting iso', iso) os.chmod( iso, 0444 ) @@ -310,7 +314,6 @@ def installUbuntu( iso, image, logfilename='install.log' ): # Mount iso so we can use its kernel mnt = mkdtemp() srun( 'mount %s %s' % ( iso, mnt ) ) - srun( 'ls ' + mnt ) kernel = path.join( mnt, 'install/vmlinuz' ) initrd = path.join( mnt, 'install/initrd.gz' ) cmd = [ 'sudo', kvm, @@ -450,6 +453,47 @@ def convert( cow, basename ): return vmdk +# Template for virt-image(5) file + +VirtImageXML = """ +<?xml version="1.0" encoding="UTF-8"?> +<image> + <name>%s</name> + <domain> + <boot type="hvm"> + <guest> + <arch>%s/arch> + </guest> + <os> + <loader dev="hd"/> + </os> + <drive disk="root.raw" target="hda"/> + </boot> + <devices> + <vcpu>1</vcpu> + <memory>%s</memory> + <interface/> + <graphics/> + </devices> + </domain> + <storage> + <disk file="%s" size="%s" format="vmdk"/> + </storage> +</image> +""" + +def genVirtImage( name, mem, diskname, disksize ): + "Generate and return virt-image file name.xml" + # Our strategy is going to be: create a + # virt-image file and then use virt-convert to convert + # it to an .ovf file + xmlfile = name + '.xml' + xmltext = VirtImageXML % ( name, mem, diskname, disksize ) + with open( xmlfile, 'w+' ) as f: + f.write( xmltext ) + return xmlfile + + def build( flavor='raring32server' ): "Build a Mininet VM" start = time()