"""
Copyright 2016 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/>.
"""
"""
    SCPFhostLat
    This test will test the host found latency.
    Host will arping a ip address, tshark will caputure the package time, then compare with the topology event timestamp.
    Test will run with 1 node from start, and scale up to 7 nodes.
    The event timestamp will only greb the latest one, then calculate average and standar dev.

    yunpeng@onlab.us
"""
class SCPFhostLat:

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

    def CASE0( self, main ):
        import sys
        import json
        import time
        import os
        import imp
        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:

            # Test variables
            main.cellName = main.params[ 'ENV' ][ 'cellName' ]
            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
            main.scale = ( main.params[ 'SCALE' ] ).split( "," )
            main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
            main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
            main.measurementSleep = int( main.params[ 'SLEEP' ][ 'measurement' ] )
            main.timeout = int( main.params[ 'SLEEP' ][ 'timeout' ] )
            main.dbFileName = main.params[ 'DATABASE' ][ 'file' ]

            # Tshark params
            main.tsharkResultPath = main.params[ 'TSHARK' ][ 'tsharkPath' ]
            main.tsharkPacketIn = main.params[ 'TSHARK' ][ 'tsharkPacketIn' ]

            main.numlter = main.params[ 'TEST' ][ 'numIter' ]
            main.iterIgnore = int( main.params[ 'TEST' ][ 'iterIgnore' ] )
            main.hostTimestampKey = main.params[ 'TEST' ][ 'hostTimestamp' ]
            main.thresholdStr = main.params[ 'TEST' ][ 'singleSwThreshold' ]
            main.thresholdObj = main.thresholdStr.split( ',' )
            main.thresholdMin = int( main.thresholdObj[ 0 ] )
            main.thresholdMax = int( main.thresholdObj[ 1 ] )
            main.threadID = 0

            main.maxNumBatch = 0
            main.setupSkipped = False

            main.nic = main.params[ 'DATABASE' ][ 'nic' ]
            node = main.params[ 'DATABASE' ][ 'node' ]
            stepResult = main.TRUE

            main.log.info( "Cresting DB file" )
            with open( main.dbFileName, "w+" ) as dbFile:
                dbFile.write( "" )
            stepResult = main.testSetUp.envSetup()
        except Exception as e:
            main.testSetUp.envSetupException( e )
        main.testSetUp.evnSetupConclusion( stepResult )

        main.commit = main.commit.split( " " )[ 1 ]

    def CASE2( self, main ):
        """
        - Uninstall ONOS cluster
        - Verify ONOS start up
        - Install ONOS cluster
        - Connect to cli
        """
        main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, True,
                                  cellName=main.cellName, killRemoveMax=False )

    def CASE11( self, main ):
        main.log.info( "set and configure Application" )
        import json
        import time
        time.sleep( main.startUpSleep )
        main.step( "Activating org.onosproject.proxyarp" )
        appStatus = utilities.retry( main.Cluster.active( 0 ).REST.activateApp,
                                     main.FALSE,
                                     [ 'org.onosproject.proxyarp' ],
                                     sleep=3,
                                     attempts=3 )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=appStatus,
                                 onpass="Successfully activated proxyarp",
                                 onfail="Failed to activated proxyarp" )

        main.step( "Set up Default Topology Provider" )
        appStatus = main.TRUE
        configName = 'org.onosproject.net.topology.impl.DefaultTopologyProvider'
        configParam = 'maxEvents'
        appStatus = appStatus and main.Cluster.active( 0 ).CLI.setCfg( configName, configParam, '1' )
        configParam = 'maxBatchMs'
        appStatus = appStatus and main.Cluster.active( 0 ).CLI.setCfg( configName, configParam, '0' )
        configParam = 'maxIdleMs'
        appStatus = appStatus and main.Cluster.active( 0 ).CLI.setCfg( configName, configParam, '0' )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=appStatus,
                                 onpass="Successfully set DefaultTopologyProvider",
                                 onfail="Failed to set DefaultTopologyProvider" )

        time.sleep( main.startUpSleep )
        main.step( 'Starting mininet topology' )
        mnStatus = main.Mininet1.startNet( args='--topo=linear,1' )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=mnStatus,
                                 onpass="Successfully started Mininet",
                                 onfail="Failed to activate Mininet" )
        main.step( "Assinging masters to switches" )
        switches = main.Mininet1.getSwitches()
        swStatus = main.Mininet1.assignSwController( sw=switches.keys(),
                                                     ip=main.Cluster.active( 0 ).ipAddress )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=swStatus,
                                 onpass="Successfully assigned switches to masters",
                                 onfail="Failed assign switches to masters" )

        time.sleep( main.startUpSleep )

    def CASE20( self, main ):
        """
        host1 send arping package and measure latency

        There are only 1 levels of latency measurements to this test:
        1 ) ARPING-to-device measurement: Measurement the time from host1
        send apring package to onos processing the host event

        """
        import time
        import subprocess
        import json
        import requests
        import os
        import numpy
        try:
            from tests.dependencies.utils import Utils
        except ImportError:
            main.log.error( "Utils not found exiting the test" )
            main.cleanAndExit()
        try:
            main.Utils
        except ( NameError, AttributeError ):
            main.Utils = Utils()
        # Host adding measurement
        assertion = main.TRUE

        main.log.report( 'Latency of adding one host to ONOS' )
        main.log.report( 'First ' + str( main.iterIgnore ) + ' iterations ignored' + ' for jvm warmup time' )
        main.log.report( 'Total iterations of test: ' + str( main.numlter ) )

        addingHostTime = []
        metricsResultList = []
        for i in range( 0, int( main.numlter ) ):
            main.log.info( 'Clean up data file' )
            with open( main.tsharkResultPath, "w" ) as dbFile:
                dbFile.write( "" )

            main.log.info( 'Starting tshark capture' )
            main.ONOSbench.tsharkGrep( main.tsharkPacketIn, main.tsharkResultPath )
            time.sleep( main.measurementSleep )

            main.log.info( 'host 1 arping...' )
            main.Mininet1.arping( srcHost='h1', dstHost='10.0.0.2' )

            time.sleep( main.measurementSleep )

            main.log.info( 'Stopping all Tshark processes' )
            main.ONOSbench.tsharkStop()

            time.sleep( main.measurementSleep )

            # Get tshark output
            with open( main.tsharkResultPath, "r" ) as resultFile:
                resultText = resultFile.readline()
                main.log.info( 'Capture result:' + resultText )
                resultText = resultText.split( ' ' )
                if len( resultText ) > 1:
                    tsharkResultTime = float( resultText[ 1 ] ) * 1000.0
                else:
                    main.log.error( 'Tshark output file for packet_in' + ' returned unexpected results' )
                    hostTime = 0
                    caseResult = main.FALSE
                resultFile.close()
            # Compare the timestemps, and get the lowest one.
            temp = 0
            # Get host event timestamps from each nodes
            for ctrl in main.Cluster.active():
                metricsResult = json.loads( ctrl.CLI.topologyEventsMetrics() )
                metricsResult = metricsResult.get( main.hostTimestampKey ).get( "value" )
                main.log.info( "ONOS topology event matrics timestemp: {}".format( str( metricsResult ) ) )

                if temp < metricsResult:
                    temp = metricsResult
                metricsResult = temp

            addingHostTime.append( float( metricsResult ) - tsharkResultTime )
            main.log.info( "Result of this iteration: {}".format( str( float( metricsResult ) - tsharkResultTime ) ) )
            # gethost to remove
            gethost = main.Cluster.active( 0 ).REST.hosts()
            HosttoRemove = []
            HosttoRemove.append( json.loads( gethost[ 1:len( gethost ) - 1 ] ).get( 'id' ) )
            main.Cluster.active( 0 ).CLI.removeHost( HosttoRemove )

        main.log.info( "Result List: {}".format( addingHostTime ) )

        # calculate average latency from each nodes
        averageResult = numpy.average( addingHostTime )
        main.log.info( "Average Latency: {}".format( averageResult ) )

        # calculate std
        stdResult = numpy.std( addingHostTime )
        main.log.info( "std: {}".format( stdResult ) )

        # write to DB file
        main.log.info( "Writing results to DS file" )
        with open( main.dbFileName, "a" ) as dbFile:
            temp = "'" + main.commit + "',"
            temp += "'" + main.nic + "',"
            # Scale number
            temp += str( main.Cluster.numCtrls )
            temp += ",'" + "baremetal1" + "'"
            # average latency
            temp += "," + str( averageResult )
            # std of latency
            temp += "," + str( stdResult )
            temp += "\n"
            dbFile.write( temp )

        assertion = main.TRUE

        utilities.assert_equals( expect=main.TRUE, actual=assertion,
                                 onpass='Host latency test successful',
                                 onfail='Host latency test failed' )

        main.Utils.mininetCleanup( main.Mininet1 )
