blob: 4b4c1efdafb424909ef6ee042ed50dfb341a5839 [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
Jon Halled258232017-05-24 17:30:18 -07005
Jon Hall2c8959e2016-12-16 12:17:34 -08006class VPLSBasic:
Jon Halled258232017-05-24 17:30:18 -07007
Jon Hall2c8959e2016-12-16 12:17:34 -08008 def __init__( self ):
9 self.default = ''
10
11 def CASE1( self, main ):
12 """
13 CASE1 is to compile ONOS and push it to the test machines
14
15 Startup sequence:
16 cell <name>
17 onos-verify-cell
18 NOTE: temporary - onos-remove-raft-logs
19 onos-uninstall
20 start mininet
21 git pull
22 mvn clean install
23 onos-package
24 onos-install -f
25 onos-wait-for-start
26 start cli sessions
27 start tcpdump
28 """
29 import imp
30 import time
31 import json
32 main.case( "Setting up test environment" )
33 main.caseExplanation = "Setup the test environment including " +\
34 "installing ONOS, starting Mininet and ONOS" +\
35 "cli sessions."
36
37 # load some variables from the params file
38 cellName = main.params[ 'ENV' ][ 'cellName' ]
39
40 main.numCtrls = int( main.params[ 'num_controllers' ] )
41
42 ofPort = main.params[ 'CTRL' ][ 'port' ]
43
44 main.CLIs = []
45 main.RESTs = []
46 main.nodes = []
47 ipList = []
48 for i in range( 1, main.numCtrls + 1 ):
49 try:
50 main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
51 main.RESTs.append( getattr( main, 'ONOSrest' + str( i ) ) )
52 main.nodes.append( getattr( main, 'ONOS' + str( i ) ) )
53 ipList.append( main.nodes[ -1 ].ip_address )
54 except AttributeError:
55 break
56
57 main.step( "Create cell file" )
58 cellAppString = main.params[ 'ENV' ][ 'cellApps' ]
59 main.ONOSbench.createCellFile( main.ONOSbench.ip_address, cellName,
60 main.Mininet1.ip_address,
Devin Limdc78e202017-06-09 18:30:07 -070061 cellAppString, ipList, main.ONOScli1.karafUser )
Jon Hall2c8959e2016-12-16 12:17:34 -080062 main.step( "Applying cell variable to environment" )
63 cellResult = main.ONOSbench.setCell( cellName )
64 verifyResult = main.ONOSbench.verifyCell()
65
66 main.log.info( "Uninstalling ONOS" )
67 for node in main.nodes:
68 main.ONOSbench.onosUninstall( node.ip_address )
69
70 # Make sure ONOS is DEAD
71 main.log.info( "Killing any ONOS processes" )
72 killResults = main.TRUE
73 for node in main.nodes:
74 killed = main.ONOSbench.onosKill( node.ip_address )
75 killResults = killResults and killed
76
Jon Hall2c8959e2016-12-16 12:17:34 -080077 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
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -070088 args = " --switch ovs,protocols=OpenFlow13"
Jon Hall2c8959e2016-12-16 12:17:34 -080089 for node in main.nodes:
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -070090 args += " --controller=remote,ip=" + node.ip_address
Jon Hall2c8959e2016-12-16 12:17:34 -080091 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
You Wangf5de25b2017-01-06 15:13:01 -0800115 main.step( "Set up ONOS secure SSH" )
116 secureSshResult = main.TRUE
117 for node in main.nodes:
118 secureSshResult = secureSshResult and main.ONOSbench.onosSecureSSH( node=node.ip_address )
119 utilities.assert_equals( expect=main.TRUE, actual=secureSshResult,
120 onpass="Test step PASS",
121 onfail="Test step FAIL" )
122
Jon Hall2c8959e2016-12-16 12:17:34 -0800123 main.step( "Checking if ONOS is up yet" )
124 for i in range( 2 ):
125 onosIsupResult = main.TRUE
126 for node in main.nodes:
127 started = main.ONOSbench.isup( node.ip_address )
128 if not started:
129 main.log.error( node.name + " hasn't started" )
130 onosIsupResult = onosIsupResult and started
131 if onosIsupResult == main.TRUE:
132 break
133 utilities.assert_equals( expect=main.TRUE, actual=onosIsupResult,
134 onpass="ONOS startup successful",
135 onfail="ONOS startup failed" )
136
Jon Hall2c8959e2016-12-16 12:17:34 -0800137 main.step( "Starting ONOS CLI sessions" )
138 cliResults = main.TRUE
139 threads = []
140 for i in range( main.numCtrls ):
Jon Halled258232017-05-24 17:30:18 -0700141 t = main.Thread( target=main.CLIs[ i ].startOnosCli,
Jon Hall2c8959e2016-12-16 12:17:34 -0800142 name="startOnosCli-" + str( i ),
Jon Halled258232017-05-24 17:30:18 -0700143 args=[ main.nodes[ i ].ip_address ] )
Jon Hall2c8959e2016-12-16 12:17:34 -0800144 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:
Jon Halled258232017-05-24 17:30:18 -0700160 apps = apps.split( ',' )
Jon Hall2c8959e2016-12-16 12:17:34 -0800161 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":
Jon Hall937bc812017-01-31 16:44:10 -0800170 activateResult = activateResult and True
Jon Hall2c8959e2016-12-16 12:17:34 -0800171 else:
172 main.log.error( "{} is in {} state".format( app, state ) )
Jon Hall937bc812017-01-31 16:44:10 -0800173 activateResult = False
Jon Hall2c8959e2016-12-16 12:17:34 -0800174 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:
Jon Halled258232017-05-24 17:30:18 -0700187 for setting in config[ component ]:
188 value = config[ component ][ setting ]
Jon Hall2c8959e2016-12-16 12:17:34 -0800189 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:
Jon Halled258232017-05-24 17:30:18 -0700203 t = main.Thread( target=main.CLIs[ i ].appToIDCheck,
Jon Hall2c8959e2016-12-16 12:17:34 -0800204 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:
Jon Halled258232017-05-24 17:30:18 -0700213 main.log.warn( main.CLIs[ 0 ].apps() )
214 main.log.warn( main.CLIs[ 0 ].appIDs() )
Jon Hall2c8959e2016-12-16 12:17:34 -0800215 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
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -0700226 main.vpls = vpls
Jon Hall2c8959e2016-12-16 12:17:34 -0800227 pprint = main.ONOSrest1.pprint
Jon Halled258232017-05-24 17:30:18 -0700228 hosts = int( main.params[ 'vpls' ][ 'hosts' ] )
229 SLEEP = int( main.params[ 'SLEEP' ][ 'netcfg' ] )
Jon Hall2c8959e2016-12-16 12:17:34 -0800230
231 main.step( "Discover hosts using pings" )
232 for i in range( 1, hosts + 1 ):
233 src = "h" + str( i )
234 for j in range( 1, hosts + 1 ):
235 if j == i:
236 continue
237 dst = "h" + str( j )
238 pingResult = main.Mininet1.pingHost( SRC=src, TARGET=dst )
239
240 main.step( "Load VPLS configurations" )
Jon Halled258232017-05-24 17:30:18 -0700241 fileName = main.params[ 'DEPENDENCY' ][ 'topology' ]
242 app = main.params[ 'vpls' ][ 'name' ]
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -0700243
244 loadVPLSResult = main.ONOSbench.onosNetCfg( main.nodes[ 0 ].ip_address, "", fileName )
245 utilities.assert_equals( expect=main.TRUE,
246 actual=loadVPLSResult,
247 onpass="Loaded vpls configuration.",
248 onfail="Failed to load vpls configuration." )
249
Jon Hall2c8959e2016-12-16 12:17:34 -0800250 # Time for netcfg to load data
251 time.sleep( SLEEP )
252 # 'Master' copy of test configuration
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -0700253
Jon Hall2c8959e2016-12-16 12:17:34 -0800254 try:
255 with open( os.path.expanduser( fileName ) ) as dataFile:
256 originalCfg = json.load( dataFile )
Jon Halled258232017-05-24 17:30:18 -0700257 main.vplsConfig = originalCfg[ 'apps' ].get( app ).get( 'vpls' ).get( 'vplsList' )
Jon Hall2c8959e2016-12-16 12:17:34 -0800258 except Exception as e:
259 main.log.error( "Error loading config file: {}".format( e ) )
260 if main.vplsConfig:
261 result = True
262 else:
263 result = False
264 utilities.assert_equals( expect=True,
265 actual=result,
266 onpass="Loaded vpls configuration",
267 onfail="Failed to load vpls configuration" )
268
269 main.step( "Check interface configurations" )
270 result = False
Jeremy Ronquillo4a30ffe2017-06-07 11:36:35 -0700271 getPorts = utilities.retry( f=main.ONOSrest1.getNetCfg,
272 retValue=False,
273 kwargs={"subjectClass":"ports"},
274 sleep=SLEEP )
Jon Hall2c8959e2016-12-16 12:17:34 -0800275 onosCfg = pprint( getPorts )
276 sentCfg = pprint( originalCfg.get( "ports" ) )
277
278 if onosCfg == sentCfg:
279 main.log.info( "ONOS interfaces NetCfg matches what was sent" )
280 result = True
281 else:
282 main.log.error( "ONOS interfaces NetCfg doesn't match what was sent" )
283 main.log.debug( "ONOS config: {}".format( onosCfg ) )
284 main.log.debug( "Sent config: {}".format( sentCfg ) )
285 utilities.assert_equals( expect=True,
286 actual=result,
287 onpass="Net Cfg added for interfaces",
288 onfail="Net Cfg not added for interfaces" )
289
290 # Run a bunch of checks to verify functionality based on configs
291 vpls.verify( main )
292
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -0700293 main.step( "Loading vpls configuration in case any configuration was missed." )
294 loadVPLSResult = main.ONOSbench.onosNetCfg( main.nodes[ 0 ].ip_address, "", fileName )
295 utilities.assert_equals( expect=main.TRUE,
296 actual=loadVPLSResult,
297 onpass="Loaded vpls configuration.",
298 onfail="Failed to load vpls configuration." )
299
Jon Hall2c8959e2016-12-16 12:17:34 -0800300 def CASE3( self, main ):
301 """
302 Test VPLS cli commands
303 High level steps:
304 remove interface from a network
305 Clean configs
306 create vpls network
307 add interfaces to a network
308 add encap
309 change encap
310 remove encap
311 list?
312 """
313 from tests.USECASE.VPLS.dependencies import vpls
Jon Halled258232017-05-24 17:30:18 -0700314 SLEEP = int( main.params[ 'SLEEP' ][ 'netcfg' ] )
Jon Hall2c8959e2016-12-16 12:17:34 -0800315 pprint = main.ONOSrest1.pprint
316
317 main.step( "Remove an interface from a vpls network" )
Jon Halled258232017-05-24 17:30:18 -0700318 main.CLIs[ 0 ].vplsRemIface( 'VPLS1', 'h1' )
Jon Hall2c8959e2016-12-16 12:17:34 -0800319 time.sleep( SLEEP )
320 #update master config json
321 for network in main.vplsConfig:
322 if network.get( 'name' ) == 'VPLS1':
323 ifaces = network.get( 'interfaces' )
Jon Halled258232017-05-24 17:30:18 -0700324 ifaces.remove( 'h1' )
Jon Hall2c8959e2016-12-16 12:17:34 -0800325 vpls.verify( main )
326
327 main.step( "Clean all vpls configurations" )
Jon Halled258232017-05-24 17:30:18 -0700328 main.CLIs[ 0 ].vplsClean()
Jon Hall2c8959e2016-12-16 12:17:34 -0800329 time.sleep( SLEEP )
330 main.vplsConfig = []
331 vpls.verify( main )
332
333 main.step( "Create a new vpls network" )
334 name = "Network1"
Jon Halled258232017-05-24 17:30:18 -0700335 main.CLIs[ 0 ].vplsCreate( name )
Jon Hall2c8959e2016-12-16 12:17:34 -0800336 time.sleep( SLEEP )
337 network1 = { 'name': name, 'interfaces': [], 'encapsulation': 'NONE' }
338 main.vplsConfig.append( network1 )
339 vpls.verify( main )
340
341 main.step( "Add interfaces to the network" )
Jon Halled258232017-05-24 17:30:18 -0700342 main.CLIs[ 0 ].vplsAddIface( name, "h1" )
343 main.CLIs[ 0 ].vplsAddIface( name, "h5" )
344 main.CLIs[ 0 ].vplsAddIface( name, "h4" )
Jon Hall2c8959e2016-12-16 12:17:34 -0800345 time.sleep( SLEEP )
346 for network in main.vplsConfig:
347 if network.get( 'name' ) == name:
348 ifaces = network.get( 'interfaces' )
349 ifaces.append( 'h1' )
350 ifaces.append( 'h4' )
351 ifaces.append( 'h5' )
352 network[ 'interfaces' ] = ifaces
353 vpls.verify( main )
354
355 main.step( "Add MPLS encapsulation to a vpls network" )
356 encapType = "MPLS"
Jon Halled258232017-05-24 17:30:18 -0700357 main.CLIs[ 0 ].vplsSetEncap( name, encapType )
Jon Hall2c8959e2016-12-16 12:17:34 -0800358 for network in main.vplsConfig:
359 if network.get( 'name' ) == name:
Jon Halled258232017-05-24 17:30:18 -0700360 network[ 'encapsulation' ] = encapType
Jon Hall2c8959e2016-12-16 12:17:34 -0800361 time.sleep( SLEEP )
362 vpls.verify( main )
363
364 main.step( "Change an encapsulation type" )
365 encapType = "VLAN"
Jon Halled258232017-05-24 17:30:18 -0700366 main.CLIs[ 0 ].vplsSetEncap( name, encapType )
Jon Hall2c8959e2016-12-16 12:17:34 -0800367 for network in main.vplsConfig:
368 if network.get( 'name' ) == name:
Jon Halled258232017-05-24 17:30:18 -0700369 network[ 'encapsulation' ] = encapType
Jon Hall2c8959e2016-12-16 12:17:34 -0800370 time.sleep( SLEEP )
371 vpls.verify( main )
372
373 main.step( "Remove encapsulation" )
374 encapType = "NONE"
Jon Halled258232017-05-24 17:30:18 -0700375 main.CLIs[ 0 ].vplsSetEncap( name, encapType )
Jon Hall2c8959e2016-12-16 12:17:34 -0800376 for network in main.vplsConfig:
377 if network.get( 'name' ) == name:
Jon Halled258232017-05-24 17:30:18 -0700378 network[ 'encapsulation' ] = encapType
Jon Hall2c8959e2016-12-16 12:17:34 -0800379 time.sleep( SLEEP )
380 vpls.verify( main )
381
382 main.step( "Clean all vpls configurations" )
Jon Halled258232017-05-24 17:30:18 -0700383 main.CLIs[ 0 ].vplsClean()
Jon Hall2c8959e2016-12-16 12:17:34 -0800384 time.sleep( SLEEP )
385 main.vplsConfig = []
386 vpls.verify( main )