"""
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/>.
"""

import time
import json
'''
    Warp function for SCPFportLat test
'''

def capturePortStatusPack( main, deviceName, interface, portStatus, resultDict, warmup ):
    '''
    Change device port status and use tshark to capture openflow port package
    Args:
        main: TestON class
        deviceName: Device to change portStatus
        interface: port number
        portStatus: up or down
        resultDict: put result to dictionary
        warmup: if warmup, ignore results

    '''
    main.log.info( "Clean up tshark" )
    with open( main.tsharkResultPath, "w" ) as tshark:
        tshark.write("")
    main.log.info( "Starting tshark capture" )
    main.ONOSbench.tsharkGrep( main.ofportStatus, main.tsharkResultPath )
    time.sleep( main.measurementSleep )
    main.log.info( "{} port {} {}".format( deviceName, interface, portStatus ) )
    main.Mininet1.changeInterfaceStatus( deviceName, interface, portStatus )
    time.sleep( main.measurementSleep )
    main.log.info( "Stopping all Tshark processes" )
    main.ONOSbench.tsharkStop()

    # 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 = int( float( resultText[1] ) * 1000.0 )
            resultFile.close()
            for i in range( 1, main.Cluster.numCtrls + 1 ):
                main.log.info( "================================================" )
                # get onos metrics timestamps
                try:
                    response = json.loads( main.Cluster.active( i - 1 ).CLI.topologyEventsMetrics() )
                    deviceTime = int( response.get( "topologyDeviceEventTimestamp" ).get( "value" ) )
                    main.log.info( "ONOS{} device Event timestemp: {}".format( i, deviceTime ) )

                    linkTime = int( response.get( "topologyLinkEventTimestamp" ).get( "value" ) )
                    main.log.info( "ONOS{} Link Event timestemp: {}".format( i, linkTime ) )

                    graphTime = int( response.get( "topologyGraphEventTimestamp" ).get( "value" ) )
                    main.log.info( "ONOS{} Graph Event timestemp: {}".format( i, graphTime ) )
                except TypeError:
                    main.log.warn( "TypeError!" )
                    break
                except ValueError:
                    main.log.warn( "Unable to decode Json object!" )
                    break
                main.log.info( "================================================" )
                # calculate latency
                EtoE = graphTime - tsharkResultTime
                PtoD = deviceTime - tsharkResultTime
                DtoL = linkTime - deviceTime
                LtoG = graphTime - linkTime
                main.log.info( "ONOS{} End to End time: {}".format( i, EtoE ) )
                main.log.info( "ONOS{} Package to Device time: {}".format( i, PtoD ) )
                main.log.info( "ONOS{} Device to Link time: {}".format( i, DtoL ) )
                main.log.info( "ONOS{} Link to Graph time: {}".format( i, LtoG ) )
                # if less than 0 waring
                if EtoE < 0 or PtoD < 0 or DtoL < 0 or LtoG < 0:
                    main.log.warn( "Latency less than 0! Ingore this loop." )
                else:
                    # put result to dictionary
                    if not warmup:
                        resultDict[ portStatus ][ 'node' + str(i) ]['EtoE'].append( EtoE )
                        resultDict[ portStatus ][ 'node' + str(i) ]['PtoD'].append( PtoD )
                        resultDict[ portStatus ][ 'node' + str(i) ]['DtoL'].append( DtoL )
                        resultDict[ portStatus ][ 'node' + str(i) ]['LtoG'].append( LtoG )
        else:
            main.log.error( "Unexpected tshark output file" )
