#!groovy

// Copyright 2017 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/>.

// This is the dependency Jenkins script.
// This will provide the SCPF specific functions

fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )

fileRelated.init()

def init(){
    // init step for SCPF functions. It has some mandatory init steps

    // none, batches, neighbors, times : to be used for extra parameters for generating graphs.
    def none = [ "" ]
    def batches = [ 1, 100, 1000 ]
    def neighbors = [ 'y', 'n' ]
    def times = [ 'y', 'n' ]

    //flows : whether the test is affected by oldFlow or newFlow
    // test : command of the test to be executed when running the test
    // table : name of the view table on database
    // result : name of the actual table on database
    // file : name of the file that contains the result of the test to be used to insert data to database
    // rFile : specific Rscript file name to be used to generate each SCPF graph. For with flowObj graphs, you need to put 'n' or 'y' after the test name
    // extra : extra condition that will be used for Rscript parameter. Some of the Rscript requires extra parameters like if it has
    //         neighbors or batches. In this case, it will generate Rscript x times of what extra has. So that it will generate one with
    //         neighbor = y and the other with neighbor = n
    // finalResult : If you want to generate overall graph for the front page.
    // graphTitle : title for the graph. It should contain n numbers depends on how many graphs you are generating.
    // [Optional]
    // dbCols : specific dbColumns to choose for 50 data overall graph if there is one.
    // dbWhere : specific where statement that has some condition for 50 data overall graph if there is one.
    // y_axis : title of the y_axis to be shown for 50 data overall graph if there is one.

    SCPF = [
            SCPFcbench: [ flows: false,
                          test: 'SCPFcbench',
                          table: 'cbench_bm_tests',
                          results: 'cbench_bm_results',
                          file: 'CbenchDB',
                          rFile: 'SCPFcbench.R',
                          extra: none,
                          finalResult: 1,
                          graphTitle: [ 'Cbench Test' ],
                          dbCols: 'avg',
                          dbWhere: '',
                          y_axis: 'Throughput (Responses/sec)' ],
            SCPFhostLat: [ flows: false,
                           test: 'SCPFhostLat',
                           table: 'host_latency_tests',
                           results: 'host_latency_results',
                           file: 'HostAddLatency',
                           rFile: 'SCPFhostLat.R',
                           extra: none,
                           finalResult: 1,
                           graphTitle: [ 'Host Latency Test' ],
                           dbCols: 'avg',
                           dbWhere: 'AND scale=5',
                           y_axis: 'Latency (ms)' ],
            SCPFportLat: [ flows: false,
                           test: 'SCPFportLat',
                           table: 'port_latency_details',
                           results: 'port_latency_results',
                           file: '/tmp/portEventResultDb',
                           rFile: 'SCPFportLat.R',
                           extra: none,
                           finalResult: 1,
                           graphTitle: [ 'Port Latency Test - Port Up', 'Port Latency Test - Port Down' ],
                           dbCols: [ 'up_ofp_to_dev_avg, up_dev_to_link_avg, up_link_to_graph_avg',
                                     'down_ofp_to_dev_avg, down_dev_to_link_avg, down_link_to_graph_avg' ],
                           dbWhere: 'AND scale=5', y_axis: 'Latency (ms)' ],
            SCPFflowTp1g: [ flows: true,
                            test: 'SCPFflowTp1g',
                            table: 'flow_tp_tests',
                            results: 'flow_tp_results',
                            file: 'flowTP1gDB',
                            rFile: 'SCPFflowTp1g.R n',
                            extra: neighbors,
                            finalResult: 1,
                            graphTitle: [ 'Flow Throughput Test - neighbors=0',
                                          'Flow Throughput Test - neighbors=4' ],
                            dbCols: 'avg',
                            dbWhere: [ 'AND scale=5 AND neighbors=0 ',
                                       'AND scale=5 AND NOT neighbors=0' ],
                            y_axis: 'Throughput (,000 Flows/sec)' ],
            SCPFflowTp1gWithFlowObj: [ flows: true,
                                       test: 'SCPFflowTp1g --params TEST/flowObj=True',
                                       table: 'flow_tp_fobj_tests',
                                       results: 'flow_tp_fobj_results',
                                       file: 'flowTP1gDBFlowObj',
                                       rFile: 'SCPFflowTp1g.R y',
                                       extra: neighbors,
                                       finalResult: 0 ],
            SCPFscaleTopo: [ flows: false,
                             test: 'SCPFscaleTopo',
                             table: 'scale_topo_latency_details',
                             results: 'scale_topo_latency_results',
                             file: '/tmp/scaleTopoResultDb',
                             rFile: 'SCPFscaleTopo.R',
                             extra: none,
                             finalResult: 1,
                             graphTitle: [ 'Scale Topology Test' ],
                             dbCols: [ 'first_connection_to_last_connection, last_connection_to_last_role_request, last_role_request_to_last_topology' ],
                             dbWhere: 'AND scale=20',
                             y_axis: 'Latency (s)' ],
            SCPFswitchLat: [ flows: false,
                             test: 'SCPFswitchLat',
                             table: 'switch_latency_details',
                             results: 'switch_latency_results',
                             file: '/tmp/switchEventResultDb',
                             rFile: 'SCPFswitchLat.R',
                             extra: none,
                             finalResult: 1,
                             graphTitle: [ 'Switch Latency Test - Switch Up',
                                           'Switch Latency Test - Switch Down' ],
                             dbCols: [ 'tcp_to_feature_reply_avg,feature_reply_to_device_avg,up_device_to_graph_avg',
                                       'fin_ack_to_ack_avg,ack_to_device_avg,down_device_to_graph_avg' ],
                             dbWhere: 'AND scale=5',
                             y_axis: 'Latency (ms)' ],
            SCPFbatchFlowResp: [ flows: true,
                                 test: 'SCPFbatchFlowResp',
                                 table: 'batch_flow_tests',
                                 results: 'batch_flow_results',
                                 file: 'SCPFbatchFlowRespData',
                                 rFile: 'SCPFbatchFlowResp.R',
                                 extra: none,
                                 finalResult: 1,
                                 graphTitle: [ 'Batch Flow Test - Post',
                                               'Batch Flow Test - Del' ],
                                 dbCols: [ 'elapsepost, posttoconfrm',
                                           'elapsedel, deltoconfrm' ],
                                 dbWhere: '',
                                 y_axis: 'Latency (s)' ],
            SCPFintentEventTp: [ flows: true,
                                 test: 'SCPFintentEventTp',
                                 table: 'intent_tp_tests',
                                 results: 'intent_tp_results',
                                 file: 'IntentEventTPDB',
                                 rFile: 'SCPFintentEventTp.R n',
                                 extra: neighbors,
                                 finalResult: 1,
                                 graphTitle: [ 'Intent Throughput Test - neighbors=0',
                                               'Intent Throughput Test - neighbors=4' ],
                                 dbCols: 'SUM( avg ) as avg',
                                 dbWhere: [ 'AND scale=5 AND neighbors=0 GROUP BY date,build',
                                            'AND scale=5 AND NOT neighbors=0 GROUP BY date,build' ],
                                 y_axis: 'Throughput (Ops/sec)' ],
            SCPFintentRerouteLat: [ flows: true,
                                    test: 'SCPFintentRerouteLat',
                                    table: 'intent_reroute_latency_tests',
                                    results: 'intent_reroute_latency_results',
                                    file: 'IntentRerouteLatDB',
                                    rFile: 'SCPFIntentInstallWithdrawRerouteLat.R n',
                                    extra: batches,
                                    finalResult: 1,
                                    graphTitle: [ 'Intent Reroute Test' ],
                                    dbCols: 'avg',
                                    dbWhere: 'AND scale=5 AND batch_size=100',
                                    y_axis: 'Latency (ms)' ],
            SCPFscalingMaxIntents: [ flows: true,
                                     test: 'SCPFscalingMaxIntents',
                                     table: 'max_intents_tests',
                                     results: 'max_intents_results',
                                     file: 'ScalingMaxIntentDB',
                                     rFile: 'SCPFscalingMaxIntents.R n',
                                     extra: none,
                                     finalResult: 0 ],
            SCPFintentEventTpWithFlowObj: [ flows: true,
                                            test: 'SCPFintentEventTp --params TEST/flowObj=True',
                                            table: 'intent_tp_fobj_tests',
                                            results: 'intent_tp_fobj_results',
                                            file: 'IntentEventTPflowObjDB',
                                            rFile: 'SCPFintentEventTp.R y',
                                            extra: neighbors,
                                            finalResult: 0 ],
            SCPFintentInstallWithdrawLat: [ flows: true,
                                            test: 'SCPFintentInstallWithdrawLat',
                                            table: 'intent_latency_tests',
                                            results: 'intent_latency_results',
                                            file: 'IntentInstallWithdrawLatDB',
                                            rFile: 'SCPFIntentInstallWithdrawRerouteLat.R n',
                                            extra: batches,
                                            finalResult: 1,
                                            graphTitle: [ 'Intent Installation Test',
                                                          'Intent Withdrawal Test' ],
                                            dbCols: [ 'install_avg', 'withdraw_avg' ],
                                            dbWhere: 'AND scale=5 AND batch_size=100',
                                            y_axis: 'Latency (ms)' ],
            SCPFintentRerouteLatWithFlowObj: [ flows: true,
                                               test: 'SCPFintentRerouteLat --params TEST/flowObj=True',
                                               table: 'intent_reroute_latency_fobj_tests',
                                               results: 'intent_reroute_latency_fobj_results',
                                               file: 'IntentRerouteLatDBWithFlowObj',
                                               rFile: 'SCPFIntentInstallWithdrawRerouteLat.R y',
                                               extra: batches,
                                               finalResult: 0 ],
            SCPFscalingMaxIntentsWithFlowObj: [ flows: true,
                                                test: 'SCPFscalingMaxIntents --params TEST/flowObj=True',
                                                table: 'max_intents_fobj_tests',
                                                results: 'max_intents_fobj_results',
                                                file: 'ScalingMaxIntentDBWFO',
                                                rFile: 'SCPFscalingMaxIntents.R y',
                                                extra: none,
                                                finalResult: 0 ],
            SCPFintentInstallWithdrawLatWithFlowObj: [ flows: true,
                                                       test: 'SCPFintentInstallWithdrawLat --params TEST/flowObj=True',
                                                       table: 'intent_latency_fobj_tests',
                                                       results: 'intent_latency_fobj_results',
                                                       file: 'IntentInstallWithdrawLatDBWFO',
                                                       rFile: 'SCPFIntentInstallWithdrawRerouteLat.R y',
                                                       extra: batches,
                                                       finalResult: 0 ],
            SCPFmastershipFailoverLat: [ flows: false,
                                         test: 'SCPFmastershipFailoverLat',
                                         table: 'mastership_failover_tests',
                                         results: 'mastership_failover_results',
                                         file: 'mastershipFailoverLatDB',
                                         rFile: 'SCPFmastershipFailoverLat.R',
                                         extra: none,
                                         finalResult: 1,
                                         graphTitle: [ 'Mastership Failover Test' ],
                                         dbCols: [ 'kill_deact_avg,deact_role_avg' ],
                                         dbWhere: 'AND scale=5',
                                         y_axis: 'Latency (ms)' ]
    ]
    graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-BM/"
}

