blob: 2f7e51d853b5cab53857b548ef5370d8b6d30cc6 [file] [log] [blame]
#!groovy
// Copyright 2019 Open Networking Foundation (ONF)
//
// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
//
// TestON is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// TestON is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with TestON. If not, see <http://www.gnu.org/licenses/>.
// When there is a new version of ONOS about to release, run this job to create all necessary
// test result wiki pages.
//
// In order to create the sub-pages, you need to know the page IDs of the parent pages; for
// example, if you want to generate the test category pages, you will need the page ID
// of the top level branch results.
test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
test_list.init()
runningNode = "QA"
// set default onos_v to be current_version.
// onos_v needs to be in the format #.##, do not include "ONOS" or "onos"
wikiTestResultsPageID = 1048618
onos_v = params.version
onos_bird = params.bird
top_level_page_id = params.top_level_page_id.toInteger()
FUNC_page_id = params.FUNC_page_id.toInteger()
HA_page_id = params.HA_page_id.toInteger()
SCPF_page_id = params.SCPF_page_id.toInteger()
USECASE_page_id = params.USECASE_page_id.toInteger()
SR_page_id = params.SR_page_id.toInteger()
onos_branch = "ONOS-" + onos_v
SCPF_system_environment = [ "Server: Dual XeonE5-2670 v2 2.5GHz; 64GB DDR3; 512GB SSD",
"System clock precision is +/- 1 ms",
"1Gbps NIC",
"JAVA_OPTS=\"\${JAVA_OPTS:--Xms8G -Xmx8G}\"" ]
// get the name of the job.
jobName = env.JOB_NAME
String[] pagesToPublish = []
String[] pageNames = []
parentID = -1
pageIDProvided = false
if ( top_level_page_id > -1 ){
pageNames += onos_v + "-CHO"
pagesToPublish += createCHOpageContents()
pageNames += onos_v + "-Functionality"
pagesToPublish += createGeneralPageContents( "FUNC" )
pageNames += onos_v + "-HA"
pagesToPublish += createGeneralPageContents( "HA" )
pageNames += onos_v + "-Performance and Scale-out"
pagesToPublish += createSCPFpageContents()
pageNames += onos_v + "-USECASE"
pagesToPublish += createGeneralPageContents( "USECASE" )
// pagesToPublish += createGeneralPageContents( "SRHA" )
parentID = top_level_page_id
pageIDProvided = true
}
if ( FUNC_page_id > -1 ){
pageNames += createIndividualPagesNames( "FUNC" )
pagesToPublish += createIndividualPagesContents( "FUNC" )
parentID = FUNC_page_id
pageIDProvided = true
}
if ( HA_page_id > -1 ){
pageNames += createIndividualPagesNames( "HA" )
pagesToPublish += createIndividualPagesContents( "HA" )
parentID = HA_page_id
pageIDProvided = true
}
if ( SCPF_page_id > -1 ){
pageNames += onos_v + ": Experiment A&B - Topology (Switch, Link) Event Latency"
pagesToPublish += createSwitchPortLatPage()
pageNames += onos_v + ": Experiment C - Intent Install/Remove/Re-route Latency"
pagesToPublish += createIntentLatencyPage()
pageNames += onos_v + ": Experiment D - Intents Operations Throughput"
pagesToPublish += createIntentEventThroughputPage()
pageNames += onos_v + ": Experiment E - Topology Scaling Operation"
pagesToPublish += createScaleTopoPage()
pageNames += onos_v + ": Experiment F - Flow Subsystem Burst Throughput"
pagesToPublish += createFlowThroughputPage()
pageNames += onos_v + ": Experiment G - Single-node ONOS Cbench"
pagesToPublish += createCbenchPage()
pageNames += onos_v + ": Experiment I - Single Bench Flow Latency Test"
pagesToPublish += createBatchFlowPage()
pageNames += onos_v + ": Experiment L - Host Add Latency"
pagesToPublish += createHostAddLatencyPage()
pageNames += onos_v + ": Experiment M - Mastership Failover Latency"
pagesToPublish += createMastershipFailoverLatPage()
parentID = SCPF_page_id
pageIDProvided = true
}
if ( USECASE_page_id > -1 ){
pageNames += onos_v + "-Segment Routing"
pagesToPublish += createGeneralPageContents( "SR" )
pageNames += createIndividualPagesNames( "USECASE" )
pagesToPublish += createIndividualPagesContents( "USECASE" )
parentID = USECASE_page_id
pageIDProvided = true
}
if ( SR_page_id > -1 ){
pageNames += createIndividualPagesNames( "SR" )
pagesToPublish += createIndividualPagesContents( "SR" )
parentID = SR_page_id
pageIDProvided = true
}
if ( !pageIDProvided ){
pageNames += "ONOS-" + onos_v + " (" + onos_bird + ")"
pagesToPublish += createTopLevelPageContents()
parentID = wikiTestResultsPageID
}
echoForDebug( pageNames, pagesToPublish )
node ( label: runningNode ) {
for ( i in 0..pagesToPublish.length - 1 ){
publishToConfluence( pageNames[ i ], pagesToPublish[ i ], parentID )
}
}
def createIndividualPagesNames( category ){
result = []
testsFromCategory = test_list.getTestsFromCategory( category )
for ( String test in testsFromCategory.keySet() ){
result += onos_v + "-" + testsFromCategory[ test ][ "wikiName" ]
}
return result
}
def createIndividualPagesContents( category ){
result = []
testsFromCategory = test_list.getTestsFromCategory( category )
for ( String test in testsFromCategory.keySet() ){
result += "<p>This test has not run on ONOS-" + onos_v + " yet. Please check again on a later date.</p>"
}
return result
}
def publishToConfluence( pageName, contents, parentID ){
// publish HTML script to wiki confluence
// isPostResult : string "true" "false"
// file : name of the file to be published
if ( parentID > -1 ){
publishConfluence siteName: 'wiki.onosproject.org', pageName: pageName, spaceName: 'ONOS',
attachArchivedArtifacts: true, buildIfUnstable: true, parentId: parentID,
editorList: [ confluenceWritePage( confluenceText( contents ) ) ]
} else {
publishConfluence siteName: 'wiki.onosproject.org', pageName: pageName, spaceName: 'ONOS',
attachArchivedArtifacts: true, buildIfUnstable: true,
editorList: [ confluenceWritePage( confluenceText( contents ) ) ]
}
}
def echoForDebug( pageNames, pagesToPublish ){
for ( i in 0..pagesToPublish.length - 1 ){
echo pageNames[ i ]
echo pagesToPublish[ i ]
}
}
def makeImage( imageClass, imageLink, width=-1 ){
if ( width == -1 ){
return "<p><img class=\"" + imageClass + "\" src=\"" + imageLink + "\" data-image-src=\"" + imageLink + "\"></img></p>"
} else {
return "<p><img class=\"" + imageClass + "\" width=\"" + width + "\" src=\"" + imageLink + "\" data-image-src=\"" + imageLink + "\"></img></p>"
}
}
def pageTree( category, testsFromCategory ){
pTree = "<ul>"
if ( category == "USECASE" ){
pTree += "<li><h3><a href=\"https://wiki.onosproject.org/display/ONOS/" + onos_v + "-Segment+Routing" + "\">"
pTree += "2.2-Segment Routing" + "</a></h3></li>"
}
for ( String test in testsFromCategory.keySet() ){
testTitle = onos_v + "-" + testsFromCategory[ test ][ "wikiName" ]
pTree += "<li><h3><a href=\"https://wiki.onosproject.org/display/ONOS/" + testTitle + "\">"
pTree += testTitle + "</a></h3></li>"
}
pTree += "</ul>"
return pTree
}
def createTopLevelPageContents(){
result = ""
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-VM/lastSuccessfulBuild/artifact/ALL_onos-" + onos_v + "_build-latest_"
executed = graphLinkPrefix + "executed_pieChart.jpg"
passfail = graphLinkPrefix + "passfail_pieChart.jpg"
ts_summary = graphLinkPrefix + "test-suite-summary.jpg"
imageClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
imagesHTML = makeImage( imageClass, executed, 400 ) +
makeImage( imageClass, passfail, 400 ) +
makeImage( imageClass, ts_summary, 500 )
pTreeLinkPrefix = "https://wiki.onosproject.org/display/ONOS/"
pTreeHTML = "<ul>" +
"<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-CHO" + "\">" + onos_v + "-CHO" + "</a></h3></li>" +
"<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-Functionality" + "\">" + onos_v + "-Functionality" + "</a></h3></li>" +
"<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-HA" + "\">" + onos_v + "-HA" + "</a></h3></li>" +
"<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-Performance+and+Scale-out" + "\">" + onos_v + "-Performance and Scale-out" + "</a></h3></li>" +
"<li><h3><a href=\"" + pTreeLinkPrefix + onos_v + "-USECASE" + "\">" + onos_v + "-USECASE" + "</a></h3></li>" +
"</ul>"
result = imagesHTML + pTreeHTML
return result
}
def createCHOpageContents(){
result = ""
testPlan = "https://wiki.onosproject.org/pages/viewpage.action?pageId=2131208"
description = "<p>ONOS Apps:</p>" +
"<ul>" +
"<li>drivers</li>" +
"<li>openflow</li>" +
"<li>segmentrouting</li>" +
"<li>fpm</li>" +
"<li>dhcprelay</li>" +
"<li>netcfghostprovider</li>" +
"<li>routeradvertisement</li>" +
"<li>t3</li>" +
"<li>hostprobingprovider</li>" +
"</ul>" +
"<p>Topology:</p>" +
"<ul>" +
"<li>H-AGG</li>" +
"</ul>" +
"<p>For more details, check out the <a href=\"" + testPlan + "\"> test plans for CHO</a><br /></p>"
CHOevents = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric5/lastSuccessfulBuild/artifact/CHO_Events_onos-" + onos_v + "_168-maxData_graph.jpg"
CHOfailures = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric5/lastSuccessfulBuild/artifact/CHO_Failure-Check_onos-" + onos_v + "_168-maxData_graph.jpg"
CHOerrors = "https://jenkins.onosproject.org/job/postjob-Fabric5/lastSuccessfulBuild/artifact/CHO_Errors_onos-" + onos_v + "_168-maxData_graph.jpg"
imageClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
images = makeImage( imageClass, CHOevents, 500 ) +
makeImage( imageClass, CHOfailures, 500 ) +
makeImage( imageClass, CHOerrors, 500 )
result = description + images
return result
}
def createGeneralPageContents( category ){
result = ""
overallTrendLink = "https://jenkins.onosproject.org/view/QA/job/postjob-VM/lastSuccessfulBuild/artifact/" + category + "_onos-" + onos_v + "_overview.jpg"
overallTrendClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
overallTrendHTML = makeImage( overallTrendClass, overallTrendLink, 500 )
testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-VM/lastSuccessfulBuild/artifact/"
switch ( category ){
case "FUNC":
title = "Functionality (FUNC)"
testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=1048600"
break
case "HA":
title = "High Availability (HA)"
testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=1048602"
break
case "SR":
title = "Segment Routing (SR)"
testPlanLink = "https://wiki.opencord.org/display/CORD/Test+Plan+-+Fabric+Control"
testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric3/lastSuccessfulBuild/artifact/"
overallTrendHTML = ""
break
case "SRHA":
title = "Segment Routing High Availability (SRHA)"
testPlanLink = "https://wiki.opencord.org/display/CORD/Test+Plan+-+Fabric+Control"
testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric3/lastSuccessfulBuild/artifact/"
overallTrendHTML = ""
break
case "SR-StratumBmv2":
title = "Segment Routing (SR) with Stratum BMv2 switches"
testPlanLink = "https://wiki.opencord.org/display/CORD/Test+Plan+-+Fabric+Control"
testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-Fabric3/lastSuccessfulBuild/artifact/"
overallTrendHTML = ""
break
case "USECASE":
title = "USECASE"
testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=4163047"
testTrendPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
overallTrendHTML = ""
break
default:
echo "Invalid category: " + category
return
}
titleHTML = "<h1>Test Results - " + title + "</h1>"
testsFromCategory = test_list.getTestsFromCategory( category )
pageTreeHTML = pageTree( category, testsFromCategory )
descriptionHTML = "<p>For test details, check out the <a href=\"" + testPlanLink + "\">test plans for " + category + " test cases</a>.</p>"
// get the image links for all category tests
testTrendSuffix = "_onos-" + onos_v + "_20-builds_graph.jpg"
testGraphsHTML = ""
testGraphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
for ( String key in testsFromCategory.keySet() ){
imageLink = testTrendPrefix + key + testTrendSuffix
testGraphsHTML += makeImage( testGraphsClass, imageLink, 500 )
}
result = overallTrendHTML + titleHTML + pageTreeHTML + descriptionHTML + testGraphsHTML
return result
}
def createSCPFpageContents(){
result = ""
descriptionHTML = "<p>" +
"The purpose of this page is to track performane trend and regression through the last 50 Jenkins " +
"nightly builds on a subset of the full performance evaluation metrics. Child pages contain full " +
"result details on the latest build. Note that results in this tracking may fluctuate from build to " +
"build, due to various experiments and changes made in ONOS." +
"</p>"
testPlanLink = "https://wiki.onosproject.org/pages/viewpage.action?pageId=3441823"
testPlanHTML = "<p>For test details, check out the <a href=\"" + testPlanLink + "\">test plans for Scale-Out and Performance</a>.</p>"
graphsPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/SCPF_Front_Page_"
testLinkPrefix = "https://wiki.onosproject.org/display/ONOS/"
graphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
switchPortLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+A%26B+-+Topology+%28Switch,+Link%29+Event+Latency"
switchLatencyGraphs = [ graphsPrefix + "Switch_Latency_Test_-_Switch_Up_onos-" + onos_v + "_50-dates_graph.jpg",
graphsPrefix + "Switch_Latency_Test_-_Switch_Down_onos-" + onos_v + "_50-dates_graph.jpg" ]
portLatencyGraphs = [ graphsPrefix + "Port_Latency_Test_-_Port_Down_onos-" + onos_v + "_50-dates_graph.jpg",
graphsPrefix + "Port_Latency_Test_-_Port_Up_onos-" + onos_v + "_50-dates_graph.jpg" ]
intentLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+C+-+Intent+Install%2FRemove%2FRe-route+Latency"
intentLatencyGraphs = [ graphsPrefix + "Intent_Installation_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
graphsPrefix + "Intent_Withdrawal_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
graphsPrefix + "Intent_Reroute_Test_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
intentThroughputLink = testLinkPrefix + onos_v + "%3A+Experiment+D+-+Intents+Operations+Throughput"
intentThroughputGraphs = [ graphsPrefix + "Intent_Throughput_Test_-_neighbors=0_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ,
graphsPrefix + "Intent_Throughput_Test_-_neighbors=4_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg"]
scaleTopoLink = testLinkPrefix + onos_v + "%3A+Experiment+E+-+Topology+Scaling+Operation"
scaleTopoGraphs = [ graphsPrefix + "Scale_Topology_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
flowTpLink = testLinkPrefix + onos_v + "%3A+Experiment+F+-+Flow+Subsystem+Burst+Throughput"
flowTpGraphs = [ graphsPrefix + "Flow_Throughput_Test_-_neighbors=0_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
graphsPrefix + "Flow_Throughput_Test_-_neighbors=4_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
cbenchLink = testLinkPrefix + onos_v + "%3A+Experiment+G+-+Single-node+ONOS+Cbench"
cbenchGraphs = [ graphsPrefix + "Cbench_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
batchFlowLink = testLinkPrefix + onos_v + "%3A+Experiment+I+-+Single+Bench+Flow+Latency+Test"
batchFlowGraphs = [ graphsPrefix + "Batch_Flow_Test_-_Post_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg",
graphsPrefix + "Batch_Flow_Test_-_Del_onos-" + onos_v + "_50-dates_OldFlow_graph.jpg" ]
hostAddLink = testLinkPrefix + onos_v + "%3A+Experiment+L+-+Host+Add+Latency"
hostAddLatencyGraphs = [ graphsPrefix + "Host_Latency_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
mastershipFailoverLatencyLink = testLinkPrefix + onos_v + "%3A+Experiment+M+-+Mastership+Failover+Latency"
mastershipFailoverLatencyGraphs = [ graphsPrefix + "Mastership_Failover_Test_onos-" + onos_v + "_50-dates_graph.jpg" ]
// Create the HTML for the SCPF page
switchLatencyHTML = "<h3><a href=\"" + switchPortLatencyLink + "\">Switch Latency</a>: Last 50 Builds - \"SwitchUp\" and \"SwitchDown\" Latency Tests</h3>" +
"<ul><li><h3>5-Node Cluster</h3></li></ul>" +
makeImage( graphsClass, switchLatencyGraphs[ 0 ], 500 ) +
makeImage( graphsClass, switchLatencyGraphs[ 1 ], 500 )
portLatencyHTML = "<h3><a href=\"" + switchPortLatencyLink + "\">Port Latency</a>: Last 50 Builds - \"PortUp\" and \"PortDown\" Latency Tests</h3>" +
"<ul><li><h3>5-Node Cluster</h3></li></ul>" +
makeImage( graphsClass, portLatencyGraphs[ 0 ], 500 ) +
makeImage( graphsClass, portLatencyGraphs[ 1 ], 500 )
intentLatencyHTML = "<h3><a href=\"" + intentLatencyLink + "\">Intent Latency</a>: Last 50 Builds - \"IntentInstallLat\", \"IntentWithdrawLat\" and \"IntentRerouteLat\"Tests</h3>" +
"<ul>" +
"<li><h3>5-Node Cluster</h3></li>" +
"<li><h3>100 Intent Batch Size</h3></li>" +
"</ul>" +
makeImage( graphsClass, intentLatencyGraphs[ 0 ], 500 ) +
makeImage( graphsClass, intentLatencyGraphs[ 1 ], 500 ) +
makeImage( graphsClass, intentLatencyGraphs[ 2 ], 500 )
intentThroughputHTML = "<h3><a href=\"" + intentThroughputLink + "\">Intent Latency</a>: Last 50 Builds - \"IntentEventTP\" Test</h3>" +
"<ul>" +
"<li><h3>5-Node Cluster</h3></li>" +
"</ul>" +
makeImage( graphsClass, intentThroughputGraphs[ 0 ], 500 ) +
makeImage( graphsClass, intentThroughputGraphs[ 1 ], 500 )
scaleTopoHTML = "<h3><a href=\"" + scaleTopoLink + "\">Scale Topo Test</a>: Last 50 Builds - \"scaleTopo\" Test</h3>" +
"<ul>" +
"<li><h3>3-Node Cluster</h3></li>" +
"<li><h3>20 Scaling</h3></li>" +
"</ul>" +
makeImage( graphsClass, scaleTopoGraphs[ 0 ], 500 )
flowThroughputHTML = "<h3><a href=\"" + flowTpLink + "\">Flow Throughput</a>: Last 50 Builds - \"flowTP1g\" Test</h3>" +
"<ul>" +
"<li><h3>5-Node Cluster</h3></li>" +
"</ul>" +
makeImage( graphsClass, flowTpGraphs[ 0 ], 500 ) +
makeImage( graphsClass, flowTpGraphs[ 1 ], 500 )
cbenchHTML = "<h3><a href=\"" + cbenchLink + "\">Cbench</a>: Last 50 Builds - \"CbenchBM\" Test</h3>" +
"<ul>" +
"<li><h3>Single-Node</h3></li>" +
"<li><h3>Throughput Mode</h3></li>" +
"</ul>" +
makeImage( graphsClass, cbenchGraphs[ 0 ], 500 )
batchFlowHTML = "<h3><a href=\"" + batchFlowLink + "\">Single Bench Flow Latency Test</a>: Last 50 Builds - \"SingleBenchFlow\" Latency Test</h3>" +
makeImage( graphsClass, batchFlowGraphs[ 0 ], 500 ) +
makeImage( graphsClass, batchFlowGraphs[ 1 ], 500 )
hostAddHTML = "<h3><a href=\"" + hostAddLink + "\">Host Add Latency</a>: Last 50 Builds - \"HostAddLatency\" Test</h3>" +
"<ul>" +
"<li><h3>5-Node Cluster</h3></li>" +
"</ul>" +
makeImage( graphsClass, hostAddLatencyGraphs[ 0 ], 500 )
mastershipFailoverLatencyHTML = "<h3><a href=\"" + mastershipFailoverLatencyLink + "\">Mastership Failover Latency</a>: Last 50 Builds - \"MastershipFailoverLat\" Test</h3>" +
"<ul>" +
"<li><h3>5-Node Cluster</h3></li>" +
"</ul>" +
makeImage( graphsClass, mastershipFailoverLatencyGraphs[ 0 ], 500 )
result = descriptionHTML +
testPlanHTML +
switchLatencyHTML +
portLatencyHTML +
intentLatencyHTML +
intentThroughputHTML +
scaleTopoHTML +
flowThroughputHTML +
cbenchHTML +
batchFlowHTML +
hostAddHTML +
mastershipFailoverLatencyHTML
return result
}
def makeSCPFInfoSection( title, list ){
result = "<p>" + title + ":</p><ul>"
for ( String app in list ){
result += "<li>" + app + "</li>"
}
result += "</ul>"
return result
}
def makeSCPFindividualGraphs( graphsList ){
result = ""
graphsClass = "confluence-embedded-image confluence-external-resource confluence-content-image-border"
for ( String graph in graphsList ){
result += makeImage( graphsClass, graph, 500 )
}
return result
}
def makeSCPFnote( note ){
return "<p>" + note + "</p>"
}
def makeErrorBarsDisclaimer(){
return "<p>Note: Error bars in the graphs below represent standard deviations. Only the upper error bars are shown.</p>"
}
def makeOldFlowDisclaimer(){
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>"
}
def createSwitchPortLatPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"metrics",
"openflow" ] )
result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxEvents 1",
"cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxBatchMs 0",
"cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxIdleMs 0" ] )
result += makeSCPFInfoSection( "Test Procedure", [ "Switch event generate on ONOS1 by connecting ovs switch to it.",
"Record tshark (tcp syn-ack) and graph event timestamp to calculate differences."] )
result += makeErrorBarsDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFswitchLat_onos-" + onos_v + "_UpErrBarWithStack.jpg",
graphLinkPrefix + "SCPFswitchLat_onos-" + onos_v + "_DownErrBarWithStack.jpg",
graphLinkPrefix + "SCPFportLat_onos-" + onos_v + "_UpErrBarWithStack.jpg",
graphLinkPrefix + "SCPFportLat_onos-" + onos_v + "_DownErrBarWithStack.jpg" ] )
return result
}
def createIntentLatencyPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"null" ] )
result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true (when using flow objective intents compiler)",
"cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator defaultFlowObjectiveCompiler org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler (when using flow objective intents compiler)",
"cfg set org.onosproject.net.intent.impl.IntentManager skipReleaseResourcesOnWithdrawal true" ] )
result += makeSCPFInfoSection( "Test Procedure", [ "Intent batch installed from ONOS1",
"Record returned response time"] )
result += makeErrorBarsDisclaimer()
result += makeOldFlowDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_1-batchSize_graph.jpg",
graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_100-batchSize_graph.jpg",
graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_OldFlow_1000-batchSize_graph.jpg",
graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_1-batchSize_graph.jpg",
graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_100-batchSize_graph.jpg",
graphLinkPrefix + "SCPFIntentInstallWithdrawRerouteLat_onos-" + onos_v + "_fobj_OldFlow_1000-batchSize_graph.jpg" ] )
return result
}
def createIntentEventThroughputPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"null",
"intentpref" ] )
result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.intent.impl.IntentManager skipReleaseResourcesOnWithdrawal true",
"cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true (when using flow objective intents compiler)",
"cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator defaultFlowObjectiveCompiler org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler (when using flow objective intents compiler)" ] )
result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "new NumKeys - 40000",
"with eventually consistent flow rule - 40000",
"with Flow Obj - 4000"] )
result += makeOldFlowDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFintentEventTp_onos-" + onos_v + "_no-neighbors_OldFlow_graph.jpg",
graphLinkPrefix + "SCPFintentEventTp_onos-" + onos_v + "_all-neighbors_OldFlow_graph.jpg",
graphLinkPrefix + "SCPFintentEventTpWithFlowObj_onos-" + onos_v + "_no-neighbors_flowObj_OldFlow_graph.jpg",
graphLinkPrefix + "SCPFintentEventTpWithFlowObj_onos-" + onos_v + "_all-neighbors_flowObj_OldFlow_graph.jpg" ] )
return result
}
def createScaleTopoPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"openflow" ] )
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)" )
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFscaleTopo_onos-" + onos_v + "_graph.jpg" ] )
return result
}
def createFlowThroughputPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"null",
"demo" ] )
result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.provider.nil.NullProviders deviceCount 35",
"cfg set org.onosproject.provider.nil.NullProviders topoShape linear",
"cfg set org.onosproject.provider.nil.NullProviders enabled true" ] )
result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "F = eventually consistent flows rule - 122500, 10000 with FlowObj - total # of flows installed",
"N: # of neighboring ONOS's for flows to be installed when ONOS1 is the server installing flows",
"S: #servers installing flows",
"SW = 35 - total # of switches (Null Devices) connected to ONOS cluster evenly distributed to active ONOS nodes",
"FL: # flows to be installed on each switch" ] )
result += makeSCPFInfoSection( "Command", [ "python3 \$ONOS_ROOT/tools/tests/bin/flow-tester.py -f FL -n N -s servers" ] )
result += makeErrorBarsDisclaimer()
result += makeOldFlowDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFflowTp1g_onos-" + onos_v + "_no-neighbors_OldFlow_graph.jpg",
graphLinkPrefix + "SCPFflowTp1g_onos-" + onos_v + "_all-neighbors_OldFlow_graph.jpg",
graphLinkPrefix + "SCPFflowTp1gWithFlowObj_onos-" + onos_v + "_no-neighbors_flowObj_OldFlow_graph.jpg",
graphLinkPrefix + "SCPFflowTp1gWithFlowObj_onos-" + onos_v + "_all-neighbors_flowObj_OldFlow_graph.jpg" ] )
return result
}
def createCbenchPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"openflow-base",
"_OldFlow_DelGraph" ] )
result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.fwd.ReactiveForwarding packetOutOnly true" ] )
result += makeErrorBarsDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFcbench_onos-" + onos_v + "_errGraph.jpg" ] )
return result
}
def createBatchFlowPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"openflow-base" ] )
result += makeSCPFInfoSection( "\"Constant-Load\" Test Conditions", [ "batchSize = eventually consistent flows rule - 200" ] )
result += makeOldFlowDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFbatchFlowResp_onos-" + onos_v + "_OldFlow_PostGraph.jpg",
graphLinkPrefix + "SCPFbatchFlowResp_onos-" + onos_v + "_OldFlow_DelGraph.jpg" ] )
return result
}
def createHostAddLatencyPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"metrics",
"openflow",
"proxyarp" ] )
result += makeSCPFInfoSection( "ONOS Config", [ "cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxEvents 1",
"cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxBatchMs 0",
"cfg set org.onosproject.net.topology.impl.DefaultTopologyProvider maxIdleMs 0" ] )
result += makeErrorBarsDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFhostLat_onos-" + onos_v + "_errGraph.jpg" ] )
return result
}
def createMastershipFailoverLatPage(){
result = ""
result += makeSCPFInfoSection( "System Env", SCPF_system_environment )
result += makeSCPFInfoSection( "ONOS Apps", [ "drivers",
"openflow",
"events" ] )
result += makeErrorBarsDisclaimer()
graphLinkPrefix = "https://jenkins.onosproject.org/view/QA/job/postjob-BM/lastSuccessfulBuild/artifact/"
result += makeSCPFindividualGraphs( [ graphLinkPrefix + "SCPFmastershipFailoverLat_onos-" + onos_v + "_stackedGraph.jpg",
graphLinkPrefix + "SCPFmastershipFailoverLat_onos-" + onos_v + "_errGraph.jpg" ] )
return result
}