#!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 Jenkins script for graph-generator-CHO jenkins job.

// Read the files that has the dependencies
fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )

fileRelated.init()
// The way reading the parameters from the Jenkins.
branches = params.ONOSbranch
hours = params.hours

// divide the branch list into the list that was separated by newline, semi-colon, comma or space
branchList = branches.tokenize( "\n;, " )

// initialize the directory.

// Script file is the R script path
script_file = fileRelated.trendCHO
// saving_directory is the directory that save the generate graphs.
saving_directory = fileRelated.jenkinsWorkspace + "postjob-Fabric5/"
scriptDir = fileRelated.CHOScriptDir

// create a bash script that will generate the graph
graphScript = generateGraphScript( branchList )

stage( 'Generating-Graph' ) {
    // This will run on TestStation-Fabric5s node.
    node( "TestStation-Fabric5s" ) {
        // run the bash script on this node.
        runScript( graphScript )
    }
}
// stage that will trigger postjob.
// Need to be executed outside the current node to avoid deadlock.
stage( 'posting-result' ) {
    postJob()
}

def generateGraphScript( branchList ){
    // Generate the bash script that will run the Rscript to make graph.
    graphScript = ''''''

    // In case there are multiple branches running.
    for ( branch in branchList ){
        branchDir = scriptDir + branch + "/"
        graphScript += '''export BRANCH=''' + branchDir + '''
                          # make branch dir if not existing.
                          mkdir ''' + branchDir + ''';
                          # inside the branchDir, check if there were existing graph
                          if [ ! -f ''' + branchDir + '''existing.txt ]; then
                             # If it was first generated, it will copy .csv file.
                             cp *.csv ''' + branchDir + ''';
                             # mark that this has created already.
                             echo "1" > ''' + branchDir + '''existing.txt;
                          fi;
                          # run the log-summary that will export status
                          bash log-summary;''' + '''
                          # run Rscript with it's parameters.
                          Rscript ''' + script_file + ' ' + branchDir + 'event.csv ' +
                          branchDir + 'failure.csv ' + branchDir + 'error.csv ' +
                          branch + ' 60 ' + hours + ' ' + saving_directory + ''';
        '''
        print( graphScript )
    }
    return graphScript
}

def runScript( graphScript ){
    // run bash script that will init the environment and run the graph generating part.
    sh '''#!/bin/bash -l
          set -i
          set +e
          export PYTHONPATH=/home/sdn/TestON:/home/sdn/sts
          cd ''' + scriptDir + ''';
          ''' + graphScript
}

def postJob(){
    // Triggering jenkins job called `postjob-Fabric5`
    jobToRun = "postjob-Fabric5"
    build job: jobToRun, propagate: false
}