def getGraphCommand( rFileName, extras, host, port, user, pass, testName, branchName, isOldFlow ){
    // generate the list of Rscript command for individual graphs

    result = ""
    for ( extra in extras ){
        result += generateGraph( rFileName, " " + extra, host, port, user, pass, testName, branchName, isOldFlow ) + ";"
    }
    return result
}

def generateGraph( rFileName, batch, host, port, user, pass, testName, branchName, isOldFlow ){
    //  generate the Rscript command for individual graphs

    return generalFuncs.basicGraphPart( fileRelated.SCPFSpecificLocation + rFileName,
                                        host, port, user, pass, testName, branchName ) +
           " " + batch + " " + usingOldFlow( isOldFlow, testName ) + graph_saved_directory
}

def generateCombinedResultGraph( host, port, user, pass, testName, branchName, isOldFlow ){
    // generate Rscript for overall graph for the front page.
    def result = ""

    for ( int i = 0; i < SCPF[ testName ][ 'graphTitle' ].size(); i++ ){
        result += generalFuncs.basicGraphPart( fileRelated.trendSCPF,
                                               host,
                                               port,
                                               user,
                                               pass,
                                               "\"" + SCPF[ testName ][ 'graphTitle' ][ i ] + "\"",
                                               branchName ) +
                  " " + 50 + " \"SELECT " +
                  checkIfList( testName, 'dbCols', i ) +
                  ", build FROM " + SCPF[ testName ][ 'table' ] + " WHERE  branch=\'" + branchName + "\' " +
                  sqlOldFlow( isOldFlow, testName ) +
                  checkIfList( testName, 'dbWhere', i ) +
                  " ORDER BY date DESC LIMIT 50\" \"" +
                  SCPF[ testName ][ 'y_axis' ] + "\" " +
                  hasOldFlow( isOldFlow, testName ) +
                  graph_saved_directory + ";"
    }
    return result
}

