blob: 84ce363319442bce6b06ab9362dfb6c45018804f [file] [log] [blame]
Brian O'Connor37f0cc72014-06-06 20:03:05 -07001#!/usr/bin/python
2
3import os
4import sys
5import re
6import argparse
7from stat import ST_MODE, ST_SIZE
8from subprocess import check_output
9
10# Add the Mininet build script directory to the path, so we can import it
11#TODO do a better job finding Mininet
12path = os.path.join( '~', 'mininet', 'util', 'vm' )
13path = os.path.expanduser( path )
14if os.path.isdir( path ):
15 sys.path.append( path )
16else:
17 print 'Cannot find Mininet build script. Exiting...'
18 sys.exit( 1 )
19
20# Import required functions from the Mininet build script
21from build import bootAndRun, Prompt, OVFOSNameID, generateOVF, log, build, run
22
23def installONOS( vm, prompt=Prompt ):
24 # start with sendline
25 #TODO consider resizing the HDD
26 url = 'https://gerrit.onlab.us/gitweb?p=ONOS-VM.git;a=blob_plain;hb=refs/heads/master;f=vm-setup.sh'
Brian O'Connorb11b8382014-06-06 21:03:30 -070027 vm.sendline( 'wget -O - "%s" | bash' % url )
Brian O'Connor37f0cc72014-06-06 20:03:05 -070028 # end with expect prompt
29 vm.expect( prompt )
30
31def vmdk2size( vmdk ):
32 "Return virtual disk size (in bytes) of vmdk image"
33 output = check_output( [ 'file', vmdk ] )
34 assert 'disk image' in output
35 return os.stat( vmdk )[ ST_SIZE ]
36
37def buildONOS( image, out, flavor='raring64server', installMemory=1024, ovfMemory=2048 ):
38 if not image:
39 # build VM from flavor
40 #build( flavor )
41 pass
42
43 bootAndRun( image, runFunction=installONOS, memory=installMemory, outputFile=out )
44
45 size = vmdk2size( out + '.vmdk' ) # get vmdk size
46 ovfname = out
47 osname, osid = OVFOSNameID( flavor )
48 print osname, osid
49
50 ovf = generateOVF( name=ovfname, osname=osname, osid=osid,
51 diskname=out+'.vmdk', disksize=size, mem=2048, cpus=4,
52 vmname='ONOS-VM', vminfo='An ONOS VM' )
53 log( '* Generated OVF descriptor file', ovf )
54
55if __name__ == '__main__':
56 parser = argparse.ArgumentParser( description='ONOS VM build script' )
57 parser.add_argument( '-i', '--image', metavar='image', required=True,
58 help='Build from an existing VM image' )
59 parser.add_argument( '-f', '--flavor', default='raring64server',
60 help='VM flavor to build (e.g. raring64server)' )
61 parser.add_argument( 'scripts', nargs='*',
62 help='VM flavor(s) to build (e.g. raring64server)' )
63 parser.add_argument( '-z', '--zip', action='store_true',
64 help='archive .ovf and .vmdk into .zip file' )
65 parser.add_argument( '-o', '--out', required=True,
66 help='output file for test image (vmdk)' )
67 args = parser.parse_args()
68
69 print args
70
71 buildONOS( args.image, args.out )
72
73 if args.zip:
74 log( '* Generating .zip file' )
75 run( 'zip %s-ovf.zip %s %s' % ( args.out, args.out + '.ovf', args.out + '.vmdk' ) )