blob: 00d9b31655d5a4902d672797d5edeab70f0348d6 [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
alshabib9a044c12014-11-17 10:36:36 -080012path = os.path.join( '/home', 'mininet', 'mininet','util', 'vm' )
Brian O'Connor37f0cc72014-06-06 20:03:05 -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
23def installONOS( vm, prompt=Prompt ):
alshabib22fd2312014-11-18 18:33:34 -080024 return
Brian O'Connor37f0cc72014-06-06 20:03:05 -070025 # start with sendline
26 #TODO consider resizing the HDD
alshabib858bbcc2014-11-17 10:55:56 -080027 url = 'https://gerrit.onosproject.org/gitweb?p=ONOS-VM.git;a=blob_plain;hb=refs/heads/onos-tutorial;f=vm-setup.sh'
Brian O'Connor4c074f42014-08-12 13:39:34 -070028 vm.sendline( ' wget -O vm-setup.sh "%s" | bash' % url ) # space prefix is used to avoid entry in history
Brian O'Connor5b18ef52014-08-05 02:25:53 -070029 vm.expect( prompt, timeout=20 )
30 vm.sendline( 'bash vm-setup.sh' )
Brian O'Connor10d941e2014-06-12 19:55:09 -070031 vm.expect( prompt, timeout=1200 )
Brian O'Connor37f0cc72014-06-06 20:03:05 -070032
alshabib3a13cfb2014-11-17 19:23:04 -080033
34 vm.sendline('sudo su - tutorial1')
35 vm.expect(prompt, timeout=20)
alshabib858bbcc2014-11-17 10:55:56 -080036 vm.sendline( 'git clone https://gerrit.onosproject.org/onos-next/' )
37 vm.expect("Username for 'https://gerrit.onosproject.org':", timeout=30)
alshabibbca6bf22014-11-15 16:38:45 -080038 vm.sendline('vm')
alshabib858bbcc2014-11-17 10:55:56 -080039 vm.expect("Password for 'https://vm@gerrit.onosproject.org':", timeout=30)
alshabib0dd4f392014-11-17 10:46:39 -080040 vm.sendline(os.environ['ONOSPASSWORD'])
alshabibbca6bf22014-11-15 16:38:45 -080041
42 vm.expect( prompt, timeout=1200 )
alshabibff061ee2014-11-17 15:57:10 -080043
44
alshabibbca6bf22014-11-15 16:38:45 -080045 vm.sendline('ssh 127.0.0.1')
46 vm.expect('.*connecting (yes/no)?')
47 vm.sendline('yes')
alshabibf86bfb32014-11-17 22:30:26 -080048 vm.expect(prompt, timeout=30)
alshabibbca6bf22014-11-15 16:38:45 -080049 vm.sendline('exit')
50
51 vm.expect( prompt, timeout=1200 )
alshabibcc130252014-11-17 10:19:35 -080052
alshabib858bbcc2014-11-17 10:55:56 -080053 url = 'https://gerrit.onosproject.org/gitweb?p=ONOS-VM.git;a=blob_plain;hb=refs/heads/onos-tutorial;f=onos-setup.sh'
alshabibcc130252014-11-17 10:19:35 -080054 vm.sendline( ' wget -O onos-setup.sh "%s" | bash' % url ) # space prefix is used to avoid entry in history
55 vm.expect( prompt, timeout=20 )
alshabibbca6bf22014-11-15 16:38:45 -080056 vm.sendline( 'bash onos-setup.sh' )
alshabib411144e2014-11-18 10:56:15 -080057 vm.expect(prompt, timeout=1200)
alshabibaa2b1622014-11-18 16:40:14 -080058
alshabib22fd2312014-11-18 18:33:34 -080059
alshabibbca6bf22014-11-15 16:38:45 -080060
Brian O'Connor37f0cc72014-06-06 20:03:05 -070061def vmdk2size( vmdk ):
62 "Return virtual disk size (in bytes) of vmdk image"
63 output = check_output( [ 'file', vmdk ] )
64 assert 'disk image' in output
65 return os.stat( vmdk )[ ST_SIZE ]
66
alshabibda71cc92014-11-18 16:39:41 -080067def buildONOS( image, out, flavor='trusty64server', installMemory=2048, ovfMemory=2048 ):
Brian O'Connor37f0cc72014-06-06 20:03:05 -070068 if not image:
69 # build VM from flavor
70 #build( flavor )
71 pass
72
73 bootAndRun( image, runFunction=installONOS, memory=installMemory, outputFile=out )
74
75 size = vmdk2size( out + '.vmdk' ) # get vmdk size
76 ovfname = out
77 osname, osid = OVFOSNameID( flavor )
78 print osname, osid
79
80 ovf = generateOVF( name=ovfname, osname=osname, osid=osid,
Brian O'Connor3ca84022014-08-11 19:46:54 -070081 diskname=out+'.vmdk', disksize=size, mem=ovfMemory, cpus=1,
82 vmname='Mininet-Tutorial', vminfo='Mininet Tutorial VM' )
Brian O'Connor37f0cc72014-06-06 20:03:05 -070083 log( '* Generated OVF descriptor file', ovf )
84
85if __name__ == '__main__':
Brian O'Connor3ca84022014-08-11 19:46:54 -070086 parser = argparse.ArgumentParser( description='Mininet Tutorial VM build script' )
Brian O'Connor37f0cc72014-06-06 20:03:05 -070087 parser.add_argument( '-i', '--image', metavar='image', required=True,
88 help='Build from an existing VM image' )
Brian O'Connor3ca84022014-08-11 19:46:54 -070089 parser.add_argument( '-f', '--flavor', default='trusty64server',
90 help='VM flavor to build (e.g. trusty64server)' )
Brian O'Connor37f0cc72014-06-06 20:03:05 -070091 parser.add_argument( 'scripts', nargs='*',
Brian O'Connor3ca84022014-08-11 19:46:54 -070092 help='VM flavor(s) to build (e.g. trusty64server)' )
Brian O'Connor37f0cc72014-06-06 20:03:05 -070093 parser.add_argument( '-z', '--zip', action='store_true',
94 help='archive .ovf and .vmdk into .zip file' )
95 parser.add_argument( '-o', '--out', required=True,
96 help='output file for test image (vmdk)' )
97 args = parser.parse_args()
98
99 print args
100
101 buildONOS( args.image, args.out )
102
103 if args.zip:
104 log( '* Generating .zip file' )
105 run( 'zip %s-ovf.zip %s %s' % ( args.out, args.out + '.ovf', args.out + '.vmdk' ) )