From b52e886c9042650c70e734be9983614e438b39c8 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Tue, 17 Jan 2017 19:50:46 +0100 Subject: rhumba: Change example script and update rhumba.py This changes the example script for instantiating a network with 2 nodes and a normal DIF between them. It also renames libarcfire.py to rhumba.py and updates its classes to the current example. --- rhumba.py | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100755 rhumba.py (limited to 'rhumba.py') 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) -- cgit v1.2.3