get_attribute_value("tapPortBase")
self.p2pDeployment = self._attributes.\
get_attribute_value("p2pDeployment")
+ self.dedicatedSlice = self._attributes.\
+ get_attribute_value("dedicatedSlice")
self._logger.setLevel(getattr(logging,self.logLevel))
for trace in self._traces.itervalues():
trace.close()
- runner = ParallelRun(16)
- runner.start()
- for element in self._elements.itervalues():
- # invoke cleanup hooks
- if hasattr(element, 'cleanup'):
- runner.put(element.cleanup)
- runner.join()
-
- runner = ParallelRun(16)
- runner.start()
- for element in self._elements.itervalues():
- # invoke destroy hooks
- if hasattr(element, 'destroy'):
- runner.put(element.destroy)
- runner.join()
+ def invokeif(action, testbed, guid):
+ element = self._elements[guid]
+ if hasattr(element, action):
+ getattr(element, action)()
+ self._do_in_factory_order(
+ functools.partial(invokeif, 'cleanup'),
+ metadata.shutdown_order)
+
+ self._do_in_factory_order(
+ functools.partial(invokeif, 'destroy'),
+ metadata.shutdown_order)
+
self._elements.clear()
self._traces.clear()
return app
def _make_node(self, parameters):
- return self._make_generic(parameters, self._node.Node)
+ node = self._make_generic(parameters, self._node.Node)
+ node.enable_cleanup = self.dedicatedSlice
+ return node
def _make_node_iface(self, parameters):
return self._make_generic(parameters, self._interfaces.NodeIface)
self.ident_path = None
self.server_key = None
self.home_path = None
+ self.enable_cleanup = False
# Those are filled when an actual node is allocated
self._node_id = None
# If we're above that delay, the unresponsiveness is not due
# to this delay.
raise UnresponsiveNodeError, "Unresponsive host %s" % (self.hostname,)
+
+ # Ensure the node is clean (no apps running that could interfere with operations)
+ if self.enable_cleanup:
+ self.do_cleanup()
def wait_dependencies(self, pidprobe=1, probe=0.5, pidmax=10, probemax=10):
# Wait for the p2p installer
else:
return False
+ def destroy(self):
+ if self.enable_cleanup:
+ self.do_cleanup()
+
+ def do_cleanup(self):
+ self._logger.info("Cleaning up %s", self.hostname)
+
+ (out,err),proc = server.popen_ssh_command(
+ # Some apps need two kills
+ "sudo -S killall -u %(slicename)s ; sudo -S killall -u root ; "
+ "sudo -S killall -u %(slicename)s ; sudo -S killall -u root" % {
+ 'slicename' : self.slicename ,
+ },
+ host = self.hostname,
+ port = None,
+ user = self.slicename,
+ agent = None,
+ ident_key = self.ident_path,
+ server_key = self.server_key
+ )
+ proc.wait()
+
def prepare_dependencies(self):
# Configure p2p yum dependency installer
if self.required_packages and not self._installed:
"- PL can only handle rules over virtual interfaces. Candidates are: %s" % (route,devs)
self._logger.info("Setting up routes for %s", self.hostname)
+ self._logger.debug("Routes for %s:\n\t%s", self.hostname, '\n\t'.join(rules))
(out,err),proc = server.popen_ssh_command(
- "( sudo -S bash -c 'cat /vsys/vroute.out >&2' & ) ; sudo -S bash -c 'cat > /vsys/vroute.in' ; sleep 0.1" % dict(
+ "( sudo -S bash -c 'cat /vsys/vroute.out >&2' & ) ; sudo -S bash -c 'cat > /vsys/vroute.in' ; sleep 0.5" % dict(
home = server.shell_escape(self.home_path)),
host = self.hostname,
port = None,
if proc.wait() or err:
raise RuntimeError, "Could not set routes (%s) errors: %s%s" % (rules,out,err)
+ elif out or err:
+ logger.debug("Routes said: %s%s", out, err)