blob: 0cb5d2d8c0ec625ac68e70c5d323cd2c9d845d69 [file] [log] [blame]
YPZhanga482c202016-02-18 17:03:07 -08001"""
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -07002Copyright 2016 Open Networking Foundation ( ONF )
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07003
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
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070011 ( at your option ) any later version.
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -070012
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"""
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -070021"""
YPZhanga482c202016-02-18 17:03:07 -080022 SCPFhostLat
23 This test will test the host found latency.
24 Host will arping a ip address, tshark will caputure the package time, then compare with the topology event timestamp.
25 Test will run with 1 node from start, and scale up to 7 nodes.
26 The event timestamp will only greb the latest one, then calculate average and standar dev.
27
28 yunpeng@onlab.us
29"""
30class SCPFhostLat:
31
32 def __init__( self ):
33 self.default = ''
34
Devin Lim142b5342017-07-20 15:22:39 -070035 def CASE0( self, main ):
YPZhanga482c202016-02-18 17:03:07 -080036 import sys
37 import json
38 import time
39 import os
40 import imp
Devin Lim58046fa2017-07-05 16:55:00 -070041 try:
42 from tests.dependencies.ONOSSetup import ONOSSetup
43 main.testSetUp = ONOSSetup()
44 except ImportError:
45 main.log.error( "ONOSSetup not found. exiting the test" )
Devin Lim44075962017-08-11 10:56:37 -070046 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -070047 main.testSetUp.envSetupDescription()
48 stepResult = main.FALSE
49 try:
YPZhanga482c202016-02-18 17:03:07 -080050
Devin Lim58046fa2017-07-05 16:55:00 -070051 # Test variables
52 main.cellName = main.params[ 'ENV' ][ 'cellName' ]
53 main.apps = main.params[ 'ENV' ][ 'cellApps' ]
54 main.scale = ( main.params[ 'SCALE' ] ).split( "," )
55 main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
56 main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
57 main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
58 main.measurementSleep = int( main.params[ 'SLEEP' ][ 'measurement' ] )
59 main.timeout = int( main.params[ 'SLEEP' ][ 'timeout' ] )
60 main.dbFileName = main.params[ 'DATABASE' ][ 'file' ]
YPZhanga482c202016-02-18 17:03:07 -080061
Devin Lim58046fa2017-07-05 16:55:00 -070062 # Tshark params
63 main.tsharkResultPath = main.params[ 'TSHARK' ][ 'tsharkPath' ]
64 main.tsharkPacketIn = main.params[ 'TSHARK' ][ 'tsharkPacketIn' ]
You Wangb2043922020-10-28 18:45:24 -070065 main.tsharkInterface = main.params[ 'TSHARK' ][ 'tsharkInterface' ]
Devin Lim58046fa2017-07-05 16:55:00 -070066
67 main.numlter = main.params[ 'TEST' ][ 'numIter' ]
68 main.iterIgnore = int( main.params[ 'TEST' ][ 'iterIgnore' ] )
69 main.hostTimestampKey = main.params[ 'TEST' ][ 'hostTimestamp' ]
70 main.thresholdStr = main.params[ 'TEST' ][ 'singleSwThreshold' ]
71 main.thresholdObj = main.thresholdStr.split( ',' )
72 main.thresholdMin = int( main.thresholdObj[ 0 ] )
73 main.thresholdMax = int( main.thresholdObj[ 1 ] )
74 main.threadID = 0
75
76 main.maxNumBatch = 0
77 main.setupSkipped = False
78
Devin Lim87e12c42017-07-20 13:53:04 -070079 main.nic = main.params[ 'DATABASE' ][ 'nic' ]
Devin Lim58046fa2017-07-05 16:55:00 -070080 node = main.params[ 'DATABASE' ][ 'node' ]
81 stepResult = main.TRUE
82
83 main.log.info( "Cresting DB file" )
84 with open( main.dbFileName, "w+" ) as dbFile:
85 dbFile.write( "" )
Devin Lim142b5342017-07-20 15:22:39 -070086 stepResult = main.testSetUp.envSetup()
Devin Lim58046fa2017-07-05 16:55:00 -070087 except Exception as e:
88 main.testSetUp.envSetupException( e )
Jon Hallaa1d9b82020-07-30 13:49:42 -070089 main.testSetUp.envSetupConclusion( stepResult )
Devin Lim58046fa2017-07-05 16:55:00 -070090
91 main.commit = main.commit.split( " " )[ 1 ]
92
YPZhanga482c202016-02-18 17:03:07 -080093 def CASE2( self, main ):
94 """
95 - Uninstall ONOS cluster
96 - Verify ONOS start up
97 - Install ONOS cluster
98 - Connect to cli
99 """
You Wanga0f6ff62018-01-11 15:46:30 -0800100 main.testSetUp.ONOSSetUp( main.Cluster, True,
Devin Lim142b5342017-07-20 15:22:39 -0700101 cellName=main.cellName, killRemoveMax=False )
YPZhanga482c202016-02-18 17:03:07 -0800102
103 def CASE11( self, main ):
104 main.log.info( "set and configure Application" )
105 import json
106 import time
Devin Lim142b5342017-07-20 15:22:39 -0700107 time.sleep( main.startUpSleep )
YPZhanga482c202016-02-18 17:03:07 -0800108 main.step( "Activating org.onosproject.proxyarp" )
Devin Lim142b5342017-07-20 15:22:39 -0700109 appStatus = utilities.retry( main.Cluster.active( 0 ).REST.activateApp,
YPZhanga482c202016-02-18 17:03:07 -0800110 main.FALSE,
Devin Lim58046fa2017-07-05 16:55:00 -0700111 [ 'org.onosproject.proxyarp' ],
YPZhanga482c202016-02-18 17:03:07 -0800112 sleep=3,
113 attempts=3 )
114 utilities.assert_equals( expect=main.TRUE,
115 actual=appStatus,
116 onpass="Successfully activated proxyarp",
Devin Lim142b5342017-07-20 15:22:39 -0700117 onfail="Failed to activated proxyarp" )
YPZhanga482c202016-02-18 17:03:07 -0800118
119 main.step( "Set up Default Topology Provider" )
120 appStatus = main.TRUE
121 configName = 'org.onosproject.net.topology.impl.DefaultTopologyProvider'
122 configParam = 'maxEvents'
Devin Lim142b5342017-07-20 15:22:39 -0700123 appStatus = appStatus and main.Cluster.active( 0 ).CLI.setCfg( configName, configParam, '1' )
YPZhanga482c202016-02-18 17:03:07 -0800124 configParam = 'maxBatchMs'
Devin Lim142b5342017-07-20 15:22:39 -0700125 appStatus = appStatus and main.Cluster.active( 0 ).CLI.setCfg( configName, configParam, '0' )
YPZhanga482c202016-02-18 17:03:07 -0800126 configParam = 'maxIdleMs'
Devin Lim142b5342017-07-20 15:22:39 -0700127 appStatus = appStatus and main.Cluster.active( 0 ).CLI.setCfg( configName, configParam, '0' )
YPZhanga482c202016-02-18 17:03:07 -0800128 utilities.assert_equals( expect=main.TRUE,
129 actual=appStatus,
130 onpass="Successfully set DefaultTopologyProvider",
131 onfail="Failed to set DefaultTopologyProvider" )
132
Devin Lim142b5342017-07-20 15:22:39 -0700133 time.sleep( main.startUpSleep )
134 main.step( 'Starting mininet topology' )
Devin Lim3e8c6d92018-05-10 16:03:07 -0700135 mnCmd = '--topo=linear,1 '
136 for ctrl in main.Cluster.active():
137 mnCmd += " --controller remote,ip=" + ctrl.ipAddress
138 mnStatus = main.Mininet1.startNet( args=mnCmd )
YPZhanga482c202016-02-18 17:03:07 -0800139 utilities.assert_equals( expect=main.TRUE,
140 actual=mnStatus,
141 onpass="Successfully started Mininet",
142 onfail="Failed to activate Mininet" )
Devin Lim142b5342017-07-20 15:22:39 -0700143 main.step( "Assinging masters to switches" )
YPZhanga482c202016-02-18 17:03:07 -0800144 switches = main.Mininet1.getSwitches()
Devin Lim142b5342017-07-20 15:22:39 -0700145 swStatus = main.Mininet1.assignSwController( sw=switches.keys(),
146 ip=main.Cluster.active( 0 ).ipAddress )
YPZhanga482c202016-02-18 17:03:07 -0800147 utilities.assert_equals( expect=main.TRUE,
148 actual=swStatus,
149 onpass="Successfully assigned switches to masters",
150 onfail="Failed assign switches to masters" )
151
Devin Lim142b5342017-07-20 15:22:39 -0700152 time.sleep( main.startUpSleep )
YPZhanga482c202016-02-18 17:03:07 -0800153
Devin Lim142b5342017-07-20 15:22:39 -0700154 def CASE20( self, main ):
YPZhanga482c202016-02-18 17:03:07 -0800155 """
156 host1 send arping package and measure latency
157
158 There are only 1 levels of latency measurements to this test:
159 1 ) ARPING-to-device measurement: Measurement the time from host1
160 send apring package to onos processing the host event
161
162 """
163 import time
164 import subprocess
165 import json
166 import requests
167 import os
168 import numpy
Devin Lim58046fa2017-07-05 16:55:00 -0700169 try:
170 from tests.dependencies.utils import Utils
171 except ImportError:
172 main.log.error( "Utils not found exiting the test" )
Devin Lim44075962017-08-11 10:56:37 -0700173 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -0700174 try:
175 main.Utils
176 except ( NameError, AttributeError ):
177 main.Utils = Utils()
YPZhanga482c202016-02-18 17:03:07 -0800178 # Host adding measurement
179 assertion = main.TRUE
180
Devin Lim142b5342017-07-20 15:22:39 -0700181 main.log.report( 'Latency of adding one host to ONOS' )
182 main.log.report( 'First ' + str( main.iterIgnore ) + ' iterations ignored' + ' for jvm warmup time' )
183 main.log.report( 'Total iterations of test: ' + str( main.numlter ) )
YPZhanga482c202016-02-18 17:03:07 -0800184
185 addingHostTime = []
186 metricsResultList = []
Devin Lim58046fa2017-07-05 16:55:00 -0700187 for i in range( 0, int( main.numlter ) ):
188 main.log.info( 'Clean up data file' )
189 with open( main.tsharkResultPath, "w" ) as dbFile:
190 dbFile.write( "" )
YPZhanga482c202016-02-18 17:03:07 -0800191
Devin Lim142b5342017-07-20 15:22:39 -0700192 main.log.info( 'Starting tshark capture' )
You Wangb2043922020-10-28 18:45:24 -0700193 main.ONOSbench.tsharkGrep( main.tsharkPacketIn, main.tsharkResultPath, interface=main.tsharkInterface )
Devin Lim58046fa2017-07-05 16:55:00 -0700194 time.sleep( main.measurementSleep )
YPZhanga482c202016-02-18 17:03:07 -0800195
Devin Lim142b5342017-07-20 15:22:39 -0700196 main.log.info( 'host 1 arping...' )
197 main.Mininet1.arping( srcHost='h1', dstHost='10.0.0.2' )
YPZhanga482c202016-02-18 17:03:07 -0800198
Devin Lim58046fa2017-07-05 16:55:00 -0700199 time.sleep( main.measurementSleep )
YPZhanga482c202016-02-18 17:03:07 -0800200
Devin Lim142b5342017-07-20 15:22:39 -0700201 main.log.info( 'Stopping all Tshark processes' )
YPZhanga482c202016-02-18 17:03:07 -0800202 main.ONOSbench.tsharkStop()
203
Devin Lim58046fa2017-07-05 16:55:00 -0700204 time.sleep( main.measurementSleep )
YPZhanga482c202016-02-18 17:03:07 -0800205
206 # Get tshark output
Devin Lim58046fa2017-07-05 16:55:00 -0700207 with open( main.tsharkResultPath, "r" ) as resultFile:
YPZhanga482c202016-02-18 17:03:07 -0800208 resultText = resultFile.readline()
Devin Lim58046fa2017-07-05 16:55:00 -0700209 main.log.info( 'Capture result:' + resultText )
You Wang4a3101a2019-08-15 16:33:04 -0700210 resultText = resultText.strip().split( ' ' )
Devin Lim58046fa2017-07-05 16:55:00 -0700211 if len( resultText ) > 1:
212 tsharkResultTime = float( resultText[ 1 ] ) * 1000.0
YPZhanga482c202016-02-18 17:03:07 -0800213 else:
Devin Lim58046fa2017-07-05 16:55:00 -0700214 main.log.error( 'Tshark output file for packet_in' + ' returned unexpected results' )
YPZhanga482c202016-02-18 17:03:07 -0800215 hostTime = 0
216 caseResult = main.FALSE
217 resultFile.close()
218 # Compare the timestemps, and get the lowest one.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700219 temp = 0
YPZhanga482c202016-02-18 17:03:07 -0800220 # Get host event timestamps from each nodes
Devin Lim142b5342017-07-20 15:22:39 -0700221 for ctrl in main.Cluster.active():
222 metricsResult = json.loads( ctrl.CLI.topologyEventsMetrics() )
Devin Lim58046fa2017-07-05 16:55:00 -0700223 metricsResult = metricsResult.get( main.hostTimestampKey ).get( "value" )
224 main.log.info( "ONOS topology event matrics timestemp: {}".format( str( metricsResult ) ) )
YPZhanga482c202016-02-18 17:03:07 -0800225
226 if temp < metricsResult:
227 temp = metricsResult
228 metricsResult = temp
229
You Wang02a83a72018-07-17 12:48:11 -0700230 if i >= main.iterIgnore:
231 addingHostTime.append( float( metricsResult ) - tsharkResultTime )
Devin Lim142b5342017-07-20 15:22:39 -0700232 main.log.info( "Result of this iteration: {}".format( str( float( metricsResult ) - tsharkResultTime ) ) )
YPZhanga482c202016-02-18 17:03:07 -0800233 # gethost to remove
Devin Lim142b5342017-07-20 15:22:39 -0700234 gethost = main.Cluster.active( 0 ).REST.hosts()
YPZhanga482c202016-02-18 17:03:07 -0800235 HosttoRemove = []
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700236 HosttoRemove.append( json.loads( gethost[ 1:len( gethost ) - 1 ] ).get( 'id' ) )
Devin Lim142b5342017-07-20 15:22:39 -0700237 main.Cluster.active( 0 ).CLI.removeHost( HosttoRemove )
YPZhanga482c202016-02-18 17:03:07 -0800238
Devin Lim58046fa2017-07-05 16:55:00 -0700239 main.log.info( "Result List: {}".format( addingHostTime ) )
YPZhang82ca5892016-03-01 15:32:09 -0800240
YPZhanga482c202016-02-18 17:03:07 -0800241 # calculate average latency from each nodes
Devin Lim58046fa2017-07-05 16:55:00 -0700242 averageResult = numpy.average( addingHostTime )
243 main.log.info( "Average Latency: {}".format( averageResult ) )
YPZhanga482c202016-02-18 17:03:07 -0800244
245 # calculate std
Devin Lim142b5342017-07-20 15:22:39 -0700246 stdResult = numpy.std( addingHostTime )
247 main.log.info( "std: {}".format( stdResult ) )
YPZhanga482c202016-02-18 17:03:07 -0800248
You Wangaa7bc722019-02-21 17:55:39 -0800249 # Check test results
250 threshold = float( main.params[ 'ALARM' ][ 'maxLat' ].split( ',' )[ main.cycle - 1 ] )
251 if averageResult > threshold:
252 main.log.alarm( "{}-node: {} ms > {} ms".format( main.Cluster.numCtrls,
253 averageResult, threshold ) )
254
YPZhanga482c202016-02-18 17:03:07 -0800255 # write to DB file
Devin Lim142b5342017-07-20 15:22:39 -0700256 main.log.info( "Writing results to DS file" )
257 with open( main.dbFileName, "a" ) as dbFile:
Devin Lim87e12c42017-07-20 13:53:04 -0700258 temp = "'" + main.commit + "',"
259 temp += "'" + main.nic + "',"
YPZhanga482c202016-02-18 17:03:07 -0800260 # Scale number
Devin Lim142b5342017-07-20 15:22:39 -0700261 temp += str( main.Cluster.numCtrls )
YPZhanga482c202016-02-18 17:03:07 -0800262 temp += ",'" + "baremetal1" + "'"
263 # average latency
264 temp += "," + str( averageResult )
265 # std of latency
Devin Lim142b5342017-07-20 15:22:39 -0700266 temp += "," + str( stdResult )
YPZhanga482c202016-02-18 17:03:07 -0800267 temp += "\n"
268 dbFile.write( temp )
269
270 assertion = main.TRUE
271
Devin Lim142b5342017-07-20 15:22:39 -0700272 utilities.assert_equals( expect=main.TRUE, actual=assertion,
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700273 onpass='Host latency test successful',
274 onfail='Host latency test failed' )
YPZhanga482c202016-02-18 17:03:07 -0800275
Devin Lim58046fa2017-07-05 16:55:00 -0700276 main.Utils.mininetCleanup( main.Mininet1 )