2 # NEPI, a framework to manage network experiments
3 # Copyright (C) 2014 INRIA
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License version 2 as
7 # published by the Free Software Foundation;
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19 from nepi.execution.resource import ResourceManager, clsinit_copy, \
21 from nepi.execution.attribute import Flags
22 from nepi.execution.trace import TraceAttr
25 class NetNSBase(ResourceManager):
26 _rtype = "abstract::netns::Object"
29 def __init__(self, ec, guid):
30 super(NetNSBase, self).__init__(ec, guid)
32 self._connected = set()
33 self._trace_filename = dict()
37 return self._connected
43 def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0):
44 filename = self._trace_filename.get(name)
46 self.error("Can not resolve trace %s. Did you enabled it?" % name)
49 return self.emulation.trace(filename, attr, block, offset)
52 def _rms_to_wait(self):
53 """ Returns the collection of RMs that this RM needs to
56 This method should be overriden to wait for other
57 objects to be deployed before proceeding with the deployment
60 raise RuntimeError("No dependencies defined!")
62 def _instantiate_object(self):
67 for rm in self._rms_to_wait:
71 """ Returns True if dependent RMs are not yer READY, False otherwise"""
73 if rm.state < ResourceState.READY:
77 def do_provision(self):
78 self._instantiate_object()
80 self.info("Provisioning finished")
82 super(NetNSBase, self).do_provision()
86 self.debug("---- RESCHEDULING DEPLOY ----" )
87 self.ec.schedule(self.reschedule_delay, self.deploy)
95 if self.state == ResourceState.READY:
96 # No need to do anything, emulation.Run() will start every object
101 self.error(msg, out, err)
102 raise RuntimeError(msg)
105 if self.state == ResourceState.STARTED:
106 # No need to do anything, emulation.Destroy() will stop every object
114 #flags = Flags.NoWrite | Flags.NoRead | Flags.Design
116 if self._state in [ResourceState.READY, ResourceState.STARTED] \
117 and not self.has_flag(name, flags):
118 return self.emulation.emu_get(self.uuid, name)
120 value = super(NetNSBase, self).get(name)
123 def set(self, name, value):
125 if (self._state > ResourceState.NEW and \
126 self.has_flag(name, Flags.Design)) or \
127 self.has_flag(name, Flags.NoWrite):
129 msg = " Cannot change Design only attribue %s" % name
130 self.error(msg, out, err)
133 if self._state in [ResourceState.READY, ResourceState.STARTED]:
134 self.emulation.emu_set(self.uuid, name, value)
136 value = super(NetNSBase, self).set(name, value)