blob: b09007e4c9ef6662c6003a9cd0248db4aef5b143 [file] [log] [blame]
Jon Hall2c8959e2016-12-16 12:17:34 -08001# CASE1: Startup
2# CASE2: Load vpls topology and configurations from demo script
3# CASE3: Test CLI commands
4
5class VPLSBasic:
6 def __init__( self ):
7 self.default = ''
8
9 def CASE1( self, main ):
10 """
11 CASE1 is to compile ONOS and push it to the test machines
12
13 Startup sequence:
14 cell <name>
15 onos-verify-cell
16 NOTE: temporary - onos-remove-raft-logs
17 onos-uninstall
18 start mininet
19 git pull
20 mvn clean install
21 onos-package
22 onos-install -f
23 onos-wait-for-start
24 start cli sessions
25 start tcpdump
26 """
27 import imp
28 import time
29 import json
30 main.case( "Setting up test environment" )
31 main.caseExplanation = "Setup the test environment including " +\
32 "installing ONOS, starting Mininet and ONOS" +\
33 "cli sessions."
34
35 # load some variables from the params file
36 cellName = main.params[ 'ENV' ][ 'cellName' ]
37
38 main.numCtrls = int( main.params[ 'num_controllers' ] )
39
40 ofPort = main.params[ 'CTRL' ][ 'port' ]
41
42 main.CLIs = []
43 main.RESTs = []
44 main.nodes = []
45 ipList = []
46 for i in range( 1, main.numCtrls + 1 ):
47 try:
48 main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
49 main.RESTs.append( getattr( main, 'ONOSrest' + str( i ) ) )
50 main.nodes.append( getattr( main, 'ONOS' + str( i ) ) )
51 ipList.append( main.nodes[ -1 ].ip_address )
52 except AttributeError:
53 break
54
55 main.step( "Create cell file" )
56 cellAppString = main.params[ 'ENV' ][ 'cellApps' ]
57 main.ONOSbench.createCellFile( main.ONOSbench.ip_address, cellName,
58 main.Mininet1.ip_address,
59 cellAppString, ipList )
60 main.step( "Applying cell variable to environment" )
61 cellResult = main.ONOSbench.setCell( cellName )
62 verifyResult = main.ONOSbench.verifyCell()
63
64 main.log.info( "Uninstalling ONOS" )
65 for node in main.nodes:
66 main.ONOSbench.onosUninstall( node.ip_address )
67
68 # Make sure ONOS is DEAD
69 main.log.info( "Killing any ONOS processes" )
70 killResults = main.TRUE
71 for node in main.nodes:
72 killed = main.ONOSbench.onosKill( node.ip_address )
73 killResults = killResults and killed
74
75 cleanInstallResult = main.TRUE
76
77 main.step( "Starting Mininet" )
78 # scp topo file to mininet
79 # TODO: move to params?
80 topoName = "vpls"
81 topoFile = "vpls.py"
82 filePath = main.ONOSbench.home + "/tools/test/topos/"
83 main.ONOSbench.scp( main.Mininet1,
84 filePath + topoFile,
85 main.Mininet1.home,
86 direction="to" )
87 topo = " --custom " + main.Mininet1.home + topoFile + " --topo " + topoName
88 args = " --switch ovs,protocols=OpenFlow13 --controller=remote"
89 for node in main.nodes:
90 args += ",ip=" + node.ip_address
91 mnCmd = "sudo mn" + topo + args
92 mnResult = main.Mininet1.startNet( mnCmd=mnCmd )
93 utilities.assert_equals( expect=main.TRUE, actual=mnResult,
94 onpass="Mininet Started",
95 onfail="Error starting Mininet" )
96
97 main.ONOSbench.getVersion( report=True )
98
99 main.step( "Creating ONOS package" )
100 packageResult = main.ONOSbench.buckBuild()
101 utilities.assert_equals( expect=main.TRUE, actual=packageResult,
102 onpass="ONOS package successful",
103 onfail="ONOS package failed" )
104
105 main.step( "Installing ONOS package" )
106 onosInstallResult = main.TRUE
107 for node in main.nodes:
108 tmpResult = main.ONOSbench.onosInstall( options="-f",
109 node=node.ip_address )
110 onosInstallResult = onosInstallResult and tmpResult
111 utilities.assert_equals( expect=main.TRUE, actual=onosInstallResult,
112 onpass="ONOS install successful",
113 onfail="ONOS install failed" )
114
115 main.step( "Checking if ONOS is up yet" )
116 for i in range( 2 ):
117 onosIsupResult = main.TRUE
118 for node in main.nodes:
119 started = main.ONOSbench.isup( node.ip_address )
120 if not started:
121 main.log.error( node.name + " hasn't started" )
122 onosIsupResult = onosIsupResult and started
123 if onosIsupResult == main.TRUE:
124 break
125 utilities.assert_equals( expect=main.TRUE, actual=onosIsupResult,
126 onpass="ONOS startup successful",
127 onfail="ONOS startup failed" )
128
129 main.step( "Set up ONOS secure SSH" )
130 secureSshResult = main.TRUE
131 for node in main.nodes:
132 secureSshResult = secureSshResult and main.ONOSbench.onosSecureSSH( node=node.ip_address )
133 utilities.assert_equals( expect=main.TRUE, actual=secureSshResult,
134 onpass="Test step PASS",
135 onfail="Test step FAIL" )
136
137 main.step( "Starting ONOS CLI sessions" )
138 cliResults = main.TRUE
139 threads = []
140 for i in range( main.numCtrls ):
141 t = main.Thread( target=main.CLIs[i].startOnosCli,
142 name="startOnosCli-" + str( i ),
143 args=[main.nodes[i].ip_address] )
144 threads.append( t )
145 t.start()
146
147 for t in threads:
148 t.join()
149 cliResults = cliResults and t.result
150 utilities.assert_equals( expect=main.TRUE, actual=cliResults,
151 onpass="ONOS cli startup successful",
152 onfail="ONOS cli startup failed" )
153
154 main.activeNodes = [ i for i in range( 0, len( main.CLIs ) ) ]
155
156 main.step( "Activate apps defined in the params file" )
157 # get data from the params
158 apps = main.params.get( 'apps' )
159 if apps:
160 apps = apps.split(',')
161 main.log.warn( apps )
162 activateResult = True
163 for app in apps:
164 main.CLIs[ 0 ].app( app, "Activate" )
165 # TODO: check this worked
166 time.sleep( SLEEP ) # wait for apps to activate
167 for app in apps:
168 state = main.CLIs[ 0 ].appStatus( app )
169 if state == "ACTIVE":
170 activateResult = activeResult and True
171 else:
172 main.log.error( "{} is in {} state".format( app, state ) )
173 activeResult = False
174 utilities.assert_equals( expect=True,
175 actual=activateResult,
176 onpass="Successfully activated apps",
177 onfail="Failed to activate apps" )
178 else:
179 main.log.warn( "No apps were specified to be loaded after startup" )
180
181 main.step( "Set ONOS configurations" )
182 config = main.params.get( 'ONOS_Configuration' )
183 if config:
184 main.log.debug( config )
185 checkResult = main.TRUE
186 for component in config:
187 for setting in config[component]:
188 value = config[component][setting]
189 check = main.CLIs[ 0 ].setCfg( component, setting, value )
190 main.log.info( "Value was changed? {}".format( main.TRUE == check ) )
191 checkResult = check and checkResult
192 utilities.assert_equals( expect=main.TRUE,
193 actual=checkResult,
194 onpass="Successfully set config",
195 onfail="Failed to set config" )
196 else:
197 main.log.warn( "No configurations were specified to be changed after startup" )
198
199 main.step( "App Ids check" )
200 appCheck = main.TRUE
201 threads = []
202 for i in main.activeNodes:
203 t = main.Thread( target=main.CLIs[i].appToIDCheck,
204 name="appToIDCheck-" + str( i ),
205 args=[] )
206 threads.append( t )
207 t.start()
208
209 for t in threads:
210 t.join()
211 appCheck = appCheck and t.result
212 if appCheck != main.TRUE:
213 main.log.warn( main.CLIs[0].apps() )
214 main.log.warn( main.CLIs[0].appIDs() )
215 utilities.assert_equals( expect=main.TRUE, actual=appCheck,
216 onpass="App Ids seem to be correct",
217 onfail="Something is wrong with app Ids" )
218
219 def CASE2( self, main ):
220 """
221 Load and test vpls configurations from json configuration file
222 """
223 import os.path
224 from tests.USECASE.VPLS.dependencies import vpls
225
226 pprint = main.ONOSrest1.pprint
227 hosts = int( main.params['vpls']['hosts'] )
228 SLEEP = int( main.params['SLEEP']['netcfg'] )
229
230 main.step( "Discover hosts using pings" )
231 for i in range( 1, hosts + 1 ):
232 src = "h" + str( i )
233 for j in range( 1, hosts + 1 ):
234 if j == i:
235 continue
236 dst = "h" + str( j )
237 pingResult = main.Mininet1.pingHost( SRC=src, TARGET=dst )
238
239 main.step( "Load VPLS configurations" )
240 # TODO: load from params
241 fileName = main.params['DEPENDENCY']['topology']
242 app = main.params['vpls']['name']
243 # TODO make this a function?
244 main.ONOSbench.handle.sendline( "onos-netcfg $OC1 " + fileName )
245 # Time for netcfg to load data
246 time.sleep( SLEEP )
247 # 'Master' copy of test configuration
248 try:
249 with open( os.path.expanduser( fileName ) ) as dataFile:
250 originalCfg = json.load( dataFile )
251 main.vplsConfig = originalCfg['apps'].get( app ).get( 'vpls' ).get( 'vplsList')
252 except Exception as e:
253 main.log.error( "Error loading config file: {}".format( e ) )
254 if main.vplsConfig:
255 result = True
256 else:
257 result = False
258 utilities.assert_equals( expect=True,
259 actual=result,
260 onpass="Loaded vpls configuration",
261 onfail="Failed to load vpls configuration" )
262
263 main.step( "Check interface configurations" )
264 result = False
265 getPorts = main.ONOSrest1.getNetCfg( subjectClass="ports" )
266 onosCfg = pprint( getPorts )
267 sentCfg = pprint( originalCfg.get( "ports" ) )
268
269 if onosCfg == sentCfg:
270 main.log.info( "ONOS interfaces NetCfg matches what was sent" )
271 result = True
272 else:
273 main.log.error( "ONOS interfaces NetCfg doesn't match what was sent" )
274 main.log.debug( "ONOS config: {}".format( onosCfg ) )
275 main.log.debug( "Sent config: {}".format( sentCfg ) )
276 utilities.assert_equals( expect=True,
277 actual=result,
278 onpass="Net Cfg added for interfaces",
279 onfail="Net Cfg not added for interfaces" )
280
281 # Run a bunch of checks to verify functionality based on configs
282 vpls.verify( main )
283
284 def CASE3( self, main ):
285 """
286 Test VPLS cli commands
287 High level steps:
288 remove interface from a network
289 Clean configs
290 create vpls network
291 add interfaces to a network
292 add encap
293 change encap
294 remove encap
295 list?
296 """
297 from tests.USECASE.VPLS.dependencies import vpls
298 SLEEP = int( main.params['SLEEP']['netcfg'] )
299 pprint = main.ONOSrest1.pprint
300
301 main.step( "Remove an interface from a vpls network" )
302 main.CLIs[0].vplsRemIface( 'VPLS1', 'h1' )
303 time.sleep( SLEEP )
304 #update master config json
305 for network in main.vplsConfig:
306 if network.get( 'name' ) == 'VPLS1':
307 ifaces = network.get( 'interfaces' )
308 ifaces.remove('h1')
309 vpls.verify( main )
310
311 main.step( "Clean all vpls configurations" )
312 main.CLIs[0].vplsClean()
313 time.sleep( SLEEP )
314 main.vplsConfig = []
315 vpls.verify( main )
316
317 main.step( "Create a new vpls network" )
318 name = "Network1"
319 main.CLIs[0].vplsCreate( name )
320 time.sleep( SLEEP )
321 network1 = { 'name': name, 'interfaces': [], 'encapsulation': 'NONE' }
322 main.vplsConfig.append( network1 )
323 vpls.verify( main )
324
325 main.step( "Add interfaces to the network" )
326 main.CLIs[0].vplsAddIface( name, "h1" )
327 main.CLIs[0].vplsAddIface( name, "h5" )
328 main.CLIs[0].vplsAddIface( name, "h4" )
329 time.sleep( SLEEP )
330 for network in main.vplsConfig:
331 if network.get( 'name' ) == name:
332 ifaces = network.get( 'interfaces' )
333 ifaces.append( 'h1' )
334 ifaces.append( 'h4' )
335 ifaces.append( 'h5' )
336 network[ 'interfaces' ] = ifaces
337 vpls.verify( main )
338
339 main.step( "Add MPLS encapsulation to a vpls network" )
340 encapType = "MPLS"
341 main.CLIs[0].vplsSetEncap( name, encapType )
342 for network in main.vplsConfig:
343 if network.get( 'name' ) == name:
344 network['encapsulation'] = encapType
345 time.sleep( SLEEP )
346 vpls.verify( main )
347
348 main.step( "Change an encapsulation type" )
349 encapType = "VLAN"
350 main.CLIs[0].vplsSetEncap( name, encapType )
351 for network in main.vplsConfig:
352 if network.get( 'name' ) == name:
353 network['encapsulation'] = encapType
354 time.sleep( SLEEP )
355 vpls.verify( main )
356
357 main.step( "Remove encapsulation" )
358 encapType = "NONE"
359 main.CLIs[0].vplsSetEncap( name, encapType )
360 for network in main.vplsConfig:
361 if network.get( 'name' ) == name:
362 network['encapsulation'] = encapType
363 time.sleep( SLEEP )
364 vpls.verify( main )
365
366 main.step( "Clean all vpls configurations" )
367 main.CLIs[0].vplsClean()
368 time.sleep( SLEEP )
369 main.vplsConfig = []
370 vpls.verify( main )