X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3base.py;h=fa4ce585d8d950d179f74f43d3d1effd8c2de39a;hb=999ef8574031b2e3facce8607b6e91f42af6dc66;hp=358011a85ef75aed5173bd5da212f793707de77e;hpb=6c5f918917a34e7093f5fdace2755094ec70752e;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3base.py b/src/nepi/resources/ns3/ns3base.py index 358011a8..fa4ce585 100644 --- a/src/nepi/resources/ns3/ns3base.py +++ b/src/nepi/resources/ns3/ns3base.py @@ -19,22 +19,19 @@ from nepi.execution.resource import ResourceManager, clsinit_copy, \ ResourceState, reschedule_delay - from nepi.execution.attribute import Flags - -reschedule_delay = "2s" +from nepi.execution.trace import TraceAttr @clsinit_copy class NS3Base(ResourceManager): _rtype = "abstract::ns3::Object" _backend_type = "ns3" - SIMULATOR_UUID = "singleton::Simulator" - def __init__(self, ec, guid): super(NS3Base, self).__init__(ec, guid) self._uuid = None self._connected = set() + self._trace_filename = dict() @property def connected(self): @@ -55,6 +52,14 @@ class NS3Base(ResourceManager): if nodes: return nodes[0] return None + def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0): + filename = self._trace_filename.get(name) + if not filename: + self.error("Can not resolve trace %s. Did you enabled it?" % name) + return "" + + return self.simulation.trace(filename, attr, block, offset) + @property def _rms_to_wait(self): """ Returns the collection of ns-3 RMs that this RM needs to @@ -75,10 +80,10 @@ class NS3Base(ResourceManager): kwargs = dict() for attr in self._attrs.values(): - if not (attr.has_changed() and attr.has_flag(Flags.Construct)): + if not ( attr.has_flag(Flags.Construct) and attr.has_changed ): continue - kwargs[attr.name] = attr.value + kwargs[attr.name] = attr._value self._uuid = self.simulation.factory(self.get_rtype(), **kwargs) @@ -94,14 +99,11 @@ class NS3Base(ResourceManager): def _wait_rms(self): """ Returns True if dependent RMs are not yer READY, False otherwise""" for rm in self._rms_to_wait: - if rm and rm.state < ResourceState.READY: + if rm.state < ResourceState.READY: return True return False def do_provision(self): - # TODO: create run dir for ns3 object !!!! - # self.simulation.node.mkdir(self.run_home) - self._instantiate_object() self._connect_object() self._configure_object() @@ -115,7 +117,6 @@ class NS3Base(ResourceManager): self.debug("---- RESCHEDULING DEPLOY ----" ) self.ec.schedule(reschedule_delay, self.deploy) else: - self.info("Entering deploy") self.do_discover() self.do_provision() @@ -141,3 +142,23 @@ class NS3Base(ResourceManager): def state(self): return self._state + def get(self, name): + if self.state in [ResourceState.READY, ResourceState.STARTED] and \ + self.has_flag(name, Flags.Reserved) and \ + not self.has_flag(name, Flags.NoRead): + return self.simulation.ns3_get(self.uuid, name) + else: + value = super(NS3Base, self).get(name) + + return value + + def set(self, name, value): + if self.state in [ResourceState.READY, ResourceState.STARTED] and \ + self.has_flag(name, Flags.Reserved) and \ + not (self.has_flag(Flags.NoWrite) or self.has_flag(name, Flags.Design)): + self.simulation.ns3_set(self.uuid, name, value) + + value = super(NS3Base, self).set(name, value) + + return value +