aboutsummaryrefslogtreecommitdiff
path: root/rhumba.py
diff options
context:
space:
mode:
Diffstat (limited to 'rhumba.py')
-rwxr-xr-xrhumba.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/rhumba.py b/rhumba.py
new file mode 100755
index 0000000..d94cd9e
--- /dev/null
+++ b/rhumba.py
@@ -0,0 +1,166 @@
+#
+# A library to manage ARCFIRE experiments
+#
+
+# Base class for DIFs
+#
+# @name [string] DIF name
+#
+class DIF:
+ def __init__(self, name):
+ self.name = name
+
+ def __repr__(self):
+ s = "DIF %s" % self.name
+ return s
+
+# Shim over Ethernet
+#
+# @link_speed [int] Speed of the Ethernet network, in Mbps
+#
+class ShimEthDIF(DIF):
+ def __init__(self, name, link_speed = 0):
+ DIF.__init__(self, name)
+ self.link_speed = int(link_speed)
+ if self.link_speed < 0:
+ raise ValueError("link_speed must be a non-negative number")
+
+# Normal DIF
+#
+# @policies [dict] Policies of the normal DIF
+#
+class NormalDIF(DIF):
+ def __init__(self, name, policies = dict()):
+ DIF.__init__(self, name)
+ self.policies = policies
+
+ def add_policy(self, comp, pol):
+ self.policies[comp] = pol
+
+ def del_policy(self, comp):
+ del self.policies[comp]
+
+ def __repr__(self):
+ s = DIF.__repr__(self)
+ for comp, pol in self.policies.items():
+ s += "\n Component %s has policy %s" % (comp, pol)
+ return s
+
+# A node in the experiment
+#
+# @difs: DIFs the node will have an IPCP in
+# @dif_registrations: Which DIF is registered in which DIF
+# @registrations: Registrations of names in DIFs
+# @bindings: Binding of names on the processing system
+#
+class Node:
+ def __init__(self, name, difs = set(),
+ dif_registrations = dict(),
+ registrations = dict(),
+ bindings = dict()):
+ self.name = name
+ self.difs = difs
+ self.dif_registrations = dif_registrations
+ self.registrations = registrations
+ self.bindings = bindings
+
+ def __repr__(self):
+ s = "Node " + self.name + ":\n"
+ s += " IPCPs in DIFs: ["
+ for d in self.difs:
+ s += " %s" % d.name
+ s += " ]\n"
+ s += " DIF registrations: [ "
+ for dif_a, difs in self.dif_registrations.items():
+ s += "%s => [" % dif_a.name
+ for dif_b in difs:
+ s += " %s" % dif_b.name
+ s += " ]"
+ s += " ]\n"
+ s += " Name registrations: [ "
+ for name, difs in self.registrations.items():
+ s += "%s => [" % name
+ for dif in difs:
+ s += " %s" % dif.name
+ s += " ]"
+ s += " ]\n"
+ s += " Bindings: [ "
+ for ap, name in self.bindings.items():
+ s += "'%s' => '%s'" % (ap, name)
+ s += " ]\n"
+ return s
+
+ def add_dif_registration(self, dif_a, dif_b):
+ self.dif_registrations[dif_a].append(dif_b)
+
+ def del_dif_registration(self, dif_a, dif_b):
+ self.dif_registrations[dif_a].remove(dif_b)
+
+ def add_registration(self, name, dif):
+ self.dif_registrations[name].append(dif)
+
+ def del_registration(self, name, dif):
+ self.dif_registrations[name].remove(dif)
+
+ def add_binding(self, name, ap):
+ self.dif_bindings[name] = ap
+
+ def del_binding(self, name):
+ del self.dif_bindings[name]
+
+# Base class for ARCFIRE experiments
+#
+# @name [string] Name of the experiment
+# @nodes: Nodes in the experiment
+#
+class Experiment:
+ def __init__(self, name, nodes = set()):
+ self.name = name
+ self.nodes = nodes
+
+ def __repr__(self):
+ s = "%s:" % self.name
+ for n in self.nodes:
+ s += "\n" + str(n)
+
+ return s
+
+ def add_node(self, node):
+ self.nodes.append(node)
+
+ def add_node(self, node):
+ self.nodes.remove(node)
+
+ def run(self):
+ print("[Experiment %s] start" % self.name)
+ print("[Experiment %s] end" % self.name)
+
+
+# An experiment over the IRATI implementation
+class IRATIExperiment(Experiment):
+ def __init__(self, name, nodes = set()):
+ Experiment.__init__(self, name, nodes)
+
+ def run(self):
+ print("[IRATI experiment %s] start" % self.name)
+ print("[IRATI experiment %s] end" % self.name)
+
+
+# An experiment over the RLITE implementation
+class RLITEExperiment(Experiment):
+ def __init__(self, name, nodes = set()):
+ Experiment.__init__(self, name, nodes)
+
+ def run(self):
+ print("[RLITE experiment %s] start" % self.name)
+ print("[RLITE experiment %s] end" % self.name)
+
+
+# An experiment over the Ouroboros implementation
+class OuroborosExperiment(Experiment):
+ def __init__(self, name, nodes = set()):
+ Experiment.__init__(self, name, nodes)
+
+ def run(self):
+ print("[Ouroboros experiment %s] start" % self.name)
+ print("[Ouroboros experiment %s] end" % self.name)