aboutsummaryrefslogtreecommitdiff
path: root/rumba/model.py
diff options
context:
space:
mode:
Diffstat (limited to 'rumba/model.py')
-rw-r--r--rumba/model.py93
1 files changed, 17 insertions, 76 deletions
diff --git a/rumba/model.py b/rumba/model.py
index 098930a..0659cb1 100644
--- a/rumba/model.py
+++ b/rumba/model.py
@@ -36,56 +36,9 @@ class Testbed:
self.exp_name = exp_name
@abc.abstractmethod
- def create_experiment(self, nodes, links):
+ def create_experiment(self, experiment):
raise Exception('create_experiment() not implemented')
-
-# Represents an interface on a node
-#
-# @name [string] interface name
-# @ip [int] IP address of that interface
-#
-class Interface:
- def __init__(self, name = "", ip = ""):
- self.name = name
- self.ip = ip
-
- def __repr__(self):
- return self.name
-
-# Represents a link in the physical graph
-#
-# @name [string] Link name
-#
-class Link:
- def __init__(self, name):
- self.name = name
-
- def __repr__(self):
- return self.name
-
-# Represents a point-to-point link in the physical graph
-#
-# @name [string] DIF name
-#
-class P2PLink(Link):
- def __init__(self, name, node_a, node_b,
- int_a = None,
- int_b = None):
- Link.__init__(self, name)
- self.node_a = node_a
- self.node_b = node_b
- if int_a is None:
- int_a = Interface()
- self.int_a = int_a
- if int_b is None:
- int_b = Interface()
- self.int_b = int_b
-
- def __repr__(self):
- return '%s:%s--%s:%s' % (self.node_a.name, self.int_a,
- self.node_b.name, self.int_b)
-
# Base class for DIFs
#
# @name [string] DIF name
@@ -96,6 +49,7 @@ class DIF:
if members is None:
members = list()
self.members = members
+ self.ipcps = list()
def __repr__(self):
s = "DIF %s" % self.name
@@ -359,25 +313,6 @@ class Experiment:
return s
- def get_links(self):
- difs = set()
- links = list()
- for node in self.nodes:
- for dif in node.difs:
- if type(dif) is ShimEthDIF:
- difs.add(dif)
-
- for dif in difs:
- # Point-to-point link
- if len(dif.members) == 2:
- node_a = dif.members[0]
- node_b = dif.members[1]
- link = P2PLink(node_a.name + "-" + node_b.name,
- node_a, node_b)
- links.append(link)
-
- return links
-
def add_node(self, node):
self.nodes.append(node)
self.generate()
@@ -417,7 +352,8 @@ class Experiment:
#print(difsdeps_adj)
#print(difsdeps_inc_cnt)
- # Run Kahn's algorithm to compute topological ordering on the DIFs graph.
+ # Run Kahn's algorithm to compute topological
+ # ordering on the DIFs graph.
frontier = set()
self.dif_ordering = []
for dif in difsdeps_inc_cnt:
@@ -433,11 +369,13 @@ class Experiment:
frontier.add(nxt)
difsdeps_adj[cur] = set()
- circular_set = [dif for dif in difsdeps_inc_cnt if difsdeps_inc_cnt[dif] != 0]
+ circular_set = [dif for dif in difsdeps_inc_cnt \
+ if difsdeps_inc_cnt[dif] != 0]
if len(circular_set):
- raise Exception("Fatal error: The specified DIFs topology has one or more"\
- "circular dependencies, involving the following"\
- " DIFs: %s" % circular_set)
+ raise Exception("Fatal error: The specified DIFs topology" \
+ "has one or more" \
+ "circular dependencies, involving the following" \
+ " DIFs: %s" % circular_set)
print("DIF topological ordering: %s" % self.dif_ordering)
@@ -451,8 +389,8 @@ class Experiment:
dif_graphs[dif] = dict()
first = None
- # For each N-1-DIF supporting this DIF, compute the set of nodes that
- # share such N-1-DIF. This set will be called the 'neighset' of
+ # For each N-1-DIF supporting this DIF, compute the set of nodes
+ # that share such N-1-DIF. This set will be called the 'neighset' of
# the N-1-DIF for the current DIF.
for node in self.nodes:
@@ -482,7 +420,9 @@ class Experiment:
er = []
for node in dif_graphs[dif]:
for edge in dif_graphs[dif][node]:
- er.append("%s --[%s]--> %s" % (node.name, edge[1].name, edge[0].name))
+ er.append("%s --[%s]--> %s" % (node.name,
+ edge[1].name,
+ edge[0].name))
print("DIF graph for %s: %s" % (dif, ', '.join(er)))
if self.enrollment_strategy == 'minimal':
@@ -556,6 +496,7 @@ class Experiment:
break
node.ipcps.append(ipcp)
+ dif.ipcps.append(ipcp)
print("IPCP for node %s: %s" % (node.name, node.ipcps))
@@ -568,7 +509,7 @@ class Experiment:
# Realize the experiment, using a testbed-specific setup
def swap_in(self):
- self.testbed.create_experiment(self.nodes, self.get_links())
+ self.testbed.create_experiment(self)
@abc.abstractmethod
def run(self):