Source code for nepi.resources.netns.netnsbase
#
# NEPI, a framework to manage network experiments
# Copyright (C) 2014 INRIA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation;
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Alina Quereilhac <alina.quereilhac@inria.fr>
from nepi.execution.resource import ResourceManager, clsinit_copy, \
ResourceState
from nepi.execution.attribute import Flags
from nepi.execution.trace import TraceAttr
@clsinit_copy
[docs]class NetNSBase(ResourceManager):
_rtype = "abstract::netns::Object"
_platform = "netns"
def __init__(self, ec, guid):
super(NetNSBase, self).__init__(ec, guid)
self._uuid = None
self._connected = set()
self._trace_filename = dict()
@property
[docs] def connected(self):
return self._connected
@property
[docs] def uuid(self):
return self._uuid
[docs] 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.emulation.trace(filename, attr, block, offset)
@property
def _rms_to_wait(self):
""" Returns the collection of RMs that this RM needs to
wait for before start
This method should be overriden to wait for other
objects to be deployed before proceeding with the deployment
"""
raise RuntimeError, "No dependencies defined!"
def _instantiate_object(self):
pass
def _wait_rms(self):
rms = set()
for rm in self._rms_to_wait:
if rm is not None:
rms.add(rm)
""" Returns True if dependent RMs are not yer READY, False otherwise"""
for rm in rms:
if rm.state < ResourceState.READY:
return True
return False
[docs] def do_provision(self):
self._instantiate_object()
self.info("Provisioning finished")
super(NetNSBase, self).do_provision()
[docs] def do_deploy(self):
if self._wait_rms():
self.debug("---- RESCHEDULING DEPLOY ----" )
self.ec.schedule(self.reschedule_delay, self.deploy)
else:
self.do_discover()
self.do_provision()
self.set_ready()
[docs] def do_start(self):
if self.state == ResourceState.READY:
# No need to do anything, emulation.Run() will start every object
self.info("Starting")
self.set_started()
else:
msg = " Failed "
self.error(msg, out, err)
raise RuntimeError, msg
[docs] def do_stop(self):
if self.state == ResourceState.STARTED:
# No need to do anything, emulation.Destroy() will stop every object
self.set_stopped()
@property
[docs] def state(self):
return self._state
[docs] def get(self, name):
#flags = Flags.NoWrite | Flags.NoRead | Flags.Design
flags = Flags.Design
if self._state in [ResourceState.READY, ResourceState.STARTED] \
and not self.has_flag(name, flags):
return self.emulation.emu_get(self.uuid, name)
value = super(NetNSBase, self).get(name)
return value
[docs] def set(self, name, value):
flags = Flags.Design
if (self._state > ResourceState.NEW and \
self.has_flag(name, Flags.Design)) or \
self.has_flag(name, Flags.NoWrite):
out = err = ""
msg = " Cannot change Design only attribue %s" % name
self.error(msg, out, err)
return
if self._state in [ResourceState.READY, ResourceState.STARTED]:
self.emulation.emu_set(self.uuid, name, value)
value = super(NetNSBase, self).set(name, value)
return value