blob: 7249c653a553b5e56147e3c5c4e0cafdc485d162 [file] [log] [blame]
Jonathan Harte22a5c82015-07-14 14:36:27 -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
Jonathan Hart0f42b262015-07-14 18:49:46 -070012path = os.path.join( '/home', 'admin' )
Jonathan Harte22a5c82015-07-14 14:36:27 -070013path = 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
Jonathan Hart91600472015-07-14 15:08:45 -070023def install( vm, scriptFileName='install-base.sh', prompt=Prompt ):
Jonathan Harte22a5c82015-07-14 14:36:27 -070024 # start with sendline
25 #TODO consider resizing the HDD
Jonathan Hart91600472015-07-14 15:08:45 -070026 url = 'https://gerrit.onosproject.org/gitweb?p=onos-vm.git;a=blob_plain;hb=refs/heads/onos-tutorial-1.1;f=%s' % scriptFileName
27 vm.sendline( ' wget -O %s "%s" | bash' % (scriptFileName, url) ) # space prefix is used to avoid entry in history
Jonathan Harte22a5c82015-07-14 14:36:27 -070028 vm.expect( prompt, timeout=20 )
Jonathan Hart91600472015-07-14 15:08:45 -070029 vm.sendline( 'bash %s' % scriptFileName )
Jonathan Harte22a5c82015-07-14 14:36:27 -070030 vm.expect( prompt, timeout=3600 )
31
32
33def vmdk2size( vmdk ):
34 "Return virtual disk size (in bytes) of vmdk image"
35 output = check_output( [ 'file', vmdk ] )
36 assert 'disk image' in output
37 return os.stat( vmdk )[ ST_SIZE ]
38
Jonathan Hartec79fc72015-07-14 16:41:29 -070039def buildOnosVm( image, out, scriptFileName, vmname='ONOS', vminfo='ONOS VM',
Jonathan Hartbcda3e62015-07-14 18:51:54 -070040 flavor='utopic64server', installMemory=4096, cpuCores=4, ovfMemory=4096 ):
Jonathan Harte22a5c82015-07-14 14:36:27 -070041
Jonathan Hartbcda3e62015-07-14 18:51:54 -070042 bootAndRun( image, runFunction=install, scriptFileName=scriptFileName, memory=installMemory, cpuCores=cpuCores, outputFile=out )
Jonathan Harte22a5c82015-07-14 14:36:27 -070043
44 size = vmdk2size( out + '.vmdk' ) # get vmdk size
45 ovfname = out
46 osname, osid = OVFOSNameID( flavor )
47 print osname, osid
48
49 ovf = generateOVF( name=ovfname, osname=osname, osid=osid,
50 diskname=out+'.vmdk', disksize=size, mem=ovfMemory, cpus=2,
Jonathan Hartec79fc72015-07-14 16:41:29 -070051 vmname=vmname, vminfo=vminfo )
Jonathan Harte22a5c82015-07-14 14:36:27 -070052 log( '* Generated OVF descriptor file', ovf )
53
54if __name__ == '__main__':
Jonathan Hartec79fc72015-07-14 16:41:29 -070055 parser = argparse.ArgumentParser( description='ONOS VM build script' )
Jonathan Harte22a5c82015-07-14 14:36:27 -070056 parser.add_argument( '-i', '--image', metavar='image', required=True,
57 help='Build from an existing VM image' )
Jonathan Hart8296edb2015-07-14 15:22:39 -070058 parser.add_argument( '-f', '--flavor', default='trusty64server', required=True,
Jonathan Harte22a5c82015-07-14 14:36:27 -070059 help='VM flavor to build (e.g. trusty64server)' )
60 parser.add_argument( 'scripts', nargs='*',
61 help='VM flavor(s) to build (e.g. trusty64server)' )
62 parser.add_argument( '-z', '--zip', action='store_true',
63 help='archive .ovf and .vmdk into .zip file' )
64 parser.add_argument( '-o', '--out', required=True,
65 help='output file for test image (vmdk)' )
Jonathan Hart91600472015-07-14 15:08:45 -070066 parser.add_argument( '-s', '--script', required=True,
67 help='Install script filename' )
Jonathan Hartec79fc72015-07-14 16:41:29 -070068 parser.add_argument( '--vmname', default='ONOS',
69 help='Name of the generated VM image')
70 parser.add_argument( '--vminfo', default='ONOS VM',
71 help='Short description of the VM')
Jonathan Harte22a5c82015-07-14 14:36:27 -070072 args = parser.parse_args()
73
74 print args
75
Jonathan Hartec79fc72015-07-14 16:41:29 -070076 buildOnosVm( args.image, args.out, args.script, vmname=args.vmname, vminfo=args.vminfo, flavor=args.flavor)
Jonathan Harte22a5c82015-07-14 14:36:27 -070077
78 if args.zip:
79 log( '* Generating .zip file' )
80 run( 'zip %s-ovf.zip %s %s' % ( args.out, args.out + '.ovf', args.out + '.vmdk' ) )