简体   繁体   中英

TypeError:__init__() got an unexpected keyword argument 'delay'

I am getting a TypeError in the following python program where the constructor is being called. If I remove the delay argument, I get the same error with "bw". I cannot figure out the mistake. Please help.

I am trying to create a network topology using python.

#!/usr/bin/python

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.util import irange,dumpNodeConnections
from mininet.log import setLogLevel

class CustomTopo(Topo):

    def __init__(self, linkopts1, linkopts2, linkopts3, fanout=2, **opts):
        # Initialize topology and default options
        Topo.__init__(self, **opts)

        # Add your logic here ...
        switch=self.addSwitch('c1')

        self.linkopts1=linkopts1
        self.linkopts2=linkopts2
        self.linkopts3=linkopts3

        self.fanout=fanout
        n=0

        for i in irange(1,fanout):
                s=self.addSwitch('a%s' % i)
                self.addLink(switch,s,**linkopts1)

                if i==1:
                        n=0
                else:
                        n=1
                for j in irange(1,fanout):
                        if n==0:
                                sw=self.addSwitch('e%s' % j)              #To generate labels e1, e2, e3 and e4:
                        else:                                             #if n=0, edge switches e1 and e2 are added to a1
                                sw=self.addSwitch('e%s' % (j+2))            #if n=1, edge switched e3 and e4 are added to a2
                        self.addLink(s,sw,**linkopts2)

                        for k in irange(1,fanout):
                                if ((j==1)&(n==0)):
                                        host=self.addHost('h%s' % k)      #For edge switch e1, j=1,n=0. End-hosts are h1 and h2.
                                elif ((j==2)&(n==0)):
                                        host=self.addHost('h%s' % (k+2))  #For edge switch e2, j=2,n=0. End-hosts are h3 and h4.
                                elif ((j==1)&(n==1)):
                                        host=self.addHost('h%s' % (k+4))  #For edge switch e3, j=1,n=1. End-hosts are h5 and h6.
                                elif ((j==2)&(n==1)):
                                        host=self.addHost('h%s' % (k+6))  #For edge switch e4, j=2,n=1. End-hosts are h7 and h8.
                                self.addLink(sw,host,**linkopts3)


def treeTest():
        linkopts1=dict(bw=10, delay='5ms')
        linkopts2=dict(bw=10, delay='5ms')
        linkopts3=dict(bw=10, delay='5ms')
        topo=CustomTopo(linkopts1,linkopts2,linkopts3,fanout=2)
        net=Mininet(topo)
        net.start()
        print "Dumping node connections"
        dumpNodeConnections(net.hosts)
        print "Testing network connectivity"
        net.pingAll()
        net.stop()

if __name__=='__main__':
        setLogLevel('info')
        treeTest()



topos = { 'custom': ( lambda: CustomTopo() ) }

The error trace I am getting is:

Traceback (most recent call last):
  File "CustomTopo.py", line 70, in <module>
    treeTest()
  File "CustomTopo.py", line 60, in treeTest
    net=Mininet(topo)
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 164, in __init__
    self.build()
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 357, in build
    self.buildFromTopo( self.topo )
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 344, in buildFromTopo
    self.addLink( src, dst, srcPort, dstPort, **params )
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 287, in addLink
    return cls( node1, node2, **defaults )
TypeError: __init__() got an unexpected keyword argument 'delay'

Remember to set the link type as tc.

Specify it in your script as shown below:

net = Mininet(topo=topo, link=TCLink)

Remember to import TCLink in your python script:

from mininet.link import TCLink

If, instead, you want to call mininet from the command prompt, then set the --link parameter as follows:

sudo mn --custom custom.py --topo customtopo --link tc

Either in mininet or I suspect OpenVswitch an object is being passed one of your linkopts with bw and delay as keyword arguments. However, that object is not expecting the keyword parameters you are using. Perhaps you have a version mismatch between mininet and openvswitch? I see the bw and delay listed in the current example but I do not have the domain experience to know if they are old references or you have older libraries.

Unfortunately trying out your snippet requires way more configuration than I have time for. I tried simply "apt-get openvswitch-controller python-openvswitch" but I could not get it running.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM