X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fapplication.py;h=35a78849485d1ce9d43f1c05ded78effdc188a99;hb=327c0ed98930e561cf240a2e4d0b2ddd2d4c1c84;hp=4a90392c6a405e334583dbdc0759dc37d290175d;hpb=5cdfecff9302bf2621430bd0fc612af693a76fd6;p=nepi.git diff --git a/src/nepi/resources/linux/application.py b/src/nepi/resources/linux/application.py index 4a90392c..35a78849 100644 --- a/src/nepi/resources/linux/application.py +++ b/src/nepi/resources/linux/application.py @@ -107,19 +107,19 @@ class LinuxApplication(ResourceManager): "cleanHome is set to True (This will delete all sources). ", flags = Flags.Design) files = Attribute("files", - "Space-separated list of regular miscellaneous files to be uploaded " + "semi-colon separated list of regular miscellaneous files to be uploaded " "to ${SHARE} directory. " "Files are globally available for all experiments unless " "cleanHome is set to True (This will delete all files). ", flags = Flags.Design) libs = Attribute("libs", - "Space-separated list of libraries (e.g. .so files) to be uploaded " + "semi-colon separated list of libraries (e.g. .so files) to be uploaded " "to ${LIB} directory. " "Libraries are globally available for all experiments unless " "cleanHome is set to True (This will delete all files). ", flags = Flags.Design) bins = Attribute("bins", - "Space-separated list of binary files to be uploaded " + "semi-colon separated list of binary files to be uploaded " "to ${BIN} directory. " "Binaries are globally available for all experiments unless " "cleanHome is set to True (This will delete all files). ", @@ -173,7 +173,9 @@ class LinuxApplication(ResourceManager): super(LinuxApplication, self).__init__(ec, guid) self._pid = None self._ppid = None + self._node = None self._home = "app-%s" % self.guid + # whether the command should run in foreground attached # to a terminal self._in_foreground = False @@ -194,9 +196,16 @@ class LinuxApplication(ResourceManager): @property def node(self): - node = self.get_connected(LinuxNode.get_rtype()) - if node: return node[0] - return None + if not self._node: + node = self.get_connected(LinuxNode.get_rtype()) + if not node: + msg = "Application %s guid %d NOT connected to Node" % ( + self._rtype, self.guid) + raise RuntimeError, msg + + self._node = node[0] + + return self._node @property def app_home(self): @@ -282,10 +291,11 @@ class LinuxApplication(ResourceManager): procs = dict() ps_aux = "ps aux |awk '{print $2,$11}'" (out, err), proc = self.node.execute(ps_aux) - for line in out.strip().split("\n"): - parts = line.strip().split(" ") - procs[parts[0]] = parts[1] - pickle.dump(procs, open("/tmp/save.proc", "wb")) + if len(out) != 0: + for line in out.strip().split("\n"): + parts = line.strip().split(" ") + procs[parts[0]] = parts[1] + pickle.dump(procs, open("/tmp/save.proc", "wb")) # create run dir for application self.node.mkdir(self.run_home) @@ -359,6 +369,13 @@ class LinuxApplication(ResourceManager): def execute_deploy_command(self, command, prefix="deploy"): if command: + # 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) + # Upload the command to a bash script and run it # in background ( but wait until the command has # finished to continue ) @@ -627,21 +644,27 @@ 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): self.info("Releasing resource") + self.do_stop() + tear_down = self.get("tearDown") if tear_down: self.node.execute(tear_down) - self.do_stop() + hard_release = self.get("hardRelease") + if hard_release: + self.node.rmdir(self.app_home) super(LinuxApplication, self).do_release() @@ -699,6 +722,7 @@ class LinuxApplication(ResourceManager): def execute_command(self, command, env = None, sudo = False, + tty = False, forward_x11 = False, blocking = False): @@ -710,6 +734,7 @@ class LinuxApplication(ResourceManager): return self.node.execute(command, sudo = sudo, + tty = tty, forward_x11 = forward_x11, blocking = blocking)