#!/usr/bin/python

"""
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 os
import re
import math
from optparse import OptionParser
from ipaddress import IPv6Network, IPv4Network
from mininet.net import Mininet
from mininet.topo import Topo
from mininet.node import RemoteController, UserSwitch, Host, OVSBridge
from mininet.link import TCLink
from mininet.log import setLogLevel
from mininet.cli import CLI


# Parse command line options and dump results
def parseOptions( ):
    """Parse command line options"""
    parser = OptionParser( )
    parser.add_option( '--spine', dest='spine', type='int', default=2,
                       help='number of spine switches, default=2' )
    parser.add_option( '--leaf', dest='leaf', type='int', default=2,
                       help='number of leaf switches, default=2' )
    parser.add_option( '--fanout', dest='fanout', type='int', default=2,
                       help='number of hosts per leaf switch, default=2' )
    parser.add_option( '--onos', dest='onos', type='int', default=0,
                       help='number of ONOS Instances, default=0, 0 means localhost, 1 will use OC1 and so on' )
    parser.add_option( '--vlan', dest='vlan', type='int', default=-1,
                       help='vid of cross connect, default=-1, -1 means utilize default value' )
    parser.add_option( '--ipv6', action="store_true", dest='ipv6',
                       help='hosts are capable to use also ipv6' )
    (options, args) = parser.parse_args( )
    return options, args


opts, args = parseOptions( )

IP6_SUBNET_CLASS = 120
IP4_SUBNET_CLASS = 24

class LeafAndSpine6( Topo ):
    """
    Create Leaf and Spine Topology for IPv4/IPv6 tests.
    """
    def __init__( self, spine=2, leaf=2, fanout=2, **opts ):
        Topo.__init__( self, **opts )
        spines          = {}
        leafs           = {}
        """
        We calculate the offset from /120 and from /24 in order to have
        a number of /120 and /24 subnets == leaf
        """
        offset          = int(math.ceil(math.sqrt( leaf )))
        """
        We calculate the subnets to use and set options
        """
        ipv6SubnetClass = unicode('2000::/%s' % (IP6_SUBNET_CLASS - offset))
        ipv6Subnets     = list(IPv6Network(ipv6SubnetClass).subnets( new_prefix = IP6_SUBNET_CLASS ))
        ipv4SubnetClass = unicode('10.0.0.0/%s' % (IP4_SUBNET_CLASS - offset))
        ipv4Subnets     = list(IPv4Network(ipv4SubnetClass).subnets( new_prefix = IP4_SUBNET_CLASS ))
        linkopts        = dict( bw=100 )
        """
        We create the spine switches
        """
        for s in range( spine ):
            spines[ s ] = self.addSwitch( 'spine10%s' % (s + 1),
                                          dpid="00000000010%s" % (s + 1) )
        """
        We create the leaf switches
        """
        for ls in range( leaf ):
            leafs[ ls ] = self.addSwitch( 'leaf%s' % (ls + 1),
                                          dpid="00000000000%s" % (1 + ls) )
            ipv6Subnet  = ipv6Subnets[ ls ]
            ipv6Hosts   = list(ipv6Subnet.hosts())
            ipv4Subnet  = ipv4Subnets[ ls ]
            ipv4Hosts   = list(ipv4Subnet.hosts())
            """
            We add the hosts
            """
            for f in range( fanout ):
                ipv6 = ipv6Hosts[ f ]
                ipv6Gateway = ipv6Hosts[ len( ipv6Hosts ) - 1 ]
                ipv4 = ipv4Hosts[ f ]
                ipv4Gateway = ipv4Hosts[ len( ipv4Hosts ) - 1 ]
                host = self.addHost(
                    name='h%s' % (ls * fanout + f + 1),
                    cls=Ipv6Host,
                    ip="%s/%s" %(ipv4, IP4_SUBNET_CLASS),
                    gateway='%s' % ipv4Gateway,
                    ipv6="%s/%s" %(ipv6, IP6_SUBNET_CLASS),
                    ipv6Gateway="%s" % ipv6Gateway
                    )
                self.addLink( host, leafs[ ls ], **linkopts )
            """
            Connect leaf to all spines
            """
            for s in range( spine ):
                switch = spines[ s ]
                self.addLink( leafs[ ls ], switch, **linkopts )

class LeafAndSpine( Topo ):
    def __init__( self, spine=2, leaf=2, fanout=2, **opts ):
        "Create Leaf and Spine Topo."
        Topo.__init__( self, **opts )
        # Add spine switches
        spines = { }
        leafs = { }
        for s in range( spine ):
            spines[ s ] = self.addSwitch( 'spine10%s' % (s + 1),
                                          dpid="00000000010%s" % (s + 1) )
        # Set link speeds to 100Mb/s
        linkopts = dict( bw=100 )
        # Add Leaf switches
        for ls in range( leaf ):
            leafs[ ls ] = self.addSwitch( 'leaf%s' % (ls + 1),
                                          dpid="00000000000%s" % (1 + ls) )
            # Add hosts under a leaf, fanout hosts per leaf switch
            for f in range( fanout ):
                host = self.addHost( 'h%s' % (ls * fanout + f + 1),
                                     cls=IpHost,
                                     ip='10.0.%s.%s/24' % ((ls + 1), (f + 1)),
                                     gateway='10.0.%s.254' % (ls + 1) )
                self.addLink( host, leafs[ ls ], **linkopts )
                # Add Xconnect simulation
            if ls is 0:
                in1 = self.addHost( 'in1', cls=IpHost, ip='10.0.1.9/24', mac="00:00:00:00:00:09" )
                self.addLink( in1, leafs[0], **linkopts )
                out1 = self.addHost( 'out1', cls=IpHost, ip='10.0.9.1/24', mac="00:00:00:00:09:01" )
                self.addLink( out1, leafs[0], **linkopts )
                br1 = self.addSwitch( 'br1', cls=OVSBridge )
                self.addLink( br1, leafs[ 0 ], **linkopts )
                vlans = [ 1, 5, 10 ]
                for vid in vlans:
                    olt = self.addHost( 'olt%s' % vid, cls=VLANHost, vlan=vid,
                                        ip="10.%s.0.1/24" % vid
                                        , mac="00:00:%02d:00:00:01" % vid )
                    vsg = self.addHost( 'vsg%s' % vid, cls=VLANHost, vlan=vid,
                                        ip="10.%s.0.2/24" % vid
                                        , mac="00:00:%02d:00:00:02" % vid )
                    self.addLink( olt, leafs[ 0 ], **linkopts )
                    self.addLink( vsg, br1, **linkopts )
            # Connect leaf to all spines
            for s in range( spine ):
                switch = spines[ s ]
                self.addLink( leafs[ ls ], switch, **linkopts )

class IpHost( Host ):
    def __init__( self, name, *args, **kwargs ):
        super( IpHost, self ).__init__( name, *args, **kwargs )
        gateway = re.split('\.|/', kwargs['ip'])
        gateway[3] = '254'
        self.gateway = '.'.join(gateway[0:4])

    def config( self, **kwargs ):
        Host.config( self, **kwargs )
        mtu = "ifconfig " + self.name + "-eth0 mtu 1490"
        self.cmd( mtu )
        self.cmd( 'ip route add default via %s' % self.gateway )

class Ipv6Host( IpHost ):
    """
    Abstraction to model an augmented host with a ipv6
    functionalities as well
    """
    def __init__( self, name, *args, **kwargs ):
        IpHost.__init__(self, name, *args, **kwargs)

    def config( self, **kwargs ):
        IpHost.config( self, **kwargs )
        ipv6Cmd         = 'ifconfig %s-eth0 inet6 add %s' % (self.name, kwargs['ipv6'])
        ipv6GatewayCmd  = 'ip -6 route add default via %s' % kwargs['ipv6Gateway']
        ipv6MtuCmd      = 'ifconfig %s-eth0 inet6 mtu 1490' % (self.name)
        self.cmd( ipv6Cmd )
        self.cmd( ipv6GatewayCmd )
        self.cmd( ipv6MtuCmd )

class VLANHost( Host ):
    "Host connected to VLAN interface"

    def config( self, vlan=100, **params ):
        """Configure VLANHost according to (optional) parameters:
           vlan: VLAN ID for default interface"""
        r = super( VLANHost, self ).config( **params )
        intf = self.defaultIntf( )
        # remove IP from default, "physical" interface
        self.cmd( 'ifconfig %s inet 0' % intf )
        intf = self.defaultIntf( )
        # create VLAN interface
        self.cmd( 'vconfig add %s %d' % (intf, vlan) )
        self.cmd( 'ifconfig %s.%d %s' % (intf, vlan, params[ 'ip' ]) )
        # update the intf name and host's intf map
        self.cmd( 'ifconfig %s.%d mtu 1480' % (intf, vlan) )
        newName = '%s.%d' % (intf, vlan)
        # update the (Mininet) interface to refer to VLAN interface name
        intf.name = newName
        # add VLAN interface to host's name to intf map
        self.nameToIntf[ newName ] = intf

class ExtendedCLI( CLI ):
    """
    Extends mininet CLI with the following commands:
    addvlanhost
    addiphost
    """
    def do_addhost( self, line ):
        #Parsing args from CLI
        args = line.split( )
        if len( args ) < 3 or len( args ) :
            "usage: addhost hostname switch **params"
        hostname, switch = args[0],  args[1]
        params = eval(line.split( ' ', 3 )[2])
        if 'cls' in params:
            params['cls'] = eval( params[ 'cls' ] )
        if hostname in self.mn:
            #error( '%s already exists!\n' % hostname )
            return
        if switch not in self.mn:
            #error( '%s does not exist!\n' % switch )
            return
        print params
        host = self.mn.addHostCfg( hostname, **params )
        #switch.attach( link.intf2 )
        #host.config()
        link = self.mn.addLink( host, switch )
        host.config(**params)

    def do_pingall6( self, line ):
        "Ping6 between all hosts."
        self.mn.pingAll6( line )

def config( opts ):
    spine = opts.spine
    leaf = opts.leaf
    fanout = opts.fanout
    vlan = opts.vlan
    ipv6 = opts.ipv6
    controllers = [ os.environ[ 'OC%s' % i ] for i in
                    range( 1, opts.onos + 1 ) ] if (opts.onos) else [
        '127.0.0.1' ]
    if not ipv6:
        topo = LeafAndSpine(
            spine=spine,
            leaf=leaf,
            fanout=fanout,
            vlan=vlan,
            )
    else:
        topo = LeafAndSpine6(
            spine=spine,
            leaf=leaf,
            fanout=fanout,
            vlan=vlan,
            ipv6=ipv6
            )
    net = Mininet( topo=topo, link=TCLink, build=False,
                   switch=UserSwitch, controller=None, autoSetMacs=True )
    i = 0
    for ip in controllers:
        net.addController( "c%s" % (i), controller=RemoteController, ip=ip )
        i += 1;
    net.build( )
    net.start( )
    if not ipv6:
        out1 = net.get( 'out1' )
        out1.cmd( "arp -s 10.0.9.254 10:00:00:00:00:01 -i %s " % (out1.intf()) )
    ExtendedCLI(net)
    net.stop( )

if __name__ == '__main__':
    setLogLevel( 'info' )
    config( opts )
    os.system( 'sudo mn -c' )
