diff options
Diffstat (limited to 'rumba/model.py')
-rw-r--r-- | rumba/model.py | 93 |
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): |