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

from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as run
import time

class SRRoutingTest ():

    topo = {}

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

    @staticmethod
    def runTest( main, test_idx, onosNodes, dhcp, routers, ipv4, ipv6, description ):

        skipPackage = False
        init = False
        if not hasattr( main, 'apps' ):
            init = True
            run.initTest( main )

        # Skip onos packaging if the cluster size stays the same
        if not init and onosNodes == main.Cluster.numCtrls:
            skipPackage = True

        main.case( '%s, ONOS instance%s' % ( description, onosNodes ) )

        main.cfgName = 'COMCAST_CONFIG_ipv4=%d_ipv6=%d_dhcp=%d_routers=%d' % \
            ( ipv4, ipv6, dhcp, routers )
        main.resultFileName = 'CASE%02d' % test_idx
        main.Cluster.setRunningNode( onosNodes )

        run.installOnos( main, skipPackage=skipPackage, cliSleep=5,
                         parallel=False )
        run.loadJson( main )
        run.loadChart( main )

        # wait some
        time.sleep( 5 )

        if hasattr( main, 'Mininet1' ):
            # Run the test with Mininet
            mininet_args = ' --dhcp=%s --routers=%s --ipv6=%s --ipv4=%s' % ( dhcp, routers, ipv6, ipv4 )
            run.startMininet( main, 'comcast_fabric.py', args=mininet_args )
        else:
            # Run the test with physical devices
            # TODO: connect TestON to the physical network
            pass

        # wait some time for onos to install the rules!
        time.sleep( 25 )

        if ( dhcp ):
            time.sleep( 60 )

        # ping hosts
        run.pingAll( main, 'CASE%02d' % test_idx, acceptableFailed=5, basedOnIp=True )

        if hasattr( main, 'Mininet1' ):
            run.cleanup( main )
        else:
            # TODO: disconnect TestON from the physical network
            pass