def checkIfList( testName, forWhich, pos ){
    // check if some dictionary has list or string.

    return SCPF[ testName ][ forWhich ].getClass().getName() != "java.lang.String" ?
           SCPF[ testName ][ forWhich ][ pos ] :
           SCPF[ testName ][ forWhich ]
}

def sqlOldFlow( isOldFlow, testName ){
    // sql where command part for checking old flows.

    return SCPF[ testName ][ 'flows' ] ? " AND " + ( isOldFlow ? "" : "NOT " ) + "is_old_flow " : ""
}

def oldFlowRuleCheck( isOldFlow, branch ){
    // checking if it is old flow

    this.isOldFlow = isOldFlow
    if ( !isOldFlow ){
        SCPF[ 'SCPFflowTp1g' ][ 'test' ] += " --params TEST/flows=" + ( branch == "onos-1.11" ? "4000" : "3500" )
    }
}

def affectedByOldFlow( isOldFlow, testName ){
    // For sql command :  if the test is affect by old flow, it will return parameters for old flow
    return SCPF[ testName ][ 'flows' ] ? "" + isOldFlow + ", " : ""
}

def usingOldFlow( isOldFlow, testName ){
    // For Rscript command : if it is using old flow.

    return SCPF[ testName ][ 'flows' ] ? ( isOldFlow ? "y" : "n" ) + " " : ""
}

