#!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_lists = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )

runningNode = "TestStation-BMs"

// 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()
SCPF_page_id = params.SCPF_page_id.toInteger()
USECASE_page_id = params.USECASE_page_id.toInteger()
SR_page_id = params.USECASE_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 all the list of the tests from the JenkinsTestONTests.groovy
AllTheTests = test_lists.getAllTheTests( onos_v )

// get the name of the job.
jobName = env.JOB_NAME

String[] pagesToPublish = []
String[] pageNames = []
parentID = -1

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
} else {
    pageNames += "ONOS-" + onos_v + " (" + onos_bird + ")"
    pagesToPublish += createTopLevelPageContents()

    parentID = wikiTestResultsPageID
}

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
}

if ( USECASE_page_id > -1 ){
    pageNames += onos_v + "-Segment Routing"
    pagesToPublish += createGeneralPageContents( "SR" )

    parentID = USECASE_page_id
}

echoForDebug(pageNames, pagesToPublish)
node ( runningNode ) {
    for ( i in 0..pagesToPublish.length - 1 ){
        publishToConfluence( pageNames[ i ], pagesToPublish[ i ], parentID )
    }
}

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 ){
    pTree = "<ul>"
    for ( String test in AllTheTests[ category ].keySet() ){
        testTitle = AllTheTests[ category ][ test ][ "wiki_link" ]
        pTree += "<li><h3><a href=\"https://wiki.onosproject.org/display/ONOS/" + testTitle + "\">"
        pTree += AllTheTests[ category ][ test ][ "wiki_link" ] + "</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 "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>"

    pageTreeHTML = pageTree( category )

    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 AllTheTests[ category ].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
}
