在服务器上自定义一个数据中心的topo结构。

Mininet自定义topo使用floodlight做控制器_Software


自定义拓扑代码如下:


'''
Coursera:
- Software Defined Networking (SDN) course
-- Module 3 Programming Assignment
Professor: Nick Feamster
Teaching Assistant: Muhammad Shahbaz
'''
from mininet.topo import Topo
from mininet.util import *
from mininet.log import setLogLevel
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink
from mininet.node import *
#from mininet.examples import
class CustomTopo(Topo):
    "Simple Data Center Topology"
    "linkopts - (1:core, 2:aggregation, 3: edge) parameters"
    "fanout - number of child switch per parent switch"
                                                         
    def __init__(self, linkopts1, linkopts2, linkopts3, fanout=2, **opts):
        # Initialize topology and default options
        Topo.__init__(self, **opts)
                                                             
        # Add your logic here ...
        "Layer1"
        hostnum =1
        agrsnum =1
        edgesum =1
        coreswitch=self.addSwitch('c1')
        for i in irange(1,fanout):
            edgeswitch = self.addSwitch('e%s' %edgesum)
            edgesum = edgesum+1
            lay1link = self.addLink(coreswitch, edgeswitch,bw=10, delay='5ms', loss=1, max_queue_size=1000, use_htb=True)
            print 'This is i %s' %i
            print 'ADD EDGESWITCHE e%s' %i
            for j in irange(1,fanout):
                agrswitch = self.addSwitch('a%s' %agrsnum)
                agrsnum = agrsnum+1
                lay2link = self.addLink(edgeswitch, agrswitch,bw=10, delay='5ms', loss=1, max_queue_size=1000, use_htb=True)
                print 'This is j %s' %j
                print 'ADD AGRESWITCHE a%s' %(i*j)
                for k in irange(1,fanout):
                    host = self.addHost('h%s' %hostnum,cpu=.5/k)
                    hostnum= hostnum+1
                    lay3link = self.addLink(agrswitch, host,bw=10, delay='5ms', loss=1, max_queue_size=1000, use_htb=True)
                    print 'This is k %s' %k
                    print 'ADD Host h%s' %(i*j*k)

但使用floodlight作为控制器时一直报线程错误:

ERROR [n.f.l.i.LinkDiscoveryManager:Scheduled-1] Error in quarantine worker threadjava.lang.NullPointerException: nullat net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.generateSwitchPortStatusUpdate(LinkDiscoveryManager.java:1000) ~[bin/:na]at net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.processBDDPLists(LinkDiscoveryManager.java:990) ~[bin/:na]at net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager$QuarantineWorker.run(LinkDiscoveryManager.java:907) ~[bin/:na]at net.floodlightcontroller.core.util.SingletonTask$SingletonTaskWorker.run(SingletonTask.java:73) [bin/:na]at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_40]at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_40]at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) [na:1.7.0_40]at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) [na:1.7.0_40]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_40]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_40]at java.lang.Thread.run(Thread.java:724) [na:1.7.0_40]

这个错误。苦思不得解。

之后在虚拟机上测试,运行良好。发现是mininet版本的问题。服务器上用的是mininent的master版本。虚拟机是2.1.0。以后做实验需要用软件稳定版本。