#!/usr/bin/env python

''' file: custom/optical.py '''
from mininet.node import RemoteController
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.util import irange

switches = []

class OpticalTopo( Topo ):

    def build( self, n=6, tapStart=29 ):
	global switches
        # Add hosts and switches
        hosts = []
        switches = []
        for i in irange( 1, n ):
            h = self.addHost( 'h%d' % i )
            s = self.addSwitch( 's%d' % i, dpid='0000ffffffff%04d' % i )
            self.addLink( h, s )
            hosts.append( h )
            switches.append( s )

        # Add optical tap interfaces
        tapNum = tapStart
        #for sw in switches:
        #    self.addLink( sw, sw, intfName1='%s-eth0' % sw, intfName2='tap%d' % tapNum )
	    #Add tap interface  up
            #sudo ip link set dev tap25 up
       #     tapNum += 1

# if you use, sudo mn --custom custom/optical.py, then register the topo:
#sudo mn --custom ~/mininet/custom/optical-2.py --topo optical,6 --controller=remote
#sudo ./mininet/custom/optical-2.py
topos = { 'optical': OpticalTopo }

def installStaticFlows( net ):
    for swName in [ 's1', 's2', 's3', 's4', 's5', 's6' ]:
      info( 'Adding flows to %s...' % swName )
      sw = net[ swName ]
      sw.dpctl( 'add-flow', 'in_port=1,actions=output=2' )
      sw.dpctl( 'add-flow', 'in_port=2,actions=output=1' )
      info( sw.dpctl( 'dump-flows' ) )

def run():
    net = Mininet( topo=OpticalTopo(), controller=RemoteController )
    net.start()
    #installStaticFlows( net )
    tapStart = 29
    for sw in switches:
        net.get(sw).attach( 'tap%d' %tapStart )
        tapStart += 1
    CLI( net )
    net.stop()

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