6 Definition of a Trigger ART test to be configured and executed
13 from collections
import OrderedDict
15 from TrigValTools.TrigValSteering.Common
import get_logger, art_result, clear_art_summary, package_prefix_dict
16 from TrigValTools.TrigValSteering.Step
import get_step_from_list, get_step_type_from_list
20 '''Definition of a Trigger ART test to be configured and executed'''
43 self.
log.
debug(
'Configuring check step %s', step.name)
47 if len(duplicate_names) > 0:
49 'Found test steps with duplicate names: '
50 '{}'.
format(duplicate_names)+
' Aborting because this'
51 ' configuration could lead to overwriting logs')
56 env = os.environ.get(
'TRIGVALSTEERING_DRY_RUN')
64 'Test configuration complete:\n-- %s',
65 '\n-- '.
join([
'{}: {}'.
format(k, v)
for k, v
in self.__dict__.
items()]))
77 commands = OrderedDict()
81 if len(pre_exec_cmd) > 0:
82 commands[
'pre_exec'] = pre_exec_cmd
84 commands[
'exec_steps'] = []
85 commands[
'check_steps'] = []
94 if step.result > exec_summary:
95 exec_summary = step.result
97 self.
log.
info(
'At least one of the exec steps failed, using the largest code as ExecSummary')
99 self.
log.
info(
'All exec steps succeeded')
108 with open(
'commands.json',
'w')
as outfile:
109 json.dump(commands, outfile, indent=4)
113 failed_required_steps = []
115 if step.required
and (step.result != 0):
116 self.
log.
debug(
'Required step %s finished with result %s', step.name, step.result)
117 failed_required_steps.append(step.name)
118 if abs(step.result) > exit_code:
119 exit_code = abs(step.result)
120 exit_msg =
'Test {:s} finished with code {:d}'.
format(self.
name, exit_code)
122 exit_msg +=
' because all required steps were successful'
124 exit_msg +=
' because the following required steps failed: {:s}'.
format(
str(failed_required_steps))
128 def run_steps(self, steps, commands_list, exec_status=0):
131 if (previous_code != 0
and step.depends_on_previous)
or \
132 (exec_status != 0
and step.depends_on_exec):
133 self.
log.
error(
'Skipping step %s because previous step(s) failed', step.name)
135 code, cmd = step.result,
'# Skipped {} because of earlier failure'.
format(step.name)
136 if step.auto_report_result:
139 code, cmd = step.run(self.
dry_run)
141 commands_list.append(cmd)
144 '''Set default timeout values for steps which don't have it set'''
146 if exec_step.timeout
is None:
148 exec_step.timeout = 12*3600
if self.
art_type ==
'grid' else 3600
150 if check_step.timeout
is None:
152 check_step.timeout = 5*60
155 filename = os.path.basename(sys.argv[0])
156 self.
log.
debug(
'Parsing file name %s', filename)
159 if not filename.startswith(prefix)
or not filename.endswith(suffix):
161 'Test file name {} does not match '.
format(filename) +
162 'the required pattern {}*{}'.
format(prefix, suffix))
163 for package_name, package_prefix
in package_prefix_dict.items():
164 if filename.startswith(prefix+package_prefix):
166 this_package_prefix = package_prefix
169 'Test file name {} could not be matched '.
format(filename) +
170 'to any of the required package prefixes: {}'.
format(
171 package_prefix_dict.values()))
174 'Incorrect test art_type = {:s}, only "build" and "grid" are supported'.
format(self.
art_type))
175 if not filename.endswith(
'_' + self.
art_type + suffix)
and \
178 'Test file name does not match the art_type="{:s}". '.
format(self.
art_type) +
179 'Expected name {:s}'.
format(prefix+this_package_prefix+
'*_'+self.
art_type+suffix))
181 if len(filename) > max_len:
183 'Test file name is too long. The limit is {} '.
format(max_len) +
184 'characters, but it has {}'.
format(len(filename)))
185 self.
name = filename[len(prefix):-len(suffix)]
190 d.setdefault(step.name, 0)
193 d.setdefault(step.name, 0)
195 duplicates = [name
for name, count
in d.items()
if count > 1]
197 self.
log.
debug(
'duplicates: %s', duplicates)
218 '''Extra pre-exec function executed just before the steps'''
222 cmd =
'which art.py >/dev/null 2>&1'
223 art_available = subprocess.call(cmd, shell=
True)
224 if art_available == 0:
225 cmd =
'art.py createpoolfile'
226 self.
log.
debug(
'Executing pre-exec command %s', cmd)
227 subprocess.call(cmd, shell=
True)