Skip to content
Snippets Groups Projects
Commit 9d2e6404 authored by Bob Lantz's avatar Bob Lantz
Browse files

add fastIntfPair to speed up link creation

parent 91a73bd1
No related branches found
No related tags found
No related merge requests found
...@@ -50,7 +50,11 @@ def __init__( self, name, node=None, port=None, link=None, ...@@ -50,7 +50,11 @@ def __init__( self, name, node=None, port=None, link=None,
if self.name == 'lo': if self.name == 'lo':
self.ip = '127.0.0.1' self.ip = '127.0.0.1'
# Add to node (and move ourselves if necessary ) # Add to node (and move ourselves if necessary )
node.addIntf( self, port=port ) moveIntfFn = params.pop( 'moveIntfFn', None )
if moveIntfFn:
node.addIntf( self, port=port, moveIntfFn=moveIntfFn )
else:
node.addIntf( self, port=port )
# Save params for future reference # Save params for future reference
self.params = params self.params = params
self.config( **params ) self.config( **params )
...@@ -371,7 +375,7 @@ class Link( object ): ...@@ -371,7 +375,7 @@ class Link( object ):
def __init__( self, node1, node2, port1=None, port2=None, def __init__( self, node1, node2, port1=None, port2=None,
intfName1=None, intfName2=None, addr1=None, addr2=None, intfName1=None, intfName2=None, addr1=None, addr2=None,
intf=Intf, cls1=None, cls2=None, params1=None, intf=Intf, cls1=None, cls2=None, params1=None,
params2=None ): params2=None, fast=True ):
"""Create veth link to another node, making two new interfaces. """Create veth link to another node, making two new interfaces.
node1: first node node1: first node
node2: second node node2: second node
...@@ -406,7 +410,15 @@ def __init__( self, node1, node2, port1=None, port2=None, ...@@ -406,7 +410,15 @@ def __init__( self, node1, node2, port1=None, port2=None,
if not intfName2: if not intfName2:
intfName2 = self.intfName( node2, params2[ 'port' ] ) intfName2 = self.intfName( node2, params2[ 'port' ] )
self.makeIntfPair( intfName1, intfName2, addr1, addr2 ) self.fast = fast
if fast:
params1.setdefault( 'moveIntfFn', self._ignore )
params2.setdefault( 'moveIntfFn', self._ignore )
self.fastIntfPair( intfName1, intfName2, addr1, addr2,
node1=node1, node2=node2)
else:
self.makeIntfPair( intfName1, intfName2, addr1, addr2,
node1=node1, node2=node2)
if not cls1: if not cls1:
cls1 = intf cls1 = intf
...@@ -421,6 +433,11 @@ def __init__( self, node1, node2, port1=None, port2=None, ...@@ -421,6 +433,11 @@ def __init__( self, node1, node2, port1=None, port2=None,
# All we are is dust in the wind, and our two interfaces # All we are is dust in the wind, and our two interfaces
self.intf1, self.intf2 = intf1, intf2 self.intf1, self.intf2 = intf1, intf2
@staticmethod
def _ignore( *args, **kwargs ):
"Ignore any arguments"
pass
def intfName( self, node, n ): def intfName( self, node, n ):
"Construct a canonical interface name node-ethN for interface n." "Construct a canonical interface name node-ethN for interface n."
# Leave this as an instance method for now # Leave this as an instance method for now
...@@ -428,7 +445,8 @@ def intfName( self, node, n ): ...@@ -428,7 +445,8 @@ def intfName( self, node, n ):
return node.name + '-eth' + repr( n ) return node.name + '-eth' + repr( n )
@classmethod @classmethod
def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None ): def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None,
node1=None, node2=None ):
"""Create pair of interfaces """Create pair of interfaces
intfname1: name of interface 1 intfname1: name of interface 1
intfname2: name of interface 2 intfname2: name of interface 2
...@@ -438,6 +456,18 @@ def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None ): ...@@ -438,6 +456,18 @@ def makeIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None ):
assert cls assert cls
return makeIntfPair( intfname1, intfname2, addr1, addr2 ) return makeIntfPair( intfname1, intfname2, addr1, addr2 )
@classmethod
def fastIntfPair( cls, intfname1, intfname2, addr1=None, addr2=None,
node1=None, node2=None ):
"""Create pair of interfaces
'fast' version: no checking, only works with Nodes.
intf1: name of interface 1
intf2: name of interface 2
(override this class method [and possibly delete()]
to change link type)"""
return node1.cmd( 'ip link add', intfname1, 'type veth '
'peer name', intfname2, 'netns', node2.pid )
def delete( self ): def delete( self ):
"Delete this link" "Delete this link"
self.intf1.delete() self.intf1.delete()
...@@ -478,10 +508,12 @@ def __init__( self, node1, node2, **kwargs ): ...@@ -478,10 +508,12 @@ def __init__( self, node1, node2, **kwargs ):
kwargs.update( cls1=OVSIntf, cls2=OVSIntf ) kwargs.update( cls1=OVSIntf, cls2=OVSIntf )
Link.__init__( self, node1, node2, **kwargs ) Link.__init__( self, node1, node2, **kwargs )
def makeIntfPair( self, *args, **kwargs ): def fastIntfPair( self, *args, **kwargs ):
"Usually delegated to OVSSwitch" "Usually delegated to OVSSwitch"
if self.isPatchLink: if self.isPatchLink:
return None, None return None, None
elif self.fast:
return Link.fastIntfPair( *args, **kwargs )
else: else:
return Link.makeIntfPair( *args, **kwargs ) return Link.makeIntfPair( *args, **kwargs )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment