blob: 0b13a61c5f343f974229ebd176d85a78d95ac017 [file] [log] [blame]
Andreas Pantelopoulos90f0b102018-02-01 13:21:45 -08001"""
2Copyright 2017 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
Jon Halla604fd42018-05-04 14:27:27 -070022def setupTest( main, test_idx, onosNodes=-1, ipv4=True, ipv6=True,
23 external=True, static=False, countFlowsGroups=False ):
You Wang5da39c82018-04-26 22:55:08 -070024 """
25 SRRouting test setup
26 """
27 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
You Wang68568b12019-03-04 11:49:57 -080028 import tests.USECASE.SegmentRouting.dependencies.cfgtranslator as translator
You Wangd66de192018-04-30 17:30:12 -070029 import time
30
You Wang5da39c82018-04-26 22:55:08 -070031 skipPackage = False
32 init = False
33 if not hasattr( main, 'apps' ):
34 init = True
You Wangd66de192018-04-30 17:30:12 -070035 lib.initTest( main )
Jon Halla604fd42018-05-04 14:27:27 -070036 if onosNodes < 0:
37 onosNodes = main.Cluster.numCtrls
You Wang5da39c82018-04-26 22:55:08 -070038 # Skip onos packaging if the cluster size stays the same
39 if not init and onosNodes == main.Cluster.numCtrls:
40 skipPackage = True
41
42 main.internalIpv4Hosts = main.params[ 'TOPO' ][ 'internalIpv4Hosts' ].split( ',' )
43 main.internalIpv6Hosts = main.params[ 'TOPO' ][ 'internalIpv6Hosts' ].split( ',' )
You Wang0fc21702018-11-02 17:49:18 -070044 main.externalIpv4Hosts = main.params[ 'TOPO' ][ 'externalIpv4Hosts' ].split( ',' ) if main.params[ 'TOPO' ].get('externalIpv4Hosts') else []
45 main.externalIpv6Hosts = main.params[ 'TOPO' ][ 'externalIpv6Hosts' ].split( ',' ) if main.params[ 'TOPO' ].get('externalIpv6Hosts') else []
46 main.staticIpv4Hosts = main.params[ 'TOPO' ][ 'staticIpv4Hosts' ].split( ',' ) if main.params[ 'TOPO' ].get('staticIpv4Hosts') else []
47 main.staticIpv6Hosts = main.params[ 'TOPO' ][ 'staticIpv6Hosts' ].split( ',' ) if main.params[ 'TOPO' ].get('staticIpv6Hosts') else []
You Wangd66de192018-04-30 17:30:12 -070048 main.disconnectedIpv4Hosts = []
49 main.disconnectedIpv6Hosts = []
You Wang4efd66b2018-06-12 14:47:26 -070050 main.disconnectedExternalIpv4Hosts = []
51 main.disconnectedExternalIpv6Hosts = []
52 main.disconnectedStaticIpv4Hosts = []
53 main.disconnectedStaticIpv6Hosts = []
You Wangd66de192018-04-30 17:30:12 -070054 main.resultFileName = 'CASE%03d' % test_idx
You Wang5da39c82018-04-26 22:55:08 -070055 main.Cluster.setRunningNode( onosNodes )
You Wang5da39c82018-04-26 22:55:08 -070056
You Wang2a1a3352018-07-31 14:35:01 -070057 lib.installOnos( main, skipPackage=skipPackage, cliSleep=5 )
You Wangd66de192018-04-30 17:30:12 -070058
59 # Load configuration files
You Wang0fc21702018-11-02 17:49:18 -070060 if hasattr( main, "Mininet1" ):
61 main.cfgName = 'TEST_CONFIG_ipv4={}_ipv6={}'.format( 1 if ipv4 else 0,
62 1 if ipv6 else 0)
63 else:
64 main.cfgName = main.params[ "DEPENDENCY" ][ "confName" ]
You Wang68568b12019-03-04 11:49:57 -080065 if main.useBmv2:
66 # Translate configuration file from OVS-OFDPA to BMv2 driver
67 translator.ofdpaToBmv2( main )
68 else:
69 translator.bmv2ToOfdpa( main )
You Wangd66de192018-04-30 17:30:12 -070070 lib.loadJson( main )
71 time.sleep( float( main.params[ 'timers' ][ 'loadNetcfgSleep' ] ) )
72 lib.loadHost( main )
73
74 # if static route flag add routes
75 # these routes are topology specific
76 if static:
77 if ipv4:
78 lib.addStaticOnosRoute( main, "10.0.88.0/24", "10.0.1.1")
You Wang0f745de2018-07-27 15:49:22 -070079 lib.addStaticOnosRoute( main, "10.0.88.0/24", "10.0.5.1")
You Wangd66de192018-04-30 17:30:12 -070080 if ipv6:
81 lib.addStaticOnosRoute( main, "2000::8700/120", "2000::101")
You Wang0f745de2018-07-27 15:49:22 -070082 lib.addStaticOnosRoute( main, "2000::8700/120", "2000::501")
You Wangd66de192018-04-30 17:30:12 -070083 if countFlowsGroups:
84 lib.loadCount( main )
85
86 if hasattr( main, 'Mininet1' ):
You Wang5da39c82018-04-26 22:55:08 -070087 # Run the test with Mininet
You Wangd66de192018-04-30 17:30:12 -070088 mininet_args = ' --dhcp=1 --routers=1 --ipv6={} --ipv4={}'.format( 1 if ipv6 else 0,
89 1 if ipv4 else 0 )
You Wang68568b12019-03-04 11:49:57 -080090 if main.useBmv2:
91 mininet_args += ' --switch bmv2'
92 main.log.info( "Using BMv2 switch" )
You Wangd66de192018-04-30 17:30:12 -070093 lib.startMininet( main, main.params[ 'DEPENDENCY' ][ 'topology' ], args=mininet_args )
You Wang5da39c82018-04-26 22:55:08 -070094 time.sleep( float( main.params[ "timers" ][ "startMininetSleep" ] ) )
95 else:
96 # Run the test with physical devices
You Wang0fc21702018-11-02 17:49:18 -070097 lib.connectToPhysicalNetwork( main )
98
You Wang5da39c82018-04-26 22:55:08 -070099 # wait some time for onos to install the rules!
You Wangd66de192018-04-30 17:30:12 -0700100 time.sleep( float( main.params[ 'timers' ][ 'dhcpSleep' ] ) )
You Wang5da39c82018-04-26 22:55:08 -0700101
You Wangd66de192018-04-30 17:30:12 -0700102def verifyPingInternal( main, ipv4=True, ipv6=True, disconnected=True ):
You Wang5da39c82018-04-26 22:55:08 -0700103 """
104 Verify all connected internal hosts are able to reach each other,
105 and disconnected internal hosts cannot reach any other internal host
106 """
107 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
108 # Verify connected hosts
You Wangd66de192018-04-30 17:30:12 -0700109 if ipv4:
110 lib.verifyPing( main,
111 [ h for h in main.internalIpv4Hosts if h not in main.disconnectedIpv4Hosts ],
You Wang85747762018-05-11 15:51:50 -0700112 [ h for h in main.internalIpv4Hosts if h not in main.disconnectedIpv4Hosts ],
113 stepMsg="Verify reachability of connected internal IPv4 hosts" )
You Wangd66de192018-04-30 17:30:12 -0700114 if ipv6:
115 lib.verifyPing( main,
116 [ h for h in main.internalIpv6Hosts if h not in main.disconnectedIpv6Hosts ],
117 [ h for h in main.internalIpv6Hosts if h not in main.disconnectedIpv6Hosts ],
You Wang42f9e8a2018-07-11 13:25:11 -0700118 ipv6=True,
You Wang85747762018-05-11 15:51:50 -0700119 stepMsg="Verify reachability of connected internal IPv6 hosts" )
You Wang5da39c82018-04-26 22:55:08 -0700120 # Verify disconnected hosts
You Wangd66de192018-04-30 17:30:12 -0700121 if disconnected:
You Wangd66de192018-04-30 17:30:12 -0700122 if main.disconnectedIpv4Hosts:
You Wang85747762018-05-11 15:51:50 -0700123 lib.verifyPing( main, main.internalIpv4Hosts, main.disconnectedIpv4Hosts, expect=False,
124 stepMsg="Verify unreachability of disconnected internal IPv4 hosts" )
You Wangd66de192018-04-30 17:30:12 -0700125 if main.disconnectedIpv6Hosts:
You Wang85747762018-05-11 15:51:50 -0700126 lib.verifyPing( main, main.internalIpv6Hosts, main.disconnectedIpv6Hosts, ipv6=True, expect=False,
127 stepMsg="Verify unreachability of disconnected internal IPv6 hosts" )
You Wang5da39c82018-04-26 22:55:08 -0700128
You Wangd66de192018-04-30 17:30:12 -0700129def verifyPingExternal( main, ipv4=True, ipv6=True, disconnected=True ):
You Wang5da39c82018-04-26 22:55:08 -0700130 """
131 Verify all connected internal hosts are able to reach external hosts,
132 and disconnected internal hosts cannot reach any external host
133 """
134 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
135 # Verify connected hosts
You Wangd66de192018-04-30 17:30:12 -0700136 if ipv4:
137 lib.verifyPing( main,
138 [ h for h in main.internalIpv4Hosts if h not in main.disconnectedIpv4Hosts ],
You Wang85747762018-05-11 15:51:50 -0700139 [ h for h in main.externalIpv4Hosts if h not in main.disconnectedExternalIpv4Hosts ],
You Wang54b1d672018-06-11 16:44:13 -0700140 stepMsg="Verify reachability from connected internal IPv4 hosts to external IPv4 hosts",
141 t3Simple=False )
You Wangd66de192018-04-30 17:30:12 -0700142 if ipv6:
143 lib.verifyPing( main,
144 [ h for h in main.internalIpv6Hosts if h not in main.disconnectedIpv6Hosts ],
Jonghwan Hyun3759e472018-05-01 15:40:08 -0700145 [ h for h in main.externalIpv6Hosts if h not in main.disconnectedExternalIpv6Hosts ],
You Wang42f9e8a2018-07-11 13:25:11 -0700146 ipv6=True,
You Wang54b1d672018-06-11 16:44:13 -0700147 stepMsg="Verify reachability from connected internal IPv6 hosts to external IPv6 hosts",
148 t3Simple=False )
You Wang5da39c82018-04-26 22:55:08 -0700149 # Verify disconnected hosts
You Wangd66de192018-04-30 17:30:12 -0700150 if disconnected:
Jonghwan Hyun3759e472018-05-01 15:40:08 -0700151 # Disconnected internal to connected external
You Wangd66de192018-04-30 17:30:12 -0700152 if main.disconnectedIpv4Hosts:
Jonghwan Hyun3759e472018-05-01 15:40:08 -0700153 lib.verifyPing( main, main.disconnectedIpv4Hosts,
154 [ h for h in main.externalIpv4Hosts if h not in main.disconnectedExternalIpv4Hosts ],
You Wang85747762018-05-11 15:51:50 -0700155 expect=False,
You Wang54b1d672018-06-11 16:44:13 -0700156 stepMsg="Verify unreachability of disconnected internal IPv4 hosts to connected external IPv4 hosts",
157 t3Simple=False )
You Wangd66de192018-04-30 17:30:12 -0700158 if main.disconnectedIpv6Hosts:
Jonghwan Hyun3759e472018-05-01 15:40:08 -0700159 lib.verifyPing( main, main.disconnectedIpv6Hosts,
160 [ h for h in main.externalIpv6Hosts if h not in main.disconnectedExternalIpv6Hosts ],
You Wang85747762018-05-11 15:51:50 -0700161 ipv6=True, expect=False,
You Wang54b1d672018-06-11 16:44:13 -0700162 stepMsg="Verify unreachability of disconnected internal IPv6 hosts to connected external IPv6 hosts",
163 t3Simple=False )
Jonghwan Hyun3759e472018-05-01 15:40:08 -0700164 # Connected internal to disconnected external
165 if main.disconnectedExternalIpv4Hosts:
166 lib.verifyPing( main,
167 [ h for h in main.internalIpv4Hosts if h not in main.disconnectedIpv4Hosts ],
168 main.disconnectedExternalIpv4Hosts,
You Wang85747762018-05-11 15:51:50 -0700169 expect=False,
You Wang54b1d672018-06-11 16:44:13 -0700170 stepMsg="Verify unreachability of connected internal IPv4 hosts to disconnected external IPv4 hosts",
171 t3Simple=False )
Jonghwan Hyun3759e472018-05-01 15:40:08 -0700172 if main.disconnectedExternalIpv6Hosts:
173 lib.verifyPing( main,
174 [ h for h in main.internalIpv6Hosts if h not in main.disconnectedIpv6Hosts ],
175 main.disconnectedExternalIpv6Hosts,
You Wang85747762018-05-11 15:51:50 -0700176 ipv6=True, expect=False,
You Wang54b1d672018-06-11 16:44:13 -0700177 stepMsg="Verify unreachability of connected internal IPv6 hosts to disconnected external IPv6 hosts",
178 t3Simple=False )
You Wang5da39c82018-04-26 22:55:08 -0700179
You Wangd66de192018-04-30 17:30:12 -0700180def verifyPing( main, ipv4=True, ipv6=True, disconnected=False, internal=True, external=True ):
You Wang5da39c82018-04-26 22:55:08 -0700181 """
182 Verify reachability and unreachability of connected/disconnected hosts
183 """
You Wangd66de192018-04-30 17:30:12 -0700184 if internal:
185 verifyPingInternal( main, ipv4, ipv6, disconnected )
186 if external:
187 verifyPingExternal( main, ipv4, ipv6, disconnected )
188
Jon Halla604fd42018-05-04 14:27:27 -0700189def verifyLinkFailure( main, ipv4=True, ipv6=True, disconnected=False,
190 internal=True, external=True, countFlowsGroups=False ):
You Wangd66de192018-04-30 17:30:12 -0700191 """
192 Kill and recover all links to spine101 and 102 sequencially and run verifications
193 """
194 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
195 linksToRemove = [ ["spine103", "spine101"],
196 ["leaf2", "spine101"],
197 ["leaf3", "spine101"],
198 ["leaf4", "spine101"],
199 ["leaf5", "spine101"] ]
200 lib.killLinkBatch( main, linksToRemove, 30, 10 )
201 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
202 lib.restoreLinkBatch( main, linksToRemove, 48, 10 )
203 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
204 linksToRemove = [ ["spine104", "spine102"],
205 ["leaf2", "spine102"],
206 ["leaf3", "spine102"],
207 ["leaf4", "spine102"],
208 ["leaf5", "spine102"] ]
209 lib.killLinkBatch( main, linksToRemove, 30, 10 )
210 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
211 lib.restoreLinkBatch( main, linksToRemove, 48, 10 )
212 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
213
Jon Halla604fd42018-05-04 14:27:27 -0700214def verifySwitchFailure( main, ipv4=True, ipv6=True, disconnected=False,
215 internal=True, external=True, countFlowsGroups=False ):
You Wangd66de192018-04-30 17:30:12 -0700216 """
217 Kill and recover spine101 and 102 sequencially and run verifications
218 """
219 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
220 for switchToKill in [ "spine101", "spine102" ]:
221 lib.killSwitch( main, switchToKill, 9, 30 )
222 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
223 lib.recoverSwitch( main, switchToKill, 10, 48 )
224 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
225
Jon Halla604fd42018-05-04 14:27:27 -0700226def verifyOnosFailure( main, ipv4=True, ipv6=True, disconnected=False,
227 internal=True, external=True, countFlowsGroups=False ):
You Wangd66de192018-04-30 17:30:12 -0700228 """
229 Kill and recover onos nodes sequencially and run verifications
230 """
231 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
232 import json
233 import time
234
235 numCtrls = len( main.Cluster.runningNodes )
236 links = len( json.loads( main.Cluster.next().links() ) )
237 switches = len( json.loads( main.Cluster.next().devices() ) )
Jon Halla604fd42018-05-04 14:27:27 -0700238 mastershipSleep = float( main.params[ 'timers' ][ 'balanceMasterSleep' ] )
You Wangd66de192018-04-30 17:30:12 -0700239 for ctrl in xrange( numCtrls ):
240 # Kill node
241 lib.killOnos( main, [ ctrl ], switches, links, ( numCtrls - 1 ) )
242 main.Cluster.active(0).CLI.balanceMasters()
Jon Halla604fd42018-05-04 14:27:27 -0700243 time.sleep( mastershipSleep )
You Wangd66de192018-04-30 17:30:12 -0700244 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
245 # Recover node
246 lib.recoverOnos( main, [ ctrl ], switches, links, numCtrls )
247 main.Cluster.active(0).CLI.balanceMasters()
Jon Halla604fd42018-05-04 14:27:27 -0700248 time.sleep( mastershipSleep )
You Wangd66de192018-04-30 17:30:12 -0700249 verify( main, ipv4, ipv6, disconnected, internal, external, countFlowsGroups )
250
251def verify( main, ipv4=True, ipv6=True, disconnected=True, internal=True, external=True, countFlowsGroups=False ):
252 """
253 Verify host IP assignment, flow/group number and pings
254 """
255 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
256 # Verify host IP assignment
257 lib.verifyOnosHostIp( main )
258 lib.verifyNetworkHostIp( main )
259 # check flows / groups numbers
260 if countFlowsGroups:
Jon Halla604fd42018-05-04 14:27:27 -0700261 lib.checkFlowsGroupsFromFile( main )
You Wangd66de192018-04-30 17:30:12 -0700262 # ping hosts
263 verifyPing( main, ipv4, ipv6, disconnected, internal, external )
You Wang0f745de2018-07-27 15:49:22 -0700264
265def verifyRouterFailure( main, routerToKill, affectedIpv4Hosts=[], affectedIpv6Hosts=[],
266 ipv4=True, ipv6=True, countFlowsGroups=False ):
267 """
268 Kill and recover a quagga router and verify connectivities to external hosts
269 """
270 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as lib
271 lib.killRouter( main, routerToKill, 5 )
272 main.disconnectedExternalIpv4Hosts = affectedIpv4Hosts
273 main.disconnectedExternalIpv6Hosts = affectedIpv6Hosts
274 verify( main, ipv4, ipv6, True if (affectedIpv4Hosts or affectedIpv6Hosts) else False, False, True, countFlowsGroups )
275 lib.recoverRouter( main, routerToKill, 5 )
276 main.disconnectedExternalIpv4Hosts = []
277 main.disconnectedExternalIpv6Hosts = []
278 verify( main, ipv4, ipv6, False, False, True, countFlowsGroups )