Skip to content

Commit 30da009

Browse files
committed
accept global defaults as ctor args in Base Layer
1 parent 1a9ea48 commit 30da009

File tree

6 files changed

+20
-8
lines changed

6 files changed

+20
-8
lines changed

examples/basic/A00_simple_as/simple_as.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ def run(dumpfile = None):
2929

3030
# Initialize the emulator and layers
3131
emu = Emulator()
32-
base = Base()
32+
# set global defaults..
33+
base = Base(bandwidth=OptionRegistry().net_bandwidth(10000000),# 10 Mbit/s on all links
34+
mtu=OptionRegistry().net_mtu(9000)) # use JumboFrames
3335
routing = Routing()
3436
ebgp = Ebgp()
3537
web = WebService()
@@ -43,7 +45,7 @@ def run(dumpfile = None):
4345

4446
# Create an autonomous system
4547
as150 = base.createAutonomousSystem(150)
46-
as150.setOption(OptionRegistry().net_mtu(9000))
48+
as150.setOption(OptionRegistry().net_mtu(1500))
4749

4850
# Create a network
4951
as150.createNetwork('net0')

seedemu/core/Binding.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from ipaddress import IPv4Network, IPv4Address
1010
from sys import stderr
1111
import re, random, string
12-
from .Scope import Scope, NodeScopeTier
12+
from .Scope import NodeScope, NodeScopeTier
1313

1414
class Action(Enum):
1515
"""!
@@ -181,7 +181,7 @@ def __create(self, emulator: Emulator) -> Node:
181181
# 'host' didnt exist back when Base::configure() installed
182182
# the global default sysctl options on all nodes
183183
for o in base.getAvailableOptions():
184-
host.setOption(o, Scope(NodeScopeTier.Global))
184+
host.setOption(o, NodeScope(NodeScopeTier.Global))
185185

186186
# set name servers
187187
host.setNameServers(asObject.getNameServers())

seedemu/core/Emulator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ def getServiceNetwork(self) -> Network:
330330
@returns service network.
331331
"""
332332
if self.__service_net == None:
333-
self.__service_net = self.__registry.register('seedemu', 'net', '000_svc', Network('000_svc', NetworkType.Bridge, IPv4Network(self.__service_net_prefix), direct = False))
333+
self.__service_net = self.__registry.register('seedemu', 'net', '000_svc', Network('000_svc', NetworkType.Bridge, IPv4Network(self.__service_net_prefix), direct = False, scope='-1'))
334334

335335
return self.__service_net
336336

seedemu/core/Network.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def setMtu(self, mtu: int) -> Network:
117117
118118
@returns self, for chaining API calls.
119119
"""
120-
from OptionRegistry import OptionRegistry
120+
from .OptionRegistry import OptionRegistry
121121
self.setOption( OptionRegistry().net_mtu(mtu) )
122122

123123
return self

seedemu/core/Node.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ def configure(self, emulator: Emulator):
363363
# netname = 'as{}.{}_as{}.{}'.format(self.getAsn(), self.getName(), peerasn, peername)
364364
netname = ''.join(choice(ascii_letters) for i in range(10))
365365
# TOODO scope of XC nets ?! pair of both ASes .. ?!
366-
net = Network(netname, NetworkType.CrossConnect, localaddr.network, direct = False) # TODO: XC nets w/ direct flag?
366+
net = Network(netname, NetworkType.CrossConnect, localaddr.network, direct = False, scope='0') # TODO: XC nets w/ direct flag?
367367
net.setDefaultLinkProperties(latency, bandwidth, packetDrop).setMtu(mtu) # Set link properties
368368
self.__joinNetwork(reg.register('xc', 'net', netname, net), str(localaddr.ip))
369369

seedemu/layers/Base.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,24 @@ def getNetOptions(self):
6060
return [OptionRegistry().getOption(o) for o in opt_keys]
6161

6262

63-
def __init__(self):
63+
def __init__(self, **kwargs):
6464
"""!
6565
@brief Base layer constructor.
6666
"""
6767
super().__init__()
6868
self.__ases = {}
6969
self.__ixes = {}
7070
self.__name_servers = []
71+
from seedemu.core import OptionRegistry
72+
for k,v in kwargs.items():
73+
# Replace the 'defaults' class methods dynamically
74+
75+
opt_cls = type(v)
76+
# Capture 'new_value' as default argument (forces a snapshot of the current value)
77+
opt_cls.default = classmethod(lambda cls, new_value=v.value: new_value)
78+
opt_cls.defaultMode = classmethod(lambda cls, newmode=v.mode: newmode)
79+
prefix = getattr(opt_cls, '__prefix') if hasattr(opt_cls, '__prefix') else None
80+
OptionRegistry().register(opt_cls, prefix)
7181

7282
def getName(self) -> str:
7383
return "Base"

0 commit comments

Comments
 (0)