#!/usr/bin/env python

''' file: custom/optical.py '''

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import Intf, Link
from mininet.node import RemoteController

class NullIntf( Intf ):
    "A dummy interface with a blank name that doesn't do any configuration"
    def __init__( self, name, **params ):
        self.name = ''

class NullLink( Link ):
    "A dummy link that doesn't touch either interface"
    def makeIntfPair( cls, intf1, intf2 ):
        pass
    def delete( self ):
        pass

class OpticalTopo(Topo):
    def addIntf( self, switch, intfName ):
        "Add intf intfName to switch"
        self.addLink( switch, switch, cls=NullLink,
                      intfName1=intfName, cls2=NullIntf )
    def __init__(self):

        # Initialize topology
        Topo.__init__(self)

        # Add hosts and switches
        h1 = self.addHost('h1')
        h2 = self.addHost('h2')
        h3 = self.addHost('h3')
        h4 = self.addHost('h4')
        h5 = self.addHost('h5')
        h6 = self.addHost('h6')

        s1 = self.addSwitch('s1', dpid="0000ffffffff0001")
        s2 = self.addSwitch('s2', dpid="0000ffffffff0002")
        s3 = self.addSwitch('s3', dpid="0000ffffffff0003")
        s4 = self.addSwitch('s4', dpid="0000ffffffff0004")
        s5 = self.addSwitch('s5', dpid="0000ffffffff0005")
        s6 = self.addSwitch('s6', dpid="0000ffffffff0006")


        # Add links from hosts to OVS
        self.addLink(s1, h1)
        self.addLink(s2, h2)
        self.addLink(s3, h3)
        self.addLink(s4, h4)
        self.addLink(s5, h5)
        self.addLink(s6, h6)

        # add links from ovs to linc-oe
        # sorry about the syntax :(
        self.addIntf(s1,'tap29')
        self.addIntf(s2,'tap30')
        self.addIntf(s3,'tap31')
        self.addIntf(s4,'tap32')
        self.addIntf(s5,'tap33')
        self.addIntf(s6,'tap34')

        # if you use, sudo mn --custom custom/optical.py, then register the topo:
topos = {'optical': ( lambda: OpticalTopo() )}


def run():
    c = RemoteController('c','127.0.0.1',6633)
    net = Mininet( topo=OpticalTopo(),controller=None,autoSetMacs=True)
    net.addController(c)
    net.start()

    #installStaticFlows( net )
    CLI( net )
    net.stop()

# if the script is run directly (sudo custom/optical.py):
if __name__ == '__main__':
    setLogLevel('info')
    run()
