| #!/usr/bin/python |
| |
| import os |
| import sys |
| import re |
| import argparse |
| from stat import ST_MODE, ST_SIZE |
| from subprocess import check_output |
| |
| # Add the Mininet build script directory to the path, so we can import it |
| #TODO do a better job finding Mininet |
| path = os.path.join( '/', 'mininet', 'mininet','util', 'vm' ) |
| path = os.path.expanduser( path ) |
| if os.path.isdir( path ): |
| sys.path.append( path ) |
| else: |
| print 'Cannot find Mininet build script. Exiting...' |
| sys.exit( 1 ) |
| |
| # Import required functions from the Mininet build script |
| from build import bootAndRun, Prompt, OVFOSNameID, generateOVF, log, build, run |
| |
| def installONOS( vm, prompt=Prompt ): |
| # start with sendline |
| #TODO consider resizing the HDD |
| url = 'https://gerrit.onlab.us/gitweb?p=ONOS-VM.git;a=blob_plain;hb=refs/heads/onos-tutorial;f=vm-setup.sh' |
| vm.sendline( ' wget -O vm-setup.sh "%s" | bash' % url ) # space prefix is used to avoid entry in history |
| vm.expect( prompt, timeout=20 ) |
| vm.sendline( 'bash vm-setup.sh' ) |
| # end with expect prompt |
| vm.expect( prompt, timeout=1200 ) |
| |
| vm.spawn( 'git clone https://gerrit.onlab.us/onos-next/' ) |
| vm.expect("Username for 'https://gerrit.onlab.us':", timeout=30) |
| vm.sendline('vm') |
| vm.expect("Password for 'https://vm@gerrit.onlab.us':", timeout=30) |
| vm.sendline('lAEi5gM/iFF3') |
| |
| vm.expect( prompt, timeout=1200 ) |
| |
| vm.sendline('ssh 127.0.0.1') |
| vm.expect('.*connecting (yes/no)?') |
| vm.sendline('yes') |
| vm.sendline('exit') |
| |
| vm.expect( prompt, timeout=1200 ) |
| |
| url = 'https://gerrit.onlab.us/gitweb?p=ONOS-VM.git;a=blob_plain;hb=refs/heads/onos-tutorial;f=onos-setup.sh' |
| vm.sendline( ' wget -O onos-setup.sh "%s" | bash' % url ) # space prefix is used to avoid entry in history |
| vm.expect( prompt, timeout=20 ) |
| vm.sendline( 'bash onos-setup.sh' ) |
| |
| |
| |
| def vmdk2size( vmdk ): |
| "Return virtual disk size (in bytes) of vmdk image" |
| output = check_output( [ 'file', vmdk ] ) |
| assert 'disk image' in output |
| return os.stat( vmdk )[ ST_SIZE ] |
| |
| def buildONOS( image, out, flavor='trusty64server', installMemory=1024, ovfMemory=1024 ): |
| if not image: |
| # build VM from flavor |
| #build( flavor ) |
| pass |
| |
| bootAndRun( image, runFunction=installONOS, memory=installMemory, outputFile=out ) |
| |
| size = vmdk2size( out + '.vmdk' ) # get vmdk size |
| ovfname = out |
| osname, osid = OVFOSNameID( flavor ) |
| print osname, osid |
| |
| ovf = generateOVF( name=ovfname, osname=osname, osid=osid, |
| diskname=out+'.vmdk', disksize=size, mem=ovfMemory, cpus=1, |
| vmname='Mininet-Tutorial', vminfo='Mininet Tutorial VM' ) |
| log( '* Generated OVF descriptor file', ovf ) |
| |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser( description='Mininet Tutorial VM build script' ) |
| parser.add_argument( '-i', '--image', metavar='image', required=True, |
| help='Build from an existing VM image' ) |
| parser.add_argument( '-f', '--flavor', default='trusty64server', |
| help='VM flavor to build (e.g. trusty64server)' ) |
| parser.add_argument( 'scripts', nargs='*', |
| help='VM flavor(s) to build (e.g. trusty64server)' ) |
| parser.add_argument( '-z', '--zip', action='store_true', |
| help='archive .ovf and .vmdk into .zip file' ) |
| parser.add_argument( '-o', '--out', required=True, |
| help='output file for test image (vmdk)' ) |
| args = parser.parse_args() |
| |
| print args |
| |
| buildONOS( args.image, args.out ) |
| |
| if args.zip: |
| log( '* Generating .zip file' ) |
| run( 'zip %s-ovf.zip %s %s' % ( args.out, args.out + '.ovf', args.out + '.vmdk' ) ) |