blob: c8f06f38e454e7b279c4a8ce95b03e1938280df0 [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" ){
216 pTree += "<li><h3><a href=\"https://wiki.onosproject.org/display/ONOS/" onos_v + "-Segment+Routing" + "\">"
217 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
319 case "USECASE":
320 title = "USECASE"
321 testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=4163047"
322 testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
323 overallTrendHTML = ""
324 break
325 default:
326 echo "Invalid category: " + category
327 return
328 }
329
330 titleHTML = "<h1>Test Results - " + title + "</h1>"
331
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700332 testsFromCategory = test_list.getTestsFromCategory( category )
333 pageTreeHTML = pageTree( category, testsFromCategory )
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700334
335 descriptionHTML = "<p>For test details, check out the <a href=\"" + testPlanLink + "\">test plans for " + category + " test cases</a>.</p>"
336
337 // get the image links for all category tests
338 testTrendSuffix = "_onos-" + onos_v + "_20-builds_graph.jpg"
339
340 testGraphsHTML = ""
341 testGraphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700342
343
344 for ( String key in testsFromCategory.keySet() ){
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700345 imageLink = testTrendPrefix + key + testTrendSuffix
346 testGraphsHTML += makeImage( testGraphsClass, imageLink, 500 )
347 }
Jeremy Ronquillod1833522019-05-06 16:51:59 -0700348 result = overallTrendHTML + titleHTML + pageTreeHTML + descriptionHTML + testGraphsHTML
349
350 return result
351}
352
353def createSCPFpageContents(){
354 result = ""
355
356 descriptionHTML = "<p>" +
357 "The purpose of this page is to track performane trend and regression through the last 50 Jenkins " +
358 "nightly builds on a subset of the full performance evaluation metrics. Child pages contain full " +
359 "result details on the latest build. Note that results in this tracking may fluctuate from build to " +
360 "build, due to various experiments and changes made in ONOS." +
361 "</p>"
362
363 testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=3441823"
364 testPlanHTML = "<p>For test details, check out the <a href=\"" + testPlanLink + "\">test plans for Scale-Out and Performance</a>.</p>"
365
366 graphsPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/SCPF_Front_Page_"
367
368 testLinkPrefix = "https://wiki.onosproject.org/display/ONOS/"
369 graphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
370
371 switchPortLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+A%26B+-+Topology+%28Switch,+Link%29+Event+Latency"
372 switchLatencyGraphs = [ graphsPrefix + "Switch_Latency_Test_-_Switch_Up_onos-" + onos_v + "_50-dates_graph.jpg",
373 graphsPrefix + "Switch_Latency_Test_-_Switch_Down_onos-" + onos_v + "_50-dates_graph.jpg" ]
374
375 portLatencyGraphs = [ graphsPrefix + "Port_Latency_Test_-_Port_Down_onos-" + onos_v + "_50-dates_graph.jpg",
376 graphsPrefix + "Port_Latency_Test_-_Port_Up_onos-" + onos_v + "_50-dates_graph.jpg" ]
377
378 intentLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+C+-+Intent+Install%2FRemove%2FRe-route+Latency"
379 intentLatencyGraphs = [ graphsPrefix + "Intent_Installation_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
380 graphsPrefix + "Intent_Withdrawal_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
381 graphsPrefix + "Intent_Reroute_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
382
383 intentThroughputLink = testLinkPrefix + onos_v + "%3A+Experiment+D+-+Intents+Operations+Throughput"
384 intentThroughputGraphs = [ graphsPrefix + "Intent_Throughput_Test_-_neighbors=0_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ,
385 graphsPrefix + "Intent_Throughput_Test_-_neighbors=4_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg"]
386
387 scaleTopoLink = testLinkPrefix + onos_v + "%3A+Experiment+E+-+Topology+Scaling+Operation"
388 scaleTopoGraphs = [ graphsPrefix + "Scale_Topology_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
389
390 flowTpLink = testLinkPrefix + onos_v + "%3A+Experiment+F+-+Flow+Subsystem+Burst+Throughput"
391 flowTpGraphs = [ graphsPrefix + "Flow_Throughput_Test_-_neighbors=0_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
392 graphsPrefix + "Flow_Throughput_Test_-_neighbors=4_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
393
394 cbenchLink = testLinkPrefix + onos_v + "%3A+Experiment+G+-+Single-node+ONOS+Cbench"
395 cbenchGraphs = [ graphsPrefix + "Cbench_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
396
397 batchFlowLink = testLinkPrefix + onos_v + "%3A+Experiment+I+-+Single+Bench+Flow+Latency+Test"
398 batchFlowGraphs = [ graphsPrefix + "Batch_Flow_Test_-_Post_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
399 graphsPrefix + "Batch_Flow_Test_-_Del_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
400
401 hostAddLink = testLinkPrefix + onos_v + "%3A+Experiment+L+-+Host+Add+Latency"
402 hostAddLatencyGraphs = [ graphsPrefix + "Host_Latency_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
403
404 mastershipFailoverLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+M+-+Mastership+Failover+Latency"
405 mastershipFailoverLatencyGraphs = [ graphsPrefix + "Mastership_Failover_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
406
407 // Create the HTML for the SCPF page
408
409 switchLatencyHTML = "<h3><a href=\"" + switchPortLatencyLink + "\">Switch Latency</a>: Last 50 Builds - \"SwitchUp\" and \"SwitchDown\" Latency Tests</h3>" +
410 "<ul><li><h3>5-Node Cluster</h3></li></ul>" +
411 makeImage( graphsClass, switchLatencyGraphs[ 0 ], 500 ) +
412 makeImage( graphsClass, switchLatencyGraphs[ 1 ], 500 )
413
414 portLatencyHTML = "<h3><a href=\"" + switchPortLatencyLink + "\">Port Latency</a>: Last 50 Builds - \"PortUp\" and \"PortDown\" Latency Tests</h3>" +
415 "<ul><li><h3>5-Node Cluster</h3></li></ul>" +
416 makeImage( graphsClass, portLatencyGraphs[ 0 ], 500 ) +
417 makeImage( graphsClass, portLatencyGraphs[ 1 ], 500 )
418
419 intentLatencyHTML = "<h3><a href=\"" + intentLatencyLink + "\">Intent Latency</a>: Last 50 Builds - \"IntentInstallLat\", \"IntentWithdrawLat\" and \"IntentRerouteLat\"Tests</h3>" +
420 "<ul>" +
421 "<li><h3>5-Node Cluster</h3></li>" +
422 "<li><h3>100 Intent Batch Size</h3></li>" +
423 "</ul>" +
424 makeImage( graphsClass, intentLatencyGraphs[ 0 ], 500 ) +
425 makeImage( graphsClass, intentLatencyGraphs[ 1 ], 500 ) +
426 makeImage( graphsClass, intentLatencyGraphs[ 2 ], 500 )
427
428 intentThroughputHTML = "<h3><a href=\"" + intentThroughputLink + "\">Intent Latency</a>: Last 50 Builds - \"IntentEventTP\" Test</h3>" +
429 "<ul>" +
430 "<li><h3>5-Node Cluster</h3></li>" +
431 "</ul>" +
432 makeImage( graphsClass, intentThroughputGraphs[ 0 ], 500 ) +
433 makeImage( graphsClass, intentThroughputGraphs[ 1 ], 500 )
434
435 scaleTopoHTML = "<h3><a href=\"" + scaleTopoLink + "\">Scale Topo Test</a>: Last 50 Builds - \"scaleTopo\" Test</h3>" +
436 "<ul>" +
437 "<li><h3>3-Node Cluster</h3></li>" +
438 "<li><h3>20 Scaling</h3></li>" +
439 "</ul>" +
440 makeImage( graphsClass, scaleTopoGraphs[ 0 ], 500 )
441
442 flowThroughputHTML = "<h3><a href=\"" + flowTpLink + "\">Flow Throughput</a>: Last 50 Builds - \"flowTP1g\" Test</h3>" +
443 "<ul>" +
444 "<li><h3>5-Node Cluster</h3></li>" +
445 "</ul>" +
446 makeImage( graphsClass, flowTpGraphs[ 0 ], 500 ) +
447 makeImage( graphsClass, flowTpGraphs[ 1 ], 500 )
448
449 cbenchHTML = "<h3><a href=\"" + cbenchLink + "\">Cbench</a>: Last 50 Builds - \"CbenchBM\" Test</h3>" +
450 "<ul>" +
451 "<li><h3>Single-Node</h3></li>" +
452 "<li><h3>Throughput Mode</h3></li>" +
453 "</ul>" +
454 makeImage( graphsClass, cbenchGraphs[ 0 ], 500 )
455
456 batchFlowHTML = "<h3><a href=\"" + batchFlowLink + "\">Single Bench Flow Latency Test</a>: Last 50 Builds - \"SingleBenchFlow\" Latency Test</h3>" +
457 makeImage( graphsClass, batchFlowGraphs[ 0 ], 500 ) +
458 makeImage( graphsClass, batchFlowGraphs[ 1 ], 500 )
459
460 hostAddHTML = "<h3><a href=\"" + hostAddLink + "\">Host Add Latency</a>: Last 50 Builds - \"HostAddLatency\" Test</h3>" +
461 "<ul>" +
462 "<li><h3>5-Node Cluster</h3></li>" +
463 "</ul>" +
464 makeImage( graphsClass, hostAddLatencyGraphs[ 0 ], 500 )
465
466 mastershipFailoverLatencyHTML = "<h3><a href=\"" + mastershipFailoverLatencyLink + "\">Mastership Failover Latency</a>: Last 50 Builds - \"MastershipFailoverLat\" Test</h3>" +
467 "<ul>" +
468 "<li><h3>5-Node Cluster</h3></li>" +
469 "</ul>" +
470 makeImage( graphsClass, mastershipFailoverLatencyGraphs[ 0 ], 500 )
471
472 result = descriptionHTML +
473 testPlanHTML +
474 switchLatencyHTML +
475 portLatencyHTML +
476 intentLatencyHTML +
477 intentThroughputHTML +
478 scaleTopoHTML +
479 flowThroughputHTML +
480 cbenchHTML +
481 batchFlowHTML +
482 hostAddHTML +
483 mastershipFailoverLatencyHTML
484
485 return result
486}
487
488def makeSCPFInfoSection( title, list ){
489 result = "<p>" + title + ":</p><ul>"
490 for ( String app in list ){
491 result += "<li>" + app + "</li>"
492 }
493 result += "</ul>"
494 return result
495}
496
497def makeSCPFindividualGraphs( graphsList ){
498 result = ""
499 graphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
500 for ( String graph in graphsList ){
501 result += makeImage( graphsClass, graph, 500 )
502 }
503 return result
504}
505
506def makeSCPFnote( note ){
507 return "<p>" + note + "</p>"
508}
509
510def makeErrorBarsDisclaimer(){
511 return "<p>Note: Error bars in the graphs below represent standard deviations. Only the upper error bars are shown.</p>"
512}
513
514def makeOldFlowDisclaimer(){
515 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>"
516}
517
518def createSwitchPortLatPage(){
519 result = ""
520 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
521
522 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
523 "metrics",
524 "openflow" ] )
525
526 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxEvents 1",
527 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxBatchMs 0",
528 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxIdleMs 0" ] )
529
530 result += makeSCPFInfoSection( "Test Procedure", [ "Switch event generate on ONOS1 by connecting ovs switch to it.",
531 "Record tshark (tcp syn-ack) and graph event timestamp to calculate differences."] )
532
533 result += makeErrorBarsDisclaimer()
534
535 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
536 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFswitchLat_onos-" + onos_v + "_UpErrBarWithStack.jpg",
537 graphLinkPrefix + "SCPFswitchLat_onos-" + onos_v + "_DownErrBarWithStack.jpg",
538 graphLinkPrefix + "SCPFportLat_onos-" + onos_v + "_UpErrBarWithStack.jpg",
539 graphLinkPrefix + "SCPFportLat_onos-" + onos_v + "_DownErrBarWithStack.jpg" ] )
540
541 return result
542}
543
544def createIntentLatencyPage(){
545 result = ""
546 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
547
548 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
549 "null" ] )
550
551 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true (when using flow objective intents compiler)",
552 "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator defaultFlowObjectiveCompiler org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler (when using flow objective intents compiler)",
553 "cfg set org.onosproject.net.intent.impl.IntentManager skipReleaseResourcesOnWithdrawal true" ] )
554
555 result += makeSCPFInfoSection( "Test Procedure", [ "Intent batch installed from ONOS1",
556 "Record returned response time"] )
557
558 result += makeErrorBarsDisclaimer()
559 result += makeOldFlowDisclaimer()
560
561 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
562 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_1-batchSize_graph.jpg",
563 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_100-batchSize_graph.jpg",
564 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_1000-batchSize_graph.jpg",
565 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_1-batchSize_graph.jpg",
566 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_100-batchSize_graph.jpg",
567 graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_1000-batchSize_graph.jpg" ] )
568
569 return result
570}
571
572def createIntentEventThroughputPage(){
573 result = ""
574 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
575
576 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
577 "null",
578 "intentpref" ] )
579
580 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.intent.impl.IntentManager skipReleaseResourcesOnWithdrawal true",
581 "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true (when using flow objective intents compiler)",
582 "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator defaultFlowObjectiveCompiler org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler (when using flow objective intents compiler)" ] )
583
584 result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "new NumKeys - 40000",
585 "with eventually consistent flow rule - 40000",
586 "with Flow Obj - 4000"] )
587
588 result += makeOldFlowDisclaimer()
589
590 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
591 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFintentEventTp_onos-" + onos_v + "_no-neighbors_OldFlow_graph.jpg",
592 graphLinkPrefix + "SCPFintentEventTp_onos-" + onos_v + "_all-neighbors_OldFlow_graph.jpg",
593 graphLinkPrefix + "SCPFintentEventTpWithFlowObj_onos-" + onos_v + "_no-neighbors_flowObj_OldFlow_graph.jpg",
594 graphLinkPrefix + "SCPFintentEventTpWithFlowObj_onos-" + onos_v + "_all-neighbors_flowObj_OldFlow_graph.jpg" ] )
595
596 return result
597}
598
599def createScaleTopoPage(){
600 result = ""
601 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
602
603 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
604 "openflow" ] )
605
606 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)" )
607
608 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
609 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFscaleTopo_onos-" + onos_v + "_graph.jpg" ] )
610
611 return result
612}
613
614def createFlowThroughputPage(){
615 result = ""
616 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
617
618 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
619 "null",
620 "demo" ] )
621
622 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.provider.nil.NullProviders deviceCount 35",
623 "cfg set org.onosproject.provider.nil.NullProviders topoShape linear",
624 "cfg set org.onosproject.provider.nil.NullProviders enabled true" ] )
625
626 result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "F = eventually consistent flows rule - 122500, 10000 with FlowObj - total # of flows installed",
627 "N: # of neighboring ONOS's for flows to be installed when ONOS1 is the server installing flows",
628 "S: #servers installing flows",
629 "SW = 35 - total # of switches (Null Devices) connected to ONOS cluster evenly distributed to active ONOS nodes",
630 "FL: # flows to be installed on each switch" ] )
631
632 result += makeSCPFInfoSection( "Command", [ "python3 \$ONOS_ROOT/tools/tests/bin/flow-tester.py -f FL -n N -s servers" ] )
633
634 result += makeErrorBarsDisclaimer()
635 result += makeOldFlowDisclaimer()
636
637 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
638 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFflowTp1g_onos-" + onos_v + "_no-neighbors_OldFlow_graph.jpg",
639 graphLinkPrefix + "SCPFflowTp1g_onos-" + onos_v + "_all-neighbors_OldFlow_graph.jpg",
640 graphLinkPrefix + "SCPFflowTp1gWithFlowObj_onos-" + onos_v + "_no-neighbors_flowObj_OldFlow_graph.jpg",
641 graphLinkPrefix + "SCPFflowTp1gWithFlowObj_onos-" + onos_v + "_all-neighbors_flowObj_OldFlow_graph.jpg" ] )
642
643 return result
644}
645
646def createCbenchPage(){
647 result = ""
648 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
649
650 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
651 "openflow-base",
652 "_OldFlow_DelGraph" ] )
653
654 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.fwd.ReactiveForwarding packetOutOnly true" ] )
655
656 result += makeErrorBarsDisclaimer()
657
658 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
659 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFcbench_onos-" + onos_v + "_errGraph.jpg" ] )
660
661 return result
662}
663
664def createBatchFlowPage(){
665 result = ""
666 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
667
668 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
669 "openflow-base" ] )
670
671 result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "batchSize = eventually consistent flows rule - 200" ] )
672
673 result += makeOldFlowDisclaimer()
674
675 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
676 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFbatchFlowResp_onos-" + onos_v + "_OldFlow_PostGraph.jpg",
677 graphLinkPrefix + "SCPFbatchFlowResp_onos-" + onos_v + "_OldFlow_DelGraph.jpg" ] )
678
679 return result
680}
681
682def createHostAddLatencyPage(){
683 result = ""
684
685 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
686
687 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
688 "metrics",
689 "openflow",
690 "proxyarp" ] )
691
692 result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxEvents 1",
693 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxBatchMs 0",
694 "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxIdleMs 0" ] )
695
696 result += makeErrorBarsDisclaimer()
697
698 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
699 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFhostLat_onos-" + onos_v + "_errGraph.jpg" ] )
700
701 return result
702}
703
704def createMastershipFailoverLatPage(){
705 result = ""
706
707 result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
708
709 result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
710 "openflow",
711 "events" ] )
712
713 result += makeErrorBarsDisclaimer()
714
715 graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
716 result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFmastershipFailoverLat_onos-" + onos_v + "_stackedGraph.jpg",
717 graphLinkPrefix + "SCPFmastershipFailoverLat_onos-" + onos_v + "_errGraph.jpg" ] )
718
719 return result
720}