# ScaleOutTemplate --> CbenchBM
#
# CASE1 starts number of nodes specified in param file
#
# cameron@onlab.us

import sys
import os
import os.path


class SCPFcbench:

    def __init__( self ):
        self.default = ''

    def CASE1( self, main ):

        import time
        import os
        global init
        main.case( "pre-condition for cbench test." )

        try:
            if not isinstance( init, bool ):
                init = False
        except NameError:
            init = False

        # -- INIT SECTION, ONLY RUNS ONCE -- #
        if not init:
            init = True
            try:
                from tests.dependencies.ONOSSetup import ONOSSetup
                main.testSetUp = ONOSSetup()
            except ImportError:
                main.log.error( "ONOSSetup not found. exiting the test" )
                main.cleanAndExit()
            main.testSetUp.envSetupDescription()
            stepResult = main.FALSE
            try:
                # Load values from params file
                BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
                BENCHUser = main.params[ 'BENCH' ][ 'user' ]
                CBENCHuser = main.params[ 'CBENCH' ][ 'user' ]
                MN1Ip = os.environ[ main.params[ 'MN' ][ 'ip1' ] ]
                main.maxNodes = int( main.params[ 'availableNodes' ] )
                main.cellName = main.params[ 'ENV' ][ 'cellName' ]
                main.apps = main.params[ 'ENV' ][ 'cellApps' ]
                main.scale = ( main.params[ 'SCALE' ] ).split( "," )

                stepResult = main.testSetUp.envSetup()
            except Exception as e:
                main.testSetUp.envSetupException( e )
            main.testSetUp.envSetupConclusion( stepResult )
            main.commit = ( main.commit.split( " " ) )[ 1 ]
        # -- END OF INIT SECTION --#

        main.testSetUp.ONOSSetUp( main.Cluster, True,
                                  cellName=main.cellName )

        for i in range( 5 ):
            main.ONOSbench.onosCfgSet( main.Cluster.active( 0 ).ipAddress, "org.onosproject.fwd.ReactiveForwarding", "packetOutOnly true" )
            time.sleep( 5 )
            main.ONOSbench.handle.sendline( "onos $OC1 cfg get|grep packetOutOnly" )
            main.ONOSbench.handle.expect( ":~" )
            check = main.ONOSbench.handle.before
            if "value=true" in check:
                main.log.info( "cfg set successful" )
                stepResult = main.TRUE
                break
            if i == 4:
                main.log.info( "Cfg set failed" )
                stepResult = main.FALSE
            else:
                time.sleep( 5 )

        utilities.assert_equals( expect=main.TRUE,
                                 actual=stepResult,
                                 onpass="Successfully configure onos for cbench test ",
                                 onfail="Failed to configure onos for cbench test" )

    def CASE2( self, main ):
        main.case( "Running Cbench" )
        main.step( "Issuing cbench commands and grab returned results" )
        validFlag = False
        cbenchCMD = main.params[ 'TEST' ][ 'cbenchCMD' ]
        mode = main.params[ 'TEST' ][ 'mode' ]
        if mode != "t":
            mode = " "

        runCbench = ( "ssh " + CBENCHuser + "@" + main.Cluster.active( 0 ).ipAddress + " " + cbenchCMD + mode )
        main.ONOSbench.handle.sendline( runCbench )
        time.sleep( 30 )
        main.ONOSbench.handle.expect( ":~" )
        output = main.ONOSbench.handle.before
        main.log.info( output )

        output = output.splitlines()
        for line in output:
            if "RESULT: " in line:
                validFlag = True
                print line
                resultLine = line.split( " " )
                for word in resultLine:
                    if word == "min/max/avg/stdev":
                        resultsIndex = resultLine.index( word )
                        print resultsIndex
                        break

                finalDataString = resultLine[ resultsIndex + 2 ]
                print finalDataString
                finalDataList = finalDataString.split( "/" )
                avg = finalDataList[ 2 ]
                stdev = finalDataList[ 3 ]

                main.log.info( "Average: \t\t\t" + avg )
                main.log.info( "Standard Deviation: \t" + stdev )

                # Check cbench test results
                threshold = float( main.params[ 'ALARM' ][ 'minTp' ].split( ',' )[ main.cycle - 1 ] )
                if float( avg ) < threshold:
                    main.log.alarm( "{}-node: {}/s < {}/s".format( main.Cluster.numCtrls,
                                                                   avg, threshold ) )

                try:
                    dbFileName = "/tmp/CbenchDB"
                    dbfile = open( dbFileName, "w+" )
                    temp = "'" + main.commit + "',"
                    temp += "'" + mode + "',"
                    temp += "'" + avg + "',"
                    temp += "'" + stdev + "'\n"
                    dbfile.write( temp )
                    dbfile.close()
                    main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
                except IOError:
                    main.log.warn( "Error opening " + dbFileName + " to write results." )

                stepResult = main.TRUE
                break
        if not validFlag:
            main.log.warn( "Cbench Test produced no valid results!!!!" )
            stepResult = main.FALSE

        utilities.assert_equals( expect=main.TRUE,
                                 actual=stepResult,
                                 onpass="Successfully tested onos for cbench. ",
                                 onfail="Failed to obtain valid onos cbench result!" )
