The directory structure used by LinuxApplication RM at the Linux
host is the following:
- ${HOME}/nepi-usr --> Base directory for multi-experiment files
+ ${HOME}/.nepi/nepi-usr --> Base directory for multi-experiment files
|
${LIB} |- /lib --> Base directory for libraries
${BIN} |- /bin --> Base directory for binary files
${SRC} |- /src --> Base directory for sources
${SHARE} |- /share --> Base directory for other files
- ${HOME}/nepi-exp --> Base directory for single-experiment files
+ ${HOME}/.nepi/nepi-exp --> Base directory for single-experiment files
|
${EXP_HOME} |- /<exp-id> --> Base directory for experiment exp-id
|
"Space-separated list of packages required to run the application",
flags = Flags.Design)
sources = Attribute("sources",
- "Space-separated list of regular files to be uploaded to ${SRC} "
+ "semi-colon separated list of regular files to be uploaded to ${SRC} "
"directory prior to building. Archives won't be expanded automatically. "
"Sources are globally available for all experiments unless "
"cleanHome is set to True (This will delete all sources). ",
# timestamp of last state check of the application
self._last_state_check = tnow()
-
+
def log_message(self, msg):
return " guid %d - host %s - %s " % (self.guid,
self.node.get("hostname"), msg)
"""
return self.get("forwardX11") or self._in_foreground
+ def trace_filepath(self, filename):
+ return os.path.join(self.run_home, filename)
+
def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0):
self.info("Retrieving '%s' trace %s " % (name, attr))
- path = os.path.join(self.run_home, name)
+ path = self.trace_filepath(name)
command = "(test -f %s && echo 'success') || echo 'error'" % path
(out, err), proc = self.node.execute(command)
return out
def do_provision(self):
+ # take a snapshot of the system if user is root
+ # to assure cleanProcess kill every nepi process
+ if self.node.get("username") == 'root':
+ import pickle
+ 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"))
+
# create run dir for application
self.node.mkdir(self.run_home)
stdout = "deploy_stdout",
stderr = "deploy_stderr")
- def upload_sources(self):
+ def upload_sources(self, src_dir = None):
sources = self.get("sources")
command = ""
+ if not src_dir:
+ src_dir = self.node.src_dir
+
if sources:
self.info("Uploading sources ")
- sources = sources.split(' ')
+ sources = map(str.strip, sources.split(";"))
# Separate sources that should be downloaded from
# the web, from sources that should be uploaded from
command.append( " ( "
# Check if the source already exists
- " ls ${SRC}/%(basename)s "
+ " ls %(src_dir)s/%(basename)s "
" || ( "
# If source doesn't exist, download it and check
# that it it downloaded ok
- " wget -c --directory-prefix=${SRC} %(source)s && "
- " ls ${SRC}/%(basename)s "
+ " wget -c --directory-prefix=%(src_dir)s %(source)s && "
+ " ls %(src_dir)s/%(basename)s "
" ) ) " % {
"basename": os.path.basename(source),
- "source": source
+ "source": source,
+ "src_dir": src_dir
})
command = " && ".join(command)
command = self.replace_paths(command)
if sources:
- sources = ' '.join(sources)
- self.node.upload(sources, self.node.src_dir, overwrite = False)
+ sources = ';'.join(sources)
+ self.node.upload(sources, src_dir, overwrite = False)
return command
sudo = self._sudo_kill)
# TODO: check if execution errors occurred
- if proc.poll() or err:
+ if (proc and proc.poll()) or err:
msg = " Failed to STOP command '%s' " % self.get("command")
self.error(msg, out, err)