class SdnBase:

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

    def initSetup( self ):
        import json
        import time
        import os
        from operator import eq
        try:
            from tests.dependencies.ONOSSetup import ONOSSetup
            main.testSetUp = ONOSSetup()
        except Exception:
            main.log.error( "ONOSSetup not found. exiting the test" )
            main.cleanAndExit()
        main.testSetUp.envSetupDescription()
        main.testSetUp.envSetup()
        main.apps = main.params[ 'ENV' ][ 'appString' ]
        cellName = main.params[ 'ENV' ][ 'cellName' ]

        main.step( "Copying config files" )
        src = os.path.dirname( main.testFile ) + "/network-cfg.json"
        dst = main.ONOSbench.home + "/tools/package/config/network-cfg.json"
        status = main.ONOSbench.scp( main.ONOSbench, src, dst, direction="to" )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=status,
                                 onpass="Copy config file succeeded",
                                 onfail="Copy config file failed" )
        main.testSetUp.ONOSSetUp( main.Mininet,
                                  main.Cluster,
                                  cellName=cellName )

        main.step( "Checking if ONOS CLI is ready for issuing commands" )
        ready = utilities.retry( main.Cluster.command,
                                  False,
                                  kwargs={ "function": "summary", "contentCheck": True },
                                  sleep=30,
                                  attempts=10 )
        utilities.assert_equals( expect=True, actual=ready,
                                 onpass="ONOS summary command succeded",
                                 onfail="ONOS summary command failed" )

        if not ready:
            main.log.error( "ONOS startup failed!" )
            main.cleanAndExit()

    def pToPIntentTest( self, intentExpectedNum ):
        """
        point-to-point intents test for each BGP peer and BGP speaker pair
        """
        import time
        main.case( "Check point-to-point intents" )
        main.log.info( "There are %s BGP peers in total "
                       % main.params[ 'config' ][ 'peerNum' ] )
        main.step( "Check P2P intents number from ONOS CLI" )

        getIntentsResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True )
        bgpIntentsActualNum = \
            main.QuaggaCliSpeaker1.extractActualBgpIntentNum( getIntentsResult )
        bgpIntentsExpectedNum = int( main.params[ 'config' ][ 'peerNum' ] ) * intentExpectedNum
        if bgpIntentsActualNum != bgpIntentsExpectedNum:
            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
            getIntentsResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True )
            bgpIntentsActualNum = \
                main.QuaggaCliSpeaker1.extractActualBgpIntentNum( getIntentsResult )
        main.log.info( "bgpIntentsExpected num is:" )
        main.log.info( bgpIntentsExpectedNum )
        main.log.info( "bgpIntentsActual num is:" )
        main.log.info( bgpIntentsActualNum )
        utilities.assert_equals( expect=bgpIntentsExpectedNum,
                                 actual=bgpIntentsActualNum,
                                 onpass="PointToPointIntent Intent Num is correct!",
                                 onfail="PointToPointIntent Intent Num is wrong!" )

    def routeAndIntentCheck( self, allRoutesExpected, routeIntentsExpectedNum ):
        """
        routes and intents check to all BGP peers
        """
        import time
        getRoutesResult = main.Cluster.active( 0 ).CLI.routes( jsonFormat=True )
        allRoutesActual = \
            main.QuaggaCliSpeaker1.extractActualRoutesMaster( getRoutesResult )
        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
        allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
        if allRoutesStrActual != allRoutesStrExpected:
            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
            getRoutesResult = main.Cluster.active( 0 ).CLI.routes( jsonFormat=True )
            allRoutesActual = \
                main.QuaggaCliSpeaker1.extractActualRoutesMaster( getRoutesResult )
            allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )

        main.step( "Check routes installed" )
        main.log.info( "Routes expected:" )
        main.log.info( allRoutesStrExpected )
        main.log.info( "Routes get from ONOS CLI:" )
        main.log.info( allRoutesStrActual )
        utilities.assertEquals(
            expect=allRoutesStrExpected, actual=allRoutesStrActual,
            onpass="Routes are correct!",
            onfail="Routes are wrong!" )

        main.step( "Check M2S intents installed" )
        getIntentsResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True )
        routeIntentsActualNum = \
            main.QuaggaCliSpeaker1.extractActualRouteIntentNum( getIntentsResult )
        if routeIntentsActualNum != routeIntentsExpectedNum:
            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
            getIntentsResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True )
            routeIntentsActualNum = \
                main.QuaggaCliSpeaker1.extractActualRouteIntentNum( getIntentsResult )

        main.log.info( "MultiPointToSinglePoint Intent Num expected is:" )
        main.log.info( routeIntentsExpectedNum )
        main.log.info( "MultiPointToSinglePoint Intent NUM Actual is:" )
        main.log.info( routeIntentsActualNum )
        utilities.assertEquals(
            expect=routeIntentsExpectedNum,
            actual=routeIntentsActualNum,
            onpass="MultiPointToSinglePoint Intent Num is correct!",
            onfail="MultiPointToSinglePoint Intent Num is wrong!" )

        main.step( "Check whether all flow status are ADDED" )
        flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                     main.FALSE,
                                     kwargs={ 'isPENDING': False },
                                     attempts=10 )
        utilities.assertEquals(
            expect=main.TRUE,
            actual=flowCheck,
            onpass="Flow status is correct!",
            onfail="Flow status is wrong!" )

    def linkUpDownCheck( self, link1Peer, link2Peer, link3Peer,
                         link1RouteNum, link1IntentNum,
                         link2RouteNum, link2IntentNum,
                         link3RouteNum, link3IntentNum,
                         speakers, hosts, upOrDown ):
        """
        Cut/Recover links to peers one by one, check routes/intents
        upOrDown - "up" or "down"
        """
        import time
        main.case( "Bring " + upOrDown + " links and check routes/intents" )
        main.step( "Bring " + upOrDown + " the link between sw32 and " + link1Peer )
        linkResult1 = main.Mininet.link( END1="sw32", END2=link1Peer,
                                         OPTION=upOrDown )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=linkResult1,
                                 onpass="Bring down link succeeded!",
                                 onfail="Bring down link failed!" )

        if linkResult1 == main.TRUE:
            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
            main.Functions.checkRouteNum( main, link1RouteNum )
            main.Functions.checkM2SintentNum( main, link1IntentNum )
        else:
            main.log.error( "Bring " + upOrDown + " link failed!" )
            main.cleanAndExit()

        main.step( "Bring " + upOrDown + " the link between sw8 and " + link2Peer )
        linkResult2 = main.Mininet.link( END1="sw8", END2=link2Peer,
                                         OPTION=upOrDown )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=linkResult2,
                                 onpass="Bring " + upOrDown + " link succeeded!",
                                 onfail="Bring " + upOrDown + " link failed!" )
        if linkResult2 == main.TRUE:
            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
            main.Functions.checkRouteNum( main, link2RouteNum )
            main.Functions.checkM2SintentNum( main, link2IntentNum )
        else:
            main.log.error( "Bring " + upOrDown + " link failed!" )
            main.cleanAndExit()

        main.step( "Bring " + upOrDown + " the link between sw28 and " + link3Peer )
        linkResult3 = main.Mininet.link( END1="sw28", END2=link3Peer,
                                         OPTION=upOrDown )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=linkResult3,
                                 onpass="Bring " + upOrDown + " link succeeded!",
                                 onfail="Bring " + upOrDown + " link failed!" )
        if linkResult3 == main.TRUE:
            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
            main.Functions.checkRouteNum( main, link3RouteNum )
            main.Functions.checkM2SintentNum( main, link3IntentNum )
        else:
            main.log.error( "Bring " + upOrDown + " link failed!" )
            main.cleanAndExit()

        main.step( "Check whether all flow status are ADDED" )
        flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                     main.FALSE,
                                     kwargs={ 'isPENDING': False },
                                     attempts=10 )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=flowCheck,
                                 onpass="Flow status is correct!",
                                 onfail="Flow status is wrong!" )

        # Ping test
        main.Functions.pingSpeakerToPeer( main, speakers=[ speakers ],
                                          peers=[ link1Peer, link2Peer, link3Peer ],
                                          expectAllSuccess=False )
        main.Functions.pingHostToHost( main,
                                       hosts=hosts,
                                       expectAllSuccess=False )