def hasOldFlow( isOldFlow, testName ){
    // For Rscript command for 50 data

    return ( SCPF[ testName ][ 'flows' ] && isOldFlow ? "y" : "n" ) + " "
}

def sqlCommand( testName ){
    // sql command for inserting data into the database

    if ( testName == "SCPFscaleTopo" || testName == "SCPFswitchLat" || testName == "SCPFportLat" ){
        return "\"INSERT INTO " + SCPF[ testName ][ 'table' ] + " VALUES( '\$DATE','" +
               SCPF[ testName ][ 'results' ] + "','\$BUILD_NUMBER', \$line, '\$ONOSBranch');\""
    }
    return "\"INSERT INTO " + SCPF[ testName ][ 'table' ] + " VALUES( '\$DATE','" + SCPF[ testName ][ 'results' ] +
           "','\$BUILD_NUMBER', '\$ONOSBranch', " + affectedByOldFlow( isOldFlow, testName ) + "\$line);\""
}

def databasePart( testName, database_command ){
    // read the file from the machine and insert it to the database

    return '''
    cd /tmp
    while read line
    do
    echo \$line
    echo ''' + database_command + '''
    done< ''' + SCPF[ testName ][ 'file' ]
}

def getGraphGeneratingCommand( host, port, user, pass, testName, prop ){
    // returns the combined Rscript command for each test.

    return getGraphCommand( SCPF[ testName ][ 'rFile' ],
                            SCPF[ testName ][ 'extra' ],
                            host, port, user, pass, testName,
                            prop[ "ONOSBranch" ], isOldFlow ) + '''
    ''' + ( SCPF[ testName ][ 'finalResult' ] ?
            generateCombinedResultGraph( host, port, user, pass, testName, prop[ "ONOSBranch" ], isOldFlow ) : "" )
}

return this
