blob: 650288254dee08e91ec2d164b6a6692758ee58d2 [file] [log] [blame]
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07001"""
2Copyright 2015 Open Networking Foundation (ONF)
3
4Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
5the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
6or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with TestON. If not, see <http://www.gnu.org/licenses/>.
20"""
21
pingping-lin86d9f512015-08-17 18:29:41 -070022# Testing the functionality of SDN-IP with single ONOS instance
23class SDNIPfunction:
24
pingping-lin500727a2015-09-02 19:53:11 -070025 def __init__( self ):
pingping-lin86d9f512015-08-17 18:29:41 -070026 self.default = ''
27 global branchName
28
29
30 # This case is to setup ONOS
pingping-lin500727a2015-09-02 19:53:11 -070031 def CASE100( self, main ):
pingping-lin86d9f512015-08-17 18:29:41 -070032 """
33 CASE100 is to compile ONOS and install it
34 Startup sequence:
35 cell <name>
36 onos-verify-cell
37 git pull
38 mvn clean install
39 onos-package
40 onos-install -f
41 onos-wait-for-start
42 """
Devin Lim58046fa2017-07-05 16:55:00 -070043 try:
44 from tests.dependencies.ONOSSetup import ONOSSetup
45 main.testSetUp = ONOSSetup()
46 except ImportError:
47 main.log.error( "ONOSSetup not found. exiting the test" )
48 main.exit()
49 main.testSetUp.envSetupDescription()
50 stepResult = main.FALSE
pingping-lin86d9f512015-08-17 18:29:41 -070051
Devin Lim58046fa2017-07-05 16:55:00 -070052 try:
53 cellName = main.params[ 'ENV' ][ 'cellName' ]
54 ONOS1Ip = main.params['CTRL']['ip1']
55 stepResult = main.testSetUp.envSetup( specificIp=ONOS1Ip )
56 except Exception as e:
57 main.testSetUp.envSetupException( e )
58 main.testSetUp.evnSetupConclusion( stepResult )
pingping-lin86d9f512015-08-17 18:29:41 -070059
Devin Lim58046fa2017-07-05 16:55:00 -070060 case1Result = main.testSetUp.ONOSSetUp( "", newCell=False, cellname=cellName )
pingping-lin86d9f512015-08-17 18:29:41 -070061
62 if case1Result == main.FALSE:
63 main.cleanup()
64 main.exit()
65
pingping-lin500727a2015-09-02 19:53:11 -070066 def CASE4( self, main ):
pingping-lin86d9f512015-08-17 18:29:41 -070067 """
68 Test the SDN-IP functionality
69 allRoutesExpected: all expected routes for all BGP peers
70 routeIntentsExpected: all expected MultiPointToSinglePointIntent \
71 intents
72 bgpIntentsExpected: expected PointToPointIntent intents
73 allRoutesActual: all routes from ONOS LCI
74 routeIntentsActual: actual MultiPointToSinglePointIntent intents from \
75 ONOS CLI
76 bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
77 """
78 import json
79 import time
80 from operator import eq
81 from time import localtime, strftime
82
pingping-lin500727a2015-09-02 19:53:11 -070083 main.case( "This case is to testing the functionality of SDN-IP with \
84 single ONOS instance" )
pingping-lin86d9f512015-08-17 18:29:41 -070085 SDNIPJSONFILEPATH = \
Jon Hall53c5e662016-04-13 16:06:56 -070086 "~/ONOS/tools/package/config/sdnip.json"
pingping-lin86d9f512015-08-17 18:29:41 -070087 # all expected routes for all BGP peers
88 allRoutesExpected = []
pingping-lin500727a2015-09-02 19:53:11 -070089 main.step( "Start to generate routes for all BGP peers" )
90 main.log.info( "Generate prefixes for host3" )
91 prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
92 main.log.info( prefixesHost3 )
pingping-lin86d9f512015-08-17 18:29:41 -070093 # generate route with next hop
94 for prefix in prefixesHost3:
pingping-lin500727a2015-09-02 19:53:11 -070095 allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
pingping-lin86d9f512015-08-17 18:29:41 -070096 routeIntentsExpectedHost3 = \
pingping-lin500727a2015-09-02 19:53:11 -070097 main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
pingping-lin86d9f512015-08-17 18:29:41 -070098 prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
pingping-lin500727a2015-09-02 19:53:11 -070099 SDNIPJSONFILEPATH )
pingping-lin86d9f512015-08-17 18:29:41 -0700100
pingping-lin500727a2015-09-02 19:53:11 -0700101 main.log.info( "Generate prefixes for host4" )
102 prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
103 main.log.info( prefixesHost4 )
pingping-lin86d9f512015-08-17 18:29:41 -0700104 # generate route with next hop
105 for prefix in prefixesHost4:
pingping-lin500727a2015-09-02 19:53:11 -0700106 allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
pingping-lin86d9f512015-08-17 18:29:41 -0700107 routeIntentsExpectedHost4 = \
pingping-lin500727a2015-09-02 19:53:11 -0700108 main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
pingping-lin86d9f512015-08-17 18:29:41 -0700109 prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
pingping-lin500727a2015-09-02 19:53:11 -0700110 SDNIPJSONFILEPATH )
pingping-lin86d9f512015-08-17 18:29:41 -0700111
pingping-lin500727a2015-09-02 19:53:11 -0700112 main.log.info( "Generate prefixes for host5" )
113 prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
114 main.log.info( prefixesHost5 )
pingping-lin86d9f512015-08-17 18:29:41 -0700115 for prefix in prefixesHost5:
pingping-lin500727a2015-09-02 19:53:11 -0700116 allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
pingping-lin86d9f512015-08-17 18:29:41 -0700117 routeIntentsExpectedHost5 = \
pingping-lin500727a2015-09-02 19:53:11 -0700118 main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
pingping-lin86d9f512015-08-17 18:29:41 -0700119 prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
pingping-lin500727a2015-09-02 19:53:11 -0700120 SDNIPJSONFILEPATH )
pingping-lin86d9f512015-08-17 18:29:41 -0700121
122 routeIntentsExpected = routeIntentsExpectedHost3 + \
123 routeIntentsExpectedHost4 + routeIntentsExpectedHost5
124
pingping-lin500727a2015-09-02 19:53:11 -0700125 main.step( "Get links in the network" )
Devin Lim58046fa2017-07-05 16:55:00 -0700126 listResult = main.ONOScli1.links( jsonFormat = False )
pingping-lin500727a2015-09-02 19:53:11 -0700127 main.log.info( listResult )
128 main.log.info( "Activate sdn-ip application" )
Devin Lim58046fa2017-07-05 16:55:00 -0700129 main.ONOScli1.activateApp( "org.onosproject.sdnip" )
pingping-lin86d9f512015-08-17 18:29:41 -0700130 # wait sdn-ip to finish installing connectivity intents, and the BGP
131 # paths in data plane are ready.
pingping-lin500727a2015-09-02 19:53:11 -0700132 time.sleep( int( main.params[ 'timers' ][ 'SdnIpSetup' ] ) )
pingping-lin86d9f512015-08-17 18:29:41 -0700133
pingping-lin500727a2015-09-02 19:53:11 -0700134 main.step( "Login all BGP peers and add routes into peers" )
pingping-lin86d9f512015-08-17 18:29:41 -0700135
pingping-lin500727a2015-09-02 19:53:11 -0700136 main.log.info( "Login Quagga CLI on host3" )
137 main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
138 main.log.info( "Enter configuration model of Quagga CLI on host3" )
139 main.QuaggaCliHost3.enterConfig( 64514 )
140 main.log.info( "Add routes to Quagga on host3" )
141 main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
pingping-lin86d9f512015-08-17 18:29:41 -0700142
pingping-lin500727a2015-09-02 19:53:11 -0700143 main.log.info( "Login Quagga CLI on host4" )
144 main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
145 main.log.info( "Enter configuration model of Quagga CLI on host4" )
146 main.QuaggaCliHost4.enterConfig( 64516 )
147 main.log.info( "Add routes to Quagga on host4" )
148 main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
pingping-lin86d9f512015-08-17 18:29:41 -0700149
pingping-lin500727a2015-09-02 19:53:11 -0700150 main.log.info( "Login Quagga CLI on host5" )
151 main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
152 main.log.info( "Enter configuration model of Quagga CLI on host5" )
153 main.QuaggaCliHost5.enterConfig( 64521 )
154 main.log.info( "Add routes to Quagga on host5" )
155 main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
pingping-lin86d9f512015-08-17 18:29:41 -0700156
pingping-lin500727a2015-09-02 19:53:11 -0700157 for i in range( 101, 201 ):
158 prefixesHostX = main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
159 main.log.info( prefixesHostX )
pingping-lin86d9f512015-08-17 18:29:41 -0700160 for prefix in prefixesHostX:
pingping-lin500727a2015-09-02 19:53:11 -0700161 allRoutesExpected.append( prefix + "/" + "192.168.40."
162 + str( i - 100 ) )
pingping-lin86d9f512015-08-17 18:29:41 -0700163
164 routeIntentsExpectedHostX = \
pingping-lin500727a2015-09-02 19:53:11 -0700165 main.QuaggaCliHost.generateExpectedOnePeerRouteIntents(
166 prefixesHostX, "192.168.40." + str( i - 100 ),
167 "00:00:%02d:00:00:90" % ( i - 101 ), SDNIPJSONFILEPATH )
pingping-lin86d9f512015-08-17 18:29:41 -0700168 routeIntentsExpected = routeIntentsExpected + \
169 routeIntentsExpectedHostX
170
pingping-lin500727a2015-09-02 19:53:11 -0700171 main.log.info( "Login Quagga CLI on host" + str( i ) )
172 QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
173 QuaggaCliHostX.loginQuagga( "1.168.30." + str( i ) )
174 main.log.info( \
175 "Enter configuration model of Quagga CLI on host" + str( i ) )
176 QuaggaCliHostX.enterConfig( 65000 + i - 100 )
177 main.log.info( "Add routes to Quagga on host" + str( i ) )
178 QuaggaCliHostX.addRoutes( prefixesHostX, 1 )
pingping-lin86d9f512015-08-17 18:29:41 -0700179 # wait Quagga to finish delivery all routes to each other and to sdn-ip,
180 # plus finish installing all intents.
pingping-lin500727a2015-09-02 19:53:11 -0700181 time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
182 time.sleep( int( main.params[ 'timers' ][ 'PathAvailable' ] ) )
pingping-lin86d9f512015-08-17 18:29:41 -0700183 # get routes inside SDN-IP
Devin Lim58046fa2017-07-05 16:55:00 -0700184 getRoutesResult = main.ONOScli1.routes( jsonFormat = True )
pingping-lin86d9f512015-08-17 18:29:41 -0700185
186 allRoutesActual = \
pingping-lin500727a2015-09-02 19:53:11 -0700187 main.QuaggaCliHost3.extractActualRoutesMaster( getRoutesResult )
pingping-lin86d9f512015-08-17 18:29:41 -0700188
pingping-lin500727a2015-09-02 19:53:11 -0700189 allRoutesStrExpected = str( sorted( allRoutesExpected ) )
190 allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
191 main.step( "Check routes installed" )
192 main.log.info( "Routes expected:" )
193 main.log.info( allRoutesStrExpected )
194 main.log.info( "Routes get from ONOS CLI:" )
195 main.log.info( allRoutesStrActual )
196 utilities.assertEquals( \
197 expect = allRoutesStrExpected, actual = allRoutesStrActual,
198 onpass = "***Routes in SDN-IP are correct!***",
199 onfail = "***Routes in SDN-IP are wrong!***" )
pingping-lin86d9f512015-08-17 18:29:41 -0700200
Devin Lim58046fa2017-07-05 16:55:00 -0700201 getIntentsResult = main.ONOScli1.intents( jsonFormat = True )
pingping-lin86d9f512015-08-17 18:29:41 -0700202
pingping-lin500727a2015-09-02 19:53:11 -0700203 main.step( "Check MultiPointToSinglePointIntent intents installed" )
pingping-lin86d9f512015-08-17 18:29:41 -0700204 # routeIntentsExpected are generated when generating routes
205 # get route intents from ONOS CLI
206 routeIntentsActualNum = \
pingping-lin500727a2015-09-02 19:53:11 -0700207 main.QuaggaCliHost3.extractActualRouteIntentNum( getIntentsResult )
pingping-lin86d9f512015-08-17 18:29:41 -0700208 routeIntentsExpectedNum = 1030
pingping-lin500727a2015-09-02 19:53:11 -0700209 main.log.info( "MultiPointToSinglePoint Intent Num expected is:" )
210 main.log.info( routeIntentsExpectedNum )
211 main.log.info( "MultiPointToSinglePoint Intent NUM Actual is:" )
212 main.log.info( routeIntentsActualNum )
213 utilities.assertEquals( \
214 expect = True,
215 actual = eq( routeIntentsExpectedNum, routeIntentsActualNum ),
216 onpass = "***MultiPointToSinglePoint Intent Num in SDN-IP is \
pingping-lin86d9f512015-08-17 18:29:41 -0700217 correct!***",
pingping-lin500727a2015-09-02 19:53:11 -0700218 onfail = "***MultiPointToSinglePoint Intent Num in SDN-IP is \
219 wrong!***" )
pingping-lin86d9f512015-08-17 18:29:41 -0700220
pingping-lin500727a2015-09-02 19:53:11 -0700221 main.step( "Check BGP PointToPointIntent intents installed" )
pingping-lin86d9f512015-08-17 18:29:41 -0700222
223 bgpIntentsActualNum = \
pingping-lin500727a2015-09-02 19:53:11 -0700224 main.QuaggaCliHost3.extractActualBgpIntentNum( getIntentsResult )
pingping-lin86d9f512015-08-17 18:29:41 -0700225 bgpIntentsExpectedNum = 624
pingping-lin500727a2015-09-02 19:53:11 -0700226 main.log.info( "bgpIntentsExpected num is:" )
227 main.log.info( bgpIntentsExpectedNum )
228 main.log.info( "bgpIntentsActual num is:" )
229 main.log.info( bgpIntentsActualNum )
230 utilities.assertEquals( \
231 expect = True,
232 actual = eq( bgpIntentsExpectedNum, bgpIntentsActualNum ),
233 onpass = "***PointToPointIntent Intent Num in SDN-IP are correct!***",
234 onfail = "***PointToPointIntent Intent Num in SDN-IP are wrong!***" )
pingping-lin86d9f512015-08-17 18:29:41 -0700235
236 #============================= Ping Test ========================
Jon Hall53c5e662016-04-13 16:06:56 -0700237 pingTestScript = "~/OnosSystemTest/TestON/tests/SDNIPfunction/dependencies/CASE4-ping-as2host.sh"
pingping-lin86d9f512015-08-17 18:29:41 -0700238 pingTestResultsFile = \
Jon Hall53c5e662016-04-13 16:06:56 -0700239 "~/OnosSystemTest/TestON/tests/SDNIPfunction/dependencies/log/CASE4-ping-results-before-delete-routes-"\
pingping-lin500727a2015-09-02 19:53:11 -0700240 + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
241 pingTestResults = main.QuaggaCliHost.pingTest( \
242 "1.168.30.100", pingTestScript, pingTestResultsFile )
243 main.log.info( pingTestResults )
pingping-lin86d9f512015-08-17 18:29:41 -0700244 # wait to finish the ping test
pingping-lin500727a2015-09-02 19:53:11 -0700245 time.sleep( int( main.params[ 'timers' ][ 'PingTestWithRoutes' ] ) )
pingping-lin86d9f512015-08-17 18:29:41 -0700246
247 #============================= Deleting Routes ==================
pingping-lin500727a2015-09-02 19:53:11 -0700248 main.step( "Check deleting routes installed" )
249 main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
250 main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
251 main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
pingping-lin86d9f512015-08-17 18:29:41 -0700252
pingping-lin500727a2015-09-02 19:53:11 -0700253 for i in range( 101, 201 ):
254 prefixesHostX = main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
255 main.log.info( prefixesHostX )
256 QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
257 QuaggaCliHostX.deleteRoutes( prefixesHostX, 1 )
pingping-lin86d9f512015-08-17 18:29:41 -0700258 # wait Quagga to finish delivery all routes to each other and to sdn-ip,
259 # plus finish un-installing all intents.
pingping-lin500727a2015-09-02 19:53:11 -0700260 time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
261 time.sleep( int( main.params[ 'timers' ][ 'PathAvailable' ] ) )
pingping-lin86d9f512015-08-17 18:29:41 -0700262
Devin Lim58046fa2017-07-05 16:55:00 -0700263 getRoutesResult = main.ONOScli1.routes( jsonFormat = True )
pingping-lin86d9f512015-08-17 18:29:41 -0700264 allRoutesActual = \
pingping-lin500727a2015-09-02 19:53:11 -0700265 main.QuaggaCliHost3.extractActualRoutesMaster( getRoutesResult )
266 main.log.info( "allRoutes_actual = " )
267 main.log.info( allRoutesActual )
pingping-lin86d9f512015-08-17 18:29:41 -0700268
pingping-lin500727a2015-09-02 19:53:11 -0700269 utilities.assertEquals( \
270 expect = "[]", actual = str( allRoutesActual ),
271 onpass = "***Route number in SDN-IP is 0, correct!***",
272 onfail = "***Routes number in SDN-IP is not 0, wrong!***" )
pingping-lin86d9f512015-08-17 18:29:41 -0700273
pingping-lin500727a2015-09-02 19:53:11 -0700274 main.step( "Check intents after deleting routes" )
Devin Lim58046fa2017-07-05 16:55:00 -0700275 getIntentsResult = main.ONOScli1.intents( jsonFormat = True )
pingping-lin86d9f512015-08-17 18:29:41 -0700276 routeIntentsActualNum = \
pingping-lin500727a2015-09-02 19:53:11 -0700277 main.QuaggaCliHost3.extractActualRouteIntentNum(
278 getIntentsResult )
279 main.log.info( "route Intents Actual Num is: " )
280 main.log.info( routeIntentsActualNum )
281 utilities.assertEquals( \
282 expect = 0, actual = routeIntentsActualNum,
283 onpass = "***MultiPointToSinglePoint Intent Num in SDN-IP is 0, \
pingping-lin86d9f512015-08-17 18:29:41 -0700284 correct!***",
pingping-lin500727a2015-09-02 19:53:11 -0700285 onfail = "***MultiPointToSinglePoint Intent Num in SDN-IP is not 0, \
286 wrong!***" )
pingping-lin86d9f512015-08-17 18:29:41 -0700287
Jon Hall53c5e662016-04-13 16:06:56 -0700288 pingTestScript = "~/OnosSystemTest/TestON/tests/SDNIPfunction/dependencies/CASE4-ping-as2host.sh"
pingping-lin86d9f512015-08-17 18:29:41 -0700289 pingTestResultsFile = \
Jon Hall53c5e662016-04-13 16:06:56 -0700290 "~/OnosSystemTest/TestON/tests/SDNIPfunction/dependencies/log/CASE4-ping-results-after-delete-routes-"\
pingping-lin500727a2015-09-02 19:53:11 -0700291 + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
292 pingTestResults = main.QuaggaCliHost.pingTest( \
293 "1.168.30.100", pingTestScript, pingTestResultsFile )
294 main.log.info( pingTestResults )
pingping-lin86d9f512015-08-17 18:29:41 -0700295 # wait to finish the ping test
pingping-lin500727a2015-09-02 19:53:11 -0700296 time.sleep( int( main.params[ 'timers' ][ 'PingTestWithoutRoutes' ] ) )