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

Functions for the vpls tests
"""
import time
import json


def sanitizeConfig( config ):
    """
    Take a python json object for vpls config and normalize it.
    Things it does:
        Converts all strings to the same format
        Make sure each network has an encapsulation key:value
        Makes sure encapsulation type is all uppercase
        Make sure an empty list of interfaces is formated consistently
        Sorts the list of interfaces
        Sorts the list of networks
    """
    # Convert to same string formats
    config = json.loads( json.dumps( config ) )
    for network in config:
        encap = network.get( 'encapsulation', None )
        if encap is None:
            encap = "NONE"
        network[ 'encapsulation' ] = encap.upper()
        ifaces = network.get( 'interfaces' )
        if ifaces == [ '' ]:
            ifaces = []
        else:
            ifaces = sorted( ifaces )
            network[ 'interfaces' ] = ifaces
    config = sorted( config, key=lambda k: k[ 'name' ] )
    return config


def verify( main ):
    """
    Runs some tests to verify the vpls configurations.
        - Compare sent vpls network configuration to what is stored in each:
            - ONOS network configuration
            - ONOS VPLS application configuration
        - Ping between each pair of hosts to check connectivity

    NOTE: This requires the expected/sent network config json for the vpls
          application be stored in main.vplsConfig
    """
    # Variables
    app = main.params[ 'vpls' ][ 'name' ]
    pprint = main.Cluster.active( 0 ).REST.pprint
    SLEEP = int( main.params[ 'SLEEP' ][ 'netcfg' ] )

    main.step( "Check network configurations for vpls application" )
    clusterResult = True
    for ctrl in main.Cluster.active():
        result = False
        getVPLS = utilities.retry( f=ctrl.REST.getNetCfg,
                                   retValue=False,
                                   kwargs={ "subjectClass": "apps", "subjectKey": app },
                                   sleep=SLEEP )
        onosCfg = json.loads( getVPLS ).get( 'vpls' ).get( 'vplsList' )
        onosCfg = pprint( sanitizeConfig( onosCfg ) )
        sentCfg = pprint( sanitizeConfig( main.vplsConfig ) )
        result = onosCfg == sentCfg
        if result:
            main.log.info( "ONOS NetCfg matches what was sent" )
        else:
            clusterResult = False
            main.log.error( "ONOS NetCfg doesn't match what was sent" )
            main.log.debug( "ONOS config: {}".format( onosCfg ) )
            main.log.debug( "Sent config: {}".format( sentCfg ) )
    utilities.assert_equals( expect=True,
                             actual=clusterResult,
                             onpass="Net Cfg added for vpls",
                             onfail="Net Cfg not added for vpls" )

    main.step( "Check vpls app configurations" )
    clusterResult = True
    for ctrl in main.Cluster.active():
        result = False
        # TODO Read from vpls show and match to pushed json
        vpls = ctrl.CLI.parseVplsShow()
        parsedVpls = pprint( sanitizeConfig( vpls ) )
        sentVpls = pprint( sanitizeConfig( main.vplsConfig ) )
        result = parsedVpls == sentVpls
        if result:
            main.log.info( "VPLS config matches sent NetCfg" )
        else:
            clusterResult = False
            main.log.error( "VPLS config doesn't match sent NetCfg" )
            main.log.debug( "ONOS config: {}".format( parsedVpls ) )
            main.log.debug( "Sent config: {}".format( sentVpls ) )
    utilities.assert_equals( expect=True,
                             actual=clusterResult,
                             onpass="VPLS successfully configured",
                             onfail="VPLS not configured correctly" )

    checkIntentState( main )

    main.step( "Check connectivity" )
    connectivityCheck = True
    hosts = int( main.params[ 'vpls' ][ 'hosts' ] )
    networks = []
    for network in main.vplsConfig:
        nodes = network.get( 'interfaces', None )
        if nodes:
            networks.append( nodes )
    for i in range( 1, hosts + 1 ):
        src = "h" + str( i )
        for j in range( 1, hosts + 1 ):
            if j == i:
                continue
            dst = "h" + str( j )
            pingResult = main.Mininet1.pingHost( SRC=src, TARGET=dst )
            expected = main.FALSE
            for network in networks:
                if src in network and dst in network:
                    expected = main.TRUE
                    break
            if pingResult != expected:
                connectivityCheck = False
                main.log.error( "%s <-> %s: %s; Expected: %s" %
                                ( src, dst, pingResult, expected ) )
    utilities.assert_equals( expect=True,
                             actual=connectivityCheck,
                             onpass="Connectivity is as expected",
                             onfail="Connectivity is not as expected" )

# TODO: if encapsulation is set, look for that
# TODO: can we look at the intent keys?


def checkIntentState( main, bl=[] ):
    # Print the intent states
    intents = main.Cluster.active( 0 ).CLI.intents()
    count = 0
    while count <= 5:
        installedCheck = True
        try:
            i = 1
            for intent in json.loads( intents ):
                state = intent.get( 'state', None )
                if "INSTALLED" not in state or ( "WITHDRAWN" not in state and "h" + str( i ) in bl ):
                    installedCheck = False
                i += 1
        except ( ValueError, TypeError ):
            main.log.exception( "Error parsing intents" )
        if installedCheck:
            break
        count += 1
    return installedCheck


def getVplsHashtable( main, bl=[] ):
    """
    Returns a hashtable of vpls to hosts
    """
    result = {}
    vplsConfig = main.vplsConfig
    for v in vplsConfig:
        interfaces = v[ 'interfaces' ][ : ]
        for i in bl:
            if i in interfaces:
                interfaces.remove( i )
        result[ v[ 'name' ] ] = interfaces
    return result


def testConnectivityVpls( main, blacklist=[], isNodeUp=True ):

    # Can't do intent check when onos node is stopped/killed yet
    if isNodeUp:
        main.step( "Check intent states" )
        intentsCheck = utilities.retry( f=checkIntentState,
                                        retValue=False,
                                        args=( main, blacklist ),
                                        sleep=main.timeSleep,
                                        attempts=main.numAttempts )

        utilities.assert_equals( expect=True,
                                 actual=intentsCheck,
                                 onpass="All Intents in installed state",
                                 onfail="Not all Intents in installed state" )

    main.step( "Testing connectivity..." )

    vplsHashtable = getVplsHashtable( main, blacklist )
    main.log.debug( "vplsHashtable: " + str( vplsHashtable ) )
    result = True
    for key in vplsHashtable:
        pingResult = utilities.retry( f=main.Mininet1.pingallHosts,
                                      retValue=False,
                                      args=( vplsHashtable[ key ], ),
                                      sleep=main.timeSleep,
                                      attempts=main.numAttempts )
        result = result and pingResult

    utilities.assert_equals( expect=main.TRUE, actual=result,
                             onpass="Connectivity succeeded.",
                             onfail="Connectivity failed." )
    return result


def compareApps( main ):
    result = True
    first = None
    for ctrl in main.Cluster.active():
        currentApps = ctrl.CLI.apps( summary=True, active=True )
        if not result:
            first = currentApps
        else:
            result = result and ( currentApps == first )
    return result
