blob: 2f7e51d853b5cab53857b548ef5370d8b6d30cc6 [file] [log] [blame]
Jeremy Ronquillod1833522019-05-06 16:51:59 -07001#!groovy
2// Copyright 2019 Open Networking Foundation (ONF)
3//
4// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
5// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
6// or 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// When there is a new version of ONOS about to release, run this job to create all necessary
22// test result wiki pages.
23//
24// In order to create the sub-pages, you need to know the page IDs of the parent pages; for
25// example, if you want to generate the test category pages, you will need the page ID
26// of the top level branch results.
27
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -070028test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
Jeremy Ronquillo709bee32019-08-14 15:49:33 -070029test_list.init()
Jeremy Ronquillod1833522019-05-06 16:51:59 -070030
Jeremy Ronquillo709bee32019-08-14 15:49:33 -070031runningNode = "QA"
Jeremy Ronquillod1833522019-05-06 16:51:59 -070032
33// set default onos_v to be current_version.
34// onos_v needs to be in the format #.##, do not include "ONOS" or "onos"
35wikiTestResultsPageID = 1048618
36onos_v = params.version
37onos_bird = params.bird
38top_level_page_id = params.top_level_page_id.toInteger()
Jeremy Ronquillof24774f2019-08-15 11:44:51 -070039FUNC_page_id = params.FUNC_page_id.toInteger()
40HA_page_id = params.HA_page_id.toInteger()
Jeremy Ronquillod1833522019-05-06 16:51:59 -070041SCPF_page_id = params.SCPF_page_id.toInteger()
42USECASE_page_id = params.USECASE_page_id.toInteger()
Jeremy Ronquillof24774f2019-08-15 11:44:51 -070043SR_page_id = params.SR_page_id.toInteger()
Jeremy Ronquillod1833522019-05-06 16:51:59 -070044onos_branch = "ONOS-" + onos_v
45
46SCPF_system_environment = [ "Server: Dual XeonE5-2670 v2 2.5GHz; 64GB DDR3; 512GB SSD",
47 "System clock precision is +/- 1 ms",
48 "1Gbps NIC",
49 "JAVA_OPTS=\"\${JAVA_OPTS:--Xms8G -Xmx8G}\"" ]
50
Jeremy Ronquillod1833522019-05-06 16:51:59 -070051// get the name of the job.
52jobName = env.JOB_NAME
53
54String[] pagesToPublish = []
55String[] pageNames = []
56parentID = -1
Jeremy Ronquillof24774f2019-08-15 11:44:51 -070057pageIDProvided = false
Jeremy Ronquillod1833522019-05-06 16:51:59 -070058
59if ( top_level_page_id > -1 ){
60 pageNames += onos_v + "-CHO"
61 pagesToPublish += createCHOpageContents()
62
63 pageNames += onos_v + "-Functionality"
64 pagesToPublish += createGeneralPageContents( "FUNC" )
65
66 pageNames += onos_v + "-HA"
67 pagesToPublish += createGeneralPageContents( "HA" )
68
69 pageNames += onos_v + "-Performance and Scale-out"
70 pagesToPublish += createSCPFpageContents()
71
72 pageNames += onos_v + "-USECASE"
73 pagesToPublish += createGeneralPageContents( "USECASE" )
74
75 // pagesToPublish += createGeneralPageContents( "SRHA" )
76
77 parentID = top_level_page_id
Jeremy Ronquillod1833522019-05-06 16:51:59 -070078
Jeremy Ronquillof24774f2019-08-15 11:44:51 -070079 pageIDProvided = true
80}
81
82if ( FUNC_page_id > -1 ){
83 pageNames += createIndividualPagesNames( "FUNC" )
84 pagesToPublish += createIndividualPagesContents( "FUNC" )
85 parentID = FUNC_page_id
86 pageIDProvided = true
87}
88
89if ( HA_page_id > -1 ){
90 pageNames += createIndividualPagesNames( "HA" )
91 pagesToPublish += createIndividualPagesContents( "HA" )
92 parentID = HA_page_id
93 pageIDProvided = true
Jeremy Ronquillod1833522019-05-06 16:51:59 -070094}
95
96if ( SCPF_page_id > -1 ){
97 pageNames += onos_v + ": Experiment A&B - Topology (Switch, Link) Event Latency"
98 pagesToPublish += createSwitchPortLatPage()
99
100 pageNames += onos_v + ": Experiment C - Intent Install/Remove/Re-route Latency"
101 pagesToPublish += createIntentLatencyPage()
102
103 pageNames += onos_v + ": Experiment D - Intents Operations Throughput"
104 pagesToPublish += createIntentEventThroughputPage()
105
106 pageNames += onos_v + ": Experiment E - Topology Scaling Operation"
107 pagesToPublish += createScaleTopoPage()
108
109 pageNames += onos_v + ": Experiment F - Flow Subsystem Burst Throughput"
110 pagesToPublish += createFlowThroughputPage()
111
112 pageNames += onos_v + ": Experiment G - Single-node ONOS Cbench"
113 pagesToPublish += createCbenchPage()
114
115 pageNames += onos_v + ": Experiment I - Single Bench Flow Latency Test"
116 pagesToPublish += createBatchFlowPage()
117
118 pageNames += onos_v + ": Experiment L - Host Add Latency"
119 pagesToPublish += createHostAddLatencyPage()
120
121 pageNames += onos_v + ": Experiment M - Mastership Failover Latency"
122 pagesToPublish += createMastershipFailoverLatPage()
123
124 parentID = SCPF_page_id
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700125
126 pageIDProvided = true
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700127}
128
129if ( USECASE_page_id > -1 ){
130 pageNames += onos_v + "-Segment Routing"
131 pagesToPublish += createGeneralPageContents( "SR" )
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700132 pageNames += createIndividualPagesNames( "USECASE" )
133 pagesToPublish += createIndividualPagesContents( "USECASE" )
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700134
135 parentID = USECASE_page_id
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700136
137 pageIDProvided = true
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700138}
139
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700140if ( SR_page_id > -1 ){
141 pageNames += createIndividualPagesNames( "SR" )
142 pagesToPublish += createIndividualPagesContents( "SR" )
143 parentID = SR_page_id
144 pageIDProvided = true
145}
146
147if ( !pageIDProvided ){
148 pageNames += "ONOS-" + onos_v + " (" + onos_bird + ")"
149 pagesToPublish += createTopLevelPageContents()
150
151 parentID = wikiTestResultsPageID
152}
153
154echoForDebug( pageNames, pagesToPublish )
Jeremy Ronquillo709bee32019-08-14 15:49:33 -0700155node ( label: runningNode ) {
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700156 for ( i in 0..pagesToPublish.length - 1 ){
157 publishToConfluence( pageNames[ i ], pagesToPublish[ i ], parentID )
158 }
159}
160
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700161def createIndividualPagesNames( category ){
162 result = []
163 testsFromCategory = test_list.getTestsFromCategory( category )
164
165 for ( String test in testsFromCategory.keySet() ){
166 result += onos_v + "-" + testsFromCategory[ test ][ "wikiName" ]
167 }
168 return result
169}
170
171def createIndividualPagesContents( category ){
172 result = []
173 testsFromCategory = test_list.getTestsFromCategory( category )
174
175 for ( String test in testsFromCategory.keySet() ){
176 result += "<p>This test has not run on ONOS-" + onos_v + " yet. Please check again on a later date.</p>"
177 }
178 return result
179}
180
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700181def publishToConfluence( pageName, contents, parentID ){
182 // publish HTML script to wiki confluence
183 // isPostResult : string "true" "false"
184 // file : name of the file to be published
185
186 if ( parentID > -1 ){
187 publishConfluence siteName: 'wiki.onosproject.org', pageName: pageName, spaceName: 'ONOS',
188 attachArchivedArtifacts: true, buildIfUnstable: true, parentId: parentID,
189 editorList: [ confluenceWritePage( confluenceText( contents ) ) ]
190 } else {
191 publishConfluence siteName: 'wiki.onosproject.org', pageName: pageName, spaceName: 'ONOS',
192 attachArchivedArtifacts: true, buildIfUnstable: true,
193 editorList: [ confluenceWritePage( confluenceText( contents ) ) ]
194 }
195}
196
197def echoForDebug( pageNames, pagesToPublish ){
198 for ( i in 0..pagesToPublish.length - 1 ){
199 echo pageNames[ i ]
200 echo pagesToPublish[ i ]
201 }
202}
203
204def makeImage( imageClass, imageLink, width=-1 ){
205 if ( width == -1 ){
206 return "<p><img class=\"" + imageClass + "\" src=\"" + imageLink + "\" data-image-src=\"" + imageLink + "\"></img></p>"
207 } else {
208 return "<p><img class=\"" + imageClass + "\" width=\"" + width + "\" src=\"" + imageLink + "\" data-image-src=\"" + imageLink + "\"></img></p>"
209 }
210
211}
212
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700213def pageTree( category, testsFromCategory ){
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700214 pTree = "<ul>"
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700215 if ( category == "USECASE" ){
Jeremy Ronquillo8bc75e82019-08-22 14:43:21 -0700216 pTree += "<li><h3><a href=\"https://wiki.onosproject.org/display/ONOS/" + onos_v + "-Segment+Routing" + "\">"
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700217 pTree += "2.2-Segment Routing" + "</a></h3></li>"
218 }
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700219 for ( String test in testsFromCategory.keySet() ){
220 testTitle = onos_v + "-" + testsFromCategory[ test ][ "wikiName" ]
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700221 pTree += "<li><h3><a href=\"https://wiki.onosproject.org/display/ONOS/" + testTitle + "\">"
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700222 pTree += testTitle + "</a></h3></li>"
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700223 }
Jeremy Ronquillof24774f2019-08-15 11:44:51 -0700224
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700225 pTree += "</ul>"
226 return pTree
227}
228
229def createTopLevelPageContents(){
230 result = ""
231 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-VM/lastSuccessfulBuild/artifact/ALL_onos-" + onos_v + "_build-latest_"
232 executed = graphLinkPrefix + "executed_pieChart.jpg"
233 passfail = graphLinkPrefix + "passfail_pieChart.jpg"
234 ts_summary = graphLinkPrefix + "test-suite-summary.jpg"
235
236 imageClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
237 imagesHTML = makeImage( imageClass, executed, 400 ) +
238 makeImage( imageClass, passfail, 400 ) +
239 makeImage( imageClass, ts_summary, 500 )
240
241 pTreeLinkPrefix = "https://wiki.onosproject.org/display/ONOS/"
242 pTreeHTML = "<ul>" +
243 "<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-CHO" + "\">" + onos_v + "-CHO" + "</a></h3></li>" +
244 "<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-Functionality" + "\">" + onos_v + "-Functionality" + "</a></h3></li>" +
245 "<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-HA" + "\">" + onos_v + "-HA" + "</a></h3></li>" +
246 "<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-Performance+and+Scale-out" + "\">" + onos_v + "-Performance and Scale-out" + "</a></h3></li>" +
247 "<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-USECASE" + "\">" + onos_v + "-USECASE" + "</a></h3></li>" +
248 "</ul>"
249
250 result = imagesHTML + pTreeHTML
251
252 return result
253}
254
255def createCHOpageContents(){
256 result = ""
257 testPlan = "https://wiki.onosproject.org/pages/viewpage.action?pageId=2131208"
258 description = "<p>ONOS Apps:</p>" +
259 "<ul>" +
260 "<li>drivers</li>" +
261 "<li>openflow</li>" +
262 "<li>segmentrouting</li>" +
263 "<li>fpm</li>" +
264 "<li>dhcprelay</li>" +
265 "<li>netcfghostprovider</li>" +
266 "<li>routeradvertisement</li>" +
267 "<li>t3</li>" +
268 "<li>hostprobingprovider</li>" +
269 "</ul>" +
270 "<p>Topology:</p>" +
271 "<ul>" +
272 "<li>H-AGG</li>" +
273 "</ul>" +
274 "<p>For more details, check out the <a href=\"" + testPlan + "\"> test plans for CHO</a><br /></p>"
275
276 CHOevents = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric5/lastSuccessfulBuild/artifact/CHO_Events_onos-" + onos_v + "_168-maxData_graph.jpg"
277 CHOfailures = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric5/lastSuccessfulBuild/artifact/CHO_Failure-Check_onos-" + onos_v + "_168-maxData_graph.jpg"
278 CHOerrors = "https://jenkins.onosproject.org/job/postjob-Fabric5/lastSuccessfulBuild/artifact/CHO_Errors_onos-" + onos_v + "_168-maxData_graph.jpg"
279
280 imageClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
281 images = makeImage( imageClass, CHOevents, 500 ) +
282 makeImage( imageClass, CHOfailures, 500 ) +
283 makeImage( imageClass, CHOerrors, 500 )
284
285 result = description + images
286
287 return result
288}
289
290def createGeneralPageContents( category ){
291 result = ""
292
293 overallTrendLink = "https://jenkins.onosproject.org/view/QA/job/postjob-VM/lastSuccessfulBuild/artifact/" + category + "_onos-" + onos_v + "_overview.jpg"
294 overallTrendClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
295 overallTrendHTML = makeImage( overallTrendClass, overallTrendLink, 500 )
296
297 testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-VM/lastSuccessfulBuild/artifact/"
298 switch ( category ){
299 case "FUNC":
300 title = "Functionality (FUNC)"
301 testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=1048600"
302 break
303 case "HA":
304 title = "High Availability (HA)"
305 testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=1048602"
306 break
307 case "SR":
308 title = "Segment Routing (SR)"
309 testPlanLink = "https://wiki.opencord.org/display/CORD/Test+Plan+-+Fabric+Control"
310 testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric3/lastSuccessfulBuild/artifact/"
311 overallTrendHTML = ""
312 break
313 case "SRHA":
314 title = "Segment Routing High Availability (SRHA)"
315 testPlanLink = "https://wiki.opencord.org/display/CORD/Test+Plan+-+Fabric+Control"
316 testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric3/lastSuccessfulBuild/artifact/"
317 overallTrendHTML = ""
318 break
Jon Hallf2527902020-07-30 12:56:08 -0700319 case "SR-StratumBmv2":
320 title = "Segment Routing (SR) with Stratum BMv2 switches"
321 testPlanLink = "https://wiki.opencord.org/display/CORD/Test+Plan+-+Fabric+Control"
322 testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric3/lastSuccessfulBuild/artifact/"
323 overallTrendHTML = ""
324 break
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700325 case "USECASE":
326 title = "USECASE"
327 testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=4163047"
328 testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
329 overallTrendHTML = ""
330 break
331 default:
332 echo "Invalid category: " + category
333 return
334 }
335
336 titleHTML = "<h1>Test Results - " + title + "</h1>"
337
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700338 testsFromCategory = test_list.getTestsFromCategory( category )
339 pageTreeHTML = pageTree( category, testsFromCategory )
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700340
341 descriptionHTML = "<p>For test details, check out the <a href=\"" + testPlanLink + "\">test plans for " + category + " test cases</a>.</p>"
342
343 // get the image links for all category tests
344 testTrendSuffix = "_onos-" + onos_v + "_20-builds_graph.jpg"
345
346 testGraphsHTML = ""
347 testGraphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700348
349
350 for ( String key in testsFromCategory.keySet() ){
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700351 imageLink = testTrendPrefix + key + testTrendSuffix
352 testGraphsHTML += makeImage( testGraphsClass, imageLink, 500 )
353 }
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700354 result = overallTrendHTML + titleHTML + pageTreeHTML + descriptionHTML + testGraphsHTML
355
356 return result
357}
358
359def createSCPFpageContents(){
360 result = ""
361
362 descriptionHTML = "<p>" +
363 "The purpose of this page is to track performane trend and regression through the last 50 Jenkins " +
364 "nightly builds on a subset of the full performance evaluation metrics. Child pages contain full " +
365 "result details on the latest build. Note that results in this tracking may fluctuate from build to " +
366 "build, due to various experiments and changes made in ONOS." +
367 "</p>"
368
369 testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=3441823"
370 testPlanHTML = "<p>For test details, check out the <a href=\"" + testPlanLink + "\">test plans for Scale-Out and Performance</a>.</p>"
371
372 graphsPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/SCPF_Front_Page_"
373
374 testLinkPrefix = "https://wiki.onosproject.org/display/ONOS/"
375 graphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
376
377 switchPortLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+A%26B+-+Topology+%28Switch,+Link%29+Event+Latency"
378 switchLatencyGraphs = [ graphsPrefix + "Switch_Latency_Test_-_Switch_Up_onos-" + onos_v + "_50-dates_graph.jpg",
379 graphsPrefix + "Switch_Latency_Test_-_Switch_Down_onos-" + onos_v + "_50-dates_graph.jpg" ]
380
381 portLatencyGraphs = [ graphsPrefix + "Port_Latency_Test_-_Port_Down_onos-" + onos_v + "_50-dates_graph.jpg",
382 graphsPrefix + "Port_Latency_Test_-_Port_Up_onos-" + onos_v + "_50-dates_graph.jpg" ]
383
384 intentLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+C+-+Intent+Install%2FRemove%2FRe-route+Latency"
385 intentLatencyGraphs = [ graphsPrefix + "Intent_Installation_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
386 graphsPrefix + "Intent_Withdrawal_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
387 graphsPrefix + "Intent_Reroute_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
388
389 intentThroughputLink = testLinkPrefix + onos_v + "%3A+Experiment+D+-+Intents+Operations+Throughput"
390 intentThroughputGraphs = [ graphsPrefix + "Intent_Throughput_Test_-_neighbors=0_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ,
391 graphsPrefix + "Intent_Throughput_Test_-_neighbors=4_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg"]
392
393 scaleTopoLink = testLinkPrefix + onos_v + "%3A+Experiment+E+-+Topology+Scaling+Operation"
394 scaleTopoGraphs = [ graphsPrefix + "Scale_Topology_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
395
396 flowTpLink = testLinkPrefix + onos_v + "%3A+Experiment+F+-+Flow+Subsystem+Burst+Throughput"
397 flowTpGraphs = [ graphsPrefix + "Flow_Throughput_Test_-_neighbors=0_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
398 graphsPrefix + "Flow_Throughput_Test_-_neighbors=4_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
399
400 cbenchLink = testLinkPrefix + onos_v + "%3A+Experiment+G+-+Single-node+ONOS+Cbench"
401 cbenchGraphs = [ graphsPrefix + "Cbench_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
402
403 batchFlowLink = testLinkPrefix + onos_v + "%3A+Experiment+I+-+Single+Bench+Flow+Latency+Test"
404 batchFlowGraphs = [ graphsPrefix + "Batch_Flow_Test_-_Post_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
405 graphsPrefix + "Batch_Flow_Test_-_Del_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
406
407 hostAddLink = testLinkPrefix + onos_v + "%3A+Experiment+L+-+Host+Add+Latency"
408 hostAddLatencyGraphs = [ graphsPrefix + "Host_Latency_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
409
410 mastershipFailoverLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+M+-+Mastership+Failover+Latency"
411 mastershipFailoverLatencyGraphs = [ graphsPrefix + "Mastership_Failover_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
412
413 // Create the HTML for the SCPF page
414
415 switchLatencyHTML = "<h3><a href=\"" + switchPortLatencyLink + "\">Switch Latency</a>: Last 50 Builds - \"SwitchUp\" and \"SwitchDown\" Latency Tests</h3>" +
416 "<ul><li><h3>5-Node Cluster</h3></li></ul>" +
417 makeImage( graphsClass, switchLatencyGraphs[ 0 ], 500 ) +
418 makeImage( graphsClass, switchLatencyGraphs[ 1 ], 500 )
419
420 portLatencyHTML = "<h3><a href=\"" + switchPortLatencyLink + "\">Port Latency</a>: Last 50 Builds - \"PortUp\" and \"PortDown\" Latency Tests</h3>" +
421 "<ul><li><h3>5-Node Cluster</h3></li></ul>" +
422 makeImage( graphsClass, portLatencyGraphs[ 0 ], 500 ) +
423 makeImage( graphsClass, portLatencyGraphs[ 1 ], 500 )
424
425 intentLatencyHTML = "<h3><a href=\"" + intentLatencyLink + "\">Intent Latency</a>: Last 50 Builds - \"IntentInstallLat\", \"IntentWithdrawLat\" and \"IntentRerouteLat\"Tests</h3>" +
426 "<ul>" +
427 "<li><h3>5-Node Cluster</h3></li>" +
428 "<li><h3>100 Intent Batch Size</h3></li>" +
429 "</ul>" +
430 makeImage( graphsClass, intentLatencyGraphs[ 0 ], 500 ) +
431 makeImage( graphsClass, intentLatencyGraphs[ 1 ], 500 ) +
432 makeImage( graphsClass, intentLatencyGraphs[ 2 ], 500 )
433
434 intentThroughputHTML = "<h3><a href=\"" + intentThroughputLink + "\">Intent Latency</a>: Last 50 Builds - \"IntentEventTP\" Test</h3>" +
435 "<ul>" +
436 "<li><h3>5-Node Cluster</h3></li>" +
437 "</ul>" +
438 makeImage( graphsClass, intentThroughputGraphs[ 0 ], 500 ) +
439 makeImage( graphsClass, intentThroughputGraphs[ 1 ], 500 )
440
441 scaleTopoHTML = "<h3><a href=\"" + scaleTopoLink + "\">Scale Topo Test</a>: Last 50 Builds - \"scaleTopo\" Test</h3>" +
442 "<ul>" +
443 "<li><h3>3-Node Cluster</h3></li>" +
444 "<li><h3>20 Scaling</h3></li>" +
445 "</ul>" +
446 makeImage( graphsClass, scaleTopoGraphs[ 0 ], 500 )
447
448 flowThroughputHTML = "<h3><a href=\"" + flowTpLink + "\">Flow Throughput</a>: Last 50 Builds - \"flowTP1g\" Test</h3>" +
449 "<ul>" +
450 "<li><h3>5-Node Cluster</h3></li>" +
451 "</ul>" +
452 makeImage( graphsClass, flowTpGraphs[ 0 ], 500 ) +
453 makeImage( graphsClass, flowTpGraphs[ 1 ], 500 )
454
455 cbenchHTML = "<h3><a href=\"" + cbenchLink + "\">Cbench</a>: Last 50 Builds - \"CbenchBM\" Test</h3>" +
456 "<ul>" +
457 "<li><h3>Single-Node</h3></li>" +
458 "<li><h3>Throughput Mode</h3></li>" +
459 "</ul>" +
460 makeImage( graphsClass, cbenchGraphs[ 0 ], 500 )
461
462 batchFlowHTML = "<h3><a href=\"" + batchFlowLink + "\">Single Bench Flow Latency Test</a>: Last 50 Builds - \"SingleBenchFlow\" Latency Test</h3>" +
463 makeImage( graphsClass, batchFlowGraphs[ 0 ], 500 ) +
464 makeImage( graphsClass, batchFlowGraphs[ 1 ], 500 )
465
466 hostAddHTML = "<h3><a href=\"" + hostAddLink + "\">Host Add Latency</a>: Last 50 Builds - \"HostAddLatency\" Test</h3>" +
467 "<ul>" +
468 "<li><h3>5-Node Cluster</h3></li>" +
469 "</ul>" +
470 makeImage( graphsClass, hostAddLatencyGraphs[ 0 ], 500 )
471
472 mastershipFailoverLatencyHTML = "<h3><a href=\"" + mastershipFailoverLatencyLink + "\">Mastership Failover Latency</a>: Last 50 Builds - \"MastershipFailoverLat\" Test</h3>" +
473 "<ul>" +
474 "<li><h3>5-Node Cluster</h3></li>" +
475 "</ul>" +
476 makeImage( graphsClass, mastershipFailoverLatencyGraphs[ 0 ], 500 )
477
478 result = descriptionHTML +
479 testPlanHTML +
480 switchLatencyHTML +
481 portLatencyHTML +
482 intentLatencyHTML +
483 intentThroughputHTML +
484 scaleTopoHTML +
485 flowThroughputHTML +
486 cbenchHTML +
487 batchFlowHTML +
488 hostAddHTML +
489 mastershipFailoverLatencyHTML
490
491 return result
492}
493
494def makeSCPFInfoSection( title, list ){
495 result = "<p>" + title + ":</p><ul>"
496 for ( String app in list ){
497 result += "<li>" + app + "</li>"
498 }
499 result += "</ul>"
500 return result
501}
502
503def makeSCPFindividualGraphs( graphsList ){
504 result = ""
505 graphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
506 for ( String graph in graphsList ){
507 result += makeImage( graphsClass, graph, 500 )
508 }
509 return result
510}
511
512def makeSCPFnote( note ){
513 return "<p>" + note + "</p>"
514}
515
516def makeErrorBarsDisclaimer(){
517 return "<p>Note: Error bars in the graphs below represent standard deviations. Only the upper error bars are shown.</p>"
518}
519
520def makeOldFlowDisclaimer(){
521 return "<p>Following graphs include results using flow rule stores with both strong consistency and eventual consistency models. The ONOS team is still working on performance improvements for flow rule store with strong consistency.</p>"
522}
523
524def createSwitchPortLatPage(){
525 result = ""
526 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
527
528 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
529 "metrics",
530 "openflow" ] )
531
532 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxEvents 1",
533 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxBatchMs 0",
534 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxIdleMs 0" ] )
535
536 result += makeSCPFInfoSection( "Test Procedure", [ "Switch event generate on ONOS1 by connecting ovs switch to it.",
537 "Record tshark (tcp syn-ack) and graph event timestamp to calculate differences."] )
538
539 result += makeErrorBarsDisclaimer()
540
541 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
542 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFswitchLat_onos-" + onos_v + "_UpErrBarWithStack.jpg",
543 graphLinkPrefix + "SCPFswitchLat_onos-" + onos_v + "_DownErrBarWithStack.jpg",
544 graphLinkPrefix + "SCPFportLat_onos-" + onos_v + "_UpErrBarWithStack.jpg",
545 graphLinkPrefix + "SCPFportLat_onos-" + onos_v + "_DownErrBarWithStack.jpg" ] )
546
547 return result
548}
549
550def createIntentLatencyPage(){
551 result = ""
552 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
553
554 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
555 "null" ] )
556
557 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true (when using flow objective intents compiler)",
558 "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator defaultFlowObjectiveCompiler org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler (when using flow objective intents compiler)",
559 "cfg set org.onosproject.net.intent.impl.IntentManager skipReleaseResourcesOnWithdrawal true" ] )
560
561 result += makeSCPFInfoSection( "Test Procedure", [ "Intent batch installed from ONOS1",
562 "Record returned response time"] )
563
564 result += makeErrorBarsDisclaimer()
565 result += makeOldFlowDisclaimer()
566
567 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
568 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_1-batchSize_graph.jpg",
569 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_100-batchSize_graph.jpg",
570 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_1000-batchSize_graph.jpg",
571 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_1-batchSize_graph.jpg",
572 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_100-batchSize_graph.jpg",
573 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_1000-batchSize_graph.jpg" ] )
574
575 return result
576}
577
578def createIntentEventThroughputPage(){
579 result = ""
580 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
581
582 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
583 "null",
584 "intentpref" ] )
585
586 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.intent.impl.IntentManager skipReleaseResourcesOnWithdrawal true",
587 "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true (when using flow objective intents compiler)",
588 "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator defaultFlowObjectiveCompiler org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler (when using flow objective intents compiler)" ] )
589
590 result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "new NumKeys - 40000",
591 "with eventually consistent flow rule - 40000",
592 "with Flow Obj - 4000"] )
593
594 result += makeOldFlowDisclaimer()
595
596 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
597 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFintentEventTp_onos-" + onos_v + "_no-neighbors_OldFlow_graph.jpg",
598 graphLinkPrefix + "SCPFintentEventTp_onos-" + onos_v + "_all-neighbors_OldFlow_graph.jpg",
599 graphLinkPrefix + "SCPFintentEventTpWithFlowObj_onos-" + onos_v + "_no-neighbors_flowObj_OldFlow_graph.jpg",
600 graphLinkPrefix + "SCPFintentEventTpWithFlowObj_onos-" + onos_v + "_all-neighbors_flowObj_OldFlow_graph.jpg" ] )
601
602 return result
603}
604
605def createScaleTopoPage(){
606 result = ""
607 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
608
609 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
610 "openflow" ] )
611
612 result += makeSCPFnote( "Note: We use 3-node ONOS cluster and torus Mininet topology in this test. In the figure below, scale N on x-axis means N x N torus topology. (E.g. scale 5 means 25 switches and 100 links)" )
613
614 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
615 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFscaleTopo_onos-" + onos_v + "_graph.jpg" ] )
616
617 return result
618}
619
620def createFlowThroughputPage(){
621 result = ""
622 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
623
624 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
625 "null",
626 "demo" ] )
627
628 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.provider.nil.NullProviders deviceCount 35",
629 "cfg set org.onosproject.provider.nil.NullProviders topoShape linear",
630 "cfg set org.onosproject.provider.nil.NullProviders enabled true" ] )
631
632 result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "F = eventually consistent flows rule - 122500, 10000 with FlowObj - total # of flows installed",
633 "N: # of neighboring ONOS's for flows to be installed when ONOS1 is the server installing flows",
634 "S: #servers installing flows",
635 "SW = 35 - total # of switches (Null Devices) connected to ONOS cluster evenly distributed to active ONOS nodes",
636 "FL: # flows to be installed on each switch" ] )
637
638 result += makeSCPFInfoSection( "Command", [ "python3 \$ONOS_ROOT/tools/tests/bin/flow-tester.py -f FL -n N -s servers" ] )
639
640 result += makeErrorBarsDisclaimer()
641 result += makeOldFlowDisclaimer()
642
643 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
644 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFflowTp1g_onos-" + onos_v + "_no-neighbors_OldFlow_graph.jpg",
645 graphLinkPrefix + "SCPFflowTp1g_onos-" + onos_v + "_all-neighbors_OldFlow_graph.jpg",
646 graphLinkPrefix + "SCPFflowTp1gWithFlowObj_onos-" + onos_v + "_no-neighbors_flowObj_OldFlow_graph.jpg",
647 graphLinkPrefix + "SCPFflowTp1gWithFlowObj_onos-" + onos_v + "_all-neighbors_flowObj_OldFlow_graph.jpg" ] )
648
649 return result
650}
651
652def createCbenchPage(){
653 result = ""
654 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
655
656 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
657 "openflow-base",
658 "_OldFlow_DelGraph" ] )
659
660 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.fwd.ReactiveForwarding packetOutOnly true" ] )
661
662 result += makeErrorBarsDisclaimer()
663
664 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
665 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFcbench_onos-" + onos_v + "_errGraph.jpg" ] )
666
667 return result
668}
669
670def createBatchFlowPage(){
671 result = ""
672 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
673
674 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
675 "openflow-base" ] )
676
677 result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "batchSize = eventually consistent flows rule - 200" ] )
678
679 result += makeOldFlowDisclaimer()
680
681 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
682 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFbatchFlowResp_onos-" + onos_v + "_OldFlow_PostGraph.jpg",
683 graphLinkPrefix + "SCPFbatchFlowResp_onos-" + onos_v + "_OldFlow_DelGraph.jpg" ] )
684
685 return result
686}
687
688def createHostAddLatencyPage(){
689 result = ""
690
691 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
692
693 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
694 "metrics",
695 "openflow",
696 "proxyarp" ] )
697
698 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxEvents 1",
699 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxBatchMs 0",
700 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxIdleMs 0" ] )
701
702 result += makeErrorBarsDisclaimer()
703
704 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
705 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFhostLat_onos-" + onos_v + "_errGraph.jpg" ] )
706
707 return result
708}
709
710def createMastershipFailoverLatPage(){
711 result = ""
712
713 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
714
715 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
716 "openflow",
717 "events" ] )
718
719 result += makeErrorBarsDisclaimer()
720
721 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
722 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFmastershipFailoverLat_onos-" + onos_v + "_stackedGraph.jpg",
723 graphLinkPrefix + "SCPFmastershipFailoverLat_onos-" + onos_v + "_errGraph.jpg" ] )
724
725 return result
726}