3 Defines the base interface that component classes should extend.
11 from ._config
import convert_config_value
12 from hpsmc
import global_config
17 Base class for components in a job.
19 Do not perform any logging in the init method of Component subclasses,
20 as this is not configured by the job manager until after the components
23 Optional parameters are: **nevents**, **seed**
25 @param name name of the component
26 @param command command to execute
27 @param nevents number of events to process
28 @param seed random seed
29 @param inputs list of input files
30 @param outputs list of output files
31 @param append_tok token to append to output file names
32 @param output_ext extension to append to output file names; format is .ext
33 @param ignore_job_params list of parameters to ignore when setting parameters
34 @param kwargs additional keyword arguments
61 self.
hpsmc_dirhpsmc_dir = os.getenv(
"HPSMC_DIR",
None)
63 raise Exception(
"The HPSMC_DIR is not set!")
66 self.
loggerlogger = logging.getLogger(
"{}.{}".format(__name__, self.__class__.__name__))
73 def execute(self, log_out=sys.stdout, log_err=sys.stderr):
74 """! Generic component execution method.
76 Individual components may override this if specific behavior is required.
78 @param log_out name of log file for output
79 @param log_err name of log file for error
82 proc = subprocess.Popen(self.
cmd_line_strcmd_line_str(), shell=
True, stdout=log_out, stderr=log_err)
86 return proc.returncode
89 """! Check if the component's assigned command exists."""
90 return subprocess.call(
"type " + self.
commandcommand, shell=
True,
91 stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
94 """! Return the command arguments of this component."""
98 """! Return list of arguments, making sure they are all converted to strings."""
99 return [str(c)
for c
in self.
cmd_argscmd_args()]
102 """! Perform any necessary setup for this component to run such as making symlinks
103 to required directories.
108 """! Perform post-job cleanup such as deleting temporary files."""
113 Configure the logging for a component.
115 @param parser the ConfigParser object passed from the job manager
117 classname = self.__class__.__name__
118 if classname
in parser:
119 if 'loglevel' in parser[classname]:
120 loglevel = logging.getLevelName(parser[classname][
'loglevel'])
121 self.logger.setLevel(loglevel)
124 """! Automatic configuration
126 Automatically load attributes from config by reading in values from
127 the section with the same name as the class in the config file and
128 assigning them to class attributes with the same name.
130 @param parser config parser
132 section_name = self.__class__.__name__
133 if parser.has_section(section_name):
134 for name, value
in parser.items(section_name):
136 self.
loggerlogger.debug(
"%s:%s:%s=%s" % (self.
namename,
138 getattr(self, name).__class__.__name__,
139 getattr(self, name)))
142 """! Set class attributes for the component based on JSON parameters.
144 Components should not need to override this method.
146 @param params parameters to setup component
152 raise Exception(
"Required parameter '%s' is missing for component '%s'"
153 % (p, self.
namename))
156 setattr(self, p, params[p])
157 self.
loggerlogger.debug(
"%s:%s=%s [required]" % (self.
namename, p, params[p]))
159 self.
loggerlogger.debug(
"Ignored job param '%s'" % p)
165 setattr(self, p, params[p])
166 self.
loggerlogger.debug(
"%s:%s=%s [optional]" % (self.
namename, p, params[p]))
168 self.
loggerlogger.debug(
"Ignored job param '%s'" % p)
172 Return a list of required parameters.
174 The job will fail if these are not present in the JSON file.
180 Return a list of optional parameters.
182 Optional parameters are: **nevents**, **seed**
184 return [
'nevents',
'seed']
188 Return a list of required configuration settings.
190 There are none by default.
195 """! Raise an exception on the first missing config setting for this component."""
197 if not hasattr(self, c):
198 raise Exception(
'Missing required config attribute: %s:%s' % (self.__class__.__name__, c))
199 if getattr(self, c)
is None:
200 raise Exception(
'Config was not set: %s:%s' % (self.__class__.__name__, c))
203 """! Get a list of input files for this component."""
207 """! Return a list of output files created by this component.
209 By default, a series of transformations will be performed on inputs to
210 transform them into outputs.
218 """! This is the default method for automatically transforming input file names
219 to outputs when output file names are not explicitly provided.
223 f, ext = os.path.splitext(infile)
228 outputs.append(
'%s%s' % (f, ext))
232 """! Configure component from environment variables which are just upper case
233 versions of the required config names set in the shell environment."""
235 self.
loggerlogger.debug(
"Setting config '%s' from environ" % c)
236 if c.upper()
in os.environ:
237 setattr(self, c, os.environ[c.upper()])
238 self.
loggerlogger.debug(
"Set config '%s=%s' from env var '%s'" % (c, getattr(self, c), c.upper()))
240 raise Exception(
"Missing config in environ for '%s'" % c)
244 """! A dummy component that just prints some information instead of executing a program."""
247 Component.__init__(self,
'dummy',
'dummy', **kwargs)
249 def execute(self, log_out=sys.stdout, log_err=sys.stderr):
250 self.
loggerlogger.debug(
"dummy debug")
251 self.
loggerlogger.info(
"dummy info")
252 self.
loggerlogger.warning(
"dummy warn")
253 self.
loggerlogger.critical(
"dummy critical")
254 self.
loggerlogger.error(
"dummy error")
Base class for components in a job.
def check_config(self)
Raise an exception on the first missing config setting for this component.
def required_config(self)
Return a list of required configuration settings.
def cmd_args_str(self)
Return list of arguments, making sure they are all converted to strings.
def __init__(self, name, command=None, nevents=None, seed=1, inputs=[], outputs=None, append_tok=None, output_ext=None, ignore_job_params=[], **kwargs)
def execute(self, log_out=sys.stdout, log_err=sys.stderr)
Generic component execution method.
def config_from_environ(self)
Configure component from environment variables which are just upper case versions of the required con...
def config_logging(self, parser)
Configure the logging for a component.
def _inputs_to_outputs(self)
This is the default method for automatically transforming input file names to outputs when output fil...
def config(self, parser)
Automatic configuration.
def required_parameters(self)
Return a list of required parameters.
def output_files(self)
Return a list of output files created by this component.
def optional_parameters(self)
Return a list of optional parameters.
def input_files(self)
Get a list of input files for this component.
def cmd_exists(self)
Check if the component's assigned command exists.
def cleanup(self)
Perform post-job cleanup such as deleting temporary files.
def setup(self)
Perform any necessary setup for this component to run such as making symlinks to required directories...
def set_parameters(self, params)
Set class attributes for the component based on JSON parameters.
def cmd_args(self)
Return the command arguments of this component.
A dummy component that just prints some information instead of executing a program.
def execute(self, log_out=sys.stdout, log_err=sys.stderr)
Generic component execution method.
def __init__(self, **kwargs)
def convert_config_value(val)
Convert config value to Python readable value.