TypeError: __init__() 收到意外的关键字参数 'delay
我在下面这个Python程序中遇到了一个类型错误,问题出现在构造函数被调用的时候。如果我去掉延迟这个参数,我也会遇到同样的错误,错误信息是“bw”。我搞不清楚哪里出错了,请帮帮我。
我正在尝试用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() ) }
我收到的错误追踪信息是:
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'
2 个回答
0
在mininet或者我猜是OpenVswitch中,有一个对象正在接收你的linkopts参数,其中包含了带有带宽(bw)和延迟(delay)的关键字参数。不过,这个对象并不认识你使用的这些关键字参数。可能是你使用的mininet和openvswitch版本不匹配吧?我看到当前的例子中有提到bw和delay,但我没有足够的经验来判断这些是不是过时的引用,或者你使用的是旧的库。
不幸的是,想要试用你的代码片段需要的配置比我能花的时间要多得多。我尝试简单地运行“apt-get openvswitch-controller python-openvswitch”,但我没能让它运行起来。
24
记得把链接类型设置为tc。
在你的脚本里像下面这样指定:
net = Mininet(topo=topo, link=TCLink)
记得在你的Python脚本中导入TCLink:
from mininet.link import TCLink
如果你想从命令提示符调用mininet,那么就把--link参数设置成这样:
sudo mn --custom custom.py --topo customtopo --link tc