X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fapplication.py;h=1574f63cbf85fbeaa1db7c5161c505b278ac46f6;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=ca9772d1b94489e21d8345219745b32078d8053a;hpb=ec3460fce064ea44366cb417dea0f9e148d3d804;p=nepi.git diff --git a/src/nepi/resources/linux/application.py b/src/nepi/resources/linux/application.py index ca9772d1..1574f63c 100644 --- a/src/nepi/resources/linux/application.py +++ b/src/nepi/resources/linux/application.py @@ -3,9 +3,8 @@ # Copyright (C) 2013 INRIA # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# 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 @@ -20,7 +19,7 @@ from nepi.execution.attribute import Attribute, Flags, Types from nepi.execution.trace import Trace, TraceAttr from nepi.execution.resource import ResourceManager, clsinit_copy, \ - ResourceState, reschedule_delay + ResourceState from nepi.resources.linux.node import LinuxNode from nepi.util.sshfuncs import ProcStatus from nepi.util.timefuncs import tnow, tdiffsec @@ -81,9 +80,9 @@ class LinuxApplication(ResourceManager): """ - _rtype = "LinuxApplication" + _rtype = "linux::Application" _help = "Runs an application on a Linux host with a BASH command " - _backend_type = "linux" + _platform = "linux" @classmethod def _register_attributes(cls): @@ -201,7 +200,7 @@ class LinuxApplication(ResourceManager): if not node: msg = "Application %s guid %d NOT connected to Node" % ( self._rtype, self.guid) - raise RuntimeError, msg + raise RuntimeError(msg) self._node = node[0] @@ -295,7 +294,8 @@ class LinuxApplication(ResourceManager): for line in out.strip().split("\n"): parts = line.strip().split(" ") procs[parts[0]] = parts[1] - pickle.dump(procs, open("/tmp/save.proc", "wb")) + with open("/tmp/save.proc", "wb") as pickle_file: + pickle.dump(procs, pickle_file) # create run dir for application self.node.mkdir(self.run_home) @@ -355,7 +355,6 @@ class LinuxApplication(ResourceManager): # replace application specific paths in the command command = self.replace_paths(command) - # replace application specific paths in the environment env = self.get("env") env = env and self.replace_paths(env) @@ -526,8 +525,8 @@ class LinuxApplication(ResourceManager): # Wait until node is associated and deployed node = self.node if not node or node.state < ResourceState.READY: - self.debug("---- RESCHEDULING DEPLOY ---- node state %s " % self.node.state ) - self.ec.schedule(reschedule_delay, self.deploy) + self.debug("---- RESCHEDULING DEPLOY ---- node state %s " % self.node.state) + self.ec.schedule(self.reschedule_delay, self.deploy) else: command = self.get("command") or "" self.info("Deploying command '%s' " % command) @@ -574,7 +573,7 @@ class LinuxApplication(ResourceManager): if self._proc.poll(): self.error(msg, out, err) - raise RuntimeError, msg + raise RuntimeError(msg) def _run_in_background(self): command = self.get("command") @@ -603,7 +602,7 @@ class LinuxApplication(ResourceManager): if proc.poll(): self.error(msg, out, err) - raise RuntimeError, msg + raise RuntimeError(msg) # Wait for pid file to be generated pid, ppid = self.node.wait_pid(self.run_home) @@ -620,7 +619,7 @@ class LinuxApplication(ResourceManager): if err: msg = " Failed to start command '%s' " % command self.error(msg, out, err) - raise RuntimeError, msg + raise RuntimeError(msg) def do_stop(self): """ Stops application execution @@ -644,11 +643,13 @@ class LinuxApplication(ResourceManager): (out, err), proc = self.node.kill(self.pid, self.ppid, sudo = self._sudo_kill) + """ # TODO: check if execution errors occurred if (proc and proc.poll()) or err: msg = " Failed to STOP command '%s' " % self.get("command") self.error(msg, out, err) - + """ + super(LinuxApplication, self).do_stop() def do_release(self): @@ -718,40 +719,49 @@ class LinuxApplication(ResourceManager): return self._state def execute_command(self, command, - env = None, - sudo = False, - tty = False, - forward_x11 = False, - blocking = False): + env=None, + sudo=False, + tty=False, + forward_x11=False, + blocking=False): environ = "" if env: - environ = self.node.format_environment(env, inline = True) + environ = self.node.format_environment(env, inline=True) command = environ + command command = self.replace_paths(command) return self.node.execute(command, - sudo = sudo, - tty = tty, - forward_x11 = forward_x11, - blocking = blocking) + sudo=sudo, + tty=tty, + forward_x11=forward_x11, + blocking=blocking) - def replace_paths(self, command): + def replace_paths(self, command, node=None, app_home=None, run_home=None): """ Replace all special path tags with shell-escaped actual paths. """ + if not node: + node=self.node + + if not app_home: + app_home=self.app_home + + if not run_home: + run_home = self.run_home + return ( command - .replace("${USR}", self.node.usr_dir) - .replace("${LIB}", self.node.lib_dir) - .replace("${BIN}", self.node.bin_dir) - .replace("${SRC}", self.node.src_dir) - .replace("${SHARE}", self.node.share_dir) - .replace("${EXP}", self.node.exp_dir) - .replace("${EXP_HOME}", self.node.exp_home) - .replace("${APP_HOME}", self.app_home) - .replace("${RUN_HOME}", self.run_home) - .replace("${NODE_HOME}", self.node.node_home) - .replace("${HOME}", self.node.home_dir) + .replace("${USR}", node.usr_dir) + .replace("${LIB}", node.lib_dir) + .replace("${BIN}", node.bin_dir) + .replace("${SRC}", node.src_dir) + .replace("${SHARE}", node.share_dir) + .replace("${EXP}", node.exp_dir) + .replace("${EXP_HOME}", node.exp_home) + .replace("${APP_HOME}", app_home) + .replace("${RUN_HOME}", run_home) + .replace("${NODE_HOME}", node.node_home) + .replace("${HOME}", node.home_dir) ) def valid_connection(self, guid):