X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fplanetlab%2Ftap.py;h=d9cf17c3bddea2b6ab8ad6d42a0829975f3962ee;hb=99d8b2a4431d8fafd0385e189375106d46f1abd9;hp=411eb5149e10a7f396693eb59512e9ebe25a4b7e;hpb=bf43c83ced9389c8fa9468d7c23f67d35af963da;p=nepi.git diff --git a/src/nepi/resources/planetlab/tap.py b/src/nepi/resources/planetlab/tap.py index 411eb514..d9cf17c3 100644 --- a/src/nepi/resources/planetlab/tap.py +++ b/src/nepi/resources/planetlab/tap.py @@ -19,7 +19,7 @@ from nepi.execution.attribute import Attribute, Flags, Types from nepi.execution.resource import clsinit_copy, ResourceState, \ - reschedule_delay + reschedule_delay, failtrap from nepi.resources.linux.application import LinuxApplication from nepi.resources.planetlab.node import PlanetlabNode from nepi.util.timefuncs import tnow, tdiffsec @@ -36,6 +36,8 @@ PYTHON_VSYS_VERSION = "1.0" @clsinit_copy class PlanetlabTap(LinuxApplication): _rtype = "PlanetlabTap" + _help = "Creates a TAP device on a PlanetLab host" + _backend = "planetlab" @classmethod def _register_attributes(cls): @@ -145,6 +147,7 @@ class PlanetlabTap(LinuxApplication): if_name = self.wait_if_name() self.set("deviceName", if_name) + @failtrap def deploy(self): if not self.node or self.node.state < ResourceState.PROVISIONED: self.ec.schedule(reschedule_delay, self.deploy) @@ -158,16 +161,13 @@ class PlanetlabTap(LinuxApplication): if not self.get("install"): self.set("install", self._install) - try: - self.discover() - self.provision() - except: - self.fail() - raise - + self.discover() + self.provision() + self.debug("----- READY ---- ") self.set_ready() + @failtrap def start(self): if self.state == ResourceState.READY: command = self.get("command") @@ -177,9 +177,9 @@ class PlanetlabTap(LinuxApplication): else: msg = " Failed to execute command '%s'" % command self.error(msg, out, err) - self.fail() raise RuntimeError, msg + @failtrap def stop(self): command = self.get('command') or '' @@ -204,8 +204,7 @@ class PlanetlabTap(LinuxApplication): if out.strip().find(self.get("deviceName")) == -1: # tap is not running is not running (socket not found) - self._finish_time = tnow() - self._state = ResourceState.FINISHED + self.finish() self._last_state_check = tnow() @@ -214,12 +213,17 @@ class PlanetlabTap(LinuxApplication): def release(self): # Node needs to wait until all associated RMs are released # to be released - from nepi.resources.linux.udptunnel import UdpTunnel - rms = self.get_connected(UdpTunnel.rtype()) - for rm in rms: - if rm.state < ResourceState.STOPPED: - self.ec.schedule(reschedule_delay, self.release) - return + try: + from nepi.resources.linux.udptunnel import UdpTunnel + rms = self.get_connected(UdpTunnel.rtype()) + for rm in rms: + if rm.state < ResourceState.STOPPED: + self.ec.schedule(reschedule_delay, self.release) + return + except: + import traceback + err = traceback.format_exc() + self.error(err) super(PlanetlabTap, self).release() @@ -241,7 +245,6 @@ class PlanetlabTap(LinuxApplication): else: msg = "Couldn't retrieve if_name" self.error(msg, out, err) - self.fail() raise RuntimeError, msg return if_name