X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fall%2Fcollector.py;h=4729e0153b7774d4973b4e4d22bbc6d0eed0a753;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=864750e62107e39402e1b18fefa6e3c366564eb5;hpb=99d8b2a4431d8fafd0385e189375106d46f1abd9;p=nepi.git diff --git a/src/nepi/resources/all/collector.py b/src/nepi/resources/all/collector.py index 864750e6..4729e015 100644 --- a/src/nepi/resources/all/collector.py +++ b/src/nepi/resources/all/collector.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, ResourceAction, failtrap + ResourceState, ResourceAction from nepi.util.sshfuncs import ProcStatus import os @@ -28,7 +27,7 @@ import tempfile @clsinit_copy class Collector(ResourceManager): - """ The collector is reponsible of collecting traces + """ The collector entity is reponsible of collecting traces of a same type associated to RMs into a local directory. .. class:: Class Args : @@ -43,22 +42,23 @@ class Collector(ResourceManager): _help = "A Collector can be attached to a trace name on another " \ "ResourceManager and will retrieve and store the trace content " \ "in a local file at the end of the experiment" - _backend_type = "all" + _platform = "all" @classmethod def _register_attributes(cls): - trace_name = Attribute("traceName", "Name of the trace to be collected", - flags = Flags.ExecReadOnly) - store_dir = Attribute("storeDir", "Path to local directory to store trace results", - default = tempfile.gettempdir(), - flags = Flags.ExecReadOnly) - sub_dir = Attribute("subDir", "Sub directory to collect traces into", - flags = Flags.ExecReadOnly) - rename = Attribute("rename", "Name to give to the collected trace file", - flags = Flags.ExecReadOnly) + trace_name = Attribute("traceName", + "Name of the trace to be collected", + flags = Flags.Design) + + sub_dir = Attribute("subDir", + "Sub directory to collect traces into", + flags = Flags.Design) + + rename = Attribute("rename", + "Name to give to the collected trace file", + flags = Flags.Design) cls._register_attribute(trace_name) - cls._register_attribute(store_dir) cls._register_attribute(sub_dir) cls._register_attribute(rename) @@ -70,25 +70,23 @@ class Collector(ResourceManager): def store_path(self): return self._store_path - @failtrap - def provision(self): + def do_provision(self): trace_name = self.get("traceName") if not trace_name: self.fail() msg = "No traceName was specified" self.error(msg) - raise RuntimeError, msg + raise RuntimeError(msg) - store_dir = self.get("storeDir") - self._store_path = os.path.join(store_dir, self.ec.exp_id, self.ec.run_id) + self._store_path = self.ec.run_dir subdir = self.get("subDir") if subdir: - self._store_path = os.path.join(self._store_path, subdir) + self._store_path = os.path.join(self.store_path, subdir) msg = "Creating local directory at %s to store %s traces " % ( - store_dir, trace_name) + self.store_path, trace_name) self.info(msg) try: @@ -96,44 +94,40 @@ class Collector(ResourceManager): except OSError: pass - super(Collector, self).provision() + super(Collector, self).do_provision() - @failtrap - def deploy(self): - self.discover() - self.provision() + def do_deploy(self): + self.do_discover() + self.do_provision() - super(Collector, self).deploy() + super(Collector, self).do_deploy() - def release(self): - try: - trace_name = self.get("traceName") - rename = self.get("rename") or trace_name + def do_release(self): + trace_name = self.get("traceName") + rename = self.get("rename") or trace_name + + msg = "Collecting '%s' traces to local directory %s" % ( + trace_name, self.store_path) + self.info(msg) - msg = "Collecting '%s' traces to local directory %s" % ( - trace_name, self.store_path) - self.info(msg) + rms = self.get_connected() + for rm in rms: + fpath = os.path.join(self.store_path, "%d.%s" % (rm.guid, + rename)) - rms = self.get_connected() - for rm in rms: + try: result = self.ec.trace(rm.guid, trace_name) - fpath = os.path.join(self.store_path, "%d.%s" % (rm.guid, - rename)) - try: - f = open(fpath, "w") + with open(fpath, "w") as f: f.write(result) - f.close() - except: - msg = "Couldn't retrieve trace %s for %d at %s " % (trace_name, - rm.guid, fpath) - self.error(msg) - continue - except: - import traceback - err = traceback.format_exc() - self.error(err) - - super(Collector, self).release() + except: + import traceback + err = traceback.format_exc() + msg = "Couldn't retrieve trace %s for %d at %s " % (trace_name, + rm.guid, fpath) + self.error(msg, out = "", err = err) + continue + + super(Collector, self).do_release() def valid_connection(self, guid): # TODO: Validate!