diff --git a/CHANGES.md b/CHANGES.md index f9a5fc5d2f8..35fe4088135 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -56,6 +56,9 @@ First Release Candidate for Cylc 8. ### Enhancements +[#3931](https://github.com/cylc/cylc-flow/pull/3931) - +Convert Cylc to use the new "Universal Identifier". + [#4506](https://github.com/cylc/cylc-flow/pull/4506) - Cylc no longer creates a `flow.cylc` symlink to a `suite.rc` file. This only affects you if you have used a prior Cylc 8 pre-release. diff --git a/cylc/flow/__init__.py b/cylc/flow/__init__.py index 4d990d18492..0c9ca85a6b7 100644 --- a/cylc/flow/__init__.py +++ b/cylc/flow/__init__.py @@ -38,10 +38,6 @@ "DEBUG": logging.DEBUG, } -# Used widely with data element ID (internally and externally), -# scope may widen further with internal and CLI adoption. -ID_DELIM = '|' - def environ_init(): """Initialise cylc environment.""" diff --git a/cylc/flow/async_util.py b/cylc/flow/async_util.py index c9d29d04bc2..c1068c867f1 100644 --- a/cylc/flow/async_util.py +++ b/cylc/flow/async_util.py @@ -417,3 +417,44 @@ async def asyncqgen(queue): """Turn a queue into an async generator.""" while not queue.empty(): yield await queue.get() + + +async def unordered_map(coroutine, iterator): + """An asynchronous map function which does not preserve order. + + Use in situations where you want results as they are completed rather than + once they are all completed. + + Example: + # define your async coroutine + >>> async def square(x): return x**2 + + # define your iterator (must yield tuples) + >>> iterator = [(num,) for num in range(5)] + + # use `async for` to iterate over the results + # (sorted in this case so the test is repeatable) + >>> async def test(): + ... ret = [] + ... async for x in unordered_map(square, iterator): + ... ret.append(x) + ... return sorted(ret) + >>> asyncio.run(test()) + [((0,), 0), ((1,), 1), ((2,), 4), ((3,), 9), ((4,), 16)] + + """ + # create tasks + pending = [] + for args in iterator: + task = asyncio.create_task(coroutine(*args)) + task._args = args + pending.append(task) + + # run tasks + while pending: + done, pending = await asyncio.wait( + pending, + return_when=asyncio.FIRST_COMPLETED + ) + for task in done: + yield task._args, task.result() diff --git a/cylc/flow/broadcast_mgr.py b/cylc/flow/broadcast_mgr.py index e42362fd0e6..0d97ba7ffb3 100644 --- a/cylc/flow/broadcast_mgr.py +++ b/cylc/flow/broadcast_mgr.py @@ -20,12 +20,14 @@ from cylc.flow import LOG from cylc.flow.broadcast_report import ( - CHANGE_FMT, CHANGE_PREFIX_SET, + CHANGE_FMT, + CHANGE_PREFIX_SET, get_broadcast_change_report, - get_broadcast_bad_options_report) + get_broadcast_bad_options_report, +) +from cylc.flow.id import Tokens from cylc.flow.cycling.loader import get_point, standardise_point_string from cylc.flow.exceptions import PointParsingError -from cylc.flow.task_id import TaskID ALL_CYCLE_POINTS_STRS = ["*", "all-cycle-points", "all-cycles"] @@ -154,7 +156,9 @@ def get_broadcast(self, task_id=None): # all broadcasts requested return self.broadcasts try: - name, point_string = TaskID.split(task_id) + tokens = Tokens(task_id, relative=True) + name = tokens['task'] + point_string = tokens['cycle'] except ValueError: raise Exception("Can't split task_id %s" % task_id) @@ -206,7 +210,7 @@ def _match_ext_trigger(self, itask): if trig != qmsg: continue # Matched. - point_string = TaskID.split(itask.identity)[1] + point_string = itask.tokens['cycle'] # Set trigger satisfied. itask.state.external_triggers[trig] = True # Broadcast the event ID to the cycle point. diff --git a/cylc/flow/broadcast_report.py b/cylc/flow/broadcast_report.py index 769317236be..72fedb4cbef 100644 --- a/cylc/flow/broadcast_report.py +++ b/cylc/flow/broadcast_report.py @@ -20,7 +20,7 @@ BAD_OPTIONS_TITLE = "No broadcast to cancel/clear for these options:" BAD_OPTIONS_TITLE_SET = ("Rejected broadcast: settings are not" " compatible with the workflow") -CHANGE_FMT = "\n%(change)s [%(namespace)s.%(point)s] %(key)s=%(value)s" +CHANGE_FMT = "\n%(change)s [%(point)s/%(namespace)s] %(key)s=%(value)s" CHANGE_PREFIX_CANCEL = "-" CHANGE_PREFIX_SET = "+" CHANGE_TITLE_CANCEL = "Broadcast cancelled:" diff --git a/cylc/flow/command_polling.py b/cylc/flow/command_polling.py index c0f725893f1..b36709e24aa 100644 --- a/cylc/flow/command_polling.py +++ b/cylc/flow/command_polling.py @@ -63,11 +63,11 @@ def __init__(self, condition, interval, max_polls, args): self.n_polls = 0 self.args = args # any extra parameters needed by check() - def check(self): + async def check(self): """Abstract method. Test polling condition.""" raise NotImplementedError() - def poll(self): + async def poll(self): """Poll for the condition embodied by self.check(). Return True if condition met, or False if polling exhausted.""" @@ -81,7 +81,7 @@ def poll(self): while self.n_polls < self.max_polls: self.n_polls += 1 - if self.check(): + if await self.check(): sys.stdout.write(": satisfied\n") return True if self.max_polls > 1: diff --git a/cylc/flow/config.py b/cylc/flow/config.py index 243f63b4a36..ec6fb7ebdcd 100644 --- a/cylc/flow/config.py +++ b/cylc/flow/config.py @@ -53,6 +53,7 @@ get_sequence, get_sequence_cls, init_cyclers, get_dump_format, INTEGER_CYCLING_TYPE, ISO8601_CYCLING_TYPE ) +from cylc.flow.id import Tokens from cylc.flow.cycling.integer import IntegerInterval from cylc.flow.cycling.iso8601 import ingest_time, ISO8601Interval from cylc.flow.exceptions import ( @@ -100,7 +101,11 @@ ) from cylc.flow.wallclock import ( get_current_time_string, set_utc_mode, get_utc_mode) -from cylc.flow.workflow_files import NO_TITLE, WorkflowFiles +from cylc.flow.workflow_files import ( + NO_TITLE, + WorkflowFiles, + check_deprecation, +) from cylc.flow.xtrigger_mgr import XtriggerManager if TYPE_CHECKING: @@ -180,7 +185,7 @@ def __init__( work_dir: Optional[str] = None, share_dir: Optional[str] = None ) -> None: - + check_deprecation(Path(fpath)) self.mem_log = mem_log_func if self.mem_log is None: self.mem_log = lambda x: None @@ -689,10 +694,12 @@ def process_start_cycle_point(self) -> None: # Start from designated task(s). # Select the earliest start point for use in pre-initial ignore. self.start_point = min( - get_point( - TaskID.split(taskid)[1] - ).standardise() - for taskid in self.options.starttask + get_point(cycle).standardise() + for cycle in [ + Tokens(taskid, relative=True)['cycle'] + for taskid in self.options.starttask + ] + if cycle ) else: # Start from the initial point. @@ -830,7 +837,15 @@ def _check_circular(self): for rhs, lhss in sorted(rhs2lhss.items()): for lhs in sorted(lhss): err_msg += ' %s => %s' % ( - TaskID.get(*lhs), TaskID.get(*rhs)) + Tokens( + cycle=str(lhs[1]), + task=lhs[0] + ).relative_id, + Tokens( + cycle=str(rhs[1]), + task=rhs[0] + ).relative_id, + ) if err_msg: raise WorkflowConfigError( 'circular edges detected:' + err_msg) @@ -1875,25 +1890,43 @@ def _close_families(l_id, r_id, clf_map): lname, lpoint = None, None if l_id: lname, lpoint = l_id - lret = TaskID.get(lname, lpoint) + lret = Tokens( + cycle=str(lpoint), + task=lname, + ).relative_id rret = None rname, rpoint = None, None if r_id: rname, rpoint = r_id - rret = TaskID.get(rname, rpoint) + rret = Tokens( + cycle=str(rpoint), + task=rname, + ).relative_id for fam_name, fam_members in clf_map.items(): if lname in fam_members and rname in fam_members: # l and r are both members - lret = TaskID.get(fam_name, lpoint) - rret = TaskID.get(fam_name, rpoint) + lret = Tokens( + cycle=str(lpoint), + task=fam_name, + ).relative_id + rret = Tokens( + cycle=str(rpoint), + task=fam_name, + ).relative_id break elif lname in fam_members: # l is a member - lret = TaskID.get(fam_name, lpoint) + lret = Tokens( + cycle=str(lpoint), + task=fam_name, + ).relative_id elif rname in fam_members: # r is a member - rret = TaskID.get(fam_name, rpoint) + rret = Tokens( + cycle=str(rpoint), + task=fam_name, + ).relative_id return lret, rret diff --git a/cylc/flow/data_store_mgr.py b/cylc/flow/data_store_mgr.py index b822ca6cd60..b3e1338445b 100644 --- a/cylc/flow/data_store_mgr.py +++ b/cylc/flow/data_store_mgr.py @@ -64,12 +64,13 @@ from typing import Union, Tuple, TYPE_CHECKING import zlib -from cylc.flow import __version__ as CYLC_VERSION, LOG, ID_DELIM -from cylc.flow.exceptions import WorkflowConfigError +from cylc.flow import __version__ as CYLC_VERSION, LOG from cylc.flow.data_messages_pb2 import ( # type: ignore PbEdge, PbEntireWorkflow, PbFamily, PbFamilyProxy, PbJob, PbTask, PbTaskProxy, PbWorkflow, AllDeltas, EDeltas, FDeltas, FPDeltas, JDeltas, TDeltas, TPDeltas, WDeltas) +from cylc.flow.exceptions import WorkflowConfigError +from cylc.flow.id import Tokens from cylc.flow.network import API from cylc.flow.workflow_status import get_workflow_status from cylc.flow.task_job_logs import JOB_LOG_OPTS, get_task_job_log @@ -171,44 +172,6 @@ } -def parse_job_item(item): - """Parse internal job id. - - Args: - item (str): - point/name/submit_num - OR name.point.submit_num syntax. - Returns: - tuple - (point_str: str, name_str: str, submit_num: [int, None]) - - """ - # BACK COMPAT: name.point.submit_num - # url: - # https://github.com/cylc/cylc-admin/pull/115 - # from: - # Cylc7 - # to: - # Cylc8 - # remove at: - # Cylc9 - submit_num = None - if item.count('/') > 1: - point_str, name_str, submit_num = item.split('/', 2) - elif '/' in item: - point_str, name_str = item.split('/', 1) - elif item.count('.') > 1: - name_str, point_str, submit_num = item.split('.', 2) - elif '.' in item: - name_str, point_str = item.split('.', 1) - else: - name_str, point_str = (item, None) - try: - sub_num = int(submit_num) - except (TypeError, ValueError): - sub_num = None - return (point_str, name_str, sub_num) - - def generate_checksum(in_strings): """Generate cross platform & python checksum from strings.""" # can't use hash(), it's not the same across 32-64bit or python invocations @@ -395,7 +358,11 @@ class DataStoreMgr: def __init__(self, schd): self.schd = schd - self.workflow_id = f'{self.schd.owner}{ID_DELIM}{self.schd.workflow}' + self.id_ = Tokens( + user=self.schd.owner, + workflow=self.schd.workflow, + ) # TODO: rename and move to scheduler + self.workflow_id = self.id_.workflow_id self.ancestors = {} self.descendants = {} self.parents = {} @@ -504,7 +471,7 @@ def generate_definition_elements(self): # Create definition elements for graphed tasks. for name, tdef in config.taskdefs.items(): - t_id = f'{self.workflow_id}{ID_DELIM}{name}' + t_id = self.definition_id(name) t_stamp = f'{t_id}@{update_time}' task = PbTask( stamp=t_stamp, @@ -513,8 +480,7 @@ def generate_definition_elements(self): depth=len(ancestors[name]) - 1, ) task.namespace[:] = tdef.namespace_hierarchy - task.first_parent = ( - f'{self.workflow_id}{ID_DELIM}{ancestors[name][1]}') + task.first_parent = self.definition_id(ancestors[name][1]) user_defined_meta = {} for key, val in dict(tdef.describe()).items(): if key in ['title', 'description', 'URL']: @@ -525,9 +491,10 @@ def generate_definition_elements(self): elapsed_time = task_mean_elapsed_time(tdef) if elapsed_time: task.mean_elapsed_time = elapsed_time - task.parents.extend( - [f'{self.workflow_id}{ID_DELIM}{p_name}' - for p_name in parents[name]]) + task.parents.extend([ + self.definition_id(p_name) + for p_name in parents[name] + ]) tasks[t_id] = task # Created family definition elements for first parent @@ -539,7 +506,7 @@ def generate_definition_elements(self): name in families ): continue - f_id = f'{self.workflow_id}{ID_DELIM}{name}' + f_id = self.definition_id(name) f_stamp = f'{f_id}@{update_time}' family = PbFamily( stamp=f_stamp, @@ -556,20 +523,22 @@ def generate_definition_elements(self): user_defined_meta[key] = val family.meta.user_defined = json.dumps(user_defined_meta) family.parents.extend( - [f'{self.workflow_id}{ID_DELIM}{p_name}' - for p_name in parents[name]]) + self.definition_id(p_name) + for p_name in parents[name] + ) with suppress(IndexError): family.first_parent = ( - f'{self.workflow_id}{ID_DELIM}{ancestors[name][1]}') + self.definition_id(ancestors[name][1]) + ) families[f_id] = family for name, parent_list in parents.items(): if not parent_list: continue fam = parent_list[0] - f_id = f'{self.workflow_id}{ID_DELIM}{fam}' + f_id = self.definition_id(fam) if f_id in families: - ch_id = f'{self.workflow_id}{ID_DELIM}{name}' + ch_id = self.definition_id(name) if name in config.taskdefs: families[f_id].child_tasks.append(ch_id) else: @@ -640,13 +609,9 @@ def increment_graph_window( """ # Create this source node - s_node = f'{itask.tdef.name}.{itask.point}' - s_id = ( - f'{self.workflow_id}{ID_DELIM}' - f'{itask.point}{ID_DELIM}{itask.tdef.name}' - ) + s_tokens = self.id_.duplicate(itask.tokens) if active_id is None: - active_id = s_id + active_id = s_tokens.id # Setup and check if active node is another's boundary node # to flag its paths for pruning. @@ -664,19 +629,21 @@ def increment_graph_window( if edge_distance > self.n_edge_distance: if descendant and self.n_edge_distance > 0: self.n_window_boundary_nodes[ - active_id].setdefault(edge_distance, set()).add(s_id) + active_id + ].setdefault(edge_distance, set()).add(s_tokens.id) return if ( (not any(itask.graph_children.values()) and descendant) or self.n_edge_distance == 0 ): self.n_window_boundary_nodes[ - active_id].setdefault(edge_distance, set()).add(s_id) + active_id + ].setdefault(edge_distance, set()).add(s_tokens.id) - self.n_window_nodes[active_id].add(s_id) + self.n_window_nodes[active_id].add(s_tokens.id) # Generate task proxy node - is_orphan = self.generate_ghost_task(s_id, itask, is_parent) + is_orphan = self.generate_ghost_task(s_tokens.id, itask, is_parent) edge_distance += 1 @@ -688,15 +655,27 @@ def increment_graph_window( if edge_distance == 1: descendant = True self._expand_graph_window( - s_id, s_node, items, active_id, itask.flow_nums, - edge_distance, descendant, False) + s_tokens, + items, + active_id, + itask.flow_nums, + edge_distance, + descendant, + False, + ) for items in generate_graph_parents( itask.tdef, itask.point ).values(): self._expand_graph_window( - s_id, s_node, items, active_id, itask.flow_nums, - edge_distance, False, True) + s_tokens, + items, + active_id, + itask.flow_nums, + edge_distance, + False, + True, + ) if edge_distance == 1: levels = self.n_window_boundary_nodes[active_id].keys() @@ -714,23 +693,29 @@ def increment_graph_window( self.n_window_edges[active_id]) def _expand_graph_window( - self, s_id, s_node, items, active_id, flow_nums, - edge_distance, descendant=False, is_parent=False): + self, + s_tokens, + items, + active_id, + flow_nums, + edge_distance, + descendant=False, + is_parent=False + ): """Construct nodes/edges for children/parents of source node.""" final_point = self.schd.config.final_point for t_name, t_point, _ in items: if t_point > final_point: continue - t_node = f'{t_name}.{t_point}' - t_id = ( - f'{self.workflow_id}{ID_DELIM}{t_point}{ID_DELIM}{t_name}') + t_tokens = self.id_.duplicate( + cycle=str(t_point), + task=t_name, + ) # Initiate edge element. if is_parent: - e_id = ( - f'{self.workflow_id}{ID_DELIM}{t_node}{ID_DELIM}{s_node}') + e_id = self.edge_id(t_tokens, s_tokens) else: - e_id = ( - f'{self.workflow_id}{ID_DELIM}{s_node}{ID_DELIM}{t_node}') + e_id = self.edge_id(s_tokens, t_tokens) if e_id in self.n_window_edges[active_id]: continue if ( @@ -740,18 +725,18 @@ def _expand_graph_window( ): self.added[EDGES][e_id] = PbEdge( id=e_id, - source=s_id, - target=t_id + source=s_tokens.id, + target=t_tokens.id ) # Add edge id to node field for resolver reference self.updated[TASK_PROXIES].setdefault( - t_id, - PbTaskProxy(id=t_id)).edges.append(e_id) + t_tokens.id, + PbTaskProxy(id=t_tokens.id)).edges.append(e_id) self.updated[TASK_PROXIES].setdefault( - s_id, - PbTaskProxy(id=s_id)).edges.append(e_id) + s_tokens.id, + PbTaskProxy(id=s_tokens.id)).edges.append(e_id) self.n_window_edges[active_id].add(e_id) - if t_id in self.n_window_nodes[active_id]: + if t_tokens.id in self.n_window_nodes[active_id]: continue self.increment_graph_window( TaskProxy( @@ -762,7 +747,10 @@ def _expand_graph_window( def remove_pool_node(self, name, point): """Remove ID reference and flag isolate node/branch for pruning.""" - tp_id = f'{self.workflow_id}{ID_DELIM}{point}{ID_DELIM}{name}' + tp_id = self.id_.duplicate( + cycle=str(point), + task=name, + ).id if tp_id in self.all_task_pool: self.all_task_pool.remove(tp_id) # flagged isolates/end-of-branch nodes for pruning on removal @@ -775,7 +763,10 @@ def remove_pool_node(self, name, point): def add_pool_node(self, name, point): """Add external ID reference for internal task pool node.""" - tp_id = f'{self.workflow_id}{ID_DELIM}{point}{ID_DELIM}{name}' + tp_id = self.id_.duplicate( + cycle=str(point), + task=name, + ).id self.all_task_pool.add(tp_id) def generate_ghost_task(self, tp_id, itask, is_parent=False): @@ -795,7 +786,7 @@ def generate_ghost_task(self, tp_id, itask, is_parent=False): """ name = itask.tdef.name - t_id = f'{self.workflow_id}{ID_DELIM}{name}' + t_id = self.definition_id(name) point_string = f'{itask.point}' task_proxies = self.data[self.workflow_id][TASK_PROXIES] @@ -839,17 +830,25 @@ def generate_ghost_task(self, tp_id, itask, is_parent=False): tproxy.namespace[:] = task_def.namespace if is_orphan: tproxy.ancestors[:] = [ - f'{self.workflow_id}{ID_DELIM}{point_string}{ID_DELIM}root'] + self.id_.duplicate( + cycle=point_string, + task='root', + ).id + ] else: tproxy.ancestors[:] = [ - f'{self.workflow_id}{ID_DELIM}{point_string}{ID_DELIM}{a_name}' + self.id_.duplicate( + cycle=point_string, + task=a_name, + ).id for a_name in self.ancestors[task_def.name] - if a_name != task_def.name] + if a_name != task_def.name + ] tproxy.first_parent = tproxy.ancestors[0] for prereq in itask.state.prerequisites: # Protobuf messages populated within - prereq_obj = prereq.api_dump(self.workflow_id) + prereq_obj = prereq.api_dump() if prereq_obj: tproxy.prerequisites.append(prereq_obj) @@ -892,7 +891,7 @@ def generate_ghost_task(self, tp_id, itask, is_parent=False): self.generate_ghost_family(tproxy.first_parent, child_task=tp_id) self.state_update_families.add(tproxy.first_parent) if tproxy.state in self.latest_state_tasks: - tp_ref = f'{tproxy.name}.{tproxy.cycle_point}' + tp_ref = Tokens(tproxy.id).relative_id tp_queue = self.latest_state_tasks[tproxy.state] if tp_ref in tp_queue: tp_queue.remove(tp_ref) @@ -906,7 +905,7 @@ def generate_orphan_task(self, itask): update_time = time() tdef = itask.tdef name = tdef.name - t_id = f'{self.workflow_id}{ID_DELIM}{name}' + t_id = self.definition_id(name) t_stamp = f'{t_id}@{update_time}' task = PbTask( stamp=t_stamp, @@ -915,7 +914,7 @@ def generate_orphan_task(self, itask): depth=1, ) task.namespace[:] = tdef.namespace_hierarchy - task.first_parent = f'{self.workflow_id}{ID_DELIM}root' + task.first_parent = self.definition_id('root') user_defined_meta = {} for key, val in dict(tdef.describe()).items(): if key in ['title', 'description', 'URL']: @@ -963,8 +962,10 @@ def generate_ghost_family(self, fp_id, child_fam=None, child_task=None): fp_delta = fp_added[fp_id] fp_parent = fp_added.setdefault(fp_id, PbFamilyProxy(id=fp_id)) else: - _, _, point_string, name = fp_id.split(ID_DELIM) - fam = families[f'{self.workflow_id}{ID_DELIM}{name}'] + tokens = Tokens(fp_id) + point_string = tokens['cycle'] + name = tokens['task'] + fam = families[self.definition_id(name)] fp_delta = PbFamilyProxy( stamp=f'{fp_id}@{update_time}', id=fp_id, @@ -974,9 +975,13 @@ def generate_ghost_family(self, fp_id, child_fam=None, child_task=None): depth=fam.depth, ) fp_delta.ancestors[:] = [ - f'{self.workflow_id}{ID_DELIM}{point_string}{ID_DELIM}{a_name}' + self.id_.duplicate( + cycle=point_string, + task=a_name, + ).id for a_name in self.ancestors[fam.name] - if a_name != fam.name] + if a_name != fam.name + ] if fp_delta.ancestors: fp_delta.first_parent = fp_delta.ancestors[0] self.added[FAMILY_PROXIES][fp_id] = fp_delta @@ -1018,7 +1023,9 @@ def insert_job(self, name, point_string, status, job_conf): if not tproxy: return update_time = time() - j_id = f'{tp_id}{ID_DELIM}{sub_num}' + tp_tokens = Tokens(tp_id) + j_tokens = tp_tokens.duplicate(job=str(sub_num)) + j_id = j_tokens.id j_buf = PbJob( stamp=f'{j_id}@{update_time}', id=j_id, @@ -1072,7 +1079,9 @@ def insert_db_job(self, row_idx, row): tp_id, tproxy = self.store_node_fetcher(name, point_string) if not tproxy: return - j_id = f'{tp_id}{ID_DELIM}{submit_num}' + tp_tokens = Tokens(tp_id) + j_tokens = tp_tokens.duplicate(job=str(submit_num)) + j_id = j_tokens.id try: update_time = time() j_buf = PbJob( @@ -1514,7 +1523,7 @@ def delta_task_state(self, itask): tp_delta.state = itask.state.status self.state_update_families.add(tproxy.first_parent) if tp_delta.state in self.latest_state_tasks: - tp_ref = f'{tproxy.name}.{tproxy.cycle_point}' + tp_ref = Tokens(tproxy.id).relative_id tp_queue = self.latest_state_tasks[tp_delta.state] if tp_ref in tp_queue: tp_queue.remove(tp_ref) @@ -1523,7 +1532,7 @@ def delta_task_state(self, itask): if tp_delta.state in TASK_STATUSES_FINAL: elapsed_time = task_mean_elapsed_time(itask.tdef) if elapsed_time: - t_id = f'{self.workflow_id}{ID_DELIM}{tproxy.name}' + t_id = self.definition_id(tproxy.name) t_delta = PbTask( stamp=f'{t_id}@{update_time}', mean_elapsed_time=elapsed_time @@ -1672,7 +1681,7 @@ def delta_task_prerequisite(self, itask): prereq_list = [] for prereq in itask.state.prerequisites: # Protobuf messages populated within - prereq_obj = prereq.api_dump(self.workflow_id) + prereq_obj = prereq.api_dump() if prereq_obj: prereq_list.append(prereq_obj) del tp_delta.prerequisites[:] @@ -1761,8 +1770,12 @@ def delta_task_xtrigger(self, sig, satisfied): # ----------- def delta_job_msg(self, job_d, msg): """Add message to job.""" - point, name, sub_num = parse_job_item(job_d) - j_id, job = self.store_node_fetcher(name, point, sub_num) + tokens = Tokens(job_d, relative=True) + j_id, job = self.store_node_fetcher( + tokens['task'], + tokens['cycle'], + tokens['job'], + ) if not job: return j_delta = PbJob(stamp=f'{j_id}@{time()}') @@ -1775,8 +1788,12 @@ def delta_job_msg(self, job_d, msg): def delta_job_attr(self, job_d, attr_key, attr_val): """Set job attribute.""" - point, name, sub_num = parse_job_item(job_d) - j_id, job = self.store_node_fetcher(name, point, sub_num) + tokens = Tokens(job_d, relative=True) + j_id, job = self.store_node_fetcher( + tokens['task'], + tokens['cycle'], + tokens['job'], + ) if not job: return j_delta = PbJob(stamp=f'{j_id}@{time()}') @@ -1789,8 +1806,12 @@ def delta_job_attr(self, job_d, attr_key, attr_val): def delta_job_state(self, job_d, status): """Set job state.""" - point, name, sub_num = parse_job_item(job_d) - j_id, job = self.store_node_fetcher(name, point, sub_num) + tokens = Tokens(job_d, relative=True) + j_id, job = self.store_node_fetcher( + tokens['task'], + tokens['cycle'], + tokens['job'], + ) if not job or status not in JOB_STATUS_SET: return j_delta = PbJob( @@ -1808,8 +1829,12 @@ def delta_job_time(self, job_d, event_key, time_str=None): Set values of both event_key + '_time' and event_key + '_time_string'. """ - point, name, sub_num = parse_job_item(job_d) - j_id, job = self.store_node_fetcher(name, point, sub_num) + tokens = Tokens(job_d, relative=True) + j_id, job = self.store_node_fetcher( + tokens['task'], + tokens['cycle'], + tokens['job'], + ) if not job: return j_delta = PbJob(stamp=f'{j_id}@{time()}') @@ -1825,15 +1850,19 @@ def store_node_fetcher( self, name, point=None, sub_num=None, node_type=TASK_PROXIES): """Check that task proxy is in or being added to the store""" if point is None: - node_id = f'{self.workflow_id}{ID_DELIM}{name}' + node_id = self.definition_id(name) node_type = TASKS elif sub_num is None: - node_id = f'{self.workflow_id}{ID_DELIM}{point}{ID_DELIM}{name}' + node_id = self.id_.duplicate( + cycle=str(point), + task=name, + ).id else: - node_id = ( - f'{self.workflow_id}{ID_DELIM}{point}' - f'{ID_DELIM}{name}{ID_DELIM}{sub_num}' - ) + node_id = self.id_.duplicate( + cycle=str(point), + task=name, + job=str(sub_num), + ).id node_type = JOBS if node_id in self.added[node_type]: return (node_id, self.added[node_type][node_id]) @@ -1968,3 +1997,13 @@ def get_data_elements(self, element_type): else: pb_msg.added.extend(data[element_type].values()) return pb_msg + + def definition_id(self, namespace: str) -> str: + return self.id_.duplicate(cycle=f'$namespace|{namespace}').id + + def edge_id(self, left_tokens: Tokens, right_tokens: Tokens) -> str: + return self.id_.duplicate( + cycle=( + f'$edge|{left_tokens.relative_id}|{right_tokens.relative_id}' + ) + ).id diff --git a/cylc/flow/etc/job.sh b/cylc/flow/etc/job.sh index fc99e7c8779..4c8906763c1 100644 --- a/cylc/flow/etc/job.sh +++ b/cylc/flow/etc/job.sh @@ -83,7 +83,7 @@ cylc__job__main() { # The "10#" part ensures that the submit number is interpreted in base 10. # Otherwise, a zero padded number will be interpreted as an octal. export CYLC_TASK_SUBMIT_NUMBER="$((10#${CYLC_TASK_JOB##*/}))" - export CYLC_TASK_ID="${CYLC_TASK_NAME}.${CYLC_TASK_CYCLE_POINT}" + export CYLC_TASK_ID="${CYLC_TASK_CYCLE_POINT}/${CYLC_TASK_NAME}" export CYLC_TASK_LOG_DIR="${CYLC_WORKFLOW_RUN_DIR}/log/job/${CYLC_TASK_JOB}" export CYLC_TASK_LOG_ROOT="${CYLC_TASK_LOG_DIR}/job" if [[ -n "${CYLC_TASK_WORK_DIR_BASE:-}" ]]; then diff --git a/cylc/flow/id.py b/cylc/flow/id.py new file mode 100644 index 00000000000..0445bd4f880 --- /dev/null +++ b/cylc/flow/id.py @@ -0,0 +1,860 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""Cylc univeral identifier system for referencing Cylc "objects". + +This module contains the abstract ID tokenising/detokenising code. +""" + +from enum import Enum +import re +from typing import ( + List, + Optional, + Tuple, + Union, +) + +from cylc.flow import LOG + + +class IDTokens(Enum): + """Cylc object identifier tokens.""" + + User = 'user' + Workflow = 'workflow' + Cycle = 'cycle' + Task = 'task' + Job = 'job' + + +class Tokens(dict): + """A parsed representation of a Cylc universal identifier (UID). + + Examples: + Parse tokens: + >>> tokens = Tokens('~u/w//c/t/01') + >>> tokens + + + Parse back to a string ID: + >>> tokens.id + '~u/w//c/t/01' + >>> tokens.workflow_id + '~u/w' + >>> tokens.relative_id + 'c/t/01' + + Inspect the tokens: + >>> tokens['user'] + 'u' + >>> tokens['task'] + 't' + >>> tokens['task_sel'] # task selector + >>> list(tokens.values()) # Note the None values are selectors + ['u', 'w', None, 'c', None, 't', None, '01', None] + + Construct tokens: + >>> Tokens(workflow='w', cycle='c') + + >>> Tokens(workflow='w', cycle='c')['job'] + + # Make a copy (note Tokens are mutable): + >>> tokens.duplicate() + + >>> tokens.duplicate(job='02') # make changes at the same time + + + """ + # valid dictionary keys + _KEYS = { + # regular tokens + *{token.value for token in IDTokens}, + # selector tokens + *{ + f'{token.value}_sel' + for token in IDTokens + if token != IDTokens.User + }, + } + + def __init__(self, *args: 'Union[str, Tokens]', **kwargs): + if args: + if len(args) > 1: + raise ValueError() + kwargs = tokenise( + str(args[0]), + relative=kwargs.get('relative', False) + ) + else: + for key in kwargs: + if key not in self._KEYS: + raise ValueError(f'Invalid token: {key}') + dict.__init__(self, **kwargs) + + def __setitem__(self, key, value): + if key not in self._KEYS: + raise ValueError(f'Invalid token: {key}') + dict.__setitem__(self, key, value) + + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + if key not in self._KEYS: + raise ValueError(f'Invalid token: {key}') + return None + + def __str__(self): + return self.id + + def __repr__(self): + """Python internal representation. + + Examples: + >>> Tokens('a//1') + + >>> Tokens('//1', relative=True) + + >>> Tokens() + + + """ + if self.is_null: + id_ = '' + else: + id_ = self.id + return f'' + + def __eq__(self, other): + return all( + self[key] == other[key] + for key in self._KEYS + ) + + def __ne__(self, other): + return any( + self[key] != other[key] + for key in self._KEYS + ) + + @property # noqa A003 (not shadowing id built-in) + def id(self) -> str: # noqa A003 (not shadowing id built-in) + """The full ID these tokens represent. + + Examples: + >>> Tokens('~u/w//c/t/01').id + '~u/w//c/t/01' + >>> Tokens().id + Traceback (most recent call last): + ValueError: No tokens provided + + """ + return detokenise(self) + + @property + def relative_id(self) -> str: + """The relative ID (without the workflow part). + + Examples: + >>> Tokens('~u/w//c/t/01').relative_id + 'c/t/01' + >>> Tokens('~u/w').relative_id + Traceback (most recent call last): + ValueError: No tokens provided + + """ + return detokenise(self.task, relative=True) + + @property + def workflow_id(self) -> str: + """The workflow id (without the relative part). + + Examples: + >>> Tokens('~u/w//c/t/01').workflow_id + '~u/w' + >>> Tokens('c/t/01', relative=True).workflow_id + Traceback (most recent call last): + ValueError: No tokens provided + + + """ + return detokenise(self.workflow) + + @property + def lowest_token(self) -> str: + """Return the lowest token present in a tokens dictionary. + + Examples: + >>> Tokens('~u/w//c/t/01').lowest_token + 'job' + >>> Tokens('~u/w//c/t').lowest_token + 'task' + >>> Tokens('~u/w//c').lowest_token + 'cycle' + >>> Tokens('~u/w//').lowest_token + 'workflow' + >>> Tokens('~u').lowest_token + 'user' + >>> Tokens().lowest_token({}) + Traceback (most recent call last): + ValueError: No tokens defined + + """ + for token in reversed(IDTokens): + if token.value in self and self[token.value]: + return token.value + raise ValueError('No tokens defined') + + def pop_token(self) -> Tuple[str, str]: + """Pop the lowest token. + + Examples: + >>> tokens = Tokens('~u/w//c/t/01') + >>> tokens.pop_token() + ('job', '01') + >>> tokens.pop_token() + ('task', 't') + >>> tokens.pop_token() + ('cycle', 'c') + >>> tokens.pop_token() + ('workflow', 'w') + >>> tokens.pop_token() + ('user', 'u') + >>> tokens + + >>> tokens.pop_token() + Traceback (most recent call last): + KeyError: No defined tokens. + + """ + for token in reversed(IDTokens): + token_name = token.value + value = self[token_name] + if value: + self.pop(token_name) + return (token_name, value) + raise KeyError('No defined tokens.') + + @property + def is_task_like(self) -> bool: + """Returns True if any task-like objects are present in the ID. + + Task like == cycles or tasks or jobs. + + Examples: + >>> Tokens('workflow//').is_task_like + False + >>> Tokens('workflow//1').is_task_like + True + + """ + return any( + bool(self[token.value]) + for token in IDTokens + if token not in {IDTokens.User, IDTokens.Workflow} + ) + + @property + def task(self) -> 'Tokens': + """The task portion of the tokens. + + Examples: + >>> Tokens('~user/workflow//cycle/task/01').task + + + """ + return Tokens( + **{ + key: value + for key, value in self.items() + if key in ( + enum.value + for enum in ( + {*IDTokens} - {IDTokens.User, IDTokens.Workflow} + ) + ) + } + ) + + @property + def workflow(self) -> 'Tokens': + """The workflow portion of the tokens. + + Examples: + >>> Tokens('~user/workflow//cycle/task/01').workflow + + + """ + return Tokens( + **{ + key: value + for key, value in self.items() + if key not in ( + enum.value + for enum in ( + {*IDTokens} - {IDTokens.User, IDTokens.Workflow} + ) + ) + } + ) + + @property + def is_null(self) -> bool: + """Returns True if no tokens are set. + + Examples: + >>> tokens = Tokens() + >>> tokens.is_null + True + >>> tokens['job_sel'] = 'x' + >>> tokens.is_null + True + >>> tokens['job'] = '01' + >>> tokens.is_null + False + + """ + return not any( + bool(self[token.value]) + for token in IDTokens + ) + + def update_tokens( + self, + tokens: 'Optional[Tokens]' = None, + **kwargs + ) -> None: + """Update the tokens dictionary. + + Similar to dict.update but with an optional Tokens argument. + + Examples: + >>> tokens = Tokens('x') + >>> tokens.update_tokens(workflow='y') + >>> tokens + + >>> tokens.update_tokens(Tokens('z')) + >>> tokens + + >>> tokens.update_tokens(Tokens('a'), cycle='b') + >>> tokens + + + """ + if tokens: + for key, value in tokens.items(): + self[key] = value + for key, value in kwargs.items(): + self[key] = value + + def update(self, other): + """dict.update. + + Example: + >>> tokens = Tokens(workflow='w') + >>> tokens.update({'cycle': 'c'}) + >>> tokens.id + 'w//c' + + """ + return self.update_tokens(**other) + + def duplicate( + self, + tokens: 'Optional[Tokens]' = None, + **kwargs + ) -> 'Tokens': + """Duplicate a tokens object. + + Can be used to change the values of the new object at the same time. + + Examples: + Duplicate tokens: + >>> tokens1 = Tokens('~u/w') + >>> tokens2 = tokens1.duplicate() + + The copy is equal but a different object: + >>> tokens1 == tokens2 + True + >>> id(tokens1) == id(tokens2) + False + + Make a copy and modify it: + >>> tokens1.duplicate(cycle='1').id + '~u/w//1' + """ + ret = Tokens(self) + ret.update_tokens(tokens, **kwargs) + return ret + + +# //cycle[:sel][/task[:sel][/job[:sel]]] +RELATIVE_PATTERN = rf''' + // + (?P<{IDTokens.Cycle.value}>[^~\/:\n]+) + (?: + : + (?P<{IDTokens.Cycle.value}_sel>[^\/:\n]+) + )? + (?: + / + (?: + (?P<{IDTokens.Task.value}>[^\/:\n]+) + (?: + : + (?P<{IDTokens.Task.value}_sel>[^\/:\n]+) + )? + (?: + / + (?: + (?P<{IDTokens.Job.value}>[^\/:\n]+) + (?: + : + (?P<{IDTokens.Job.value}_sel>[^\/:\n]+) + )? + )? + )? + )? + )? +''' + +RELATIVE_ID = re.compile( + r'^' + RELATIVE_PATTERN + r'$', + re.X +) + +# ~user[/workflow[:sel][//cycle[:sel][/task[:sel][/job[:sel]]]]] +UNIVERSAL_ID = re.compile( + rf''' + # don't match an empty string + (?=.) + # either match a user or the start of the line + (?: + (?: + ~ + (?P<{IDTokens.User.value}>[^\/:\n~]+) + # allow the match to end here + (\/|$) + ) + |^ + ) + (?: + (?P<{IDTokens.Workflow.value}> + # can't begin with // + (?!//) + # workflow ID (flat) + [^:~\n\/]+ + # workflow ID (hierarchical) + (?: + (?: + \/ + [^:~\n\/]+ + )+ + )? + + ) + (?: + : + (?P<{IDTokens.Workflow.value}_sel>[^\/:\n]+) + )? + (?: + (?: + # can't end /// + //(?!/) + )? + (?: + # cycle/task/job + { RELATIVE_PATTERN } + )? + )? + )? + $ + ''', + re.X +) + +# task.cycle[:sel] +LEGACY_TASK_DOT_CYCLE = re.compile( + rf''' + ^ + # NOTE: task names can contain "." + (?P<{IDTokens.Task.value}>[^~\:\/\n]+) + \. + # NOTE: legacy cycles always start with a number + (?P<{IDTokens.Cycle.value}>\d[^~\.\:\/\n]*) + # NOTE: the task selector applied to the cycle in this legacy format + # (not a mistake) + (?: + : + (?P<{IDTokens.Task.value}_sel>[^\:\/\n]+) + )? + $ + ''', + re.X +) + +# cycle/task[:sel] +LEGACY_CYCLE_SLASH_TASK = re.compile( + rf''' + ^ + # NOTE: legacy cycles always start with a number + (?P<{IDTokens.Cycle.value}>\d[^~\.\:\/\n]+) + \/ + # NOTE: task names can contain "." + (?P<{IDTokens.Task.value}>[^~\:\/\n]+) + (?: + : + (?P<{IDTokens.Task.value}_sel>[^\:\/\n]+) + )? + $ + ''', + re.X +) + + +def _dict_strip(dictionary): + """Run str.strip against dictionary values. + + Examples: + >>> _dict_strip({'a': ' x ', 'b': 'x', 'c': None}) + {'a': 'x', 'b': 'x', 'c': None} + + """ + return { + key: value.strip() if value else None + for key, value in dictionary.items() + } + + +def legacy_tokenise(identifier: str) -> Tokens: + """Convert a legacy string identifier into Cylc tokens. + + Supports the two legacy Cylc7 formats: + + * task.cycle[:task_status] + * cycle/task[:task_status] + + Args: + identifier (str): + The namespace to tokenise. + + Returns: + dict - {token: value} + + Warning: + The tokenise() function will parse a legacy token as a Workflow. + + Raises: + ValueError: + For invalid identifiers. + + Examples: + # task.cycle[:task_status] + >>> legacy_tokenise('task.123') + {'task': 'task', 'cycle': '123', 'task_sel': None} + >>> legacy_tokenise('task.123:task_sel') + {'task': 'task', 'cycle': '123', 'task_sel': 'task_sel'} + + # cylc/task[:task_status] + >>> legacy_tokenise('123/task') + {'cycle': '123', 'task': 'task', 'task_sel': None} + >>> legacy_tokenise('123/task:task_sel') + {'cycle': '123', 'task': 'task', 'task_sel': 'task_sel'} + + """ + for pattern in ( + LEGACY_TASK_DOT_CYCLE, + LEGACY_CYCLE_SLASH_TASK + ): + match = pattern.match(identifier) + if match: + return _dict_strip(match.groupdict()) + raise ValueError(f'Invalid legacy Cylc identifier: {identifier}') + + +def tokenise( + identifier: str, + relative: bool = False, +) -> Tokens: + """Convert a string identifier into Cylc tokens. + + Args: + identifier (str): + The namespace to tokenise. + relative (bool): + If True the prefix // is implicit if omitted. + + Returns: + dict - {token: value} + + Warning: + Will parse a legacy (task and or cycle) token as a Workflow. + + Raises: + ValueError: + For invalid identifiers. + + Examples: + # absolute identifiers + >>> tokenise( + ... '~user/workflow:workflow_sel//' + ... 'cycle:cycle_sel/task:task_sel/01:job_sel' + ... ) # doctest: +NORMALIZE_WHITESPACE + + + >>> def _(tokens): + ... return { + ... token: value for token, value in tokens.items() if value} + + # "full" identifiers + >>> _(tokenise('workflow//cycle')) + {'workflow': 'workflow', 'cycle': 'cycle'} + + # "partial" identifiers: + >>> _(tokenise('~user')) + {'user': 'user'} + >>> _(tokenise('~user/workflow')) + {'user': 'user', 'workflow': 'workflow'} + >>> _(tokenise('workflow')) + {'workflow': 'workflow'} + + # "relative" identifiers (new syntax): + >>> _(tokenise('//cycle')) + {'cycle': 'cycle'} + >>> _(tokenise('cycle', relative=True)) + {'cycle': 'cycle'} + >>> _(tokenise('//cycle/task/job')) + {'cycle': 'cycle', 'task': 'task', 'job': 'job'} + + # whitespace stripping is employed on all values: + >>> _(tokenise(' workflow // cycle ')) + {'workflow': 'workflow', 'cycle': 'cycle'} + + # illegal identifiers: + >>> tokenise('a///') + Traceback (most recent call last): + ValueError: Invalid Cylc identifier: a/// + + """ + patterns = [UNIVERSAL_ID, RELATIVE_ID] + if relative and not identifier.startswith('//'): + identifier = f'//{identifier}' + for pattern in patterns: + match = pattern.match(identifier) + if match: + return Tokens(**_dict_strip(match.groupdict())) + raise ValueError(f'Invalid Cylc identifier: {identifier}') + + +def detokenise( + tokens: Tokens, + selectors: bool = False, + relative: bool = False, +) -> str: + """Convert Cylc tokens into a string identifier. + + Args: + tokens (dict): + IDTokens as returned by tokenise. + selectors (bool): + If true selectors (i.e. :sel) will be included in the output. + relative (bool): + If true relative references are not given the `//` prefix. + + Returns: + str - Identifier i.e. ~user/workflow//cycle/task/job + + Raises: + ValueError: + For invalid or empty tokens. + + Examples: + # absolute references: + >>> detokenise(tokenise('~user')) + '~user' + >>> detokenise(tokenise('~user/workflow')) + '~user/workflow' + >>> detokenise(tokenise('~user/workflow//cycle')) + '~user/workflow//cycle' + >>> detokenise(tokenise('~user/workflow//cycle/task')) + '~user/workflow//cycle/task' + >>> detokenise(tokenise('~user/workflow//cycle/task/4')) + '~user/workflow//cycle/task/04' + + # relative references: + >>> detokenise(tokenise('//cycle/task/4')) + '//cycle/task/04' + >>> detokenise(tokenise('//cycle/task/4'), relative=True) + 'cycle/task/04' + + # selectors are enabled using the selectors kwarg: + >>> detokenise(tokenise('workflow:a//cycle:b/task:c/01:d')) + 'workflow//cycle/task/01' + >>> detokenise(tokenise('workflow:a//cycle:b/task:c/01:d'), True) + 'workflow:a//cycle:b/task:c/01:d' + + # missing tokens expand to '*' (absolute): + >>> tokens = tokenise('~user/workflow//cycle/task/01') + >>> tokens.pop('task') + 'task' + >>> detokenise(tokens) + '~user/workflow//cycle/*/01' + + # missing tokens expand to '*' (relative): + >>> tokens = tokenise('//cycle/task/01') + >>> tokens.pop('task') + 'task' + >>> detokenise(tokens) + '//cycle/*/01' + + # empty tokens result in traceback: + >>> detokenise({}) + Traceback (most recent call last): + ValueError: No tokens provided + + """ + toks = { + token.value + for token in IDTokens + if tokens.get(token.value) + } + is_relative = not toks & {'user', 'workflow'} + is_partial = not toks & {'cycle', 'task', 'job'} + if is_relative and is_partial: + raise ValueError('No tokens provided') + + # determine the lowest token + for lowest_token in reversed(IDTokens): + if lowest_token.value in toks: + break + + highest_token: 'Optional[IDTokens]' + if is_relative: + highest_token = IDTokens.Cycle + identifier = [] + if not relative: + identifier = ['/'] + else: + highest_token = IDTokens.User + identifier = [] + + for token in IDTokens: + if highest_token and token != highest_token: + continue + elif highest_token: + highest_token = None + value: 'Optional[str]' + value = tokens.get(token.value) + if not value and token == IDTokens.User: + continue + elif token == IDTokens.User: + value = f'~{value}' + elif token == IDTokens.Job and value != 'NN': + value = f'{int(value):02}' # type: ignore + value = value or '*' + if selectors and tokens.get(token.value + '_sel'): + # include selectors + value = f'{value}:{tokens[token.value + "_sel"]}' + if token == IDTokens.Workflow and not is_partial: + value += '/' + identifier.append(value) + + if token == lowest_token: + break + + return '/'.join(identifier) + + +def upgrade_legacy_ids(*ids: str) -> List[str]: + """Reformat IDs from legacy to contemporary format: + + If no upgrading is required it returns the identifiers unchanged. + + Args: + *ids (tuple): Identifier list. + + Returns: + tuple/list - Identifier list. + + # do nothing to contemporary ids: + >>> upgrade_legacy_ids('workflow') + ['workflow'] + + >>> upgrade_legacy_ids('workflow', '//cycle') + ['workflow', '//cycle'] + + # upgrade legacy task.cycle ids: + >>> upgrade_legacy_ids('workflow', 'task.123', 'task.234') + ['workflow', '//123/task', '//234/task'] + + # upgrade legacy cycle/task ids: + >>> upgrade_legacy_ids('workflow', '123/task', '234/task') + ['workflow', '//123/task', '//234/task'] + + # upgrade mixed legacy ids: + >>> upgrade_legacy_ids('workflow', 'task.123', '234/task') + ['workflow', '//123/task', '//234/task'] + + # upgrade legacy task states: + >>> upgrade_legacy_ids('workflow', 'task.123:abc', '234/task:def') + ['workflow', '//123/task:abc', '//234/task:def'] + + """ + if len(ids) < 2: + # only legacy relative references require upgrade => abort + return list(ids) + + legacy_ids = [ids[0]] + for id_ in ids[1:]: + try: + tokens = legacy_tokenise(id_) + except ValueError: + # not a valid legacy token => abort + return list(ids) + else: + # upgrade this token + legacy_ids.append( + detokenise(tokens, selectors=True) + ) + + LOG.warning( + f'Cylc7 format is deprecated, using: {" ".join(legacy_ids)}' + ' (see "cylc help id")' + ) + return legacy_ids + + +def contains_multiple_workflows(tokens_list: List[Tokens]) -> bool: + """Returns True if multiple workflows are contained in the tokens list. + + Examples: + >>> a_1 = tokenise('a//1') + >>> a_2 = tokenise('a//2') + >>> b_1 = tokenise('b//1') + + >>> contains_multiple_workflows([a_1]) + False + >>> contains_multiple_workflows([a_1, a_2]) + False + >>> contains_multiple_workflows([a_1, b_1]) + True + + """ + return len({ + (tokens['user'], tokens['workflow']) + for tokens in tokens_list + }) > 1 diff --git a/cylc/flow/id_cli.py b/cylc/flow/id_cli.py new file mode 100644 index 00000000000..eb39d4f76d2 --- /dev/null +++ b/cylc/flow/id_cli.py @@ -0,0 +1,498 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +import asyncio +import fnmatch +import os +from pathlib import Path +import re +from typing import Optional, Dict, List, Tuple, Any + +from cylc.flow.exceptions import ( + UserInputError, + WorkflowFilesError, +) +from cylc.flow.id import ( + Tokens, + contains_multiple_workflows, + upgrade_legacy_ids, +) +from cylc.flow.network.scan import ( + filter_name, + is_active, + scan, +) +from cylc.flow.workflow_files import ( + WorkflowFiles, + NO_FLOW_FILE_MSG, + check_flow_file, + detect_both_flow_and_suite, + get_flow_file, + get_workflow_run_dir, + infer_latest_run_from_id, + validate_workflow_name, +) + +FN_CHARS = re.compile(r'[\*\?\[\]\!]') + + +def _parse_cli(*ids: str) -> List[Tokens]: + """Parse a list of Cylc identifiers as provided on the CLI. + + * Validates identifiers. + * Expands relative references to absolute ones. + * Handles legacy Cylc7 syntax. + + Args: + *ids (tuple): Identifier list. + + Raises: + ValueError - For invalid identifiers or identifier lists. + + Returns: + list - List of tokens dictionaries. + + Examples: + # parse to tokens then detokenise back + >>> from cylc.flow.id import detokenise + >>> parse_back = lambda *ids: list(map(detokenise, _parse_cli(*ids))) + + # list of workflows: + >>> parse_back('workworkflow') + ['workworkflow'] + + >>> parse_back('workworkflow1', 'workworkflow2') + ['workworkflow1', 'workworkflow2'] + + # absolute references + >>> parse_back('workworkflow1//cycle1', 'workworkflow2//cycle2') + ['workworkflow1//cycle1', 'workworkflow2//cycle2'] + + # relative references: + >>> parse_back('workworkflow', '//cycle1', '//cycle2') + ['workworkflow//cycle1', 'workworkflow//cycle2'] + + # mixed references + >>> parse_back( + ... 'workworkflow1', '//cycle', 'workworkflow2', + ... '//cycle', 'workworkflow3//cycle' + ... ) + ['workworkflow1//cycle', + 'workworkflow2//cycle', 'workworkflow3//cycle'] + + # legacy ids: + >>> parse_back('workworkflow', 'task.123', 'a.b.c.234', '345/task') + ['workworkflow//123/task', + 'workworkflow//234/a.b.c', 'workworkflow//345/task'] + + # errors: + >>> _parse_cli('////') + Traceback (most recent call last): + ValueError: Invalid Cylc identifier: //// + + >>> parse_back('//cycle') + Traceback (most recent call last): + ValueError: Relative reference must follow an incomplete one. + E.G: workflow //cycle/task + + >>> parse_back('workflow//cycle', '//cycle') + Traceback (most recent call last): + ValueError: Relative reference must follow an incomplete one. + E.G: workflow //cycle/task + + """ + # upgrade legacy ids if required + ids = upgrade_legacy_ids(*ids) + + partials: Optional[Tokens] = None + partials_expended: bool = False + tokens_list: List[Tokens] = [] + for id_ in ids: + tokens = Tokens(id_) + is_partial = tokens.get('workflow') and not tokens.get('cycle') + is_relative = not tokens.get('workflow') + + if partials: + # we previously encountered a workflow ID which did not specify a + # cycle + if is_partial: + # this is an absolute ID + if not partials_expended: + # no relative references were made to the previous ID + # so add the whole workflow to the tokens list + tokens_list.append(partials) + partials = tokens + partials_expended = False + elif is_relative: + # this is a relative reference => expand it using the context + # of the partial ID + tokens_list.append(Tokens( + **{ + **partials, + **tokens, + }, + )) + partials_expended = True + else: + # this is a fully expanded reference + tokens_list.append(tokens) + partials = None + partials_expended = False + else: + # there was no previous reference that a relative reference + # could apply to + if is_partial: + partials = tokens + partials_expended = False + elif is_relative: + # so a relative reference is an error + raise ValueError( + 'Relative reference must follow an incomplete one.' + '\nE.G: workflow //cycle/task' + ) + else: + tokens_list.append(tokens) + + if partials and not partials_expended: + # if the last ID was a "partial" but not expanded add it to the list + tokens_list.append(tokens) + + return tokens_list + + +def parse_ids(*args, **kwargs): + return asyncio.run(parse_ids_async(*args, **kwargs)) + + +async def parse_ids_async( + *ids: str, + src: bool = False, + match_workflows: bool = False, + match_active: Optional[bool] = True, + infer_latest_runs: bool = True, + constraint: str = 'tasks', + max_workflows: Optional[int] = None, + max_tasks: Optional[int] = None, +) -> Tuple[Dict[str, List[Tokens]], Any]: + """Parse IDs from the command line. + + Args: + ids: + Collection of IDs to parse. + src: + If True then source workflows can be provided via an absolute + path or a relative path starting "./". + Infers max_workflows = 1. + match_workflows: + If True workflows can be globs. + match_active: + If match_workflows is True this determines the wokflow state + filter. + + True - running & paused + False - stopped + None - any + infer_latest_runs: + If true infer the latest run for a workflow when applicable + (allows 'cylc play one' rather than 'cylc play one/run1'). + constraint: + Constrain the types of objects the IDs should relate to. + + workflows - only allow workflows. + tasks - require tasks to be defined. + mixed - permit tasks not to be defined. + max_workflows: + Specify the maximum number of workflows permitted to be specified + in the ids. + max_tasks: + Specify the maximum number of tasks permitted to be specified + in the ids. + + Returns: + With src=True": + (workflows, flow_file_path) + Else: + (workflow, multi_mode) + Where: + workflows: + Dictionary containing workflow ID strings against lists of + relative tokens specified on that workflow. + {workflow_id: [relative_tokens]} + flow_file_path: + Path to the flow.cylc (or suite.rc in Cylc 7 compat mode) + multi_mode: + True if multiple workflows selected or if globs were provided + in the IDs. + + """ + if constraint not in {'tasks', 'workflows', 'mixed'}: + raise ValueError(f'Invalid constraint: {constraint}') + + tokens_list = [] + src_path = None + flow_file_path = None + multi_mode = False + + if src: + # can only have one workflow if permitting source workflows + max_workflows = 1 + ret = _parse_src_path(ids[0]) + if ret: + # yes, replace the path with an ID and continue + workflow_id, src_path, flow_file_path = ret + ids = ( + Tokens( + user=None, + workflow=workflow_id, + ).id + '//', + *ids[1:] + ) + tokens_list.extend(_parse_cli(*ids)) + + # ensure the IDS are compatible with the constraint + _validate_constraint(*tokens_list, constraint=constraint) + + if match_workflows: + # match workflow IDs via cylc-scan + # if any patterns are present switch to multi_mode for clarity + multi_mode = await _expand_workflow_tokens( + tokens_list, + match_active=match_active, + ) + + # check the workflow part of the IDs are vaild + _validate_workflow_ids(*tokens_list, src_path=src_path) + + if not multi_mode: + # check how many workflows we are working on + multi_mode = contains_multiple_workflows(tokens_list) + + # infer the run number if not specified the ID (and if possible) + if infer_latest_runs: + _infer_latest_runs(*tokens_list, src_path=src_path) + + _validate_number( + *tokens_list, + max_workflows=max_workflows, + max_tasks=max_tasks, + ) + + workflows = _batch_tokens_by_workflow(*tokens_list, constraint=constraint) + + if src: + if not flow_file_path: + # get the workflow file path from the run dir + flow_file_path = get_flow_file(list(workflows)[0]) + return workflows, flow_file_path + return workflows, multi_mode + + +def parse_id(*args, **kwargs): + return asyncio.run(parse_id_async(*args, **kwargs)) + + +async def parse_id_async( + *args, + **kwargs, +) -> Tuple[str, Optional[Tokens], Any]: + """Special case of parse_ids with a more convenient return format. + + Infers: + max_workflows: 1 + max_tasks: 1 + + """ + workflows, ret = await parse_ids_async( + *args, + **{ # type: ignore + **kwargs, + 'max_workflows': 1, + 'max_tasks': 1, + }, + ) + workflow_id = list(workflows)[0] + tokens_list = workflows[workflow_id] + tokens: Optional[Tokens] + if tokens_list: + tokens = tokens_list[0] + else: + tokens = None + return workflow_id, tokens, ret + + +def contains_fnmatch(string: str) -> bool: + """Return True if a string contains filename match chars. + + Examples: + >>> contains_fnmatch('a') + False + >>> contains_fnmatch('*') + True + >>> contains_fnmatch('abc') + False + >>> contains_fnmatch('a*c') + True + """ + return bool(FN_CHARS.search(string)) + + +def _validate_constraint(*tokens_list, constraint=None): + if constraint == 'workflows': + for tokens in tokens_list: + if tokens.is_null or tokens.is_task_like: + raise UserInputError('IDs must be workflows') + return + if constraint == 'tasks': + for tokens in tokens_list: + if tokens.is_null or not tokens.is_task_like: + raise UserInputError('IDs must be tasks') + return + if constraint == 'mixed': + for tokens in tokens_list: + if tokens.is_null: + raise UserInputError('IDs cannot be null.') + return + + +def _validate_workflow_ids(*tokens_list, src_path): + for ind, tokens in enumerate(tokens_list): + if tokens['user']: + raise UserInputError( + "Operating on others users' workflows is not supported" + ) + if not src_path: + validate_workflow_name(tokens['workflow']) + if ind == 0 and src_path: + # source workflow passed in as a path + pass + else: + src_path = Path(get_workflow_run_dir(tokens['workflow'])) + if src_path.is_file(): + raise UserInputError( + f'Workflow ID cannot be a file: {tokens["workflow"]}' + ) + detect_both_flow_and_suite(src_path) + + +def _infer_latest_runs(*tokens_list, src_path): + for ind, tokens in enumerate(tokens_list): + if ind == 0 and src_path: + # source workflow passed in as a path + continue + tokens['workflow'] = infer_latest_run_from_id(tokens['workflow']) + pass + + +def _validate_number(*tokens_list, max_workflows=None, max_tasks=None): + if not max_workflows and not max_tasks: + return + workflows_count = 0 + tasks_count = 0 + for tokens in tokens_list: + if tokens.is_task_like: + tasks_count += 1 + else: + workflows_count += 1 + if max_workflows and workflows_count > max_workflows: + raise UserInputError( + f'IDs contain too many workflows (max {max_workflows})' + ) + if max_tasks and tasks_count > max_tasks: + raise UserInputError( + f'IDs contain too many cycles/tasks/jobs (max {max_tasks})' + ) + + +def _batch_tokens_by_workflow(*tokens_list, constraint=None): + """Sorts tokens into lists by workflow ID. + + Example: + >>> _batch_tokens_by_workflow( + ... Tokens(workflow='x', cycle='1'), + ... Tokens(workflow='x', cycle='2'), + ... ) + {'x': [, ]} + + """ + workflow_tokens = {} + for tokens in tokens_list: + w_tokens = workflow_tokens.setdefault(tokens['workflow'], []) + relative_tokens = tokens.task + if constraint in {'mixed', 'workflows'} and relative_tokens.is_null: + continue + w_tokens.append(relative_tokens) + return workflow_tokens + + +async def _expand_workflow_tokens(tokens_list, match_active=True): + multi_mode = False + for tokens in list(tokens_list): + workflow = tokens['workflow'] + if not contains_fnmatch(workflow): + # no expansion to perform + continue + else: + # remove the original entry + multi_mode = True + tokens_list.remove(tokens) + async for tokens in _expand_workflow_tokens_impl( + tokens, + match_active=match_active, + ): + # add the expanded tokens back onto the list + tokens_list.append(tokens) + return multi_mode + + +async def _expand_workflow_tokens_impl(tokens, match_active=True): + """Use "cylc scan" to expand workflow patterns.""" + workflow_sel = tokens['workflow_sel'] + if workflow_sel and workflow_sel != 'running': + raise UserInputError( + f'The workflow selector :{workflow_sel} is not' + 'currently supported.' + ) + + # construct the pipe + pipe = scan | filter_name(fnmatch.translate(tokens['workflow'])) + if match_active is not None: + pipe |= is_active(match_active) + + # iter the results + async for workflow in pipe: + yield tokens.duplicate(workflow=workflow['name']) + + +def _parse_src_path(id_): + src_path = Path(id_) + if ( + id_ == os.curdir + or id_.startswith(f'{os.curdir}{os.sep}') + or Path(id_).is_absolute() + ): + src_path = src_path.resolve() + if not src_path.exists(): + raise UserInputError(f'Path does not exist: {src_path}') + if src_path.name in {WorkflowFiles.FLOW_FILE, WorkflowFiles.SUITE_RC}: + src_path = src_path.parent + try: + src_file_path = check_flow_file(src_path) + except WorkflowFilesError: + raise WorkflowFilesError(NO_FLOW_FILE_MSG.format(id_)) + workflow_id = src_path.name + return workflow_id, src_path, src_file_path + return None diff --git a/cylc/flow/id_match.py b/cylc/flow/id_match.py new file mode 100644 index 00000000000..6869a599479 --- /dev/null +++ b/cylc/flow/id_match.py @@ -0,0 +1,239 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from fnmatch import fnmatchcase +from typing import ( + Any, + Callable, + Iterable, + List, + TYPE_CHECKING, + # Tuple, + # Union, + # overload, +) + +from cylc.flow import LOG +from cylc.flow.id import IDTokens, Tokens +from cylc.flow.id_cli import contains_fnmatch + +if TYPE_CHECKING: + # from typing_extensions import Literal + + from cylc.flow.task_pool import Pool + from cylc.flow.task_proxy import TaskProxy + from cylc.flow.cycling import PointBase + + +# @overload +# def filter_ids( +# pool: 'Pool', +# ids: 'Iterable[str]', +# *, +# warn: 'bool' = True, +# out: 'Literal[IDTokens.Task]' = IDTokens.Task, +# pattern_match: 'bool' = True, +# ) -> 'Tuple[List[TaskProxy], List[str]]': +# ... +# +# +# @overload +# def filter_ids( +# pool: 'Pool', +# ids: 'Iterable[str]', +# *, +# warn: 'bool' = True, +# out: 'Literal[IDTokens.Cycle]' = IDTokens.Cycle, +# pattern_match: 'bool' = True, +# ) -> 'Tuple[List[PointBase], List[str]]': +# ... + + +# _RET = ( +# 'Union[' +# 'Tuple[List[TaskProxy], List[str]]' +# ', ' +# 'Tuple[List[PointBase], List[str]]' +# ']' +# ) + + +def filter_ids( + pools: 'List[Pool]', + ids: 'Iterable[str]', + *, + warn: 'bool' = True, + out: 'IDTokens' = IDTokens.Task, + pattern_match: 'bool' = True, + # ) -> _RET: +): + """Filter IDs against a pool of tasks. + + Args: + pool: + The pool to match against. + ids: + List of IDs to match against the pool. + out: + The type of object to match: + + * If IDTokens.Task all matching TaskProxies will be returned. + * If IDTokens.Cycle all CyclePoints with any matching tasks will + be returned. + warn: + Whether to log a warning if no matching tasks are found. + + TODO: + Consider using wcmatch which would add support for + extglobs, namely brace syntax e.g. {foo,bar}. + + """ + if out not in {IDTokens.Cycle, IDTokens.Task}: + raise ValueError(f'Invalid output format: {out}') + + _cycles: 'List[PointBase]' = [] + _tasks: 'List[TaskProxy]' = [] + _not_matched: 'List[str]' = [] + + # enable / disable pattern matching + match: 'Callable[[Any, Any], bool]' + if pattern_match: + match = fnmatchcase + else: + match = str.__eq__ + pattern_ids = [ + id_ + for id_ in ids + if contains_fnmatch(id_) + ] + if pattern_ids: + LOG.warning(f'IDs cannot contain globs: {", ".join(pattern_ids)}') + ids = [ + id_ + for id_ in ids + if id_ not in pattern_ids + ] + _not_matched.extend(pattern_ids) + + id_tokens_map = {} + for id_ in ids: + try: + id_tokens_map[id_] = Tokens(id_, relative=True) + except ValueError: + _not_matched.append(id_) + if warn: + LOG.warning(f'Invalid ID: {id_}') + + for id_, tokens in id_tokens_map.items(): + for lowest_token in reversed(IDTokens): + if tokens.get(lowest_token.value): + break + + cycles = [] + tasks = [] + + # filter by cycle + if lowest_token == IDTokens.Cycle: + cycle = tokens[IDTokens.Cycle.value] + cycle_sel = tokens.get(IDTokens.Cycle.value + '_sel') or '*' + for pool in pools: + for icycle, itasks in pool.items(): + if not itasks: + continue + str_cycle = str(icycle) + if not match(str_cycle, cycle): + continue + if cycle_sel == '*': + cycles.append(icycle) + continue + for itask in itasks.values(): + if match(itask.state.status, cycle_sel): + cycles.append(icycle) + break + + # filter by task + elif lowest_token == IDTokens.Task: # noqa: SIM106 + cycle = tokens[IDTokens.Cycle.value] + cycle_sel_raw = tokens.get(IDTokens.Cycle.value + '_sel') + cycle_sel = cycle_sel_raw or '*' + task = tokens[IDTokens.Task.value] + task_sel_raw = tokens.get(IDTokens.Task.value + '_sel') + task_sel = task_sel_raw or '*' + for pool in pools: + for icycle, itasks in pool.items(): + str_cycle = str(icycle) + if not match(str_cycle, cycle): + continue + for itask in itasks.values(): + if ( + # check cycle selector + ( + ( + # disable cycle_sel if not defined if + # pattern matching is turned off + pattern_match is False + and cycle_sel_raw is None + ) + or match(itask.state.status, cycle_sel) + ) + # check namespace name + and ( + # task name + match(itask.tdef.name, task) + # family name + or any( + match(ns, task) + for ns in itask.tdef.namespace_hierarchy + ) + ) + # check task selector + and ( + ( + # disable task_sel if not defined if + # pattern matching is turned off + pattern_match is False + and task_sel_raw is None + ) + or match(itask.state.status, task_sel) + ) + ): + tasks.append(itask) + + else: + raise NotImplementedError + + if not (cycles or tasks): + _not_matched.append(id_) + if warn: + LOG.warning(f"No active tasks matching: {id_}") + else: + _cycles.extend(cycles) + _tasks.extend(tasks) + + ret: 'List[Any]' = [] + if out == IDTokens.Cycle: + _cycles.extend({ + itask.point + for itask in _tasks + }) + ret = _cycles + elif out == IDTokens.Task: + for pool in pools: + for icycle in _cycles: + if icycle in pool: + _tasks.extend(pool[icycle].values()) + ret = _tasks + return ret, _not_matched diff --git a/cylc/flow/job_runner_handlers/loadleveler.py b/cylc/flow/job_runner_handlers/loadleveler.py index 522f8ed0677..ae5d6b753cf 100644 --- a/cylc/flow/job_runner_handlers/loadleveler.py +++ b/cylc/flow/job_runner_handlers/loadleveler.py @@ -67,6 +67,8 @@ import re +from cylc.flow.id import Tokens + class LoadlevelerHandler(): @@ -86,8 +88,11 @@ def format_directives(self, job_conf): """Format the job directives for a job file.""" job_file_path = job_conf['job_file_path'] directives = job_conf["directives"].__class__() + tokens = Tokens(job_conf["task_id"], relative=True) directives["job_name"] = ( - job_conf["workflow_name"] + "." + job_conf["task_id"]) + f'{job_conf["workflow_name"]}.{tokens["task"]}.{tokens["cycle"]}' + + ) directives["output"] = job_file_path + ".out" directives["error"] = job_file_path + ".err" if (job_conf["execution_time_limit"] and diff --git a/cylc/flow/job_runner_handlers/lsf.py b/cylc/flow/job_runner_handlers/lsf.py index b6c7a2ea475..d1a3323cef4 100644 --- a/cylc/flow/job_runner_handlers/lsf.py +++ b/cylc/flow/job_runner_handlers/lsf.py @@ -58,6 +58,8 @@ import math import re +from cylc.flow.id import Tokens + class LSFHandler(): """IBM Platform LSF bsub job submission""" @@ -74,8 +76,9 @@ def format_directives(cls, job_conf): """Format the job directives for a job file.""" job_file_path = job_conf['job_file_path'] directives = job_conf["directives"].__class__() + tokens = Tokens(job_conf['task_id'], relative=True) directives["-J"] = ( - job_conf["task_id"] + "." + job_conf["workflow_name"] + f'{tokens["task"]}.{tokens["cycle"]}.{job_conf["workflow_name"]}' ) directives["-o"] = job_file_path + ".out" directives["-e"] = job_file_path + ".err" diff --git a/cylc/flow/job_runner_handlers/moab.py b/cylc/flow/job_runner_handlers/moab.py index 3ddf9586b8b..11365b0dfde 100644 --- a/cylc/flow/job_runner_handlers/moab.py +++ b/cylc/flow/job_runner_handlers/moab.py @@ -64,6 +64,8 @@ import re +from cylc.flow.id import Tokens + class MoabHandler: @@ -82,9 +84,10 @@ def format_directives(self, job_conf): job_file_path = job_conf['job_file_path'] directives = job_conf["directives"].__class__() # an ordereddict + tokens = Tokens(job_conf['task_id'], relative=True) directives["-N"] = ( - job_conf["task_id"] + "." + job_conf["workflow_name"]) - + f'{tokens["task"]}.{tokens["cycle"]}.{job_conf["workflow_name"]}' + ) directives["-o"] = job_file_path + ".out" directives["-e"] = job_file_path + ".err" if (job_conf["execution_time_limit"] and diff --git a/cylc/flow/job_runner_handlers/pbs.py b/cylc/flow/job_runner_handlers/pbs.py index 738bbf86d74..b34d288ad94 100644 --- a/cylc/flow/job_runner_handlers/pbs.py +++ b/cylc/flow/job_runner_handlers/pbs.py @@ -61,6 +61,8 @@ import re +from cylc.flow.id import Tokens + class PBSHandler: @@ -89,9 +91,10 @@ def format_directives(self, job_conf): directives = job_conf["directives"].__class__() # an ordereddict # Change task/runM to task-runM in the job name # (PBS 19.2.1+ does not allow '/' in job names) + tokens = Tokens(job_conf['task_id'], relative=True) directives["-N"] = ( - f"{job_conf['task_id']}." - f"{job_conf['workflow_name'].replace('/', '-')}" + f'{tokens["task"]}.{tokens["cycle"]}' + f".{job_conf['workflow_name'].replace('/', '-')}" ) job_name_len_max = job_conf['platform']["job name length maximum"] if job_name_len_max: diff --git a/cylc/flow/job_runner_handlers/sge.py b/cylc/flow/job_runner_handlers/sge.py index 09240f7e3ba..3e25fef84c9 100644 --- a/cylc/flow/job_runner_handlers/sge.py +++ b/cylc/flow/job_runner_handlers/sge.py @@ -62,6 +62,8 @@ import re +from cylc.flow.id import Tokens + class SGEHandler: @@ -79,8 +81,9 @@ def format_directives(self, job_conf): """Format the job directives for a job file.""" job_file_path = job_conf['job_file_path'] directives = job_conf['directives'].__class__() + tokens = Tokens(job_conf['task_id'], relative=True) directives['-N'] = ( - job_conf['workflow_name'] + '.' + job_conf['task_id'] + f'{job_conf["workflow_name"]}.{tokens["task"]}.{tokens["cycle"]}' ) directives['-o'] = job_file_path + ".out" directives['-e'] = job_file_path + ".err" diff --git a/cylc/flow/job_runner_handlers/slurm.py b/cylc/flow/job_runner_handlers/slurm.py index b0815c3c51c..4f848c6ddc0 100644 --- a/cylc/flow/job_runner_handlers/slurm.py +++ b/cylc/flow/job_runner_handlers/slurm.py @@ -102,6 +102,8 @@ import re import shlex +from cylc.flow.id import Tokens + class SLURMHandler(): """SLURM job submission and manipulation.""" @@ -149,8 +151,10 @@ def format_directives(cls, job_conf): """Format the job directives for a job file.""" job_file_path = job_conf['job_file_path'] directives = job_conf['directives'].__class__() + tokens = Tokens(job_conf['task_id'], relative=True) directives['--job-name'] = ( - job_conf['task_id'] + '.' + job_conf['workflow_name']) + f'{tokens["task"]}.{tokens["cycle"]}.{job_conf["workflow_name"]}' + ) directives['--output'] = job_file_path.replace('%', '%%') + ".out" directives['--error'] = job_file_path.replace('%', '%%') + ".err" if (job_conf["execution_time_limit"] and diff --git a/cylc/flow/loggingutil.py b/cylc/flow/loggingutil.py index 145c57e54df..12d1826495e 100644 --- a/cylc/flow/loggingutil.py +++ b/cylc/flow/loggingutil.py @@ -279,7 +279,8 @@ def setup_segregated_log_streams( stdout_handler.setLevel(logging.DEBUG) # Filter out >= warnings from stdout stdout_handler.addFilter(lambda rec: int(rec.levelno < logging.WARNING)) - stdout_handler.setFormatter(stderr_handler.formatter) + if stderr_handler.formatter: + stdout_handler.setFormatter(stderr_handler.formatter) logger.addHandler(stdout_handler) stderr_handler.setLevel(logging.WARNING) diff --git a/cylc/flow/network/multi.py b/cylc/flow/network/multi.py new file mode 100644 index 00000000000..86c89c5f71d --- /dev/null +++ b/cylc/flow/network/multi.py @@ -0,0 +1,110 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import asyncio +from functools import partial + +from cylc.flow.async_util import unordered_map +from cylc.flow.id_cli import parse_ids_async + + +def call_multi(*args, **kwargs): + """Call a function for each workflow in a list of IDs. + + See call_multi_async for arg docs. + """ + return asyncio.run(call_multi_async(*args, **kwargs)) + + +async def call_multi_async( + fcn, + *ids, + constraint='tasks', + report=None, + max_workflows=None, + max_tasks=None, +): + """Call a function for each workflow in a list of IDs. + + Args: + fcn: + The function to call for each workflow. + ids: + The list of universal identifiers to parse. + constraint: + The type of objects IDs must identify. + + tasks: + For task-like objects i.e. cycles/tasks/jobs. + workflow: + For workflow-like objects i.e. [user/]workflows. + mixed: + No constraint. + report: + Override the default stdout output. + This function is provided with the return value of fcn. + + """ + # parse ids + workflow_args, multi_mode = await parse_ids_async( + *ids, + src=False, + constraint=constraint, + max_workflows=max_workflows, + max_tasks=max_tasks, + match_workflows=True, + ) + + # configure reporting + if not report: + report = _report + if multi_mode: + reporter = partial(_report_multi, report) + else: + reporter = partial(_report_single, report) + + if constraint == 'workflows': + # TODO: this is silly, just standardise the responses + workflow_args = { + workflow_id: [] + for workflow_id in workflow_args + } + + # run coros + results = [] + async for (workflow_id, *args), result in unordered_map( + fcn, + ( + (workflow_id, *args) + for workflow_id, args in workflow_args.items() + ), + ): + reporter(workflow_id, result) + results.append(result) + return results + + +def _report_multi(report, workflow, result): + print(workflow) + report(result) + + +def _report_single(report, workflow, result): + report(result) + + +def _report(_): + print('Done') diff --git a/cylc/flow/network/resolvers.py b/cylc/flow/network/resolvers.py index d7990c23bf5..69d08225a14 100644 --- a/cylc/flow/network/resolvers.py +++ b/cylc/flow/network/resolvers.py @@ -35,13 +35,17 @@ from graphene.utils.str_converters import to_snake_case -from cylc.flow import ID_DELIM from cylc.flow.data_store_mgr import ( EDGES, FAMILY_PROXIES, TASK_PROXIES, WORKFLOW, DELTA_ADDED, create_delta_store ) +from cylc.flow.id import Tokens from cylc.flow.network.schema import ( - NodesEdges, PROXY_NODES, SUB_RESOLVERS, parse_node_id, sort_elements + DEF_TYPES, + NodesEdges, + PROXY_NODES, + SUB_RESOLVERS, + sort_elements, ) if TYPE_CHECKING: @@ -82,116 +86,184 @@ def collate_workflow_atts(workflow): """Collate workflow filter attributes, setting defaults if non-existent.""" # Append new atts to the end of the list, # this will retain order used in index access. - return [ - workflow.owner, - workflow.name, - workflow.status, - ] + return { + 'user': workflow.owner, + 'workflow': workflow.name, + 'workflow_sel': workflow.status, + } -def workflow_ids_filter(w_atts, items): +def uniq(iterable): + """Return a unique collection of the provided items preserving item order. + + Useful for unhashable things like dicts, relies on __eq__ for testing + equality. + + Examples: + >>> uniq([1, 1, 2, 3, 5, 8, 1]) + [1, 2, 3, 5, 8] + + """ + ret = [] + for item in iterable: + if item not in ret: + ret.append(item) + return ret + + +def workflow_ids_filter(workflow_tokens, items) -> bool: """Match id arguments with workflow attributes. - Returns a boolean.""" - # Return true if workflow matches any id arg. + Return True if workflow matches any id arg. + """ return any( ( - (not owner or fnmatchcase(w_atts[0], owner)) - and (not name or fnmatchcase(w_atts[1], name)) - and (not status or w_atts[2] == status) + ( + not item['user'] + or fnmatchcase(workflow_tokens['user'], item['user']) + ) + and ( + not item['workflow'] + or fnmatchcase(workflow_tokens['workflow'], item['workflow']) + ) + and ( + not item['workflow_sel'] + or workflow_tokens['workflow_sel'] == item['workflow_sel'] + ) ) - for owner, name, status in set(items) + for item in uniq(items) ) -def workflow_filter(flow, args, w_atts=None): +def workflow_filter(flow, args, w_atts=None) -> bool: """Filter workflows based on attribute arguments""" if w_atts is None: w_atts = collate_workflow_atts(flow[WORKFLOW]) # The w_atts (workflow attributes) list contains ordered workflow values # or defaults (see collate function for index item). - return ((not args.get('workflows') or - workflow_ids_filter(w_atts, args['workflows'])) and - not (args.get('exworkflows') and - workflow_ids_filter(w_atts, args['exworkflows']))) + return ( + ( + not args.get('workflows') + or workflow_ids_filter(w_atts, args['workflows']) + ) + and not ( + args.get('exworkflows') + and workflow_ids_filter(w_atts, args['exworkflows']) + ) + ) -def collate_node_atts(node): - """Collate node filter attributes, setting defaults if non-existent.""" - owner, workflow, _ = node.id.split(ID_DELIM, 2) - # Append new atts to the end of the list, - # this will retain order used in index access - # 0 - owner - # 1 - workflow - # 2 - Cycle point or None - # 3 - name or namespace list - # 4 - submit number or None - # 5 - state - return [ - owner, - workflow, - getattr(node, 'cycle_point', None), - getattr(node, 'namespace', [node.name]), - getattr(node, 'submit_num', None), - getattr(node, 'state', None), - ] +def get_state_from_selectors(tokens): + """Return the highest defined selector in the provided tokens or None. + TODO: + This is a temporary workaround, the filters here should acquire + full selector capability in due course. + + """ + for selector in 'cycle_sel', 'task_sel', 'job_sel': + if tokens.get(selector): + return tokens[selector] -def node_ids_filter(n_atts, items): - """Match id arguments with node attributes. - Returns a boolean.""" +def node_ids_filter(tokens, state, items) -> bool: + """Match id arguments with node attributes.""" return any( ( - (not owner or fnmatchcase(n_atts[0], owner)) - and (not workflow or fnmatchcase(n_atts[1], workflow)) - and (not cycle or fnmatchcase(n_atts[2], cycle)) - and any(fnmatchcase(nn, name) for nn in n_atts[3]) + # don't match an empty string (globs should be implicit) + not item.is_null + # match cycle point + and ( + not item['cycle'] + or fnmatchcase(tokens['cycle'], item['cycle']) + ) + # match namespace name + and ( + not item['task'] + or fnmatchcase(tokens['task'], item['task']) + ) + # match job + and ( + not item['job'] + or fnmatchcase(tokens['job'], item['job']) + ) + # match cycle/task/job state and ( - not submit_num - or fnmatchcase(str(n_atts[4]), submit_num.lstrip('0'))) - and (not state or n_atts[5] == state) + not get_state_from_selectors(item) + or get_state_from_selectors(item) == state + ) ) - for owner, workflow, cycle, name, submit_num, state in items + for item in uniq(items) ) def node_filter(node, node_type, args): """Filter nodes based on attribute arguments""" - # Updated delta nodes don't contain name but still need filter - if not node.name: - n_atts = list(parse_node_id(node.id, node_type)) - n_atts[3] = [n_atts[3]] + tokens: Tokens + if node_type in DEF_TYPES: + # namespace nodes don't fit into the universal ID scheme so must + # be tokenised manually + tokens = Tokens( + cycle=None, + task=node.name, + job=None, + ) else: - n_atts = collate_node_atts(node) - # The n_atts (node attributes) list contains ordered node values - # or defaults (see collate function for index item). + # live objects can be represented by a universal ID + tokens = Tokens(node.id) + state = getattr(node, 'state', None) return ( - (args.get('ghosts') or n_atts[5] != '') and - (not args.get('states') or n_atts[5] in args['states']) and - not (args.get('exstates') and n_atts[5] in args['exstates']) and - (args.get('is_held') is None - or (node.is_held == args['is_held'])) and - (args.get('is_queued') is None - or (node.is_queued == args['is_queued'])) and - (args.get('mindepth', -1) < 0 or node.depth >= args['mindepth']) and - (args.get('maxdepth', -1) < 0 or node.depth <= args['maxdepth']) and + ( + args.get('ghosts') + or state + or node_type in DEF_TYPES + ) + and ( + not args.get('states') + or state in args['states'] + ) + and not ( + args.get('exstates') + and state in args['exstates'] + ) + and ( + args.get('is_held') is None + or (node.is_held == args['is_held']) + ) + and ( + args.get('is_queued') is None + or (node.is_queued == args['is_queued']) + ) + and ( + args.get('mindepth', -1) < 0 + or node.depth >= args['mindepth'] + ) + and ( + args.get('maxdepth', -1) < 0 + or node.depth <= args['maxdepth'] + ) # Now filter node against id arg lists - (not args.get('ids') or node_ids_filter(n_atts, args['ids'])) and - not (args.get('exids') and node_ids_filter(n_atts, args['exids'])) + and ( + not args.get('ids') + or node_ids_filter(tokens, state, args['ids']) + ) + and not ( + args.get('exids') + and node_ids_filter(tokens, state, args['exids']) + ) ) def get_flow_data_from_ids(data_store, native_ids): """Return workflow data by id.""" - w_ids = set() + w_ids = [] for native_id in native_ids: - o_name, w_name, _ = native_id.split(ID_DELIM, 2) - flow_id = f'{o_name}{ID_DELIM}{w_name}' - w_ids.add(flow_id) + w_ids.append( + Tokens(native_id).workflow_id + ) return [ data_store[w_id] - for w_id in w_ids + for w_id in uniq(w_ids) if w_id in data_store ] @@ -239,9 +311,9 @@ async def get_workflows_data(self, args): if workflow_filter(self.data_store_mgr.data[key], args) ] return [ - flow - for flow in self.data_store_mgr.data.values() - if workflow_filter(flow, args) + workflow + for workflow in self.data_store_mgr.data.values() + if workflow_filter(workflow, args) ] async def get_workflows(self, args): @@ -255,11 +327,14 @@ async def get_workflows(self, args): async def get_nodes_all(self, node_type, args): """Return nodes from all workflows, filter by args.""" return sort_elements( - [n - for flow in await self.get_workflows_data(args) - for n in flow.get(node_type).values() - if node_filter(n, node_type, args)], - args) + [ + n + for flow in await self.get_workflows_data(args) + for n in flow.get(node_type).values() + if node_filter(n, node_type, args) + ], + args, + ) async def get_nodes_by_ids(self, node_type, args): """Return protobuf node objects for given id.""" @@ -280,18 +355,20 @@ async def get_nodes_by_ids(self, node_type, args): else: node_types = [node_type] return sort_elements( - [node - for flow in flow_data - for node_type in node_types - for node in get_data_elements(flow, nat_ids, node_type) - if node_filter(node, node_type, args)], - args) + [ + node + for flow in flow_data + for node_type in node_types + for node in get_data_elements(flow, nat_ids, node_type) + if node_filter(node, node_type, args) + ], + args, + ) async def get_node_by_id(self, node_type, args): """Return protobuf node object for given id.""" n_id = args.get('id') - o_name, w_name, _ = n_id.split(ID_DELIM, 2) - w_id = f'{o_name}{ID_DELIM}{w_name}' + w_id = Tokens(n_id).workflow_id # Both cases just as common so 'if' not 'try' try: if 'sub_id' in args and args.get('delta_store'): @@ -519,9 +596,9 @@ async def mutator(self, *m_args): w_ids = [flow[WORKFLOW].id for flow in await self.get_workflows_data(w_args)] if not w_ids: - flows = list(self.data_store_mgr.data.keys()) + workflows = list(self.data_store_mgr.data.keys()) return [{ - 'response': (False, f'No matching workflow in {flows}')}] + 'response': (False, f'No matching workflow in {workflows}')}] w_id = w_ids[0] result = await self._mutation_mapper(command, args) if result is None: @@ -530,29 +607,33 @@ async def mutator(self, *m_args): async def nodes_mutator(self, *m_args): """Mutate node items of associated workflows.""" - _, command, ids, w_args, args = m_args - w_ids = [flow[WORKFLOW].id - for flow in await self.get_workflows_data(w_args)] + _, command, tokens_list, w_args, args = m_args + w_ids = [ + workflow[WORKFLOW].id + for workflow in await self.get_workflows_data(w_args) + ] if not w_ids: - flows = list(self.data_store_mgr.data.keys()) + workflows = list(self.data_store_mgr.data.keys()) return [{ - 'response': (False, f'No matching workflow in {flows}')}] + 'response': (False, f'No matching workflow in {workflows}')}] w_id = w_ids[0] # match proxy ID args with workflows items = [] - for owner, workflow, cycle, name, submit_num, state in ids: + for tokens in tokens_list: + owner = tokens.get('user') + workflow = tokens.get('workflow') if workflow and owner is None: owner = "*" - if (not (owner and workflow) or - fnmatchcase(w_id, f'{owner}{ID_DELIM}{workflow}')): - if cycle is None: - cycle = '*' - id_arg = f'{cycle}/{name}' - if submit_num: - id_arg = f'{id_arg}/{submit_num}' - if state: - id_arg = f'{id_arg}:{state}' - items.append(id_arg) + if ( + not (owner and workflow) + or fnmatchcase( + w_id, + tokens.workflow_id, + ) + ): + items.append( + tokens.relative_id + ) if items: if command == 'put_messages': args['task_job'] = items[0] @@ -728,7 +809,7 @@ def stop( )) return (True, 'Command queued') - def force_trigger_tasks(self, tasks, reflow=False, flow_descr=None): + def force_trigger_tasks(self, tasks=None, reflow=False, flow_descr=None): """Trigger submission of task jobs where possible. Args: @@ -750,7 +831,7 @@ def force_trigger_tasks(self, tasks, reflow=False, flow_descr=None): """ self.schd.command_queue.put( ( - "force_trigger_tasks", (tasks,), + "force_trigger_tasks", (tasks or [],), { "reflow": reflow, "flow_descr": flow_descr diff --git a/cylc/flow/network/schema.py b/cylc/flow/network/schema.py index 0efa59f9369..9ea498e759f 100644 --- a/cylc/flow/network/schema.py +++ b/cylc/flow/network/schema.py @@ -32,8 +32,8 @@ from graphene.types.generic import GenericScalar from graphene.utils.str_converters import to_snake_case -from cylc.flow import ID_DELIM from cylc.flow.broadcast_mgr import ALL_CYCLE_POINTS_STRS, addict +from cylc.flow.id import Tokens from cylc.flow.task_outputs import SORT_ORDERS from cylc.flow.task_state import ( TASK_OUTPUT_SUCCEEDED, @@ -130,78 +130,6 @@ def sort_elements(elements, args): ] -def parse_workflow_id(item): - """Split workflow id argument to individual workflow attributes. - Args: - item (owner|workflow:status): - It's possible to traverse workflows, - defaults to UI Server owner, and ``*`` glob for workflow. - - Returns: - A tuple of id components in respective order. For example: - - (owner, name, status) - """ - owner, workflow, status = (None, None, None) - if ':' in item: - head, status = item.rsplit(':', 1) - else: - head, status = (item, None) - if head.count(ID_DELIM): - owner, workflow = head.split(ID_DELIM, 1) - else: - # more common to filter on workflow (with owner constant) - workflow = head - return (owner, workflow, status) - - -def parse_node_id(item, node_type=None): - """Parse definition, job, or proxy id argument returning components. - - Args: - item (str): A string representing a node ID. Jobs fill out - cycle|name|num first, cycle is irrelevant to Def - owner|workflow is always last. - For example: - - name - cycle|na* - workflow|cycle|name - owner|workflow|cycle|name|submit_num:state - cycle|*|submit_num - node_type (str): - the type of the node to be parsed. - - Returns: - A tuple of string id components in respective order. For example: - - (owner, workflow, cycle, name, submit_num, state) - - None type is set for missing components. - """ - if ':' in item: - head, state = item.rsplit(':', 1) - else: - head, state = (item, None) - if ID_DELIM in head: - dil_count = head.count(ID_DELIM) - parts = head.split(ID_DELIM, dil_count) - else: - return (None, None, None, head, None, state) - if node_type in DEF_TYPES: - owner, workflow, name = [None] * (2 - dil_count) + parts - parts = [owner, workflow, None, name, None] - elif node_type in PROXY_TYPES: - parts = [None] * (3 - dil_count) + parts + [None] - elif dil_count < 4: - if dil_count < 3: - parts = [None, None] + parts + [None] * (2 - dil_count) - else: - parts = [None] * (4 - dil_count) + parts - parts += [state] - return tuple(parts) - - # ** Query Related **# # Field args (i.e. for queries etc): @@ -388,8 +316,8 @@ async def get_workflows(root, info, **args): if workflow is not None: args['ids'] = [workflow.id] - args['workflows'] = [parse_workflow_id(w_id) for w_id in args['ids']] - args['exworkflows'] = [parse_workflow_id(w_id) for w_id in args['exids']] + args['workflows'] = [Tokens(w_id) for w_id in args['ids']] + args['exworkflows'] = [Tokens(w_id) for w_id in args['exids']] resolvers = info.context.get('resolvers') return await resolvers.get_workflows(args) @@ -424,19 +352,31 @@ async def get_nodes_all(root, info, **args): node_type = NODE_MAP[get_type_str(info.return_type)] - args['ids'] = [parse_node_id(n_id, node_type) for n_id in args['ids']] - args['exids'] = [parse_node_id(n_id, node_type) for n_id in args['exids']] + for arg in ('ids', 'exids'): + if node_type in DEF_TYPES: + # namespace nodes don't fit into the universal ID scheme so must + # be tokenised manually + args[arg] = [ + Tokens( + cycle=None, + task=task, + job=None, + ) + for task in args[arg] + ] + else: + # live objects can be represented by a universal ID + args[arg] = [Tokens(n_id, relative=True) for n_id in args[arg]] args['workflows'] = [ - parse_workflow_id(w_id) for w_id in args['workflows']] + Tokens(w_id) for w_id in args['workflows']] args['exworkflows'] = [ - parse_workflow_id(w_id) for w_id in args['exworkflows']] + Tokens(w_id) for w_id in args['exworkflows']] resolvers = info.context.get('resolvers') return await resolvers.get_nodes_all(node_type, args) async def get_nodes_by_ids(root, info, **args): """Resolver for returning job, task, family node""" - field_name, field_ids = process_resolver_info(root, info, args) resolvers = info.context.get('resolvers') @@ -462,8 +402,8 @@ async def get_nodes_by_ids(root, info, **args): node_type = NODE_MAP[get_type_str(info.return_type)] - args['ids'] = [parse_node_id(n_id, node_type) for n_id in args['ids']] - args['exids'] = [parse_node_id(n_id, node_type) for n_id in args['exids']] + args['ids'] = [Tokens(n_id, relative=True) for n_id in args['ids']] + args['exids'] = [Tokens(n_id, relative=True) for n_id in args['exids']] return await resolvers.get_nodes_by_ids(node_type, args) @@ -510,9 +450,11 @@ async def get_edges_all(root, info, **args): process_resolver_info(root, info, args) args['workflows'] = [ - parse_workflow_id(w_id) for w_id in args['workflows']] + Tokens(w_id) for w_id in args['workflows'] + ] args['exworkflows'] = [ - parse_workflow_id(w_id) for w_id in args['exworkflows']] + Tokens(w_id) for w_id in args['exworkflows'] + ] resolvers = info.context.get('resolvers') return await resolvers.get_edges_all(args) @@ -537,17 +479,19 @@ async def get_nodes_edges(root, info, **args): process_resolver_info(root, info, args) if hasattr(root, 'id'): - args['workflows'] = [parse_workflow_id(root.id)] + args['workflows'] = [Tokens(root.id)] args['exworkflows'] = [] else: args['workflows'] = [ - parse_workflow_id(w_id) for w_id in args['workflows']] + Tokens(w_id) for w_id in args['workflows'] + ] args['exworkflows'] = [ - parse_workflow_id(w_id) for w_id in args['exworkflows']] + Tokens(w_id) for w_id in args['exworkflows'] + ] node_type = NODE_MAP['TaskProxy'] - args['ids'] = [parse_node_id(n_id, node_type) for n_id in args['ids']] - args['exids'] = [parse_node_id(n_id, node_type) for n_id in args['exids']] + args['ids'] = [Tokens(n_id) for n_id in args['ids']] + args['exids'] = [Tokens(n_id) for n_id in args['exids']] resolvers = info.context.get('resolvers') root_nodes = await resolvers.get_nodes_all(node_type, args) @@ -581,10 +525,11 @@ async def resolve_broadcasts(root, info, **args): result = {} t_type = NODE_MAP['Task'] - t_args = {'workflows': [parse_workflow_id(root.id)]} - tp_type = NODE_MAP['TaskProxy'] + t_args = {'workflows': [Tokens(root.id)]} for n_id in args['ids']: - _, _, point_string, name, _, _ = parse_node_id(n_id, tp_type) + tokens = Tokens(n_id) + point_string = tokens['cycle'] + name = tokens['task'] if point_string is None: point_string = '*' for cycle in set(ALL_CYCLE_POINTS_STRS + [point_string]): @@ -744,7 +689,7 @@ class Meta: ID, description=sstrip(''' Node IDs, cycle point and/or-just family/task namespace: - ["foo.1234", "1234|foo", "FAM.1234", "FAM.*"] + ["1234/foo", "1234/FAM", "*/FAM"] '''), default_value=[]), resolver=resolve_broadcasts) @@ -1267,8 +1212,8 @@ async def mutator(root, info, command=None, workflows=None, if exworkflows is None: exworkflows = [] w_args = {} - w_args['workflows'] = [parse_workflow_id(w_id) for w_id in workflows] - w_args['exworkflows'] = [parse_workflow_id(w_id) for w_id in exworkflows] + w_args['workflows'] = [Tokens(w_id) for w_id in workflows] + w_args['exworkflows'] = [Tokens(w_id) for w_id in exworkflows] if args.get('args', False): args.update(args.get('args', {})) args.pop('args') @@ -1281,31 +1226,30 @@ async def nodes_mutator(root, info, command, ids, workflows=None, exworkflows=None, **args): """Call the resolver method, dealing with multiple node id arguments, which acts on the workflow service via the internal command queue.""" - if command == 'put_messages': - node_type = 'jobs' - else: - node_type = 'task_proxy' - ids = [parse_node_id(n_id, node_type) for n_id in ids] + tokens_list = [Tokens(n_id, relative=True) for n_id in ids] # if the workflows arg is empty extract from proxy args if workflows is None: workflows = set() - for owner, workflow, _, _, _, _ in ids: - if owner and workflow: - workflows.add(f'{owner}{ID_DELIM}{workflow}') - elif workflow: - workflows.add(workflow) + for tokens in tokens_list: + workflows.add(tokens.workflow_id) if not workflows: return GenericResponse(result="Error: No given Workflow(s)") if exworkflows is None: exworkflows = [] w_args = {} - w_args['workflows'] = [parse_workflow_id(w_id) for w_id in workflows] - w_args['exworkflows'] = [parse_workflow_id(w_id) for w_id in exworkflows] + w_args['workflows'] = [Tokens(w_id) for w_id in workflows] + w_args['exworkflows'] = [Tokens(w_id) for w_id in exworkflows] if args.get('args', False): args.update(args.get('args', {})) args.pop('args') resolvers = info.context.get('resolvers') - res = await resolvers.nodes_mutator(info, command, ids, w_args, args) + res = await resolvers.nodes_mutator( + info, + command, + tokens_list, + w_args, + args + ) return GenericResponse(result=res) # Input types: diff --git a/cylc/flow/network/server.py b/cylc/flow/network/server.py index b70c60a09bb..a5502fdaeb9 100644 --- a/cylc/flow/network/server.py +++ b/cylc/flow/network/server.py @@ -92,24 +92,27 @@ class WorkflowRuntimeServer(ZMQSocketBase): Arguments which are shared between multiple commands. task identifier (str): - A task identifier in the format ``task.cycle-point`` - e.g. ``foo.1`` or ``bar.20000101T0000Z``. + A task identifier in the format ``cycle-point/task-name`` + e.g. ``1/foo`` or ``20000101T0000Z/bar``. .. _task globs: task globs (list): - A list of strings in the format - ``name[.cycle_point][:task_state]`` where ``name`` could be a - task or family name. - - Glob-like patterns may be used to match multiple items e.g. - - ``*`` - Matches everything. - ``*.1`` - Matches everything in cycle ``1``. - ``*.*:failed`` - Matches all failed tasks. + A list of Cylc IDs relative to the workflow. + + * ``1`` - The cycle point "1". + * ``1/foo`` - The task "foo" in the cycle "1". + * ``1/foo/01`` - The first job of the task "foo" from the cycle + "1". + + Glob-like patterns may be used to match multiple items e.g. + + ``*`` + Matches everything. + ``1/*`` + Matches everything in cycle ``1``. + ``*/*:failed`` + Matches all failed tasks. """ diff --git a/cylc/flow/option_parsers.py b/cylc/flow/option_parsers.py index 1e8ceeb8529..57a7c1e176f 100644 --- a/cylc/flow/option_parsers.py +++ b/cylc/flow/option_parsers.py @@ -22,6 +22,7 @@ import re from ansimarkup import parse as cparse import sys +from textwrap import dedent from typing import Any, Dict, Optional, List, Tuple from cylc.flow import LOG, RSYNC_LOG @@ -121,43 +122,41 @@ class CylcOptionParser(OptionParser): """Common options for all cylc CLI commands.""" - # Shared text for commands which can, & cannot, glob on cycle points: - MULTI_USAGE_TEMPLATE = """{0} - -For example, to match:{1}""" - # Help text either including or excluding globbing on cycle points: - WITH_CYCLE_GLOBS = """ -One or more TASK_GLOBs can be given to match task instances in the current task -pool, by task or family name pattern, cycle point pattern, and task state. -* [CYCLE-POINT-GLOB/]TASK-NAME-GLOB[:TASK-STATE] -* [CYCLE-POINT-GLOB/]FAMILY-NAME-GLOB[:TASK-STATE] -* TASK-NAME-GLOB[.CYCLE-POINT-GLOB][:TASK-STATE] -* FAMILY-NAME-GLOB[.CYCLE-POINT-GLOB][:TASK-STATE]""" - WITHOUT_CYCLE_GLOBS = """ -TASK_GLOB matches task or family names at a given cycle point. -* CYCLE-POINT/TASK-NAME-GLOB -* CYCLE-POINT/FAMILY-NAME-GLOB -* TASK-NAME-GLOB.CYCLE-POINT -* FAMILY-NAME-GLOB.CYCLE-POINT""" - WITH_CYCLE_EXAMPLES = """ -* all tasks in a cycle: '20200202T0000Z/*' or '*.20200202T0000Z' -* all tasks in the submitted status: ':submitted' -* running 'foo*' tasks in 0000Z cycles: 'foo*.*0000Z:running' or - '*0000Z/foo*:running' -* waiting tasks in 'BAR' family: '*/BAR:waiting' or 'BAR.*:waiting' -* submitted tasks in 'BAR' or 'BAZ' families: '*/BA[RZ]:submitted' or - 'BA[RZ].*:submitted'""" - WITHOUT_CYCLE_EXAMPLES = """ -* all tasks: '20200202T0000Z/*' or '*.20200202T0000Z' -* all tasks named model_N for some character N: '20200202T0000Z/model_?' or - 'model_?.20200202T0000Z' -* all tasks in 'BAR' family: '20200202T0000Z/BAR' or 'BAR.20200202T0000Z' -* all tasks in 'BAR' or 'BAZ' families: '20200202T0000Z/BA[RZ]' or - 'BA[RZ].20200202T0000Z'""" - MULTITASKCYCLE_USAGE = MULTI_USAGE_TEMPLATE.format( - WITH_CYCLE_GLOBS, WITH_CYCLE_EXAMPLES) - MULTITASK_USAGE = MULTI_USAGE_TEMPLATE.format( - WITHOUT_CYCLE_GLOBS, WITHOUT_CYCLE_EXAMPLES) + MULTITASK_USAGE = cparse(dedent(''' + This command can operate on multiple tasks, globs and selectors may + be used: + Multiple Tasks: + # Operate on two tasks + workflow //cycle-1/task-1 //cycle-2/task-2 + + Globs (note: globs should be quoted and only match active tasks): + # Match any the active task "foo" in all cycles + '//*/foo' + + # Match the tasks "foo-1" and "foo-2" + '//*/foo-[12]' + + Selectors (note: selectors only match active tasks): + # match all failed tasks in cycle "1" + //1:failed + + See `cylc help id` for more details. + ''')) + MULTIWORKFLOW_USAGE = cparse(dedent(''' + This command can operate on multiple workflows, globs may also be used: + Multiple Workflows: + # Operate on two workflows + workflow-1 workflow-2 + + Globs (note: globs should be quoted): + # Match all workflows + '*' + + # Match the workflows foo-1, foo-2 + 'foo-[12]' + + See `cylc help id` for more details. + ''')) def __init__( self, @@ -166,7 +165,7 @@ def __init__( comms: bool = False, jset: bool = False, multitask: bool = False, - multitask_nocycles: bool = False, + multiworkflow: bool = False, prep: bool = False, auto_add: bool = True, icp: bool = False, @@ -177,6 +176,9 @@ def __init__( self.auto_add = auto_add if argdoc is None: if prep: + + # TODO + argdoc = [('WORKFLOW | PATH', 'Workflow ID or path')] else: argdoc = [('WORKFLOW', 'Workflow ID')] @@ -186,10 +188,11 @@ def __init__( # (This catches both '--color=never' and '--color never'.) usage = format_shell_examples(usage) + if multiworkflow: + usage += self.MULTIWORKFLOW_USAGE if multitask: - usage += self.MULTITASKCYCLE_USAGE - elif multitask_nocycles: # glob on task names but not cycle points usage += self.MULTITASK_USAGE + args = "" self.n_compulsory_args = 0 self.n_optional_args = 0 diff --git a/cylc/flow/prerequisite.py b/cylc/flow/prerequisite.py index d4347a14501..069b0c06b54 100644 --- a/cylc/flow/prerequisite.py +++ b/cylc/flow/prerequisite.py @@ -19,11 +19,13 @@ import math import re -from cylc.flow import ID_DELIM from cylc.flow.cycling.loader import get_point from cylc.flow.exceptions import TriggerExpressionError from cylc.flow.data_messages_pb2 import ( # type: ignore - PbPrerequisite, PbCondition) + PbPrerequisite, + PbCondition, +) +from cylc.flow.id import Tokens class Prerequisite: @@ -45,7 +47,7 @@ class Prerequisite: # Extracts T from "foo.T succeeded" etc. SATISFIED_TEMPLATE = 'bool(self.satisfied[("%s", "%s", "%s")])' - MESSAGE_TEMPLATE = '%s.%s %s' + MESSAGE_TEMPLATE = r'%s/%s %s' DEP_STATE_SATISFIED = 'satisfied naturally' DEP_STATE_OVERRIDDEN = 'force satisfied' @@ -64,11 +66,11 @@ def __init__(self, point, start_point=None): self.target_point_strings = [] # Dictionary of messages pertaining to this prerequisite. - # {('task name', 'point string', 'output'): DEP_STATE_X, ...} + # {('point string', 'task name', 'output'): DEP_STATE_X, ...} self.satisfied = {} # Expression present only when conditions are used. - # 'foo.1 failed & bar.1 succeeded' + # '1/foo failed & 1/bar succeeded' self.conditional_expression = None # The cached state of this prerequisite: @@ -88,7 +90,7 @@ def add(self, name, point, output, pre_initial=False): pre_initial (bool): this is a pre-initial dependency. """ - message = (name, str(point), output) + message = (str(point), name, output) # Add a new prerequisite as satisfied if pre-initial, else unsatisfied. if pre_initial: @@ -124,14 +126,14 @@ def set_condition(self, expr): # Add 'foo' to the 'satisfied' dict before 'xfoo'. >>> preq = Prerequisite(1) >>> preq.satisfied = { - ... ('foo', '1', 'succeeded'): False, - ... ('xfoo', '1', 'succeeded'): False + ... ('1', 'foo', 'succeeded'): False, + ... ('1', 'xfoo', 'succeeded'): False ... } - >>> preq.set_condition("foo.1 succeeded|xfoo.1 succeeded") + >>> preq.set_condition("1/foo succeeded|1/xfoo succeeded") >>> expr = preq.conditional_expression >>> expr.split('|') # doctest: +NORMALIZE_WHITESPACE - ['bool(self.satisfied[("foo", "1", "succeeded")])', - 'bool(self.satisfied[("xfoo", "1", "succeeded")])'] + ['bool(self.satisfied[("1", "foo", "succeeded")])', + 'bool(self.satisfied[("1", "xfoo", "succeeded")])'] """ self._all_satisfied = None @@ -145,6 +147,7 @@ def set_condition(self, expr): self.SATISFIED_TEMPLATE % message, expr ) + self.conditional_expression = expr def is_satisfied(self): @@ -201,7 +204,7 @@ def satisfy_me(self, all_task_outputs): self._all_satisfied = self._conditional_is_satisfied() return relevant_messages - def api_dump(self, workflow_id): + def api_dump(self): """Return list of populated Protobuf data objects.""" if not self.satisfied: return None @@ -215,8 +218,8 @@ def api_dump(self, workflow_id): conds = [] num_length = math.ceil(len(self.satisfied) / 10) for ind, message_tuple in enumerate(sorted(self.satisfied)): - name, point = message_tuple[0:2] - t_id = f"{workflow_id}{ID_DELIM}{point}{ID_DELIM}{name}" + point, name = message_tuple[0:2] + t_id = Tokens(cycle=str(point), task=name).relative_id char = 'c%.{0}d'.format(num_length) % ind c_msg = self.MESSAGE_TEMPLATE % message_tuple c_val = self.satisfied[message_tuple] @@ -277,9 +280,9 @@ def get_target_points(self): def get_resolved_dependencies(self): """Return a list of satisfied dependencies. - E.G: ['foo.1', 'bar.2'] + E.G: ['1/foo', '2/bar'] """ - return [f'{name}.{point}' for - (name, point, _), satisfied in self.satisfied.items() if + return [f'{point}/{name}' for + (point, name, _), satisfied in self.satisfied.items() if satisfied == self.DEP_STATE_SATISFIED] diff --git a/cylc/flow/rundb.py b/cylc/flow/rundb.py index 38455dffe7f..916b86a6f3e 100644 --- a/cylc/flow/rundb.py +++ b/cylc/flow/rundb.py @@ -706,16 +706,18 @@ def select_task_job_platforms(self): def select_submit_nums(self, name, point): """Select submit_num and flow_nums from task_states table. - Fetch submit number and flow_nums for spawning task name.point. + Fetch submit number and flow_nums for spawning tasks. + Return: - { - flow_nums: submit_num, - ..., - } + { + flow_nums: submit_num, + ..., + } Args: name: task name point: task cycle point (str) + """ # Ignore bandit false positive: B608: hardcoded_sql_expressions # Not an injection, simply putting the table name in the SQL query diff --git a/cylc/flow/scheduler.py b/cylc/flow/scheduler.py index bfb302a7c5d..788f81355aa 100644 --- a/cylc/flow/scheduler.py +++ b/cylc/flow/scheduler.py @@ -40,13 +40,14 @@ from metomi.isodatetime.parsers import TimePointParser from cylc.flow import ( - LOG, main_loop, ID_DELIM, __version__ as CYLC_VERSION + LOG, main_loop, __version__ as CYLC_VERSION ) from cylc.flow.broadcast_mgr import BroadcastMgr from cylc.flow.cfgspec.glbl_cfg import glbl_cfg from cylc.flow.config import WorkflowConfig from cylc.flow.cycling.loader import get_point -from cylc.flow.data_store_mgr import DataStoreMgr, parse_job_item +from cylc.flow.data_store_mgr import DataStoreMgr +from cylc.flow.id import Tokens from cylc.flow.flow_mgr import FlowMgr from cylc.flow.exceptions import ( CommandFailedError, CyclingError, CylcError, UserInputError @@ -253,7 +254,10 @@ def __init__(self, reg: str, options: Values) -> None: self.workflow_name = get_workflow_name_from_id(self.workflow) self.owner = get_user() self.host = get_host() - self.id = f'{self.owner}{ID_DELIM}{self.workflow}' + self.id = Tokens( + user=self.owner, + workflow=self.workflow, + ).id self.uuid_str = str(uuid4()) self.options = options self.template_vars = load_template_vars( @@ -759,7 +763,7 @@ def restart_remote_init(self): sleep(1.0) # Remote init/file-install is done via process pool self.proc_pool.process() - self.command_poll_tasks() + self.command_poll_tasks(['*/*']) def _load_task_run_times(self, row_idx, row): """Load run times of previously succeeded task jobs.""" @@ -787,11 +791,15 @@ def process_queued_task_messages(self): except Empty: break self.message_queue.task_done() - cycle, task_name, submit_num = parse_job_item(task_job) - task_id = TaskID.get(task_name, cycle) + tokens = Tokens(task_job, relative=True) + # task ID (job stripped) + task_id = tokens.duplicate(job=None).relative_id messages.setdefault(task_id, []) + # job may be None (e.g. simulation mode) + job = int(tokens['job']) if tokens['job'] else None messages[task_id].append( - (submit_num, event_time, severity, message)) + (job, event_time, severity, message) + ) # Note on to_poll_tasks: If an incoming message is going to cause a # reverse change to task state, it is desirable to confirm this by # polling. @@ -898,11 +906,7 @@ def command_stop( elif task: # schedule shutdown after task succeeds task_id = TaskID.get_standardised_taskid(task) - if TaskID.is_valid_id(task_id): - self.pool.set_stop_task(task_id) - else: - # TODO: yield warning - pass + self.pool.set_stop_task(task_id) else: # immediate shutdown with suppress(KeyError): @@ -937,18 +941,18 @@ def command_resume(self) -> None: """Resume paused workflow.""" self.resume_workflow() - def command_poll_tasks(self, items=None): + def command_poll_tasks(self, items: List[str]): """Poll pollable tasks or a task or family if options are provided.""" if self.config.run_mode('simulation'): return - itasks, bad_items = self.pool.filter_task_proxies(items) + itasks, _, bad_items = self.pool.filter_task_proxies(items) self.task_job_mgr.poll_task_jobs(self.workflow, itasks) # (Could filter itasks by state here if needed) return len(bad_items) - def command_kill_tasks(self, items=None): + def command_kill_tasks(self, items: List[str]): """Kill all tasks or a task/family if options are provided.""" - itasks, bad_items = self.pool.filter_task_proxies(items) + itasks, _, bad_items = self.pool.filter_task_proxies(items) if self.config.run_mode('simulation'): for itask in itasks: if itask.state(*TASK_STATUSES_ACTIVE): @@ -1350,8 +1354,8 @@ async def workflow_shutdown(self): raise SchedulerStop(self.stop_mode.value) elif (self.time_next_kill is not None and time() > self.time_next_kill): - self.command_poll_tasks() - self.command_kill_tasks() + self.command_poll_tasks(['*/*']) + self.command_kill_tasks(['*/*']) self.time_next_kill = time() + self.INTERVAL_STOP_KILL # Is the workflow set to auto stop [+restart] now ... diff --git a/cylc/flow/scheduler_cli.py b/cylc/flow/scheduler_cli.py index e2443733b96..a96ceb2e150 100644 --- a/cylc/flow/scheduler_cli.py +++ b/cylc/flow/scheduler_cli.py @@ -26,6 +26,7 @@ import cylc.flow.flags from cylc.flow.host_select import select_workflow_host from cylc.flow.hostuserutil import is_remote_host +from cylc.flow.id_cli import parse_ids from cylc.flow.loggingutil import ( close_log, TimestampRotatingFileHandler, @@ -42,7 +43,6 @@ from cylc.flow.scheduler import Scheduler, SchedulerError from cylc.flow.scripts import cylc_header from cylc.flow.workflow_files import ( - parse_reg, detect_old_contact_file, SUITERC_DEPR_MSG ) @@ -81,8 +81,8 @@ $ cylc play --start-cycle-point=20250101T0000Z WORKFLOW # Start a new run from specified tasks in the graph - $ cylc play --start-task=foo.3 WORKFLOW - $ cylc play -t foo.3 -t bar.3 WORKFLOW + $ cylc play --start-task=3/foo WORKFLOW + $ cylc play -t 3/foo -t 3/bar WORKFLOW # Start, restart or resume the second installed run of the workflow # "dogs/fido" @@ -251,24 +251,24 @@ def get_option_parser(add_std_opts=False): RunOptions = Options(get_option_parser(add_std_opts=True), DEFAULT_OPTS) -def _open_logs(reg, no_detach): +def _open_logs(id_, no_detach): """Open Cylc log handlers for a flow run.""" if not no_detach: while LOG.handlers: LOG.handlers[0].close() LOG.removeHandler(LOG.handlers[0]) - log_path = get_workflow_run_log_name(reg) + log_path = get_workflow_run_log_name(id_) LOG.addHandler( TimestampRotatingFileHandler(log_path, no_detach) ) # Add file installation log - file_install_log_path = get_workflow_file_install_log_name(reg) + file_install_log_path = get_workflow_file_install_log_name(id_) RSYNC_LOG.addHandler( TimestampRotatingFileHandler(file_install_log_path, no_detach) ) -def scheduler_cli(options: 'Values', reg: str) -> None: +def scheduler_cli(options: 'Values', workflow_id: str) -> None: """Run the workflow. This function should contain all of the command line facing @@ -281,16 +281,25 @@ def scheduler_cli(options: 'Values', reg: str) -> None: """ # Parse workflow name but delay Cylc 7 suiter.rc deprecation warning # until after the start-up splash is printed. - reg, _ = parse_reg(reg, warn_depr=False) + # TODO: singleton + (workflow_id,), _ = parse_ids( + workflow_id, + constraint='workflows', + max_workflows=1, + # warn_depr=False, # TODO + ) try: - detect_old_contact_file(reg) + detect_old_contact_file(workflow_id) except ServiceFileError as exc: print(f"Resuming already-running workflow\n\n{exc}") - pclient = WorkflowRuntimeClient(reg, timeout=options.comms_timeout) + pclient = WorkflowRuntimeClient( + workflow_id, + timeout=options.comms_timeout, + ) mutation_kwargs = { 'request_string': RESUME_MUTATION, 'variables': { - 'wFlows': [reg] + 'wFlows': [workflow_id] } } pclient('graphql', mutation_kwargs) @@ -316,7 +325,7 @@ def scheduler_cli(options: 'Values', reg: str) -> None: # setup the scheduler # NOTE: asyncio.run opens an event loop, runs your coro, # then shutdown async generators and closes the event loop - scheduler = Scheduler(reg, options) + scheduler = Scheduler(workflow_id, options) asyncio.run( _setup(scheduler) ) @@ -329,7 +338,7 @@ def scheduler_cli(options: 'Values', reg: str) -> None: daemonize(scheduler) # setup loggers - _open_logs(reg, options.no_detach) + _open_logs(workflow_id, options.no_detach) # run the workflow ret = asyncio.run( @@ -386,6 +395,6 @@ async def _run(scheduler: Scheduler) -> int: @cli_function(get_option_parser) -def play(parser: COP, options: 'Values', reg: str): +def play(parser: COP, options: 'Values', id_: str): """Implement cylc play.""" - return scheduler_cli(options, reg) + return scheduler_cli(options, id_) diff --git a/cylc/flow/scripts/broadcast.py b/cylc/flow/scripts/broadcast.py index 1da9bccdc82..ded95eab0a6 100755 --- a/cylc/flow/scripts/broadcast.py +++ b/cylc/flow/scripts/broadcast.py @@ -53,16 +53,19 @@ # To do the same with a file: $ cat >'broadcast.cylc' <<'__FLOW__' - $ [environment] - $ VERSE = the quick brown fox - $ __FLOW__ - $ cylc broadcast -F 'broadcast.cylc' WORKFLOW + > [environment] + > VERSE = the quick brown fox + > __FLOW__ + $ cylc broadcast -F 'broadcast.cylc' WORKFLOW_ID # To cancel the same broadcast: - $ cylc broadcast --cancel "[environment]VERSE" WORKFLOW + $ cylc broadcast --cancel "[environment]VERSE" WORKFLOW_ID # If -F FILE was used, the same file can be used to cancel the broadcast: - $ cylc broadcast -G 'broadcast.cylc' WORKFLOW + $ cylc broadcast -G 'broadcast.cylc' WORKFLOW_ID + + # Use broadcast with multiple workflows + $ cylc broadcast [options] WORKFLOW_ID_1// WORKFLOW_ID_2// Use -d/--display to see active broadcasts. Multiple --cancel options or multiple --set and --set-file options can be used on the same command line. @@ -77,24 +80,25 @@ See also 'cylc reload' - reload a modified workflow definition at run time.""" from ansimarkup import parse as cparse +from functools import partial import re import sys from tempfile import NamedTemporaryFile from typing import Any, Dict, TYPE_CHECKING -from cylc.flow import ID_DELIM -from cylc.flow.task_id import TaskID -from cylc.flow.terminal import cli_function -from cylc.flow.exceptions import UserInputError -from cylc.flow.print_tree import print_tree -from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.broadcast_report import ( - get_broadcast_bad_options_report, get_broadcast_change_report) + get_broadcast_bad_options_report, + get_broadcast_change_report, +) from cylc.flow.cfgspec.workflow import SPEC, upg +from cylc.flow.exceptions import UserInputError from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi +from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.parsec.config import ParsecConfig from cylc.flow.parsec.validate import cylc_config_validate -from cylc.flow.workflow_files import parse_reg +from cylc.flow.print_tree import get_tree +from cylc.flow.terminal import cli_function if TYPE_CHECKING: from optparse import Values @@ -224,8 +228,10 @@ def report_bad_options(bad_options, is_set=False): def get_option_parser(): """CLI for "cylc broadcast".""" parser = COP( - __doc__, comms=True, - argdoc=[('WORKFLOW', 'Workflow name or ID')] + __doc__, + comms=True, + multiworkflow=True, + argdoc=[('WORKFLOW_ID [WORKFLOW_ID ...]', 'Workflow ID(s)')], ) parser.add_option( @@ -282,9 +288,11 @@ def get_option_parser(): action="store_true", default=False, dest="show") parser.add_option( - "-k", "--display-task", metavar="TASK_GLOB", - help="Print active broadcasts for a given task " - "(" + TaskID.SYNTAX + ").", + "-k", "--display-task", metavar="TASK_ID_GLOB", + help=( + "Print active broadcasts for a given task " + "(in the format cycle/task)." + ), action="store", default=None, dest="showtask") parser.add_option( @@ -301,16 +309,20 @@ def get_option_parser(): return parser -@cli_function(get_option_parser) -def main(_, options: 'Values', workflow: str) -> None: +async def run(options: 'Values', workflow_id): """Implement cylc broadcast.""" - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) + pclient = get_client(workflow_id, timeout=options.comms_timeout) + + ret: Dict[str, Any] = { + 'stdout': [], + 'stderr': [], + 'exit': 0, + } mutation_kwargs: Dict[str, Any] = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], 'bMode': 'Set', 'cPoints': options.point_strings, 'nSpaces': options.namespaces, @@ -322,7 +334,7 @@ def main(_, options: 'Values', workflow: str) -> None: query_kwargs: Dict[str, Any] = { 'request_string': QUERY, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], 'nIds': [] } @@ -331,20 +343,23 @@ def main(_, options: 'Values', workflow: str) -> None: if options.show or options.showtask: if options.showtask: try: - task, point = TaskID.split(options.showtask) - query_kwargs['variables']['nIds'] = [ - f'{point}{ID_DELIM}{task}'] + query_kwargs['variables']['nIds'] = [options.showtask] except ValueError: - raise UserInputError("TASKID must be " + TaskID.SYNTAX) - result = pclient('graphql', query_kwargs) + # TODO validate showtask? + raise UserInputError( + 'TASK_ID_GLOB must be in the format: cycle/task' + ) + result = await pclient.async_request('graphql', query_kwargs) for wflow in result['workflows']: settings = wflow['broadcasts'] padding = get_padding(settings) * ' ' if options.raw: - print(str(settings)) + ret['stdout'].append(str(settings)) else: - print_tree(settings, padding, options.unicode) - sys.exit(0) + ret['stdout'].extend( + get_tree(settings, padding, options.unicode) + ) + return ret report_cancel = True report_set = False @@ -402,11 +417,44 @@ def main(_, options: 'Values', workflow: str) -> None: report_cancel = False report_set = True - results = pclient('graphql', mutation_kwargs) + results = await pclient.async_request('graphql', mutation_kwargs) for result in results['broadcast']['result']: modified_settings = result['response'][0] bad_options = result['response'][1] if modified_settings: - print(get_broadcast_change_report( - modified_settings, is_cancel=report_cancel)) - sys.exit(report_bad_options(bad_options, is_set=report_set)) + ret['stdout'].append( + get_broadcast_change_report( + modified_settings, + is_cancel=report_cancel, + ) + ) + + bad_opts = report_bad_options(bad_options, is_set=report_set) + if bad_opts: + ret['stderr'].append(f'ERROR: {bad_opts}') + ret['exit'] = 1 + return ret + + +def report(ret): + for line in ret['stdout']: + print(line) + for line in ret['stderr']: + if line is not None: + print(line, file=sys.stderr) + + +@cli_function(get_option_parser) +def main(_, options: 'Values', *ids) -> None: + rets = call_multi( + partial(run, options), + *ids, + constraint='workflows', + report=report, + ) + if all( + ret['exit'] == 0 + for ret in rets + ): + sys.exit(0) + sys.exit(1) diff --git a/cylc/flow/scripts/cat_log.py b/cylc/flow/scripts/cat_log.py index 6b678e83b0b..c135c521aba 100755 --- a/cylc/flow/scripts/cat_log.py +++ b/cylc/flow/scripts/cat_log.py @@ -39,17 +39,17 @@ but can be discovered with '--mode=d' (print-dir). Examples: - # for a task "bar.2020" in workflow "foo" + # for a task "2020/bar" in workflow "foo" # Print workflow log: $ cylc cat-log foo # Print task stdout: - $ cylc cat-log foo bar.2020 - $ cylc cat-log -f o foo bar.2020 + $ cylc cat-log foo//2020/bar + $ cylc cat-log -f o foo//2020/bar # Print task stderr: - $cylc cat-log -f e foo bar.2020 + $cylc cat-log -f e foo//2020/bar """ import os @@ -60,12 +60,13 @@ from subprocess import Popen, PIPE, DEVNULL import sys from tempfile import NamedTemporaryFile -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING from cylc.flow.cfgspec.glbl_cfg import glbl_cfg from cylc.flow.exceptions import UserInputError import cylc.flow.flags from cylc.flow.hostuserutil import is_remote_platform +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import ( CylcOptionParser as COP, verbosity_to_opts, @@ -78,12 +79,10 @@ get_workflow_run_pub_db_name) from cylc.flow.remote import remote_cylc_cmd, watch_and_kill from cylc.flow.rundb import CylcWorkflowDAO -from cylc.flow.task_id import TaskID from cylc.flow.task_job_logs import ( JOB_LOG_OUT, JOB_LOG_ERR, JOB_LOG_OPTS, NN, JOB_LOG_ACTIVITY) from cylc.flow.terminal import cli_function from cylc.flow.platforms import get_platform -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -225,8 +224,7 @@ def get_option_parser(): parser = COP( __doc__, argdoc=[ - ("WORKFLOW", "Workflow name or ID"), - ("[TASK-ID]", """Task ID""") + ("ID [...]", "Workflow/Cycle/Task ID"), ] ) @@ -275,14 +273,14 @@ def get_option_parser(): return parser -def get_task_job_attrs(workflow_name, point, task, submit_num): +def get_task_job_attrs(workflow_id, point, task, submit_num): """Return job (platform, job_runner_name, live_job_id). live_job_id is the job ID if job is running, else None. """ workflow_dao = CylcWorkflowDAO( - get_workflow_run_pub_db_name(workflow_name), is_public=True) + get_workflow_run_pub_db_name(workflow_id), is_public=True) task_job_data = workflow_dao.select_task_job(point, task, submit_num) workflow_dao.close() if task_job_data is None: @@ -329,8 +327,7 @@ def tmpfile_edit(tmpfile, geditor=False): def main( parser: COP, options: 'Values', - reg: str, - task_id: Optional[str] = None, + *ids, color: bool = False ) -> None: """Implement cylc cat-log CLI. @@ -357,19 +354,20 @@ def main( sys.exit(res) return - workflow_name, _ = parse_reg(reg) + workflow_id, tokens, _ = parse_id(*ids, constraint='mixed') + # Get long-format mode. try: mode = MODES[options.mode] except KeyError: mode = options.mode - if not task_id: + if not tokens or not tokens.get('task'): # Cat workflow logs, local only. if options.filename is not None: raise UserInputError("The '-f' option is for job logs only.") - logpath = get_workflow_run_log_name(workflow_name) + logpath = get_workflow_run_log_name(workflow_id) if options.rotation_num: logs = glob('%s.*' % logpath) logs.sort(key=os.path.getmtime, reverse=True) @@ -388,15 +386,13 @@ def main( tmpfile_edit(out, options.geditor) return - if task_id: + else: # Cat task job logs, may be on workflow or job host. if options.rotation_num is not None: raise UserInputError( "only workflow (not job) logs get rotated") - try: - task, point = TaskID.split(task_id) - except ValueError: - parser.error("Illegal task ID: %s" % task_id) + task = tokens['task'] + point = tokens['cycle'] if options.submit_num != NN: try: options.submit_num = "%02d" % int(options.submit_num) @@ -410,7 +406,7 @@ def main( options.filename = JOB_LOG_OPTS[options.filename] # KeyError: Is already long form (standard log, or custom). platform_name, job_runner_name, live_job_id = get_task_job_attrs( - workflow_name, point, task, options.submit_num) + workflow_id, point, task, options.submit_num) platform = get_platform(platform_name) batchview_cmd = None if live_job_id is not None: @@ -441,7 +437,7 @@ def main( and live_job_id is None) if log_is_remote and (not log_is_retrieved or options.force_remote): logpath = os.path.normpath(get_remote_workflow_run_job_dir( - workflow_name, point, task, options.submit_num, + workflow_id, point, task, options.submit_num, options.filename)) tail_tmpl = platform["tail command template"] # Reinvoke the cat-log command on the remote account. @@ -450,7 +446,7 @@ def main( cmd.append('--remote-arg=%s' % shlex.quote(item)) if batchview_cmd: cmd.append('--remote-arg=%s' % shlex.quote(batchview_cmd)) - cmd.append(workflow_name) + cmd.append(workflow_id) is_edit_mode = (mode == 'edit') # TODO: Add Intelligent Host selection to this try: @@ -477,7 +473,7 @@ def main( else: # Local task job or local job log. logpath = os.path.normpath(get_workflow_run_job_dir( - workflow_name, point, task, options.submit_num, + workflow_id, point, task, options.submit_num, options.filename)) tail_tmpl = os.path.expandvars(platform["tail command template"]) out = view_log(logpath, mode, tail_tmpl, batchview_cmd, diff --git a/cylc/flow/scripts/check_versions.py b/cylc/flow/scripts/check_versions.py index 1dde5046925..55e07c40a90 100755 --- a/cylc/flow/scripts/check_versions.py +++ b/cylc/flow/scripts/check_versions.py @@ -41,9 +41,9 @@ from cylc.flow.cylc_subproc import procopen, PIPE, DEVNULL from cylc.flow import __version__ as CYLC_VERSION from cylc.flow.config import WorkflowConfig +from cylc.flow.id_cli import parse_id from cylc.flow.platforms import get_platform, get_host_from_platform from cylc.flow.remote import construct_ssh_cmd -from cylc.flow.workflow_files import parse_reg from cylc.flow.templatevars import load_template_vars from cylc.flow.terminal import cli_function @@ -52,7 +52,12 @@ def get_option_parser(): - parser = COP(__doc__, prep=True, jset=True) + parser = COP( + __doc__, + prep=True, + jset=True, + argdoc=[('WORKFLOW_ID', 'Workflow ID or path to source')], + ) parser.add_option( "-e", "--error", help="Exit with error status " @@ -63,12 +68,16 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(_, options: 'Values', reg: str) -> None: - workflow, flow_file = parse_reg(reg, src=True) - - # extract task host platforms from the workflow +def main(_, options: 'Values', *ids) -> None: + workflow_id, _, flow_file = parse_id( + *ids, + src=True, + constraint='workflows', + ) + + # extract task host platforms from the workflow_id config = WorkflowConfig( - workflow, + workflow_id, flow_file, options, load_template_vars(options.templatevars, options.templatevars_file)) diff --git a/cylc/flow/scripts/clean.py b/cylc/flow/scripts/clean.py index e21d4b3e4c2..df0c68e5836 100644 --- a/cylc/flow/scripts/clean.py +++ b/cylc/flow/scripts/clean.py @@ -32,6 +32,9 @@ # Remove the workflow at ~/cylc-run/foo/bar $ cylc clean foo/bar + # Remove multiple workflows + $ cylc clean one two three + # Remove the workflow's log directory $ cylc clean foo/bar --rm log @@ -54,15 +57,18 @@ """ +import asyncio +import sys from typing import TYPE_CHECKING from cylc.flow import LOG from cylc.flow.exceptions import UserInputError import cylc.flow.flags +from cylc.flow.id_cli import parse_ids_async from cylc.flow.loggingutil import disable_timestamps from cylc.flow.option_parsers import CylcOptionParser as COP, Options -from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import init_clean +from cylc.flow.terminal import cli_function, is_terminal +from cylc.flow.workflow_files import init_clean, get_contained_workflows if TYPE_CHECKING: from optparse import Values @@ -71,8 +77,9 @@ def get_option_parser(): parser = COP( __doc__, - argdoc=[('WORKFLOW', 'Workflow name or ID')], - segregated_log=True + multiworkflow=True, + argdoc=[('WORKFLOW_ID [WORKFLOW_ID ...]', 'Workflow IDs')], + segregated_log=True, ) parser.add_option( @@ -117,9 +124,64 @@ def get_option_parser(): CleanOptions = Options(get_option_parser()) +def prompt(workflows): + print('Would remove the following workflows:') + for workflow in workflows: + print(f' {workflow}') + + if is_terminal(): + while True: + ret = input('Remove these workflows (y/n): ') + if ret.lower() == 'y': + return + if ret.lower() == 'n': + sys.exit(1) + else: + print('Use --force to remove multiple workflows.', file=sys.stderr) + sys.exit(1) + + +async def scan(workflows, multi_mode): + """Expand tuncated workflow IDs + + For example "one" might expand to "one/run1" & "one/run2" + or "one/two/run1". + + """ + ret = [] + for workflow in list(workflows): + contained_flows = await get_contained_workflows(workflow) + if contained_flows: + ret.extend(contained_flows) + multi_mode = True + else: + ret.append(workflow) + return ret, multi_mode + + +async def run(*ids, opts=None): + # parse ids from the CLI + workflows, multi_mode = await parse_ids_async( + *ids, + constraint='workflows', + match_workflows=True, + match_active=False, + infer_latest_runs=False, # don't infer latest runs like other cmds + ) + + # expand partial workflow ids (including run names) + workflows, multi_mode = await scan(workflows, multi_mode) + + workflows.sort() + if multi_mode and not opts.force: + prompt(workflows) # prompt for approval or exit + + for workflow in sorted(workflows): + init_clean(workflow, opts) + + @cli_function(get_option_parser) -def main(parser: COP, opts: 'Values', reg: str): - # Note: do not use workflow_files.parse_reg here +def main(_, opts: 'Values', *ids: str): if cylc.flow.flags.verbosity < 2: disable_timestamps(LOG) @@ -128,4 +190,4 @@ def main(parser: COP, opts: 'Values', reg: str): "--local and --remote options are mutually exclusive" ) - init_clean(reg, opts) + asyncio.run(run(*ids, opts=opts)) diff --git a/cylc/flow/scripts/client.py b/cylc/flow/scripts/client.py index a2263b6d632..aa5fe0f82f7 100755 --- a/cylc/flow/scripts/client.py +++ b/cylc/flow/scripts/client.py @@ -29,11 +29,11 @@ import sys from typing import TYPE_CHECKING +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.network.client import WorkflowRuntimeClient from cylc.flow.network.server import PB_METHOD_MAP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -44,7 +44,7 @@ def get_option_parser(): parser = COP(__doc__, comms=True, argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), + ('WORKFLOW_ID', 'Workflow ID'), ('METHOD', 'Network API function name')]) parser.add_option( @@ -56,9 +56,12 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(_, options: 'Values', workflow: str, func: str) -> None: - workflow, _ = parse_reg(workflow) - pclient = WorkflowRuntimeClient(workflow, timeout=options.comms_timeout) +def main(_, options: 'Values', workflow_id: str, func: str) -> None: + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) + pclient = WorkflowRuntimeClient(workflow_id, timeout=options.comms_timeout) if options.no_input: kwargs = {} else: diff --git a/cylc/flow/scripts/config.py b/cylc/flow/scripts/config.py index 557005ca665..4174156ab0a 100755 --- a/cylc/flow/scripts/config.py +++ b/cylc/flow/scripts/config.py @@ -54,11 +54,12 @@ from cylc.flow.cfgspec.glbl_cfg import glbl_cfg from cylc.flow.config import WorkflowConfig +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.pathutil import get_workflow_run_dir from cylc.flow.templatevars import get_template_vars from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import WorkflowFiles, parse_reg +from cylc.flow.workflow_files import WorkflowFiles if TYPE_CHECKING: from optparse import Values @@ -67,7 +68,7 @@ def get_option_parser(): parser = COP( __doc__, - argdoc=[("[WORKFLOW]", "Workflow name, ID, or path")], + argdoc=[("[WORKFLOW_ID]", "Workflow ID or path to source")], jset=True, icp=True ) @@ -106,21 +107,26 @@ def get_option_parser(): return parser -def get_config_file_hierarchy(reg: Optional[str] = None) -> List[str]: +def get_config_file_hierarchy(workflow_id: Optional[str] = None) -> List[str]: filepaths = [os.path.join(path, glbl_cfg().CONF_BASENAME) for _, path in glbl_cfg().conf_dir_hierarchy] - if reg is not None: - filepaths.append(get_workflow_run_dir(reg, WorkflowFiles.FLOW_FILE)) + if workflow_id is not None: + filepaths.append( + get_workflow_run_dir(workflow_id, WorkflowFiles.FLOW_FILE) + ) return filepaths @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: Optional[str] = None) -> None: - if options.print_hierarchy: - print("\n".join(get_config_file_hierarchy(reg))) - return - - if reg is None: +def main( + parser: COP, + options: 'Values', + *ids, +) -> None: + if not ids: + if options.print_hierarchy: + print("\n".join(get_config_file_hierarchy())) + return glbl_cfg().idump( options.item, not options.defaults, @@ -129,10 +135,18 @@ def main(parser: COP, options: 'Values', reg: Optional[str] = None) -> None: ) return - workflow, flow_file = parse_reg(reg, src=True) + workflow_id, _, flow_file = parse_id( + *ids, + src=True, + constraint='workflows', + ) + + if options.print_hierarchy: + print("\n".join(get_config_file_hierarchy(workflow_id))) + return config = WorkflowConfig( - workflow, + workflow_id, flow_file, options, get_template_vars(options) diff --git a/cylc/flow/scripts/cylc.py b/cylc/flow/scripts/cylc.py index 036cf4c05a9..d4810258852 100644 --- a/cylc/flow/scripts/cylc.py +++ b/cylc/flow/scripts/cylc.py @@ -19,8 +19,8 @@ import argparse from contextlib import contextmanager import os -import sys from pathlib import Path +import sys from ansimarkup import parse as cparse from colorama import init as color_init @@ -64,22 +64,113 @@ def get_version(long=False): Command Abbreviation: # Commands can be abbreviated as long as there is no ambiguity in # the abbreviated command: - $ cylc trigger WORKFLOW TASK # trigger TASK in WORKFLOW - $ cylc trig WORKFLOW TASK # ditto - $ cylc tr WORKFLOW TASK # ditto - $ cylc t # Error: ambiguous command + $ cylc trigger WORKFLOW//CYCLE/TASK # trigger TASK in WORKFLOW + $ cylc trig WORKFLOW//CYCLE/TASK # ditto + $ cylc tr WORKFLOW//CYCLE/TASK # ditto + $ cylc t # Error: ambiguous command -Task Identification: - Tasks are identified by NAME.CYCLE_POINT where POINT is either a - date-time or an integer. +Cylc IDs: + Cylc IDs take the form: + workflow//cycle/task - Date-time cycle points are in an ISO 8601 date-time format, typically - CCYYMMDDThhmm followed by a time zone - e.g. 20101225T0600Z. + You can split an ID at the // so following two IDs are equivalent: + workflow//cycle1 workflow//cycle2 + workflow// //cycle1 //cycle2 - Integer cycle points (including those for non-cycling workflows) are integers - - just '1' for non-cycling workflows. + IDs can be written as globs: + *// # All workflows + workflow//* # All cycles in "workflow" + workflow//cycle/* # All tasks in "workflow" in "cycle" + + For more information type "cylc help id". """ +ID_HELP = ''' +Workflow IDs: + Every Installed Cylc workflow has an ID. + + For example if we install a workflow like so: + $ cylc install --flow-name=foo + + We will end up with a workflow with the ID "foo/run1". + + This ID can be used to interact with the workflow: + $ cylc play foo/run1 + $ cylc pause foo/run1 + $ cylc stop foo/run1 + + In the case of numbered runs (e.g. "run1", "run2", ...) you can omit + the run number, Cylc will infer latest run. + $ cylc play foo + $ cylc pause foo + $ cylc stop foo + + Workflows can be installed hierarchically: + $ cylc install --flow-name=foo/bar/baz + + # play the workflow with the ID "foo/bar/baz" + $ cylc play foo/bar/baz + + The full format of a workflow ID is: + ~user/workflow-id + + You can omit the user name when working on your own workflows. + +Cycle / Family / Task / Job IDs: + Just as workflows have IDs, the things within workflows have IDs too. + These IDs take the format: + cycle/task_or_family/job + + Examples: + 1 # The cycle point "1" + 1/a # The task "a" in cycle point "1" + 1/a/1 # The first job of the task "a" in the cycle point "1". + +Full ID + We join the workflow and cycle/task/job IDs together using //: + workflow//cycle/task/job + + Examples: + w// # The workflow "w" + w//1 # The cycle "1" in the workflow "w" + w//1/a # The task "a" in the cycle "1" in the workflow "w" + w//1/a/1 # The first job of w//1/a/1 + ~alice/test # The workflow "test" installed under the user + # account "alice" + +Patterns + Patterns can be used in Cylc IDs: + * # Matches everything. + ? # Matches any single character. + [seq] # Matches any character in "seq". + [!seq] # Matches any character not in "seq". + + Examples: + * # All workflows + test* # All workflows starting "test". + test/* # All workflows starting "test/". + workflow//* # All cycles in workflow + workflow//cycle/* # All tasks in workflow//cycle + workflow//cycle/task/* # All jobs in workflow//cycle/job + + Warning: + Remember to write IDs inside single quotes when using them on the + command line otherwise your shell may expand them. + +Filters + Filters allow you to filter for specific states. + + Filters are prefixed by a colon (:). + + Examples: + *:running # All running workflows + workflow//*:running # All running cycles in workflow + workflow//cycle/*:running # All running tasks in workflow//cycle + workflow//cycle/task/*:running # All running jobs in + # workflow//cycle/task +''' + + # because this command is not served from behind cli_function like the # other cylc commands we have to manually patch in colour support USAGE = format_shell_examples(USAGE) @@ -275,6 +366,10 @@ def iter_commands(): yield (cmd, desc, usage) +def print_id_help(): + print(ID_HELP) + + def print_command_list(commands=None, indent=0): """Print list of Cylc commands. @@ -511,6 +606,9 @@ def main(): elif cmd_args == ['all']: print_command_list() sys.exit(0) + elif cmd_args == ['id']: + print_id_help() + sys.exit(0) else: command = cmd_args.pop(0) diff --git a/cylc/flow/scripts/diff.py b/cylc/flow/scripts/diff.py index 4b549760225..72642db690d 100755 --- a/cylc/flow/scripts/diff.py +++ b/cylc/flow/scripts/diff.py @@ -31,9 +31,9 @@ import sys from typing import TYPE_CHECKING +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.config import WorkflowConfig -from cylc.flow.workflow_files import parse_reg from cylc.flow.templatevars import load_template_vars from cylc.flow.terminal import cli_function @@ -117,8 +117,11 @@ def prdict(dct, arrow='<', section='', level=0, diff=False, nested=False): def get_option_parser(): parser = COP( __doc__, jset=True, prep=True, icp=True, - argdoc=[('WORKFLOW1', 'Workflow name or path'), - ('WORKFLOW2', 'Workflow name or path')]) + argdoc=[ + ('WORKFLOW_ID_1', 'Workflow ID or path to source'), + ('WORKFLOW_ID_2', 'Workflow ID or path to source') + ] + ) parser.add_option( "-n", "--nested", @@ -129,32 +132,40 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow1: str, workflow2: str): - workflow1_name, workflow1_fpath = parse_reg(workflow1, src=True) - workflow2_name, workflow2_fpath = parse_reg(workflow2, src=True) - if workflow1_fpath == workflow2_fpath: +def main(parser: COP, options: 'Values', workflow_id1: str, workflow_id2: str): + workflow_id_1, _, workflow_file_1_ = parse_id( + workflow_id1, + src=True, + constraint='workflows', + ) + workflow_id_2, _, workflow_file_2_ = parse_id( + workflow_id2, + src=True, + constraint='workflows', + ) + if workflow_file_1_ == workflow_file_2_: parser.error("You can't diff a single workflow.") - print(f"Parsing {workflow1_name} ({workflow1_fpath})") + print(f"Parsing {workflow_id_1} ({workflow_file_1_})") template_vars = load_template_vars( options.templatevars, options.templatevars_file ) config1 = WorkflowConfig( - workflow1_name, workflow1_fpath, options, template_vars + workflow_id_1, workflow_file_1_, options, template_vars ).cfg - print(f"Parsing {workflow2_name} ({workflow2_fpath})") + print(f"Parsing {workflow_id_2} ({workflow_file_2_})") config2 = WorkflowConfig( - workflow2_name, workflow2_fpath, options, template_vars, + workflow_id_2, workflow_file_2_, options, template_vars, is_reload=True ).cfg if config1 == config2: print( - f"Workflow definitions {workflow1_name} and {workflow2_name} are " + f"Workflow definitions {workflow_id_1} and {workflow_id_2} are " f"identical" ) sys.exit(0) - print(f"Workflow definitions {workflow1_name} and {workflow2_name} differ") + print(f"Workflow definitions {workflow_id_1} and {workflow_id_2} differ") workflow1_only = {} # type: ignore workflow2_only = {} # type: ignore @@ -164,14 +175,14 @@ def main(parser: COP, options: 'Values', workflow1: str, workflow2: str): diffdict(config1, config2, workflow1_only, workflow2_only, diff_1_2) if n_oone > 0: - print(f'\n{n_oone} items only in {workflow1_name} (<)') + print(f'\n{n_oone} items only in {workflow_id_1} (<)') prdict(workflow1_only, '<', nested=options.nested) if n_otwo > 0: - print(f'\n{n_otwo} items only in {workflow2_name} (>)') + print(f'\n{n_otwo} items only in {workflow_id_2} (>)') prdict(workflow2_only, '>', nested=options.nested) if n_diff > 0: - print(f'\n{n_diff} common items differ {workflow1_name}(<) ' - f'{workflow2_name}(>)') + print(f'\n{n_diff} common items differ {workflow_id_1}(<) ' + f'{workflow_id_2}(>)') prdict(diff_1_2, '', diff=True, nested=options.nested) diff --git a/cylc/flow/scripts/dump.py b/cylc/flow/scripts/dump.py index 08622bdcc1e..a83e183b3fc 100755 --- a/cylc/flow/scripts/dump.py +++ b/cylc/flow/scripts/dump.py @@ -22,17 +22,17 @@ For command line monitoring: * `cylc tui` -* `watch cylc dump WORKFLOW` works for small simple workflows +* `watch cylc dump WORKFLOW_ID` works for small simple workflows For more information about a specific task, such as the current state of its prerequisites and outputs, see 'cylc show'. Examples: # Display the state of all running tasks, sorted by cycle point: - $ cylc dump --tasks --sort WORKFLOW | grep running + $ cylc dump --tasks --sort WORKFLOW_ID | grep running # Display the state of all tasks in a particular cycle point: - $ cylc dump -t WORKFLOW | grep 2010082406""" + $ cylc dump -t WORKFLOW_ID | grep 2010082406""" from graphene.utils.str_converters import to_snake_case import json @@ -40,10 +40,10 @@ from typing import TYPE_CHECKING from cylc.flow.exceptions import CylcError +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.network.client_factory import get_client from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -144,7 +144,11 @@ def get_option_parser(): - parser = COP(__doc__, comms=True) + parser = COP( + __doc__, + comms=True, + argdoc=[('WORKFLOW_ID', 'Workflow ID')], + ) parser.add_option( "-g", "--global", help="Global information only.", action="store_const", const="global", dest="disp_form") @@ -171,9 +175,12 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(_, options: 'Values', workflow: str) -> None: - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) +def main(_, options: 'Values', workflow_id: str) -> None: + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) + pclient = get_client(workflow_id, timeout=options.comms_timeout) if options.sort_by_cycle: sort_args = {'keys': ['cyclePoint', 'name']} @@ -217,7 +224,7 @@ def main(_, options: 'Values', workflow: str) -> None: query_kwargs = { 'request_string': query, - 'variables': {'wFlows': [workflow], 'sortBy': sort_args} + 'variables': {'wFlows': [workflow_id], 'sortBy': sort_args} } workflows = pclient('graphql', query_kwargs) @@ -240,7 +247,7 @@ def main(_, options: 'Values', workflow: str) -> None: for node_name in summary['namespaceDefinitionOrder'] if node_name in node_urls } - summary['workflowUrls']['workflow'] = ( + summary['workflowUrls']['workflow_id'] = ( summary['meta']['URL']) del summary['tasks'] del summary['families'] diff --git a/cylc/flow/scripts/ext_trigger.py b/cylc/flow/scripts/ext_trigger.py index 054c485e39b..ca6b500c328 100755 --- a/cylc/flow/scripts/ext_trigger.py +++ b/cylc/flow/scripts/ext_trigger.py @@ -25,9 +25,9 @@ message as a signal that an external prerequisite has been satisfied and trigger the task accordingly. -The ID argument should be unique to each external +The WORKFLOW_ID argument should be unique to each external trigger event. When an incoming message satisfies -a task's external trigger the message ID is broadcast +a task's external trigger the message TRIGGER_ID is broadcast to all downstream tasks in the cycle point as ``$CYLC_EXT_TRIGGER_ID``. Tasks can use ``$CYLC_EXT_TRIGGER_ID``, for example, to @@ -43,10 +43,10 @@ from cylc.flow import LOG from cylc.flow.exceptions import CylcError, ClientError +from cylc.flow.id_cli import parse_id from cylc.flow.network.client_factory import get_client from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -78,10 +78,14 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, - argdoc=[("WORKFLOW", "Workflow name or ID"), - ("MSG", "External trigger message"), - ("ID", "Unique trigger ID")]) + __doc__, + comms=True, + argdoc=[ + ("WORKFLOW_ID", "Workflow ID"), + ("MSG", "External trigger message"), + ("TRIGGER_ID", "Unique trigger ID"), + ], + ) parser.add_option( "--max-tries", help="Maximum number of send attempts " @@ -100,13 +104,18 @@ def get_option_parser(): def main( parser: COP, options: 'Values', - workflow: str, + workflow_id: str, event_msg: str, event_id: str ) -> None: - workflow, _ = parse_reg(workflow) - LOG.info('Send to workflow %s: "%s" (%s)', workflow, event_msg, event_id) - pclient = get_client(workflow, timeout=options.comms_timeout) + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) + LOG.info( + 'Send to workflow %s: "%s" (%s)', workflow_id, event_msg, event_id + ) + pclient = get_client(workflow_id, timeout=options.comms_timeout) max_n_tries = int(options.max_n_tries) retry_intvl_secs = float(options.retry_intvl_secs) @@ -114,7 +123,7 @@ def main( mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], 'eventMsg': event_msg, 'eventId': event_id, } diff --git a/cylc/flow/scripts/get_workflow_contact.py b/cylc/flow/scripts/get_workflow_contact.py index 38568ad59d1..e8e7b306b5e 100755 --- a/cylc/flow/scripts/get_workflow_contact.py +++ b/cylc/flow/scripts/get_workflow_contact.py @@ -23,8 +23,9 @@ from typing import TYPE_CHECKING from cylc.flow.exceptions import CylcError, ServiceFileError +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP -from cylc.flow.workflow_files import load_contact_file, parse_reg +from cylc.flow.workflow_files import load_contact_file from cylc.flow.terminal import cli_function if TYPE_CHECKING: @@ -32,18 +33,21 @@ def get_option_parser(): - return COP(__doc__, argdoc=[('WORKFLOW', 'Workflow name or ID')]) + return COP(__doc__, argdoc=[('WORKFLOW_ID', 'Workflow ID')]) @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str) -> None: +def main(parser: COP, options: 'Values', workflow_id: str) -> None: """CLI for "cylc get-workflow-contact".""" - reg, _ = parse_reg(reg) + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) try: - data = load_contact_file(reg) + data = load_contact_file(workflow_id) except ServiceFileError: raise CylcError( - f"{reg}: cannot get contact info, workflow not running?" + f"{workflow_id}: cannot get contact info, workflow not running?" ) else: for key, value in sorted(data.items()): diff --git a/cylc/flow/scripts/get_workflow_version.py b/cylc/flow/scripts/get_workflow_version.py index 463134ce353..311df8a9e20 100755 --- a/cylc/flow/scripts/get_workflow_version.py +++ b/cylc/flow/scripts/get_workflow_version.py @@ -23,12 +23,13 @@ To find the version you've invoked at the command line see "cylc version". """ +from functools import partial from typing import TYPE_CHECKING from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -47,21 +48,36 @@ def get_option_parser(): - parser = COP(__doc__, comms=True) + parser = COP( + __doc__, + comms=True, + multiworkflow=True, + argdoc=[('WORKFLOW_ID ...', 'Workflow IDs')], + ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str) -> None: - reg, _ = parse_reg(reg) - pclient = get_client(reg, timeout=options.comms_timeout) +async def run(options, workflow_id, *_): + pclient = get_client(workflow_id, timeout=options.comms_timeout) query_kwargs = { 'request_string': QUERY, - 'variables': {'wFlows': [reg]} + 'variables': {'wFlows': [workflow_id]} } - result = pclient('graphql', query_kwargs) + result = await pclient.async_request('graphql', query_kwargs) for workflow in result['workflows']: - print(workflow['cylcVersion']) + return workflow['cylcVersion'] + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', workflow_id: str) -> None: + call_multi( + partial(run, options), + workflow_id, + report=print, + # we need the mixed format for call_multi but don't want any tasks + constraint='mixed', + max_tasks=0, + ) diff --git a/cylc/flow/scripts/graph.py b/cylc/flow/scripts/graph.py index d134f7f2c54..5de48ba5610 100755 --- a/cylc/flow/scripts/graph.py +++ b/cylc/flow/scripts/graph.py @@ -42,41 +42,42 @@ from cylc.flow.config import WorkflowConfig from cylc.flow.exceptions import UserInputError +from cylc.flow.id import Tokens +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.templatevars import get_template_vars from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values -def sort_integer_node(item): +def sort_integer_node(id_): """Return sort tokens for nodes with cyclepoints in integer format. Example: - >>> sort_integer_node('foo.11') + >>> sort_integer_node('11/foo') ('foo', 11) """ - name, point = item.split('.') - return (name, int(point)) + tokens = Tokens(id_, relative=True) + return (tokens['task'], int(tokens['cycle'])) -def sort_integer_edge(item): +def sort_integer_edge(id_): """Return sort tokens for edges with cyclepoints in integer format. Example: - >>> sort_integer_edge(('foo.11', 'foo.12', None)) + >>> sort_integer_edge(('11/foo', '12/foo', None)) (('foo', 11), ('foo', 12)) - >>> sort_integer_edge(('foo.11', None , None)) + >>> sort_integer_edge(('11/foo', None , None)) (('foo', 11), ('', 0)) """ return ( - sort_integer_node(item[0]), - sort_integer_node(item[1]) if item[1] else ('', 0) + sort_integer_node(id_[0]), + sort_integer_node(id_[1]) if id_[1] else ('', 0) ) @@ -138,7 +139,10 @@ def graph_workflow( if show_suicide or not suicide ) for node in sorted(set(nodes), key=node_sort): - write('node "%s" "%s"' % (node, node.replace('.', r'\n'))) + tokens = Tokens(node, relative=True) + write( + f'node "{node}" "{tokens["task"]}\\n{tokens["cycle"]}"' + ) write('stop') @@ -166,27 +170,33 @@ def graph_inheritance(config, write=print): write('stop') -def get_config(workflow: str, opts: 'Values') -> WorkflowConfig: +def get_config(workflow_id: str, opts: 'Values') -> WorkflowConfig: """Return a WorkflowConfig object for the provided reg / path.""" - workflow, flow_file = parse_reg(workflow, src=True) + workflow_id, _, flow_file = parse_id( + workflow_id, + src=True, + constraint='workflows', + ) template_vars = get_template_vars(opts) return WorkflowConfig( - workflow, flow_file, opts, template_vars=template_vars + workflow_id, flow_file, opts, template_vars=template_vars ) def get_option_parser(): """CLI.""" parser = COP( - __doc__, jset=True, prep=True, + __doc__, + jset=True, + prep=True, argdoc=[ - ('[WORKFLOW]', 'Workflow name or path'), + ('[WORKFLOW_ID]', 'Workflow ID or path to source'), ('[START]', 'Graph start; defaults to initial cycle point'), ( '[STOP]', 'Graph stop point or interval; defaults to 3 points from START' ) - ] + ], ) parser.add_option( @@ -285,7 +295,7 @@ def dot(opts, lines): task = match.group(1) cycle = '' else: - task, cycle = match.group(1).split('.') + cycle, task = match.group(1).split('/') nodes.setdefault(cycle, []).append(task) continue match = edge.match(line) @@ -359,7 +369,7 @@ def gui(filename): def main( parser: COP, opts: 'Values', - workflow: str, + workflow_id: str, start: Optional[str] = None, stop: Optional[str] = None ) -> None: @@ -373,7 +383,7 @@ def main( else: write = print - flows: List[Tuple[str, List[str]]] = [(workflow, [])] + flows: List[Tuple[str, List[str]]] = [(workflow_id, [])] if opts.diff: flows.append((opts.diff, [])) diff --git a/cylc/flow/scripts/hold.py b/cylc/flow/scripts/hold.py index b2773fa5443..b4cacef78b5 100755 --- a/cylc/flow/scripts/hold.py +++ b/cylc/flow/scripts/hold.py @@ -22,43 +22,47 @@ Held tasks do not submit their jobs even if ready to run. +To pause an entire workflow use "cylc pause". + Examples: # Hold mytask at cycle point 1234 in my_flow (if it has not yet spawned, it - # will hold as soon as it spawns) - $ cylc hold my_flow mytask.1234 + # will hold as soon as it spawns): + $ cylc hold my_flow//1234/mytask # Hold all active tasks at cycle 1234 in my_flow (note: tasks before/after - # this cycle point will not be held) - $ cylc hold my_flow '*.1234' + # this cycle point will not be held): + $ cylc hold 'my_flow//1234/*' # Hold all active instances of mytask in my_flow (note: this will not hold - # any unspawned tasks that might spawn in the future) - $ cylc hold my_flow 'mytask.*' - # or - $ cylc hold my_flow mytask + # any unspawned tasks that might spawn in the future): + $ cylc hold 'my_flow//*/mytask' + + # Hold all active failed tasks: + $ cylc hold 'my_flow//*:failed' + + # Hold all tasks after cycle point 1234 in my_flow: + $ cylc hold my_flow// --after=1234 - # Hold all active failed tasks - $ cylc hold my_flow '*:failed' + # Hold cycles 1, 2 & 3 in my_flow: + $ cylc hold my_flow// //1 //2 //3 - # Hold all tasks after cycle point 1234 in my_flow - $ cylc hold my_flow --after=1234 + # Hold cycle "1" in "my_flow_1" and "my_flow_2": + $ cylc hold my_flow_1//1 my_flow_2//1 Note: To pause a workflow (immediately preventing all job submission), use 'cylc pause' instead. -Note: globs and ":" selectors will only match active tasks; -to hold future tasks when they spawn, use exact identifiers e.g. "mytask.1234". - See also 'cylc release'. """ +from functools import partial from typing import TYPE_CHECKING from cylc.flow.exceptions import UserInputError from cylc.flow.network.client_factory import get_client from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg +from cylc.flow.network.multi import call_multi if TYPE_CHECKING: from optparse import Values @@ -95,11 +99,11 @@ def get_option_parser() -> COP: parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - # TODO: switch back to TASK_ID? - ('[TASK_GLOB ...]', "Task matching patterns")] + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], ) parser.add_option( @@ -115,35 +119,46 @@ def _validate(options: 'Values', *task_globs: str) -> None: if options.hold_point_string: if task_globs: raise UserInputError( - "Cannot combine --after with TASK_GLOB(s).\n" + "Cannot combine --after with Cylc/Task IDs.\n" "`cylc hold --after` holds all tasks after the given " "cycle point.") elif not task_globs: raise UserInputError( - "Missing arguments: TASK_GLOB [...]. See `cylc hold --help`.") - + "Must define Cycles/Tasks. See `cylc hold --help`.") -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str, *task_globs: str): - _validate(options, *task_globs) +async def run(options, workflow_id, *tokens_list): + _validate(options, *tokens_list) - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) + pclient = get_client(workflow_id, timeout=options.comms_timeout) if options.hold_point_string: mutation = SET_HOLD_POINT_MUTATION args = {'point': options.hold_point_string} else: mutation = HOLD_MUTATION - args = {'tasks': list(task_globs)} + args = { + 'tasks': [ + id_.relative_id + for id_ in tokens_list + ] + } mutation_kwargs = { 'request_string': mutation, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], **args } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids): + call_multi( + partial(run, options), + *ids, + constraint='mixed', + ) diff --git a/cylc/flow/scripts/install.py b/cylc/flow/scripts/install.py index a0083c5e389..87467981d01 100755 --- a/cylc/flow/scripts/install.py +++ b/cylc/flow/scripts/install.py @@ -86,7 +86,7 @@ def get_option_parser(): parser = COP( __doc__, comms=True, prep=True, - argdoc=[('[WORKFLOW_NAME]', 'Workflow name')] + argdoc=[('[WORKFLOW_NAME]', 'Workflow source name')] ) parser.add_option( diff --git a/cylc/flow/scripts/kill.py b/cylc/flow/scripts/kill.py index f054965aaf4..8e888f5cd8b 100755 --- a/cylc/flow/scripts/kill.py +++ b/cylc/flow/scripts/kill.py @@ -21,16 +21,24 @@ Kill running or submitted jobs. Examples: - $ cylc kill WORKFLOW # kill all active tasks in the workflow - $ cylc kill WORKFLOW TASK_GLOB ... # kill one or more active tasks + # kill a specific task in my_flow + $ cylc kill my_flow//1/a + + # kill multiple tasks in my_flow + $ cylc kill myflow// //1/a //1/b //1/c + + # kill all active tasks in the my_flow + $ cylc kill 'my_flow//*' """ +from functools import partial from typing import TYPE_CHECKING +from cylc.flow.id import Tokens from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -53,26 +61,34 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('[TASK_GLOB ...]', 'Task matching patterns')]) + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], + ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str, *task_globs: str): - """CLI of "cylc kill".""" - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str, *tokens_list: Tokens): + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], - 'tasks': list(task_globs), + 'wFlows': [workflow_id], + 'tasks': [tokens.relative_id for tokens in tokens_list], } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids: str): + """CLI of "cylc kill".""" + call_multi( + partial(run, options), + *ids, + ) diff --git a/cylc/flow/scripts/list.py b/cylc/flow/scripts/list.py index 9f064b9c66c..4465626f2c7 100755 --- a/cylc/flow/scripts/list.py +++ b/cylc/flow/scripts/list.py @@ -34,17 +34,23 @@ from typing import TYPE_CHECKING from cylc.flow.config import WorkflowConfig +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.templatevars import get_template_vars from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values def get_option_parser(): - parser = COP(__doc__, jset=True, prep=True, icp=True) + parser = COP( + __doc__, + jset=True, + prep=True, + icp=True, + argdoc=[('WORKFLOW_ID', 'Workflow ID or path to source')], + ) parser.add_option( "-a", "--all-tasks", @@ -90,8 +96,12 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str) -> None: - workflow, flow_file = parse_reg(reg, src=True) +def main(parser: COP, options: 'Values', workflow_id: str) -> None: + workflow_id, _, flow_file = parse_id( + workflow_id, + src=True, + constraint='workflows', + ) template_vars = get_template_vars(options) if options.all_tasks and options.all_namespaces: @@ -128,7 +138,7 @@ def main(parser: COP, options: 'Values', reg: str) -> None: print("WARNING: -t chosen, ignoring non-tree options.", file=sys.stderr) config = WorkflowConfig( - workflow, + workflow_id, flow_file, options, template_vars diff --git a/cylc/flow/scripts/message.py b/cylc/flow/scripts/message.py index 02b899d67c3..12e66a8e473 100755 --- a/cylc/flow/scripts/message.py +++ b/cylc/flow/scripts/message.py @@ -75,12 +75,12 @@ import sys from typing import TYPE_CHECKING +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.task_message import record_messages from cylc.flow.terminal import cli_function from cylc.flow.exceptions import UserInputError from cylc.flow.unicode_rules import TaskMessageValidator -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -88,9 +88,11 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, + __doc__, + comms=True, argdoc=[ - ('[WORKFLOW]', 'Workflow name or ID'), + # TODO + ('[WORKFLOW_ID]', 'Workflow ID'), ('[TASK-JOB]', 'Task job identifier CYCLE/TASK_NAME/SUBMIT_NUM'), ('[[SEVERITY:]MESSAGE ...]', 'Messages')]) parser.add_option( @@ -115,12 +117,15 @@ def main(parser: COP, options: 'Values', *args: str) -> None: # 9.0? # (As of Dec 2020 some functional tests still use the classic # two arg interface) - workflow = os.getenv('CYLC_WORKFLOW_ID') + workflow_id = os.getenv('CYLC_WORKFLOW_ID') task_job = os.getenv('CYLC_TASK_JOB') message_strs = list(args) else: - workflow, task_job, *message_strs = args - workflow, _ = parse_reg(workflow) + workflow_id, task_job, *message_strs = args + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) # Read messages from STDIN if '-' in message_strs: current_message_str = '' @@ -155,4 +160,4 @@ def main(parser: COP, options: 'Values', *args: str) -> None: messages.append([options.severity, message_str.strip()]) else: messages.append([getLevelName(INFO), message_str.strip()]) - record_messages(workflow, task_job, messages) + record_messages(workflow_id, task_job, messages) diff --git a/cylc/flow/scripts/pause.py b/cylc/flow/scripts/pause.py index 00893407d73..baf0ee5c8a0 100644 --- a/cylc/flow/scripts/pause.py +++ b/cylc/flow/scripts/pause.py @@ -23,19 +23,22 @@ This prevents submission of any task jobs. Examples: + # pause my_flow $ cylc pause my_flow -To resume a paused workflow, use 'cylc play'. + # resume my_flow + $ cylc play my_flow Not to be confused with `cylc hold`. """ +from functools import partial from typing import TYPE_CHECKING from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.network.client import WorkflowRuntimeClient +from cylc.flow.network.multi import call_multi from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -56,22 +59,32 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[('WORKFLOW', 'Workflow name or ID')] + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('WORKFLOW_ID [WORKFLOW_ID ...]', 'Workflow ID(s)')], ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str) -> None: - workflow, _ = parse_reg(workflow) - pclient = WorkflowRuntimeClient(workflow, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str) -> None: + pclient = WorkflowRuntimeClient(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids) -> None: + call_multi( + partial(run, options), + *ids, + constraint='workflows', + ) diff --git a/cylc/flow/scripts/ping.py b/cylc/flow/scripts/ping.py index e648b13851c..c7d899aa96d 100755 --- a/cylc/flow/scripts/ping.py +++ b/cylc/flow/scripts/ping.py @@ -21,21 +21,20 @@ Test communication with a running workflow. If workflow WORKFLOW is running or TASK in WORKFLOW is currently running, -exit with success status, else exit with error status.""" +exit with success status, else exit with error status. +""" from ansimarkup import parse as cparse +from functools import partial import sys -from typing import Any, Dict, Optional, TYPE_CHECKING +from typing import Any, Dict, TYPE_CHECKING -from cylc.flow import ID_DELIM -from cylc.flow.exceptions import UserInputError import cylc.flow.flags from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP -from cylc.flow.task_id import TaskID from cylc.flow.task_state import TASK_STATUS_RUNNING from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -64,60 +63,90 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('[TASK]', 'Task ' + TaskID.SYNTAX) - ] + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], ) return parser -@cli_function(get_option_parser) -def main( - parser: COP, +async def run( options: 'Values', - workflow: str, - task_id: Optional[str] = None -) -> None: - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) - - if task_id and not TaskID.is_valid_id(task_id): - raise UserInputError("Invalid task ID: %s" % task_id) - - flow_kwargs = { + workflow_id: str, + *tokens_list, +) -> Dict: + pclient = get_client(workflow_id, timeout=options.comms_timeout) + + ret: Dict[str, Any] = { + 'stdout': [], + 'stderr': [], + 'exit': 0 + } + flow_kwargs: Dict[str, Any] = { 'request_string': FLOW_QUERY, - 'variables': {'wFlows': [workflow]} + 'variables': {'wFlows': [workflow_id]} } task_kwargs: Dict[str, Any] = { 'request_string': TASK_QUERY, } - # cylc ping WORKFLOW - result = pclient('graphql', flow_kwargs) + + # ping called on the workflow + result = await pclient.async_request('graphql', flow_kwargs) msg = "" for flow in result['workflows']: w_name = flow['name'] w_port = flow['port'] w_pub_port = flow['pubPort'] if cylc.flow.flags.verbosity > 0: - sys.stdout.write( + ret['stdout'].append( f'{w_name} running on ' f'{pclient.host}:{w_port} {w_pub_port}\n' ) - # cylc ping WORKFLOW TASKID - if task_id: - task, point = TaskID.split(task_id) - w_id = flow['id'] + + # ping called with task-like objects + for tokens in tokens_list: task_kwargs['variables'] = { - 'tProxy': f'{w_id}{ID_DELIM}{point}{ID_DELIM}{task}' + 'tProxy': tokens.relative_id } - task_result = pclient('graphql', task_kwargs) + task_result = await pclient.async_request('graphql', task_kwargs) + string_id = tokens.relative_id if not task_result.get('taskProxy'): - msg = "task not found" + msg = f"task not found: {string_id}" elif task_result['taskProxy']['state'] != TASK_STATUS_RUNNING: - msg = f"task not {TASK_STATUS_RUNNING}" + msg = f"task not {TASK_STATUS_RUNNING}: {string_id}" if msg: - print(cparse(f'{msg}')) - sys.exit(1) + ret['stderr'].append(cparse(f'{msg}')) + ret['exit'] = 1 + + return ret + + +def report(ret): + for line in ret['stdout']: + print(line) + for line in ret['stderr']: + print(line, file=sys.stderr) + + +@cli_function(get_option_parser) +def main( + parser: COP, + options: 'Values', + *ids, +) -> None: + rets = call_multi( + partial(run, options), + *ids, + report=report, + constraint='mixed', + ) + + if all( + ret['exit'] == 0 + for ret in rets + ): + sys.exit(0) + sys.exit(1) diff --git a/cylc/flow/scripts/poll.py b/cylc/flow/scripts/poll.py index fb5e3a91be3..5a296fa7639 100755 --- a/cylc/flow/scripts/poll.py +++ b/cylc/flow/scripts/poll.py @@ -20,24 +20,26 @@ Poll (query) task jobs to verify and update their statuses. -This checks the job status file and queries the -job runner on the job platform. +This checks the job status file and queries the job runner on the job platform. -Pollable tasks are those in the n=0 window with -an associated job ID, including incomplete finished -tasks. +Pollable tasks are those in the n=0 window with an associated job ID, +including incomplete finished tasks. Examples: - $ cylc poll WORKFLOW # poll all pollable tasks - $ cylc poll WORKFLOW TASK_GLOB # poll multiple pollable tasks or families + # poll all pollable tasks in my_flow + $ cylc poll 'my_flow//*' + + # poll specific tasks in my_flow + $ cylc poll my_flow// //1/a //1/b """ +from functools import partial from typing import TYPE_CHECKING from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -60,25 +62,35 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('[TASK_GLOB ...]', 'Task matching patterns')] + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str, *task_globs: str): - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str, *tokens_list): + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], - 'tasks': list(task_globs), + 'wFlows': [workflow_id], + 'tasks': [ + tokens.relative_id + for tokens in tokens_list + ], } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids): + call_multi( + partial(run, options), + *ids, + ) diff --git a/cylc/flow/scripts/reinstall.py b/cylc/flow/scripts/reinstall.py index e0595072813..5fc2d7c1d54 100644 --- a/cylc/flow/scripts/reinstall.py +++ b/cylc/flow/scripts/reinstall.py @@ -43,11 +43,11 @@ from cylc.flow import iter_entry_points from cylc.flow.exceptions import PluginError, WorkflowFilesError +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.pathutil import get_cylc_run_dir, get_workflow_run_dir from cylc.flow.workflow_files import ( get_workflow_source_dir, - parse_reg, reinstall_workflow, ) from cylc.flow.terminal import cli_function @@ -58,7 +58,7 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, argdoc=[('[WORKFLOW]', 'Workflow name or ID')] + __doc__, comms=True, argdoc=[('[WORKFLOW_ID]', 'Workflow ID')] ) parser.add_cylc_rose_options() @@ -80,11 +80,16 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(parser: COP, opts: 'Values', reg: Optional[str] = None) -> None: +def main( + parser: COP, + opts: 'Values', + args: Optional[str] = None +) -> None: run_dir: Optional[Path] - if reg is None: + workflow_id: str + if args is None: try: - reg = str(Path.cwd().relative_to( + workflow_id = str(Path.cwd().relative_to( Path(get_cylc_run_dir()).resolve() )) except ValueError: @@ -92,15 +97,18 @@ def main(parser: COP, opts: 'Values', reg: Optional[str] = None) -> None: "The current working directory is not a workflow run directory" ) else: - reg, _ = parse_reg(reg, warn_depr=False) - run_dir = Path(get_workflow_run_dir(reg)) + workflow_id, *_ = parse_id( + args, + constraint='workflows', + ) + run_dir = Path(get_workflow_run_dir(workflow_id)) if not run_dir.is_dir(): raise WorkflowFilesError( - f'"{reg}" is not an installed workflow.') + f'"{workflow_id}" is not an installed workflow.') source, source_symlink = get_workflow_source_dir(run_dir) if not source: raise WorkflowFilesError( - f'"{reg}" was not installed with cylc install.') + f'"{workflow_id}" was not installed with cylc install.') if not Path(source).is_dir(): raise WorkflowFilesError( f'Workflow source dir is not accessible: "{source}".\n' @@ -122,7 +130,7 @@ def main(parser: COP, opts: 'Values', reg: Optional[str] = None) -> None: ) from None reinstall_workflow( - named_run=reg, + named_run=workflow_id, rundir=run_dir, source=source, dry_run=False # TODO: ready for dry run implementation diff --git a/cylc/flow/scripts/release.py b/cylc/flow/scripts/release.py index 832836f98f1..5b06734adda 100755 --- a/cylc/flow/scripts/release.py +++ b/cylc/flow/scripts/release.py @@ -22,30 +22,28 @@ Examples: # Release mytask at cycle 1234 in my_flow - $ cylc release my_flow mytask.1234 + $ cylc release my_flow//1234/mytask # Release all active tasks at cycle 1234 in my_flow - $ cylc release my_flow '*.1234' + $ cylc release 'my_flow//1234/*' # Release all active instances of mytask in my_flow - $ cylc release my_flow 'mytask.*' + $ cylc release 'my_flow//*/mytask' # Release all held tasks and remove the hold point $ cylc release my_flow --all Held tasks do not submit their jobs even if ready to run. -Note: globs and ":" selectors will only match active tasks; -to release future tasks, use exact identifiers e.g. "mytask.1234". - See also 'cylc hold'. """ -from cylc.flow.workflow_files import parse_reg +from functools import partial from typing import TYPE_CHECKING from cylc.flow.exceptions import UserInputError from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function @@ -82,10 +80,11 @@ def get_option_parser() -> COP: parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('[TASK_GLOB ...]', "Task matching patterns")] + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], ) parser.add_option( @@ -98,39 +97,50 @@ def get_option_parser() -> COP: return parser -def _validate(options: 'Values', *task_globs: str) -> None: +def _validate(options: 'Values', *tokens_list: str) -> None: """Check combination of options and task globs is valid.""" if options.release_all: - if task_globs: - raise UserInputError("Cannot combine --all with TASK_GLOB(s).") + if tokens_list: + raise UserInputError("Cannot combine --all with Cycle/Task IDs") else: - if not task_globs: + if not tokens_list: raise UserInputError( - "Missing arguments: TASK_GLOB [...]. " - "See `cylc release --help`.") - + "Must define Cycles/Tasks. See `cylc release --help`." + ) -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str, *task_globs: str): - _validate(options, *task_globs) +async def run(options: 'Values', workflow_id, *tokens_list): + _validate(options, *tokens_list) - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) + pclient = get_client(workflow_id, timeout=options.comms_timeout) if options.release_all: mutation = RELEASE_HOLD_POINT_MUTATION - args = {} + args = {'tasks': ['*/*']} else: mutation = RELEASE_MUTATION - args = {'tasks': list(task_globs)} + args = { + 'tasks': [ + tokens.relative_id + for tokens in tokens_list + ] + } mutation_kwargs = { 'request_string': mutation, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], **args } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids): + call_multi( + partial(run, options), + *ids, + constraint='mixed', + ) diff --git a/cylc/flow/scripts/reload.py b/cylc/flow/scripts/reload.py index 6fea302210e..daef2952916 100755 --- a/cylc/flow/scripts/reload.py +++ b/cylc/flow/scripts/reload.py @@ -20,24 +20,40 @@ Reload the configuration of a running workflow. +Example: + # install and run the workflow + $ cylc install + $ cylc play my_flow + + # make changes to the workflow source directory + + # reinstall the workflow + $ cylc reinstall my_flow + + # reload the workflow to pick up changes + $ cylc reload my_flow + + # the workflow is now running with the new config + All settings including task definitions, with the exception of workflow log config, can be changed on reload. Changes to task definitions take effect immediately, unless a task is already running at reload time. If the workflow was started with Jinja2 template variables set on the command -line (cylc play --set 'FOO="bar"' WORKFLOW) the same template settings apply to -the reload (only changes to the flow.cylc file itself are reloaded). +line (cylc play --set 'FOO="bar"' WORKFLOW_ID) the same template settings apply +to the reload (only changes to the flow.cylc file itself are reloaded). If the modified workflow definition does not parse, failure to reload will be reported but no harm will be done to the running workflow.""" +from functools import partial from typing import TYPE_CHECKING from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -57,20 +73,32 @@ def get_option_parser(): - parser = COP(__doc__, comms=True) + parser = COP( + __doc__, + comms=True, + multiworkflow=True, + argdoc=[('WORKFLOW_ID [WORKFLOW_ID ...]', 'Workflow ID(s)')], + ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str) -> None: - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str) -> None: + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], + 'wFlows': [workflow_id], } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids) -> None: + call_multi( + partial(run, options), + *ids, + constraint='workflows', + ) diff --git a/cylc/flow/scripts/remove.py b/cylc/flow/scripts/remove.py index 0671303e402..00057a2bc28 100755 --- a/cylc/flow/scripts/remove.py +++ b/cylc/flow/scripts/remove.py @@ -19,15 +19,15 @@ """cylc remove [OPTIONS] ARGS Remove one or more task instances from a running workflow. - """ +from functools import partial from typing import TYPE_CHECKING from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -50,25 +50,36 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[ - ("WORKFLOW", "Workflow name or ID"), - ('TASK_GLOB [...]', 'Task matching patterns')]) + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], + ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str, *task_globs: str): - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str, *tokens_list): + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], - 'tasks': list(task_globs), + 'wFlows': [workflow_id], + 'tasks': [ + tokens.relative_id + for tokens in tokens_list + ], } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids: str): + call_multi( + partial(run, options), + *ids, + ) diff --git a/cylc/flow/scripts/report_timings.py b/cylc/flow/scripts/report_timings.py index 272e3acfff4..15f01644c15 100755 --- a/cylc/flow/scripts/report_timings.py +++ b/cylc/flow/scripts/report_timings.py @@ -56,11 +56,11 @@ from typing import TYPE_CHECKING from cylc.flow.exceptions import CylcError +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.pathutil import get_workflow_run_pub_db_name from cylc.flow.rundb import CylcWorkflowDAO from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -89,7 +89,7 @@ def smart_open(filename=None): def get_option_parser(): parser = COP( __doc__, - argdoc=[('WORKFLOW', 'Workflow name or ID')] + argdoc=[('WORKFLOW_ID', 'Workflow ID')] ) parser.add_option( "-r", "--raw", @@ -115,8 +115,11 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str) -> None: - workflow, _ = parse_reg(workflow) +def main(parser: COP, options: 'Values', workflow_id: str) -> None: + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) output_options = [ options.show_raw, options.show_summary, options.html_summary @@ -127,7 +130,7 @@ def main(parser: COP, options: 'Values', workflow: str) -> None: # No output specified - choose summary by default options.show_summary = True - run_db = _get_dao(workflow) + run_db = _get_dao(workflow_id) row_buf = format_rows(*run_db.select_task_times()) with smart_open(options.output_filename) as output: if options.show_raw: diff --git a/cylc/flow/scripts/set_outputs.py b/cylc/flow/scripts/set_outputs.py index 0272b120223..26dd98dffe0 100755 --- a/cylc/flow/scripts/set_outputs.py +++ b/cylc/flow/scripts/set_outputs.py @@ -27,32 +27,33 @@ If a flow number is given, the child tasks will start (or continue) that flow, otherwise no reflow will occur. -For example, for the following dependency graph: - +Examples: + # For example, for the following dependency graph: R1 = ''' a => b & c => d foo:x => bar => baz ''' -$ cylc set-outputs a.1 - will spawn b.1 and c.1, but d.1 will not subsequently run + # spawn 1/b and 1/c, but 1/d will not subsequently run + $ cylc set-outputs my_flow//1/a -$ cylc set-outputs --flow=2 a.1 - will spawn b.1 and c.1 as flow 2, followed by d.1 + # spawn 1/b and 1/c as flow 2, followed by 1/d + $ cylc set-outputs --flow=2 my_flow//1/a -$ cylc set-outputs --flow=3 --output=x foo.1 - will spawn bar.1 as flow 3, followed by baz.1 + # spawn 1/bar as flow 3, followed by 1/baz + $ cylc set-outputs --flow=3 --output=x my_flow//1/foo Use --output multiple times to spawn off of several outputs at once. """ +from functools import partial from optparse import Values from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg MUTATION = ''' mutation ( @@ -75,10 +76,12 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, multitask_nocycles=True, - argdoc=[ - ("WORKFLOW", "Workflow name or ID"), - ('TASK-GLOB [...]', 'Task match pattern')]) + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], + ) parser.add_option( "-o", "--output", metavar="OUTPUT", @@ -93,19 +96,28 @@ def get_option_parser(): return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str, *task_globs: str) -> None: - reg, _ = parse_reg(reg) - pclient = get_client(reg, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str, *tokens_list) -> None: + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [reg], - 'tasks': list(task_globs), + 'wFlows': [workflow_id], + 'tasks': [ + tokens.relative_id + for tokens in tokens_list + ], 'outputs': options.outputs, 'flowNum': options.flow_num } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids) -> None: + call_multi( + partial(run, options), + *ids, + ) diff --git a/cylc/flow/scripts/set_verbosity.py b/cylc/flow/scripts/set_verbosity.py index a674c0682b7..c52e8f1e53d 100755 --- a/cylc/flow/scripts/set_verbosity.py +++ b/cylc/flow/scripts/set_verbosity.py @@ -25,13 +25,15 @@ logged. """ +from functools import partial from optparse import Values from cylc.flow import LOG_LEVELS +from cylc.flow.exceptions import UserInputError from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg MUTATION = ''' mutation ( @@ -50,32 +52,40 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, + __doc__, + comms=True, + multiworkflow=True, argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('LEVEL', ', '.join(LOG_LEVELS.keys())) + ('LEVEL', ', '.join(LOG_LEVELS.keys())), + ('WORKFLOW_ID [WORKFLOW_ID ...]', 'Workflow ID(s)'), ] ) return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str, severity_str: str) -> None: - try: - severity = LOG_LEVELS[severity_str] - except KeyError: - parser.error("Illegal logging level, %s" % severity_str) - - reg, _ = parse_reg(reg) - pclient = get_client(reg, timeout=options.comms_timeout) +async def run(options: 'Values', severity, workflow_id) -> None: + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [reg], + 'wFlows': [workflow_id], 'level': severity, } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', severity_str: str, *ids) -> None: + try: + severity = LOG_LEVELS[severity_str] + except KeyError: + raise UserInputError("Illegal logging level, %s" % severity_str) + call_multi( + partial(run, options, severity), + *ids, + constraint='workflows', + ) diff --git a/cylc/flow/scripts/show.py b/cylc/flow/scripts/show.py index d17f74f46d8..60a0ee6ccdf 100755 --- a/cylc/flow/scripts/show.py +++ b/cylc/flow/scripts/show.py @@ -21,9 +21,14 @@ Display workflow and task information. Query a running workflow for: - $ cylc show WORKFLOW # workflow metadata - $ cylc show WORKFLOW TASK_NAME # task metadata - $ cylc show WORKFLOW TASK_GLOB # prerequisites and outputs of task instances + # view workflow metadata + $ cylc show my_workflow + + # view task metadata + $ cylc show my_workflow --task-def my_task + + # view prerequisites & outputs for a live task + $ cylc show my_workflow//1/my_task Prerequisite and output status is indicated for current active tasks. """ @@ -31,15 +36,16 @@ import json from optparse import Values import sys +from typing import Dict from ansimarkup import ansiprint -from cylc.flow import ID_DELIM +from cylc.flow.exceptions import UserInputError +from cylc.flow.id import Tokens +from cylc.flow.id_cli import parse_ids from cylc.flow.network.client_factory import get_client from cylc.flow.option_parsers import CylcOptionParser as COP -from cylc.flow.task_id import TaskID from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg WORKFLOW_META_QUERY = ''' @@ -72,6 +78,7 @@ TASK_PREREQS_QUERY = ''' query ($wFlows: [ID]!, $taskIds: [ID]) { taskProxies (workflows: $wFlows, ids: $taskIds, stripNull: false) { + id name cyclePoint task { @@ -141,177 +148,232 @@ def flatten_data(data, flat_data=None): def get_option_parser(): parser = COP( - __doc__, comms=True, multitask=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('[TASK_NAME or TASK_GLOB ...]', 'Task names or match patterns')]) + __doc__, + comms=True, + multitask=True, + argdoc=[('ID [ID ...]', 'Workflow/Cycle/Family/Task ID(s)')], + ) - parser.add_option('--list-prereqs', action="store_true", default=False, - help="Print a task's pre-requisites as a list.") + parser.add_option( + '--list-prereqs', + action="store_true", + default=False, + help="Print a task's pre-requisites as a list.", + ) - parser.add_option('--json', action="store_true", default=False, - help="Print output in JSON format.") + parser.add_option( + '--json', + action="store_true", + default=False, + help="Print output in JSON format.", + ) + + parser.add_option( + '--task-def', + action="append", + default=None, + dest='task_defs', + metavar='TASK_NAME', + help="View metadata for a task definition (can be used multiple times)" + ) return parser -@cli_function(get_option_parser) -def main(_, options: 'Values', reg: str, *task_args: str) -> None: - """Implement "cylc show" CLI.""" - reg, _ = parse_reg(reg) - pclient = get_client(reg, timeout=options.comms_timeout) - json_filter = {} - - if not task_args: - query = WORKFLOW_META_QUERY - query_kwargs = { - 'request_string': query, - 'variables': {'wFlows': [reg]} - } - # Print workflow info. - results = pclient('graphql', query_kwargs) - for reg in results['workflows']: - flat_data = flatten_data(reg) - if options.json: - json_filter.update(flat_data) - else: - for key, value in sorted(flat_data.items(), reverse=True): - ansiprint( - f'{key}: {value or "(not given)"}') +def workflow_meta_query(workflow_id, pclient, options, json_filter): + query = WORKFLOW_META_QUERY + query_kwargs = { + 'request_string': query, + 'variables': {'wFlows': [workflow_id]} + } + # Print workflow info. + results = pclient('graphql', query_kwargs) + for workflow_id in results['workflows']: + flat_data = flatten_data(workflow_id) + if options.json: + json_filter.update(flat_data) + else: + for key, value in sorted(flat_data.items(), reverse=True): + ansiprint( + f'{key}: {value or "(not given)"}' + ) + return 0 - task_names = [arg for arg in task_args if TaskID.is_valid_name(arg)] - task_ids = [arg for arg in task_args if TaskID.is_valid_id_2(arg)] - if task_names: - tasks_query = TASK_META_QUERY - tasks_kwargs = { - 'request_string': tasks_query, - 'variables': {'wFlows': [reg], 'taskIds': task_names} +def prereqs_and_outputs_query( + workflow_id, + tokens_list, + pclient, + options, + json_filter, +): + ids_list = [ + # convert the tokens into standardised IDs + tokens.relative_id + for tokens in tokens_list + ] + + tp_query = TASK_PREREQS_QUERY + tp_kwargs = { + 'request_string': tp_query, + 'variables': { + 'wFlows': [workflow_id], + 'taskIds': ids_list, } - # Print workflow info. - results = pclient('graphql', tasks_kwargs) - multi = len(results['tasks']) > 1 - for task in results['tasks']: - flat_data = flatten_data(task['meta']) - if options.json: - json_filter.update({task['name']: flat_data}) + } + results = pclient('graphql', tp_kwargs) + multi = len(results['taskProxies']) > 1 + for t_proxy in results['taskProxies']: + task_id = Tokens(t_proxy['id']).relative_id + if options.json: + json_filter.update({task_id: t_proxy}) + else: + if multi: + ansiprint(f'------\nTask ID: {task_id}') + prereqs = [] + for item in t_proxy['prerequisites']: + prefix = '' + multi_cond = len(item['conditions']) > 1 + if multi_cond: + prereqs.append([ + True, + '', + item['expression'].replace('c', ''), + item['satisfied'] + ]) + for cond in item['conditions']: + if multi_cond and not options.list_prereqs: + prefix = f'\t{cond["exprAlias"].strip("c")} = ' + prereqs.append([ + False, + prefix, + f'{cond["taskId"]} {cond["reqState"]}', + cond['satisfied'] + ]) + if options.list_prereqs: + for composite, _, msg, _ in prereqs: + if not composite: + print(msg) else: - if multi: - print(f'----\nTASK NAME: {task["name"]}') - for key, value in sorted(flat_data.items(), reverse=True): + flat_meta = flatten_data(t_proxy['task']['meta']) + for key, value in sorted(flat_meta.items(), reverse=True): ansiprint( - f'{key}: {value or "(not given)"}') - - if task_ids: - tp_query = TASK_PREREQS_QUERY - tp_kwargs = { - 'request_string': tp_query, - 'variables': { - 'wFlows': [reg], - 'taskIds': [ - f'{c}{ID_DELIM}{n}' - for n, c in [ - TaskID.split(t_id) - for t_id in task_ids - if TaskID.is_valid_id(t_id) - ] - ] + [ - f'{c}{ID_DELIM}{n}' - for c, n in [ - t_id.rsplit(TaskID.DELIM2, 1) - for t_id in task_ids - if not TaskID.is_valid_id(t_id) - ] - ] - } - } - results = pclient('graphql', tp_kwargs) - multi = len(results['taskProxies']) > 1 - for t_proxy in results['taskProxies']: - task_id = TaskID.get(t_proxy['name'], t_proxy['cyclePoint']) - if options.json: - json_filter.update({task_id: t_proxy}) - else: - if multi: - print(f'----\nTASK ID: {task_id}') - prereqs = [] - for item in t_proxy['prerequisites']: - prefix = '' - multi_cond = len(item['conditions']) > 1 - if multi_cond: - prereqs.append([ - True, - '', - item['expression'].replace('c', ''), - item['satisfied'] - ]) - for cond in item['conditions']: - if multi_cond and not options.list_prereqs: - prefix = f'\t{cond["exprAlias"].strip("c")} = ' - _, _, point, name = cond['taskId'].split(ID_DELIM) - cond_id = TaskID.get(name, point) - prereqs.append([ - False, - prefix, - f'{cond_id} {cond["reqState"]}', - cond['satisfied'] - ]) - if options.list_prereqs: - for composite, _, msg, _ in prereqs: - if not composite: - print(msg) - else: - flat_meta = flatten_data(t_proxy['task']['meta']) - for key, value in sorted(flat_meta.items(), reverse=True): - ansiprint( - f'{key}:' - f' {value or "(not given)"}') + f'{key}:' + f' {value or "(not given)"}') + ansiprint( + '\nprerequisites' + ' (- => not satisfied):') + if not prereqs: + print(' (None)') + for _, prefix, msg, state in prereqs: + print_msg_state(f'{prefix}{msg}', state) + + ansiprint( + '\noutputs' + ' (- => not completed):') + if not t_proxy['outputs']: + print(' (None)') + for output in t_proxy['outputs']: + info = f'{task_id} {output["label"]}' + print_msg_state(info, output['satisfied']) + if ( + t_proxy['clockTrigger']['timeString'] + or t_proxy['externalTriggers'] + or t_proxy['xtriggers'] + ): ansiprint( - '\nprerequisites' + '\nother' ' (- => not satisfied):') - if not prereqs: - print(' (None)') - for _, prefix, msg, state in prereqs: - print_msg_state(f'{prefix}{msg}', state) + if t_proxy['clockTrigger']['timeString']: + state = t_proxy['clockTrigger']['satisfied'] + time_str = t_proxy['clockTrigger']['timeString'] + print_msg_state( + 'Clock trigger time reached', + state) + print(f' o Triggers at ... {time_str}') + for ext_trig in t_proxy['externalTriggers']: + state = ext_trig['satisfied'] + print_msg_state( + f'{ext_trig["label"]} ... {state}', + state) + for xtrig in t_proxy['xtriggers']: + state = xtrig['satisfied'] + print_msg_state( + f'xtrigger "{xtrig["label"]} = {xtrig["id"]}"', + state) + if not results['taskProxies']: + ansiprint( + f"No matching tasks found: {', '.join(ids_list)}", + file=sys.stderr) + return 1 + return 0 - ansiprint( - '\noutputs' - ' (- => not completed):') - if not t_proxy['outputs']: - print(' (None)') - for output in t_proxy['outputs']: - info = f'{task_id} {output["label"]}' - print_msg_state(info, output['satisfied']) - if ( - t_proxy['clockTrigger']['timeString'] - or t_proxy['externalTriggers'] - or t_proxy['xtriggers'] - ): - ansiprint( - '\nother' - ' (- => not satisfied):') - if t_proxy['clockTrigger']['timeString']: - state = t_proxy['clockTrigger']['satisfied'] - time_str = t_proxy['clockTrigger']['timeString'] - print_msg_state( - 'Clock trigger time reached', - state) - print(f' o Triggers at ... {time_str}') - for ext_trig in t_proxy['externalTriggers']: - state = ext_trig['satisfied'] - print_msg_state( - f'{ext_trig["label"]} ... {state}', - state) - for xtrig in t_proxy['xtriggers']: - state = xtrig['satisfied'] - print_msg_state( - f'xtrigger "{xtrig["label"]} = {xtrig["id"]}"', - state) - if not results['taskProxies']: - ansiprint( - f"No matching tasks found: {task_ids}", - file=sys.stderr) - sys.exit(1) + +def task_meta_query(workflow_id, task_names, pclient, options, json_filter): + tasks_query = TASK_META_QUERY + tasks_kwargs = { + 'request_string': tasks_query, + 'variables': { + 'wFlows': [workflow_id], + 'taskIds': task_names, + }, + } + # Print workflow info. + results = pclient('graphql', tasks_kwargs) + multi = len(results['tasks']) > 1 + for task in results['tasks']: + flat_data = flatten_data(task['meta']) + if options.json: + json_filter.update({task['name']: flat_data}) + else: + if multi: + print(f'----\nTASK NAME: {task["name"]}') + for key, value in sorted(flat_data.items(), reverse=True): + ansiprint( + f'{key}: {value or "(not given)"}') + return 0 + + +@cli_function(get_option_parser) +def main(_, options: 'Values', *ids) -> None: + """Implement "cylc show" CLI.""" + workflow_args, _ = parse_ids( + *ids, + constraint='mixed', + max_workflows=1, + ) + workflow_id = list(workflow_args)[0] + tokens_list = workflow_args[workflow_id] + + if tokens_list and options.task_defs: + raise UserInputError( + 'Cannot query both live tasks and task definitions.' + ) + + pclient = get_client(workflow_id, timeout=options.comms_timeout) + json_filter: 'Dict' = {} + + ret = 0 + if options.task_defs: + ret = task_meta_query( + workflow_id, + options.task_defs, + pclient, + options, + json_filter, + ) + elif not tokens_list: + ret = workflow_meta_query(workflow_id, pclient, options, json_filter) + else: + ret = prereqs_and_outputs_query( + workflow_id, + tokens_list, + pclient, + options, + json_filter, + ) if options.json: print(json.dumps(json_filter, indent=4)) + + sys.exit(ret) diff --git a/cylc/flow/scripts/stop.py b/cylc/flow/scripts/stop.py index b53229e6559..cb61ca60bfc 100755 --- a/cylc/flow/scripts/stop.py +++ b/cylc/flow/scripts/stop.py @@ -20,6 +20,25 @@ Tell a workflow to shut down. +Examples: + # wait for active tasks to finish, then shut down + $ cylc stop my_flow + + # kill active tasks, then shut down + $ cylc stop my_flow --kill + + # shut down immediately, leave active tasks alone + $ cylc stop my_flow --now + + # shut down all workflows + $ cylc stop '*' + + # shut down after the cycle 1234 has been passed + $ cylc stop my_flow//1234 + + # shut down after the task foo in cycle 1234 has succeeded + $ cylc stop my_flow//1234/foo + By default stopping workflows wait for submitted and running tasks to complete before shutting down. You can change this behaviour with the "mode" option. @@ -42,17 +61,22 @@ This command exits immediately unless --max-polls is greater than zero, in which case it polls to wait for workflow shutdown.""" +from functools import partial import sys -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING from cylc.flow.command_polling import Poller -from cylc.flow.exceptions import ClientError, ClientTimeout, CylcError +from cylc.flow.exceptions import ( + ClientError, + ClientTimeout, + CylcError, + UserInputError, +) from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.network.schema import WorkflowStopMode from cylc.flow.option_parsers import CylcOptionParser as COP -from cylc.flow.task_id import TaskID from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -100,10 +124,10 @@ def __init__(self, pclient, condition, interval, max_polls): 'variables': {'wFlows': [self.pclient.workflow]} } - def check(self): + async def check(self): """Return True if workflow has stopped (success) else False""" try: - self.pclient('graphql', self.query) + await self.pclient.async_request('graphql', self.query) except (ClientError, ClientTimeout, CylcError): # failed to ping - workflow stopped or (CylcError) restarted on # another host:port (in which case it must have stopped first). @@ -115,9 +139,12 @@ def check(self): def get_option_parser(): parser = COP( - __doc__, comms=True, - argdoc=[("WORKFLOW", "Workflow name or ID"), - ("[STOP]", "task POINT (cycle point), or TASK (task ID).")] + __doc__, + comms=True, + multiworkflow=True, + argdoc=[ + ('ID [ID ...]', 'Workflow/Cycle/Task ID(s)'), + ], ) parser.add_option( @@ -151,40 +178,55 @@ def get_option_parser(): return parser -@cli_function(get_option_parser) -def main( - parser: COP, +async def run( options: 'Values', - reg: str, - shutdown_arg: Optional[str] = None -) -> None: - if shutdown_arg is not None and options.kill: - parser.error("ERROR: --kill is not compatible with [STOP]") + workflow_id, + *tokens_list, +) -> int: + if len(tokens_list) > 1: + raise Exception('Multiple TODO') + + # parse the stop-task or stop-cycle if provided + stop_task = stop_cycle = None + if tokens_list: + tokens = tokens_list[0] + if tokens['task']: + stop_task = tokens.relative_id + elif tokens['cycle']: + stop_cycle = tokens['cycle'] + + # handle orthogonal options + if stop_task is not None and options.kill: + raise UserInputError("--kill is not compatible with stop-task") + + if stop_cycle is not None and options.kill: + raise UserInputError("--kill is not compatible with stop-cycle") + + if stop_task and stop_cycle: + raise UserInputError('stop-task is not compatible with stop-cycle') if options.kill and options.now: - parser.error("ERROR: --kill is not compatible with --now") + raise UserInputError("--kill is not compatible with --now") if options.flow_num and int(options.max_polls) > 0: - parser.error("ERROR: --flow is not compatible with --max-polls") + raise UserInputError("--flow is not compatible with --max-polls") - reg, _ = parse_reg(reg) - pclient = get_client(reg, timeout=options.comms_timeout) + pclient = get_client(workflow_id, timeout=options.comms_timeout) if int(options.max_polls) > 0: # (test to avoid the "nothing to do" warning for # --max-polls=0) + spoller = StopPoller( - pclient, "workflow stopped", options.interval, options.max_polls) + pclient, + "workflow stopped", + options.interval, + options.max_polls, + ) # mode defaults to 'Clean' mode = None - task = None - cycle_point = None - if shutdown_arg is not None and TaskID.is_valid_id(shutdown_arg): - # STOP argument detected - task = shutdown_arg - elif shutdown_arg is not None: - # not a task ID, may be a cycle point - cycle_point = shutdown_arg + if stop_task or stop_cycle: + pass elif options.kill: mode = WorkflowStopMode.Kill.name elif options.now > 1: @@ -195,17 +237,37 @@ def main( mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [reg], + 'wFlows': [workflow_id], 'stopMode': mode, - 'cyclePoint': cycle_point, + 'cyclePoint': stop_cycle, 'clockTime': options.wall_clock, - 'task': task, + 'task': stop_task, 'flowNum': options.flow_num } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) - if int(options.max_polls) > 0 and not spoller.poll(): + if int(options.max_polls) > 0 and not await spoller.poll(): # (test to avoid the "nothing to do" warning for # --max-polls=0) - sys.exit(1) + return 1 + return 0 + + +@cli_function(get_option_parser) +def main( + parser: COP, + options: 'Values', + *ids, +) -> None: + rets = call_multi( + partial(run, options), + *ids, + constraint='mixed', + ) + if all( + ret == 0 + for ret in rets + ): + sys.exit(0) + sys.exit(1) diff --git a/cylc/flow/scripts/subscribe.py b/cylc/flow/scripts/subscribe.py index 674e79d7a8c..b0f39c769ac 100755 --- a/cylc/flow/scripts/subscribe.py +++ b/cylc/flow/scripts/subscribe.py @@ -82,12 +82,12 @@ def get_option_parser(): @cli_function(get_option_parser) def main(_, options, *args): - workflow = args[0] + workflow_id = args[0] try: while True: try: - host, _, port = get_location(workflow) + host, _, port = get_location(workflow_id) except (ClientError, IOError, TypeError, ValueError) as exc: print(exc) time.sleep(3) @@ -103,7 +103,7 @@ def main(_, options, *args): topic_set.add(topic.encode('utf-8')) subscriber = WorkflowSubscriber( - workflow, + workflow_id, host=host, port=port, topics=topic_set diff --git a/cylc/flow/scripts/trigger.py b/cylc/flow/scripts/trigger.py index 6d10bcea984..65df1d16b82 100755 --- a/cylc/flow/scripts/trigger.py +++ b/cylc/flow/scripts/trigger.py @@ -20,23 +20,30 @@ Manually trigger tasks. Examples: - $ cylc trigger WORKFLOW # trigger all tasks in a running workflow - # trigger some tasks in a running workflow: - $ cylc trigger WORKFLOW TASK_GLOB ... + # trigger task foo in cycle 1234 in my_flow + $ cylc trigger my_flow//1234/foo -NOTE waiting tasks that are queue-limited will be queued if triggered, to + # trigger all failed tasks in my_flow + $ cylc trigger 'my_flow//*:failed' + + # start a new "flow" by triggering 1234/foo + $ cylc trigger --reflow my_flow//1234/foo + +Note: waiting tasks that are queue-limited will be queued if triggered, to submit as normal when released by the queue; queued tasks will submit immediately if triggered, even if that violates the queue limit (so you may need to trigger a queue-limited task twice to get it to submit immediately). """ +from functools import partial from typing import TYPE_CHECKING +from cylc.flow.exceptions import UserInputError from cylc.flow.network.client_factory import get_client +from cylc.flow.network.multi import call_multi from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -63,10 +70,12 @@ def get_option_parser(): parser = COP( - __doc__, comms=True, multitask_nocycles=True, - argdoc=[ - ('WORKFLOW', 'Workflow name or ID'), - ('[TASK_GLOB ...]', 'Task matching patterns')]) + __doc__, + comms=True, + multitask=True, + multiworkflow=True, + argdoc=[('ID [ID ...]', 'Cycle/Family/Task ID(s)')], + ) parser.add_option( "--reflow", action="store_true", @@ -83,22 +92,31 @@ def get_option_parser(): return parser -@cli_function(get_option_parser) -def main(parser: COP, options: 'Values', workflow: str, *task_globs: str): - """CLI for "cylc trigger".""" - if options.flow_descr and not options.reflow: - parser.error("--meta requires --reflow") - workflow, _ = parse_reg(workflow) - pclient = get_client(workflow, timeout=options.comms_timeout) +async def run(options: 'Values', workflow_id: str, *tokens_list): + pclient = get_client(workflow_id, timeout=options.comms_timeout) mutation_kwargs = { 'request_string': MUTATION, 'variables': { - 'wFlows': [workflow], - 'tasks': list(task_globs), + 'wFlows': [workflow_id], + 'tasks': [ + tokens.relative_id + for tokens in tokens_list + ], 'reflow': options.reflow, 'flowDescr': options.flow_descr, } } - pclient('graphql', mutation_kwargs) + await pclient.async_request('graphql', mutation_kwargs) + + +@cli_function(get_option_parser) +def main(parser: COP, options: 'Values', *ids: str): + """CLI for "cylc trigger".""" + if options.flow_descr and not options.reflow: + raise UserInputError("--meta requires --reflow") + call_multi( + partial(run, options), + *ids, + ) diff --git a/cylc/flow/scripts/tui.py b/cylc/flow/scripts/tui.py index 09263198a7c..6b2c3e5fa4c 100644 --- a/cylc/flow/scripts/tui.py +++ b/cylc/flow/scripts/tui.py @@ -32,6 +32,7 @@ from typing import TYPE_CHECKING from urwid import html_fragment +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.terminal import cli_function from cylc.flow.tui import TUI @@ -40,7 +41,6 @@ TREE_EXPAND_DEPTH # ^ a nasty solution ) -from cylc.flow.workflow_files import parse_reg if TYPE_CHECKING: from optparse import Values @@ -53,7 +53,7 @@ def get_option_parser(): parser = COP( __doc__, argdoc=[ - ('WORKFLOW', 'Workflow name or ID') + ('WORKFLOW_ID', 'Workflow ID') ], # auto_add=False, NOTE: at present auto_add can not be turned off color=False @@ -84,8 +84,11 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(_, options: 'Values', reg: str) -> None: - reg, _ = parse_reg(reg) +def main(_, options: 'Values', workflow_id: str) -> None: + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) screen = None if options.display == 'html': TREE_EXPAND_DEPTH[0] = -1 # expand tree fully @@ -98,7 +101,7 @@ def main(_, options: 'Values', reg: str) -> None: ) try: - TuiApp(reg, screen=screen).main() + TuiApp(workflow_id, screen=screen).main() if options.display == 'html': for fragment in html_fragment.screenshot_collect(): diff --git a/cylc/flow/scripts/validate.py b/cylc/flow/scripts/validate.py index 53a9b824f87..0f04811fc8f 100755 --- a/cylc/flow/scripts/validate.py +++ b/cylc/flow/scripts/validate.py @@ -37,6 +37,7 @@ TriggerExpressionError ) import cylc.flow.flags +from cylc.flow.id_cli import parse_id from cylc.flow.loggingutil import disable_timestamps from cylc.flow.option_parsers import ( CylcOptionParser as COP, @@ -46,11 +47,16 @@ from cylc.flow.task_proxy import TaskProxy from cylc.flow.templatevars import get_template_vars from cylc.flow.terminal import cli_function -from cylc.flow.workflow_files import parse_reg def get_option_parser(): - parser = COP(__doc__, jset=True, prep=True, icp=True) + parser = COP( + __doc__, + jset=True, + prep=True, + icp=True, + argdoc=[('WORKFLOW_ID', 'Workflow ID or path to source')], + ) parser.add_option( "--check-circular", @@ -93,7 +99,7 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str) -> None: +def main(parser: COP, options: 'Values', workflow_id: str) -> None: """cylc validate CLI.""" profiler = Profiler(None, options.profile_mode) profiler.start() @@ -101,9 +107,13 @@ def main(parser: COP, options: 'Values', reg: str) -> None: if cylc.flow.flags.verbosity < 2: disable_timestamps(LOG) - workflow, flow_file = parse_reg(reg, src=True) + workflow_id, _, flow_file = parse_id( + workflow_id, + src=True, + constraint='workflows', + ) cfg = WorkflowConfig( - workflow, + workflow_id, flow_file, options, get_template_vars(options), diff --git a/cylc/flow/scripts/view.py b/cylc/flow/scripts/view.py index 13967050f78..8011ac93a42 100755 --- a/cylc/flow/scripts/view.py +++ b/cylc/flow/scripts/view.py @@ -41,9 +41,9 @@ from cylc.flow.cfgspec.glbl_cfg import glbl_cfg from cylc.flow.exceptions import CylcError +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.parsec.fileparse import read_and_proc -from cylc.flow.workflow_files import parse_reg from cylc.flow.templatevars import load_template_vars from cylc.flow.terminal import cli_function @@ -52,7 +52,12 @@ def get_option_parser(): - parser = COP(__doc__, jset=True, prep=True) + parser = COP( + __doc__, + jset=True, + prep=True, + argdoc=[('WORKFLOW_ID', 'Workflow ID or path to source')], + ) parser.add_option( "--inline", "-i", help="Inline include-files.", action="store_true", @@ -112,8 +117,12 @@ def get_option_parser(): @cli_function(get_option_parser) -def main(parser: COP, options: 'Values', reg: str) -> None: - workflow, flow_file = parse_reg(reg, src=True) +def main(parser: COP, options: 'Values', workflow_id: str) -> None: + workflow_id, _, flow_file = parse_id( + workflow_id, + src=True, + constraint='workflows', + ) if options.geditor: editor = glbl_cfg().get(['editors', 'gui']) @@ -143,7 +152,7 @@ def main(parser: COP, options: 'Values', reg: str) -> None: # write to a temporary file viewfile = NamedTemporaryFile( - suffix=".flow.cylc", prefix=workflow.replace('/', '_') + '.', + suffix=".flow.cylc", prefix=workflow_id.replace('/', '_') + '.', ) for line in lines: viewfile.write((line + '\n').encode()) diff --git a/cylc/flow/scripts/workflow_state.py b/cylc/flow/scripts/workflow_state.py index ddabdab793f..e1e499c1c33 100755 --- a/cylc/flow/scripts/workflow_state.py +++ b/cylc/flow/scripts/workflow_state.py @@ -35,20 +35,21 @@ mirrored workflow databases, use --run-dir=DIR to specify the location. Examples: - $ cylc workflow-state WORKFLOW --task=TASK --point=POINT --status=STATUS + $ cylc workflow-state WORKFLOW_ID --task=TASK --point=POINT --status=STATUS # returns 0 if TASK.POINT reaches STATUS before the maximum number of # polls, otherwise returns 1. - $ cylc workflow-state WORKFLOW --task=TASK --point=POINT --status=STATUS \ + $ cylc workflow-state WORKFLOW_ID --task=TASK --point=POINT --status=STATUS \ > --offset=PT6H # adds 6 hours to the value of CYCLE for carrying out the polling operation. - $ cylc workflow-state WORKFLOW --task=TASK --status=STATUS --task-point + $ cylc workflow-state WORKFLOW_ID --task=TASK --status=STATUS --task-point # uses CYLC_TASK_CYCLE_POINT environment variable as the value for the # CYCLE to poll. This is useful when you want to use cylc workflow-state in a # cylc task. """ +import asyncio import os import sqlite3 import sys @@ -57,6 +58,7 @@ from cylc.flow.exceptions import CylcError, UserInputError import cylc.flow.flags +from cylc.flow.id_cli import parse_id from cylc.flow.option_parsers import CylcOptionParser as COP from cylc.flow.dbstatecheck import CylcWorkflowDBChecker from cylc.flow.command_polling import Poller @@ -64,7 +66,6 @@ from cylc.flow.terminal import cli_function from cylc.flow.cycling.util import add_offset from cylc.flow.pathutil import expand_path, get_cylc_run_dir -from cylc.flow.workflow_files import parse_reg from metomi.isodatetime.parsers import TimePointParser @@ -86,7 +87,7 @@ def connect(self): if cylc.flow.flags.verbosity > 0: sys.stderr.write( "connecting to workflow db for " + - self.args['run_dir'] + "/" + self.args['workflow']) + self.args['run_dir'] + "/" + self.args['workflow_id']) # Attempt db connection even if no polls for condition are # requested, as failure to connect is useful information. @@ -97,7 +98,7 @@ def connect(self): self.n_polls += 1 try: self.checker = CylcWorkflowDBChecker( - self.args['run_dir'], self.args['workflow']) + self.args['run_dir'], self.args['workflow_id']) connected = True # ... but ensure at least one poll after connection: self.n_polls -= 1 @@ -118,7 +119,7 @@ def connect(self): self.args['cycle'] = str(my_point) return connected, self.args['cycle'] - def check(self): + async def check(self): """Return True if desired workflow state achieved, else False""" return self.checker.task_state_met( self.args['task'], self.args['cycle'], @@ -128,7 +129,7 @@ def check(self): def get_option_parser() -> COP: parser = COP( __doc__, - argdoc=[('WORKFLOW', "Workflow name or ID")] + argdoc=[('WORKFLOW_ID', "Workflow ID")] ) parser.add_option( @@ -185,8 +186,11 @@ def get_option_parser() -> COP: @cli_function(get_option_parser, remove_opts=["--db"]) -def main(parser: COP, options: 'Values', workflow: str) -> None: - workflow, _ = parse_reg(workflow) +def main(parser: COP, options: 'Values', workflow_id: str) -> None: + workflow_id, *_ = parse_id( + workflow_id, + constraint='workflows', + ) if options.use_task_point and options.cycle: raise UserInputError( @@ -225,7 +229,7 @@ def main(parser: COP, options: 'Values', workflow: str) -> None: run_dir = get_cylc_run_dir() pollargs = { - 'workflow': workflow, + 'workflow_id': workflow_id, 'run_dir': run_dir, 'task': options.task, 'cycle': options.cycle, @@ -233,25 +237,27 @@ def main(parser: COP, options: 'Values', workflow: str) -> None: 'message': options.msg, } - spoller = WorkflowPoller("requested state", - options.interval, - options.max_polls, - args=pollargs) + spoller = WorkflowPoller( + "requested state", + options.interval, + options.max_polls, + args=pollargs, + ) connected, formatted_pt = spoller.connect() if not connected: - raise CylcError("cannot connect to the workflow DB") + raise CylcError("cannot connect to the workflow_id DB") if options.status and options.task and options.cycle: # check a task status spoller.condition = options.status - if not spoller.poll(): + if not asyncio.run(spoller.poll()): sys.exit(1) elif options.msg: # Check for a custom task output spoller.condition = "output: %s" % options.msg - if not spoller.poll(): + if not asyncio.run(spoller.poll()): sys.exit(1) else: # just display query results diff --git a/cylc/flow/task_events_mgr.py b/cylc/flow/task_events_mgr.py index bb9c854e7c2..6ba65736abb 100644 --- a/cylc/flow/task_events_mgr.py +++ b/cylc/flow/task_events_mgr.py @@ -50,8 +50,11 @@ ) from cylc.flow.platforms import get_platform, get_host_from_platform from cylc.flow.task_job_logs import ( - get_task_job_id, get_task_job_log, get_task_job_activity_log, - JOB_LOG_OUT, JOB_LOG_ERR) + get_task_job_log, + get_task_job_activity_log, + JOB_LOG_OUT, + JOB_LOG_ERR, +) from cylc.flow.task_message import ( ABORT_MESSAGE_PREFIX, FAIL_MESSAGE_PREFIX, VACATION_MESSAGE_PREFIX) from cylc.flow.task_state import ( @@ -426,8 +429,9 @@ def process_message( else: new_msg = message self.data_store_mgr.delta_job_msg( - get_task_job_id(itask.point, itask.tdef.name, submit_num), - new_msg) + itask.tokens.duplicate(job=str(submit_num)).relative_id, + new_msg + ) # Satisfy my output, if possible, and spawn children. # (first remove signal: failed/EXIT -> failed) @@ -507,8 +511,9 @@ def process_message( # ... but either way update the job ID in the job proxy (it only # comes in via the submission message). if itask.tdef.run_mode != 'simulation': - job_d = get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id self.data_store_mgr.delta_job_attr( job_d, 'job_id', itask.summary['submit_method_id']) @@ -901,8 +906,7 @@ def _process_message_failed(self, itask, event_time, message): if event_time is None: event_time = get_current_time_string() itask.set_summary_time('finished', event_time) - job_d = get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id self.data_store_mgr.delta_job_time(job_d, 'finished', event_time) self.data_store_mgr.delta_job_state(job_d, TASK_STATUS_FAILED) self.workflow_db_mgr.put_update_task_jobs(itask, { @@ -937,7 +941,7 @@ def _process_message_started(self, itask, event_time): itask.job_vacated = False LOG.warning(f"[{itask}] Vacated job restarted") self.reset_inactivity_timer_func() - job_d = get_task_job_id(itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id self.data_store_mgr.delta_job_time(job_d, 'started', event_time) self.data_store_mgr.delta_job_state(job_d, TASK_STATUS_RUNNING) itask.set_summary_time('started', event_time) @@ -955,7 +959,7 @@ def _process_message_started(self, itask, event_time): def _process_message_succeeded(self, itask, event_time): """Helper for process_message, handle a succeeded message.""" - job_d = get_task_job_id(itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id self.data_store_mgr.delta_job_time(job_d, 'finished', event_time) self.data_store_mgr.delta_job_state(job_d, TASK_STATUS_SUCCEEDED) self.reset_inactivity_timer_func() @@ -988,7 +992,7 @@ def _process_message_submit_failed(self, itask, event_time, submit_num): "time_submit_exit": event_time, "submit_status": 1, }) - job_d = get_task_job_id(itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id self.data_store_mgr.delta_job_state(job_d, TASK_STATUS_SUBMIT_FAILED) itask.summary['submit_method_id'] = None self.reset_inactivity_timer_func() @@ -1032,8 +1036,7 @@ def _process_message_submitted(self, itask, event_time, submit_num): # Register the newly submitted job with the database and datastore. self._insert_task_job(itask, event_time, self.JOB_SUBMIT_SUCCESS_FLAG) - job_d = get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id itask.set_summary_time('submitted', event_time) self.data_store_mgr.delta_job_time(job_d, 'submitted', event_time) diff --git a/cylc/flow/task_id.py b/cylc/flow/task_id.py index 842c5510edf..821d637c2ff 100644 --- a/cylc/flow/task_id.py +++ b/cylc/flow/task_id.py @@ -22,6 +22,7 @@ from cylc.flow.cycling import PointBase from cylc.flow.cycling.loader import get_point, standardise_point_string from cylc.flow.exceptions import PointParsingError +from cylc.flow.id import Tokens _TASK_NAME_PREFIX = r'\w' @@ -100,6 +101,6 @@ def get_standardised_point(cls, point_string: str) -> Optional[PointBase]: @classmethod def get_standardised_taskid(cls, task_id): """Return task ID with standardised cycle point.""" - name, point_string = cls.split(task_id) - return cls.get( - name, cls.get_standardised_point_string(point_string)) + tokens = Tokens(task_id, relative=True) + tokens['cycle'] = cls.get_standardised_point_string(tokens['cycle']) + return tokens.relative_id diff --git a/cylc/flow/task_job_logs.py b/cylc/flow/task_job_logs.py index 51293d42c0b..4804907fdbd 100644 --- a/cylc/flow/task_job_logs.py +++ b/cylc/flow/task_job_logs.py @@ -16,6 +16,8 @@ """Define task job log filenames and option names.""" import os + +from cylc.flow.id import Tokens from cylc.flow.pathutil import get_workflow_run_job_dir # Task job log filenames. @@ -38,20 +40,16 @@ NN = "NN" -def get_task_job_id(point, name, submit_num=None): - """Return the job log path from cycle point down.""" - try: - submit_num = "%02d" % submit_num - except TypeError: - submit_num = NN - return os.path.join(str(point), name, submit_num) - - def get_task_job_log(workflow, point, name, submit_num=None, suffix=None): """Return the full job log path.""" args = [ get_workflow_run_job_dir(workflow), - get_task_job_id(point, name, submit_num)] + Tokens( + cycle=str(point), + task=name, + job=str(submit_num or NN), + ).relative_id + ] if suffix is not None: args.append(suffix) return os.path.join(*args) diff --git a/cylc/flow/task_job_mgr.py b/cylc/flow/task_job_mgr.py index a62b8ee3dbc..6abc92ae248 100644 --- a/cylc/flow/task_job_mgr.py +++ b/cylc/flow/task_job_mgr.py @@ -79,7 +79,6 @@ JOB_LOG_JOB, NN, get_task_job_activity_log, - get_task_job_id, get_task_job_job_log, get_task_job_log ) @@ -352,11 +351,11 @@ def submit_task_jobs(self, workflow, itasks, curve_auth, platform, curve_auth, client_pub_key_dir) for itask in itasks: self.data_store_mgr.delta_job_msg( - get_task_job_id( - itask.point, - itask.tdef.name, - itask.submit_num), - self.REMOTE_INIT_MSG) + itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id, + self.REMOTE_INIT_MSG, + ) continue elif (ri_map[install_target] == REMOTE_INIT_DONE): @@ -369,11 +368,9 @@ def submit_task_jobs(self, workflow, itasks, curve_auth, for itask in itasks: msg = self.IN_PROGRESS[ri_map[install_target]] self.data_store_mgr.delta_job_msg( - get_task_job_id( - itask.point, - itask.tdef.name, - itask.submit_num), - msg) + itask.tokens.duplicate(job=str(itask.submit_num)), + msg + ) continue elif (ri_map[install_target] == REMOTE_INIT_255): # Remote init previously failed becase a host was @@ -383,11 +380,11 @@ def submit_task_jobs(self, workflow, itasks, curve_auth, platform, curve_auth, client_pub_key_dir) for itask in itasks: self.data_store_mgr.delta_job_msg( - get_task_job_id( - itask.point, - itask.tdef.name, - itask.submit_num), - self.REMOTE_INIT_MSG) + itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id, + self.REMOTE_INIT_MSG + ) continue # Ensure that localhost background/at jobs are recorded as running @@ -407,11 +404,11 @@ def submit_task_jobs(self, workflow, itasks, curve_auth, platform, curve_auth, client_pub_key_dir) for itask in itasks: self.data_store_mgr.delta_job_msg( - get_task_job_id( - itask.point, - itask.tdef.name, - itask.submit_num), - self.REMOTE_INIT_MSG) + itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id, + self.REMOTE_INIT_MSG, + ) continue if ( @@ -441,11 +438,11 @@ def submit_task_jobs(self, workflow, itasks, curve_auth, platform) for itask in itasks: self.data_store_mgr.delta_job_msg( - get_task_job_id( - itask.point, - itask.tdef.name, - itask.submit_num), - REMOTE_FILE_INSTALL_IN_PROGRESS) + itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id, + REMOTE_FILE_INSTALL_IN_PROGRESS + ) continue if (ri_map[install_target] in [REMOTE_INIT_FAILED, @@ -531,8 +528,11 @@ def submit_task_jobs(self, workflow, itasks, curve_auth, ) ) ) - job_log_dirs.append(get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num)) + job_log_dirs.append( + itask.tokens.duplicate( + job=str(itask.submit_num), + ).relative_id + ) # The job file is now (about to be) used: reset the file # write flag so that subsequent manual retrigger will # generate a new job file. @@ -719,8 +719,11 @@ def _kill_task_job_callback(self, workflow, itask, cmd_ctx, line): 'ignoring job kill result, unexpected task state: %s' % itask.state.status) self.data_store_mgr.delta_job_msg( - get_task_job_id(itask.point, itask.tdef.name, itask.submit_num), - log_msg) + itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id, + log_msg + ) LOG.log(log_lvl, f"[{itask}] {log_msg}") def _manip_task_jobs_callback( @@ -814,7 +817,7 @@ def _poll_task_job_callback(self, workflow, itask, cmd_ctx, line): ctx.out = line ctx.ret_code = 0 # See cylc.flow.job_runner_mgr.JobPollContext - job_d = get_task_job_id(itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id try: job_log_dir, context = line.split('|')[1:3] items = json.loads(context) @@ -932,8 +935,11 @@ def _run_job_cmd( cmd, platform, host ) for itask in sorted(itasks, key=lambda itask: itask.identity): - job_log_dirs.append(get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num)) + job_log_dirs.append( + itask.tokens.duplicate( + job=str(itask.submit_num) + ).relative_id + ) cmd += job_log_dirs LOG.debug(f'{cmd_key} for {platform["name"]} on {host}') self.proc_pool.put_command( @@ -1076,7 +1082,8 @@ def _prep_submit_task_job(self, workflow, itask, check_syntax=True): # Handle broadcasts overrides = self.task_events_mgr.broadcast_mgr.get_broadcast( - itask.identity) + itask.identity + ) if overrides: rtconfig = pdeepcopy(itask.tdef.rtconfig) poverride(rtconfig, overrides, prepend=True) @@ -1254,8 +1261,7 @@ def _prep_submit_task_job_impl(self, workflow, itask, rtconfig): # Location of job file, etc self._create_job_log_path(workflow, itask) - job_d = get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)).relative_id job_file_path = get_remote_workflow_run_job_dir( workflow, job_d, JOB_LOG_JOB) diff --git a/cylc/flow/task_pool.py b/cylc/flow/task_pool.py index f383ab21c98..7ab484b6b8f 100644 --- a/cylc/flow/task_pool.py +++ b/cylc/flow/task_pool.py @@ -29,13 +29,15 @@ from cylc.flow.cycling.integer import IntegerInterval from cylc.flow.cycling.iso8601 import ISO8601Interval from cylc.flow.exceptions import WorkflowConfigError, PointParsingError +from cylc.flow.id import Tokens +from cylc.flow.id_cli import contains_fnmatch +from cylc.flow.id_match import filter_ids from cylc.flow.workflow_status import StopMode from cylc.flow.task_action_timer import TaskActionTimer, TimerFlags from cylc.flow.task_events_mgr import ( CustomTaskEventHandlerContext, TaskEventMailContext, TaskJobLogsRetrieveContext) from cylc.flow.task_id import TaskID -from cylc.flow.task_job_logs import get_task_job_id from cylc.flow.task_proxy import TaskProxy from cylc.flow.task_state import ( TASK_STATUSES_ACTIVE, @@ -125,7 +127,8 @@ def __init__( def set_stop_task(self, task_id): """Set stop after a task.""" - name = TaskID.split(task_id)[0] + tokens = Tokens(task_id, relative=True) + name = tokens['task'] if name in self.config.get_task_name_list(): task_id = TaskID.get_standardised_taskid(task_id) LOG.info("Setting stop task: " + task_id) @@ -207,7 +210,7 @@ def add_to_pool(self, itask, is_new=True): def create_data_store_elements(self, itask): """Create the node window elements about given task proxy.""" - # Register pool node reference data-store with ID_DELIM format + # Register pool node reference self.data_store_mgr.add_pool_node(itask.tdef.name, itask.point) # Create new data-store n-distance graph window about this task self.data_store_mgr.increment_graph_window(itask) @@ -364,7 +367,7 @@ def update_flow_mgr(self): def load_abs_outputs_for_restart(self, row_idx, row): cycle, name, output = row - self.abs_outputs_done.add((name, cycle, output)) + self.abs_outputs_done.add((cycle, name, output)) def load_db_task_pool_for_restart(self, row_idx, row): """Load tasks from DB task pool/states/jobs tables. @@ -425,14 +428,17 @@ def load_db_task_pool_for_restart(self, row_idx, row): itask.summary['platforms_used'][ int(submit_num)] = platform_name LOG.info( - f"+ {name}.{cycle} {status}{' (held)' if is_held else ''}") + f"+ {cycle}/{name} {status}{' (held)' if is_held else ''}") # Update prerequisite satisfaction status from DB sat = {} for prereq_name, prereq_cycle, prereq_output, satisfied in ( self.workflow_db_mgr.pri_dao.select_task_prerequisites( - cycle, name)): - key = (prereq_name, prereq_cycle, prereq_output) + cycle, + name, + ) + ): + key = (prereq_cycle, prereq_name, prereq_output) sat[key] = satisfied if satisfied != '0' else False for itask_prereq in itask.state.prerequisites: @@ -449,7 +455,10 @@ def load_db_task_action_timers(self, row_idx, row): LOG.info("LOADING task action timers") (cycle, name, ctx_key_raw, ctx_raw, delays_raw, num, delay, timeout) = row - id_ = TaskID.get(name, cycle) + id_ = Tokens( + cycle=cycle, + task=name, + ).relative_id try: # Extract type namedtuple variables from JSON strings ctx_key = json.loads(str(ctx_key_raw)) @@ -471,7 +480,7 @@ def load_db_task_action_timers(self, row_idx, row): "%(id)s: skip action timer %(ctx_key)s" % {"id": id_, "ctx_key": ctx_key_raw}) return - LOG.info("+ %s.%s %s" % (name, cycle, ctx_key)) + LOG.info("+ %s/%s %s" % (cycle, name, ctx_key)) if ctx_key == "poll_timer": itask = self._get_main_task_by_id(id_) if itask is None: @@ -547,7 +556,10 @@ def spawn_successor(self, itask: TaskProxy) -> Optional[TaskProxy]: or all(x < self.config.start_point for x in parent_points) or itask.tdef.has_only_abs_triggers(next_point) ): - taskid = TaskID.get(itask.tdef.name, next_point) + taskid = Tokens( + cycle=str(next_point), + task=itask.tdef.name, + ).relative_id next_task = ( self._get_hidden_task_by_id(taskid) or self._get_main_task_by_id(taskid) @@ -953,16 +965,16 @@ def log_unsatisfied_prereqs(self): """ unsat = {} for itask in self.get_hidden_tasks(): - _, point = TaskID().split(itask.identity) - if get_point(point) > self.stop_point: + task_point = point = itask.point + if task_point > self.stop_point: continue for pre in itask.state.get_unsatisfied_prerequisites(): - name, point, output = pre + point, name, output = pre if get_point(point) > self.stop_point: continue if itask.identity not in unsat: unsat[itask.identity] = [] - unsat[itask.identity].append(f"{name}.{point}:{output}") + unsat[itask.identity].append(f"{point}/{name}:{output}") if unsat: LOG.warning( "Unsatisfied prerequisites:\n" @@ -1027,32 +1039,38 @@ def set_hold_point(self, point: 'PointBase') -> None: def hold_tasks(self, items: Iterable[str]) -> int: """Hold tasks with IDs matching the specified items.""" # Hold active tasks: - itasks, unmatched = self.filter_task_proxies(items, warn=False) + itasks, future_tasks, unmatched = self.filter_task_proxies( + items, + warn=False, + future=True, + ) for itask in itasks: self.hold_active_task(itask) # Set future tasks to be held: - n_warnings, task_items = self._explicit_match_tasks_to_hold(unmatched) - for name, cycle in task_items: + for name, cycle in future_tasks: self.data_store_mgr.delta_task_held((name, cycle, True)) - self.tasks_to_hold.update(task_items) + self.tasks_to_hold.update(future_tasks) self.workflow_db_mgr.put_tasks_to_hold(self.tasks_to_hold) LOG.debug(f"Tasks to hold: {self.tasks_to_hold}") - return n_warnings + return len(unmatched) def release_held_tasks(self, items: Iterable[str]) -> int: """Release held tasks with IDs matching any specified items.""" # Release active tasks: - itasks, unmatched = self.filter_task_proxies(items, warn=False) + itasks, future_tasks, unmatched = self.filter_task_proxies( + items, + warn=False, + future=True, + ) for itask in itasks: self.release_held_active_task(itask) # Unhold future tasks: - n_warnings, task_items = self._explicit_match_tasks_to_hold(unmatched) - for name, cycle in task_items: + for name, cycle in future_tasks: self.data_store_mgr.delta_task_held((name, cycle, False)) - self.tasks_to_hold.difference_update(task_items) + self.tasks_to_hold.difference_update(future_tasks) self.workflow_db_mgr.put_tasks_to_hold(self.tasks_to_hold) LOG.debug(f"Tasks to hold: {self.tasks_to_hold}") - return n_warnings + return len(unmatched) def release_hold_point(self) -> None: """Unset the workflow hold point and release all held active tasks.""" @@ -1063,55 +1081,6 @@ def release_hold_point(self) -> None: self.workflow_db_mgr.put_tasks_to_hold(self.tasks_to_hold) self.workflow_db_mgr.delete_workflow_hold_cycle_point() - def _explicit_match_tasks_to_hold( - self, items: Iterable[str] - ) -> Tuple[int, Set[Tuple[str, 'PointBase']]]: - """Match future tasks based on the assumption that no active tasks - matched the items. - - Returns (n_warnings, matched_tasks) - """ - n_warnings = 0 - matched_tasks: Set[Tuple[str, 'PointBase']] = set() - for item in items: - point_str, name_str, status = self._parse_task_item(item) - if status or ('*' in item) or ('?' in item) or ('[' in item): - # Glob or task state was not matched by active tasks - LOG.warning(f"No active tasks matching: {item}") - n_warnings += 1 - continue - if name_str not in self.config.taskdefs: - if self.config.find_taskdefs(name_str): - # It's a family name; was not matched by active tasks - LOG.warning( - f"No active tasks in the family '{name_str}' " - f"matching: {item}" - ) - else: - LOG.warning(self.ERR_TMPL_NO_TASKID_MATCH.format(name_str)) - n_warnings += 1 - continue - if point_str is None: - LOG.warning(f"No active instances of task: {item}") - n_warnings += 1 - continue - try: - point_str = standardise_point_string(point_str) - except PointParsingError as exc: - LOG.warning( - f"{item} - invalid cycle point: {point_str} ({exc})") - n_warnings += 1 - continue - point = get_point(point_str) - taskdef = self.config.taskdefs[name_str] - if taskdef.is_valid_point(point): - matched_tasks.add((taskdef.name, point)) - else: - # is_valid_point() already logged warning - n_warnings += 1 - continue - return n_warnings, matched_tasks - def check_abort_on_task_fails(self): """Check whether workflow should abort on task failure. @@ -1157,12 +1126,15 @@ def spawn_on_output(self, itask, output, forced=False): for c_name, c_point, is_abs in children: if is_abs: self.abs_outputs_done.add( - (itask.tdef.name, str(itask.point), output)) + (str(itask.point), itask.tdef.name, output)) self.workflow_db_mgr.put_insert_abs_output( str(itask.point), itask.tdef.name, output) self.workflow_db_mgr.process_queued_ops() - c_taskid = TaskID.get(c_name, c_point) + c_taskid = Tokens( + cycle=str(c_point), + task=c_name, + ).relative_id c_task = ( self._get_hidden_task_by_id(c_taskid) or self._get_main_task_by_id(c_taskid) @@ -1191,15 +1163,17 @@ def spawn_on_output(self, itask, output, forced=False): if c_task is not None: # Update downstream prerequisites directly. if is_abs: - # Update existing children spawned by other tasks. - tasks, _ = self.filter_task_proxies([c_name]) + tasks, *_ = self.filter_task_proxies( + [f'*/{c_name}'], + warn=False, + ) if c_task not in tasks: tasks.append(c_task) else: tasks = [c_task] for t in tasks: t.state.satisfy_me({ - (itask.tdef.name, str(itask.point), output) + (str(itask.point), itask.tdef.name, output) }) self.data_store_mgr.delta_task_prerequisite(t) # Add it to the hidden pool or move it to the main pool. @@ -1257,7 +1231,10 @@ def spawn_on_all_outputs(self, itask): continue for c_name, c_point, _ in children: - c_taskid = TaskID.get(c_name, c_point) + c_taskid = Tokens( + cycle=str(c_point), + task=c_name, + ).relative_id c_task = ( self._get_hidden_task_by_id(c_taskid) or self._get_main_task_by_id(c_taskid) @@ -1282,12 +1259,12 @@ def can_spawn(self, name: str, point: 'PointBase') -> bool: # Attempted manual trigger prior to FCP # or future triggers like foo[+P1] => bar, with foo at ICP. LOG.debug( - 'Not spawning %s.%s: before initial cycle point', name, point) + 'Not spawning %s/%s: before initial cycle point', point, name) return False elif self.config.final_point and point > self.config.final_point: # Only happens on manual trigger beyond FCP LOG.debug( - 'Not spawning %s.%s: beyond final cycle point', name, point) + 'Not spawning %s/%s: beyond final cycle point', point, name) return False return True @@ -1297,7 +1274,7 @@ def spawn_task( point: 'PointBase', flow_nums: Set[int], ) -> Optional[TaskProxy]: - """Spawn name.point. Return the spawned task, or None.""" + """Spawn point/name. Return the spawned task, or None.""" if not self.can_spawn(name, point): return None @@ -1316,7 +1293,7 @@ def spawn_task( if set.intersection(flow_nums, set(json.loads(f_id))): # To avoid "conditional reflow" with (e.g.) "foo | bar => baz". LOG.warning( - f"Task {name}.{point} already spawned in {flow_nums}" + f"Task {point}/{name} already spawned in {flow_nums}" ) return None @@ -1357,47 +1334,6 @@ def spawn_task( LOG.info(f"[{itask}] spawned") return itask - def match_taskdefs( - self, items: Iterable[str] - ) -> Tuple[int, Dict[Tuple[str, 'PointBase'], 'TaskDef']]: - """Return matching taskdefs valid for selected cycle points. - - Args: - items: Identifiers for matching task definitions, each with the - form "name[.point][:state]" or "[point/]name[:state]". - Glob-like patterns will give a warning and be skipped. - """ - n_warnings = 0 - task_items: Dict[Tuple[str, 'PointBase'], 'TaskDef'] = {} - for item in items: - point_str, name_str, _ = self._parse_task_item(item) - if point_str is None: - LOG.warning(f"{item} - task to spawn must have a cycle point") - n_warnings += 1 - continue - try: - point_str = standardise_point_string(point_str) - except PointParsingError as exc: - LOG.warning( - self.ERR_TMPL_NO_TASKID_MATCH.format(f"{item} ({exc})") - ) - n_warnings += 1 - continue - taskdefs: List['TaskDef'] = self.config.find_taskdefs(name_str) - if not taskdefs: - LOG.warning(self.ERR_TMPL_NO_TASKID_MATCH.format(item)) - n_warnings += 1 - continue - point = get_point(point_str) - for taskdef in taskdefs: - if taskdef.is_valid_point(point): - task_items[(taskdef.name, point)] = taskdef - else: - # is_valid_point() already logged warning - n_warnings += 1 - continue - return n_warnings, task_items - def force_spawn_children( self, items: Iterable[str], @@ -1435,7 +1371,7 @@ def force_spawn_children( def remove_tasks(self, items): """Remove tasks from the pool.""" - itasks, bad_items = self.filter_task_proxies(items) + itasks, _, bad_items = self.filter_task_proxies(items) for itask in itasks: self.remove(itask, 'request') return len(bad_items) @@ -1456,9 +1392,18 @@ def force_trigger_tasks( Queue the task if not queued, otherwise release it to run. """ - n_warnings, task_items = self.match_taskdefs(items) - for name, point in task_items.keys(): - task_id = TaskID.get(name, point) + # n_warnings, task_items = self.match_taskdefs(items) + itasks, future_tasks, unmatched = self.filter_task_proxies( + items, + future=True, + ) + + # spawn future tasks + for name, point in future_tasks: + task_id = Tokens( + cycle=str(point), + task=name, + ).relative_id itask = ( self._get_main_task_by_id(task_id) or self._get_hidden_task_by_id(task_id) @@ -1477,23 +1422,27 @@ def force_trigger_tasks( self.add_to_pool(itask, is_new=True) else: # In pool already - if itask.state(*TASK_STATUSES_ACTIVE): - LOG.warning(f"[{itask}] ignoring trigger - already active") - continue - itask.is_manual_submit = True - itask.reset_try_timers() - # (If None, spawner reports cycle bounds errors). - if itask.state_reset(TASK_STATUS_WAITING): - # (could also be unhandled failed) - self.data_store_mgr.delta_task_state(itask) - # (No need to set prerequisites satisfied here). - if not itask.state.is_queued: - self.queue_task(itask) - LOG.info( - f"[{itask}] queued, trigger again to submit now." - ) - else: - self.task_queue_mgr.force_release_task(itask) + itasks.append(itask) + + # trigger tasks + for itask in itasks: + if itask.state(*TASK_STATUSES_ACTIVE): + LOG.warning(f"[{itask}] ignoring trigger - already active") + continue + itask.is_manual_submit = True + itask.reset_try_timers() + # (If None, spawner reports cycle bounds errors). + if itask.state_reset(TASK_STATUS_WAITING): + # (could also be unhandled failed) + self.data_store_mgr.delta_task_state(itask) + # (No need to set prerequisites satisfied here). + if not itask.state.is_queued: + self.queue_task(itask) + LOG.info( + f"[{itask}] queued, trigger again to submit now." + ) + else: + self.task_queue_mgr.force_release_task(itask) self.workflow_db_mgr.put_insert_task_states( itask, @@ -1502,7 +1451,8 @@ def force_trigger_tasks( "flow_nums": json.dumps(list(itask.flow_nums)) } ) - return n_warnings + + return len(unmatched) def sim_time_check(self, message_queue): """Simulation mode: simulate task run times and set states.""" @@ -1520,8 +1470,7 @@ def sim_time_check(self, message_queue): itask.tdef.rtconfig['job']['simulated run length']) if now > timeout: conf = itask.tdef.rtconfig['simulation'] - job_d = get_task_job_id( - itask.point, itask.tdef.name, itask.submit_num) + job_d = itask.tokens.duplicate(job=str(itask.submit_num)) now_str = get_current_time_string() if (itask.point in conf['fail cycle points'] and (itask.get_try_num() == 1 or @@ -1584,40 +1533,6 @@ def task_succeeded(self, id_): for itask in self.get_tasks() ) - def filter_task_proxies( - self, items: Iterable[str], warn: bool = True - ) -> Tuple[List[TaskProxy], List[str]]: - """Return task proxies that match names, points, states in items. - - Args: - items: strings for matching task proxies, each with the - general form name[.point][:state] or [point/]name[:state] - where name is a glob-like pattern for matching a task name or - a family name. - warn: whether to log a warning if no matching tasks are found. - - Return (itasks, bad_items). - """ - itasks: List[TaskProxy] = [] - bad_items: List[str] = [] - if not items: - itasks = self.get_all_tasks() - else: - for item in items: - point_str, name_str, status = self._parse_task_item(item) - tasks_found = False - for itask in self.get_all_tasks(): - if (itask.point_match(point_str) and - itask.name_match(name_str) and - itask.status_match(status)): - itasks.append(itask) - tasks_found = True - if not tasks_found: - if warn: - LOG.warning(f"No active tasks matching: {item}") - bad_items.append(item) - return itasks, bad_items - def stop_flow(self, flow_num): """Stop a particular flow_num from spawning any further.""" for itask in self.get_all_tasks(): @@ -1642,22 +1557,153 @@ def log_task_pool(self, log_lvl=logging.DEBUG): ) ) - @staticmethod - def _parse_task_item( - item: str - ) -> Tuple[Optional[str], str, Optional[str]]: - """Parse point/name:state or name.point:state syntax.""" - point_str: Optional[str] - name_str: str - state_str: Optional[str] - if ":" in item: - head, state_str = item.rsplit(":", 1) - else: - head, state_str = (item, None) - if "/" in head: - point_str, name_str = head.split("/", 1) - elif "." in head: - name_str, point_str = head.split(".", 1) - else: - name_str, point_str = (head, None) - return (point_str, name_str, state_str) + def filter_task_proxies( + self, + ids: Iterable[str], + warn: bool = True, + future: bool = False, + ) -> 'Tuple[List[TaskProxy], Set[Tuple[str, PointBase]], List[str]]': + """Return task proxies that match names, points, states in items. + + Args: + ids: + ID strings. + warn: + Whether to log a warning if no matching tasks are found. + future: + If True, unmatched IDs will be checked against taskdefs + and cycle, task pairs will be provided in the future_matched + argument providing the ID + + * Specifies a cycle point. + * Is not a pattern. (e.g. `*/foo`). + * Does not contain a state selector (e.g. `:failed`). + + Returns: + (matched, future_matched, unmatched) + + """ + matched, unmatched = filter_ids( + [self.main_pool, self.hidden_pool], + ids, + warn=warn, + + ) + future_matched: 'Set[Tuple[str, PointBase]]' = set() + if future and unmatched: + future_matched, unmatched = self.match_future_tasks( + unmatched + ) + + return matched, future_matched, unmatched + + def match_future_tasks( + self, + ids: Iterable[str], + ) -> Tuple[Set[Tuple[str, 'PointBase']], List[str]]: + """Match task IDs against task definitions (rather than the task pool). + + IDs will be matched providing the ID: + + * Specifies a cycle point. + * Is not a pattern. (e.g. `*/foo`). + * Does not contain a state selector (e.g. `:failed`). + + Returns: + (matched_tasks, unmatched_tasks) + + """ + matched_tasks: 'Set[Tuple[str, PointBase]]' = set() + unmatched_tasks: 'List[str]' = [] + for id_ in ids: + try: + tokens = Tokens(id_, relative=True) + except ValueError: + LOG.warning(f'Invalid task ID: {id_}') + if ( + tokens['cycle_sel'] + or tokens['task_sel'] + or contains_fnmatch(id_) + ): + # Glob or task state was not matched by active tasks + LOG.warning(f"No active tasks matching: {id_}") + unmatched_tasks.append(id_) + continue + point_str = tokens['cycle'] + name_str = tokens['task'] or '*' + if name_str not in self.config.taskdefs: + if self.config.find_taskdefs(name_str): + # It's a family name; was not matched by active tasks + LOG.warning( + f"No active tasks in the family '{name_str}' " + f"matching: {id_}" + ) + else: + LOG.warning(self.ERR_TMPL_NO_TASKID_MATCH.format(name_str)) + unmatched_tasks.append(id_) + continue + if point_str is None: + LOG.warning(f"No active instances of task: {id_}") + unmatched_tasks.append(id_) + continue + try: + point_str = standardise_point_string(point_str) + except PointParsingError as exc: + LOG.warning( + f"{id_} - invalid cycle point: {point_str} ({exc})") + unmatched_tasks.append(id_) + continue + point = get_point(point_str) + taskdef = self.config.taskdefs[name_str] + if taskdef.is_valid_point(point): + matched_tasks.add((taskdef.name, point)) + else: + # is_valid_point() already logged warning + unmatched_tasks.append(id_) + continue + return matched_tasks, unmatched_tasks + + def match_taskdefs( + self, items: Iterable[str] + ) -> Tuple[int, Dict[Tuple[str, 'PointBase'], 'TaskDef']]: + """Return matching taskdefs valid for selected cycle points. + + Args: + items: + Identifiers for matching task definitions, each with the + form "name[.point][:state]" or "[point/]name[:state]". + Glob-like patterns will give a warning and be skipped. + + """ + n_warnings = 0 + task_items: Dict[Tuple[str, 'PointBase'], 'TaskDef'] = {} + for item in items: + tokens = Tokens(item, relative=True) + point_str = tokens['cycle'] + name_str = tokens['task'] or '*' + if point_str is None: + LOG.warning(f"{item} - task to spawn must have a cycle point") + n_warnings += 1 + continue + try: + point_str = standardise_point_string(point_str) + except PointParsingError as exc: + LOG.warning( + self.ERR_TMPL_NO_TASKID_MATCH.format(f"{item} ({exc})") + ) + n_warnings += 1 + continue + taskdefs: List['TaskDef'] = self.config.find_taskdefs(name_str) + if not taskdefs: + LOG.warning(self.ERR_TMPL_NO_TASKID_MATCH.format(item)) + n_warnings += 1 + continue + point = get_point(point_str) + for taskdef in taskdefs: + if taskdef.is_valid_point(point): + task_items[(taskdef.name, point)] = taskdef + else: + # is_valid_point() already logged warning + n_warnings += 1 + continue + return n_warnings, task_items diff --git a/cylc/flow/task_proxy.py b/cylc/flow/task_proxy.py index 18e76f9d6b7..1f56814c52d 100644 --- a/cylc/flow/task_proxy.py +++ b/cylc/flow/task_proxy.py @@ -27,8 +27,8 @@ from cylc.flow import LOG from cylc.flow.cycling.loader import standardise_point_string from cylc.flow.exceptions import PointParsingError +from cylc.flow.id import Tokens from cylc.flow.platforms import get_platform -from cylc.flow.task_id import TaskID from cylc.flow.task_action_timer import TimerFlags from cylc.flow.task_state import TaskState, TASK_STATUS_WAITING from cylc.flow.taskdef import generate_graph_children @@ -55,7 +55,9 @@ class TaskProxy: .expire_time: Time in seconds since epoch when this task is considered expired. .identity: - Task ID in NAME.POINT syntax. + Task ID in POINT/NAME syntax. + .tokens: + Task ID tokens. .is_late: Is the task late? .is_manual_submit: @@ -167,11 +169,12 @@ class TaskProxy: 'tdef', 'state', 'summary', + 'flow_nums', + 'graph_children', 'platform', 'timeout', + 'tokens', 'try_timers', - 'graph_children', - 'flow_nums', 'waiting_on_job_prep', ] @@ -196,8 +199,12 @@ def __init__( else: self.flow_nums = flow_nums self.point = start_point - self.identity: str = TaskID.get(self.tdef.name, self.point) - + self.tokens = Tokens( + # TODO: make these absolute? + cycle=str(self.point), + task=self.tdef.name, + ) + self.identity = self.tokens.relative_id self.reload_successor: Optional['TaskProxy'] = None self.point_as_seconds: Optional[int] = None @@ -239,10 +246,10 @@ def __init__( self.graph_children = generate_graph_children(tdef, self.point) def __repr__(self) -> str: - return f"<{self.__class__.__name__} '{self.identity}'>" + return f"<{self.__class__.__name__} '{self.tokens}'>" def __str__(self) -> str: - """Stringify with identity, state, submit_num, and flow_nums.""" + """Stringify with tokens, state, submit_num, and flow_nums.""" return ( f"{self.identity} " f"{self.state} " diff --git a/cylc/flow/task_state.py b/cylc/flow/task_state.py index deca92c7a7d..549c9c53485 100644 --- a/cylc/flow/task_state.py +++ b/cylc/flow/task_state.py @@ -371,7 +371,7 @@ def set_prerequisites_not_satisfied(self): def get_resolved_dependencies(self): """Return a list of dependencies which have been met for this task. - E.G: ['foo.1', 'bar.2'] + E.G: ['1/foo', '2/bar'] The returned list is sorted to allow comparison with reference run task with lots of near-simultaneous triggers. @@ -519,6 +519,5 @@ def get_unsatisfied_prerequisites(self): for key, val in prereq.satisfied.items(): if val: continue - name, point, output = key - unsat.append((name, point, output)) + unsat.append(key) return unsat diff --git a/cylc/flow/task_trigger.py b/cylc/flow/task_trigger.py index 7750554af8b..838bb7d24dd 100644 --- a/cylc/flow/task_trigger.py +++ b/cylc/flow/task_trigger.py @@ -267,8 +267,13 @@ def _stringify_list(cls, nested_expr, point): ret = [] for item in nested_expr: if isinstance(item, TaskTrigger): - ret.append(Prerequisite.MESSAGE_TEMPLATE % ( - item.task_name, item.get_point(point), item.output)) + ret.append( + Prerequisite.MESSAGE_TEMPLATE % ( + item.get_point(point), + item.task_name, + item.output, + ) + ) elif isinstance(item, list): ret.extend(['('] + cls._stringify_list(item, point) + [')']) else: diff --git a/cylc/flow/tui/data.py b/cylc/flow/tui/data.py index 4081afa36d9..8ff383468ee 100644 --- a/cylc/flow/tui/data.py +++ b/cylc/flow/tui/data.py @@ -53,7 +53,7 @@ meanElapsedTime } } - familyProxies(exids: ["root"], states: $taskStates) { + familyProxies(exids: ["*/root"], states: $taskStates) { id name cyclePoint @@ -66,7 +66,7 @@ name } } - cyclePoints: familyProxies(ids: ["root"], states: $taskStates) { + cyclePoints: familyProxies(ids: ["*/root"], states: $taskStates) { id cyclePoint state @@ -85,7 +85,7 @@ 'reload', 'stop', ], - 'cycle_point': [ + 'cycle': [ 'hold', 'release', 'kill', @@ -153,13 +153,14 @@ def list_mutations(selection): def context_to_variables(context): """Derive multiple selection out of single selection. - >>> context_to_variables(extract_context(['a|b|c|d'])) - {'workflow': ['b'], 'task': ['d.c']} + Examples: + >>> context_to_variables(extract_context(['~a/b//c/d'])) + {'workflow': ['b'], 'task': ['c/d']} - >>> context_to_variables(extract_context(['a|b|c'])) - {'workflow': ['b'], 'task': ['*.c']} + >>> context_to_variables(extract_context(['~a/b//c'])) + {'workflow': ['b'], 'task': ['c/*']} - >>> context_to_variables(extract_context(['a|b'])) + >>> context_to_variables(extract_context(['~a/b'])) {'workflow': ['b']} """ @@ -167,10 +168,10 @@ def context_to_variables(context): variables = {'workflow': context['workflow']} if 'task' in context: variables['task'] = [ - f'{context["task"][0]}.{context["cycle_point"][0]}' + f'{context["cycle"][0]}/{context["task"][0]}' ] - elif 'cycle_point' in context: - variables['task'] = [f'*.{context["cycle_point"][0]}'] + elif 'cycle' in context: + variables['task'] = [f'{context["cycle"][0]}/*'] return variables diff --git a/cylc/flow/tui/util.py b/cylc/flow/tui/util.py index ed7a206298b..7270017aa5d 100644 --- a/cylc/flow/tui/util.py +++ b/cylc/flow/tui/util.py @@ -20,7 +20,7 @@ import re from time import time -from cylc.flow import ID_DELIM +from cylc.flow.id import Tokens from cylc.flow.task_state import ( TASK_STATUS_RUNNING ) @@ -34,13 +34,14 @@ def get_task_icon( - status, - *, - is_held=False, - is_queued=False, - is_runahead=False, - start_time=None, - mean_time=None): + status, + *, + is_held=False, + is_queued=False, + is_runahead=False, + start_time=None, + mean_time=None +): """Return a Unicode string to represent a task. Arguments: @@ -70,9 +71,9 @@ def get_task_icon( elif is_queued: ret.append(TASK_MODIFIERS['queued']) if ( - status == TASK_STATUS_RUNNING - and start_time - and mean_time + status == TASK_STATUS_RUNNING + and start_time + and mean_time ): start_time = get_unix_time_from_time_string(start_time) progress = (time() - start_time) / mean_time @@ -91,13 +92,23 @@ def get_task_icon( def idpop(id_): """Remove the last element of a node id. - Example: - >>> id_ = ID_DELIM.join(['a', 'b', 'c']) - >>> idpop(id_).split(ID_DELIM) - ['a', 'b'] + Examples: + >>> idpop('c/t/j') + 'c/t' + >>> idpop('c/t') + 'c' + >>> idpop('c') + Traceback (most recent call last): + ValueError: No tokens provided + >>> idpop('') + Traceback (most recent call last): + ValueError: Invalid Cylc identifier: // """ - return id_.rsplit(ID_DELIM, 1)[0] + relative = '//' not in id_ + tokens = Tokens(id_, relative=relative) + tokens.pop_token() + return tokens.relative_id def compute_tree(flow): @@ -131,8 +142,8 @@ def compute_tree(flow): 'family', family['id'], nodes) first_parent = family['firstParent'] if ( - first_parent - and first_parent['name'] != 'root' + first_parent + and first_parent['name'] != 'root' ): parent_node = add_node( 'family', first_parent['id'], nodes) @@ -432,16 +443,16 @@ def render_node(node, data, type_): is_runahead=data['isRunahead'] ), ' ', - data['id'].rsplit(ID_DELIM, 1)[-1] + Tokens(data['id']).pop_token()[1] ] - return data['id'].rsplit(ID_DELIM, 1)[-1] + return Tokens(data['id']).pop_token()[1] PARTS = [ 'user', 'workflow', - 'cycle_point', + 'cycle', 'task', 'job' ] @@ -455,22 +466,24 @@ def extract_context(selection): List of element id's as extracted from the data store / graphql. Examples: - >>> extract_context(['a|b', 'a|c']) + >>> extract_context(['~a/b', '~a/c']) {'user': ['a'], 'workflow': ['b', 'c']} - >>> extract_context(['a|b|c|d|e'] + >>> extract_context(['~a/b//c/d/e'] ... ) # doctest: +NORMALIZE_WHITESPACE - {'user': ['a'], 'workflow': ['b'], 'cycle_point': ['c'], + {'user': ['a'], 'workflow': ['b'], 'cycle': ['c'], 'task': ['d'], 'job': ['e']} """ - context = {type_: set() for type_ in PARTS} + ret = {} for item in selection: - parts = item.split(ID_DELIM) - for type_, part in zip(PARTS, parts): - context[type_].add(part) - return { - key: sorted(value) - for key, value in context.items() - if value - } + tokens = Tokens(item) + for key, value in tokens.items(): + if ( + value + and not key.endswith('_sel') # ignore selectors + ): + lst = ret.setdefault(key, []) + if value not in lst: + lst.append(value) + return ret diff --git a/cylc/flow/unicode_rules.py b/cylc/flow/unicode_rules.py index 18ebd499463..057670c948f 100644 --- a/cylc/flow/unicode_rules.py +++ b/cylc/flow/unicode_rules.py @@ -26,6 +26,7 @@ ENGLISH_REGEX_MAP = { r'\w': 'alphanumeric', r'a-zA-Z0-9': 'latin letters and numbers', + r'\d': 'numbers', r'\-': '``-``', r'\.': '``.``', r'\/': '``/``' @@ -269,8 +270,8 @@ class WorkflowNameValidator(UnicodeRuleChecker): RULES = [ length(1, 254), - not_starts_with_char(r'\.', r'\-'), - allowed_characters(r'\w', r'\/', '_', '+', r'\-', r'\.', '@') + not_starts_with_char(r'\.', r'\-', r'\d'), + allowed_characters(r'\w', r'\/', '_', '+', r'\-', r'\.', '@'), ] diff --git a/cylc/flow/workflow_db_mgr.py b/cylc/flow/workflow_db_mgr.py index 38e92b7dd65..0f9460f4af9 100644 --- a/cylc/flow/workflow_db_mgr.py +++ b/cylc/flow/workflow_db_mgr.py @@ -447,8 +447,9 @@ def put_task_pool(self, pool: 'TaskPool') -> None: self.db_deletes_map[self.TABLE_TASK_TIMEOUT_TIMERS].append({}) for itask in pool.get_all_tasks(): for prereq in itask.state.prerequisites: - for (p_name, p_cycle, p_output), satisfied_state in ( - prereq.satisfied.items()): + for (p_cycle, p_name, p_output), satisfied_state in ( + prereq.satisfied.items() + ): self.put_insert_task_prerequisites(itask, { "prereq_name": p_name, "prereq_cycle": p_cycle, diff --git a/cylc/flow/workflow_files.py b/cylc/flow/workflow_files.py index 8de41933513..24a1cd0bf08 100644 --- a/cylc/flow/workflow_files.py +++ b/cylc/flow/workflow_files.py @@ -16,7 +16,6 @@ """Workflow service files management.""" -import asyncio from collections import deque from contextlib import suppress from enum import Enum @@ -705,10 +704,7 @@ def is_installed(rund: Union[Path, str]) -> bool: return cylc_install_dir.is_dir() or alt_cylc_install_dir.is_dir() -async def get_contained_workflows( - path: Path, - scan_depth: Optional[int] = None -) -> List[str]: +async def get_contained_workflows(partial_id) -> List[str]: """Return the sorted names of any workflows in a directory. Args: @@ -716,8 +712,11 @@ async def get_contained_workflows( scan_depth: How many levels deep to look inside the dir. """ from cylc.flow.network.scan import scan + run_dir = Path(get_workflow_run_dir(partial_id)) + # Note: increased scan depth for safety + scan_depth = glbl_cfg().get(['install', 'max depth']) + 1 return sorted( - [i['name'] async for i in scan(scan_dir=path, max_depth=scan_depth)] + [i['name'] async for i in scan(scan_dir=run_dir, max_depth=scan_depth)] ) @@ -753,37 +752,11 @@ def init_clean(reg: str, opts: 'Values') -> None: except FileNotFoundError as exc: LOG.info(exc) return - local_run_dir, reg_path = infer_latest_run( - local_run_dir, implicit_runN=False - ) - reg = str(reg_path) # Parse --rm option to make sure it's valid rm_dirs = parse_rm_dirs(opts.rm_dirs) if opts.rm_dirs else None - # Check dir does not contain other workflows: - scan_depth = glbl_cfg().get(['install', 'max depth']) + 1 - contained_workflows = asyncio.get_event_loop().run_until_complete( - get_contained_workflows(local_run_dir, scan_depth) - ) # Note: increased scan depth for safety - if len(contained_workflows) == 1: - # Clean the contained workflow followed by the parent dir - init_clean(contained_workflows[0], opts) - if opts.rm_dirs: - return # Do not delete parent dir if --rm dirs specified - elif len(contained_workflows) > 1: - msg = ( - f"{local_run_dir} contains the following workflows:" - f"{WorkflowFilesError.bullet}" - f"{WorkflowFilesError.bullet.join(contained_workflows)}" - ) - if not opts.force: - raise WorkflowFilesError(f"Cannot clean because {msg}") - if opts.remote_only: - msg = f"Not performing remote clean because {msg}" - LOG.warning(msg) - - if (not opts.local_only) and (len(contained_workflows) == 0): + if not opts.local_only: platform_names = None try: platform_names = get_platforms_from_db(local_run_dir) @@ -1178,56 +1151,6 @@ def get_platforms_from_db(run_dir): pri_dao.close() -def parse_reg(reg: str, src: bool = False, warn_depr=True) -> Tuple[str, Path]: - """Centralised parsing of the workflow argument, to be used by most - cylc commands (script modules). - - Infers the latest numbered run if a specific one is not given (e.g. - foo -> foo/run3, foo/runN -> foo/run3). - - "Offline" commands (e.g. cylc validate) can usually be used on - workflow sources so will need src = True. - - "Online" commands (e.g. cylc stop) are usually only used on workflows in - the cylc-run dir so will need src = False. - - Args: - reg: The workflow arg. Can be one of: - - relative path to the run dir from ~/cylc-run, i.e. the "name" - of the workflow; - - absolute path to a run dir, source dir or workflow file (only - if src is True); - - '.' for the current directory (only if src is True). - src: Whether the workflow arg can be a workflow source (i.e. an - absolute path (which might not be in ~/cylc-run) and/or a - flow.cylc file (or any file really), or '.' for cwd). - - Returns: - reg: The normalised workflow arg. - path: If src is True, the absolute path to the workflow file - (flow.cylc or suite.rc). Otherwise, the absolute path to the - workflow run dir. - """ - if not src: - validate_workflow_name(reg) - cur_dir_only = reg.startswith(f'{os.curdir}{os.sep}') # starts with './' - reg: Path = Path(expand_path(reg)) - - if src: - reg, abs_path = _parse_src_reg(reg, cur_dir_only) - else: - abs_path = Path(get_workflow_run_dir(reg)) - if abs_path.is_file(): - raise WorkflowFilesError( - "Workflow name must refer to a directory, " - f"but '{reg}' is a file." - ) - abs_path, reg = infer_latest_run(abs_path) - detect_both_flow_and_suite(abs_path) - check_deprecation(abs_path, warn=warn_depr) - return (str(reg), abs_path) - - def check_deprecation(path, warn=True): """Warn and turn on back-compat flag if Cylc 7 suite.rc detected. @@ -1242,73 +1165,6 @@ def check_deprecation(path, warn=True): LOG.warning(SUITERC_DEPR_MSG) -def _parse_src_reg(reg: Path, cur_dir_only: bool = False) -> Tuple[Path, Path]: - """Helper function for parse_reg() when src=True. - - Args: - reg: Reg. - cur_dir_only: Whether the pre-normalised reg began with './' - i.e. whether we should only look in the current directory. - """ - if reg.is_absolute(): - abs_path = reg - with suppress(ValueError): - # ValueError if abs_path not relative to ~/cylc-run - abs_path, reg = infer_latest_run(abs_path) - else: - run_dir_path = Path(get_workflow_run_dir(reg)) - cwd = Path.cwd() - reg = Path(os.path.normpath(cwd / reg)) - abs_path = reg - with suppress(ValueError): - # ValueError if abs_path not relative to ~/cylc-run - abs_path, reg = infer_latest_run(abs_path) - try: - run_dir_path, run_dir_reg = infer_latest_run(run_dir_path) - except ValueError: - # run_dir_path not relative to ~/cylc-run - pass - else: - if ( - not cur_dir_only and - abs_path.resolve() != run_dir_path.resolve() - ): - if abs_path.is_file(): - if run_dir_path.is_file(): - LOG.warning(REG_CLASH_MSG.format( - abs_path.relative_to(cwd), - run_dir_path.relative_to(get_cylc_run_dir()) - )) - return (reg.parent, abs_path) - if run_dir_path.is_file(): - return (run_dir_reg.parent, run_dir_path) - try: - run_dir_path = check_flow_file(run_dir_path) - except WorkflowFilesError: - try: - abs_path = check_flow_file(abs_path) - except WorkflowFilesError: - raise WorkflowFilesError(NO_FLOW_FILE_MSG.format( - f"./{abs_path.relative_to(cwd)} or {run_dir_path}" - )) - else: - try: - abs_path = check_flow_file(abs_path) - except WorkflowFilesError: - return (run_dir_reg, run_dir_path) - LOG.warning(REG_CLASH_MSG.format( - abs_path.relative_to(cwd), - run_dir_path.relative_to(get_cylc_run_dir()) - )) - return (reg, abs_path) - if abs_path.is_file(): - reg = reg.parent - else: - abs_path = check_flow_file(abs_path) - - return (reg, abs_path) - - def validate_workflow_name( name: str, check_reserved_names: bool = False ) -> None: @@ -1353,8 +1209,15 @@ def check_reserved_dir_names(name: Union[Path, str]) -> None: raise WorkflowFilesError(err_msg.format('run')) +def infer_latest_run_from_id(workflow_id: str) -> str: + run_dir = Path(get_workflow_run_dir(workflow_id)) + _, reg = infer_latest_run(run_dir) + return str(reg) + + def infer_latest_run( - path: Path, implicit_runN: bool = True + path: Path, + implicit_runN: bool = True, ) -> Tuple[Path, Path]: """Infer the numbered run dir if the workflow has a runN symlink. diff --git a/pytest.ini b/pytest.ini index e2dfd4f246b..1cdff54599d 100644 --- a/pytest.ini +++ b/pytest.ini @@ -32,3 +32,7 @@ testpaths = env = # a weird timezone to check that tests aren't assuming the local timezone TZ=XXX-09:35 +doctest_optionflags = + NORMALIZE_WHITESPACE + IGNORE_EXCEPTION_DETAIL + ELLIPSIS diff --git a/setup.cfg b/setup.cfg index 041e8093c2f..34a95a747c0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -119,6 +119,7 @@ tests = types-pkg_resources>=0.1.2 types-protobuf>=0.1.10 types-six>=0.1.6 + typing-extensions>=4 tutorials = pillow urllib3 diff --git a/tests/flakyfunctional/cyclers/19-async_integer/graph.plain.ref b/tests/flakyfunctional/cyclers/19-async_integer/graph.plain.ref index 42dec70e0f4..2fa892d432c 100644 --- a/tests/flakyfunctional/cyclers/19-async_integer/graph.plain.ref +++ b/tests/flakyfunctional/cyclers/19-async_integer/graph.plain.ref @@ -1,5 +1,5 @@ -edge "foo.1" "bar.1" +edge "1/foo" "1/bar" graph -node "bar.1" "bar\n1" -node "foo.1" "foo\n1" +node "1/bar" "bar\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/flakyfunctional/cyclers/19-async_integer/reference.log b/tests/flakyfunctional/cyclers/19-async_integer/reference.log index 1f455427830..1a9f846c98d 100644 --- a/tests/flakyfunctional/cyclers/19-async_integer/reference.log +++ b/tests/flakyfunctional/cyclers/19-async_integer/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -bar.1 -triggered off ['foo.1'] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/flakyfunctional/cyclers/30-r1_at_icp_or/graph.plain.ref b/tests/flakyfunctional/cyclers/30-r1_at_icp_or/graph.plain.ref index 403673f32df..63ff5bd5b57 100644 --- a/tests/flakyfunctional/cyclers/30-r1_at_icp_or/graph.plain.ref +++ b/tests/flakyfunctional/cyclers/30-r1_at_icp_or/graph.plain.ref @@ -1,9 +1,9 @@ -edge "bar.20130808T1200Z" "baz.20130808T1200Z" -edge "baz.20130808T1200Z" "baz.20130809T1200Z" -edge "foo.20130808T0000Z" "baz.20130808T1200Z" +edge "20130808T0000Z/foo" "20130808T1200Z/baz" +edge "20130808T1200Z/bar" "20130808T1200Z/baz" +edge "20130808T1200Z/baz" "20130809T1200Z/baz" graph -node "bar.20130808T1200Z" "bar\n20130808T1200Z" -node "baz.20130808T1200Z" "baz\n20130808T1200Z" -node "baz.20130809T1200Z" "baz\n20130809T1200Z" -node "foo.20130808T0000Z" "foo\n20130808T0000Z" +node "20130808T0000Z/foo" "foo\n20130808T0000Z" +node "20130808T1200Z/bar" "bar\n20130808T1200Z" +node "20130808T1200Z/baz" "baz\n20130808T1200Z" +node "20130809T1200Z/baz" "baz\n20130809T1200Z" stop diff --git a/tests/flakyfunctional/cyclers/30-r1_at_icp_or/reference.log b/tests/flakyfunctional/cyclers/30-r1_at_icp_or/reference.log index cddf28853cc..7abaf13d754 100644 --- a/tests/flakyfunctional/cyclers/30-r1_at_icp_or/reference.log +++ b/tests/flakyfunctional/cyclers/30-r1_at_icp_or/reference.log @@ -1,6 +1,6 @@ Initial point: 20130808T0000Z Final point: 20130809T1800Z -foo.20130808T0000Z -triggered off [] -bar.20130808T1200Z -triggered off [] -baz.20130808T1200Z -triggered off ['baz.20130807T1200Z', 'foo.20130808T0000Z'] -baz.20130809T1200Z -triggered off ['baz.20130808T1200Z'] +20130808T0000Z/foo -triggered off [] +20130808T1200Z/bar -triggered off [] +20130808T1200Z/baz -triggered off ['20130807T1200Z/baz', '20130808T0000Z/foo'] +20130809T1200Z/baz -triggered off ['20130808T1200Z/baz'] diff --git a/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/flow.cylc b/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/flow.cylc index 200e3065c60..4db81ada9ee 100644 --- a/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/flow.cylc +++ b/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/flow.cylc @@ -8,11 +8,13 @@ stall timeout = PT0S abort on inactivity timeout = True inactivity timeout = PT3M + [scheduling] initial cycle point = 2000 final cycle point = 2000 [[graph]] P1Y = "foo:meet? & bar:greet? => baz" + [runtime] [[root]] script = true diff --git a/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/reference.log b/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/reference.log index c69a029c7ab..4722343e430 100644 --- a/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/reference.log +++ b/tests/flakyfunctional/cylc-get-config/04-dummy-mode-output/reference.log @@ -1,4 +1,4 @@ Initial point: 20000101T0000Z Final point: 20000101T0000Z -foo.20000101T0000Z -triggered off [] -bar.20000101T0000Z -triggered off [] +20000101T0000Z/foo -triggered off [] +20000101T0000Z/bar -triggered off [] diff --git a/tests/flakyfunctional/cylc-poll/03-poll-all/flow.cylc b/tests/flakyfunctional/cylc-poll/03-poll-all/flow.cylc index 025696f0fed..5e21a978fea 100644 --- a/tests/flakyfunctional/cylc-poll/03-poll-all/flow.cylc +++ b/tests/flakyfunctional/cylc-poll/03-poll-all/flow.cylc @@ -1,22 +1,24 @@ [meta] title = "Test workflow for task state change on poll result." - description = """Task run_kill fails silently - it will be stuck in 'running' -unless polled. Task run_kill goes to Task submit_hold. Task poll_check_kill -then polls all to find if any tasks have failed, allowing run_kill to suicide -via a :fail trigger. Task submit_hold is an idle task which is killed after -Task poll_check_kill succeeds by Task poll_now. Task poll_now then polls all -to find if any tasks, allowing submit_hold to suicide via a :submit-fail -trigger, and the workflow to shut down successfully.""" + description = """ + Task run_kill fails silently - it will be stuck in 'running' + unless polled. Task run_kill goes to Task submit_hold. Task poll_check_kill + then polls all to find if any tasks have failed, allowing run_kill to suicide + via a :fail trigger. Task submit_hold is an idle task which is killed after + Task poll_check_kill succeeds by Task poll_now. Task poll_now then polls all + to find if any tasks, allowing submit_hold to suicide via a :submit-fail + trigger, and the workflow to shut down successfully. + """ [scheduler] UTC mode = True [[events]] abort on inactivity timeout = True inactivity timeout = PT2M - expected task failures = run_kill.20141207T0000Z,\ - run_kill.20141208T0000Z,\ - submit_hold.20141207T0000Z,\ - submit_hold.20141208T0000Z + expected task failures = 20141207T0000Z/run_kill, \ + 20141208T0000Z/run_kill, \ + 20141207T0000Z/submit_hold, \ + 20141208T0000Z/submit_hold [scheduling] initial cycle point = 20141207T0000Z @@ -36,16 +38,16 @@ trigger, and the workflow to shut down successfully.""" script = exit 1 [[poll_check_kill]] script = """ -cylc poll "${CYLC_WORKFLOW_ID}" + cylc poll "${CYLC_WORKFLOW_ID}//*" -cylc__job__poll_grep_workflow_log \ - "submit_hold.${CYLC_TASK_CYCLE_POINT} preparing .* => submitted" + cylc__job__poll_grep_workflow_log \ + "${CYLC_TASK_CYCLE_POINT}/submit_hold preparing .* => submitted" -st_file="${CYLC_WORKFLOW_RUN_DIR}/log/job/${CYLC_TASK_CYCLE_POINT}/submit_hold/NN/job.status" -pkill -g "$(awk -F= '$1 == "CYLC_JOB_ID" {print $2}' "${st_file}")" -""" + st_file="${CYLC_WORKFLOW_RUN_DIR}/log/job/${CYLC_TASK_CYCLE_POINT}/submit_hold/NN/job.status" + pkill -g "$(awk -F= '$1 == "CYLC_JOB_ID" {print $2}' "${st_file}")" + """ [[poll_now]] - script = cylc poll "${CYLC_WORKFLOW_ID}" + script = cylc poll "${CYLC_WORKFLOW_ID}//*" [[submit_hold]] init-script = sleep 120 diff --git a/tests/flakyfunctional/cylc-poll/03-poll-all/reference.log b/tests/flakyfunctional/cylc-poll/03-poll-all/reference.log index 9f07c8cbdcb..a6955bea7f1 100644 --- a/tests/flakyfunctional/cylc-poll/03-poll-all/reference.log +++ b/tests/flakyfunctional/cylc-poll/03-poll-all/reference.log @@ -1,10 +1,10 @@ Initial point: 20141207T0000Z Final point: 20141208T0000Z -run_kill.20141207T0000Z -triggered off ['run_kill.20141206T0000Z'] -submit_hold.20141207T0000Z -triggered off ['run_kill.20141207T0000Z'] -poll_check_kill.20141207T0000Z -triggered off ['submit_hold.20141207T0000Z'] -run_kill.20141208T0000Z -triggered off ['run_kill.20141207T0000Z'] -poll_now.20141207T0000Z -triggered off ['poll_check_kill.20141207T0000Z'] -submit_hold.20141208T0000Z -triggered off ['run_kill.20141208T0000Z'] -poll_check_kill.20141208T0000Z -triggered off ['submit_hold.20141208T0000Z'] -poll_now.20141208T0000Z -triggered off ['poll_check_kill.20141208T0000Z'] +20141207T0000Z/run_kill -triggered off ['20141206T0000Z/run_kill'] +20141207T0000Z/submit_hold -triggered off ['20141207T0000Z/run_kill'] +20141207T0000Z/poll_check_kill -triggered off ['20141207T0000Z/submit_hold'] +20141208T0000Z/run_kill -triggered off ['20141207T0000Z/run_kill'] +20141207T0000Z/poll_now -triggered off ['20141207T0000Z/poll_check_kill'] +20141208T0000Z/submit_hold -triggered off ['20141208T0000Z/run_kill'] +20141208T0000Z/poll_check_kill -triggered off ['20141208T0000Z/submit_hold'] +20141208T0000Z/poll_now -triggered off ['20141208T0000Z/poll_check_kill'] diff --git a/tests/flakyfunctional/cylc-poll/16-execution-time-limit.t b/tests/flakyfunctional/cylc-poll/16-execution-time-limit.t index 7e9a3ef91a5..a84b90d8505 100755 --- a/tests/flakyfunctional/cylc-poll/16-execution-time-limit.t +++ b/tests/flakyfunctional/cylc-poll/16-execution-time-limit.t @@ -58,14 +58,14 @@ __PYTHON__ LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" # Test logging of the "next job poll" message when task starts. TEST_NAME="${TEST_NAME_BASE}-log-entry" -LINE="$(grep '\[foo\.1 .* execution timeout=PT10S' "${LOG}")" +LINE="$(grep '\[1/foo\ .* execution timeout=PT10S' "${LOG}")" run_ok "${TEST_NAME}" grep -q 'health: execution timeout=PT10S' <<< "${LINE}" # Determine poll times. PREDICTED_POLL_TIME=$(time_offset \ "$(cut -d ' ' -f 1 <<< "${LINE}")" \ "$(sed -n 's/^.*execution timeout=\([^,]\+\).*$/\1/p' <<< "${LINE}")") ACTUAL_POLL_TIME=$(sed -n \ - 's/\(.*\) INFO - \[foo.1 running .* (polled)failed .*/\1/p' "${LOG}") + 's|\(.*\) INFO - \[1/foo running .* (polled)failed .*|\1|p' "${LOG}") # Test execution timeout polling. # Main loop is roughly 1 second, but integer rounding may give an apparent 2 diff --git a/tests/flakyfunctional/cylc-poll/16-execution-time-limit/flow.cylc b/tests/flakyfunctional/cylc-poll/16-execution-time-limit/flow.cylc index e71bfc1c61e..187f4f0b409 100644 --- a/tests/flakyfunctional/cylc-poll/16-execution-time-limit/flow.cylc +++ b/tests/flakyfunctional/cylc-poll/16-execution-time-limit/flow.cylc @@ -4,7 +4,7 @@ [[events]] abort on stall timeout = True stall timeout = PT0S - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] R1 = """ diff --git a/tests/flakyfunctional/cylc-poll/16-execution-time-limit/reference.log b/tests/flakyfunctional/cylc-poll/16-execution-time-limit/reference.log index a81da7549af..08fe5d5558a 100644 --- a/tests/flakyfunctional/cylc-poll/16-execution-time-limit/reference.log +++ b/tests/flakyfunctional/cylc-poll/16-execution-time-limit/reference.log @@ -1,3 +1,3 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] +1/foo -triggered off [] diff --git a/tests/flakyfunctional/cylc-show/00-simple.t b/tests/flakyfunctional/cylc-show/00-simple.t index 6cf26724475..7c4fda42d8c 100644 --- a/tests/flakyfunctional/cylc-show/00-simple.t +++ b/tests/flakyfunctional/cylc-show/00-simple.t @@ -55,15 +55,15 @@ baz: pub URL: (not given) prerequisites (- => not satisfied): - + bar.20141106T0900Z succeeded + + 20141106T0900Z/bar succeeded outputs (- => not completed): - - foo.20141106T0900Z expired - + foo.20141106T0900Z submitted - - foo.20141106T0900Z submit-failed - + foo.20141106T0900Z started - - foo.20141106T0900Z succeeded - - foo.20141106T0900Z failed + - 20141106T0900Z/foo expired + + 20141106T0900Z/foo submitted + - 20141106T0900Z/foo submit-failed + + 20141106T0900Z/foo started + - 20141106T0900Z/foo succeeded + - 20141106T0900Z/foo failed __SHOW_OUTPUT__ #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-show-json" @@ -87,12 +87,12 @@ cmp_json "${TEST_NAME}-task" "${TEST_NAME}-task" <<'__SHOW_OUTPUT__' } __SHOW_OUTPUT__ -ID_DELIM="$(python -c 'from cylc.flow import ID_DELIM;print(ID_DELIM)')" cmp_json "${TEST_NAME}-taskinstance" "${TEST_NAME}-taskinstance" \ <<__SHOW_OUTPUT__ { - "foo.20141106T0900Z": { + "20141106T0900Z/foo": { "name": "foo", + "id": "~${USER}/${WORKFLOW_NAME}//20141106T0900Z/foo", "cyclePoint": "20141106T0900Z", "task": { "meta": { @@ -110,7 +110,7 @@ cmp_json "${TEST_NAME}-taskinstance" "${TEST_NAME}-taskinstance" \ "conditions": [ { "exprAlias": "c0", - "taskId": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20141106T0900Z${ID_DELIM}bar", + "taskId": "20141106T0900Z/bar", "reqState": "succeeded", "message": "satisfied naturally", "satisfied": true diff --git a/tests/flakyfunctional/cylc-show/00-simple/flow.cylc b/tests/flakyfunctional/cylc-show/00-simple/flow.cylc index 177047a1381..c6447b360d7 100644 --- a/tests/flakyfunctional/cylc-show/00-simple/flow.cylc +++ b/tests/flakyfunctional/cylc-show/00-simple/flow.cylc @@ -17,11 +17,11 @@ [runtime] [[foo]] script = """ -touch 'foot' -while [[ -e 'foot' ]]; do - sleep 1 -done -""" + touch 'foot' + while [[ -e 'foot' ]]; do + sleep 1 + done + """ [[[meta]]] title = a task description = jumped over the lazy dog @@ -36,20 +36,28 @@ done script = cylc show "$CYLC_WORKFLOW_ID" >>{{ TEST_OUTPUT_PATH }}-workflow [[show-task]] inherit = SHOW - script = cylc show "$CYLC_WORKFLOW_ID" foo >>{{ TEST_OUTPUT_PATH }}-task + script = cylc show "$CYLC_WORKFLOW_ID" --task-def foo >>{{ TEST_OUTPUT_PATH }}-task [[show-taskinstance]] inherit = SHOW - script = cylc show "$CYLC_WORKFLOW_ID" foo.20141106T0900Z \ - >>{{ TEST_OUTPUT_PATH }}-taskinstance + script = """ + cylc show "$CYLC_WORKFLOW_ID//20141106T0900Z/foo" \ + >>{{ TEST_OUTPUT_PATH }}-taskinstance + """ [[show-workflow-json]] inherit = SHOW - script = cylc show --json "$CYLC_WORKFLOW_ID" \ - >>{{ TEST_OUTPUT_PATH }}-json-workflow + script = """ + cylc show --json "$CYLC_WORKFLOW_ID" \ + >>{{ TEST_OUTPUT_PATH }}-json-workflow + """ [[show-task-json]] inherit = SHOW - script = cylc show --json "$CYLC_WORKFLOW_ID" foo \ - >>{{ TEST_OUTPUT_PATH }}-json-task + script = """ + cylc show --json "$CYLC_WORKFLOW_ID" --task-def foo \ + >>{{ TEST_OUTPUT_PATH }}-json-task + """ [[show-taskinstance-json]] inherit = SHOW - script = cylc show --json "$CYLC_WORKFLOW_ID" foo.20141106T0900Z \ - >>{{ TEST_OUTPUT_PATH }}-json-taskinstance + script = """ + cylc show --json "$CYLC_WORKFLOW_ID//20141106T0900Z/foo" \ + >>{{ TEST_OUTPUT_PATH }}-json-taskinstance + """ diff --git a/tests/flakyfunctional/cylc-show/00-simple/reference.log b/tests/flakyfunctional/cylc-show/00-simple/reference.log index 14b310d55d6..9b5f05d1c0f 100644 --- a/tests/flakyfunctional/cylc-show/00-simple/reference.log +++ b/tests/flakyfunctional/cylc-show/00-simple/reference.log @@ -1,11 +1,9 @@ -Initial point: 20141106T0900Z -Final point: 20141106T0900Z -bar.20141106T0900Z -triggered off [] -foo.20141106T0900Z -triggered off ['bar.20141106T0900Z'] -show-task-json.20141106T0900Z -triggered off ['foo.20141106T0900Z'] -show-workflow-json.20141106T0900Z -triggered off ['foo.20141106T0900Z'] -show-taskinstance-json.20141106T0900Z -triggered off ['foo.20141106T0900Z'] -show-taskinstance.20141106T0900Z -triggered off ['foo.20141106T0900Z'] -show-task.20141106T0900Z -triggered off ['foo.20141106T0900Z'] -show-workflow.20141106T0900Z -triggered off ['foo.20141106T0900Z'] -end.20141106T0900Z -triggered off ['show-task-json.20141106T0900Z', 'show-task.20141106T0900Z', 'show-taskinstance-json.20141106T0900Z', 'show-taskinstance.20141106T0900Z', 'show-workflow-json.20141106T0900Z', 'show-workflow.20141106T0900Z'] +20141106T0900Z/bar -triggered off [] +20141106T0900Z/foo -triggered off ['20141106T0900Z/bar'] +20141106T0900Z/show-task-json -triggered off ['20141106T0900Z/foo'] +20141106T0900Z/show-workflow-json -triggered off ['20141106T0900Z/foo'] +20141106T0900Z/show-taskinstance-json -triggered off ['20141106T0900Z/foo'] +20141106T0900Z/show-taskinstance -triggered off ['20141106T0900Z/foo'] +20141106T0900Z/show-task -triggered off ['20141106T0900Z/foo'] +20141106T0900Z/show-workflow -triggered off ['20141106T0900Z/foo'] +20141106T0900Z/end -triggered off ['20141106T0900Z/show-task', '20141106T0900Z/show-task-json', '20141106T0900Z/show-taskinstance', '20141106T0900Z/show-taskinstance-json', '20141106T0900Z/show-workflow', '20141106T0900Z/show-workflow-json'] diff --git a/tests/flakyfunctional/cylc-show/04-multi.t b/tests/flakyfunctional/cylc-show/04-multi.t index 68432b09c25..56b8d987bf6 100644 --- a/tests/flakyfunctional/cylc-show/04-multi.t +++ b/tests/flakyfunctional/cylc-show/04-multi.t @@ -18,7 +18,7 @@ # Test cylc show multiple tasks . "$(dirname "$0")/test_header" -set_test_number 4 +set_test_number 3 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" @@ -27,55 +27,57 @@ workflow_run_ok "${TEST_NAME_BASE}-run" \ cylc play --reference-test --debug --no-detach "${WORKFLOW_NAME}" RUND="${RUN_DIR}/${WORKFLOW_NAME}" -for FILE in "${RUND}/show1.txt" "${RUND}/show2.txt"; do - contains_ok "${FILE}" <<'__TXT__' ----- -TASK ID: t1.2016 +cat "${RUND}/show.txt" >&2 +contains_ok "${RUND}/show.txt" <<'__TXT__' +------ +Task ID: 2016/t1 title: (not given) description: (not given) +URL: (not given) prerequisites (- => not satisfied): - + t1.2015 started + + 2015/t1 started outputs (- => not completed): - - t1.2016 expired - + t1.2016 submitted - - t1.2016 submit-failed - + t1.2016 started - - t1.2016 succeeded - - t1.2016 failed ----- -TASK ID: t1.2017 + - 2016/t1 expired + + 2016/t1 submitted + - 2016/t1 submit-failed + + 2016/t1 started + - 2016/t1 succeeded + - 2016/t1 failed +------ +Task ID: 2017/t1 title: (not given) description: (not given) +URL: (not given) prerequisites (- => not satisfied): - + t1.2016 started + + 2016/t1 started outputs (- => not completed): - - t1.2017 expired - + t1.2017 submitted - - t1.2017 submit-failed - + t1.2017 started - - t1.2017 succeeded - - t1.2017 failed ----- -TASK ID: t1.2018 + - 2017/t1 expired + + 2017/t1 submitted + - 2017/t1 submit-failed + + 2017/t1 started + - 2017/t1 succeeded + - 2017/t1 failed +------ +Task ID: 2018/t1 title: (not given) description: (not given) +URL: (not given) prerequisites (- => not satisfied): - + t1.2017 started + + 2017/t1 started outputs (- => not completed): - - t1.2018 expired - + t1.2018 submitted - - t1.2018 submit-failed - + t1.2018 started - - t1.2018 succeeded - - t1.2018 failed + - 2018/t1 expired + + 2018/t1 submitted + - 2018/t1 submit-failed + + 2018/t1 started + - 2018/t1 succeeded + - 2018/t1 failed __TXT__ -done purge exit diff --git a/tests/flakyfunctional/cylc-show/04-multi/flow.cylc b/tests/flakyfunctional/cylc-show/04-multi/flow.cylc index 4b44ea8aea9..f5c05ebdc97 100644 --- a/tests/flakyfunctional/cylc-show/04-multi/flow.cylc +++ b/tests/flakyfunctional/cylc-show/04-multi/flow.cylc @@ -1,28 +1,29 @@ #!jinja2 + [scheduler] cycle point format = %Y UTC mode = True + [scheduling] initial cycle point = 2016 final cycle point = 2018 [[graph]] P1Y = t1[-P1Y]:start => t1 + [runtime] [[t1]] script = """ -# Final task runs the show. The other wait after starting. -if [[ "${CYLC_TASK_CYCLE_POINT}" == '2018' ]]; then - # Ensure workflow knows about current task started - cylc__job__wait_cylc_message_started - sleep 5 - # Test alternate syntaxes - cylc show "${CYLC_WORKFLOW_ID}" 't1.*' >"${CYLC_WORKFLOW_RUN_DIR}/show1.txt" - cylc show "${CYLC_WORKFLOW_ID}" '*/t1' >"${CYLC_WORKFLOW_RUN_DIR}/show2.txt" -else - while [[ ! -s "${CYLC_WORKFLOW_RUN_DIR}/show2.txt" ]]; do - sleep 1 - done -fi -""" + # Final task runs the show. The other wait after starting. + if [[ "${CYLC_TASK_CYCLE_POINT}" == '2018' ]]; then + # Ensure workflow knows about current task started + cylc__job__wait_cylc_message_started + sleep 5 + cylc show "${CYLC_WORKFLOW_ID}//*/t1" >"${CYLC_WORKFLOW_RUN_DIR}/show.txt" + else + while [[ ! -s "${CYLC_WORKFLOW_RUN_DIR}/show.txt" ]]; do + sleep 1 + done + fi + """ [[[job]]] execution time limit = PT1M diff --git a/tests/flakyfunctional/cylc-show/04-multi/reference.log b/tests/flakyfunctional/cylc-show/04-multi/reference.log index 8bbd632b671..a67e670b78c 100644 --- a/tests/flakyfunctional/cylc-show/04-multi/reference.log +++ b/tests/flakyfunctional/cylc-show/04-multi/reference.log @@ -1,5 +1,5 @@ Initial point: 2016 Final point: 2018 -t1.2016 -triggered off ['t1.2015'] -t1.2017 -triggered off ['t1.2016'] -t1.2018 -triggered off ['t1.2017'] +2016/t1 -triggered off ['2015/t1'] +2017/t1 -triggered off ['2016/t1'] +2018/t1 -triggered off ['2017/t1'] diff --git a/tests/flakyfunctional/database/01-broadcast/flow.cylc b/tests/flakyfunctional/database/01-broadcast/flow.cylc index 16d34488937..c422785224a 100644 --- a/tests/flakyfunctional/database/01-broadcast/flow.cylc +++ b/tests/flakyfunctional/database/01-broadcast/flow.cylc @@ -1,18 +1,19 @@ [scheduling] [[graph]] R1 = """ -# previously "t1:submit": flaky? recover-1 could possibly start executing first. -t1:start => recover-t1 -""" + # previously "t1:submit": flaky? recover-1 could possibly start + # executing first. + t1:start => recover-t1 + """ [runtime] [[t1]] - script=test -n "${HELLO}" - execution retry delays=PT10M # prevent task failure + script = test -n "${HELLO}" + execution retry delays = PT10M # prevent task failure [[[environment]]] - HELLO= + HELLO = [[recover-t1]] - script=""" -cylc broadcast -p 1 -n t1 -s'[environment]HELLO=Hello' "${CYLC_WORKFLOW_ID}" -sleep 1 -cylc trigger "${CYLC_WORKFLOW_ID}" 1/t1 -""" + script = """ + cylc broadcast -p 1 -n t1 -s'[environment]HELLO=Hello' "${CYLC_WORKFLOW_ID}" + sleep 1 + cylc trigger "${CYLC_WORKFLOW_ID}//1/t1" + """ diff --git a/tests/flakyfunctional/database/01-broadcast/reference.log b/tests/flakyfunctional/database/01-broadcast/reference.log index b5462fb8b63..10b7d3f0ce0 100644 --- a/tests/flakyfunctional/database/01-broadcast/reference.log +++ b/tests/flakyfunctional/database/01-broadcast/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -t1.1 -triggered off [] -recover-t1.1 -triggered off ['t1.1'] -t1.1 -triggered off [] +1/t1 -triggered off [] +1/recover-t1 -triggered off ['1/t1'] +1/t1 -triggered off [] diff --git a/tests/flakyfunctional/database/02-retry.t b/tests/flakyfunctional/database/02-retry.t index fbfbe329db4..ddc8039e7d5 100755 --- a/tests/flakyfunctional/database/02-retry.t +++ b/tests/flakyfunctional/database/02-retry.t @@ -39,7 +39,6 @@ sqlite3 "${DB_FILE}" \ FROM task_jobs ORDER BY name' \ >"${NAME}" LOCALHOST="$(localhost_fqdn)" -# FIXME: recent Travis CI failure sed -i "s/localhost/${LOCALHOST}/" "${NAME}" cmp_ok "${NAME}" <<__SELECT__ 20200101T0000Z|t1|1|1|0|1|${LOCALHOST}|background diff --git a/tests/flakyfunctional/database/02-retry/reference.log b/tests/flakyfunctional/database/02-retry/reference.log index 7b1eeefa82a..b2ca9db8fe2 100644 --- a/tests/flakyfunctional/database/02-retry/reference.log +++ b/tests/flakyfunctional/database/02-retry/reference.log @@ -1,5 +1,5 @@ Initial point: 20200101T0000Z Final point: 20200101T0000Z -t1.20200101T0000Z -triggered off [] -t1.20200101T0000Z -triggered off [] -t1.20200101T0000Z -triggered off [] +20200101T0000Z/t1 -triggered off [] +20200101T0000Z/t1 -triggered off [] +20200101T0000Z/t1 -triggered off [] diff --git a/tests/flakyfunctional/events/01-task/events.log b/tests/flakyfunctional/events/01-task/events.log index af8a408e18c..6924d02adcc 100644 --- a/tests/flakyfunctional/events/01-task/events.log +++ b/tests/flakyfunctional/events/01-task/events.log @@ -1,12 +1,12 @@ EVENT TASK MESSAGE -critical foo.1 failed/ERR -execution timeout foo.1 execution timeout after PT3S -failed baz.1 job failed -retry foo.1 job failed, retrying in PT3S -started baz.1 job started -submission failed bar.1 job submission failed -submission retry bar.1 job submission failed, retrying in PT3S -submission timeout baz.1 submission timeout after PT3S -submitted baz.1 job submitted -succeeded foo.1 job succeeded -warning foo.1 this is a user-defined warning message +critical 1/foo failed/ERR +execution timeout 1/foo execution timeout after PT3S +failed 1/baz job failed +retry 1/foo job failed, retrying in PT3S +started 1/baz job started +submission failed 1/bar job submission failed +submission retry 1/bar job submission failed, retrying in PT3S +submission timeout 1/baz submission timeout after PT3S +submitted 1/baz job submitted +succeeded 1/foo job succeeded +warning 1/foo this is a user-defined warning message diff --git a/tests/flakyfunctional/events/01-task/flow.cylc b/tests/flakyfunctional/events/01-task/flow.cylc index 2aa96fcab5d..9cb51c88082 100644 --- a/tests/flakyfunctional/events/01-task/flow.cylc +++ b/tests/flakyfunctional/events/01-task/flow.cylc @@ -13,7 +13,7 @@ stall timeout = PT0S abort on inactivity timeout = True inactivity timeout = PT3M - expected task failures = bar.1, baz.1 + expected task failures = 1/bar, 1/baz [scheduling] [[graph]] @@ -32,7 +32,7 @@ # timeout, retry, warning, succeeded script = """ test "${CYLC_TASK_TRY_NUMBER}" -gt 1 - while ! grep -q 'execution timeout *foo\.1' "${CYLC_WORKFLOW_LOG_DIR}/events.log" + while ! grep -q 'execution timeout *1/foo' "${CYLC_WORKFLOW_LOG_DIR}/events.log" do sleep 1 done @@ -61,7 +61,7 @@ # Delay in init-script to cause submission timeout. # (Note CYLC_WORKFLOW_LOG_DIR is not defined at this point!) init-script = """ - while ! grep -q 'submission timeout *baz\.1' "${CYLC_WORKFLOW_LOG_DIR}/events.log" + while ! grep -q 'submission timeout .*1/baz' "${CYLC_WORKFLOW_LOG_DIR}/events.log" do sleep 1 done diff --git a/tests/flakyfunctional/events/01-task/reference.log b/tests/flakyfunctional/events/01-task/reference.log index 7c9b2a947b1..aa73c59f67a 100644 --- a/tests/flakyfunctional/events/01-task/reference.log +++ b/tests/flakyfunctional/events/01-task/reference.log @@ -1,9 +1,9 @@ Initial point: 1 Final point: 1 -prep.1 -triggered off [] -foo.1 -triggered off ['prep.1'] -bar.1 -triggered off ['prep.1'] -baz.1 -triggered off ['prep.1'] -foo.1 -triggered off ['prep.1'] -bar.1 -triggered off ['prep.1'] -done.1 -triggered off ['bar.1', 'baz.1', 'foo.1'] +1/prep -triggered off [] +1/foo -triggered off ['1/prep'] +1/bar -triggered off ['1/prep'] +1/baz -triggered off ['1/prep'] +1/foo -triggered off ['1/prep'] +1/bar -triggered off ['1/prep'] +1/done -triggered off ['1/bar', '1/baz', '1/foo'] diff --git a/tests/flakyfunctional/events/39-task-event-template-all/bin/checkargs b/tests/flakyfunctional/events/39-task-event-template-all/bin/checkargs index 4f4c770b039..aefab5c5bd6 100755 --- a/tests/flakyfunctional/events/39-task-event-template-all/bin/checkargs +++ b/tests/flakyfunctional/events/39-task-event-template-all/bin/checkargs @@ -9,7 +9,7 @@ from subprocess import Popen, PIPE args = dict([arg.split('=', 1) for arg in sys.argv[1:]]) workflow = os.environ['CYLC_WORKFLOW_ID'] -proc = Popen(['cylc', 'cat-log', '-m', 'p', '-f', 'a', workflow, 'foo.1'], +proc = Popen(['cylc', 'cat-log', '-m', 'p', '-f', 'a', workflow, '//1/foo'], stdout=PIPE, stdin=open(os.devnull)) alog = proc.communicate()[0].decode().strip() proc.wait() @@ -30,7 +30,7 @@ desired_args = { 'submit_num': '1', 'try_num': '1', 'job_runner_name': 'background', - 'id': 'foo.1', + 'id': '1/foo', 'finish_time': 'None', 'workflow_size': 'large', 'workflow': workflow, diff --git a/tests/flakyfunctional/events/39-task-event-template-all/flow.cylc b/tests/flakyfunctional/events/39-task-event-template-all/flow.cylc index 9338b48a9ec..2ae5fb5b387 100644 --- a/tests/flakyfunctional/events/39-task-event-template-all/flow.cylc +++ b/tests/flakyfunctional/events/39-task-event-template-all/flow.cylc @@ -11,9 +11,9 @@ [runtime] [[foo]] script = """ -cylc__job__wait_cylc_message_started -cylc message -p CUSTOM "cheesy peas" -""" + cylc__job__wait_cylc_message_started + cylc message -p CUSTOM "cheesy peas" + """ [[[events]]] custom handlers = checkargs workflow=%(workflow)s job_id=%(job_id)s event=%(event)s point=%(point)s name=%(name)s try_num=%(try_num)s submit_num=%(submit_num)s id=%(id)s job_runner_name=%(job_runner_name)s message=%(message)s fish=%(fish)s title=%(title)s URL=%(URL)s workflow_title=%(workflow_title)s workflow_size=%(workflow_size)s submit_time=%(submit_time)s start_time=%(start_time)s finish_time=%(finish_time)s platform_name=%(platform_name)s [[[meta]]] diff --git a/tests/flakyfunctional/events/39-task-event-template-all/reference.log b/tests/flakyfunctional/events/39-task-event-template-all/reference.log index a81da7549af..08fe5d5558a 100644 --- a/tests/flakyfunctional/events/39-task-event-template-all/reference.log +++ b/tests/flakyfunctional/events/39-task-event-template-all/reference.log @@ -1,3 +1,3 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] +1/foo -triggered off [] diff --git a/tests/flakyfunctional/events/44-timeout.t b/tests/flakyfunctional/events/44-timeout.t index 72b356d00b1..1b94f7626c5 100755 --- a/tests/flakyfunctional/events/44-timeout.t +++ b/tests/flakyfunctional/events/44-timeout.t @@ -37,7 +37,7 @@ workflow_run_ok "${TEST_NAME_BASE}-run" \ sed -e 's/^.* \([EW]\)/\1/' "${WORKFLOW_RUN_DIR}/log/workflow/log" >'log' contains_ok 'log' <<__END__ -ERROR - [(('event-handler-00', 'started'), 1) cmd] sleeper.sh foo.1 +ERROR - [(('event-handler-00', 'started'), 1) cmd] sleeper.sh 1/foo ${LOG_INDENT}[(('event-handler-00', 'started'), 1) ret_code] -9 ${LOG_INDENT}[(('event-handler-00', 'started'), 1) err] killed on timeout (PT10S) WARNING - 1/foo/01 ('event-handler-00', 'started') failed diff --git a/tests/flakyfunctional/execution-time-limit/00-background/flow.cylc b/tests/flakyfunctional/execution-time-limit/00-background/flow.cylc index 057ba682d55..86f43d4c445 100644 --- a/tests/flakyfunctional/execution-time-limit/00-background/flow.cylc +++ b/tests/flakyfunctional/execution-time-limit/00-background/flow.cylc @@ -6,7 +6,7 @@ abort on stall timeout = True stall timeout = PT0S inactivity timeout = PT2M - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] diff --git a/tests/flakyfunctional/execution-time-limit/00-background/reference.log b/tests/flakyfunctional/execution-time-limit/00-background/reference.log index a81da7549af..08fe5d5558a 100644 --- a/tests/flakyfunctional/execution-time-limit/00-background/reference.log +++ b/tests/flakyfunctional/execution-time-limit/00-background/reference.log @@ -1,3 +1,3 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] +1/foo -triggered off [] diff --git a/tests/flakyfunctional/execution-time-limit/04-poll/reference.log b/tests/flakyfunctional/execution-time-limit/04-poll/reference.log index a82ef0c3424..3754564d016 100644 --- a/tests/flakyfunctional/execution-time-limit/04-poll/reference.log +++ b/tests/flakyfunctional/execution-time-limit/04-poll/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -foo.1 -triggered off [] +1/foo -triggered off [] +1/foo -triggered off [] diff --git a/tests/flakyfunctional/hold-release/14-hold-kill/flow.cylc b/tests/flakyfunctional/hold-release/14-hold-kill/flow.cylc index 11e652b85dc..032be80e90e 100644 --- a/tests/flakyfunctional/hold-release/14-hold-kill/flow.cylc +++ b/tests/flakyfunctional/hold-release/14-hold-kill/flow.cylc @@ -7,9 +7,9 @@ [[killer]] script = """ echo '# killing "sleeper"' - cylc kill "${CYLC_WORKFLOW_ID}" "sleeper.1" + cylc kill "${CYLC_WORKFLOW_ID}//1/sleeper" cylc__job__poll_grep_workflow_log -E \ - 'sleeper\.1 waiting\(held\) .* job killed' + '1/sleeper\ waiting\(held\) .* job killed' sleep 10 # sleep, should still be held after 10 seconds cylc dump -s -t "${CYLC_WORKFLOW_ID}" >'cylc-dump.out' @@ -17,7 +17,7 @@ 1, killer, running, unheld, not-queued, not-runahead 1, sleeper, waiting, held, not-queued, not-runahead __OUT__ - cylc release "${CYLC_WORKFLOW_ID}" "sleeper.1" + cylc release "${CYLC_WORKFLOW_ID}//1/sleeper" """ [[sleeper]] script = """ diff --git a/tests/flakyfunctional/hold-release/14-hold-kill/reference.log b/tests/flakyfunctional/hold-release/14-hold-kill/reference.log index 9a8570ec5ad..2906c359225 100644 --- a/tests/flakyfunctional/hold-release/14-hold-kill/reference.log +++ b/tests/flakyfunctional/hold-release/14-hold-kill/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -sleeper.1 -triggered off [] -killer.1 -triggered off ['sleeper.1'] -sleeper.1 -triggered off [] +1/sleeper -triggered off [] +1/killer -triggered off ['1/sleeper'] +1/sleeper -triggered off [] diff --git a/tests/flakyfunctional/hold-release/15-hold-after/flow.cylc b/tests/flakyfunctional/hold-release/15-hold-after/flow.cylc index 132f32390dd..71cb8d14b25 100644 --- a/tests/flakyfunctional/hold-release/15-hold-after/flow.cylc +++ b/tests/flakyfunctional/hold-release/15-hold-after/flow.cylc @@ -23,7 +23,7 @@ script = cylc hold --after '20140101T12' "${CYLC_WORKFLOW_ID}" [[stopper]] script = """ - cylc__job__poll_grep_workflow_log -E 'bar\.20140101T1200Z .* \(received\)succeeded' + cylc__job__poll_grep_workflow_log -E '20140101T1200Z/bar .* \(received\)succeeded' cylc stop "${CYLC_WORKFLOW_ID}" """ [[[job]]] diff --git a/tests/flakyfunctional/hold-release/15-hold-after/reference.log b/tests/flakyfunctional/hold-release/15-hold-after/reference.log index 3b3d11ba932..47ff906c6ac 100644 --- a/tests/flakyfunctional/hold-release/15-hold-after/reference.log +++ b/tests/flakyfunctional/hold-release/15-hold-after/reference.log @@ -1,8 +1,8 @@ Initial point: 20140101T0000Z Final point: 20140104T0000Z -holdafter.20140101T0000Z -triggered off [] -stopper.20140101T0000Z] -triggered off [] -foo.20140101T0000Z -triggered off ['foo.20131231T1200Z', 'holdafter.20140101T0000Z'] -foo.20140101T1200Z -triggered off ['foo.20140101T0000Z'] -bar.20140101T0000Z -triggered off ['foo.20140101T0000Z'] -bar.20140101T1200Z -triggered off ['foo.20140101T1200Z'] +20140101T0000Z/holdafter -triggered off [] +20140101T0000Z/stopper -triggered off [] +20140101T0000Z/foo -triggered off ['20131231T1200Z/foo', '20140101T0000Z/holdafter'] +20140101T1200Z/foo -triggered off ['20140101T0000Z/foo'] +20140101T0000Z/bar -triggered off ['20140101T0000Z/foo'] +20140101T1200Z/bar -triggered off ['20140101T1200Z/foo'] diff --git a/tests/flakyfunctional/integer-cycling/00-satellite/reference.log b/tests/flakyfunctional/integer-cycling/00-satellite/reference.log index ebdde048dd1..b4030bf4984 100644 --- a/tests/flakyfunctional/integer-cycling/00-satellite/reference.log +++ b/tests/flakyfunctional/integer-cycling/00-satellite/reference.log @@ -1,17 +1,17 @@ Initial point: 1 Final point: 3 -prep.1 -triggered off [] -get_data.1 -triggered off ['get_data.0', 'prep.1'] -satsim.1 -triggered off ['prep.1'] -get_data.2 -triggered off ['get_data.1'] -proc1.1 -triggered off ['get_data.1'] -proc2.1 -triggered off ['proc1.1'] -get_data.3 -triggered off ['get_data.2'] -proc1.2 -triggered off ['get_data.2'] -products.1 -triggered off ['proc2.1'] -proc1.3 -triggered off ['get_data.3'] -proc2.2 -triggered off ['proc1.2'] -proc2.3 -triggered off ['proc1.3'] -products.2 -triggered off ['proc2.2'] -products.3 -triggered off ['proc2.3'] -collate.3 -triggered off ['products.3'] +1/prep -triggered off [] +1/get_data -triggered off ['0/get_data', '1/prep'] +1/satsim -triggered off ['1/prep'] +2/get_data -triggered off ['1/get_data'] +1/proc1 -triggered off ['1/get_data'] +1/proc2 -triggered off ['1/proc1'] +3/get_data -triggered off ['2/get_data'] +2/proc1 -triggered off ['2/get_data'] +1/products -triggered off ['1/proc2'] +3/proc1 -triggered off ['3/get_data'] +2/proc2 -triggered off ['2/proc1'] +3/proc2 -triggered off ['3/proc1'] +2/products -triggered off ['2/proc2'] +3/products -triggered off ['3/proc2'] +3/collate -triggered off ['3/products'] diff --git a/tests/flakyfunctional/job-submission/05-activity-log.t b/tests/flakyfunctional/job-submission/05-activity-log.t index 5626bcb1831..4c077111f41 100755 --- a/tests/flakyfunctional/job-submission/05-activity-log.t +++ b/tests/flakyfunctional/job-submission/05-activity-log.t @@ -31,8 +31,7 @@ grep_ok '\[jobs-submit ret_code\] 0' "${T1_ACTIVITY_LOG}" grep_ok '\[jobs-kill ret_code\] 1' "${T1_ACTIVITY_LOG}" grep_ok '\[jobs-kill out\] [^|]*|1/t1/01|1' "${T1_ACTIVITY_LOG}" grep_ok '\[jobs-poll out\] [^|]*|1/t1/01|{"job_runner_name": "background", "job_id": "[^\"]*", "job_runner_exit_polled": 1, "time_submit_exit": "[^\"]*", "time_run": "[^\"]*"}' "${T1_ACTIVITY_LOG}" -grep_ok "\\[(('event-handler-00', 'failed'), 1) out\\] failed ${WORKFLOW_NAME} \ -t1\\.1 job failed" "${T1_ACTIVITY_LOG}" +grep_ok "\[(('event-handler-00', 'failed'), 1) out\] failed .*/05-activity-log 1/t1 job failed" "${T1_ACTIVITY_LOG}" #------------------------------------------------------------------------------- purge exit diff --git a/tests/flakyfunctional/job-submission/05-activity-log/flow.cylc b/tests/flakyfunctional/job-submission/05-activity-log/flow.cylc index 9a59156082f..043227d70cb 100644 --- a/tests/flakyfunctional/job-submission/05-activity-log/flow.cylc +++ b/tests/flakyfunctional/job-submission/05-activity-log/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] @@ -19,9 +19,9 @@ failed handlers = echo [[t2]] script = """ - cylc kill "${CYLC_WORKFLOW_ID}" 't1' + cylc kill "${CYLC_WORKFLOW_ID}//*/t1" sleep 1 - cylc poll "${CYLC_WORKFLOW_ID}" 't1' + cylc poll "${CYLC_WORKFLOW_ID}//*/t1" sleep 1 cylc shutdown "${CYLC_WORKFLOW_ID}" """ diff --git a/tests/flakyfunctional/job-submission/05-activity-log/reference.log b/tests/flakyfunctional/job-submission/05-activity-log/reference.log index 4921173c44d..c5802d782d2 100644 --- a/tests/flakyfunctional/job-submission/05-activity-log/reference.log +++ b/tests/flakyfunctional/job-submission/05-activity-log/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -t1.1 -triggered off [] -t2.1 -triggered off ['t1.1'] +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/flakyfunctional/modes/03-dummy-env/reference.log b/tests/flakyfunctional/modes/03-dummy-env/reference.log index e10239a575f..a9c12b1b14c 100644 --- a/tests/flakyfunctional/modes/03-dummy-env/reference.log +++ b/tests/flakyfunctional/modes/03-dummy-env/reference.log @@ -1,3 +1,3 @@ Initial point: 1 Final point: 1 -oxygas.1 -triggered off [] +1/oxygas -triggered off [] diff --git a/tests/flakyfunctional/restart/14-multicycle/bin/ctb-select-task-states b/tests/flakyfunctional/restart/14-multicycle/bin/ctb-select-task-states index b51e46a000c..a90b2ca0925 100755 --- a/tests/flakyfunctional/restart/14-multicycle/bin/ctb-select-task-states +++ b/tests/flakyfunctional/restart/14-multicycle/bin/ctb-select-task-states @@ -1,7 +1,7 @@ #!/usr/bin/env bash # THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. # Copyright (C) NIWA & British Crown (Met Office) & Contributors. -# +# # 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 diff --git a/tests/flakyfunctional/restart/21-task-elapsed.t b/tests/flakyfunctional/restart/21-task-elapsed.t index 7f6f597c99e..dee98a254cd 100755 --- a/tests/flakyfunctional/restart/21-task-elapsed.t +++ b/tests/flakyfunctional/restart/21-task-elapsed.t @@ -28,10 +28,10 @@ import sys data = ast.literal_eval(open(sys.argv[1]).read()) keys = list( - f"{task['name']}.{task['cyclePoint']}" + f"{task['cyclePoint']}/{task['name']}" for task in data['taskProxies'] ) -if keys != ["t1.2031", "t2.2031"]: +if keys != ["2031/t1", "2031/t2"]: sys.exit(keys) for datum in data['tasks']: assert isinstance(datum['meanElapsedTime'], float) diff --git a/tests/flakyfunctional/restart/21-task-elapsed/reference.log b/tests/flakyfunctional/restart/21-task-elapsed/reference.log index 0b667ab539c..01f1ce953b7 100644 --- a/tests/flakyfunctional/restart/21-task-elapsed/reference.log +++ b/tests/flakyfunctional/restart/21-task-elapsed/reference.log @@ -1,5 +1,5 @@ Initial point: 2016 Final point: 2020 -t1.2018 -triggered off ['t1.2017'] -t1.2019 -triggered off ['t1.2018'] -t1.2020 -triggered off ['t1.2019'] +2018/t1 -triggered off ['2017/t1'] +2019/t1 -triggered off ['2018/t1'] +2020/t1 -triggered off ['2019/t1'] diff --git a/tests/flakyfunctional/restart/46-stop-clock-time.t b/tests/flakyfunctional/restart/46-stop-clock-time.t index 591f51ac422..aff7941c79c 100644 --- a/tests/flakyfunctional/restart/46-stop-clock-time.t +++ b/tests/flakyfunctional/restart/46-stop-clock-time.t @@ -29,8 +29,8 @@ set_test_number 6 # Event should look like this: # Start workflow -# At t1.1, set stop clock time to 60 seconds ahead -# At t2.1, stop workflow +# At 1/t1, set stop clock time to 60 seconds ahead +# At 1/t2, stop workflow # Restart # Workflow runs to stop clock time, reset stop clock time init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' diff --git a/tests/flakyfunctional/xtriggers/01-workflow_state.t b/tests/flakyfunctional/xtriggers/01-workflow_state.t index dd9245b892e..a7fd82a9a2a 100644 --- a/tests/flakyfunctional/xtriggers/01-workflow_state.t +++ b/tests/flakyfunctional/xtriggers/01-workflow_state.t @@ -44,7 +44,7 @@ workflow_run_fail "${TEST_NAME}" \ WORKFLOW_LOG="$(cylc cat-log -m 'p' "${WORKFLOW_NAME}")" grep_ok 'WARNING - inactivity timer timed out after PT10S' "${WORKFLOW_LOG}" -# ... with foo.2016 succeeded and FAM.2016 waiting. +# ... with 2016/foo succeeded and 2016/FAM waiting. cylc workflow-state -p '2016' "${WORKFLOW_NAME}" >'workflow_state.out' contains_ok 'workflow_state.out' << __END__ foo, 2016, succeeded @@ -54,7 +54,7 @@ f2, 2016, waiting __END__ # Check broadcast of xtrigger outputs to dependent tasks. -JOB_LOG="$(cylc cat-log -f 'j' -m 'p' "${WORKFLOW_NAME}" 'f1.2015')" +JOB_LOG="$(cylc cat-log -f 'j' -m 'p' "${WORKFLOW_NAME}//2015/f1")" contains_ok "${JOB_LOG}" << __END__ upstream_task="foo" upstream_point="2015" @@ -70,17 +70,17 @@ __END__ # set' ('+') and later '... INFO - Broadcast cancelled:' ('-') line, where we # use as a test case an arbitrary task where such setting & cancellation occurs: contains_ok "${WORKFLOW_LOG}" << __LOG_BROADCASTS__ -${LOG_INDENT}+ [f1.2015] [environment]upstream_workflow=${WORKFLOW_NAME_UPSTREAM} -${LOG_INDENT}+ [f1.2015] [environment]upstream_task=foo -${LOG_INDENT}+ [f1.2015] [environment]upstream_point=2015 -${LOG_INDENT}+ [f1.2015] [environment]upstream_offset=None -${LOG_INDENT}+ [f1.2015] [environment]upstream_status=succeeded -${LOG_INDENT}+ [f1.2015] [environment]upstream_message=data ready -${LOG_INDENT}- [f1.2015] [environment]upstream_workflow=${WORKFLOW_NAME_UPSTREAM} -${LOG_INDENT}- [f1.2015] [environment]upstream_task=foo -${LOG_INDENT}- [f1.2015] [environment]upstream_point=2015 -${LOG_INDENT}- [f1.2015] [environment]upstream_status=succeeded -${LOG_INDENT}- [f1.2015] [environment]upstream_message=data ready +${LOG_INDENT}+ [2015/f1] [environment]upstream_workflow=${WORKFLOW_NAME_UPSTREAM} +${LOG_INDENT}+ [2015/f1] [environment]upstream_task=foo +${LOG_INDENT}+ [2015/f1] [environment]upstream_point=2015 +${LOG_INDENT}+ [2015/f1] [environment]upstream_offset=None +${LOG_INDENT}+ [2015/f1] [environment]upstream_status=succeeded +${LOG_INDENT}+ [2015/f1] [environment]upstream_message=data ready +${LOG_INDENT}- [2015/f1] [environment]upstream_workflow=${WORKFLOW_NAME_UPSTREAM} +${LOG_INDENT}- [2015/f1] [environment]upstream_task=foo +${LOG_INDENT}- [2015/f1] [environment]upstream_point=2015 +${LOG_INDENT}- [2015/f1] [environment]upstream_status=succeeded +${LOG_INDENT}- [2015/f1] [environment]upstream_message=data ready __LOG_BROADCASTS__ # ... and 2) in the DB. TEST_NAME="${TEST_NAME_BASE}-check-broadcast-in-db" diff --git a/tests/functional/api-workflow-info/00-get-graph-raw-1.t b/tests/functional/api-workflow-info/00-get-graph-raw-1.t index bb0640cac25..e4d232af16a 100644 --- a/tests/functional/api-workflow-info/00-get-graph-raw-1.t +++ b/tests/functional/api-workflow-info/00-get-graph-raw-1.t @@ -35,22 +35,22 @@ cmp_ok "${WORKFLOW_RUN_DIR}/ctb-get-graph-raw.out" <<'__OUT__' [ [ [ - "t1.1", + "1/t1", null, null, false, false ], [ - "t1.1", - "T.1", + "1/t1", + "1/T", null, false, false ], [ - "t1.1", - "T.1", + "1/t1", + "1/T", null, false, false diff --git a/tests/functional/api-workflow-info/00-get-graph-raw-1/reference.log b/tests/functional/api-workflow-info/00-get-graph-raw-1/reference.log index 6ed973c9a40..84ce468908d 100644 --- a/tests/functional/api-workflow-info/00-get-graph-raw-1/reference.log +++ b/tests/functional/api-workflow-info/00-get-graph-raw-1/reference.log @@ -1,5 +1,5 @@ 2013/09/30 16:48:11 INFO - Initial point: 1 2013/09/30 16:48:11 INFO - Final point: 1 -2013/09/30 16:48:11 DEBUG - t1.1 -triggered off [] -2013/09/30 16:48:11 DEBUG - t2.1 -triggered off ['t1.1'] -2013/09/30 16:48:16 DEBUG - t3.1 -triggered off ['t1.1'] +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] +1/t3 -triggered off ['1/t1'] diff --git a/tests/functional/api-workflow-info/01-get-graph-raw-2.t b/tests/functional/api-workflow-info/01-get-graph-raw-2.t index 4e91376d8b5..82b9a166187 100644 --- a/tests/functional/api-workflow-info/01-get-graph-raw-2.t +++ b/tests/functional/api-workflow-info/01-get-graph-raw-2.t @@ -36,15 +36,15 @@ cmp_json "${TEST_NAME_BASE}-out" \ [ [ [ - "t1.2020", + "2020/t1", null, null, false, false ], [ - "t1.2020", - "t1.2021", + "2020/t1", + "2021/t1", null, false, false diff --git a/tests/functional/api-workflow-info/01-get-graph-raw-2/reference.log b/tests/functional/api-workflow-info/01-get-graph-raw-2/reference.log index a682ae20253..0141897db32 100644 --- a/tests/functional/api-workflow-info/01-get-graph-raw-2/reference.log +++ b/tests/functional/api-workflow-info/01-get-graph-raw-2/reference.log @@ -1,4 +1,4 @@ Initial point: 2020 Final point: 2021 -t1.2020 -triggered off ['t1.2019'] -t1.2021 -triggered off ['t1.2020'] +2020/t1 -triggered off ['2019/t1'] +2021/t1 -triggered off ['2020/t1'] diff --git a/tests/functional/api-workflow-info/02-get-graph-raw-3.t b/tests/functional/api-workflow-info/02-get-graph-raw-3.t index 4e91376d8b5..82b9a166187 100644 --- a/tests/functional/api-workflow-info/02-get-graph-raw-3.t +++ b/tests/functional/api-workflow-info/02-get-graph-raw-3.t @@ -36,15 +36,15 @@ cmp_json "${TEST_NAME_BASE}-out" \ [ [ [ - "t1.2020", + "2020/t1", null, null, false, false ], [ - "t1.2020", - "t1.2021", + "2020/t1", + "2021/t1", null, false, false diff --git a/tests/functional/api-workflow-info/02-get-graph-raw-3/reference.log b/tests/functional/api-workflow-info/02-get-graph-raw-3/reference.log index a682ae20253..0141897db32 100644 --- a/tests/functional/api-workflow-info/02-get-graph-raw-3/reference.log +++ b/tests/functional/api-workflow-info/02-get-graph-raw-3/reference.log @@ -1,4 +1,4 @@ Initial point: 2020 Final point: 2021 -t1.2020 -triggered off ['t1.2019'] -t1.2021 -triggered off ['t1.2020'] +2020/t1 -triggered off ['2019/t1'] +2021/t1 -triggered off ['2020/t1'] diff --git a/tests/functional/api-workflow-info/03-get-graph-raw-4.t b/tests/functional/api-workflow-info/03-get-graph-raw-4.t index 536cbd1c235..8fa263e4f05 100644 --- a/tests/functional/api-workflow-info/03-get-graph-raw-4.t +++ b/tests/functional/api-workflow-info/03-get-graph-raw-4.t @@ -36,15 +36,15 @@ cmp_json "${TEST_NAME_BASE}-out" \ [ [ [ - "t1.20200202T0000Z", + "20200202T0000Z/t1", null, null, false, false ], [ - "t1.20200202T0000Z", - "t1.20200203T0000Z", + "20200202T0000Z/t1", + "20200203T0000Z/t1", null, false, false diff --git a/tests/functional/api-workflow-info/03-get-graph-raw-4/reference.log b/tests/functional/api-workflow-info/03-get-graph-raw-4/reference.log index a89c415c52f..0933c42c610 100644 --- a/tests/functional/api-workflow-info/03-get-graph-raw-4/reference.log +++ b/tests/functional/api-workflow-info/03-get-graph-raw-4/reference.log @@ -1,4 +1,4 @@ Initial point: 20200202T0000Z Final point: 20200203T0000Z -t1.20200202T0000Z -triggered off ['t1.20200201T0000Z'] -t1.20200203T0000Z -triggered off ['t1.20200202T0000Z'] +20200202T0000Z/t1 -triggered off ['20200201T0000Z/t1'] +20200203T0000Z/t1 -triggered off ['20200202T0000Z/t1'] diff --git a/tests/functional/authentication/00-shared-fs.t b/tests/functional/authentication/00-shared-fs.t index 00a033e16e9..6a6ad561e85 100755 --- a/tests/functional/authentication/00-shared-fs.t +++ b/tests/functional/authentication/00-shared-fs.t @@ -41,13 +41,13 @@ WORKFLOW_LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" # Note: double poll existence of workflow log on workflow host and then localhost to # avoid any issues with unstable mounting of the shared file system. poll ssh -oBatchMode=yes -n "${CYLC_TEST_HOST}" test -e "${WORKFLOW_LOG}" -poll_grep_workflow_log -E 't1\.19700101T0000Z submitted .* => running' -poll_grep_workflow_log -E 't1\.19700101T0000Z running .* => failed' +poll_grep_workflow_log -E '19700101T0000Z/t1 submitted .* => running' +poll_grep_workflow_log -E '19700101T0000Z/t1 running .* => failed' run_ok "${TEST_NAME_BASE}-broadcast" \ cylc broadcast -n 't1' -s '[environment]CYLC_TEST_VAR_FOO=foo' "${WORKFLOW_NAME}" run_ok "${TEST_NAME_BASE}-trigger" \ - cylc trigger "${WORKFLOW_NAME}" 't1.19700101T0000Z' + cylc trigger "${WORKFLOW_NAME}//19700101T0000Z/t1" if wait "${WORKFLOW_PID}"; then ok "${TEST_NAME_BASE}-run" diff --git a/tests/functional/authentication/00-shared-fs/flow.cylc b/tests/functional/authentication/00-shared-fs/flow.cylc index a91acf6551f..b51c925b996 100644 --- a/tests/functional/authentication/00-shared-fs/flow.cylc +++ b/tests/functional/authentication/00-shared-fs/flow.cylc @@ -4,7 +4,7 @@ [[events]] abort on inactivity timeout = True inactivity timeout = P1M - expected task failures = t1.19700101T0000Z + expected task failures = 19700101T0000Z/t1 [scheduling] initial cycle point=1970 final cycle point=1970 diff --git a/tests/functional/authentication/00-shared-fs/reference.log b/tests/functional/authentication/00-shared-fs/reference.log index 7a5d93d1e90..cfdb78e5cf7 100644 --- a/tests/functional/authentication/00-shared-fs/reference.log +++ b/tests/functional/authentication/00-shared-fs/reference.log @@ -1,4 +1,4 @@ -2015-12-18T10:58:39Z INFO - Initial point: 19700101T0000Z -2015-12-18T10:58:39Z INFO - Final point: 19700101T0000Z -2015-12-18T10:58:39Z DEBUG - t1.19700101T0000Z -triggered off [] -2015-12-18T10:59:14Z DEBUG - t1.19700101T0000Z -triggered off [] +Initial point: 19700101T0000Z +Final point: 19700101T0000Z +19700101T0000Z/t1 -triggered off [] +19700101T0000Z/t1 -triggered off [] diff --git a/tests/functional/authentication/01-remote-workflow-same-name/reference.log b/tests/functional/authentication/01-remote-workflow-same-name/reference.log index 6a83f9cb987..3e3e0fcad00 100644 --- a/tests/functional/authentication/01-remote-workflow-same-name/reference.log +++ b/tests/functional/authentication/01-remote-workflow-same-name/reference.log @@ -1,3 +1,3 @@ -2015-12-18T10:58:39Z INFO - Initial point: 19700101T0000Z -2015-12-18T10:58:39Z INFO - Final point: 19700101T0000Z -2015-12-18T10:58:39Z DEBUG - t1.19700101T0000Z -triggered off [] +Initial point: 19700101T0000Z +Final point: 19700101T0000Z +19700101T0000Z/t1 -triggered off [] diff --git a/tests/functional/broadcast/00-simple.t b/tests/functional/broadcast/00-simple.t index a47faed1d77..4b37aefe37f 100755 --- a/tests/functional/broadcast/00-simple.t +++ b/tests/functional/broadcast/00-simple.t @@ -22,7 +22,6 @@ set_test_number 5 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" -# Debug mode not needed here (and set-x w/ XTRACEFD broken some bash versions) workflow_run_ok "${TEST_NAME_BASE}-run" \ cylc play --no-detach --reference-test "${WORKFLOW_NAME}" sort "${WORKFLOW_RUN_DIR}/share/broadcast.log" >'broadcast.log.sorted' diff --git a/tests/functional/broadcast/00-simple/expected-prep.out b/tests/functional/broadcast/00-simple/expected-prep.out index 5d230dfd174..3e8994dc1c4 100644 --- a/tests/functional/broadcast/00-simple/expected-prep.out +++ b/tests/functional/broadcast/00-simple/expected-prep.out @@ -1,31 +1,31 @@ Broadcast set: -+ [root.*] [environment]BCAST=ROOT ++ [*/root] [environment]BCAST=ROOT Broadcast set: -+ [foo.20100808T00] [environment]BCAST=FOO ++ [20100808T00/foo] [environment]BCAST=FOO Broadcast set: -+ [bar.*] [environment]BCAST=BAR ++ [*/bar] [environment]BCAST=BAR Broadcast set: -+ [baz.20100809T00] [environment]BCAST=BAZ ++ [20100809T00/baz] [environment]BCAST=BAZ Broadcast set: -+ [qux.20100809T00] [environment]BCAST=QUX ++ [20100809T00/qux] [environment]BCAST=QUX Broadcast cancelled: -- [qux.20100809T00] [environment]BCAST=QUX +- [20100809T00/qux] [environment]BCAST=QUX Broadcast set: -+ [wibble.*] [environment]BCAST=WIBBLE ++ [*/wibble] [environment]BCAST=WIBBLE Broadcast cancelled: -- [wibble.*] [environment]BCAST=WIBBLE +- [*/wibble] [environment]BCAST=WIBBLE Broadcast set: -+ [ENS.*] [environment]BCAST=ENS ++ [*/ENS] [environment]BCAST=ENS Broadcast set: -+ [ENS1.*] [environment]BCAST=ENS1 ++ [*/ENS1] [environment]BCAST=ENS1 Broadcast set: -+ [m2.20100809T00] [environment]BCAST=M2 ++ [20100809T00/m2] [environment]BCAST=M2 Broadcast set: -+ [m7.*] [environment]BCAST=M7 ++ [*/m7] [environment]BCAST=M7 Broadcast set: -+ [m8.*] [environment]BCAST=M8 ++ [*/m8] [environment]BCAST=M8 Broadcast set: -+ [m9.*] [environment]BCAST=M9 ++ [*/m9] [environment]BCAST=M9 * |-ENS | `-environment diff --git a/tests/functional/broadcast/00-simple/flow.cylc b/tests/functional/broadcast/00-simple/flow.cylc index 7ddf5586748..4396e4d9889 100644 --- a/tests/functional/broadcast/00-simple/flow.cylc +++ b/tests/functional/broadcast/00-simple/flow.cylc @@ -1,13 +1,12 @@ [meta] title = "test workflow for broadcast functionality" - description = """ -The initial prep task in this workflow broadcasts an environment variable -"BCAST" to various cycles and namespaces, then each task writes its cycle -time, name, and its value of BCAST to a special log file. Finally, the -shutdown event handler compares the broadcast log file with a previously -generated reference version. - """ + The initial prep task in this workflow broadcasts an environment variable + "BCAST" to various cycles and namespaces, then each task writes its cycle + time, name, and its value of BCAST to a special log file. Finally, the + shutdown event handler compares the broadcast log file with a previously + generated reference version. + """ [scheduler] cycle point format = %Y%m%dT%H @@ -26,6 +25,7 @@ generated reference version. # cycle automatically EXPIRES before the workflow shuts down: wobble[-P1D] => wobble """ + [runtime] [[root]] pre-script = "echo $CYLC_TASK_CYCLE_POINT $CYLC_TASK_NAME BCAST is $BCAST | tee -a $BCASTLOG" @@ -37,52 +37,52 @@ generated reference version. [[prep]] pre-script = "rm -f $BCASTLOG $PREPLOG" script = """ -set +x -{ - # broadcast to all cycles and namespaces: - cylc broadcast -s "[environment]BCAST = ROOT" $CYLC_WORKFLOW_ID - # broadcast to foo.20100808T00: - cylc broadcast -p 20100808T00 -n foo -s "[environment]BCAST = FOO" $CYLC_WORKFLOW_ID - # broadcast to bar at all cycles: - cylc broadcast -n bar -s "[environment]BCAST = BAR" $CYLC_WORKFLOW_ID - # broadcast to baz at 20100809T00: - cylc broadcast -n baz -p 20100809T00 -s "[environment]BCAST = BAZ" $CYLC_WORKFLOW_ID - # broadcast to qux at 20100809T00, then cancel it: - cylc broadcast -n qux -p 20100809T00 -s "[environment]BCAST = QUX" $CYLC_WORKFLOW_ID - cylc broadcast -n qux -p 20100809T00 --cancel "[environment]BCAST" $CYLC_WORKFLOW_ID - # broadcast to wibble at all cycles, then clear it: - cylc broadcast -n wibble -s "[environment]BCAST = WIBBLE" $CYLC_WORKFLOW_ID - cylc broadcast -n wibble --clear $CYLC_WORKFLOW_ID - # broadcast to all members of ENS, all cycles: - cylc broadcast -n ENS -s "[environment]BCAST = ENS" $CYLC_WORKFLOW_ID - # broadcast to all members of ENS1, all cycles: - cylc broadcast -n ENS1 -s "[environment]BCAST = ENS1" $CYLC_WORKFLOW_ID - # broadcast to a single member m2 of ENS1, in 20100809T00: - cylc broadcast -n m2 -p 20100809T00 -s "[environment]BCAST = M2" $CYLC_WORKFLOW_ID - # cancel broadcast to m4 of ENS1, in 20100809T00 (will not work): - ! cylc broadcast -n m4 -p 20100809T00 --cancel "[environment]BCAST" $CYLC_WORKFLOW_ID - # cancel broadcast to m5 of ENS1 at all cycles (will not work): - ! cylc broadcast -n m5 --cancel "[environment]BCAST" $CYLC_WORKFLOW_ID - # clear broadcast to m6 of ENS1 at all cycles (will not work): - ! cylc broadcast -n m6 --clear $CYLC_WORKFLOW_ID - # clear, then reset, broadcast to m7 of ENS1 at all cycles: - ! cylc broadcast -n m7 --clear $CYLC_WORKFLOW_ID - cylc broadcast -n m7 -s "[environment]BCAST = M7" $CYLC_WORKFLOW_ID - # reset broadcast to m8 of ENS1 at 20100809T00 - cylc broadcast -n m8 -s "[environment]BCAST = M8" $CYLC_WORKFLOW_ID - # reset broadcast to m9 of ENS1 at all cycles - cylc broadcast -n m9 -s "[environment]BCAST = M9" $CYLC_WORKFLOW_ID - # clear broadcast for ENS3 (will not work): - ! cylc broadcast -n ENS3 --clear $CYLC_WORKFLOW_ID -} 1>${PREPLOG}.out 2>${PREPLOG}.err -""" + set +x + { + # broadcast to all cycles and namespaces: + cylc broadcast -s "[environment]BCAST = ROOT" $CYLC_WORKFLOW_ID + # broadcast to 20100808T00/foo: + cylc broadcast -p 20100808T00 -n foo -s "[environment]BCAST = FOO" $CYLC_WORKFLOW_ID + # broadcast to bar at all cycles: + cylc broadcast -n bar -s "[environment]BCAST = BAR" $CYLC_WORKFLOW_ID + # broadcast to baz at 20100809T00: + cylc broadcast -n baz -p 20100809T00 -s "[environment]BCAST = BAZ" $CYLC_WORKFLOW_ID + # broadcast to qux at 20100809T00, then cancel it: + cylc broadcast -n qux -p 20100809T00 -s "[environment]BCAST = QUX" $CYLC_WORKFLOW_ID + cylc broadcast -n qux -p 20100809T00 --cancel "[environment]BCAST" $CYLC_WORKFLOW_ID + # broadcast to wibble at all cycles, then clear it: + cylc broadcast -n wibble -s "[environment]BCAST = WIBBLE" $CYLC_WORKFLOW_ID + cylc broadcast -n wibble --clear $CYLC_WORKFLOW_ID + # broadcast to all members of ENS, all cycles: + cylc broadcast -n ENS -s "[environment]BCAST = ENS" $CYLC_WORKFLOW_ID + # broadcast to all members of ENS1, all cycles: + cylc broadcast -n ENS1 -s "[environment]BCAST = ENS1" $CYLC_WORKFLOW_ID + # broadcast to a single member m2 of ENS1, in 20100809T00: + cylc broadcast -n m2 -p 20100809T00 -s "[environment]BCAST = M2" $CYLC_WORKFLOW_ID + # cancel broadcast to m4 of ENS1, in 20100809T00 (will not work): + ! cylc broadcast -n m4 -p 20100809T00 --cancel "[environment]BCAST" $CYLC_WORKFLOW_ID + # cancel broadcast to m5 of ENS1 at all cycles (will not work): + ! cylc broadcast -n m5 --cancel "[environment]BCAST" $CYLC_WORKFLOW_ID + # clear broadcast to m6 of ENS1 at all cycles (will not work): + ! cylc broadcast -n m6 --clear $CYLC_WORKFLOW_ID + # clear, then reset, broadcast to m7 of ENS1 at all cycles: + ! cylc broadcast -n m7 --clear $CYLC_WORKFLOW_ID + cylc broadcast -n m7 -s "[environment]BCAST = M7" $CYLC_WORKFLOW_ID + # reset broadcast to m8 of ENS1 at 20100809T00 + cylc broadcast -n m8 -s "[environment]BCAST = M8" $CYLC_WORKFLOW_ID + # reset broadcast to m9 of ENS1 at all cycles + cylc broadcast -n m9 -s "[environment]BCAST = M9" $CYLC_WORKFLOW_ID + # clear broadcast for ENS3 (will not work): + ! cylc broadcast -n ENS3 --clear $CYLC_WORKFLOW_ID + } 1>${PREPLOG}.out 2>${PREPLOG}.err + """ [[check]] # Check that the broadcasts performed by the previous task were # recorded properly by the scheduler (doing this in another task # gives time for the datastore to update broadcast data). script = """ # list the result to prep task stdout: - cylc bcast --display $CYLC_WORKFLOW_ID \ + cylc broadcast --display $CYLC_WORKFLOW_ID \ 1>>${PREPLOG}.out 2>>${PREPLOG}.err set -x sed -i '/DEBUG -/d' ${PREPLOG}.out @@ -109,7 +109,7 @@ set +x inherit = ENS3 [[wobble]] script = """ -if [[ "${CYLC_TASK_CYCLE_POINT}" == "20100809T00" ]]; then - sleep 5 -fi + if [[ "${CYLC_TASK_CYCLE_POINT}" == "20100809T00" ]]; then + sleep 5 + fi """ diff --git a/tests/functional/broadcast/00-simple/reference.log b/tests/functional/broadcast/00-simple/reference.log index 60acd2109a8..9f9d090095e 100644 --- a/tests/functional/broadcast/00-simple/reference.log +++ b/tests/functional/broadcast/00-simple/reference.log @@ -1,38 +1,38 @@ Initial point: 20100808T00 Final point: 20100809T00 -prep.20100808T00 -triggered off [] -foo.20100808T00 -triggered off ['prep.20100808T00'] -check.20100808T00 -triggered off ['prep.20100808T00'] -bar.20100808T00 -triggered off ['foo.20100808T00'] -qux.20100808T00 -triggered off ['foo.20100808T00'] -baz.20100808T00 -triggered off ['foo.20100808T00'] -wibble.20100808T00 -triggered off ['foo.20100808T00'] -foo.20100809T00 -triggered off [] -m2.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m8.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m5.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m4.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m7.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m6.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m1.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m3.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -n1.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -m9.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -o1.20100808T00 -triggered off ['bar.20100808T00', 'baz.20100808T00', 'qux.20100808T00', 'wibble.20100808T00'] -bar.20100809T00 -triggered off ['foo.20100809T00'] -qux.20100809T00 -triggered off ['foo.20100809T00'] -baz.20100809T00 -triggered off ['foo.20100809T00'] -wibble.20100809T00 -triggered off ['foo.20100809T00'] -wobble.20100808T00 -triggered off ['m1.20100808T00', 'm2.20100808T00', 'm3.20100808T00', 'm4.20100808T00', 'm5.20100808T00', 'm6.20100808T00', 'm7.20100808T00', 'm8.20100808T00', 'm9.20100808T00', 'n1.20100808T00', 'o1.20100808T00', 'wobble.20100807T00'] -m2.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m8.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m5.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m4.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m7.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m6.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m1.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -n1.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m3.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -m9.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -o1.20100809T00 -triggered off ['bar.20100809T00', 'baz.20100809T00', 'qux.20100809T00', 'wibble.20100809T00'] -wobble.20100809T00 -triggered off ['m1.20100809T00', 'm2.20100809T00', 'm3.20100809T00', 'm4.20100809T00', 'm5.20100809T00', 'm6.20100809T00', 'm7.20100809T00', 'm8.20100809T00', 'm9.20100809T00', 'n1.20100809T00', 'o1.20100809T00', 'wobble.20100808T00'] +20100808T00/prep -triggered off [] +20100808T00/foo -triggered off ['20100808T00/prep'] +20100808T00/check -triggered off ['20100808T00/prep'] +20100808T00/bar -triggered off ['20100808T00/foo'] +20100808T00/qux -triggered off ['20100808T00/foo'] +20100808T00/baz -triggered off ['20100808T00/foo'] +20100808T00/wibble -triggered off ['20100808T00/foo'] +20100809T00/foo -triggered off [] +20100808T00/m1 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m2 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m3 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m4 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m5 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m6 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m7 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m8 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/m9 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/n1 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100808T00/o1 -triggered off ['20100808T00/bar', '20100808T00/baz', '20100808T00/qux', '20100808T00/wibble'] +20100809T00/bar -triggered off ['20100809T00/foo'] +20100809T00/qux -triggered off ['20100809T00/foo'] +20100809T00/baz -triggered off ['20100809T00/foo'] +20100809T00/wibble -triggered off ['20100809T00/foo'] +20100808T00/wobble -triggered off ['20100807T00/wobble', '20100808T00/m1', '20100808T00/m2', '20100808T00/m3', '20100808T00/m4', '20100808T00/m5', '20100808T00/m6', '20100808T00/m7', '20100808T00/m8', '20100808T00/m9', '20100808T00/n1', '20100808T00/o1'] +20100809T00/m2 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m8 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m5 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m4 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m7 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m6 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m1 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/n1 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/o1 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m3 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/m9 -triggered off ['20100809T00/bar', '20100809T00/baz', '20100809T00/qux', '20100809T00/wibble'] +20100809T00/wobble -triggered off ['20100808T00/wobble', '20100809T00/m1', '20100809T00/m2', '20100809T00/m3', '20100809T00/m4', '20100809T00/m5', '20100809T00/m6', '20100809T00/m7', '20100809T00/m8', '20100809T00/m9', '20100809T00/n1', '20100809T00/o1'] diff --git a/tests/functional/broadcast/02-inherit/reference.log b/tests/functional/broadcast/02-inherit/reference.log index 86b5929c17e..0750ba16cc6 100644 --- a/tests/functional/broadcast/02-inherit/reference.log +++ b/tests/functional/broadcast/02-inherit/reference.log @@ -1,5 +1,5 @@ -2014/02/10 16:32:16 INFO - Initial point: 20140101T00 -2014/02/10 16:32:16 INFO - Final point: 20140101T00 -2014/02/10 16:32:16 DEBUG - broadcast_all.20140101T00 -triggered off [] -2014/02/10 16:32:21 DEBUG - broadcast_tag.20140101T00 -triggered off ['broadcast_all.20140101T00'] -2014/02/10 16:32:24 DEBUG - t1.20140101T00 -triggered off ['broadcast_tag.20140101T00'] +Initial point: 20140101T00 +Final point: 20140101T00 +20140101T00/broadcast_all -triggered off [] +20140101T00/broadcast_tag -triggered off ['20140101T00/broadcast_all'] +20140101T00/t1 -triggered off ['20140101T00/broadcast_tag'] diff --git a/tests/functional/broadcast/03-expire/flow.cylc b/tests/functional/broadcast/03-expire/flow.cylc index 76380a7622a..0fbe6ed55b6 100644 --- a/tests/functional/broadcast/03-expire/flow.cylc +++ b/tests/functional/broadcast/03-expire/flow.cylc @@ -1,61 +1,64 @@ [meta] title=broadcast expire description=Test broadcast expire option + [scheduler] UTC mode = True + [scheduling] initial cycle point = 2020 final cycle point = 2025 [[graph]] P5Y=""" -broadcast => t1 => broadcast-expire => t2 -t2[-P5Y] => broadcast-expire -""" + broadcast => t1 => broadcast-expire => t2 + t2[-P5Y] => broadcast-expire + """ + [runtime] [[broadcast]] - script=""" -cylc broadcast \ - -s '[environment]FABRIC=Wool' \ - -s "[environment]ORGANISM=sheep" \ - -p "${CYLC_TASK_CYCLE_POINT}" \ - -n 'F1' \ - "${CYLC_WORKFLOW_ID}" \ - | tee 'broadcast.out' -""" - post-script=""" -diff -u - 'broadcast.out' <<__OUT__ -Broadcast set: -+ [F1.${CYLC_TASK_CYCLE_POINT}] [environment]FABRIC=Wool -+ [F1.${CYLC_TASK_CYCLE_POINT}] [environment]ORGANISM=sheep -__OUT__ -""" + script = """ + cylc broadcast \ + -s '[environment]FABRIC=Wool' \ + -s "[environment]ORGANISM=sheep" \ + -p "${CYLC_TASK_CYCLE_POINT}" \ + -n 'F1' \ + "${CYLC_WORKFLOW_ID}" \ + | tee 'broadcast.out' + """ + post-script = """ + diff -u - 'broadcast.out' <<__OUT__ + Broadcast set: + + [${CYLC_TASK_CYCLE_POINT}/F1] [environment]FABRIC=Wool + + [${CYLC_TASK_CYCLE_POINT}/F1] [environment]ORGANISM=sheep + __OUT__ + """ [[broadcast-expire]] - script=""" -NEXT_CYCLE_POINT=$(cylc cycletime --offset=P5Y) -cylc broadcast --expire="${NEXT_CYCLE_POINT}" "${CYLC_WORKFLOW_ID}" \ - | tee 'broadcast.out' -""" - post-script=""" -diff -u - 'broadcast.out' <<__OUT__ -Broadcast cancelled: -- [F1.${CYLC_TASK_CYCLE_POINT}] [environment]FABRIC=Wool -- [F1.${CYLC_TASK_CYCLE_POINT}] [environment]ORGANISM=sheep -__OUT__ -""" + script = """ + NEXT_CYCLE_POINT=$(cylc cycletime --offset=P5Y) + cylc broadcast --expire="${NEXT_CYCLE_POINT}" "${CYLC_WORKFLOW_ID}" \ + | tee 'broadcast.out' + """ + post-script = """ + diff -u - 'broadcast.out' <<__OUT__ + Broadcast cancelled: + - [${CYLC_TASK_CYCLE_POINT}/F1] [environment]FABRIC=Wool + - [${CYLC_TASK_CYCLE_POINT}/F1] [environment]ORGANISM=sheep + __OUT__ + """ [[F1]] script = """ -echo "${FABRIC} is from ${ORGANISM}." | tee 'echo.out' -""" + echo "${FABRIC} is from ${ORGANISM}." | tee 'echo.out' + """ [[[environment]]] FABRIC=Silk ORGANISM=silk worm [[t1]] inherit=F1 post-script=""" -diff -u - 'echo.out' <<<'Wool is from sheep.' -""" + diff -u - 'echo.out' <<<'Wool is from sheep.' + """ [[t2]] inherit=F1 post-script=""" -diff -u - 'echo.out' <<<'Silk is from silk worm.' -""" + diff -u - 'echo.out' <<<'Silk is from silk worm.' + """ diff --git a/tests/functional/broadcast/03-expire/reference.log b/tests/functional/broadcast/03-expire/reference.log index 726a94676ac..b44d9d43a40 100644 --- a/tests/functional/broadcast/03-expire/reference.log +++ b/tests/functional/broadcast/03-expire/reference.log @@ -1,10 +1,10 @@ Initial point: 20200101T0000Z Final point: 20250101T0000Z -broadcast.20200101T0000Z -triggered off [] -broadcast.20250101T0000Z -triggered off [] -t1.20200101T0000Z -triggered off ['broadcast.20200101T0000Z'] -t1.20250101T0000Z -triggered off ['broadcast.20250101T0000Z'] -broadcast-expire.20200101T0000Z -triggered off ['t1.20200101T0000Z', 't2.20150101T0000Z'] -t2.20200101T0000Z -triggered off ['broadcast-expire.20200101T0000Z'] -broadcast-expire.20250101T0000Z -triggered off ['t1.20250101T0000Z', 't2.20200101T0000Z'] -t2.20250101T0000Z -triggered off ['broadcast-expire.20250101T0000Z'] +20200101T0000Z/broadcast -triggered off [] +20250101T0000Z/broadcast -triggered off [] +20200101T0000Z/t1 -triggered off ['20200101T0000Z/broadcast'] +20250101T0000Z/t1 -triggered off ['20250101T0000Z/broadcast'] +20200101T0000Z/broadcast-expire -triggered off ['20150101T0000Z/t2', '20200101T0000Z/t1'] +20200101T0000Z/t2 -triggered off ['20200101T0000Z/broadcast-expire'] +20250101T0000Z/broadcast-expire -triggered off ['20200101T0000Z/t2', '20250101T0000Z/t1'] +20250101T0000Z/t2 -triggered off ['20250101T0000Z/broadcast-expire'] diff --git a/tests/functional/broadcast/04-empty/flow.cylc b/tests/functional/broadcast/04-empty/flow.cylc index 10e6e4069f9..77df50eb3f8 100644 --- a/tests/functional/broadcast/04-empty/flow.cylc +++ b/tests/functional/broadcast/04-empty/flow.cylc @@ -1,23 +1,23 @@ [meta] - title=broadcast empty - description=Test broadcast of an empty string + title = broadcast empty + description = Test broadcast of an empty string [scheduling] [[graph]] - R1="broadcast => t1" + R1 = "broadcast => t1" [runtime] [[broadcast]] - script=""" -cylc broadcast -s '[environment]EMPTY=' -p '1' -n 't1' "${CYLC_WORKFLOW_ID}" \ - | tee 'broadcast.out' -diff -u - 'broadcast.out' <<__OUT__ -Broadcast set: -+ [t1.${CYLC_TASK_CYCLE_POINT}] [environment]EMPTY= -__OUT__ -""" + script = """ + cylc broadcast -s '[environment]EMPTY=' -p '1' -n 't1' "${CYLC_WORKFLOW_ID}" \ + | tee 'broadcast.out' + diff -u - 'broadcast.out' <<__OUT__ + Broadcast set: + + [${CYLC_TASK_CYCLE_POINT}/t1] [environment]EMPTY= + __OUT__ + """ [[t1]] script = """ -printenv EMPTY | tee 'echo.out' -diff -u - 'echo.out' <<<'' -""" + printenv EMPTY | tee 'echo.out' + diff -u - 'echo.out' <<<'' + """ [[[environment]]] EMPTY=full diff --git a/tests/functional/broadcast/04-empty/reference.log b/tests/functional/broadcast/04-empty/reference.log index c1061bfbeff..9105d063bad 100644 --- a/tests/functional/broadcast/04-empty/reference.log +++ b/tests/functional/broadcast/04-empty/reference.log @@ -1,4 +1,4 @@ -2015-04-01T10:18:25+01 INFO - Initial point: 1 -2015-04-01T10:18:25+01 INFO - Final point: 1 -2015-04-01T10:18:25+01 DEBUG - broadcast.1 -triggered off [] -2015-04-01T10:18:29+01 DEBUG - t1.1 -triggered off ['broadcast.1'] +Initial point: 1 +Final point: 1 +1/broadcast -triggered off [] +1/t1 -triggered off ['1/broadcast'] diff --git a/tests/functional/broadcast/07-timeout/reference.log b/tests/functional/broadcast/07-timeout/reference.log index 8b5e8163847..9286dd8bd2f 100644 --- a/tests/functional/broadcast/07-timeout/reference.log +++ b/tests/functional/broadcast/07-timeout/reference.log @@ -1,4 +1,4 @@ -2015-05-01T07:41:43Z INFO - Initial point: 20100808T0000Z -2015-05-01T07:41:43Z INFO - Final point: 20100809T0000Z -2015-05-01T07:41:43Z DEBUG - send_broadcast.20100808T0000Z -triggered off [] -2015-05-01T07:41:58Z DEBUG - timeout.20100808T0000Z -triggered off ['send_broadcast.20100808T0000Z'] +Initial point: 20100808T0000Z +Final point: 20100809T0000Z +20100808T0000Z/send_broadcast -triggered off [] +20100808T0000Z/timeout -triggered off ['20100808T0000Z/send_broadcast'] diff --git a/tests/functional/broadcast/08-space/reference.log b/tests/functional/broadcast/08-space/reference.log index 2302a96f013..90d82ef78a5 100644 --- a/tests/functional/broadcast/08-space/reference.log +++ b/tests/functional/broadcast/08-space/reference.log @@ -1,4 +1,4 @@ -2015-05-01T07:41:43Z INFO - Initial point: 20200202T0000Z -2015-05-01T07:41:43Z INFO - Final point: 20200202T0000Z -2015-05-01T07:41:43Z DEBUG - broadcast.20200202T0000Z -triggered off [] -2015-05-01T07:41:43Z DEBUG - test-env.20200202T0000Z -triggered off ['broadcast.20200202T0000Z'] +Initial point: 20200202T0000Z +Final point: 20200202T0000Z +20200202T0000Z/broadcast -triggered off [] +20200202T0000Z/test-env -triggered off ['20200202T0000Z/broadcast'] diff --git a/tests/functional/broadcast/09-remote/reference.log b/tests/functional/broadcast/09-remote/reference.log index bc640a349c0..6edefa8c255 100644 --- a/tests/functional/broadcast/09-remote/reference.log +++ b/tests/functional/broadcast/09-remote/reference.log @@ -1,4 +1,4 @@ -2016-03-18T15:55:04Z INFO - Initial point: 19990101T0000Z -2016-03-18T15:55:04Z INFO - Final point: 19990101T0000Z -2016-03-18T15:55:04Z DEBUG - t1.19990101T0000Z -triggered off [] -2016-03-18T15:55:08Z DEBUG - t2.19990101T0000Z -triggered off ['t1.19990101T0000Z'] +Initial point: 19990101T0000Z +Final point: 19990101T0000Z +19990101T0000Z/t1 -triggered off [] +19990101T0000Z/t2 -triggered off ['19990101T0000Z/t1'] diff --git a/tests/functional/broadcast/10-file-1/reference.log b/tests/functional/broadcast/10-file-1/reference.log index 53d621a472b..c5802d782d2 100644 --- a/tests/functional/broadcast/10-file-1/reference.log +++ b/tests/functional/broadcast/10-file-1/reference.log @@ -1,4 +1,4 @@ -2017-01-12T14:46:57Z INFO - Initial point: 1 -2017-01-12T14:46:57Z INFO - Final point: 1 -2017-01-12T14:46:57Z DEBUG - t1.1 -triggered off [] -2017-01-12T14:47:00Z DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/broadcast/11-file-2/reference.log b/tests/functional/broadcast/11-file-2/reference.log index 53d621a472b..c5802d782d2 100644 --- a/tests/functional/broadcast/11-file-2/reference.log +++ b/tests/functional/broadcast/11-file-2/reference.log @@ -1,4 +1,4 @@ -2017-01-12T14:46:57Z INFO - Initial point: 1 -2017-01-12T14:46:57Z INFO - Final point: 1 -2017-01-12T14:46:57Z DEBUG - t1.1 -triggered off [] -2017-01-12T14:47:00Z DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/broadcast/12-file-stdin/flow.cylc b/tests/functional/broadcast/12-file-stdin/flow.cylc index 8cbbfdaebe6..647b2021edb 100644 --- a/tests/functional/broadcast/12-file-stdin/flow.cylc +++ b/tests/functional/broadcast/12-file-stdin/flow.cylc @@ -6,8 +6,8 @@ [runtime] [[t1]] script = """ -cylc broadcast -n 't2' -F - "${CYLC_WORKFLOW_ID}" \ - <"${CYLC_WORKFLOW_RUN_DIR}/broadcast.cylc" -""" + cylc broadcast -n 't2' -F - "${CYLC_WORKFLOW_ID}" \ + <"${CYLC_WORKFLOW_RUN_DIR}/broadcast.cylc" + """ [[t2]] script = false diff --git a/tests/functional/broadcast/12-file-stdin/reference.log b/tests/functional/broadcast/12-file-stdin/reference.log index 53d621a472b..c5802d782d2 100644 --- a/tests/functional/broadcast/12-file-stdin/reference.log +++ b/tests/functional/broadcast/12-file-stdin/reference.log @@ -1,4 +1,4 @@ -2017-01-12T14:46:57Z INFO - Initial point: 1 -2017-01-12T14:46:57Z INFO - Final point: 1 -2017-01-12T14:46:57Z DEBUG - t1.1 -triggered off [] -2017-01-12T14:47:00Z DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/broadcast/13-file-cancel/flow.cylc b/tests/functional/broadcast/13-file-cancel/flow.cylc index 586d320a7d4..b446344ada0 100644 --- a/tests/functional/broadcast/13-file-cancel/flow.cylc +++ b/tests/functional/broadcast/13-file-cancel/flow.cylc @@ -6,8 +6,8 @@ [runtime] [[t1]] script = """ -cylc broadcast -n 't2' -F "${CYLC_WORKFLOW_RUN_DIR}/broadcast-1.cylc" "${CYLC_WORKFLOW_ID}" -cylc broadcast -n 't2' -G "${CYLC_WORKFLOW_RUN_DIR}/broadcast-2.cylc" "${CYLC_WORKFLOW_ID}" -""" + cylc broadcast -n 't2' -F "${CYLC_WORKFLOW_RUN_DIR}/broadcast-1.cylc" "${CYLC_WORKFLOW_ID}" + cylc broadcast -n 't2' -G "${CYLC_WORKFLOW_RUN_DIR}/broadcast-2.cylc" "${CYLC_WORKFLOW_ID}" + """ [[t2]] script = false diff --git a/tests/functional/broadcast/13-file-cancel/reference.log b/tests/functional/broadcast/13-file-cancel/reference.log index 53d621a472b..c5802d782d2 100644 --- a/tests/functional/broadcast/13-file-cancel/reference.log +++ b/tests/functional/broadcast/13-file-cancel/reference.log @@ -1,4 +1,4 @@ -2017-01-12T14:46:57Z INFO - Initial point: 1 -2017-01-12T14:46:57Z INFO - Final point: 1 -2017-01-12T14:46:57Z DEBUG - t1.1 -triggered off [] -2017-01-12T14:47:00Z DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/cli/03-set-verbosity.t b/tests/functional/cli/03-set-verbosity.t index c646b960470..c6340e80c3b 100755 --- a/tests/functional/cli/03-set-verbosity.t +++ b/tests/functional/cli/03-set-verbosity.t @@ -19,5 +19,5 @@ . "$(dirname "$0")/test_header" set_test_number 2 run_fail "${TEST_NAME_BASE}" cylc set-verbosity duck quack -grep_ok 'Illegal logging level, quack' "${TEST_NAME_BASE}.stderr" +grep_ok 'UserInputError: Illegal logging level, duck' "${TEST_NAME_BASE}.stderr" exit diff --git a/tests/functional/cli/04-cli-error.t b/tests/functional/cli/04-cli-error.t index 5e12f6330b2..5576e6ae2fa 100644 --- a/tests/functional/cli/04-cli-error.t +++ b/tests/functional/cli/04-cli-error.t @@ -16,7 +16,7 @@ # along with this program. If not, see . #------------------------------------------------------------------------------- -# Get coverage up for some CLI parser errors. +# Get coverage up for some CLI parser errors. . "$(dirname "$0")/test_header" set_test_number 2 @@ -32,9 +32,9 @@ __CONFIG__ # "cylc trigger --meta" requires --reflow TEST_NAME="set-trigger-fail" run_fail "${TEST_NAME}" \ - cylc trigger --meta="the quick brown" "${WORKFLOW_NAME}" foo.1 + cylc trigger --meta="the quick brown" "${WORKFLOW_NAME}//1/foo" contains_ok "${TEST_NAME}".stderr <<__END__ -cylc: error: --meta requires --reflow +UserInputError: --meta requires --reflow __END__ purge diff --git a/tests/functional/clock-trigger-inexact/00-big-offset.t b/tests/functional/clock-trigger-inexact/00-big-offset.t index 1dcbec06528..eb994cafb47 100644 --- a/tests/functional/clock-trigger-inexact/00-big-offset.t +++ b/tests/functional/clock-trigger-inexact/00-big-offset.t @@ -32,7 +32,7 @@ TRIGG_MINU=$(( 10#${START_MINU} + 1)) [[ $START_MINU == 0* ]] && TRIGG_MINU=0${TRIGG_MINU} for NAME in foo bar baz; do - grep_ok "${START_HOUR}:${TRIGG_MINU}.* INFO - \[${NAME}\..*\] => waiting$" log + grep_ok "${START_HOUR}:${TRIGG_MINU}.* INFO - \[.*/${NAME} .*\] => waiting$" log done purge diff --git a/tests/functional/cyclers/21-360_calendar/graph.plain.ref b/tests/functional/cyclers/21-360_calendar/graph.plain.ref index d8b19c66e5c..56dba855ee2 100644 --- a/tests/functional/cyclers/21-360_calendar/graph.plain.ref +++ b/tests/functional/cyclers/21-360_calendar/graph.plain.ref @@ -1,9 +1,9 @@ -edge "foo.20130228T00" "foo.20130229T00" -edge "foo.20130229T00" "foo.20130230T00" -edge "foo.20130230T00" "foo.20130301T00" +edge "20130228T00/foo" "20130229T00/foo" +edge "20130229T00/foo" "20130230T00/foo" +edge "20130230T00/foo" "20130301T00/foo" graph -node "foo.20130228T00" "foo\n20130228T00" -node "foo.20130229T00" "foo\n20130229T00" -node "foo.20130230T00" "foo\n20130230T00" -node "foo.20130301T00" "foo\n20130301T00" +node "20130228T00/foo" "foo\n20130228T00" +node "20130229T00/foo" "foo\n20130229T00" +node "20130230T00/foo" "foo\n20130230T00" +node "20130301T00/foo" "foo\n20130301T00" stop diff --git a/tests/functional/cyclers/21-360_calendar/reference.log b/tests/functional/cyclers/21-360_calendar/reference.log index 5e2d551d144..04bc0b86031 100644 --- a/tests/functional/cyclers/21-360_calendar/reference.log +++ b/tests/functional/cyclers/21-360_calendar/reference.log @@ -1,6 +1,6 @@ Initial point: 20130228T00 Final point: 20130301T00 -foo.20130228T0000Z -triggered off ['foo.20130227T0000Z'] -foo.20130229T0000Z -triggered off ['foo.20130228T0000Z'] -foo.20130230T0000Z -triggered off ['foo.20130229T0000Z'] -foo.20130301T0000Z -triggered off ['foo.20130230T0000Z'] +20130228T0000Z/foo -triggered off ['20130227T0000Z/foo'] +20130229T0000Z/foo -triggered off ['20130228T0000Z/foo'] +20130230T0000Z/foo -triggered off ['20130229T0000Z/foo'] +20130301T0000Z/foo -triggered off ['20130230T0000Z/foo'] diff --git a/tests/functional/cyclers/36-icp_fcp_notation/reference.log b/tests/functional/cyclers/36-icp_fcp_notation/reference.log index 39af43fd0d0..2d1494da8c1 100644 --- a/tests/functional/cyclers/36-icp_fcp_notation/reference.log +++ b/tests/functional/cyclers/36-icp_fcp_notation/reference.log @@ -1,7 +1,7 @@ Initial point: 20160101T0000Z Final point: 20160102T0000Z -foo.20160101T0000Z -triggered off [] -bar.20160101T0000Z -triggered off [] -baz.20160101T0100Z -triggered off [] -boo.20160101T2300Z -triggered off [] -bot.20160102T0000Z -triggered off ['bar.20160101T0000Z', 'baz.20160101T0100Z', 'boo.20160101T2300Z', 'foo.20160101T0000Z'] +20160101T0000Z/foo -triggered off [] +20160101T0000Z/bar -triggered off [] +20160101T0100Z/baz -triggered off [] +20160101T2300Z/boo -triggered off [] +20160102T0000Z/bot -triggered off ['20160101T0000Z/bar', '20160101T0000Z/foo', '20160101T0100Z/baz', '20160101T2300Z/boo'] diff --git a/tests/functional/cyclers/47-icp_fcp_notation.t b/tests/functional/cyclers/47-icp_fcp_notation.t index 7b49c5a2f62..d184fd406ea 100755 --- a/tests/functional/cyclers/47-icp_fcp_notation.t +++ b/tests/functional/cyclers/47-icp_fcp_notation.t @@ -27,10 +27,10 @@ TEST_NAME="${TEST_NAME_BASE}-run" run_ok "${TEST_NAME}" cylc play "${WORKFLOW_NAME}" --debug --no-detach TEST_NAME=${TEST_NAME_BASE}-out -grep_ok "foo\.20160101T0000Z -triggered" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" -grep_ok "bar\.20160101T0000Z -triggered" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" -grep_ok "baz\.20160101T0100Z -triggered" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" -grep_ok "boo\.20160101T2300Z -triggered" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" -grep_ok "bot\.20160102T0000Z -triggered" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" +grep_ok "20160101T0000Z/foo" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" +grep_ok "20160101T0000Z/bar" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" +grep_ok "20160101T0100Z/baz" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" +grep_ok "20160101T2300Z/boo" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" +grep_ok "20160102T0000Z/bot" "$HOME/cylc-run/${WORKFLOW_NAME}/log/workflow/log" #------------------------------------------------------------------------------- purge diff --git a/tests/functional/cyclers/49-365_calendar/graph.plain.ref b/tests/functional/cyclers/49-365_calendar/graph.plain.ref index 6bac47d0492..7f0a0d0706e 100644 --- a/tests/functional/cyclers/49-365_calendar/graph.plain.ref +++ b/tests/functional/cyclers/49-365_calendar/graph.plain.ref @@ -1,5 +1,5 @@ -edge "foo.20120228T00" "foo.20120330T00" +edge "20120228T00/foo" "20120330T00/foo" graph -node "foo.20120228T00" "foo\n20120228T00" -node "foo.20120301T00" "foo\n20120301T00" +node "20120228T00/foo" "foo\n20120228T00" +node "20120301T00/foo" "foo\n20120301T00" stop diff --git a/tests/functional/cyclers/49-365_calendar/reference.log b/tests/functional/cyclers/49-365_calendar/reference.log index 249daa2ff34..920807e835e 100644 --- a/tests/functional/cyclers/49-365_calendar/reference.log +++ b/tests/functional/cyclers/49-365_calendar/reference.log @@ -1,4 +1,4 @@ Initial point: 20120228T00 Final point: 20120301T00 -foo.20120228T0000Z -triggered off ['foo.20120227T0000Z'] -foo.20120301T0000Z -triggered off ['foo.20120228T0000Z'] +20120228T0000Z/foo -triggered off ['20120227T0000Z/foo'] +20120301T0000Z/foo -triggered off ['20120228T0000Z/foo'] diff --git a/tests/functional/cyclers/50-366_calendar/graph.plain.ref b/tests/functional/cyclers/50-366_calendar/graph.plain.ref index e7018e71279..e49811ab8bf 100644 --- a/tests/functional/cyclers/50-366_calendar/graph.plain.ref +++ b/tests/functional/cyclers/50-366_calendar/graph.plain.ref @@ -1,7 +1,7 @@ -edge "foo.20130228T00" "foo.20130229T00" -edge "foo.20130229T00" "foo.20130301T00" +edge "20130228T00/foo" "20130229T00/foo" +edge "20130229T00/foo" "20130301T00/foo" graph -node "foo.20130228T00" "foo\n20130228T00" -node "foo.20130229T00" "foo\n20130229T00" -node "foo.20130301T00" "foo\n20130301T00" +node "20130228T00/foo" "foo\n20130228T00" +node "20130229T00/foo" "foo\n20130229T00" +node "20130301T00/foo" "foo\n20130301T00" stop diff --git a/tests/functional/cyclers/50-366_calendar/reference.log b/tests/functional/cyclers/50-366_calendar/reference.log index 80571d53724..a74c1954ed5 100644 --- a/tests/functional/cyclers/50-366_calendar/reference.log +++ b/tests/functional/cyclers/50-366_calendar/reference.log @@ -1,5 +1,5 @@ Initial point: 20130228T00 Final point: 20130301T00 -foo.20130228T0000Z -triggered off ['foo.20130227T0000Z'] -foo.20130229T0000Z -triggered off ['foo.20130228T0000Z'] -foo.20130301T0000Z -triggered off ['foo.20130229T0000Z'] +20130228T0000Z/foo -triggered off ['20130227T0000Z/foo'] +20130229T0000Z/foo -triggered off ['20130228T0000Z/foo'] +20130301T0000Z/foo -triggered off ['20130229T0000Z/foo'] diff --git a/tests/functional/cyclers/aeon/graph.plain.ref b/tests/functional/cyclers/aeon/graph.plain.ref index d347e766b68..dcd2098bf8e 100644 --- a/tests/functional/cyclers/aeon/graph.plain.ref +++ b/tests/functional/cyclers/aeon/graph.plain.ref @@ -1,24 +1,24 @@ -edge "big_bang.-138000000000229T0530Z" "count_the_aeons.-138000000000229T0530Z" +edge "-138000000000229T0530Z/big_bang" "-138000000000229T0530Z/count_the_aeons" graph -node "big_bang.-138000000000229T0530Z" "big_bang\n-138000000000229T0530Z" -node "count_the_aeons.+002000000000229T0530Z" "count_the_aeons\n+002000000000229T0530Z" -node "count_the_aeons.+012000000000229T0530Z" "count_the_aeons\n+012000000000229T0530Z" -node "count_the_aeons.+022000000000229T0530Z" "count_the_aeons\n+022000000000229T0530Z" -node "count_the_aeons.+032000000000229T0530Z" "count_the_aeons\n+032000000000229T0530Z" -node "count_the_aeons.+042000000000229T0530Z" "count_the_aeons\n+042000000000229T0530Z" -node "count_the_aeons.+052000000000229T0530Z" "count_the_aeons\n+052000000000229T0530Z" -node "count_the_aeons.-008000000000229T0530Z" "count_the_aeons\n-008000000000229T0530Z" -node "count_the_aeons.-018000000000229T0530Z" "count_the_aeons\n-018000000000229T0530Z" -node "count_the_aeons.-028000000000229T0530Z" "count_the_aeons\n-028000000000229T0530Z" -node "count_the_aeons.-038000000000229T0530Z" "count_the_aeons\n-038000000000229T0530Z" -node "count_the_aeons.-048000000000229T0530Z" "count_the_aeons\n-048000000000229T0530Z" -node "count_the_aeons.-058000000000229T0530Z" "count_the_aeons\n-058000000000229T0530Z" -node "count_the_aeons.-068000000000229T0530Z" "count_the_aeons\n-068000000000229T0530Z" -node "count_the_aeons.-078000000000229T0530Z" "count_the_aeons\n-078000000000229T0530Z" -node "count_the_aeons.-088000000000229T0530Z" "count_the_aeons\n-088000000000229T0530Z" -node "count_the_aeons.-098000000000229T0530Z" "count_the_aeons\n-098000000000229T0530Z" -node "count_the_aeons.-108000000000229T0530Z" "count_the_aeons\n-108000000000229T0530Z" -node "count_the_aeons.-118000000000229T0530Z" "count_the_aeons\n-118000000000229T0530Z" -node "count_the_aeons.-128000000000229T0530Z" "count_the_aeons\n-128000000000229T0530Z" -node "count_the_aeons.-138000000000229T0530Z" "count_the_aeons\n-138000000000229T0530Z" +node "+002000000000229T0530Z/count_the_aeons" "count_the_aeons\n+002000000000229T0530Z" +node "+012000000000229T0530Z/count_the_aeons" "count_the_aeons\n+012000000000229T0530Z" +node "+022000000000229T0530Z/count_the_aeons" "count_the_aeons\n+022000000000229T0530Z" +node "+032000000000229T0530Z/count_the_aeons" "count_the_aeons\n+032000000000229T0530Z" +node "+042000000000229T0530Z/count_the_aeons" "count_the_aeons\n+042000000000229T0530Z" +node "+052000000000229T0530Z/count_the_aeons" "count_the_aeons\n+052000000000229T0530Z" +node "-008000000000229T0530Z/count_the_aeons" "count_the_aeons\n-008000000000229T0530Z" +node "-018000000000229T0530Z/count_the_aeons" "count_the_aeons\n-018000000000229T0530Z" +node "-028000000000229T0530Z/count_the_aeons" "count_the_aeons\n-028000000000229T0530Z" +node "-038000000000229T0530Z/count_the_aeons" "count_the_aeons\n-038000000000229T0530Z" +node "-048000000000229T0530Z/count_the_aeons" "count_the_aeons\n-048000000000229T0530Z" +node "-058000000000229T0530Z/count_the_aeons" "count_the_aeons\n-058000000000229T0530Z" +node "-068000000000229T0530Z/count_the_aeons" "count_the_aeons\n-068000000000229T0530Z" +node "-078000000000229T0530Z/count_the_aeons" "count_the_aeons\n-078000000000229T0530Z" +node "-088000000000229T0530Z/count_the_aeons" "count_the_aeons\n-088000000000229T0530Z" +node "-098000000000229T0530Z/count_the_aeons" "count_the_aeons\n-098000000000229T0530Z" +node "-108000000000229T0530Z/count_the_aeons" "count_the_aeons\n-108000000000229T0530Z" +node "-118000000000229T0530Z/count_the_aeons" "count_the_aeons\n-118000000000229T0530Z" +node "-128000000000229T0530Z/count_the_aeons" "count_the_aeons\n-128000000000229T0530Z" +node "-138000000000229T0530Z/big_bang" "big_bang\n-138000000000229T0530Z" +node "-138000000000229T0530Z/count_the_aeons" "count_the_aeons\n-138000000000229T0530Z" stop diff --git a/tests/functional/cyclers/aeon/reference.log b/tests/functional/cyclers/aeon/reference.log index 9d1dc9601d4..8130ea83266 100644 --- a/tests/functional/cyclers/aeon/reference.log +++ b/tests/functional/cyclers/aeon/reference.log @@ -1,23 +1,23 @@ -2014-07-30T16:26:32Z INFO - Initial point: -138000000000229T0530Z -2014-07-30T16:26:32Z INFO - Final point: +054000000001231T2359Z -2014-07-30T16:26:32Z DEBUG - big_bang.-138000000000229T0530Z -triggered off [] -2014-07-30T16:26:35Z DEBUG - count_the_aeons.-138000000000229T0530Z -triggered off ['big_bang.-138000000000229T0530Z'] -2014-07-30T16:26:38Z DEBUG - count_the_aeons.-128000000000229T0530Z -triggered off [] -2014-07-30T16:26:41Z DEBUG - count_the_aeons.-118000000000229T0530Z -triggered off [] -2014-07-30T16:26:44Z DEBUG - count_the_aeons.-108000000000229T0530Z -triggered off [] -2014-07-30T16:26:47Z DEBUG - count_the_aeons.-098000000000229T0530Z -triggered off [] -2014-07-30T16:26:50Z DEBUG - count_the_aeons.-088000000000229T0530Z -triggered off [] -2014-07-30T16:26:53Z DEBUG - count_the_aeons.-078000000000229T0530Z -triggered off [] -2014-07-30T16:26:56Z DEBUG - count_the_aeons.-068000000000229T0530Z -triggered off [] -2014-07-30T16:26:59Z DEBUG - count_the_aeons.-058000000000229T0530Z -triggered off [] -2014-07-30T16:27:02Z DEBUG - count_the_aeons.-048000000000229T0530Z -triggered off [] -2014-07-30T16:27:06Z DEBUG - count_the_aeons.-038000000000229T0530Z -triggered off [] -2014-07-30T16:27:09Z DEBUG - count_the_aeons.-028000000000229T0530Z -triggered off [] -2014-07-30T16:27:12Z DEBUG - count_the_aeons.-018000000000229T0530Z -triggered off [] -2014-07-30T16:27:15Z DEBUG - count_the_aeons.-008000000000229T0530Z -triggered off [] -2014-07-30T16:27:18Z DEBUG - count_the_aeons.+002000000000229T0530Z -triggered off [] -2014-07-30T16:27:21Z DEBUG - count_the_aeons.+012000000000229T0530Z -triggered off [] -2014-07-30T16:27:24Z DEBUG - count_the_aeons.+022000000000229T0530Z -triggered off [] -2014-07-30T16:27:27Z DEBUG - count_the_aeons.+032000000000229T0530Z -triggered off [] -2014-07-30T16:27:30Z DEBUG - count_the_aeons.+042000000000229T0530Z -triggered off [] -2014-07-30T16:27:33Z DEBUG - count_the_aeons.+052000000000229T0530Z -triggered off [] +Initial point: -138000000000229T0530Z +Final point: +054000000001231T2359Z +-138000000000229T0530Z/big_bang -triggered off [] +-138000000000229T0530Z/count_the_aeons -triggered off ['-138000000000229T0530Z/big_bang'] +-128000000000229T0530Z/count_the_aeons -triggered off [] +-118000000000229T0530Z/count_the_aeons -triggered off [] +-108000000000229T0530Z/count_the_aeons -triggered off [] +-098000000000229T0530Z/count_the_aeons -triggered off [] +-088000000000229T0530Z/count_the_aeons -triggered off [] +-078000000000229T0530Z/count_the_aeons -triggered off [] +-068000000000229T0530Z/count_the_aeons -triggered off [] +-058000000000229T0530Z/count_the_aeons -triggered off [] +-048000000000229T0530Z/count_the_aeons -triggered off [] +-038000000000229T0530Z/count_the_aeons -triggered off [] +-028000000000229T0530Z/count_the_aeons -triggered off [] +-018000000000229T0530Z/count_the_aeons -triggered off [] +-008000000000229T0530Z/count_the_aeons -triggered off [] ++002000000000229T0530Z/count_the_aeons -triggered off [] ++012000000000229T0530Z/count_the_aeons -triggered off [] ++022000000000229T0530Z/count_the_aeons -triggered off [] ++032000000000229T0530Z/count_the_aeons -triggered off [] ++042000000000229T0530Z/count_the_aeons -triggered off [] ++052000000000229T0530Z/count_the_aeons -triggered off [] diff --git a/tests/functional/cyclers/daily/graph.plain.ref b/tests/functional/cyclers/daily/graph.plain.ref index 105349764fe..2c59e5df7ff 100644 --- a/tests/functional/cyclers/daily/graph.plain.ref +++ b/tests/functional/cyclers/daily/graph.plain.ref @@ -1,13 +1,13 @@ -edge "foo.20131231T2300Z" "bar.20131231T2300Z" -edge "foo.20131231T2300Z" "foo.20140101T2300Z" -edge "foo.20140101T2300Z" "bar.20140101T2300Z" -edge "foo.20140101T2300Z" "foo.20140102T2300Z" -edge "foo.20140102T2300Z" "bar.20140102T2300Z" +edge "20131231T2300Z/foo" "20131231T2300Z/bar" +edge "20131231T2300Z/foo" "20140101T2300Z/foo" +edge "20140101T2300Z/foo" "20140101T2300Z/bar" +edge "20140101T2300Z/foo" "20140102T2300Z/foo" +edge "20140102T2300Z/foo" "20140102T2300Z/bar" graph -node "bar.20131231T2300Z" "bar\n20131231T2300Z" -node "bar.20140101T2300Z" "bar\n20140101T2300Z" -node "bar.20140102T2300Z" "bar\n20140102T2300Z" -node "foo.20131231T2300Z" "foo\n20131231T2300Z" -node "foo.20140101T2300Z" "foo\n20140101T2300Z" -node "foo.20140102T2300Z" "foo\n20140102T2300Z" +node "20131231T2300Z/bar" "bar\n20131231T2300Z" +node "20131231T2300Z/foo" "foo\n20131231T2300Z" +node "20140101T2300Z/bar" "bar\n20140101T2300Z" +node "20140101T2300Z/foo" "foo\n20140101T2300Z" +node "20140102T2300Z/bar" "bar\n20140102T2300Z" +node "20140102T2300Z/foo" "foo\n20140102T2300Z" stop diff --git a/tests/functional/cyclers/daily/reference.log b/tests/functional/cyclers/daily/reference.log index ca9fe8c6604..11b4a6c39f5 100644 --- a/tests/functional/cyclers/daily/reference.log +++ b/tests/functional/cyclers/daily/reference.log @@ -1,8 +1,8 @@ Initial point: 20131231T2300 Final point: 20140103T0000 -foo.20131231T2300Z -triggered off ['foo.20131230T2300Z'] -bar.20131231T2300Z -triggered off ['foo.20131231T2300Z'] -foo.20140101T2300Z -triggered off ['foo.20131231T2300Z'] -bar.20140101T2300Z -triggered off ['foo.20140101T2300Z'] -foo.20140102T2300Z -triggered off ['foo.20140101T2300Z'] -bar.20140102T2300Z -triggered off ['foo.20140102T2300Z'] +20131231T2300Z/foo -triggered off ['20131230T2300Z/foo'] +20131231T2300Z/bar -triggered off ['20131231T2300Z/foo'] +20140101T2300Z/foo -triggered off ['20131231T2300Z/foo'] +20140101T2300Z/bar -triggered off ['20140101T2300Z/foo'] +20140102T2300Z/foo -triggered off ['20140101T2300Z/foo'] +20140102T2300Z/bar -triggered off ['20140102T2300Z/foo'] diff --git a/tests/functional/cyclers/daily_final/graph.plain.ref b/tests/functional/cyclers/daily_final/graph.plain.ref index c51c296c071..2ef33341497 100644 --- a/tests/functional/cyclers/daily_final/graph.plain.ref +++ b/tests/functional/cyclers/daily_final/graph.plain.ref @@ -1,4 +1,4 @@ graph -node "daily_foo.20140101T0000Z" "daily_foo\n20140101T0000Z" -node "daily_foo.20140102T0000Z" "daily_foo\n20140102T0000Z" +node "20140101T0000Z/daily_foo" "daily_foo\n20140101T0000Z" +node "20140102T0000Z/daily_foo" "daily_foo\n20140102T0000Z" stop diff --git a/tests/functional/cyclers/daily_final/reference.log b/tests/functional/cyclers/daily_final/reference.log index dd9335b5047..90774ed8215 100644 --- a/tests/functional/cyclers/daily_final/reference.log +++ b/tests/functional/cyclers/daily_final/reference.log @@ -1,4 +1,4 @@ -2014-09-29T10:02:03Z INFO - Initial point: 20140101T0000Z -2014-09-29T10:02:03Z INFO - Final point: 20140102T1200Z -2014-09-29T10:02:03Z DEBUG - daily_foo.20140101T0000Z -triggered off [] -2014-09-29T10:02:05Z DEBUG - daily_foo.20140102T0000Z -triggered off [] +Initial point: 20140101T0000Z +Final point: 20140102T1200Z +20140101T0000Z/daily_foo -triggered off [] +20140102T0000Z/daily_foo -triggered off [] diff --git a/tests/functional/cyclers/day_of_week/graph.plain.ref b/tests/functional/cyclers/day_of_week/graph.plain.ref index 4422b90e400..e24830e70c3 100644 --- a/tests/functional/cyclers/day_of_week/graph.plain.ref +++ b/tests/functional/cyclers/day_of_week/graph.plain.ref @@ -1,5 +1,5 @@ graph -node "foo.20100104T0000Z" "foo\n20100104T0000Z" -node "foo.20100111T0000Z" "foo\n20100111T0000Z" -node "foo.20100118T0000Z" "foo\n20100118T0000Z" +node "20100104T0000Z/foo" "foo\n20100104T0000Z" +node "20100111T0000Z/foo" "foo\n20100111T0000Z" +node "20100118T0000Z/foo" "foo\n20100118T0000Z" stop diff --git a/tests/functional/cyclers/day_of_week/reference.log b/tests/functional/cyclers/day_of_week/reference.log index 6327da0818b..457dadd95f4 100644 --- a/tests/functional/cyclers/day_of_week/reference.log +++ b/tests/functional/cyclers/day_of_week/reference.log @@ -1,6 +1,6 @@ -2016-05-27T08:51:51Z INFO - Initial point: 20100101T0000Z -2016-05-27T08:51:51Z INFO - Final point: 20100125T0000Z -2016-05-27T08:51:51Z DEBUG - foo.20100104T0000Z -triggered off [] -2016-05-27T08:51:53Z DEBUG - foo.20100111T0000Z -triggered off [] -2016-05-27T08:51:55Z DEBUG - foo.20100118T0000Z -triggered off [] -2016-05-27T08:51:57Z DEBUG - foo.20100125T0000Z -triggered off [] +Initial point: 20100101T0000Z +Final point: 20100125T0000Z +20100104T0000Z/foo -triggered off [] +20100111T0000Z/foo -triggered off [] +20100118T0000Z/foo -triggered off [] +20100125T0000Z/foo -triggered off [] diff --git a/tests/functional/cyclers/exclusions/graph.plain.ref b/tests/functional/cyclers/exclusions/graph.plain.ref index 0658e1cee73..5f3f44a9b42 100644 --- a/tests/functional/cyclers/exclusions/graph.plain.ref +++ b/tests/functional/cyclers/exclusions/graph.plain.ref @@ -1,26 +1,26 @@ -edge "start.20000101T0000Z" "foo.20000101T0000Z" +edge "20000101T0000Z/start" "20000101T0000Z/foo" graph -node "bar.20000102T0000Z" "bar\n20000102T0000Z" -node "baz.20000101T0000Z" "baz\n20000101T0000Z" -node "baz.20000101T1200Z" "baz\n20000101T1200Z" -node "baz.20000102T0000Z" "baz\n20000102T0000Z" -node "foo.20000101T0000Z" "foo\n20000101T0000Z" -node "nip.20000101T0000Z" "nip\n20000101T0000Z" -node "nip.20000101T1200Z" "nip\n20000101T1200Z" -node "nip.20000101T1800Z" "nip\n20000101T1800Z" -node "nip.20000102T0000Z" "nip\n20000102T0000Z" -node "nip.20000102T0600Z" "nip\n20000102T0600Z" -node "nip.20000102T1200Z" "nip\n20000102T1200Z" -node "pub.20000102T1200Z" "pub\n20000102T1200Z" -node "quux.20000101T0000Z" "quux\n20000101T0000Z" -node "quux.20000101T1000Z" "quux\n20000101T1000Z" -node "quux.20000101T1500Z" "quux\n20000101T1500Z" -node "quux.20000101T2000Z" "quux\n20000101T2000Z" -node "quux.20000102T0100Z" "quux\n20000102T0100Z" -node "quux.20000102T0600Z" "quux\n20000102T0600Z" -node "quux.20000102T1100Z" "quux\n20000102T1100Z" -node "qux.20000101T0000Z" "qux\n20000101T0000Z" -node "qux.20000102T0000Z" "qux\n20000102T0000Z" -node "qux.20000102T1200Z" "qux\n20000102T1200Z" -node "start.20000101T0000Z" "start\n20000101T0000Z" +node "20000101T0000Z/baz" "baz\n20000101T0000Z" +node "20000101T0000Z/foo" "foo\n20000101T0000Z" +node "20000101T0000Z/nip" "nip\n20000101T0000Z" +node "20000101T0000Z/quux" "quux\n20000101T0000Z" +node "20000101T0000Z/qux" "qux\n20000101T0000Z" +node "20000101T0000Z/start" "start\n20000101T0000Z" +node "20000101T1000Z/quux" "quux\n20000101T1000Z" +node "20000101T1200Z/baz" "baz\n20000101T1200Z" +node "20000101T1200Z/nip" "nip\n20000101T1200Z" +node "20000101T1500Z/quux" "quux\n20000101T1500Z" +node "20000101T1800Z/nip" "nip\n20000101T1800Z" +node "20000101T2000Z/quux" "quux\n20000101T2000Z" +node "20000102T0000Z/bar" "bar\n20000102T0000Z" +node "20000102T0000Z/baz" "baz\n20000102T0000Z" +node "20000102T0000Z/nip" "nip\n20000102T0000Z" +node "20000102T0000Z/qux" "qux\n20000102T0000Z" +node "20000102T0100Z/quux" "quux\n20000102T0100Z" +node "20000102T0600Z/nip" "nip\n20000102T0600Z" +node "20000102T0600Z/quux" "quux\n20000102T0600Z" +node "20000102T1100Z/quux" "quux\n20000102T1100Z" +node "20000102T1200Z/nip" "nip\n20000102T1200Z" +node "20000102T1200Z/pub" "pub\n20000102T1200Z" +node "20000102T1200Z/qux" "qux\n20000102T1200Z" stop diff --git a/tests/functional/cyclers/exclusions/reference.log b/tests/functional/cyclers/exclusions/reference.log index 56f49c10deb..da6c6a3fc6d 100644 --- a/tests/functional/cyclers/exclusions/reference.log +++ b/tests/functional/cyclers/exclusions/reference.log @@ -1,25 +1,25 @@ -2017-04-13T11:34:26Z INFO - Initial point: 20000101T0000Z -2017-04-13T11:34:26Z INFO - Final point: 20000102T1200Z -2017-04-13T11:34:26Z DEBUG - quux.20000101T0000Z -triggered off [] -2017-04-13T11:34:26Z DEBUG - start.20000101T0000Z -triggered off [] -2017-04-13T11:34:26Z DEBUG - baz.20000101T0000Z -triggered off [] -2017-04-13T11:34:26Z DEBUG - qux.20000101T0000Z -triggered off [] -2017-04-13T11:34:26Z DEBUG - nip.20000101T0000Z -triggered off [] -2017-04-13T11:34:28Z DEBUG - baz.20000101T1200Z -triggered off [] -2017-04-13T11:34:28Z DEBUG - nip.20000101T1200Z -triggered off [] -2017-04-13T11:34:28Z DEBUG - quux.20000101T1000Z -triggered off [] -2017-04-13T11:34:29Z DEBUG - foo.20000101T0000Z -triggered off ['start.20000101T0000Z'] -2017-04-13T11:34:32Z DEBUG - quux.20000101T1500Z -triggered off [] -2017-04-13T11:34:32Z DEBUG - nip.20000101T1800Z -triggered off [] -2017-04-13T11:34:34Z DEBUG - quux.20000101T2000Z -triggered off [] -2017-04-13T11:34:36Z DEBUG - nip.20000102T0000Z -triggered off [] -2017-04-13T11:34:36Z DEBUG - qux.20000102T0000Z -triggered off [] -2017-04-13T11:34:36Z DEBUG - bar.20000102T0000Z -triggered off [] -2017-04-13T11:34:36Z DEBUG - baz.20000102T0000Z -triggered off [] -2017-04-13T11:34:36Z DEBUG - quux.20000102T0100Z -triggered off [] -2017-04-13T11:34:39Z DEBUG - nip.20000102T0600Z -triggered off [] -2017-04-13T11:34:39Z DEBUG - quux.20000102T0600Z -triggered off [] -2017-04-13T11:34:39Z DEBUG - pub.20000102T1200Z -triggered off [] -2017-04-13T11:34:40Z DEBUG - qux.20000102T1200Z -triggered off [] -2017-04-13T11:34:41Z DEBUG - nip.20000102T1200Z -triggered off [] -2017-04-13T11:34:41Z DEBUG - quux.20000102T1100Z -triggered off [] +Initial point: 20000101T0000Z +Final point: 20000102T1200Z +20000101T0000Z/quux -triggered off [] +20000101T0000Z/start -triggered off [] +20000101T0000Z/baz -triggered off [] +20000101T0000Z/qux -triggered off [] +20000101T0000Z/nip -triggered off [] +20000101T1200Z/baz -triggered off [] +20000101T1200Z/nip -triggered off [] +20000101T1000Z/quux -triggered off [] +20000101T0000Z/foo -triggered off ['20000101T0000Z/start'] +20000101T1500Z/quux -triggered off [] +20000101T1800Z/nip -triggered off [] +20000101T2000Z/quux -triggered off [] +20000102T0000Z/nip -triggered off [] +20000102T0000Z/qux -triggered off [] +20000102T0000Z/bar -triggered off [] +20000102T0000Z/baz -triggered off [] +20000102T0100Z/quux -triggered off [] +20000102T0600Z/nip -triggered off [] +20000102T0600Z/quux -triggered off [] +20000102T1200Z/pub -triggered off [] +20000102T1200Z/qux -triggered off [] +20000102T1200Z/nip -triggered off [] +20000102T1100Z/quux -triggered off [] diff --git a/tests/functional/cyclers/exclusions_advanced/graph.plain.ref b/tests/functional/cyclers/exclusions_advanced/graph.plain.ref index f8a0fd00d72..f69985cba63 100644 --- a/tests/functional/cyclers/exclusions_advanced/graph.plain.ref +++ b/tests/functional/cyclers/exclusions_advanced/graph.plain.ref @@ -1,182 +1,182 @@ -edge "start.20000101T0000Z" "foo.20000101T0000Z" +edge "20000101T0000Z/start" "20000101T0000Z/foo" graph -node "bar.20000102T0000Z" "bar\n20000102T0000Z" -node "baz.20000101T0300Z" "baz\n20000101T0300Z" -node "baz.20000101T0900Z" "baz\n20000101T0900Z" -node "baz.20000101T1500Z" "baz\n20000101T1500Z" -node "baz.20000101T2100Z" "baz\n20000101T2100Z" -node "baz.20000102T0300Z" "baz\n20000102T0300Z" -node "baz.20000102T0900Z" "baz\n20000102T0900Z" -node "bob.20000101T0115Z" "bob\n20000101T0115Z" -node "bob.20000101T0215Z" "bob\n20000101T0215Z" -node "bob.20000101T0415Z" "bob\n20000101T0415Z" -node "bob.20000101T0515Z" "bob\n20000101T0515Z" -node "bob.20000101T0715Z" "bob\n20000101T0715Z" -node "bob.20000101T0815Z" "bob\n20000101T0815Z" -node "bob.20000101T1015Z" "bob\n20000101T1015Z" -node "bob.20000101T1115Z" "bob\n20000101T1115Z" -node "bob.20000101T1315Z" "bob\n20000101T1315Z" -node "bob.20000101T1415Z" "bob\n20000101T1415Z" -node "bob.20000101T1615Z" "bob\n20000101T1615Z" -node "bob.20000101T1715Z" "bob\n20000101T1715Z" -node "bob.20000101T1915Z" "bob\n20000101T1915Z" -node "bob.20000101T2015Z" "bob\n20000101T2015Z" -node "bob.20000101T2215Z" "bob\n20000101T2215Z" -node "bob.20000101T2315Z" "bob\n20000101T2315Z" -node "bob.20000102T0115Z" "bob\n20000102T0115Z" -node "bob.20000102T0215Z" "bob\n20000102T0215Z" -node "bob.20000102T0415Z" "bob\n20000102T0415Z" -node "bob.20000102T0515Z" "bob\n20000102T0515Z" -node "bob.20000102T0715Z" "bob\n20000102T0715Z" -node "bob.20000102T0815Z" "bob\n20000102T0815Z" -node "bob.20000102T1015Z" "bob\n20000102T1015Z" -node "bob.20000102T1115Z" "bob\n20000102T1115Z" -node "dibble.20000101T0000Z" "dibble\n20000101T0000Z" -node "dibble.20000101T0230Z" "dibble\n20000101T0230Z" -node "dibble.20000101T0300Z" "dibble\n20000101T0300Z" -node "dibble.20000101T0600Z" "dibble\n20000101T0600Z" -node "dibble.20000101T1500Z" "dibble\n20000101T1500Z" -node "dibble.20000101T1800Z" "dibble\n20000101T1800Z" -node "dibble.20000101T1945Z" "dibble\n20000101T1945Z" -node "dibble.20000101T2100Z" "dibble\n20000101T2100Z" -node "dibble.20000102T0000Z" "dibble\n20000102T0000Z" -node "dibble.20000102T0230Z" "dibble\n20000102T0230Z" -node "dibble.20000102T0300Z" "dibble\n20000102T0300Z" -node "dibble.20000102T0600Z" "dibble\n20000102T0600Z" -node "foo.20000101T0000Z" "foo\n20000101T0000Z" -node "nip.20000101T0100Z" "nip\n20000101T0100Z" -node "nip.20000101T0200Z" "nip\n20000101T0200Z" -node "nip.20000101T0300Z" "nip\n20000101T0300Z" -node "nip.20000101T0400Z" "nip\n20000101T0400Z" -node "nip.20000101T0500Z" "nip\n20000101T0500Z" -node "nip.20000101T0700Z" "nip\n20000101T0700Z" -node "nip.20000101T0800Z" "nip\n20000101T0800Z" -node "nip.20000101T0900Z" "nip\n20000101T0900Z" -node "nip.20000101T1000Z" "nip\n20000101T1000Z" -node "nip.20000101T1100Z" "nip\n20000101T1100Z" -node "nip.20000101T1300Z" "nip\n20000101T1300Z" -node "nip.20000101T1400Z" "nip\n20000101T1400Z" -node "nip.20000101T1500Z" "nip\n20000101T1500Z" -node "nip.20000101T1600Z" "nip\n20000101T1600Z" -node "nip.20000101T1700Z" "nip\n20000101T1700Z" -node "nip.20000101T1900Z" "nip\n20000101T1900Z" -node "nip.20000101T2000Z" "nip\n20000101T2000Z" -node "nip.20000101T2100Z" "nip\n20000101T2100Z" -node "nip.20000101T2200Z" "nip\n20000101T2200Z" -node "nip.20000101T2300Z" "nip\n20000101T2300Z" -node "nip.20000102T0100Z" "nip\n20000102T0100Z" -node "nip.20000102T0200Z" "nip\n20000102T0200Z" -node "nip.20000102T0300Z" "nip\n20000102T0300Z" -node "nip.20000102T0400Z" "nip\n20000102T0400Z" -node "nip.20000102T0500Z" "nip\n20000102T0500Z" -node "nip.20000102T0700Z" "nip\n20000102T0700Z" -node "nip.20000102T0800Z" "nip\n20000102T0800Z" -node "nip.20000102T0900Z" "nip\n20000102T0900Z" -node "nip.20000102T1000Z" "nip\n20000102T1000Z" -node "nip.20000102T1100Z" "nip\n20000102T1100Z" -node "pub.20000102T1200Z" "pub\n20000102T1200Z" -node "quux.20000101T0030Z" "quux\n20000101T0030Z" -node "quux.20000101T0130Z" "quux\n20000101T0130Z" -node "quux.20000101T0230Z" "quux\n20000101T0230Z" -node "quux.20000101T0330Z" "quux\n20000101T0330Z" -node "quux.20000101T0430Z" "quux\n20000101T0430Z" -node "quux.20000101T0530Z" "quux\n20000101T0530Z" -node "quux.20000101T0630Z" "quux\n20000101T0630Z" -node "quux.20000101T0730Z" "quux\n20000101T0730Z" -node "quux.20000101T0830Z" "quux\n20000101T0830Z" -node "quux.20000101T0930Z" "quux\n20000101T0930Z" -node "quux.20000101T1030Z" "quux\n20000101T1030Z" -node "quux.20000101T1130Z" "quux\n20000101T1130Z" -node "quux.20000101T1230Z" "quux\n20000101T1230Z" -node "quux.20000101T1330Z" "quux\n20000101T1330Z" -node "quux.20000101T1430Z" "quux\n20000101T1430Z" -node "quux.20000101T1530Z" "quux\n20000101T1530Z" -node "quux.20000101T1630Z" "quux\n20000101T1630Z" -node "quux.20000101T1730Z" "quux\n20000101T1730Z" -node "quux.20000101T1830Z" "quux\n20000101T1830Z" -node "quux.20000101T1930Z" "quux\n20000101T1930Z" -node "quux.20000101T2030Z" "quux\n20000101T2030Z" -node "quux.20000101T2130Z" "quux\n20000101T2130Z" -node "quux.20000101T2230Z" "quux\n20000101T2230Z" -node "quux.20000101T2330Z" "quux\n20000101T2330Z" -node "quux.20000102T0030Z" "quux\n20000102T0030Z" -node "quux.20000102T0130Z" "quux\n20000102T0130Z" -node "quux.20000102T0230Z" "quux\n20000102T0230Z" -node "quux.20000102T0330Z" "quux\n20000102T0330Z" -node "quux.20000102T0430Z" "quux\n20000102T0430Z" -node "quux.20000102T0530Z" "quux\n20000102T0530Z" -node "quux.20000102T0630Z" "quux\n20000102T0630Z" -node "quux.20000102T0730Z" "quux\n20000102T0730Z" -node "quux.20000102T0830Z" "quux\n20000102T0830Z" -node "quux.20000102T0930Z" "quux\n20000102T0930Z" -node "quux.20000102T1030Z" "quux\n20000102T1030Z" -node "quux.20000102T1130Z" "quux\n20000102T1130Z" -node "qux.20000101T0000Z" "qux\n20000101T0000Z" -node "qux.20000101T0300Z" "qux\n20000101T0300Z" -node "qux.20000101T0600Z" "qux\n20000101T0600Z" -node "qux.20000101T0900Z" "qux\n20000101T0900Z" -node "qux.20000101T1200Z" "qux\n20000101T1200Z" -node "qux.20000101T1500Z" "qux\n20000101T1500Z" -node "qux.20000101T1800Z" "qux\n20000101T1800Z" -node "qux.20000101T2100Z" "qux\n20000101T2100Z" -node "qux.20000102T0000Z" "qux\n20000102T0000Z" -node "qux.20000102T0300Z" "qux\n20000102T0300Z" -node "qux.20000102T0600Z" "qux\n20000102T0600Z" -node "qux.20000102T0900Z" "qux\n20000102T0900Z" -node "qux.20000102T1200Z" "qux\n20000102T1200Z" -node "start.20000101T0000Z" "start\n20000101T0000Z" -node "toot.20000101T0115Z" "toot\n20000101T0115Z" -node "toot.20000101T0215Z" "toot\n20000101T0215Z" -node "toot.20000101T0415Z" "toot\n20000101T0415Z" -node "toot.20000101T0515Z" "toot\n20000101T0515Z" -node "toot.20000101T0715Z" "toot\n20000101T0715Z" -node "toot.20000101T0815Z" "toot\n20000101T0815Z" -node "toot.20000101T1015Z" "toot\n20000101T1015Z" -node "toot.20000101T1115Z" "toot\n20000101T1115Z" -node "toot.20000101T1315Z" "toot\n20000101T1315Z" -node "toot.20000101T1415Z" "toot\n20000101T1415Z" -node "toot.20000101T1615Z" "toot\n20000101T1615Z" -node "toot.20000101T1715Z" "toot\n20000101T1715Z" -node "toot.20000101T1915Z" "toot\n20000101T1915Z" -node "toot.20000101T2015Z" "toot\n20000101T2015Z" -node "toot.20000101T2215Z" "toot\n20000101T2215Z" -node "toot.20000101T2315Z" "toot\n20000101T2315Z" -node "toot.20000102T0115Z" "toot\n20000102T0115Z" -node "toot.20000102T0215Z" "toot\n20000102T0215Z" -node "toot.20000102T0415Z" "toot\n20000102T0415Z" -node "toot.20000102T0515Z" "toot\n20000102T0515Z" -node "toot.20000102T0715Z" "toot\n20000102T0715Z" -node "toot.20000102T0815Z" "toot\n20000102T0815Z" -node "toot.20000102T1015Z" "toot\n20000102T1015Z" -node "toot.20000102T1115Z" "toot\n20000102T1115Z" -node "wibble.20000101T0100Z" "wibble\n20000101T0100Z" -node "wibble.20000101T0200Z" "wibble\n20000101T0200Z" -node "wibble.20000101T0300Z" "wibble\n20000101T0300Z" -node "wibble.20000101T0400Z" "wibble\n20000101T0400Z" -node "wibble.20000101T0500Z" "wibble\n20000101T0500Z" -node "wibble.20000101T0700Z" "wibble\n20000101T0700Z" -node "wibble.20000101T0800Z" "wibble\n20000101T0800Z" -node "wibble.20000101T0900Z" "wibble\n20000101T0900Z" -node "wibble.20000101T1000Z" "wibble\n20000101T1000Z" -node "wibble.20000101T1100Z" "wibble\n20000101T1100Z" -node "wibble.20000101T1300Z" "wibble\n20000101T1300Z" -node "wibble.20000101T1400Z" "wibble\n20000101T1400Z" -node "wibble.20000101T1500Z" "wibble\n20000101T1500Z" -node "wibble.20000101T1600Z" "wibble\n20000101T1600Z" -node "wibble.20000101T1700Z" "wibble\n20000101T1700Z" -node "wibble.20000101T1900Z" "wibble\n20000101T1900Z" -node "wibble.20000101T2000Z" "wibble\n20000101T2000Z" -node "wibble.20000101T2100Z" "wibble\n20000101T2100Z" -node "wibble.20000101T2200Z" "wibble\n20000101T2200Z" -node "wibble.20000101T2300Z" "wibble\n20000101T2300Z" -node "wibble.20000102T0100Z" "wibble\n20000102T0100Z" -node "wibble.20000102T0200Z" "wibble\n20000102T0200Z" -node "wibble.20000102T0300Z" "wibble\n20000102T0300Z" -node "wibble.20000102T0400Z" "wibble\n20000102T0400Z" -node "wibble.20000102T0500Z" "wibble\n20000102T0500Z" -node "wibble.20000102T0700Z" "wibble\n20000102T0700Z" -node "wibble.20000102T0800Z" "wibble\n20000102T0800Z" -node "wibble.20000102T0900Z" "wibble\n20000102T0900Z" -node "wibble.20000102T1000Z" "wibble\n20000102T1000Z" -node "wibble.20000102T1100Z" "wibble\n20000102T1100Z" +node "20000101T0000Z/dibble" "dibble\n20000101T0000Z" +node "20000101T0000Z/foo" "foo\n20000101T0000Z" +node "20000101T0000Z/qux" "qux\n20000101T0000Z" +node "20000101T0000Z/start" "start\n20000101T0000Z" +node "20000101T0030Z/quux" "quux\n20000101T0030Z" +node "20000101T0100Z/nip" "nip\n20000101T0100Z" +node "20000101T0100Z/wibble" "wibble\n20000101T0100Z" +node "20000101T0115Z/bob" "bob\n20000101T0115Z" +node "20000101T0115Z/toot" "toot\n20000101T0115Z" +node "20000101T0130Z/quux" "quux\n20000101T0130Z" +node "20000101T0200Z/nip" "nip\n20000101T0200Z" +node "20000101T0200Z/wibble" "wibble\n20000101T0200Z" +node "20000101T0215Z/bob" "bob\n20000101T0215Z" +node "20000101T0215Z/toot" "toot\n20000101T0215Z" +node "20000101T0230Z/dibble" "dibble\n20000101T0230Z" +node "20000101T0230Z/quux" "quux\n20000101T0230Z" +node "20000101T0300Z/baz" "baz\n20000101T0300Z" +node "20000101T0300Z/dibble" "dibble\n20000101T0300Z" +node "20000101T0300Z/nip" "nip\n20000101T0300Z" +node "20000101T0300Z/qux" "qux\n20000101T0300Z" +node "20000101T0300Z/wibble" "wibble\n20000101T0300Z" +node "20000101T0330Z/quux" "quux\n20000101T0330Z" +node "20000101T0400Z/nip" "nip\n20000101T0400Z" +node "20000101T0400Z/wibble" "wibble\n20000101T0400Z" +node "20000101T0415Z/bob" "bob\n20000101T0415Z" +node "20000101T0415Z/toot" "toot\n20000101T0415Z" +node "20000101T0430Z/quux" "quux\n20000101T0430Z" +node "20000101T0500Z/nip" "nip\n20000101T0500Z" +node "20000101T0500Z/wibble" "wibble\n20000101T0500Z" +node "20000101T0515Z/bob" "bob\n20000101T0515Z" +node "20000101T0515Z/toot" "toot\n20000101T0515Z" +node "20000101T0530Z/quux" "quux\n20000101T0530Z" +node "20000101T0600Z/dibble" "dibble\n20000101T0600Z" +node "20000101T0600Z/qux" "qux\n20000101T0600Z" +node "20000101T0630Z/quux" "quux\n20000101T0630Z" +node "20000101T0700Z/nip" "nip\n20000101T0700Z" +node "20000101T0700Z/wibble" "wibble\n20000101T0700Z" +node "20000101T0715Z/bob" "bob\n20000101T0715Z" +node "20000101T0715Z/toot" "toot\n20000101T0715Z" +node "20000101T0730Z/quux" "quux\n20000101T0730Z" +node "20000101T0800Z/nip" "nip\n20000101T0800Z" +node "20000101T0800Z/wibble" "wibble\n20000101T0800Z" +node "20000101T0815Z/bob" "bob\n20000101T0815Z" +node "20000101T0815Z/toot" "toot\n20000101T0815Z" +node "20000101T0830Z/quux" "quux\n20000101T0830Z" +node "20000101T0900Z/baz" "baz\n20000101T0900Z" +node "20000101T0900Z/nip" "nip\n20000101T0900Z" +node "20000101T0900Z/qux" "qux\n20000101T0900Z" +node "20000101T0900Z/wibble" "wibble\n20000101T0900Z" +node "20000101T0930Z/quux" "quux\n20000101T0930Z" +node "20000101T1000Z/nip" "nip\n20000101T1000Z" +node "20000101T1000Z/wibble" "wibble\n20000101T1000Z" +node "20000101T1015Z/bob" "bob\n20000101T1015Z" +node "20000101T1015Z/toot" "toot\n20000101T1015Z" +node "20000101T1030Z/quux" "quux\n20000101T1030Z" +node "20000101T1100Z/nip" "nip\n20000101T1100Z" +node "20000101T1100Z/wibble" "wibble\n20000101T1100Z" +node "20000101T1115Z/bob" "bob\n20000101T1115Z" +node "20000101T1115Z/toot" "toot\n20000101T1115Z" +node "20000101T1130Z/quux" "quux\n20000101T1130Z" +node "20000101T1200Z/qux" "qux\n20000101T1200Z" +node "20000101T1230Z/quux" "quux\n20000101T1230Z" +node "20000101T1300Z/nip" "nip\n20000101T1300Z" +node "20000101T1300Z/wibble" "wibble\n20000101T1300Z" +node "20000101T1315Z/bob" "bob\n20000101T1315Z" +node "20000101T1315Z/toot" "toot\n20000101T1315Z" +node "20000101T1330Z/quux" "quux\n20000101T1330Z" +node "20000101T1400Z/nip" "nip\n20000101T1400Z" +node "20000101T1400Z/wibble" "wibble\n20000101T1400Z" +node "20000101T1415Z/bob" "bob\n20000101T1415Z" +node "20000101T1415Z/toot" "toot\n20000101T1415Z" +node "20000101T1430Z/quux" "quux\n20000101T1430Z" +node "20000101T1500Z/baz" "baz\n20000101T1500Z" +node "20000101T1500Z/dibble" "dibble\n20000101T1500Z" +node "20000101T1500Z/nip" "nip\n20000101T1500Z" +node "20000101T1500Z/qux" "qux\n20000101T1500Z" +node "20000101T1500Z/wibble" "wibble\n20000101T1500Z" +node "20000101T1530Z/quux" "quux\n20000101T1530Z" +node "20000101T1600Z/nip" "nip\n20000101T1600Z" +node "20000101T1600Z/wibble" "wibble\n20000101T1600Z" +node "20000101T1615Z/bob" "bob\n20000101T1615Z" +node "20000101T1615Z/toot" "toot\n20000101T1615Z" +node "20000101T1630Z/quux" "quux\n20000101T1630Z" +node "20000101T1700Z/nip" "nip\n20000101T1700Z" +node "20000101T1700Z/wibble" "wibble\n20000101T1700Z" +node "20000101T1715Z/bob" "bob\n20000101T1715Z" +node "20000101T1715Z/toot" "toot\n20000101T1715Z" +node "20000101T1730Z/quux" "quux\n20000101T1730Z" +node "20000101T1800Z/dibble" "dibble\n20000101T1800Z" +node "20000101T1800Z/qux" "qux\n20000101T1800Z" +node "20000101T1830Z/quux" "quux\n20000101T1830Z" +node "20000101T1900Z/nip" "nip\n20000101T1900Z" +node "20000101T1900Z/wibble" "wibble\n20000101T1900Z" +node "20000101T1915Z/bob" "bob\n20000101T1915Z" +node "20000101T1915Z/toot" "toot\n20000101T1915Z" +node "20000101T1930Z/quux" "quux\n20000101T1930Z" +node "20000101T1945Z/dibble" "dibble\n20000101T1945Z" +node "20000101T2000Z/nip" "nip\n20000101T2000Z" +node "20000101T2000Z/wibble" "wibble\n20000101T2000Z" +node "20000101T2015Z/bob" "bob\n20000101T2015Z" +node "20000101T2015Z/toot" "toot\n20000101T2015Z" +node "20000101T2030Z/quux" "quux\n20000101T2030Z" +node "20000101T2100Z/baz" "baz\n20000101T2100Z" +node "20000101T2100Z/dibble" "dibble\n20000101T2100Z" +node "20000101T2100Z/nip" "nip\n20000101T2100Z" +node "20000101T2100Z/qux" "qux\n20000101T2100Z" +node "20000101T2100Z/wibble" "wibble\n20000101T2100Z" +node "20000101T2130Z/quux" "quux\n20000101T2130Z" +node "20000101T2200Z/nip" "nip\n20000101T2200Z" +node "20000101T2200Z/wibble" "wibble\n20000101T2200Z" +node "20000101T2215Z/bob" "bob\n20000101T2215Z" +node "20000101T2215Z/toot" "toot\n20000101T2215Z" +node "20000101T2230Z/quux" "quux\n20000101T2230Z" +node "20000101T2300Z/nip" "nip\n20000101T2300Z" +node "20000101T2300Z/wibble" "wibble\n20000101T2300Z" +node "20000101T2315Z/bob" "bob\n20000101T2315Z" +node "20000101T2315Z/toot" "toot\n20000101T2315Z" +node "20000101T2330Z/quux" "quux\n20000101T2330Z" +node "20000102T0000Z/bar" "bar\n20000102T0000Z" +node "20000102T0000Z/dibble" "dibble\n20000102T0000Z" +node "20000102T0000Z/qux" "qux\n20000102T0000Z" +node "20000102T0030Z/quux" "quux\n20000102T0030Z" +node "20000102T0100Z/nip" "nip\n20000102T0100Z" +node "20000102T0100Z/wibble" "wibble\n20000102T0100Z" +node "20000102T0115Z/bob" "bob\n20000102T0115Z" +node "20000102T0115Z/toot" "toot\n20000102T0115Z" +node "20000102T0130Z/quux" "quux\n20000102T0130Z" +node "20000102T0200Z/nip" "nip\n20000102T0200Z" +node "20000102T0200Z/wibble" "wibble\n20000102T0200Z" +node "20000102T0215Z/bob" "bob\n20000102T0215Z" +node "20000102T0215Z/toot" "toot\n20000102T0215Z" +node "20000102T0230Z/dibble" "dibble\n20000102T0230Z" +node "20000102T0230Z/quux" "quux\n20000102T0230Z" +node "20000102T0300Z/baz" "baz\n20000102T0300Z" +node "20000102T0300Z/dibble" "dibble\n20000102T0300Z" +node "20000102T0300Z/nip" "nip\n20000102T0300Z" +node "20000102T0300Z/qux" "qux\n20000102T0300Z" +node "20000102T0300Z/wibble" "wibble\n20000102T0300Z" +node "20000102T0330Z/quux" "quux\n20000102T0330Z" +node "20000102T0400Z/nip" "nip\n20000102T0400Z" +node "20000102T0400Z/wibble" "wibble\n20000102T0400Z" +node "20000102T0415Z/bob" "bob\n20000102T0415Z" +node "20000102T0415Z/toot" "toot\n20000102T0415Z" +node "20000102T0430Z/quux" "quux\n20000102T0430Z" +node "20000102T0500Z/nip" "nip\n20000102T0500Z" +node "20000102T0500Z/wibble" "wibble\n20000102T0500Z" +node "20000102T0515Z/bob" "bob\n20000102T0515Z" +node "20000102T0515Z/toot" "toot\n20000102T0515Z" +node "20000102T0530Z/quux" "quux\n20000102T0530Z" +node "20000102T0600Z/dibble" "dibble\n20000102T0600Z" +node "20000102T0600Z/qux" "qux\n20000102T0600Z" +node "20000102T0630Z/quux" "quux\n20000102T0630Z" +node "20000102T0700Z/nip" "nip\n20000102T0700Z" +node "20000102T0700Z/wibble" "wibble\n20000102T0700Z" +node "20000102T0715Z/bob" "bob\n20000102T0715Z" +node "20000102T0715Z/toot" "toot\n20000102T0715Z" +node "20000102T0730Z/quux" "quux\n20000102T0730Z" +node "20000102T0800Z/nip" "nip\n20000102T0800Z" +node "20000102T0800Z/wibble" "wibble\n20000102T0800Z" +node "20000102T0815Z/bob" "bob\n20000102T0815Z" +node "20000102T0815Z/toot" "toot\n20000102T0815Z" +node "20000102T0830Z/quux" "quux\n20000102T0830Z" +node "20000102T0900Z/baz" "baz\n20000102T0900Z" +node "20000102T0900Z/nip" "nip\n20000102T0900Z" +node "20000102T0900Z/qux" "qux\n20000102T0900Z" +node "20000102T0900Z/wibble" "wibble\n20000102T0900Z" +node "20000102T0930Z/quux" "quux\n20000102T0930Z" +node "20000102T1000Z/nip" "nip\n20000102T1000Z" +node "20000102T1000Z/wibble" "wibble\n20000102T1000Z" +node "20000102T1015Z/bob" "bob\n20000102T1015Z" +node "20000102T1015Z/toot" "toot\n20000102T1015Z" +node "20000102T1030Z/quux" "quux\n20000102T1030Z" +node "20000102T1100Z/nip" "nip\n20000102T1100Z" +node "20000102T1100Z/wibble" "wibble\n20000102T1100Z" +node "20000102T1115Z/bob" "bob\n20000102T1115Z" +node "20000102T1115Z/toot" "toot\n20000102T1115Z" +node "20000102T1130Z/quux" "quux\n20000102T1130Z" +node "20000102T1200Z/pub" "pub\n20000102T1200Z" +node "20000102T1200Z/qux" "qux\n20000102T1200Z" stop diff --git a/tests/functional/cyclers/exclusions_advanced/reference.log b/tests/functional/cyclers/exclusions_advanced/reference.log index 34c36dcff9c..6c820f49e0d 100644 --- a/tests/functional/cyclers/exclusions_advanced/reference.log +++ b/tests/functional/cyclers/exclusions_advanced/reference.log @@ -1,181 +1,181 @@ -2017-05-22T08:04:04Z INFO - Initial point: 20000101T0000Z -2017-05-22T08:04:04Z INFO - Final point: 20000102T1200Z -2017-05-22T08:04:05Z DEBUG - start.20000101T0000Z -triggered off [] -2017-05-22T08:04:05Z DEBUG - dibble.20000101T0000Z -triggered off [] -2017-05-22T08:04:05Z DEBUG - nip.20000101T0100Z -triggered off [] -2017-05-22T08:04:05Z DEBUG - qux.20000101T0000Z -triggered off [] -2017-05-22T08:04:05Z DEBUG - quux.20000101T0030Z -triggered off [] -2017-05-22T08:04:05Z DEBUG - wibble.20000101T0100Z -triggered off [] -2017-05-22T08:04:09Z DEBUG - foo.20000101T0000Z -triggered off ['start.20000101T0000Z'] -2017-05-22T08:04:12Z DEBUG - nip.20000101T0200Z -triggered off [] -2017-05-22T08:04:12Z DEBUG - bob.20000101T0115Z -triggered off [] -2017-05-22T08:04:12Z DEBUG - quux.20000101T0130Z -triggered off [] -2017-05-22T08:04:12Z DEBUG - wibble.20000101T0200Z -triggered off [] -2017-05-22T08:04:12Z DEBUG - toot.20000101T0115Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - nip.20000101T0300Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - quux.20000101T0230Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - wibble.20000101T0300Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - bob.20000101T0215Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - dibble.20000101T0230Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - toot.20000101T0215Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - qux.20000101T0300Z -triggered off [] -2017-05-22T08:04:15Z DEBUG - baz.20000101T0300Z -triggered off [] -2017-05-22T08:04:17Z DEBUG - dibble.20000101T0300Z -triggered off [] -2017-05-22T08:04:20Z DEBUG - nip.20000101T0400Z -triggered off [] -2017-05-22T08:04:20Z DEBUG - wibble.20000101T0400Z -triggered off [] -2017-05-22T08:04:20Z DEBUG - quux.20000101T0330Z -triggered off [] -2017-05-22T08:04:21Z DEBUG - bob.20000101T0415Z -triggered off [] -2017-05-22T08:04:21Z DEBUG - toot.20000101T0415Z -triggered off [] -2017-05-22T08:04:23Z DEBUG - quux.20000101T0430Z -triggered off [] -2017-05-22T08:04:23Z DEBUG - nip.20000101T0500Z -triggered off [] -2017-05-22T08:04:23Z DEBUG - wibble.20000101T0500Z -triggered off [] -2017-05-22T08:04:24Z DEBUG - bob.20000101T0515Z -triggered off [] -2017-05-22T08:04:24Z DEBUG - toot.20000101T0515Z -triggered off [] -2017-05-22T08:04:26Z DEBUG - quux.20000101T0530Z -triggered off [] -2017-05-22T08:04:26Z DEBUG - dibble.20000101T0600Z -triggered off [] -2017-05-22T08:04:26Z DEBUG - qux.20000101T0600Z -triggered off [] -2017-05-22T08:04:28Z DEBUG - quux.20000101T0630Z -triggered off [] -2017-05-22T08:04:30Z DEBUG - bob.20000101T0715Z -triggered off [] -2017-05-22T08:04:30Z DEBUG - nip.20000101T0700Z -triggered off [] -2017-05-22T08:04:30Z DEBUG - toot.20000101T0715Z -triggered off [] -2017-05-22T08:04:30Z DEBUG - wibble.20000101T0700Z -triggered off [] -2017-05-22T08:04:32Z DEBUG - quux.20000101T0730Z -triggered off [] -2017-05-22T08:04:33Z DEBUG - bob.20000101T0815Z -triggered off [] -2017-05-22T08:04:33Z DEBUG - toot.20000101T0815Z -triggered off [] -2017-05-22T08:04:33Z DEBUG - wibble.20000101T0800Z -triggered off [] -2017-05-22T08:04:33Z DEBUG - nip.20000101T0800Z -triggered off [] -2017-05-22T08:04:35Z DEBUG - quux.20000101T0830Z -triggered off [] -2017-05-22T08:04:36Z DEBUG - wibble.20000101T0900Z -triggered off [] -2017-05-22T08:04:36Z DEBUG - baz.20000101T0900Z -triggered off [] -2017-05-22T08:04:36Z DEBUG - nip.20000101T0900Z -triggered off [] -2017-05-22T08:04:36Z DEBUG - qux.20000101T0900Z -triggered off [] -2017-05-22T08:04:37Z DEBUG - quux.20000101T0930Z -triggered off [] -2017-05-22T08:04:38Z DEBUG - nip.20000101T1000Z -triggered off [] -2017-05-22T08:04:38Z DEBUG - wibble.20000101T1000Z -triggered off [] -2017-05-22T08:04:40Z DEBUG - bob.20000101T1015Z -triggered off [] -2017-05-22T08:04:40Z DEBUG - toot.20000101T1015Z -triggered off [] -2017-05-22T08:04:41Z DEBUG - quux.20000101T1030Z -triggered off [] -2017-05-22T08:04:42Z DEBUG - wibble.20000101T1100Z -triggered off [] -2017-05-22T08:04:42Z DEBUG - nip.20000101T1100Z -triggered off [] -2017-05-22T08:04:43Z DEBUG - bob.20000101T1115Z -triggered off [] -2017-05-22T08:04:43Z DEBUG - toot.20000101T1115Z -triggered off [] -2017-05-22T08:04:44Z DEBUG - quux.20000101T1130Z -triggered off [] -2017-05-22T08:04:45Z DEBUG - qux.20000101T1200Z -triggered off [] -2017-05-22T08:04:46Z DEBUG - quux.20000101T1230Z -triggered off [] -2017-05-22T08:04:47Z DEBUG - nip.20000101T1300Z -triggered off [] -2017-05-22T08:04:47Z DEBUG - wibble.20000101T1300Z -triggered off [] -2017-05-22T08:04:48Z DEBUG - bob.20000101T1315Z -triggered off [] -2017-05-22T08:04:48Z DEBUG - toot.20000101T1315Z -triggered off [] -2017-05-22T08:04:50Z DEBUG - quux.20000101T1330Z -triggered off [] -2017-05-22T08:04:51Z DEBUG - wibble.20000101T1400Z -triggered off [] -2017-05-22T08:04:51Z DEBUG - nip.20000101T1400Z -triggered off [] -2017-05-22T08:04:52Z DEBUG - bob.20000101T1415Z -triggered off [] -2017-05-22T08:04:52Z DEBUG - toot.20000101T1415Z -triggered off [] -2017-05-22T08:04:53Z DEBUG - quux.20000101T1430Z -triggered off [] -2017-05-22T08:04:54Z DEBUG - nip.20000101T1500Z -triggered off [] -2017-05-22T08:04:54Z DEBUG - wibble.20000101T1500Z -triggered off [] -2017-05-22T08:04:54Z DEBUG - baz.20000101T1500Z -triggered off [] -2017-05-22T08:04:54Z DEBUG - dibble.20000101T1500Z -triggered off [] -2017-05-22T08:04:54Z DEBUG - qux.20000101T1500Z -triggered off [] -2017-05-22T08:04:55Z DEBUG - quux.20000101T1530Z -triggered off [] -2017-05-22T08:04:56Z DEBUG - nip.20000101T1600Z -triggered off [] -2017-05-22T08:04:56Z DEBUG - wibble.20000101T1600Z -triggered off [] -2017-05-22T08:04:58Z DEBUG - toot.20000101T1615Z -triggered off [] -2017-05-22T08:04:58Z DEBUG - bob.20000101T1615Z -triggered off [] -2017-05-22T08:04:59Z DEBUG - quux.20000101T1630Z -triggered off [] -2017-05-22T08:05:00Z DEBUG - nip.20000101T1700Z -triggered off [] -2017-05-22T08:05:00Z DEBUG - wibble.20000101T1700Z -triggered off [] -2017-05-22T08:05:01Z DEBUG - bob.20000101T1715Z -triggered off [] -2017-05-22T08:05:01Z DEBUG - toot.20000101T1715Z -triggered off [] -2017-05-22T08:05:02Z DEBUG - quux.20000101T1730Z -triggered off [] -2017-05-22T08:05:03Z DEBUG - dibble.20000101T1800Z -triggered off [] -2017-05-22T08:05:03Z DEBUG - qux.20000101T1800Z -triggered off [] -2017-05-22T08:05:04Z DEBUG - quux.20000101T1830Z -triggered off [] -2017-05-22T08:05:05Z DEBUG - nip.20000101T1900Z -triggered off [] -2017-05-22T08:05:05Z DEBUG - wibble.20000101T1900Z -triggered off [] -2017-05-22T08:05:06Z DEBUG - bob.20000101T1915Z -triggered off [] -2017-05-22T08:05:06Z DEBUG - toot.20000101T1915Z -triggered off [] -2017-05-22T08:05:08Z DEBUG - quux.20000101T1930Z -triggered off [] -2017-05-22T08:05:09Z DEBUG - dibble.20000101T1945Z -triggered off [] -2017-05-22T08:05:10Z DEBUG - wibble.20000101T2000Z -triggered off [] -2017-05-22T08:05:10Z DEBUG - nip.20000101T2000Z -triggered off [] -2017-05-22T08:05:11Z DEBUG - bob.20000101T2015Z -triggered off [] -2017-05-22T08:05:11Z DEBUG - toot.20000101T2015Z -triggered off [] -2017-05-22T08:05:12Z DEBUG - quux.20000101T2030Z -triggered off [] -2017-05-22T08:05:13Z DEBUG - wibble.20000101T2100Z -triggered off [] -2017-05-22T08:05:13Z DEBUG - qux.20000101T2100Z -triggered off [] -2017-05-22T08:05:13Z DEBUG - baz.20000101T2100Z -triggered off [] -2017-05-22T08:05:13Z DEBUG - dibble.20000101T2100Z -triggered off [] -2017-05-22T08:05:13Z DEBUG - nip.20000101T2100Z -triggered off [] -2017-05-22T08:05:14Z DEBUG - quux.20000101T2130Z -triggered off [] -2017-05-22T08:05:16Z DEBUG - nip.20000101T2200Z -triggered off [] -2017-05-22T08:05:16Z DEBUG - wibble.20000101T2200Z -triggered off [] -2017-05-22T08:05:17Z DEBUG - bob.20000101T2215Z -triggered off [] -2017-05-22T08:05:17Z DEBUG - toot.20000101T2215Z -triggered off [] -2017-05-22T08:05:18Z DEBUG - quux.20000101T2230Z -triggered off [] -2017-05-22T08:05:19Z DEBUG - nip.20000101T2300Z -triggered off [] -2017-05-22T08:05:19Z DEBUG - wibble.20000101T2300Z -triggered off [] -2017-05-22T08:05:20Z DEBUG - toot.20000101T2315Z -triggered off [] -2017-05-22T08:05:20Z DEBUG - bob.20000101T2315Z -triggered off [] -2017-05-22T08:05:21Z DEBUG - quux.20000101T2330Z -triggered off [] -2017-05-22T08:05:22Z DEBUG - qux.20000102T0000Z -triggered off [] -2017-05-22T08:05:22Z DEBUG - dibble.20000102T0000Z -triggered off [] -2017-05-22T08:05:22Z DEBUG - bar.20000102T0000Z -triggered off [] -2017-05-22T08:05:23Z DEBUG - quux.20000102T0030Z -triggered off [] -2017-05-22T08:05:24Z DEBUG - nip.20000102T0100Z -triggered off [] -2017-05-22T08:05:24Z DEBUG - wibble.20000102T0100Z -triggered off [] -2017-05-22T08:05:26Z DEBUG - bob.20000102T0115Z -triggered off [] -2017-05-22T08:05:26Z DEBUG - toot.20000102T0115Z -triggered off [] -2017-05-22T08:05:27Z DEBUG - quux.20000102T0130Z -triggered off [] -2017-05-22T08:05:28Z DEBUG - nip.20000102T0200Z -triggered off [] -2017-05-22T08:05:28Z DEBUG - wibble.20000102T0200Z -triggered off [] -2017-05-22T08:05:29Z DEBUG - toot.20000102T0215Z -triggered off [] -2017-05-22T08:05:29Z DEBUG - bob.20000102T0215Z -triggered off [] -2017-05-22T08:05:30Z DEBUG - dibble.20000102T0230Z -triggered off [] -2017-05-22T08:05:30Z DEBUG - quux.20000102T0230Z -triggered off [] -2017-05-22T08:05:31Z DEBUG - baz.20000102T0300Z -triggered off [] -2017-05-22T08:05:31Z DEBUG - qux.20000102T0300Z -triggered off [] -2017-05-22T08:05:31Z DEBUG - nip.20000102T0300Z -triggered off [] -2017-05-22T08:05:31Z DEBUG - wibble.20000102T0300Z -triggered off [] -2017-05-22T08:05:32Z DEBUG - dibble.20000102T0300Z -triggered off [] -2017-05-22T08:05:32Z DEBUG - quux.20000102T0330Z -triggered off [] -2017-05-22T08:05:33Z DEBUG - wibble.20000102T0400Z -triggered off [] -2017-05-22T08:05:33Z DEBUG - nip.20000102T0400Z -triggered off [] -2017-05-22T08:05:36Z DEBUG - bob.20000102T0415Z -triggered off [] -2017-05-22T08:05:36Z DEBUG - quux.20000102T0430Z -triggered off [] -2017-05-22T08:05:36Z DEBUG - toot.20000102T0415Z -triggered off [] -2017-05-22T08:05:37Z DEBUG - nip.20000102T0500Z -triggered off [] -2017-05-22T08:05:37Z DEBUG - wibble.20000102T0500Z -triggered off [] -2017-05-22T08:05:39Z DEBUG - toot.20000102T0515Z -triggered off [] -2017-05-22T08:05:39Z DEBUG - bob.20000102T0515Z -triggered off [] -2017-05-22T08:05:39Z DEBUG - quux.20000102T0530Z -triggered off [] -2017-05-22T08:05:40Z DEBUG - qux.20000102T0600Z -triggered off [] -2017-05-22T08:05:40Z DEBUG - dibble.20000102T0600Z -triggered off [] -2017-05-22T08:05:42Z DEBUG - quux.20000102T0630Z -triggered off [] -2017-05-22T08:05:42Z DEBUG - nip.20000102T0700Z -triggered off [] -2017-05-22T08:05:42Z DEBUG - wibble.20000102T0700Z -triggered off [] -2017-05-22T08:05:43Z DEBUG - bob.20000102T0715Z -triggered off [] -2017-05-22T08:05:43Z DEBUG - toot.20000102T0715Z -triggered off [] -2017-05-22T08:05:46Z DEBUG - wibble.20000102T0800Z -triggered off [] -2017-05-22T08:05:46Z DEBUG - nip.20000102T0800Z -triggered off [] -2017-05-22T08:05:46Z DEBUG - quux.20000102T0730Z -triggered off [] -2017-05-22T08:05:47Z DEBUG - toot.20000102T0815Z -triggered off [] -2017-05-22T08:05:47Z DEBUG - bob.20000102T0815Z -triggered off [] -2017-05-22T08:05:49Z DEBUG - nip.20000102T0900Z -triggered off [] -2017-05-22T08:05:49Z DEBUG - quux.20000102T0830Z -triggered off [] -2017-05-22T08:05:49Z DEBUG - baz.20000102T0900Z -triggered off [] -2017-05-22T08:05:49Z DEBUG - wibble.20000102T0900Z -triggered off [] -2017-05-22T08:05:49Z DEBUG - qux.20000102T0900Z -triggered off [] -2017-05-22T08:05:51Z DEBUG - quux.20000102T0930Z -triggered off [] -2017-05-22T08:05:52Z DEBUG - wibble.20000102T1000Z -triggered off [] -2017-05-22T08:05:52Z DEBUG - nip.20000102T1000Z -triggered off [] -2017-05-22T08:05:52Z DEBUG - toot.20000102T1015Z -triggered off [] -2017-05-22T08:05:52Z DEBUG - bob.20000102T1015Z -triggered off [] -2017-05-22T08:05:55Z DEBUG - quux.20000102T1030Z -triggered off [] -2017-05-22T08:05:56Z DEBUG - toot.20000102T1115Z -triggered off [] -2017-05-22T08:05:56Z DEBUG - bob.20000102T1115Z -triggered off [] -2017-05-22T08:05:56Z DEBUG - nip.20000102T1100Z -triggered off [] -2017-05-22T08:05:56Z DEBUG - pub.20000102T1200Z -triggered off [] -2017-05-22T08:05:56Z DEBUG - wibble.20000102T1100Z -triggered off [] -2017-05-22T08:05:58Z DEBUG - quux.20000102T1130Z -triggered off [] -2017-05-22T08:05:59Z DEBUG - qux.20000102T1200Z -triggered off [] +Initial point: 20000101T0000Z +Final point: 20000102T1200Z +20000101T0000Z/start -triggered off [] +20000101T0000Z/dibble -triggered off [] +20000101T0100Z/nip -triggered off [] +20000101T0000Z/qux -triggered off [] +20000101T0030Z/quux -triggered off [] +20000101T0100Z/wibble -triggered off [] +20000101T0000Z/foo -triggered off ['20000101T0000Z/start'] +20000101T0200Z/nip -triggered off [] +20000101T0115Z/bob -triggered off [] +20000101T0130Z/quux -triggered off [] +20000101T0200Z/wibble -triggered off [] +20000101T0115Z/toot -triggered off [] +20000101T0300Z/nip -triggered off [] +20000101T0230Z/quux -triggered off [] +20000101T0300Z/wibble -triggered off [] +20000101T0215Z/bob -triggered off [] +20000101T0230Z/dibble -triggered off [] +20000101T0215Z/toot -triggered off [] +20000101T0300Z/qux -triggered off [] +20000101T0300Z/baz -triggered off [] +20000101T0300Z/dibble -triggered off [] +20000101T0400Z/nip -triggered off [] +20000101T0400Z/wibble -triggered off [] +20000101T0330Z/quux -triggered off [] +20000101T0415Z/bob -triggered off [] +20000101T0415Z/toot -triggered off [] +20000101T0430Z/quux -triggered off [] +20000101T0500Z/nip -triggered off [] +20000101T0500Z/wibble -triggered off [] +20000101T0515Z/bob -triggered off [] +20000101T0515Z/toot -triggered off [] +20000101T0530Z/quux -triggered off [] +20000101T0600Z/dibble -triggered off [] +20000101T0600Z/qux -triggered off [] +20000101T0630Z/quux -triggered off [] +20000101T0715Z/bob -triggered off [] +20000101T0700Z/nip -triggered off [] +20000101T0715Z/toot -triggered off [] +20000101T0700Z/wibble -triggered off [] +20000101T0730Z/quux -triggered off [] +20000101T0815Z/bob -triggered off [] +20000101T0815Z/toot -triggered off [] +20000101T0800Z/wibble -triggered off [] +20000101T0800Z/nip -triggered off [] +20000101T0830Z/quux -triggered off [] +20000101T0900Z/wibble -triggered off [] +20000101T0900Z/baz -triggered off [] +20000101T0900Z/nip -triggered off [] +20000101T0900Z/qux -triggered off [] +20000101T0930Z/quux -triggered off [] +20000101T1000Z/nip -triggered off [] +20000101T1000Z/wibble -triggered off [] +20000101T1015Z/bob -triggered off [] +20000101T1015Z/toot -triggered off [] +20000101T1030Z/quux -triggered off [] +20000101T1100Z/wibble -triggered off [] +20000101T1100Z/nip -triggered off [] +20000101T1115Z/bob -triggered off [] +20000101T1115Z/toot -triggered off [] +20000101T1130Z/quux -triggered off [] +20000101T1200Z/qux -triggered off [] +20000101T1230Z/quux -triggered off [] +20000101T1300Z/nip -triggered off [] +20000101T1300Z/wibble -triggered off [] +20000101T1315Z/bob -triggered off [] +20000101T1315Z/toot -triggered off [] +20000101T1330Z/quux -triggered off [] +20000101T1400Z/wibble -triggered off [] +20000101T1400Z/nip -triggered off [] +20000101T1415Z/bob -triggered off [] +20000101T1415Z/toot -triggered off [] +20000101T1430Z/quux -triggered off [] +20000101T1500Z/nip -triggered off [] +20000101T1500Z/wibble -triggered off [] +20000101T1500Z/baz -triggered off [] +20000101T1500Z/dibble -triggered off [] +20000101T1500Z/qux -triggered off [] +20000101T1530Z/quux -triggered off [] +20000101T1600Z/nip -triggered off [] +20000101T1600Z/wibble -triggered off [] +20000101T1615Z/toot -triggered off [] +20000101T1615Z/bob -triggered off [] +20000101T1630Z/quux -triggered off [] +20000101T1700Z/nip -triggered off [] +20000101T1700Z/wibble -triggered off [] +20000101T1715Z/bob -triggered off [] +20000101T1715Z/toot -triggered off [] +20000101T1730Z/quux -triggered off [] +20000101T1800Z/dibble -triggered off [] +20000101T1800Z/qux -triggered off [] +20000101T1830Z/quux -triggered off [] +20000101T1900Z/nip -triggered off [] +20000101T1900Z/wibble -triggered off [] +20000101T1915Z/bob -triggered off [] +20000101T1915Z/toot -triggered off [] +20000101T1930Z/quux -triggered off [] +20000101T1945Z/dibble -triggered off [] +20000101T2000Z/wibble -triggered off [] +20000101T2000Z/nip -triggered off [] +20000101T2015Z/bob -triggered off [] +20000101T2015Z/toot -triggered off [] +20000101T2030Z/quux -triggered off [] +20000101T2100Z/wibble -triggered off [] +20000101T2100Z/qux -triggered off [] +20000101T2100Z/baz -triggered off [] +20000101T2100Z/dibble -triggered off [] +20000101T2100Z/nip -triggered off [] +20000101T2130Z/quux -triggered off [] +20000101T2200Z/nip -triggered off [] +20000101T2200Z/wibble -triggered off [] +20000101T2215Z/bob -triggered off [] +20000101T2215Z/toot -triggered off [] +20000101T2230Z/quux -triggered off [] +20000101T2300Z/nip -triggered off [] +20000101T2300Z/wibble -triggered off [] +20000101T2315Z/toot -triggered off [] +20000101T2315Z/bob -triggered off [] +20000101T2330Z/quux -triggered off [] +20000102T0000Z/qux -triggered off [] +20000102T0000Z/dibble -triggered off [] +20000102T0000Z/bar -triggered off [] +20000102T0030Z/quux -triggered off [] +20000102T0100Z/nip -triggered off [] +20000102T0100Z/wibble -triggered off [] +20000102T0115Z/bob -triggered off [] +20000102T0115Z/toot -triggered off [] +20000102T0130Z/quux -triggered off [] +20000102T0200Z/nip -triggered off [] +20000102T0200Z/wibble -triggered off [] +20000102T0215Z/toot -triggered off [] +20000102T0215Z/bob -triggered off [] +20000102T0230Z/dibble -triggered off [] +20000102T0230Z/quux -triggered off [] +20000102T0300Z/baz -triggered off [] +20000102T0300Z/qux -triggered off [] +20000102T0300Z/nip -triggered off [] +20000102T0300Z/wibble -triggered off [] +20000102T0300Z/dibble -triggered off [] +20000102T0330Z/quux -triggered off [] +20000102T0400Z/wibble -triggered off [] +20000102T0400Z/nip -triggered off [] +20000102T0415Z/bob -triggered off [] +20000102T0430Z/quux -triggered off [] +20000102T0415Z/toot -triggered off [] +20000102T0500Z/nip -triggered off [] +20000102T0500Z/wibble -triggered off [] +20000102T0515Z/toot -triggered off [] +20000102T0515Z/bob -triggered off [] +20000102T0530Z/quux -triggered off [] +20000102T0600Z/qux -triggered off [] +20000102T0600Z/dibble -triggered off [] +20000102T0630Z/quux -triggered off [] +20000102T0700Z/nip -triggered off [] +20000102T0700Z/wibble -triggered off [] +20000102T0715Z/bob -triggered off [] +20000102T0715Z/toot -triggered off [] +20000102T0800Z/wibble -triggered off [] +20000102T0800Z/nip -triggered off [] +20000102T0730Z/quux -triggered off [] +20000102T0815Z/toot -triggered off [] +20000102T0815Z/bob -triggered off [] +20000102T0900Z/nip -triggered off [] +20000102T0830Z/quux -triggered off [] +20000102T0900Z/baz -triggered off [] +20000102T0900Z/wibble -triggered off [] +20000102T0900Z/qux -triggered off [] +20000102T0930Z/quux -triggered off [] +20000102T1000Z/wibble -triggered off [] +20000102T1000Z/nip -triggered off [] +20000102T1015Z/toot -triggered off [] +20000102T1015Z/bob -triggered off [] +20000102T1030Z/quux -triggered off [] +20000102T1115Z/toot -triggered off [] +20000102T1115Z/bob -triggered off [] +20000102T1100Z/nip -triggered off [] +20000102T1200Z/pub -triggered off [] +20000102T1100Z/wibble -triggered off [] +20000102T1130Z/quux -triggered off [] +20000102T1200Z/qux -triggered off [] diff --git a/tests/functional/cyclers/hourly/graph.plain.ref b/tests/functional/cyclers/hourly/graph.plain.ref index 3b64d756380..77b22a4bf4f 100644 --- a/tests/functional/cyclers/hourly/graph.plain.ref +++ b/tests/functional/cyclers/hourly/graph.plain.ref @@ -1,21 +1,21 @@ -edge "foo.20000229T2000Z" "bar.20000229T2000Z" -edge "foo.20000229T2000Z" "foo.20000229T2100Z" -edge "foo.20000229T2100Z" "bar.20000229T2100Z" -edge "foo.20000229T2100Z" "foo.20000229T2200Z" -edge "foo.20000229T2200Z" "bar.20000229T2200Z" -edge "foo.20000229T2200Z" "foo.20000229T2300Z" -edge "foo.20000229T2300Z" "bar.20000229T2300Z" -edge "foo.20000229T2300Z" "foo.20000301T0000Z" -edge "foo.20000301T0000Z" "bar.20000301T0000Z" +edge "20000229T2000Z/foo" "20000229T2000Z/bar" +edge "20000229T2000Z/foo" "20000229T2100Z/foo" +edge "20000229T2100Z/foo" "20000229T2100Z/bar" +edge "20000229T2100Z/foo" "20000229T2200Z/foo" +edge "20000229T2200Z/foo" "20000229T2200Z/bar" +edge "20000229T2200Z/foo" "20000229T2300Z/foo" +edge "20000229T2300Z/foo" "20000229T2300Z/bar" +edge "20000229T2300Z/foo" "20000301T0000Z/foo" +edge "20000301T0000Z/foo" "20000301T0000Z/bar" graph -node "bar.20000229T2000Z" "bar\n20000229T2000Z" -node "bar.20000229T2100Z" "bar\n20000229T2100Z" -node "bar.20000229T2200Z" "bar\n20000229T2200Z" -node "bar.20000229T2300Z" "bar\n20000229T2300Z" -node "bar.20000301T0000Z" "bar\n20000301T0000Z" -node "foo.20000229T2000Z" "foo\n20000229T2000Z" -node "foo.20000229T2100Z" "foo\n20000229T2100Z" -node "foo.20000229T2200Z" "foo\n20000229T2200Z" -node "foo.20000229T2300Z" "foo\n20000229T2300Z" -node "foo.20000301T0000Z" "foo\n20000301T0000Z" +node "20000229T2000Z/bar" "bar\n20000229T2000Z" +node "20000229T2000Z/foo" "foo\n20000229T2000Z" +node "20000229T2100Z/bar" "bar\n20000229T2100Z" +node "20000229T2100Z/foo" "foo\n20000229T2100Z" +node "20000229T2200Z/bar" "bar\n20000229T2200Z" +node "20000229T2200Z/foo" "foo\n20000229T2200Z" +node "20000229T2300Z/bar" "bar\n20000229T2300Z" +node "20000229T2300Z/foo" "foo\n20000229T2300Z" +node "20000301T0000Z/bar" "bar\n20000301T0000Z" +node "20000301T0000Z/foo" "foo\n20000301T0000Z" stop diff --git a/tests/functional/cyclers/hourly/reference.log b/tests/functional/cyclers/hourly/reference.log index 5c9f70fbc9a..948c4676373 100644 --- a/tests/functional/cyclers/hourly/reference.log +++ b/tests/functional/cyclers/hourly/reference.log @@ -1,12 +1,12 @@ Initial point: 20000229T2000 Final point: 20000301 -foo.20000229T2000Z -triggered off ['foo.20000229T1900Z'] -bar.20000229T2000Z -triggered off ['foo.20000229T2000Z'] -foo.20000229T2100Z -triggered off ['foo.20000229T2000Z'] -bar.20000229T2100Z -triggered off ['foo.20000229T2100Z'] -foo.20000229T2200Z -triggered off ['foo.20000229T2100Z'] -bar.20000229T2200Z -triggered off ['foo.20000229T2200Z'] -foo.20000229T2300Z -triggered off ['foo.20000229T2200Z'] -bar.20000229T2300Z -triggered off ['foo.20000229T2300Z'] -foo.20000301T0000Z -triggered off ['foo.20000229T2300Z'] -bar.20000301T0000Z -triggered off ['foo.20000301T0000Z'] +20000229T2000Z/foo -triggered off ['20000229T1900Z/foo'] +20000229T2000Z/bar -triggered off ['20000229T2000Z/foo'] +20000229T2100Z/foo -triggered off ['20000229T2000Z/foo'] +20000229T2100Z/bar -triggered off ['20000229T2100Z/foo'] +20000229T2200Z/foo -triggered off ['20000229T2100Z/foo'] +20000229T2200Z/bar -triggered off ['20000229T2200Z/foo'] +20000229T2300Z/foo -triggered off ['20000229T2200Z/foo'] +20000229T2300Z/bar -triggered off ['20000229T2300Z/foo'] +20000301T0000Z/foo -triggered off ['20000229T2300Z/foo'] +20000301T0000Z/bar -triggered off ['20000301T0000Z/foo'] diff --git a/tests/functional/cyclers/integer1/graph.plain.ref b/tests/functional/cyclers/integer1/graph.plain.ref index 8e46a04490a..16beaf884bd 100644 --- a/tests/functional/cyclers/integer1/graph.plain.ref +++ b/tests/functional/cyclers/integer1/graph.plain.ref @@ -1,94 +1,94 @@ -edge "foo.1" "bar.1" -edge "foo.1" "foo.4" -edge "foo.1" "on_toast.4" -edge "foo.4" "bar.4" -edge "foo.4" "foo.7" -edge "foo.4" "on_toast.7" -edge "foo.4" "qux.7" -edge "foo.7" "bar.7" -edge "foo.7" "foo.10" -edge "foo.7" "on_toast.10" -edge "foo.10" "bar.10" -edge "foo.10" "foo.13" -edge "foo.10" "on_toast.13" -edge "foo.10" "qux.13" -edge "foo.13" "bar.13" -edge "foo.13" "foo.16" -edge "foo.13" "on_toast.16" -edge "foo.16" "bar.16" -edge "seq.1" "foo.1" -edge "seq.4" "foo.4" -edge "seq.7" "foo.7" -edge "seq.10" "foo.10" -edge "seq.13" "foo.13" -edge "seq.16" "foo.16" -edge "wibble.1" "wobble.7" -edge "wobble.7" "wubble.16" -edge "woo.2" "bar.1" -edge "woo.2" "foo.1" -edge "woo.3" "foo.4" -edge "woo.5" "bar.4" -edge "woo.5" "foo.4" -edge "woo.6" "foo.7" -edge "woo.8" "bar.7" -edge "woo.8" "foo.7" -edge "woo.9" "foo.10" -edge "woo.11" "bar.10" -edge "woo.11" "foo.10" -edge "woo.12" "foo.13" -edge "woo.14" "bar.13" -edge "woo.14" "foo.13" -edge "woo.15" "foo.16" -edge "woo.17" "bar.16" -edge "woo.17" "foo.16" +edge "1/foo" "1/bar" +edge "1/foo" "4/foo" +edge "1/foo" "4/on_toast" +edge "4/foo" "4/bar" +edge "4/foo" "7/foo" +edge "4/foo" "7/on_toast" +edge "4/foo" "7/qux" +edge "7/foo" "7/bar" +edge "7/foo" "10/foo" +edge "7/foo" "10/on_toast" +edge "10/foo" "10/bar" +edge "10/foo" "13/foo" +edge "10/foo" "13/on_toast" +edge "10/foo" "13/qux" +edge "13/foo" "13/bar" +edge "13/foo" "16/foo" +edge "13/foo" "16/on_toast" +edge "16/foo" "16/bar" +edge "1/seq" "1/foo" +edge "4/seq" "4/foo" +edge "7/seq" "7/foo" +edge "10/seq" "10/foo" +edge "13/seq" "13/foo" +edge "16/seq" "16/foo" +edge "1/wibble" "7/wobble" +edge "7/wobble" "16/wubble" +edge "2/woo" "1/bar" +edge "2/woo" "1/foo" +edge "3/woo" "4/foo" +edge "5/woo" "4/bar" +edge "5/woo" "4/foo" +edge "6/woo" "7/foo" +edge "8/woo" "7/bar" +edge "8/woo" "7/foo" +edge "9/woo" "10/foo" +edge "11/woo" "10/bar" +edge "11/woo" "10/foo" +edge "12/woo" "13/foo" +edge "14/woo" "13/bar" +edge "14/woo" "13/foo" +edge "15/woo" "16/foo" +edge "17/woo" "16/bar" +edge "17/woo" "16/foo" graph -node "bar.1" "bar\n1" -node "bar.4" "bar\n4" -node "bar.7" "bar\n7" -node "bar.10" "bar\n10" -node "bar.13" "bar\n13" -node "bar.16" "bar\n16" -node "baz.16" "baz\n16" -node "foo.1" "foo\n1" -node "foo.4" "foo\n4" -node "foo.7" "foo\n7" -node "foo.10" "foo\n10" -node "foo.13" "foo\n13" -node "foo.16" "foo\n16" -node "nang.1" "nang\n1" -node "ning.4" "ning\n4" -node "ning.12" "ning\n12" -node "ning.16" "ning\n16" -node "nong.2" "nong\n2" -node "nong.8" "nong\n8" -node "on_toast.1" "on_toast\n1" -node "on_toast.4" "on_toast\n4" -node "on_toast.7" "on_toast\n7" -node "on_toast.10" "on_toast\n10" -node "on_toast.13" "on_toast\n13" -node "on_toast.16" "on_toast\n16" -node "quux.8" "quux\n8" -node "quux.16" "quux\n16" -node "qux.7" "qux\n7" -node "qux.13" "qux\n13" -node "seq.1" "seq\n1" -node "seq.4" "seq\n4" -node "seq.7" "seq\n7" -node "seq.10" "seq\n10" -node "seq.13" "seq\n13" -node "seq.16" "seq\n16" -node "wibble.1" "wibble\n1" -node "wobble.7" "wobble\n7" -node "woo.2" "woo\n2" -node "woo.3" "woo\n3" -node "woo.5" "woo\n5" -node "woo.6" "woo\n6" -node "woo.8" "woo\n8" -node "woo.9" "woo\n9" -node "woo.11" "woo\n11" -node "woo.12" "woo\n12" -node "woo.14" "woo\n14" -node "woo.15" "woo\n15" -node "woo.17" "woo\n17" -node "wubble.16" "wubble\n16" +node "1/bar" "bar\n1" +node "4/bar" "bar\n4" +node "7/bar" "bar\n7" +node "10/bar" "bar\n10" +node "13/bar" "bar\n13" +node "16/bar" "bar\n16" +node "16/baz" "baz\n16" +node "1/foo" "foo\n1" +node "4/foo" "foo\n4" +node "7/foo" "foo\n7" +node "10/foo" "foo\n10" +node "13/foo" "foo\n13" +node "16/foo" "foo\n16" +node "1/nang" "nang\n1" +node "4/ning" "ning\n4" +node "12/ning" "ning\n12" +node "16/ning" "ning\n16" +node "2/nong" "nong\n2" +node "8/nong" "nong\n8" +node "1/on_toast" "on_toast\n1" +node "4/on_toast" "on_toast\n4" +node "7/on_toast" "on_toast\n7" +node "10/on_toast" "on_toast\n10" +node "13/on_toast" "on_toast\n13" +node "16/on_toast" "on_toast\n16" +node "8/quux" "quux\n8" +node "16/quux" "quux\n16" +node "7/qux" "qux\n7" +node "13/qux" "qux\n13" +node "1/seq" "seq\n1" +node "4/seq" "seq\n4" +node "7/seq" "seq\n7" +node "10/seq" "seq\n10" +node "13/seq" "seq\n13" +node "16/seq" "seq\n16" +node "1/wibble" "wibble\n1" +node "7/wobble" "wobble\n7" +node "2/woo" "woo\n2" +node "3/woo" "woo\n3" +node "5/woo" "woo\n5" +node "6/woo" "woo\n6" +node "8/woo" "woo\n8" +node "9/woo" "woo\n9" +node "11/woo" "woo\n11" +node "12/woo" "woo\n12" +node "14/woo" "woo\n14" +node "15/woo" "woo\n15" +node "17/woo" "woo\n17" +node "16/wubble" "wubble\n16" stop diff --git a/tests/functional/cyclers/integer1/reference.log b/tests/functional/cyclers/integer1/reference.log index 9aa496e16ac..ff9c34289ae 100644 --- a/tests/functional/cyclers/integer1/reference.log +++ b/tests/functional/cyclers/integer1/reference.log @@ -1,48 +1,48 @@ -bar.10 -triggered off ['foo.10', 'woo.11'] -bar.13 -triggered off ['foo.13', 'woo.14'] -bar.1 -triggered off ['foo.1', 'woo.2'] -bar.4 -triggered off ['foo.4', 'woo.5'] -bar.7 -triggered off ['foo.7', 'woo.8'] -baz.16 -triggered off [] +10/bar -triggered off ['10/foo', '11/woo'] +13/bar -triggered off ['13/foo', '14/woo'] +1/bar -triggered off ['1/foo', '2/woo'] +4/bar -triggered off ['4/foo', '5/woo'] +7/bar -triggered off ['7/foo', '8/woo'] +16/baz -triggered off [] Final point: 16 -foo.10 -triggered off ['foo.7', 'seq.10', 'woo.11', 'woo.9'] -foo.13 -triggered off ['foo.10', 'seq.13', 'woo.12', 'woo.14'] -foo.1 -triggered off ['foo.-2', 'seq.1', 'woo.0', 'woo.2'] -foo.4 -triggered off ['foo.1', 'seq.4', 'woo.3', 'woo.5'] -foo.7 -triggered off ['foo.4', 'seq.7', 'woo.6', 'woo.8'] +10/foo -triggered off ['10/seq', '11/woo', '7/foo', '9/woo'] +13/foo -triggered off ['10/foo', '12/woo', '13/seq', '14/woo'] +1/foo -triggered off ['-2/foo', '0/woo', '1/seq', '2/woo'] +4/foo -triggered off ['1/foo', '3/woo', '4/seq', '5/woo'] +7/foo -triggered off ['4/foo', '6/woo', '7/seq', '8/woo'] Initial point: 1 -nang.1 -triggered off [] -ning.12 -triggered off [] -ning.16 -triggered off [] -ning.4 -triggered off [] -nong.2 -triggered off [] -nong.8 -triggered off [] -on_toast.10 -triggered off ['foo.7'] -on_toast.13 -triggered off ['foo.10'] -on_toast.16 -triggered off ['foo.13'] -on_toast.1 -triggered off ['foo.-2'] -on_toast.4 -triggered off ['foo.1'] -on_toast.7 -triggered off ['foo.4'] -quux.16 -triggered off [] -quux.8 -triggered off [] -qux.13 -triggered off ['foo.10'] -qux.7 -triggered off ['foo.4'] -seq.10 -triggered off ['seq.7'] -seq.13 -triggered off ['seq.10'] -seq.16 -triggered off ['seq.13'] -seq.1 -triggered off [] -seq.4 -triggered off ['seq.1'] -seq.7 -triggered off ['seq.4'] -wibble.1 -triggered off [] -wobble.7 -triggered off ['wibble.1'] -woo.11 -triggered off [] -woo.12 -triggered off [] -woo.14 -triggered off [] -woo.15 -triggered off [] -woo.2 -triggered off [] -woo.3 -triggered off [] -woo.5 -triggered off [] -woo.6 -triggered off [] -woo.8 -triggered off [] -woo.9 -triggered off [] -wubble.16 -triggered off ['wobble.7'] +1/nang -triggered off [] +12/ning -triggered off [] +16/ning -triggered off [] +4/ning -triggered off [] +2/nong -triggered off [] +8/nong -triggered off [] +10/on_toast -triggered off ['7/foo'] +13/on_toast -triggered off ['10/foo'] +16/on_toast -triggered off ['13/foo'] +1/on_toast -triggered off ['-2/foo'] +4/on_toast -triggered off ['1/foo'] +7/on_toast -triggered off ['4/foo'] +16/quux -triggered off [] +8/quux -triggered off [] +13/qux -triggered off ['10/foo'] +7/qux -triggered off ['4/foo'] +10/seq -triggered off ['7/seq'] +13/seq -triggered off ['10/seq'] +16/seq -triggered off ['13/seq'] +1/seq -triggered off [] +4/seq -triggered off ['1/seq'] +7/seq -triggered off ['4/seq'] +1/wibble -triggered off [] +7/wobble -triggered off ['1/wibble'] +11/woo -triggered off [] +12/woo -triggered off [] +14/woo -triggered off [] +15/woo -triggered off [] +2/woo -triggered off [] +3/woo -triggered off [] +5/woo -triggered off [] +6/woo -triggered off [] +8/woo -triggered off [] +9/woo -triggered off [] +16/wubble -triggered off ['7/wobble'] diff --git a/tests/functional/cyclers/integer_exclusions_advanced/graph.plain.ref b/tests/functional/cyclers/integer_exclusions_advanced/graph.plain.ref index 72bb29e419f..d5dad08fd5e 100644 --- a/tests/functional/cyclers/integer_exclusions_advanced/graph.plain.ref +++ b/tests/functional/cyclers/integer_exclusions_advanced/graph.plain.ref @@ -1,42 +1,42 @@ graph -node "bar.1" "bar\n1" -node "bar.3" "bar\n3" -node "bar.5" "bar\n5" -node "bar.7" "bar\n7" -node "bar.9" "bar\n9" -node "bar.11" "bar\n11" -node "bar.13" "bar\n13" -node "bar.15" "bar\n15" -node "cthulhu.3" "cthulhu\n3" -node "cthulhu.5" "cthulhu\n5" -node "cthulhu.9" "cthulhu\n9" -node "cthulhu.11" "cthulhu\n11" -node "cthulhu.15" "cthulhu\n15" -node "foo.1" "foo\n1" -node "foo.4" "foo\n4" -node "foo.5" "foo\n5" -node "foo.6" "foo\n6" -node "foo.8" "foo\n8" -node "foo.9" "foo\n9" -node "foo.10" "foo\n10" -node "foo.11" "foo\n11" -node "foo.12" "foo\n12" -node "foo.13" "foo\n13" -node "foo.14" "foo\n14" -node "foo.15" "foo\n15" -node "foo.16" "foo\n16" -node "qux.2" "qux\n2" -node "qux.4" "qux\n4" -node "qux.10" "qux\n10" -node "qux.12" "qux\n12" -node "qux.14" "qux\n14" -node "qux.16" "qux\n16" -node "woo.2" "woo\n2" -node "woo.4" "woo\n4" -node "woo.6" "woo\n6" -node "woo.8" "woo\n8" -node "woo.10" "woo\n10" -node "woo.12" "woo\n12" -node "woo.14" "woo\n14" -node "woo.16" "woo\n16" +node "1/bar" "bar\n1" +node "3/bar" "bar\n3" +node "5/bar" "bar\n5" +node "7/bar" "bar\n7" +node "9/bar" "bar\n9" +node "11/bar" "bar\n11" +node "13/bar" "bar\n13" +node "15/bar" "bar\n15" +node "3/cthulhu" "cthulhu\n3" +node "5/cthulhu" "cthulhu\n5" +node "9/cthulhu" "cthulhu\n9" +node "11/cthulhu" "cthulhu\n11" +node "15/cthulhu" "cthulhu\n15" +node "1/foo" "foo\n1" +node "4/foo" "foo\n4" +node "5/foo" "foo\n5" +node "6/foo" "foo\n6" +node "8/foo" "foo\n8" +node "9/foo" "foo\n9" +node "10/foo" "foo\n10" +node "11/foo" "foo\n11" +node "12/foo" "foo\n12" +node "13/foo" "foo\n13" +node "14/foo" "foo\n14" +node "15/foo" "foo\n15" +node "16/foo" "foo\n16" +node "2/qux" "qux\n2" +node "4/qux" "qux\n4" +node "10/qux" "qux\n10" +node "12/qux" "qux\n12" +node "14/qux" "qux\n14" +node "16/qux" "qux\n16" +node "2/woo" "woo\n2" +node "4/woo" "woo\n4" +node "6/woo" "woo\n6" +node "8/woo" "woo\n8" +node "10/woo" "woo\n10" +node "12/woo" "woo\n12" +node "14/woo" "woo\n14" +node "16/woo" "woo\n16" stop diff --git a/tests/functional/cyclers/integer_exclusions_advanced/reference.log b/tests/functional/cyclers/integer_exclusions_advanced/reference.log index b767c1dbc90..edf1270cb73 100644 --- a/tests/functional/cyclers/integer_exclusions_advanced/reference.log +++ b/tests/functional/cyclers/integer_exclusions_advanced/reference.log @@ -1,42 +1,42 @@ -2017-05-19T17:43:45+01 INFO - Initial point: 1 -2017-05-19T17:43:45+01 INFO - Final point: 16 -2017-05-19T17:43:45+01 DEBUG - woo.2 -triggered off [] -2017-05-19T17:43:45+01 DEBUG - qux.2 -triggered off [] -2017-05-19T17:43:45+01 DEBUG - bar.1 -triggered off [] -2017-05-19T17:43:45+01 DEBUG - foo.1 -triggered off [] -2017-05-19T17:43:45+01 DEBUG - cthulhu.3 -triggered off [] -2017-05-19T17:43:48+01 DEBUG - qux.4 -triggered off [] -2017-05-19T17:43:48+01 DEBUG - cthulhu.5 -triggered off [] -2017-05-19T17:43:48+01 DEBUG - bar.3 -triggered off [] -2017-05-19T17:43:48+01 DEBUG - woo.4 -triggered off [] -2017-05-19T17:43:48+01 DEBUG - foo.4 -triggered off [] -2017-05-19T17:43:50+01 DEBUG - foo.5 -triggered off [] -2017-05-19T17:43:50+01 DEBUG - woo.6 -triggered off [] -2017-05-19T17:43:50+01 DEBUG - cthulhu.9 -triggered off [] -2017-05-19T17:43:50+01 DEBUG - qux.10 -triggered off [] -2017-05-19T17:43:50+01 DEBUG - bar.5 -triggered off [] -2017-05-19T17:43:52+01 DEBUG - woo.8 -triggered off [] -2017-05-19T17:43:52+01 DEBUG - cthulhu.11 -triggered off [] -2017-05-19T17:43:52+01 DEBUG - qux.12 -triggered off [] -2017-05-19T17:43:52+01 DEBUG - foo.6 -triggered off [] -2017-05-19T17:43:52+01 DEBUG - bar.7 -triggered off [] -2017-05-19T17:43:54+01 DEBUG - woo.10 -triggered off [] -2017-05-19T17:43:54+01 DEBUG - foo.8 -triggered off [] -2017-05-19T17:43:54+01 DEBUG - bar.9 -triggered off [] -2017-05-19T17:43:56+01 DEBUG - woo.12 -triggered off [] -2017-05-19T17:43:56+01 DEBUG - bar.11 -triggered off [] -2017-05-19T17:43:56+01 DEBUG - foo.9 -triggered off [] -2017-05-19T17:43:59+01 DEBUG - cthulhu.15 -triggered off [] -2017-05-19T17:43:59+01 DEBUG - bar.13 -triggered off [] -2017-05-19T17:43:59+01 DEBUG - foo.10 -triggered off [] -2017-05-19T17:43:59+01 DEBUG - woo.14 -triggered off [] -2017-05-19T17:43:59+01 DEBUG - qux.14 -triggered off [] -2017-05-19T17:44:01+01 DEBUG - woo.16 -triggered off [] -2017-05-19T17:44:01+01 DEBUG - bar.15 -triggered off [] -2017-05-19T17:44:01+01 DEBUG - foo.11 -triggered off [] -2017-05-19T17:44:01+01 DEBUG - qux.16 -triggered off [] -2017-05-19T17:44:03+01 DEBUG - foo.12 -triggered off [] -2017-05-19T17:44:05+01 DEBUG - foo.13 -triggered off [] -2017-05-19T17:44:07+01 DEBUG - foo.14 -triggered off [] -2017-05-19T17:44:09+01 DEBUG - foo.15 -triggered off [] -2017-05-19T17:44:11+01 DEBUG - foo.16 -triggered off [] +Initial point: 1 +Final point: 16 +2/woo -triggered off [] +2/qux -triggered off [] +1/bar -triggered off [] +1/foo -triggered off [] +3/cthulhu -triggered off [] +4/qux -triggered off [] +5/cthulhu -triggered off [] +3/bar -triggered off [] +4/woo -triggered off [] +4/foo -triggered off [] +5/foo -triggered off [] +6/woo -triggered off [] +9/cthulhu -triggered off [] +10/qux -triggered off [] +5/bar -triggered off [] +8/woo -triggered off [] +11/cthulhu -triggered off [] +12/qux -triggered off [] +6/foo -triggered off [] +7/bar -triggered off [] +10/woo -triggered off [] +8/foo -triggered off [] +9/bar -triggered off [] +12/woo -triggered off [] +11/bar -triggered off [] +9/foo -triggered off [] +15/cthulhu -triggered off [] +13/bar -triggered off [] +10/foo -triggered off [] +14/woo -triggered off [] +14/qux -triggered off [] +16/woo -triggered off [] +15/bar -triggered off [] +11/foo -triggered off [] +16/qux -triggered off [] +12/foo -triggered off [] +13/foo -triggered off [] +14/foo -triggered off [] +15/foo -triggered off [] +16/foo -triggered off [] diff --git a/tests/functional/cyclers/monthly/graph.plain.ref b/tests/functional/cyclers/monthly/graph.plain.ref index 8de09f26126..4513697e8c7 100644 --- a/tests/functional/cyclers/monthly/graph.plain.ref +++ b/tests/functional/cyclers/monthly/graph.plain.ref @@ -1,48 +1,48 @@ -edge "foo.20000131T0100Z" "bar.20000131T0100Z" -edge "foo.20000229T0100Z" "bar.20000229T0100Z" -edge "foo.20000229T0100Z" "foo.20000329T0100Z" -edge "foo.20000329T0100Z" "bar.20000329T0100Z" -edge "foo.20000329T0100Z" "foo.20000429T0100Z" -edge "foo.20000429T0100Z" "bar.20000429T0100Z" -edge "foo.20000429T0100Z" "foo.20000529T0100Z" -edge "foo.20000529T0100Z" "bar.20000529T0100Z" -edge "foo.20000529T0100Z" "foo.20000629T0100Z" -edge "foo.20000629T0100Z" "bar.20000629T0100Z" -edge "foo.20000629T0100Z" "foo.20000729T0100Z" -edge "foo.20000729T0100Z" "bar.20000729T0100Z" -edge "foo.20000729T0100Z" "foo.20000829T0100Z" -edge "foo.20000829T0100Z" "bar.20000829T0100Z" -edge "foo.20000829T0100Z" "foo.20000929T0100Z" -edge "foo.20000929T0100Z" "bar.20000929T0100Z" -edge "foo.20000929T0100Z" "foo.20001029T0100Z" -edge "foo.20001029T0100Z" "bar.20001029T0100Z" -edge "foo.20001029T0100Z" "foo.20001129T0100Z" -edge "foo.20001129T0100Z" "bar.20001129T0100Z" -edge "foo.20001129T0100Z" "foo.20001229T0100Z" -edge "foo.20001229T0100Z" "bar.20001229T0100Z" +edge "20000131T0100Z/foo" "20000131T0100Z/bar" +edge "20000229T0100Z/foo" "20000229T0100Z/bar" +edge "20000229T0100Z/foo" "20000329T0100Z/foo" +edge "20000329T0100Z/foo" "20000329T0100Z/bar" +edge "20000329T0100Z/foo" "20000429T0100Z/foo" +edge "20000429T0100Z/foo" "20000429T0100Z/bar" +edge "20000429T0100Z/foo" "20000529T0100Z/foo" +edge "20000529T0100Z/foo" "20000529T0100Z/bar" +edge "20000529T0100Z/foo" "20000629T0100Z/foo" +edge "20000629T0100Z/foo" "20000629T0100Z/bar" +edge "20000629T0100Z/foo" "20000729T0100Z/foo" +edge "20000729T0100Z/foo" "20000729T0100Z/bar" +edge "20000729T0100Z/foo" "20000829T0100Z/foo" +edge "20000829T0100Z/foo" "20000829T0100Z/bar" +edge "20000829T0100Z/foo" "20000929T0100Z/foo" +edge "20000929T0100Z/foo" "20000929T0100Z/bar" +edge "20000929T0100Z/foo" "20001029T0100Z/foo" +edge "20001029T0100Z/foo" "20001029T0100Z/bar" +edge "20001029T0100Z/foo" "20001129T0100Z/foo" +edge "20001129T0100Z/foo" "20001129T0100Z/bar" +edge "20001129T0100Z/foo" "20001229T0100Z/foo" +edge "20001229T0100Z/foo" "20001229T0100Z/bar" graph -node "bar.20000131T0100Z" "bar\n20000131T0100Z" -node "bar.20000229T0100Z" "bar\n20000229T0100Z" -node "bar.20000329T0100Z" "bar\n20000329T0100Z" -node "bar.20000429T0100Z" "bar\n20000429T0100Z" -node "bar.20000529T0100Z" "bar\n20000529T0100Z" -node "bar.20000629T0100Z" "bar\n20000629T0100Z" -node "bar.20000729T0100Z" "bar\n20000729T0100Z" -node "bar.20000829T0100Z" "bar\n20000829T0100Z" -node "bar.20000929T0100Z" "bar\n20000929T0100Z" -node "bar.20001029T0100Z" "bar\n20001029T0100Z" -node "bar.20001129T0100Z" "bar\n20001129T0100Z" -node "bar.20001229T0100Z" "bar\n20001229T0100Z" -node "foo.20000131T0100Z" "foo\n20000131T0100Z" -node "foo.20000229T0100Z" "foo\n20000229T0100Z" -node "foo.20000329T0100Z" "foo\n20000329T0100Z" -node "foo.20000429T0100Z" "foo\n20000429T0100Z" -node "foo.20000529T0100Z" "foo\n20000529T0100Z" -node "foo.20000629T0100Z" "foo\n20000629T0100Z" -node "foo.20000729T0100Z" "foo\n20000729T0100Z" -node "foo.20000829T0100Z" "foo\n20000829T0100Z" -node "foo.20000929T0100Z" "foo\n20000929T0100Z" -node "foo.20001029T0100Z" "foo\n20001029T0100Z" -node "foo.20001129T0100Z" "foo\n20001129T0100Z" -node "foo.20001229T0100Z" "foo\n20001229T0100Z" +node "20000131T0100Z/bar" "bar\n20000131T0100Z" +node "20000131T0100Z/foo" "foo\n20000131T0100Z" +node "20000229T0100Z/bar" "bar\n20000229T0100Z" +node "20000229T0100Z/foo" "foo\n20000229T0100Z" +node "20000329T0100Z/bar" "bar\n20000329T0100Z" +node "20000329T0100Z/foo" "foo\n20000329T0100Z" +node "20000429T0100Z/bar" "bar\n20000429T0100Z" +node "20000429T0100Z/foo" "foo\n20000429T0100Z" +node "20000529T0100Z/bar" "bar\n20000529T0100Z" +node "20000529T0100Z/foo" "foo\n20000529T0100Z" +node "20000629T0100Z/bar" "bar\n20000629T0100Z" +node "20000629T0100Z/foo" "foo\n20000629T0100Z" +node "20000729T0100Z/bar" "bar\n20000729T0100Z" +node "20000729T0100Z/foo" "foo\n20000729T0100Z" +node "20000829T0100Z/bar" "bar\n20000829T0100Z" +node "20000829T0100Z/foo" "foo\n20000829T0100Z" +node "20000929T0100Z/bar" "bar\n20000929T0100Z" +node "20000929T0100Z/foo" "foo\n20000929T0100Z" +node "20001029T0100Z/bar" "bar\n20001029T0100Z" +node "20001029T0100Z/foo" "foo\n20001029T0100Z" +node "20001129T0100Z/bar" "bar\n20001129T0100Z" +node "20001129T0100Z/foo" "foo\n20001129T0100Z" +node "20001229T0100Z/bar" "bar\n20001229T0100Z" +node "20001229T0100Z/foo" "foo\n20001229T0100Z" stop diff --git a/tests/functional/cyclers/monthly/reference.log b/tests/functional/cyclers/monthly/reference.log index 147d22c4d5c..9be763865ae 100644 --- a/tests/functional/cyclers/monthly/reference.log +++ b/tests/functional/cyclers/monthly/reference.log @@ -1,26 +1,26 @@ Initial point: 20000131T0100 Final point: 2001 -foo.20000131T0100Z -triggered off ['foo.19991231T0100Z'] -foo.20000229T0100Z -triggered off ['foo.20000129T0100Z'] -bar.20000131T0100Z -triggered off ['foo.20000131T0100Z'] -foo.20000329T0100Z -triggered off ['foo.20000229T0100Z'] -bar.20000229T0100Z -triggered off ['foo.20000229T0100Z'] -foo.20000429T0100Z -triggered off ['foo.20000329T0100Z'] -bar.20000329T0100Z -triggered off ['foo.20000329T0100Z'] -foo.20000529T0100Z -triggered off ['foo.20000429T0100Z'] -bar.20000429T0100Z -triggered off ['foo.20000429T0100Z'] -foo.20000629T0100Z -triggered off ['foo.20000529T0100Z'] -bar.20000529T0100Z -triggered off ['foo.20000529T0100Z'] -foo.20000729T0100Z -triggered off ['foo.20000629T0100Z'] -bar.20000629T0100Z -triggered off ['foo.20000629T0100Z'] -foo.20000829T0100Z -triggered off ['foo.20000729T0100Z'] -bar.20000729T0100Z -triggered off ['foo.20000729T0100Z'] -foo.20000929T0100Z -triggered off ['foo.20000829T0100Z'] -bar.20000829T0100Z -triggered off ['foo.20000829T0100Z'] -foo.20001029T0100Z -triggered off ['foo.20000929T0100Z'] -bar.20000929T0100Z -triggered off ['foo.20000929T0100Z'] -foo.20001129T0100Z -triggered off ['foo.20001029T0100Z'] -bar.20001029T0100Z -triggered off ['foo.20001029T0100Z'] -foo.20001229T0100Z -triggered off ['foo.20001129T0100Z'] -bar.20001129T0100Z -triggered off ['foo.20001129T0100Z'] -bar.20001229T0100Z -triggered off ['foo.20001229T0100Z'] +20000131T0100Z/foo -triggered off ['19991231T0100Z/foo'] +20000229T0100Z/foo -triggered off ['20000129T0100Z/foo'] +20000131T0100Z/bar -triggered off ['20000131T0100Z/foo'] +20000329T0100Z/foo -triggered off ['20000229T0100Z/foo'] +20000229T0100Z/bar -triggered off ['20000229T0100Z/foo'] +20000429T0100Z/foo -triggered off ['20000329T0100Z/foo'] +20000329T0100Z/bar -triggered off ['20000329T0100Z/foo'] +20000529T0100Z/foo -triggered off ['20000429T0100Z/foo'] +20000429T0100Z/bar -triggered off ['20000429T0100Z/foo'] +20000629T0100Z/foo -triggered off ['20000529T0100Z/foo'] +20000529T0100Z/bar -triggered off ['20000529T0100Z/foo'] +20000729T0100Z/foo -triggered off ['20000629T0100Z/foo'] +20000629T0100Z/bar -triggered off ['20000629T0100Z/foo'] +20000829T0100Z/foo -triggered off ['20000729T0100Z/foo'] +20000729T0100Z/bar -triggered off ['20000729T0100Z/foo'] +20000929T0100Z/foo -triggered off ['20000829T0100Z/foo'] +20000829T0100Z/bar -triggered off ['20000829T0100Z/foo'] +20001029T0100Z/foo -triggered off ['20000929T0100Z/foo'] +20000929T0100Z/bar -triggered off ['20000929T0100Z/foo'] +20001129T0100Z/foo -triggered off ['20001029T0100Z/foo'] +20001029T0100Z/bar -triggered off ['20001029T0100Z/foo'] +20001229T0100Z/foo -triggered off ['20001129T0100Z/foo'] +20001129T0100Z/bar -triggered off ['20001129T0100Z/foo'] +20001229T0100Z/bar -triggered off ['20001229T0100Z/foo'] diff --git a/tests/functional/cyclers/monthly_complex/reference.log b/tests/functional/cyclers/monthly_complex/reference.log index 612ee910dbc..9d0f95a3c8a 100644 --- a/tests/functional/cyclers/monthly_complex/reference.log +++ b/tests/functional/cyclers/monthly_complex/reference.log @@ -1,23 +1,23 @@ -2014-07-23T17:03:20+01 DEBUG - flub.20000430T0100Z -triggered off [] -2014-07-23T17:03:20+01 DEBUG - foo.20000406T0000Z -triggered off [] -2014-07-23T17:03:23+01 DEBUG - flob.20000331T0100Z -triggered off ['flub.20000430T0100Z'] -2014-07-23T17:03:26+01 DEBUG - flob.20000401T0100Z -triggered off ['flob.20000331T0100Z', 'flub.20000430T0100Z'] -2014-07-23T17:03:28+01 DEBUG - flob.20000402T0100Z -triggered off ['flob.20000401T0100Z', 'flub.20000430T0100Z'] -2014-07-23T17:03:30+01 DEBUG - flob.20000403T0100Z -triggered off ['flob.20000402T0100Z', 'flub.20000430T0100Z'] -2014-07-23T17:03:33+01 DEBUG - foo.20000506T0000Z -triggered off [] -2014-07-23T17:03:35+01 DEBUG - bar.20000508T1200Z -triggered off ['foo.20000506T0000Z'] -2014-07-23T17:03:35+01 DEBUG - foo.20000606T0000Z -triggered off [] -2014-07-23T17:03:37+01 DEBUG - bar.20000605T1200Z -triggered off ['foo.20000606T0000Z'] -2014-07-23T17:03:39+01 DEBUG - foo.20000706T0000Z -triggered off [] -2014-07-23T17:03:41+01 DEBUG - bar.20000703T1200Z -triggered off ['foo.20000706T0000Z'] -2014-07-23T17:03:43+01 DEBUG - foo.20000806T0000Z -triggered off [] -2014-07-23T17:03:46+01 DEBUG - bar.20000731T1200Z -triggered off ['foo.20000806T0000Z'] -2014-07-23T17:03:48+01 DEBUG - foo.20000906T0000Z -triggered off [] -2014-07-23T17:03:50+01 DEBUG - bar.20000828T1200Z -triggered off ['foo.20000906T0000Z'] -2014-07-23T17:03:53+01 DEBUG - foo.20001006T0000Z -triggered off [] -2014-07-23T17:03:55+01 DEBUG - bar.20000925T1200Z -triggered off ['foo.20001006T0000Z'] -2014-07-23T17:03:57+01 DEBUG - foo.20001106T0000Z -triggered off [] -2014-07-23T17:03:59+01 DEBUG - bar.20001023T1200Z -triggered off ['foo.20001106T0000Z'] -2014-07-23T17:04:01+01 DEBUG - foo.20001206T0000Z -triggered off [] -2014-07-23T17:04:03+01 DEBUG - bar.20001120T1200Z -triggered off ['foo.20001206T0000Z'] -2014-07-23T17:04:05+01 DEBUG - bar.20001218T1200Z -triggered off ['foo.20001206T0000Z'] +20000430T0100Z/flub -triggered off [] +20000406T0000Z/foo -triggered off [] +20000331T0100Z/flob -triggered off ['20000430T0100Z/flub'] +20000401T0100Z/flob -triggered off ['20000331T0100Z/flob', '20000430T0100Z/flub'] +20000402T0100Z/flob -triggered off ['20000401T0100Z/flob', '20000430T0100Z/flub'] +20000403T0100Z/flob -triggered off ['20000402T0100Z/flob', '20000430T0100Z/flub'] +20000506T0000Z/foo -triggered off [] +20000508T1200Z/bar -triggered off ['20000506T0000Z/foo'] +20000606T0000Z/foo -triggered off [] +20000605T1200Z/bar -triggered off ['20000606T0000Z/foo'] +20000706T0000Z/foo -triggered off [] +20000703T1200Z/bar -triggered off ['20000706T0000Z/foo'] +20000806T0000Z/foo -triggered off [] +20000731T1200Z/bar -triggered off ['20000806T0000Z/foo'] +20000906T0000Z/foo -triggered off [] +20000828T1200Z/bar -triggered off ['20000906T0000Z/foo'] +20001006T0000Z/foo -triggered off [] +20000925T1200Z/bar -triggered off ['20001006T0000Z/foo'] +20001106T0000Z/foo -triggered off [] +20001023T1200Z/bar -triggered off ['20001106T0000Z/foo'] +20001206T0000Z/foo -triggered off [] +20001120T1200Z/bar -triggered off ['20001206T0000Z/foo'] +20001218T1200Z/bar -triggered off ['20001206T0000Z/foo'] diff --git a/tests/functional/cyclers/multidaily/graph.plain.ref b/tests/functional/cyclers/multidaily/graph.plain.ref index f87f7ace47a..45b09735511 100644 --- a/tests/functional/cyclers/multidaily/graph.plain.ref +++ b/tests/functional/cyclers/multidaily/graph.plain.ref @@ -1,72 +1,72 @@ -edge "baz.20001231T0100Z" "baz.20010104T0100Z" -edge "baz.20001231T0100Z" "qux.20001231T0100Z" -edge "baz.20010104T0100Z" "baz.20010108T0100Z" -edge "baz.20010104T0100Z" "qux.20010104T0100Z" -edge "baz.20010108T0100Z" "baz.20010112T0100Z" -edge "baz.20010108T0100Z" "qux.20010108T0100Z" -edge "baz.20010112T0100Z" "qux.20010112T0100Z" -edge "foo.20001231T0100Z" "bar.20001231T0100Z" -edge "foo.20001231T0100Z" "foo.20010101T0100Z" -edge "foo.20010101T0100Z" "bar.20010101T0100Z" -edge "foo.20010101T0100Z" "foo.20010102T0100Z" -edge "foo.20010102T0100Z" "bar.20010102T0100Z" -edge "foo.20010102T0100Z" "foo.20010103T0100Z" -edge "foo.20010103T0100Z" "bar.20010103T0100Z" -edge "foo.20010103T0100Z" "foo.20010104T0100Z" -edge "foo.20010104T0100Z" "bar.20010104T0100Z" -edge "foo.20010104T0100Z" "foo.20010105T0100Z" -edge "foo.20010105T0100Z" "bar.20010105T0100Z" -edge "foo.20010105T0100Z" "foo.20010106T0100Z" -edge "foo.20010106T0100Z" "bar.20010106T0100Z" -edge "foo.20010106T0100Z" "foo.20010107T0100Z" -edge "foo.20010107T0100Z" "bar.20010107T0100Z" -edge "foo.20010107T0100Z" "foo.20010108T0100Z" -edge "foo.20010108T0100Z" "bar.20010108T0100Z" -edge "foo.20010108T0100Z" "foo.20010109T0100Z" -edge "foo.20010109T0100Z" "bar.20010109T0100Z" -edge "foo.20010109T0100Z" "foo.20010110T0100Z" -edge "foo.20010110T0100Z" "bar.20010110T0100Z" -edge "foo.20010110T0100Z" "foo.20010111T0100Z" -edge "foo.20010111T0100Z" "bar.20010111T0100Z" -edge "foo.20010111T0100Z" "foo.20010112T0100Z" -edge "foo.20010112T0100Z" "bar.20010112T0100Z" -edge "foo.20010112T0100Z" "foo.20010113T0100Z" -edge "foo.20010113T0100Z" "bar.20010113T0100Z" +edge "20001231T0100Z/baz" "20001231T0100Z/qux" +edge "20001231T0100Z/baz" "20010104T0100Z/baz" +edge "20001231T0100Z/foo" "20001231T0100Z/bar" +edge "20001231T0100Z/foo" "20010101T0100Z/foo" +edge "20010101T0100Z/foo" "20010101T0100Z/bar" +edge "20010101T0100Z/foo" "20010102T0100Z/foo" +edge "20010102T0100Z/foo" "20010102T0100Z/bar" +edge "20010102T0100Z/foo" "20010103T0100Z/foo" +edge "20010103T0100Z/foo" "20010103T0100Z/bar" +edge "20010103T0100Z/foo" "20010104T0100Z/foo" +edge "20010104T0100Z/baz" "20010104T0100Z/qux" +edge "20010104T0100Z/baz" "20010108T0100Z/baz" +edge "20010104T0100Z/foo" "20010104T0100Z/bar" +edge "20010104T0100Z/foo" "20010105T0100Z/foo" +edge "20010105T0100Z/foo" "20010105T0100Z/bar" +edge "20010105T0100Z/foo" "20010106T0100Z/foo" +edge "20010106T0100Z/foo" "20010106T0100Z/bar" +edge "20010106T0100Z/foo" "20010107T0100Z/foo" +edge "20010107T0100Z/foo" "20010107T0100Z/bar" +edge "20010107T0100Z/foo" "20010108T0100Z/foo" +edge "20010108T0100Z/baz" "20010108T0100Z/qux" +edge "20010108T0100Z/baz" "20010112T0100Z/baz" +edge "20010108T0100Z/foo" "20010108T0100Z/bar" +edge "20010108T0100Z/foo" "20010109T0100Z/foo" +edge "20010109T0100Z/foo" "20010109T0100Z/bar" +edge "20010109T0100Z/foo" "20010110T0100Z/foo" +edge "20010110T0100Z/foo" "20010110T0100Z/bar" +edge "20010110T0100Z/foo" "20010111T0100Z/foo" +edge "20010111T0100Z/foo" "20010111T0100Z/bar" +edge "20010111T0100Z/foo" "20010112T0100Z/foo" +edge "20010112T0100Z/baz" "20010112T0100Z/qux" +edge "20010112T0100Z/foo" "20010112T0100Z/bar" +edge "20010112T0100Z/foo" "20010113T0100Z/foo" +edge "20010113T0100Z/foo" "20010113T0100Z/bar" graph -node "bar.20001231T0100Z" "bar\n20001231T0100Z" -node "bar.20010101T0100Z" "bar\n20010101T0100Z" -node "bar.20010102T0100Z" "bar\n20010102T0100Z" -node "bar.20010103T0100Z" "bar\n20010103T0100Z" -node "bar.20010104T0100Z" "bar\n20010104T0100Z" -node "bar.20010105T0100Z" "bar\n20010105T0100Z" -node "bar.20010106T0100Z" "bar\n20010106T0100Z" -node "bar.20010107T0100Z" "bar\n20010107T0100Z" -node "bar.20010108T0100Z" "bar\n20010108T0100Z" -node "bar.20010109T0100Z" "bar\n20010109T0100Z" -node "bar.20010110T0100Z" "bar\n20010110T0100Z" -node "bar.20010111T0100Z" "bar\n20010111T0100Z" -node "bar.20010112T0100Z" "bar\n20010112T0100Z" -node "bar.20010113T0100Z" "bar\n20010113T0100Z" -node "baz.20001231T0100Z" "baz\n20001231T0100Z" -node "baz.20010104T0100Z" "baz\n20010104T0100Z" -node "baz.20010108T0100Z" "baz\n20010108T0100Z" -node "baz.20010112T0100Z" "baz\n20010112T0100Z" -node "foo.20001231T0100Z" "foo\n20001231T0100Z" -node "foo.20010101T0100Z" "foo\n20010101T0100Z" -node "foo.20010102T0100Z" "foo\n20010102T0100Z" -node "foo.20010103T0100Z" "foo\n20010103T0100Z" -node "foo.20010104T0100Z" "foo\n20010104T0100Z" -node "foo.20010105T0100Z" "foo\n20010105T0100Z" -node "foo.20010106T0100Z" "foo\n20010106T0100Z" -node "foo.20010107T0100Z" "foo\n20010107T0100Z" -node "foo.20010108T0100Z" "foo\n20010108T0100Z" -node "foo.20010109T0100Z" "foo\n20010109T0100Z" -node "foo.20010110T0100Z" "foo\n20010110T0100Z" -node "foo.20010111T0100Z" "foo\n20010111T0100Z" -node "foo.20010112T0100Z" "foo\n20010112T0100Z" -node "foo.20010113T0100Z" "foo\n20010113T0100Z" -node "qux.20001231T0100Z" "qux\n20001231T0100Z" -node "qux.20010104T0100Z" "qux\n20010104T0100Z" -node "qux.20010108T0100Z" "qux\n20010108T0100Z" -node "qux.20010112T0100Z" "qux\n20010112T0100Z" +node "20001231T0100Z/bar" "bar\n20001231T0100Z" +node "20001231T0100Z/baz" "baz\n20001231T0100Z" +node "20001231T0100Z/foo" "foo\n20001231T0100Z" +node "20001231T0100Z/qux" "qux\n20001231T0100Z" +node "20010101T0100Z/bar" "bar\n20010101T0100Z" +node "20010101T0100Z/foo" "foo\n20010101T0100Z" +node "20010102T0100Z/bar" "bar\n20010102T0100Z" +node "20010102T0100Z/foo" "foo\n20010102T0100Z" +node "20010103T0100Z/bar" "bar\n20010103T0100Z" +node "20010103T0100Z/foo" "foo\n20010103T0100Z" +node "20010104T0100Z/bar" "bar\n20010104T0100Z" +node "20010104T0100Z/baz" "baz\n20010104T0100Z" +node "20010104T0100Z/foo" "foo\n20010104T0100Z" +node "20010104T0100Z/qux" "qux\n20010104T0100Z" +node "20010105T0100Z/bar" "bar\n20010105T0100Z" +node "20010105T0100Z/foo" "foo\n20010105T0100Z" +node "20010106T0100Z/bar" "bar\n20010106T0100Z" +node "20010106T0100Z/foo" "foo\n20010106T0100Z" +node "20010107T0100Z/bar" "bar\n20010107T0100Z" +node "20010107T0100Z/foo" "foo\n20010107T0100Z" +node "20010108T0100Z/bar" "bar\n20010108T0100Z" +node "20010108T0100Z/baz" "baz\n20010108T0100Z" +node "20010108T0100Z/foo" "foo\n20010108T0100Z" +node "20010108T0100Z/qux" "qux\n20010108T0100Z" +node "20010109T0100Z/bar" "bar\n20010109T0100Z" +node "20010109T0100Z/foo" "foo\n20010109T0100Z" +node "20010110T0100Z/bar" "bar\n20010110T0100Z" +node "20010110T0100Z/foo" "foo\n20010110T0100Z" +node "20010111T0100Z/bar" "bar\n20010111T0100Z" +node "20010111T0100Z/foo" "foo\n20010111T0100Z" +node "20010112T0100Z/bar" "bar\n20010112T0100Z" +node "20010112T0100Z/baz" "baz\n20010112T0100Z" +node "20010112T0100Z/foo" "foo\n20010112T0100Z" +node "20010112T0100Z/qux" "qux\n20010112T0100Z" +node "20010113T0100Z/bar" "bar\n20010113T0100Z" +node "20010113T0100Z/foo" "foo\n20010113T0100Z" stop diff --git a/tests/functional/cyclers/multidaily/reference.log b/tests/functional/cyclers/multidaily/reference.log index ba17038d877..27aaf96868f 100644 --- a/tests/functional/cyclers/multidaily/reference.log +++ b/tests/functional/cyclers/multidaily/reference.log @@ -1,38 +1,38 @@ Initial point: 20001231T0100 Final point: 20010114 -baz.20001231T0100Z -triggered off ['baz.20001227T0100Z'] -foo.20001231T0100Z -triggered off ['foo.20001230T0100Z'] -qux.20001231T0100Z -triggered off ['baz.20001231T0100Z'] -baz.20010104T0100Z -triggered off ['baz.20001231T0100Z'] -bar.20001231T0100Z -triggered off ['foo.20001231T0100Z'] -foo.20010101T0100Z -triggered off ['foo.20001231T0100Z'] -qux.20010104T0100Z -triggered off ['baz.20010104T0100Z'] -bar.20010101T0100Z -triggered off ['foo.20010101T0100Z'] -foo.20010102T0100Z -triggered off ['foo.20010101T0100Z'] -baz.20010108T0100Z -triggered off ['baz.20010104T0100Z'] -bar.20010102T0100Z -triggered off ['foo.20010102T0100Z'] -foo.20010103T0100Z -triggered off ['foo.20010102T0100Z'] -qux.20010108T0100Z -triggered off ['baz.20010108T0100Z'] -bar.20010103T0100Z -triggered off ['foo.20010103T0100Z'] -foo.20010104T0100Z -triggered off ['foo.20010103T0100Z'] -bar.20010104T0100Z -triggered off ['foo.20010104T0100Z'] -foo.20010105T0100Z -triggered off ['foo.20010104T0100Z'] -bar.20010105T0100Z -triggered off ['foo.20010105T0100Z'] -foo.20010106T0100Z -triggered off ['foo.20010105T0100Z'] -baz.20010112T0100Z -triggered off ['baz.20010108T0100Z'] -bar.20010106T0100Z -triggered off ['foo.20010106T0100Z'] -foo.20010107T0100Z -triggered off ['foo.20010106T0100Z'] -qux.20010112T0100Z -triggered off ['baz.20010112T0100Z'] -foo.20010108T0100Z -triggered off ['foo.20010107T0100Z'] -bar.20010107T0100Z -triggered off ['foo.20010107T0100Z'] -bar.20010108T0100Z -triggered off ['foo.20010108T0100Z'] -foo.20010109T0100Z -triggered off ['foo.20010108T0100Z'] -bar.20010109T0100Z -triggered off ['foo.20010109T0100Z'] -foo.20010110T0100Z -triggered off ['foo.20010109T0100Z'] -bar.20010110T0100Z -triggered off ['foo.20010110T0100Z'] -foo.20010111T0100Z -triggered off ['foo.20010110T0100Z'] -bar.20010111T0100Z -triggered off ['foo.20010111T0100Z'] -foo.20010112T0100Z -triggered off ['foo.20010111T0100Z'] -bar.20010112T0100Z -triggered off ['foo.20010112T0100Z'] -foo.20010113T0100Z -triggered off ['foo.20010112T0100Z'] -bar.20010113T0100Z -triggered off ['foo.20010113T0100Z'] +20001231T0100Z/baz -triggered off ['20001227T0100Z/baz'] +20001231T0100Z/foo -triggered off ['20001230T0100Z/foo'] +20001231T0100Z/qux -triggered off ['20001231T0100Z/baz'] +20010104T0100Z/baz -triggered off ['20001231T0100Z/baz'] +20001231T0100Z/bar -triggered off ['20001231T0100Z/foo'] +20010101T0100Z/foo -triggered off ['20001231T0100Z/foo'] +20010104T0100Z/qux -triggered off ['20010104T0100Z/baz'] +20010101T0100Z/bar -triggered off ['20010101T0100Z/foo'] +20010102T0100Z/foo -triggered off ['20010101T0100Z/foo'] +20010108T0100Z/baz -triggered off ['20010104T0100Z/baz'] +20010102T0100Z/bar -triggered off ['20010102T0100Z/foo'] +20010103T0100Z/foo -triggered off ['20010102T0100Z/foo'] +20010108T0100Z/qux -triggered off ['20010108T0100Z/baz'] +20010103T0100Z/bar -triggered off ['20010103T0100Z/foo'] +20010104T0100Z/foo -triggered off ['20010103T0100Z/foo'] +20010104T0100Z/bar -triggered off ['20010104T0100Z/foo'] +20010105T0100Z/foo -triggered off ['20010104T0100Z/foo'] +20010105T0100Z/bar -triggered off ['20010105T0100Z/foo'] +20010106T0100Z/foo -triggered off ['20010105T0100Z/foo'] +20010112T0100Z/baz -triggered off ['20010108T0100Z/baz'] +20010106T0100Z/bar -triggered off ['20010106T0100Z/foo'] +20010107T0100Z/foo -triggered off ['20010106T0100Z/foo'] +20010112T0100Z/qux -triggered off ['20010112T0100Z/baz'] +20010108T0100Z/foo -triggered off ['20010107T0100Z/foo'] +20010107T0100Z/bar -triggered off ['20010107T0100Z/foo'] +20010108T0100Z/bar -triggered off ['20010108T0100Z/foo'] +20010109T0100Z/foo -triggered off ['20010108T0100Z/foo'] +20010109T0100Z/bar -triggered off ['20010109T0100Z/foo'] +20010110T0100Z/foo -triggered off ['20010109T0100Z/foo'] +20010110T0100Z/bar -triggered off ['20010110T0100Z/foo'] +20010111T0100Z/foo -triggered off ['20010110T0100Z/foo'] +20010111T0100Z/bar -triggered off ['20010111T0100Z/foo'] +20010112T0100Z/foo -triggered off ['20010111T0100Z/foo'] +20010112T0100Z/bar -triggered off ['20010112T0100Z/foo'] +20010113T0100Z/foo -triggered off ['20010112T0100Z/foo'] +20010113T0100Z/bar -triggered off ['20010113T0100Z/foo'] diff --git a/tests/functional/cyclers/multidaily_local/graph.plain.ref b/tests/functional/cyclers/multidaily_local/graph.plain.ref index f87f7ace47a..45b09735511 100644 --- a/tests/functional/cyclers/multidaily_local/graph.plain.ref +++ b/tests/functional/cyclers/multidaily_local/graph.plain.ref @@ -1,72 +1,72 @@ -edge "baz.20001231T0100Z" "baz.20010104T0100Z" -edge "baz.20001231T0100Z" "qux.20001231T0100Z" -edge "baz.20010104T0100Z" "baz.20010108T0100Z" -edge "baz.20010104T0100Z" "qux.20010104T0100Z" -edge "baz.20010108T0100Z" "baz.20010112T0100Z" -edge "baz.20010108T0100Z" "qux.20010108T0100Z" -edge "baz.20010112T0100Z" "qux.20010112T0100Z" -edge "foo.20001231T0100Z" "bar.20001231T0100Z" -edge "foo.20001231T0100Z" "foo.20010101T0100Z" -edge "foo.20010101T0100Z" "bar.20010101T0100Z" -edge "foo.20010101T0100Z" "foo.20010102T0100Z" -edge "foo.20010102T0100Z" "bar.20010102T0100Z" -edge "foo.20010102T0100Z" "foo.20010103T0100Z" -edge "foo.20010103T0100Z" "bar.20010103T0100Z" -edge "foo.20010103T0100Z" "foo.20010104T0100Z" -edge "foo.20010104T0100Z" "bar.20010104T0100Z" -edge "foo.20010104T0100Z" "foo.20010105T0100Z" -edge "foo.20010105T0100Z" "bar.20010105T0100Z" -edge "foo.20010105T0100Z" "foo.20010106T0100Z" -edge "foo.20010106T0100Z" "bar.20010106T0100Z" -edge "foo.20010106T0100Z" "foo.20010107T0100Z" -edge "foo.20010107T0100Z" "bar.20010107T0100Z" -edge "foo.20010107T0100Z" "foo.20010108T0100Z" -edge "foo.20010108T0100Z" "bar.20010108T0100Z" -edge "foo.20010108T0100Z" "foo.20010109T0100Z" -edge "foo.20010109T0100Z" "bar.20010109T0100Z" -edge "foo.20010109T0100Z" "foo.20010110T0100Z" -edge "foo.20010110T0100Z" "bar.20010110T0100Z" -edge "foo.20010110T0100Z" "foo.20010111T0100Z" -edge "foo.20010111T0100Z" "bar.20010111T0100Z" -edge "foo.20010111T0100Z" "foo.20010112T0100Z" -edge "foo.20010112T0100Z" "bar.20010112T0100Z" -edge "foo.20010112T0100Z" "foo.20010113T0100Z" -edge "foo.20010113T0100Z" "bar.20010113T0100Z" +edge "20001231T0100Z/baz" "20001231T0100Z/qux" +edge "20001231T0100Z/baz" "20010104T0100Z/baz" +edge "20001231T0100Z/foo" "20001231T0100Z/bar" +edge "20001231T0100Z/foo" "20010101T0100Z/foo" +edge "20010101T0100Z/foo" "20010101T0100Z/bar" +edge "20010101T0100Z/foo" "20010102T0100Z/foo" +edge "20010102T0100Z/foo" "20010102T0100Z/bar" +edge "20010102T0100Z/foo" "20010103T0100Z/foo" +edge "20010103T0100Z/foo" "20010103T0100Z/bar" +edge "20010103T0100Z/foo" "20010104T0100Z/foo" +edge "20010104T0100Z/baz" "20010104T0100Z/qux" +edge "20010104T0100Z/baz" "20010108T0100Z/baz" +edge "20010104T0100Z/foo" "20010104T0100Z/bar" +edge "20010104T0100Z/foo" "20010105T0100Z/foo" +edge "20010105T0100Z/foo" "20010105T0100Z/bar" +edge "20010105T0100Z/foo" "20010106T0100Z/foo" +edge "20010106T0100Z/foo" "20010106T0100Z/bar" +edge "20010106T0100Z/foo" "20010107T0100Z/foo" +edge "20010107T0100Z/foo" "20010107T0100Z/bar" +edge "20010107T0100Z/foo" "20010108T0100Z/foo" +edge "20010108T0100Z/baz" "20010108T0100Z/qux" +edge "20010108T0100Z/baz" "20010112T0100Z/baz" +edge "20010108T0100Z/foo" "20010108T0100Z/bar" +edge "20010108T0100Z/foo" "20010109T0100Z/foo" +edge "20010109T0100Z/foo" "20010109T0100Z/bar" +edge "20010109T0100Z/foo" "20010110T0100Z/foo" +edge "20010110T0100Z/foo" "20010110T0100Z/bar" +edge "20010110T0100Z/foo" "20010111T0100Z/foo" +edge "20010111T0100Z/foo" "20010111T0100Z/bar" +edge "20010111T0100Z/foo" "20010112T0100Z/foo" +edge "20010112T0100Z/baz" "20010112T0100Z/qux" +edge "20010112T0100Z/foo" "20010112T0100Z/bar" +edge "20010112T0100Z/foo" "20010113T0100Z/foo" +edge "20010113T0100Z/foo" "20010113T0100Z/bar" graph -node "bar.20001231T0100Z" "bar\n20001231T0100Z" -node "bar.20010101T0100Z" "bar\n20010101T0100Z" -node "bar.20010102T0100Z" "bar\n20010102T0100Z" -node "bar.20010103T0100Z" "bar\n20010103T0100Z" -node "bar.20010104T0100Z" "bar\n20010104T0100Z" -node "bar.20010105T0100Z" "bar\n20010105T0100Z" -node "bar.20010106T0100Z" "bar\n20010106T0100Z" -node "bar.20010107T0100Z" "bar\n20010107T0100Z" -node "bar.20010108T0100Z" "bar\n20010108T0100Z" -node "bar.20010109T0100Z" "bar\n20010109T0100Z" -node "bar.20010110T0100Z" "bar\n20010110T0100Z" -node "bar.20010111T0100Z" "bar\n20010111T0100Z" -node "bar.20010112T0100Z" "bar\n20010112T0100Z" -node "bar.20010113T0100Z" "bar\n20010113T0100Z" -node "baz.20001231T0100Z" "baz\n20001231T0100Z" -node "baz.20010104T0100Z" "baz\n20010104T0100Z" -node "baz.20010108T0100Z" "baz\n20010108T0100Z" -node "baz.20010112T0100Z" "baz\n20010112T0100Z" -node "foo.20001231T0100Z" "foo\n20001231T0100Z" -node "foo.20010101T0100Z" "foo\n20010101T0100Z" -node "foo.20010102T0100Z" "foo\n20010102T0100Z" -node "foo.20010103T0100Z" "foo\n20010103T0100Z" -node "foo.20010104T0100Z" "foo\n20010104T0100Z" -node "foo.20010105T0100Z" "foo\n20010105T0100Z" -node "foo.20010106T0100Z" "foo\n20010106T0100Z" -node "foo.20010107T0100Z" "foo\n20010107T0100Z" -node "foo.20010108T0100Z" "foo\n20010108T0100Z" -node "foo.20010109T0100Z" "foo\n20010109T0100Z" -node "foo.20010110T0100Z" "foo\n20010110T0100Z" -node "foo.20010111T0100Z" "foo\n20010111T0100Z" -node "foo.20010112T0100Z" "foo\n20010112T0100Z" -node "foo.20010113T0100Z" "foo\n20010113T0100Z" -node "qux.20001231T0100Z" "qux\n20001231T0100Z" -node "qux.20010104T0100Z" "qux\n20010104T0100Z" -node "qux.20010108T0100Z" "qux\n20010108T0100Z" -node "qux.20010112T0100Z" "qux\n20010112T0100Z" +node "20001231T0100Z/bar" "bar\n20001231T0100Z" +node "20001231T0100Z/baz" "baz\n20001231T0100Z" +node "20001231T0100Z/foo" "foo\n20001231T0100Z" +node "20001231T0100Z/qux" "qux\n20001231T0100Z" +node "20010101T0100Z/bar" "bar\n20010101T0100Z" +node "20010101T0100Z/foo" "foo\n20010101T0100Z" +node "20010102T0100Z/bar" "bar\n20010102T0100Z" +node "20010102T0100Z/foo" "foo\n20010102T0100Z" +node "20010103T0100Z/bar" "bar\n20010103T0100Z" +node "20010103T0100Z/foo" "foo\n20010103T0100Z" +node "20010104T0100Z/bar" "bar\n20010104T0100Z" +node "20010104T0100Z/baz" "baz\n20010104T0100Z" +node "20010104T0100Z/foo" "foo\n20010104T0100Z" +node "20010104T0100Z/qux" "qux\n20010104T0100Z" +node "20010105T0100Z/bar" "bar\n20010105T0100Z" +node "20010105T0100Z/foo" "foo\n20010105T0100Z" +node "20010106T0100Z/bar" "bar\n20010106T0100Z" +node "20010106T0100Z/foo" "foo\n20010106T0100Z" +node "20010107T0100Z/bar" "bar\n20010107T0100Z" +node "20010107T0100Z/foo" "foo\n20010107T0100Z" +node "20010108T0100Z/bar" "bar\n20010108T0100Z" +node "20010108T0100Z/baz" "baz\n20010108T0100Z" +node "20010108T0100Z/foo" "foo\n20010108T0100Z" +node "20010108T0100Z/qux" "qux\n20010108T0100Z" +node "20010109T0100Z/bar" "bar\n20010109T0100Z" +node "20010109T0100Z/foo" "foo\n20010109T0100Z" +node "20010110T0100Z/bar" "bar\n20010110T0100Z" +node "20010110T0100Z/foo" "foo\n20010110T0100Z" +node "20010111T0100Z/bar" "bar\n20010111T0100Z" +node "20010111T0100Z/foo" "foo\n20010111T0100Z" +node "20010112T0100Z/bar" "bar\n20010112T0100Z" +node "20010112T0100Z/baz" "baz\n20010112T0100Z" +node "20010112T0100Z/foo" "foo\n20010112T0100Z" +node "20010112T0100Z/qux" "qux\n20010112T0100Z" +node "20010113T0100Z/bar" "bar\n20010113T0100Z" +node "20010113T0100Z/foo" "foo\n20010113T0100Z" stop diff --git a/tests/functional/cyclers/multidaily_local/reference.log b/tests/functional/cyclers/multidaily_local/reference.log index ba17038d877..27aaf96868f 100644 --- a/tests/functional/cyclers/multidaily_local/reference.log +++ b/tests/functional/cyclers/multidaily_local/reference.log @@ -1,38 +1,38 @@ Initial point: 20001231T0100 Final point: 20010114 -baz.20001231T0100Z -triggered off ['baz.20001227T0100Z'] -foo.20001231T0100Z -triggered off ['foo.20001230T0100Z'] -qux.20001231T0100Z -triggered off ['baz.20001231T0100Z'] -baz.20010104T0100Z -triggered off ['baz.20001231T0100Z'] -bar.20001231T0100Z -triggered off ['foo.20001231T0100Z'] -foo.20010101T0100Z -triggered off ['foo.20001231T0100Z'] -qux.20010104T0100Z -triggered off ['baz.20010104T0100Z'] -bar.20010101T0100Z -triggered off ['foo.20010101T0100Z'] -foo.20010102T0100Z -triggered off ['foo.20010101T0100Z'] -baz.20010108T0100Z -triggered off ['baz.20010104T0100Z'] -bar.20010102T0100Z -triggered off ['foo.20010102T0100Z'] -foo.20010103T0100Z -triggered off ['foo.20010102T0100Z'] -qux.20010108T0100Z -triggered off ['baz.20010108T0100Z'] -bar.20010103T0100Z -triggered off ['foo.20010103T0100Z'] -foo.20010104T0100Z -triggered off ['foo.20010103T0100Z'] -bar.20010104T0100Z -triggered off ['foo.20010104T0100Z'] -foo.20010105T0100Z -triggered off ['foo.20010104T0100Z'] -bar.20010105T0100Z -triggered off ['foo.20010105T0100Z'] -foo.20010106T0100Z -triggered off ['foo.20010105T0100Z'] -baz.20010112T0100Z -triggered off ['baz.20010108T0100Z'] -bar.20010106T0100Z -triggered off ['foo.20010106T0100Z'] -foo.20010107T0100Z -triggered off ['foo.20010106T0100Z'] -qux.20010112T0100Z -triggered off ['baz.20010112T0100Z'] -foo.20010108T0100Z -triggered off ['foo.20010107T0100Z'] -bar.20010107T0100Z -triggered off ['foo.20010107T0100Z'] -bar.20010108T0100Z -triggered off ['foo.20010108T0100Z'] -foo.20010109T0100Z -triggered off ['foo.20010108T0100Z'] -bar.20010109T0100Z -triggered off ['foo.20010109T0100Z'] -foo.20010110T0100Z -triggered off ['foo.20010109T0100Z'] -bar.20010110T0100Z -triggered off ['foo.20010110T0100Z'] -foo.20010111T0100Z -triggered off ['foo.20010110T0100Z'] -bar.20010111T0100Z -triggered off ['foo.20010111T0100Z'] -foo.20010112T0100Z -triggered off ['foo.20010111T0100Z'] -bar.20010112T0100Z -triggered off ['foo.20010112T0100Z'] -foo.20010113T0100Z -triggered off ['foo.20010112T0100Z'] -bar.20010113T0100Z -triggered off ['foo.20010113T0100Z'] +20001231T0100Z/baz -triggered off ['20001227T0100Z/baz'] +20001231T0100Z/foo -triggered off ['20001230T0100Z/foo'] +20001231T0100Z/qux -triggered off ['20001231T0100Z/baz'] +20010104T0100Z/baz -triggered off ['20001231T0100Z/baz'] +20001231T0100Z/bar -triggered off ['20001231T0100Z/foo'] +20010101T0100Z/foo -triggered off ['20001231T0100Z/foo'] +20010104T0100Z/qux -triggered off ['20010104T0100Z/baz'] +20010101T0100Z/bar -triggered off ['20010101T0100Z/foo'] +20010102T0100Z/foo -triggered off ['20010101T0100Z/foo'] +20010108T0100Z/baz -triggered off ['20010104T0100Z/baz'] +20010102T0100Z/bar -triggered off ['20010102T0100Z/foo'] +20010103T0100Z/foo -triggered off ['20010102T0100Z/foo'] +20010108T0100Z/qux -triggered off ['20010108T0100Z/baz'] +20010103T0100Z/bar -triggered off ['20010103T0100Z/foo'] +20010104T0100Z/foo -triggered off ['20010103T0100Z/foo'] +20010104T0100Z/bar -triggered off ['20010104T0100Z/foo'] +20010105T0100Z/foo -triggered off ['20010104T0100Z/foo'] +20010105T0100Z/bar -triggered off ['20010105T0100Z/foo'] +20010106T0100Z/foo -triggered off ['20010105T0100Z/foo'] +20010112T0100Z/baz -triggered off ['20010108T0100Z/baz'] +20010106T0100Z/bar -triggered off ['20010106T0100Z/foo'] +20010107T0100Z/foo -triggered off ['20010106T0100Z/foo'] +20010112T0100Z/qux -triggered off ['20010112T0100Z/baz'] +20010108T0100Z/foo -triggered off ['20010107T0100Z/foo'] +20010107T0100Z/bar -triggered off ['20010107T0100Z/foo'] +20010108T0100Z/bar -triggered off ['20010108T0100Z/foo'] +20010109T0100Z/foo -triggered off ['20010108T0100Z/foo'] +20010109T0100Z/bar -triggered off ['20010109T0100Z/foo'] +20010110T0100Z/foo -triggered off ['20010109T0100Z/foo'] +20010110T0100Z/bar -triggered off ['20010110T0100Z/foo'] +20010111T0100Z/foo -triggered off ['20010110T0100Z/foo'] +20010111T0100Z/bar -triggered off ['20010111T0100Z/foo'] +20010112T0100Z/foo -triggered off ['20010111T0100Z/foo'] +20010112T0100Z/bar -triggered off ['20010112T0100Z/foo'] +20010113T0100Z/foo -triggered off ['20010112T0100Z/foo'] +20010113T0100Z/bar -triggered off ['20010113T0100Z/foo'] diff --git a/tests/functional/cyclers/multihourly/graph.plain.ref b/tests/functional/cyclers/multihourly/graph.plain.ref index e47c34086b7..5a27b71c549 100644 --- a/tests/functional/cyclers/multihourly/graph.plain.ref +++ b/tests/functional/cyclers/multihourly/graph.plain.ref @@ -1,96 +1,96 @@ -edge "baz.20000131T1400+13" "baz.20000131T2000+13" -edge "baz.20000131T1400+13" "qux.20000131T1400+13" -edge "baz.20000131T2000+13" "baz.20000201T0200+13" -edge "baz.20000131T2000+13" "qux.20000131T2000+13" -edge "baz.20000201T0200+13" "baz.20000201T0800+13" -edge "baz.20000201T0200+13" "qux.20000201T0200+13" -edge "baz.20000201T0800+13" "baz.20000201T1400+13" -edge "baz.20000201T0800+13" "qux.20000201T0800+13" -edge "baz.20000201T1400+13" "baz.20000201T2000+13" -edge "baz.20000201T1400+13" "qux.20000201T1400+13" -edge "baz.20000201T2000+13" "baz.20000202T0200+13" -edge "baz.20000201T2000+13" "qux.20000201T2000+13" -edge "baz.20000202T0200+13" "baz.20000202T0800+13" -edge "baz.20000202T0200+13" "qux.20000202T0200+13" -edge "baz.20000202T0800+13" "qux.20000202T0800+13" -edge "foo.20000131T1400+13" "bar.20000131T1400+13" -edge "foo.20000131T1400+13" "foo.20000131T1700+13" -edge "foo.20000131T1700+13" "bar.20000131T1700+13" -edge "foo.20000131T1700+13" "foo.20000131T2000+13" -edge "foo.20000131T2000+13" "bar.20000131T2000+13" -edge "foo.20000131T2000+13" "foo.20000131T2300+13" -edge "foo.20000131T2300+13" "bar.20000131T2300+13" -edge "foo.20000131T2300+13" "foo.20000201T0200+13" -edge "foo.20000201T0200+13" "bar.20000201T0200+13" -edge "foo.20000201T0200+13" "foo.20000201T0500+13" -edge "foo.20000201T0500+13" "bar.20000201T0500+13" -edge "foo.20000201T0500+13" "foo.20000201T0800+13" -edge "foo.20000201T0800+13" "bar.20000201T0800+13" -edge "foo.20000201T0800+13" "foo.20000201T1100+13" -edge "foo.20000201T1100+13" "bar.20000201T1100+13" -edge "foo.20000201T1100+13" "foo.20000201T1400+13" -edge "foo.20000201T1400+13" "bar.20000201T1400+13" -edge "foo.20000201T1400+13" "foo.20000201T1700+13" -edge "foo.20000201T1700+13" "bar.20000201T1700+13" -edge "foo.20000201T1700+13" "foo.20000201T2000+13" -edge "foo.20000201T2000+13" "bar.20000201T2000+13" -edge "foo.20000201T2000+13" "foo.20000201T2300+13" -edge "foo.20000201T2300+13" "bar.20000201T2300+13" -edge "foo.20000201T2300+13" "foo.20000202T0200+13" -edge "foo.20000202T0200+13" "bar.20000202T0200+13" -edge "foo.20000202T0200+13" "foo.20000202T0500+13" -edge "foo.20000202T0500+13" "bar.20000202T0500+13" -edge "foo.20000202T0500+13" "foo.20000202T0800+13" -edge "foo.20000202T0800+13" "bar.20000202T0800+13" -edge "foo.20000202T0800+13" "foo.20000202T1100+13" -edge "foo.20000202T1100+13" "bar.20000202T1100+13" +edge "20000131T1400+13/baz" "20000131T1400+13/qux" +edge "20000131T1400+13/baz" "20000131T2000+13/baz" +edge "20000131T1400+13/foo" "20000131T1400+13/bar" +edge "20000131T1400+13/foo" "20000131T1700+13/foo" +edge "20000131T1700+13/foo" "20000131T1700+13/bar" +edge "20000131T1700+13/foo" "20000131T2000+13/foo" +edge "20000131T2000+13/baz" "20000131T2000+13/qux" +edge "20000131T2000+13/baz" "20000201T0200+13/baz" +edge "20000131T2000+13/foo" "20000131T2000+13/bar" +edge "20000131T2000+13/foo" "20000131T2300+13/foo" +edge "20000131T2300+13/foo" "20000131T2300+13/bar" +edge "20000131T2300+13/foo" "20000201T0200+13/foo" +edge "20000201T0200+13/baz" "20000201T0200+13/qux" +edge "20000201T0200+13/baz" "20000201T0800+13/baz" +edge "20000201T0200+13/foo" "20000201T0200+13/bar" +edge "20000201T0200+13/foo" "20000201T0500+13/foo" +edge "20000201T0500+13/foo" "20000201T0500+13/bar" +edge "20000201T0500+13/foo" "20000201T0800+13/foo" +edge "20000201T0800+13/baz" "20000201T0800+13/qux" +edge "20000201T0800+13/baz" "20000201T1400+13/baz" +edge "20000201T0800+13/foo" "20000201T0800+13/bar" +edge "20000201T0800+13/foo" "20000201T1100+13/foo" +edge "20000201T1100+13/foo" "20000201T1100+13/bar" +edge "20000201T1100+13/foo" "20000201T1400+13/foo" +edge "20000201T1400+13/baz" "20000201T1400+13/qux" +edge "20000201T1400+13/baz" "20000201T2000+13/baz" +edge "20000201T1400+13/foo" "20000201T1400+13/bar" +edge "20000201T1400+13/foo" "20000201T1700+13/foo" +edge "20000201T1700+13/foo" "20000201T1700+13/bar" +edge "20000201T1700+13/foo" "20000201T2000+13/foo" +edge "20000201T2000+13/baz" "20000201T2000+13/qux" +edge "20000201T2000+13/baz" "20000202T0200+13/baz" +edge "20000201T2000+13/foo" "20000201T2000+13/bar" +edge "20000201T2000+13/foo" "20000201T2300+13/foo" +edge "20000201T2300+13/foo" "20000201T2300+13/bar" +edge "20000201T2300+13/foo" "20000202T0200+13/foo" +edge "20000202T0200+13/baz" "20000202T0200+13/qux" +edge "20000202T0200+13/baz" "20000202T0800+13/baz" +edge "20000202T0200+13/foo" "20000202T0200+13/bar" +edge "20000202T0200+13/foo" "20000202T0500+13/foo" +edge "20000202T0500+13/foo" "20000202T0500+13/bar" +edge "20000202T0500+13/foo" "20000202T0800+13/foo" +edge "20000202T0800+13/baz" "20000202T0800+13/qux" +edge "20000202T0800+13/foo" "20000202T0800+13/bar" +edge "20000202T0800+13/foo" "20000202T1100+13/foo" +edge "20000202T1100+13/foo" "20000202T1100+13/bar" graph -node "bar.20000131T1400+13" "bar\n20000131T1400+13" -node "bar.20000131T1700+13" "bar\n20000131T1700+13" -node "bar.20000131T2000+13" "bar\n20000131T2000+13" -node "bar.20000131T2300+13" "bar\n20000131T2300+13" -node "bar.20000201T0200+13" "bar\n20000201T0200+13" -node "bar.20000201T0500+13" "bar\n20000201T0500+13" -node "bar.20000201T0800+13" "bar\n20000201T0800+13" -node "bar.20000201T1100+13" "bar\n20000201T1100+13" -node "bar.20000201T1400+13" "bar\n20000201T1400+13" -node "bar.20000201T1700+13" "bar\n20000201T1700+13" -node "bar.20000201T2000+13" "bar\n20000201T2000+13" -node "bar.20000201T2300+13" "bar\n20000201T2300+13" -node "bar.20000202T0200+13" "bar\n20000202T0200+13" -node "bar.20000202T0500+13" "bar\n20000202T0500+13" -node "bar.20000202T0800+13" "bar\n20000202T0800+13" -node "bar.20000202T1100+13" "bar\n20000202T1100+13" -node "baz.20000131T1400+13" "baz\n20000131T1400+13" -node "baz.20000131T2000+13" "baz\n20000131T2000+13" -node "baz.20000201T0200+13" "baz\n20000201T0200+13" -node "baz.20000201T0800+13" "baz\n20000201T0800+13" -node "baz.20000201T1400+13" "baz\n20000201T1400+13" -node "baz.20000201T2000+13" "baz\n20000201T2000+13" -node "baz.20000202T0200+13" "baz\n20000202T0200+13" -node "baz.20000202T0800+13" "baz\n20000202T0800+13" -node "foo.20000131T1400+13" "foo\n20000131T1400+13" -node "foo.20000131T1700+13" "foo\n20000131T1700+13" -node "foo.20000131T2000+13" "foo\n20000131T2000+13" -node "foo.20000131T2300+13" "foo\n20000131T2300+13" -node "foo.20000201T0200+13" "foo\n20000201T0200+13" -node "foo.20000201T0500+13" "foo\n20000201T0500+13" -node "foo.20000201T0800+13" "foo\n20000201T0800+13" -node "foo.20000201T1100+13" "foo\n20000201T1100+13" -node "foo.20000201T1400+13" "foo\n20000201T1400+13" -node "foo.20000201T1700+13" "foo\n20000201T1700+13" -node "foo.20000201T2000+13" "foo\n20000201T2000+13" -node "foo.20000201T2300+13" "foo\n20000201T2300+13" -node "foo.20000202T0200+13" "foo\n20000202T0200+13" -node "foo.20000202T0500+13" "foo\n20000202T0500+13" -node "foo.20000202T0800+13" "foo\n20000202T0800+13" -node "foo.20000202T1100+13" "foo\n20000202T1100+13" -node "qux.20000131T1400+13" "qux\n20000131T1400+13" -node "qux.20000131T2000+13" "qux\n20000131T2000+13" -node "qux.20000201T0200+13" "qux\n20000201T0200+13" -node "qux.20000201T0800+13" "qux\n20000201T0800+13" -node "qux.20000201T1400+13" "qux\n20000201T1400+13" -node "qux.20000201T2000+13" "qux\n20000201T2000+13" -node "qux.20000202T0200+13" "qux\n20000202T0200+13" -node "qux.20000202T0800+13" "qux\n20000202T0800+13" +node "20000131T1400+13/bar" "bar\n20000131T1400+13" +node "20000131T1400+13/baz" "baz\n20000131T1400+13" +node "20000131T1400+13/foo" "foo\n20000131T1400+13" +node "20000131T1400+13/qux" "qux\n20000131T1400+13" +node "20000131T1700+13/bar" "bar\n20000131T1700+13" +node "20000131T1700+13/foo" "foo\n20000131T1700+13" +node "20000131T2000+13/bar" "bar\n20000131T2000+13" +node "20000131T2000+13/baz" "baz\n20000131T2000+13" +node "20000131T2000+13/foo" "foo\n20000131T2000+13" +node "20000131T2000+13/qux" "qux\n20000131T2000+13" +node "20000131T2300+13/bar" "bar\n20000131T2300+13" +node "20000131T2300+13/foo" "foo\n20000131T2300+13" +node "20000201T0200+13/bar" "bar\n20000201T0200+13" +node "20000201T0200+13/baz" "baz\n20000201T0200+13" +node "20000201T0200+13/foo" "foo\n20000201T0200+13" +node "20000201T0200+13/qux" "qux\n20000201T0200+13" +node "20000201T0500+13/bar" "bar\n20000201T0500+13" +node "20000201T0500+13/foo" "foo\n20000201T0500+13" +node "20000201T0800+13/bar" "bar\n20000201T0800+13" +node "20000201T0800+13/baz" "baz\n20000201T0800+13" +node "20000201T0800+13/foo" "foo\n20000201T0800+13" +node "20000201T0800+13/qux" "qux\n20000201T0800+13" +node "20000201T1100+13/bar" "bar\n20000201T1100+13" +node "20000201T1100+13/foo" "foo\n20000201T1100+13" +node "20000201T1400+13/bar" "bar\n20000201T1400+13" +node "20000201T1400+13/baz" "baz\n20000201T1400+13" +node "20000201T1400+13/foo" "foo\n20000201T1400+13" +node "20000201T1400+13/qux" "qux\n20000201T1400+13" +node "20000201T1700+13/bar" "bar\n20000201T1700+13" +node "20000201T1700+13/foo" "foo\n20000201T1700+13" +node "20000201T2000+13/bar" "bar\n20000201T2000+13" +node "20000201T2000+13/baz" "baz\n20000201T2000+13" +node "20000201T2000+13/foo" "foo\n20000201T2000+13" +node "20000201T2000+13/qux" "qux\n20000201T2000+13" +node "20000201T2300+13/bar" "bar\n20000201T2300+13" +node "20000201T2300+13/foo" "foo\n20000201T2300+13" +node "20000202T0200+13/bar" "bar\n20000202T0200+13" +node "20000202T0200+13/baz" "baz\n20000202T0200+13" +node "20000202T0200+13/foo" "foo\n20000202T0200+13" +node "20000202T0200+13/qux" "qux\n20000202T0200+13" +node "20000202T0500+13/bar" "bar\n20000202T0500+13" +node "20000202T0500+13/foo" "foo\n20000202T0500+13" +node "20000202T0800+13/bar" "bar\n20000202T0800+13" +node "20000202T0800+13/baz" "baz\n20000202T0800+13" +node "20000202T0800+13/foo" "foo\n20000202T0800+13" +node "20000202T0800+13/qux" "qux\n20000202T0800+13" +node "20000202T1100+13/bar" "bar\n20000202T1100+13" +node "20000202T1100+13/foo" "foo\n20000202T1100+13" stop diff --git a/tests/functional/cyclers/multihourly/reference.log b/tests/functional/cyclers/multihourly/reference.log index 684941ae092..27454f1c14a 100644 --- a/tests/functional/cyclers/multihourly/reference.log +++ b/tests/functional/cyclers/multihourly/reference.log @@ -1,50 +1,50 @@ Initial point: 20000131T0100Z Final point: 20000202T0600+0600 -baz.20000131T1400+13 -triggered off ['baz.20000131T0800+13'] -foo.20000131T1400+13 -triggered off ['foo.20000131T1100+13'] -qux.20000131T1400+13 -triggered off ['baz.20000131T1400+13'] -baz.20000131T2000+13 -triggered off ['baz.20000131T1400+13'] -bar.20000131T1400+13 -triggered off ['foo.20000131T1400+13'] -foo.20000131T1700+13 -triggered off ['foo.20000131T1400+13'] -qux.20000131T2000+13 -triggered off ['baz.20000131T2000+13'] -baz.20000201T0200+13 -triggered off ['baz.20000131T2000+13'] -bar.20000131T1700+13 -triggered off ['foo.20000131T1700+13'] -foo.20000131T2000+13 -triggered off ['foo.20000131T1700+13'] -qux.20000201T0200+13 -triggered off ['baz.20000201T0200+13'] -baz.20000201T0800+13 -triggered off ['baz.20000201T0200+13'] -bar.20000131T2000+13 -triggered off ['foo.20000131T2000+13'] -foo.20000131T2300+13 -triggered off ['foo.20000131T2000+13'] -qux.20000201T0800+13 -triggered off ['baz.20000201T0800+13'] -bar.20000131T2300+13 -triggered off ['foo.20000131T2300+13'] -foo.20000201T0200+13 -triggered off ['foo.20000131T2300+13'] -baz.20000201T1400+13 -triggered off ['baz.20000201T0800+13'] -bar.20000201T0200+13 -triggered off ['foo.20000201T0200+13'] -foo.20000201T0500+13 -triggered off ['foo.20000201T0200+13'] -qux.20000201T1400+13 -triggered off ['baz.20000201T1400+13'] -foo.20000201T0800+13 -triggered off ['foo.20000201T0500+13'] -bar.20000201T0500+13 -triggered off ['foo.20000201T0500+13'] -foo.20000201T1100+13 -triggered off ['foo.20000201T0800+13'] -bar.20000201T0800+13 -triggered off ['foo.20000201T0800+13'] -baz.20000201T2000+13 -triggered off ['baz.20000201T1400+13'] -foo.20000201T1400+13 -triggered off ['foo.20000201T1100+13'] -bar.20000201T1100+13 -triggered off ['foo.20000201T1100+13'] -qux.20000201T2000+13 -triggered off ['baz.20000201T2000+13'] -foo.20000201T1700+13 -triggered off ['foo.20000201T1400+13'] -bar.20000201T1400+13 -triggered off ['foo.20000201T1400+13'] -baz.20000202T0200+13 -triggered off ['baz.20000201T2000+13'] -foo.20000201T2000+13 -triggered off ['foo.20000201T1700+13'] -bar.20000201T1700+13 -triggered off ['foo.20000201T1700+13'] -qux.20000202T0200+13 -triggered off ['baz.20000202T0200+13'] -baz.20000202T0800+13 -triggered off ['baz.20000202T0200+13'] -foo.20000201T2300+13 -triggered off ['foo.20000201T2000+13'] -bar.20000201T2000+13 -triggered off ['foo.20000201T2000+13'] -qux.20000202T0800+13 -triggered off ['baz.20000202T0800+13'] -bar.20000201T2300+13 -triggered off ['foo.20000201T2300+13'] -foo.20000202T0200+13 -triggered off ['foo.20000201T2300+13'] -bar.20000202T0200+13 -triggered off ['foo.20000202T0200+13'] -foo.20000202T0500+13 -triggered off ['foo.20000202T0200+13'] -bar.20000202T0500+13 -triggered off ['foo.20000202T0500+13'] -foo.20000202T0800+13 -triggered off ['foo.20000202T0500+13'] -bar.20000202T0800+13 -triggered off ['foo.20000202T0800+13'] -foo.20000202T1100+13 -triggered off ['foo.20000202T0800+13'] -bar.20000202T1100+13 -triggered off ['foo.20000202T1100+13'] +20000131T1400+13/baz -triggered off ['20000131T0800+13/baz'] +20000131T1400+13/foo -triggered off ['20000131T1100+13/foo'] +20000131T1400+13/qux -triggered off ['20000131T1400+13/baz'] +20000131T2000+13/baz -triggered off ['20000131T1400+13/baz'] +20000131T1400+13/bar -triggered off ['20000131T1400+13/foo'] +20000131T1700+13/foo -triggered off ['20000131T1400+13/foo'] +20000131T2000+13/qux -triggered off ['20000131T2000+13/baz'] +20000201T0200+13/baz -triggered off ['20000131T2000+13/baz'] +20000131T1700+13/bar -triggered off ['20000131T1700+13/foo'] +20000131T2000+13/foo -triggered off ['20000131T1700+13/foo'] +20000201T0200+13/qux -triggered off ['20000201T0200+13/baz'] +20000201T0800+13/baz -triggered off ['20000201T0200+13/baz'] +20000131T2000+13/bar -triggered off ['20000131T2000+13/foo'] +20000131T2300+13/foo -triggered off ['20000131T2000+13/foo'] +20000201T0800+13/qux -triggered off ['20000201T0800+13/baz'] +20000131T2300+13/bar -triggered off ['20000131T2300+13/foo'] +20000201T0200+13/foo -triggered off ['20000131T2300+13/foo'] +20000201T1400+13/baz -triggered off ['20000201T0800+13/baz'] +20000201T0200+13/bar -triggered off ['20000201T0200+13/foo'] +20000201T0500+13/foo -triggered off ['20000201T0200+13/foo'] +20000201T1400+13/qux -triggered off ['20000201T1400+13/baz'] +20000201T0800+13/foo -triggered off ['20000201T0500+13/foo'] +20000201T0500+13/bar -triggered off ['20000201T0500+13/foo'] +20000201T1100+13/foo -triggered off ['20000201T0800+13/foo'] +20000201T0800+13/bar -triggered off ['20000201T0800+13/foo'] +20000201T2000+13/baz -triggered off ['20000201T1400+13/baz'] +20000201T1400+13/foo -triggered off ['20000201T1100+13/foo'] +20000201T1100+13/bar -triggered off ['20000201T1100+13/foo'] +20000201T2000+13/qux -triggered off ['20000201T2000+13/baz'] +20000201T1700+13/foo -triggered off ['20000201T1400+13/foo'] +20000201T1400+13/bar -triggered off ['20000201T1400+13/foo'] +20000202T0200+13/baz -triggered off ['20000201T2000+13/baz'] +20000201T2000+13/foo -triggered off ['20000201T1700+13/foo'] +20000201T1700+13/bar -triggered off ['20000201T1700+13/foo'] +20000202T0200+13/qux -triggered off ['20000202T0200+13/baz'] +20000202T0800+13/baz -triggered off ['20000202T0200+13/baz'] +20000201T2300+13/foo -triggered off ['20000201T2000+13/foo'] +20000201T2000+13/bar -triggered off ['20000201T2000+13/foo'] +20000202T0800+13/qux -triggered off ['20000202T0800+13/baz'] +20000201T2300+13/bar -triggered off ['20000201T2300+13/foo'] +20000202T0200+13/foo -triggered off ['20000201T2300+13/foo'] +20000202T0200+13/bar -triggered off ['20000202T0200+13/foo'] +20000202T0500+13/foo -triggered off ['20000202T0200+13/foo'] +20000202T0500+13/bar -triggered off ['20000202T0500+13/foo'] +20000202T0800+13/foo -triggered off ['20000202T0500+13/foo'] +20000202T0800+13/bar -triggered off ['20000202T0800+13/foo'] +20000202T1100+13/foo -triggered off ['20000202T0800+13/foo'] +20000202T1100+13/bar -triggered off ['20000202T1100+13/foo'] diff --git a/tests/functional/cyclers/multimonthly/graph.plain.ref b/tests/functional/cyclers/multimonthly/graph.plain.ref index b89a97d8e6e..c286d28b06d 100644 --- a/tests/functional/cyclers/multimonthly/graph.plain.ref +++ b/tests/functional/cyclers/multimonthly/graph.plain.ref @@ -1,64 +1,64 @@ -edge "baz.10000101T0000Z" "baz.10000701T0000Z" -edge "baz.10000101T0000Z" "qux.10000101T0000Z" -edge "baz.10000701T0000Z" "baz.10010101T0000Z" -edge "baz.10000701T0000Z" "qux.10000701T0000Z" -edge "baz.10010101T0000Z" "qux.10010101T0000Z" -edge "foo.10000101T0000Z" "bar.10000101T0000Z" -edge "foo.10000101T0000Z" "foo.10000201T0000Z" -edge "foo.10000201T0000Z" "bar.10000201T0000Z" -edge "foo.10000201T0000Z" "foo.10000301T0000Z" -edge "foo.10000301T0000Z" "bar.10000301T0000Z" -edge "foo.10000301T0000Z" "foo.10000401T0000Z" -edge "foo.10000401T0000Z" "bar.10000401T0000Z" -edge "foo.10000401T0000Z" "foo.10000501T0000Z" -edge "foo.10000501T0000Z" "bar.10000501T0000Z" -edge "foo.10000501T0000Z" "foo.10000601T0000Z" -edge "foo.10000601T0000Z" "bar.10000601T0000Z" -edge "foo.10000601T0000Z" "foo.10000701T0000Z" -edge "foo.10000701T0000Z" "bar.10000701T0000Z" -edge "foo.10000701T0000Z" "foo.10000801T0000Z" -edge "foo.10000801T0000Z" "bar.10000801T0000Z" -edge "foo.10000801T0000Z" "foo.10000901T0000Z" -edge "foo.10000901T0000Z" "bar.10000901T0000Z" -edge "foo.10000901T0000Z" "foo.10001001T0000Z" -edge "foo.10001001T0000Z" "bar.10001001T0000Z" -edge "foo.10001001T0000Z" "foo.10001101T0000Z" -edge "foo.10001101T0000Z" "bar.10001101T0000Z" -edge "foo.10001101T0000Z" "foo.10001201T0000Z" -edge "foo.10001201T0000Z" "bar.10001201T0000Z" -edge "foo.10001201T0000Z" "foo.10010101T0000Z" -edge "foo.10010101T0000Z" "bar.10010101T0000Z" +edge "10000101T0000Z/baz" "10000101T0000Z/qux" +edge "10000101T0000Z/baz" "10000701T0000Z/baz" +edge "10000101T0000Z/foo" "10000101T0000Z/bar" +edge "10000101T0000Z/foo" "10000201T0000Z/foo" +edge "10000201T0000Z/foo" "10000201T0000Z/bar" +edge "10000201T0000Z/foo" "10000301T0000Z/foo" +edge "10000301T0000Z/foo" "10000301T0000Z/bar" +edge "10000301T0000Z/foo" "10000401T0000Z/foo" +edge "10000401T0000Z/foo" "10000401T0000Z/bar" +edge "10000401T0000Z/foo" "10000501T0000Z/foo" +edge "10000501T0000Z/foo" "10000501T0000Z/bar" +edge "10000501T0000Z/foo" "10000601T0000Z/foo" +edge "10000601T0000Z/foo" "10000601T0000Z/bar" +edge "10000601T0000Z/foo" "10000701T0000Z/foo" +edge "10000701T0000Z/baz" "10000701T0000Z/qux" +edge "10000701T0000Z/baz" "10010101T0000Z/baz" +edge "10000701T0000Z/foo" "10000701T0000Z/bar" +edge "10000701T0000Z/foo" "10000801T0000Z/foo" +edge "10000801T0000Z/foo" "10000801T0000Z/bar" +edge "10000801T0000Z/foo" "10000901T0000Z/foo" +edge "10000901T0000Z/foo" "10000901T0000Z/bar" +edge "10000901T0000Z/foo" "10001001T0000Z/foo" +edge "10001001T0000Z/foo" "10001001T0000Z/bar" +edge "10001001T0000Z/foo" "10001101T0000Z/foo" +edge "10001101T0000Z/foo" "10001101T0000Z/bar" +edge "10001101T0000Z/foo" "10001201T0000Z/foo" +edge "10001201T0000Z/foo" "10001201T0000Z/bar" +edge "10001201T0000Z/foo" "10010101T0000Z/foo" +edge "10010101T0000Z/baz" "10010101T0000Z/qux" +edge "10010101T0000Z/foo" "10010101T0000Z/bar" graph -node "bar.10000101T0000Z" "bar\n10000101T0000Z" -node "bar.10000201T0000Z" "bar\n10000201T0000Z" -node "bar.10000301T0000Z" "bar\n10000301T0000Z" -node "bar.10000401T0000Z" "bar\n10000401T0000Z" -node "bar.10000501T0000Z" "bar\n10000501T0000Z" -node "bar.10000601T0000Z" "bar\n10000601T0000Z" -node "bar.10000701T0000Z" "bar\n10000701T0000Z" -node "bar.10000801T0000Z" "bar\n10000801T0000Z" -node "bar.10000901T0000Z" "bar\n10000901T0000Z" -node "bar.10001001T0000Z" "bar\n10001001T0000Z" -node "bar.10001101T0000Z" "bar\n10001101T0000Z" -node "bar.10001201T0000Z" "bar\n10001201T0000Z" -node "bar.10010101T0000Z" "bar\n10010101T0000Z" -node "baz.10000101T0000Z" "baz\n10000101T0000Z" -node "baz.10000701T0000Z" "baz\n10000701T0000Z" -node "baz.10010101T0000Z" "baz\n10010101T0000Z" -node "foo.10000101T0000Z" "foo\n10000101T0000Z" -node "foo.10000201T0000Z" "foo\n10000201T0000Z" -node "foo.10000301T0000Z" "foo\n10000301T0000Z" -node "foo.10000401T0000Z" "foo\n10000401T0000Z" -node "foo.10000501T0000Z" "foo\n10000501T0000Z" -node "foo.10000601T0000Z" "foo\n10000601T0000Z" -node "foo.10000701T0000Z" "foo\n10000701T0000Z" -node "foo.10000801T0000Z" "foo\n10000801T0000Z" -node "foo.10000901T0000Z" "foo\n10000901T0000Z" -node "foo.10001001T0000Z" "foo\n10001001T0000Z" -node "foo.10001101T0000Z" "foo\n10001101T0000Z" -node "foo.10001201T0000Z" "foo\n10001201T0000Z" -node "foo.10010101T0000Z" "foo\n10010101T0000Z" -node "qux.10000101T0000Z" "qux\n10000101T0000Z" -node "qux.10000701T0000Z" "qux\n10000701T0000Z" -node "qux.10010101T0000Z" "qux\n10010101T0000Z" +node "10000101T0000Z/bar" "bar\n10000101T0000Z" +node "10000101T0000Z/baz" "baz\n10000101T0000Z" +node "10000101T0000Z/foo" "foo\n10000101T0000Z" +node "10000101T0000Z/qux" "qux\n10000101T0000Z" +node "10000201T0000Z/bar" "bar\n10000201T0000Z" +node "10000201T0000Z/foo" "foo\n10000201T0000Z" +node "10000301T0000Z/bar" "bar\n10000301T0000Z" +node "10000301T0000Z/foo" "foo\n10000301T0000Z" +node "10000401T0000Z/bar" "bar\n10000401T0000Z" +node "10000401T0000Z/foo" "foo\n10000401T0000Z" +node "10000501T0000Z/bar" "bar\n10000501T0000Z" +node "10000501T0000Z/foo" "foo\n10000501T0000Z" +node "10000601T0000Z/bar" "bar\n10000601T0000Z" +node "10000601T0000Z/foo" "foo\n10000601T0000Z" +node "10000701T0000Z/bar" "bar\n10000701T0000Z" +node "10000701T0000Z/baz" "baz\n10000701T0000Z" +node "10000701T0000Z/foo" "foo\n10000701T0000Z" +node "10000701T0000Z/qux" "qux\n10000701T0000Z" +node "10000801T0000Z/bar" "bar\n10000801T0000Z" +node "10000801T0000Z/foo" "foo\n10000801T0000Z" +node "10000901T0000Z/bar" "bar\n10000901T0000Z" +node "10000901T0000Z/foo" "foo\n10000901T0000Z" +node "10001001T0000Z/bar" "bar\n10001001T0000Z" +node "10001001T0000Z/foo" "foo\n10001001T0000Z" +node "10001101T0000Z/bar" "bar\n10001101T0000Z" +node "10001101T0000Z/foo" "foo\n10001101T0000Z" +node "10001201T0000Z/bar" "bar\n10001201T0000Z" +node "10001201T0000Z/foo" "foo\n10001201T0000Z" +node "10010101T0000Z/bar" "bar\n10010101T0000Z" +node "10010101T0000Z/baz" "baz\n10010101T0000Z" +node "10010101T0000Z/foo" "foo\n10010101T0000Z" +node "10010101T0000Z/qux" "qux\n10010101T0000Z" stop diff --git a/tests/functional/cyclers/multimonthly/reference.log b/tests/functional/cyclers/multimonthly/reference.log index ec33fa51534..4e91dfa3a58 100644 --- a/tests/functional/cyclers/multimonthly/reference.log +++ b/tests/functional/cyclers/multimonthly/reference.log @@ -1,34 +1,34 @@ Initial point: 1000 Final point: 1001 -baz.10000101T0000Z -triggered off ['baz.09990701T0000Z'] -foo.10000101T0000Z -triggered off ['foo.09991201T0000Z'] -bar.10000101T0000Z -triggered off ['foo.10000101T0000Z'] -qux.10000101T0000Z -triggered off ['baz.10000101T0000Z'] -baz.10000701T0000Z -triggered off ['baz.10000101T0000Z'] -foo.10000201T0000Z -triggered off ['foo.10000101T0000Z'] -qux.10000701T0000Z -triggered off ['baz.10000701T0000Z'] -bar.10000201T0000Z -triggered off ['foo.10000201T0000Z'] -foo.10000301T0000Z -triggered off ['foo.10000201T0000Z'] -bar.10000301T0000Z -triggered off ['foo.10000301T0000Z'] -foo.10000401T0000Z -triggered off ['foo.10000301T0000Z'] -bar.10000401T0000Z -triggered off ['foo.10000401T0000Z'] -foo.10000501T0000Z -triggered off ['foo.10000401T0000Z'] -baz.10010101T0000Z -triggered off ['baz.10000701T0000Z'] -bar.10000501T0000Z -triggered off ['foo.10000501T0000Z'] -foo.10000601T0000Z -triggered off ['foo.10000501T0000Z'] -qux.10010101T0000Z -triggered off ['baz.10010101T0000Z'] -foo.10000701T0000Z -triggered off ['foo.10000601T0000Z'] -bar.10000601T0000Z -triggered off ['foo.10000601T0000Z'] -foo.10000801T0000Z -triggered off ['foo.10000701T0000Z'] -bar.10000701T0000Z -triggered off ['foo.10000701T0000Z'] -foo.10000901T0000Z -triggered off ['foo.10000801T0000Z'] -bar.10000801T0000Z -triggered off ['foo.10000801T0000Z'] -foo.10001001T0000Z -triggered off ['foo.10000901T0000Z'] -bar.10000901T0000Z -triggered off ['foo.10000901T0000Z'] -foo.10001101T0000Z -triggered off ['foo.10001001T0000Z'] -bar.10001001T0000Z -triggered off ['foo.10001001T0000Z'] -foo.10001201T0000Z -triggered off ['foo.10001101T0000Z'] -bar.10001101T0000Z -triggered off ['foo.10001101T0000Z'] -foo.10010101T0000Z -triggered off ['foo.10001201T0000Z'] -bar.10001201T0000Z -triggered off ['foo.10001201T0000Z'] -bar.10010101T0000Z -triggered off ['foo.10010101T0000Z'] +10000101T0000Z/baz -triggered off ['09990701T0000Z/baz'] +10000101T0000Z/foo -triggered off ['09991201T0000Z/foo'] +10000101T0000Z/bar -triggered off ['10000101T0000Z/foo'] +10000101T0000Z/qux -triggered off ['10000101T0000Z/baz'] +10000701T0000Z/baz -triggered off ['10000101T0000Z/baz'] +10000201T0000Z/foo -triggered off ['10000101T0000Z/foo'] +10000701T0000Z/qux -triggered off ['10000701T0000Z/baz'] +10000201T0000Z/bar -triggered off ['10000201T0000Z/foo'] +10000301T0000Z/foo -triggered off ['10000201T0000Z/foo'] +10000301T0000Z/bar -triggered off ['10000301T0000Z/foo'] +10000401T0000Z/foo -triggered off ['10000301T0000Z/foo'] +10000401T0000Z/bar -triggered off ['10000401T0000Z/foo'] +10000501T0000Z/foo -triggered off ['10000401T0000Z/foo'] +10010101T0000Z/baz -triggered off ['10000701T0000Z/baz'] +10000501T0000Z/bar -triggered off ['10000501T0000Z/foo'] +10000601T0000Z/foo -triggered off ['10000501T0000Z/foo'] +10010101T0000Z/qux -triggered off ['10010101T0000Z/baz'] +10000701T0000Z/foo -triggered off ['10000601T0000Z/foo'] +10000601T0000Z/bar -triggered off ['10000601T0000Z/foo'] +10000801T0000Z/foo -triggered off ['10000701T0000Z/foo'] +10000701T0000Z/bar -triggered off ['10000701T0000Z/foo'] +10000901T0000Z/foo -triggered off ['10000801T0000Z/foo'] +10000801T0000Z/bar -triggered off ['10000801T0000Z/foo'] +10001001T0000Z/foo -triggered off ['10000901T0000Z/foo'] +10000901T0000Z/bar -triggered off ['10000901T0000Z/foo'] +10001101T0000Z/foo -triggered off ['10001001T0000Z/foo'] +10001001T0000Z/bar -triggered off ['10001001T0000Z/foo'] +10001201T0000Z/foo -triggered off ['10001101T0000Z/foo'] +10001101T0000Z/bar -triggered off ['10001101T0000Z/foo'] +10010101T0000Z/foo -triggered off ['10001201T0000Z/foo'] +10001201T0000Z/bar -triggered off ['10001201T0000Z/foo'] +10010101T0000Z/bar -triggered off ['10010101T0000Z/foo'] diff --git a/tests/functional/cyclers/multiweekly/graph.plain.ref b/tests/functional/cyclers/multiweekly/graph.plain.ref index 2abd6067f5e..401bbb57100 100644 --- a/tests/functional/cyclers/multiweekly/graph.plain.ref +++ b/tests/functional/cyclers/multiweekly/graph.plain.ref @@ -1,32 +1,32 @@ -edge "baz.09991230T0000Z" "baz.10000120T0000Z" -edge "baz.09991230T0000Z" "qux.09991230T0000Z" -edge "baz.10000120T0000Z" "qux.10000120T0000Z" -edge "foo.09991230T0000Z" "bar.09991230T0000Z" -edge "foo.09991230T0000Z" "foo.10000106T0000Z" -edge "foo.10000106T0000Z" "bar.10000106T0000Z" -edge "foo.10000106T0000Z" "foo.10000113T0000Z" -edge "foo.10000113T0000Z" "bar.10000113T0000Z" -edge "foo.10000113T0000Z" "foo.10000120T0000Z" -edge "foo.10000120T0000Z" "bar.10000120T0000Z" -edge "foo.10000120T0000Z" "foo.10000127T0000Z" -edge "foo.10000127T0000Z" "bar.10000127T0000Z" -edge "foo.10000127T0000Z" "foo.10000203T0000Z" -edge "foo.10000203T0000Z" "bar.10000203T0000Z" +edge "09991230T0000Z/baz" "09991230T0000Z/qux" +edge "09991230T0000Z/baz" "10000120T0000Z/baz" +edge "09991230T0000Z/foo" "09991230T0000Z/bar" +edge "09991230T0000Z/foo" "10000106T0000Z/foo" +edge "10000106T0000Z/foo" "10000106T0000Z/bar" +edge "10000106T0000Z/foo" "10000113T0000Z/foo" +edge "10000113T0000Z/foo" "10000113T0000Z/bar" +edge "10000113T0000Z/foo" "10000120T0000Z/foo" +edge "10000120T0000Z/baz" "10000120T0000Z/qux" +edge "10000120T0000Z/foo" "10000120T0000Z/bar" +edge "10000120T0000Z/foo" "10000127T0000Z/foo" +edge "10000127T0000Z/foo" "10000127T0000Z/bar" +edge "10000127T0000Z/foo" "10000203T0000Z/foo" +edge "10000203T0000Z/foo" "10000203T0000Z/bar" graph -node "bar.09991230T0000Z" "bar\n09991230T0000Z" -node "bar.10000106T0000Z" "bar\n10000106T0000Z" -node "bar.10000113T0000Z" "bar\n10000113T0000Z" -node "bar.10000120T0000Z" "bar\n10000120T0000Z" -node "bar.10000127T0000Z" "bar\n10000127T0000Z" -node "bar.10000203T0000Z" "bar\n10000203T0000Z" -node "baz.09991230T0000Z" "baz\n09991230T0000Z" -node "baz.10000120T0000Z" "baz\n10000120T0000Z" -node "foo.09991230T0000Z" "foo\n09991230T0000Z" -node "foo.10000106T0000Z" "foo\n10000106T0000Z" -node "foo.10000113T0000Z" "foo\n10000113T0000Z" -node "foo.10000120T0000Z" "foo\n10000120T0000Z" -node "foo.10000127T0000Z" "foo\n10000127T0000Z" -node "foo.10000203T0000Z" "foo\n10000203T0000Z" -node "qux.09991230T0000Z" "qux\n09991230T0000Z" -node "qux.10000120T0000Z" "qux\n10000120T0000Z" +node "09991230T0000Z/bar" "bar\n09991230T0000Z" +node "09991230T0000Z/baz" "baz\n09991230T0000Z" +node "09991230T0000Z/foo" "foo\n09991230T0000Z" +node "09991230T0000Z/qux" "qux\n09991230T0000Z" +node "10000106T0000Z/bar" "bar\n10000106T0000Z" +node "10000106T0000Z/foo" "foo\n10000106T0000Z" +node "10000113T0000Z/bar" "bar\n10000113T0000Z" +node "10000113T0000Z/foo" "foo\n10000113T0000Z" +node "10000120T0000Z/bar" "bar\n10000120T0000Z" +node "10000120T0000Z/baz" "baz\n10000120T0000Z" +node "10000120T0000Z/foo" "foo\n10000120T0000Z" +node "10000120T0000Z/qux" "qux\n10000120T0000Z" +node "10000127T0000Z/bar" "bar\n10000127T0000Z" +node "10000127T0000Z/foo" "foo\n10000127T0000Z" +node "10000203T0000Z/bar" "bar\n10000203T0000Z" +node "10000203T0000Z/foo" "foo\n10000203T0000Z" stop diff --git a/tests/functional/cyclers/multiweekly/reference.log b/tests/functional/cyclers/multiweekly/reference.log index f8e7308a23b..41009f64e7a 100644 --- a/tests/functional/cyclers/multiweekly/reference.log +++ b/tests/functional/cyclers/multiweekly/reference.log @@ -1,18 +1,18 @@ Initial point: 1000W011 Final point: 1000W064 -baz.09991230T0000Z -triggered off ['baz.09991209T0000Z'] -foo.09991230T0000Z -triggered off ['foo.09991223T0000Z'] -bar.09991230T0000Z -triggered off ['foo.09991230T0000Z'] -qux.09991230T0000Z -triggered off ['baz.09991230T0000Z'] -baz.10000120T0000Z -triggered off ['baz.09991230T0000Z'] -foo.10000106T0000Z -triggered off ['foo.09991230T0000Z'] -bar.10000106T0000Z -triggered off ['foo.10000106T0000Z'] -qux.10000120T0000Z -triggered off ['baz.10000120T0000Z'] -foo.10000113T0000Z -triggered off ['foo.10000106T0000Z'] -bar.10000113T0000Z -triggered off ['foo.10000113T0000Z'] -foo.10000120T0000Z -triggered off ['foo.10000113T0000Z'] -bar.10000120T0000Z -triggered off ['foo.10000120T0000Z'] -foo.10000127T0000Z -triggered off ['foo.10000120T0000Z'] -bar.10000127T0000Z -triggered off ['foo.10000127T0000Z'] -foo.10000203T0000Z -triggered off ['foo.10000127T0000Z'] -bar.10000203T0000Z -triggered off ['foo.10000203T0000Z'] +09991230T0000Z/baz -triggered off ['09991209T0000Z/baz'] +09991230T0000Z/foo -triggered off ['09991223T0000Z/foo'] +09991230T0000Z/bar -triggered off ['09991230T0000Z/foo'] +09991230T0000Z/qux -triggered off ['09991230T0000Z/baz'] +10000120T0000Z/baz -triggered off ['09991230T0000Z/baz'] +10000106T0000Z/foo -triggered off ['09991230T0000Z/foo'] +10000106T0000Z/bar -triggered off ['10000106T0000Z/foo'] +10000120T0000Z/qux -triggered off ['10000120T0000Z/baz'] +10000113T0000Z/foo -triggered off ['10000106T0000Z/foo'] +10000113T0000Z/bar -triggered off ['10000113T0000Z/foo'] +10000120T0000Z/foo -triggered off ['10000113T0000Z/foo'] +10000120T0000Z/bar -triggered off ['10000120T0000Z/foo'] +10000127T0000Z/foo -triggered off ['10000120T0000Z/foo'] +10000127T0000Z/bar -triggered off ['10000127T0000Z/foo'] +10000203T0000Z/foo -triggered off ['10000127T0000Z/foo'] +10000203T0000Z/bar -triggered off ['10000203T0000Z/foo'] diff --git a/tests/functional/cyclers/multiyearly/graph.plain.ref b/tests/functional/cyclers/multiyearly/graph.plain.ref index 7e21257820c..13eef09d487 100644 --- a/tests/functional/cyclers/multiyearly/graph.plain.ref +++ b/tests/functional/cyclers/multiyearly/graph.plain.ref @@ -1,52 +1,52 @@ -edge "baz.10050101T0000Z" "baz.10090101T0000Z" -edge "baz.10050101T0000Z" "qux.10050101T0000Z" -edge "baz.10090101T0000Z" "baz.10130101T0000Z" -edge "baz.10090101T0000Z" "qux.10090101T0000Z" -edge "baz.10130101T0000Z" "qux.10130101T0000Z" -edge "foo.10050101T0000Z" "bar.10050101T0000Z" -edge "foo.10050101T0000Z" "foo.10060101T0000Z" -edge "foo.10060101T0000Z" "bar.10060101T0000Z" -edge "foo.10060101T0000Z" "foo.10070101T0000Z" -edge "foo.10070101T0000Z" "bar.10070101T0000Z" -edge "foo.10070101T0000Z" "foo.10080101T0000Z" -edge "foo.10080101T0000Z" "bar.10080101T0000Z" -edge "foo.10080101T0000Z" "foo.10090101T0000Z" -edge "foo.10090101T0000Z" "bar.10090101T0000Z" -edge "foo.10090101T0000Z" "foo.10100101T0000Z" -edge "foo.10100101T0000Z" "bar.10100101T0000Z" -edge "foo.10100101T0000Z" "foo.10110101T0000Z" -edge "foo.10110101T0000Z" "bar.10110101T0000Z" -edge "foo.10110101T0000Z" "foo.10120101T0000Z" -edge "foo.10120101T0000Z" "bar.10120101T0000Z" -edge "foo.10120101T0000Z" "foo.10130101T0000Z" -edge "foo.10130101T0000Z" "bar.10130101T0000Z" -edge "foo.10130101T0000Z" "foo.10140101T0000Z" -edge "foo.10140101T0000Z" "bar.10140101T0000Z" +edge "10050101T0000Z/baz" "10050101T0000Z/qux" +edge "10050101T0000Z/baz" "10090101T0000Z/baz" +edge "10050101T0000Z/foo" "10050101T0000Z/bar" +edge "10050101T0000Z/foo" "10060101T0000Z/foo" +edge "10060101T0000Z/foo" "10060101T0000Z/bar" +edge "10060101T0000Z/foo" "10070101T0000Z/foo" +edge "10070101T0000Z/foo" "10070101T0000Z/bar" +edge "10070101T0000Z/foo" "10080101T0000Z/foo" +edge "10080101T0000Z/foo" "10080101T0000Z/bar" +edge "10080101T0000Z/foo" "10090101T0000Z/foo" +edge "10090101T0000Z/baz" "10090101T0000Z/qux" +edge "10090101T0000Z/baz" "10130101T0000Z/baz" +edge "10090101T0000Z/foo" "10090101T0000Z/bar" +edge "10090101T0000Z/foo" "10100101T0000Z/foo" +edge "10100101T0000Z/foo" "10100101T0000Z/bar" +edge "10100101T0000Z/foo" "10110101T0000Z/foo" +edge "10110101T0000Z/foo" "10110101T0000Z/bar" +edge "10110101T0000Z/foo" "10120101T0000Z/foo" +edge "10120101T0000Z/foo" "10120101T0000Z/bar" +edge "10120101T0000Z/foo" "10130101T0000Z/foo" +edge "10130101T0000Z/baz" "10130101T0000Z/qux" +edge "10130101T0000Z/foo" "10130101T0000Z/bar" +edge "10130101T0000Z/foo" "10140101T0000Z/foo" +edge "10140101T0000Z/foo" "10140101T0000Z/bar" graph -node "bar.10050101T0000Z" "bar\n10050101T0000Z" -node "bar.10060101T0000Z" "bar\n10060101T0000Z" -node "bar.10070101T0000Z" "bar\n10070101T0000Z" -node "bar.10080101T0000Z" "bar\n10080101T0000Z" -node "bar.10090101T0000Z" "bar\n10090101T0000Z" -node "bar.10100101T0000Z" "bar\n10100101T0000Z" -node "bar.10110101T0000Z" "bar\n10110101T0000Z" -node "bar.10120101T0000Z" "bar\n10120101T0000Z" -node "bar.10130101T0000Z" "bar\n10130101T0000Z" -node "bar.10140101T0000Z" "bar\n10140101T0000Z" -node "baz.10050101T0000Z" "baz\n10050101T0000Z" -node "baz.10090101T0000Z" "baz\n10090101T0000Z" -node "baz.10130101T0000Z" "baz\n10130101T0000Z" -node "foo.10050101T0000Z" "foo\n10050101T0000Z" -node "foo.10060101T0000Z" "foo\n10060101T0000Z" -node "foo.10070101T0000Z" "foo\n10070101T0000Z" -node "foo.10080101T0000Z" "foo\n10080101T0000Z" -node "foo.10090101T0000Z" "foo\n10090101T0000Z" -node "foo.10100101T0000Z" "foo\n10100101T0000Z" -node "foo.10110101T0000Z" "foo\n10110101T0000Z" -node "foo.10120101T0000Z" "foo\n10120101T0000Z" -node "foo.10130101T0000Z" "foo\n10130101T0000Z" -node "foo.10140101T0000Z" "foo\n10140101T0000Z" -node "qux.10050101T0000Z" "qux\n10050101T0000Z" -node "qux.10090101T0000Z" "qux\n10090101T0000Z" -node "qux.10130101T0000Z" "qux\n10130101T0000Z" +node "10050101T0000Z/bar" "bar\n10050101T0000Z" +node "10050101T0000Z/baz" "baz\n10050101T0000Z" +node "10050101T0000Z/foo" "foo\n10050101T0000Z" +node "10050101T0000Z/qux" "qux\n10050101T0000Z" +node "10060101T0000Z/bar" "bar\n10060101T0000Z" +node "10060101T0000Z/foo" "foo\n10060101T0000Z" +node "10070101T0000Z/bar" "bar\n10070101T0000Z" +node "10070101T0000Z/foo" "foo\n10070101T0000Z" +node "10080101T0000Z/bar" "bar\n10080101T0000Z" +node "10080101T0000Z/foo" "foo\n10080101T0000Z" +node "10090101T0000Z/bar" "bar\n10090101T0000Z" +node "10090101T0000Z/baz" "baz\n10090101T0000Z" +node "10090101T0000Z/foo" "foo\n10090101T0000Z" +node "10090101T0000Z/qux" "qux\n10090101T0000Z" +node "10100101T0000Z/bar" "bar\n10100101T0000Z" +node "10100101T0000Z/foo" "foo\n10100101T0000Z" +node "10110101T0000Z/bar" "bar\n10110101T0000Z" +node "10110101T0000Z/foo" "foo\n10110101T0000Z" +node "10120101T0000Z/bar" "bar\n10120101T0000Z" +node "10120101T0000Z/foo" "foo\n10120101T0000Z" +node "10130101T0000Z/bar" "bar\n10130101T0000Z" +node "10130101T0000Z/baz" "baz\n10130101T0000Z" +node "10130101T0000Z/foo" "foo\n10130101T0000Z" +node "10130101T0000Z/qux" "qux\n10130101T0000Z" +node "10140101T0000Z/bar" "bar\n10140101T0000Z" +node "10140101T0000Z/foo" "foo\n10140101T0000Z" stop diff --git a/tests/functional/cyclers/multiyearly/reference.log b/tests/functional/cyclers/multiyearly/reference.log index 3748954f5f7..3472842b42a 100644 --- a/tests/functional/cyclers/multiyearly/reference.log +++ b/tests/functional/cyclers/multiyearly/reference.log @@ -1,28 +1,28 @@ Initial point: 1005 Final point: 1014 -baz.10050101T0000Z -triggered off ['baz.10010101T0000Z'] -foo.10050101T0000Z -triggered off ['foo.10040101T0000Z'] -qux.10050101T0000Z -triggered off ['baz.10050101T0000Z'] -baz.10090101T0000Z -triggered off ['baz.10050101T0000Z'] -bar.10050101T0000Z -triggered off ['foo.10050101T0000Z'] -foo.10060101T0000Z -triggered off ['foo.10050101T0000Z'] -bar.10060101T0000Z -triggered off ['foo.10060101T0000Z'] -foo.10070101T0000Z -triggered off ['foo.10060101T0000Z'] -qux.10090101T0000Z -triggered off ['baz.10090101T0000Z'] -bar.10070101T0000Z -triggered off ['foo.10070101T0000Z'] -foo.10080101T0000Z -triggered off ['foo.10070101T0000Z'] -baz.10130101T0000Z -triggered off ['baz.10090101T0000Z'] -bar.10080101T0000Z -triggered off ['foo.10080101T0000Z'] -foo.10090101T0000Z -triggered off ['foo.10080101T0000Z'] -qux.10130101T0000Z -triggered off ['baz.10130101T0000Z'] -bar.10090101T0000Z -triggered off ['foo.10090101T0000Z'] -foo.10100101T0000Z -triggered off ['foo.10090101T0000Z'] -bar.10100101T0000Z -triggered off ['foo.10100101T0000Z'] -foo.10110101T0000Z -triggered off ['foo.10100101T0000Z'] -bar.10110101T0000Z -triggered off ['foo.10110101T0000Z'] -foo.10120101T0000Z -triggered off ['foo.10110101T0000Z'] -bar.10120101T0000Z -triggered off ['foo.10120101T0000Z'] -foo.10130101T0000Z -triggered off ['foo.10120101T0000Z'] -bar.10130101T0000Z -triggered off ['foo.10130101T0000Z'] -foo.10140101T0000Z -triggered off ['foo.10130101T0000Z'] -bar.10140101T0000Z -triggered off ['foo.10140101T0000Z'] +10050101T0000Z/baz -triggered off ['10010101T0000Z/baz'] +10050101T0000Z/foo -triggered off ['10040101T0000Z/foo'] +10050101T0000Z/qux -triggered off ['10050101T0000Z/baz'] +10090101T0000Z/baz -triggered off ['10050101T0000Z/baz'] +10050101T0000Z/bar -triggered off ['10050101T0000Z/foo'] +10060101T0000Z/foo -triggered off ['10050101T0000Z/foo'] +10060101T0000Z/bar -triggered off ['10060101T0000Z/foo'] +10070101T0000Z/foo -triggered off ['10060101T0000Z/foo'] +10090101T0000Z/qux -triggered off ['10090101T0000Z/baz'] +10070101T0000Z/bar -triggered off ['10070101T0000Z/foo'] +10080101T0000Z/foo -triggered off ['10070101T0000Z/foo'] +10130101T0000Z/baz -triggered off ['10090101T0000Z/baz'] +10080101T0000Z/bar -triggered off ['10080101T0000Z/foo'] +10090101T0000Z/foo -triggered off ['10080101T0000Z/foo'] +10130101T0000Z/qux -triggered off ['10130101T0000Z/baz'] +10090101T0000Z/bar -triggered off ['10090101T0000Z/foo'] +10100101T0000Z/foo -triggered off ['10090101T0000Z/foo'] +10100101T0000Z/bar -triggered off ['10100101T0000Z/foo'] +10110101T0000Z/foo -triggered off ['10100101T0000Z/foo'] +10110101T0000Z/bar -triggered off ['10110101T0000Z/foo'] +10120101T0000Z/foo -triggered off ['10110101T0000Z/foo'] +10120101T0000Z/bar -triggered off ['10120101T0000Z/foo'] +10130101T0000Z/foo -triggered off ['10120101T0000Z/foo'] +10130101T0000Z/bar -triggered off ['10130101T0000Z/foo'] +10140101T0000Z/foo -triggered off ['10130101T0000Z/foo'] +10140101T0000Z/bar -triggered off ['10140101T0000Z/foo'] diff --git a/tests/functional/cyclers/offset_final/graph.plain.ref b/tests/functional/cyclers/offset_final/graph.plain.ref index d2682b5f689..c3d1fab5551 100644 --- a/tests/functional/cyclers/offset_final/graph.plain.ref +++ b/tests/functional/cyclers/offset_final/graph.plain.ref @@ -1,5 +1,5 @@ -edge "bar.20140101T1200Z" "baz.20140101T1200Z" +edge "20140101T1200Z/bar" "20140101T1200Z/baz" graph -node "bar.20140101T1200Z" "bar\n20140101T1200Z" -node "baz.20140101T1200Z" "baz\n20140101T1200Z" +node "20140101T1200Z/bar" "bar\n20140101T1200Z" +node "20140101T1200Z/baz" "baz\n20140101T1200Z" stop diff --git a/tests/functional/cyclers/offset_final/reference.log b/tests/functional/cyclers/offset_final/reference.log index 709aaa8841e..4ca9408aac2 100644 --- a/tests/functional/cyclers/offset_final/reference.log +++ b/tests/functional/cyclers/offset_final/reference.log @@ -1,4 +1,4 @@ -2014/03/31 10:14:45 INFO - Initial point: 20140101 -2014/03/31 10:14:45 INFO - Final point: 20140102T12 -2014/03/31 10:14:45 DEBUG - bar.20140101T1200Z -triggered off [] -2014/03/31 10:14:54 DEBUG - baz.20140101T1200Z -triggered off ['bar.20140101T1200Z'] +Initial point: 20140101 +Final point: 20140102T12 +20140101T1200Z/bar -triggered off [] +20140101T1200Z/baz -triggered off ['20140101T1200Z/bar'] diff --git a/tests/functional/cyclers/offset_initial/graph.plain.ref b/tests/functional/cyclers/offset_initial/graph.plain.ref index 2749963938a..9a93c0740bf 100644 --- a/tests/functional/cyclers/offset_initial/graph.plain.ref +++ b/tests/functional/cyclers/offset_initial/graph.plain.ref @@ -1,11 +1,11 @@ -edge "bar.20140102T0000Z" "baz.20140102T0000Z" -edge "bar.20140102T0600Z" "baz.20140102T0600Z" -edge "bar.20140102T1200Z" "baz.20140102T1200Z" +edge "20140102T0000Z/bar" "20140102T0000Z/baz" +edge "20140102T0600Z/bar" "20140102T0600Z/baz" +edge "20140102T1200Z/bar" "20140102T1200Z/baz" graph -node "bar.20140102T0000Z" "bar\n20140102T0000Z" -node "bar.20140102T0600Z" "bar\n20140102T0600Z" -node "bar.20140102T1200Z" "bar\n20140102T1200Z" -node "baz.20140102T0000Z" "baz\n20140102T0000Z" -node "baz.20140102T0600Z" "baz\n20140102T0600Z" -node "baz.20140102T1200Z" "baz\n20140102T1200Z" +node "20140102T0000Z/bar" "bar\n20140102T0000Z" +node "20140102T0000Z/baz" "baz\n20140102T0000Z" +node "20140102T0600Z/bar" "bar\n20140102T0600Z" +node "20140102T0600Z/baz" "baz\n20140102T0600Z" +node "20140102T1200Z/bar" "bar\n20140102T1200Z" +node "20140102T1200Z/baz" "baz\n20140102T1200Z" stop diff --git a/tests/functional/cyclers/offset_initial/reference.log b/tests/functional/cyclers/offset_initial/reference.log index 364b02116ef..91d55a49130 100644 --- a/tests/functional/cyclers/offset_initial/reference.log +++ b/tests/functional/cyclers/offset_initial/reference.log @@ -1,8 +1,8 @@ -2014/03/31 10:14:49 INFO - Initial point: 20140101 -2014/03/31 10:14:49 INFO - Final point: 20140102T12 -2014/03/31 10:14:49 DEBUG - bar.20140102T0000Z -triggered off [] -2014/03/31 10:14:53 DEBUG - bar.20140102T0600Z -triggered off [] -2014/03/31 10:14:56 DEBUG - baz.20140102T0000Z -triggered off ['bar.20140102T0000Z'] -2014/03/31 10:14:56 DEBUG - bar.20140102T1200Z -triggered off [] -2014/03/31 10:15:01 DEBUG - baz.20140102T0600Z -triggered off ['bar.20140102T0600Z'] -2014/03/31 10:15:04 DEBUG - baz.20140102T1200Z -triggered off ['bar.20140102T1200Z'] +Initial point: 20140101 +Final point: 20140102T12 +20140102T0000Z/bar -triggered off [] +20140102T0600Z/bar -triggered off [] +20140102T0000Z/baz -triggered off ['20140102T0000Z/bar'] +20140102T1200Z/bar -triggered off [] +20140102T0600Z/baz -triggered off ['20140102T0600Z/bar'] +20140102T1200Z/baz -triggered off ['20140102T1200Z/bar'] diff --git a/tests/functional/cyclers/r1_final/graph.plain.ref b/tests/functional/cyclers/r1_final/graph.plain.ref index 42a90f679f2..06e1e2ad5c6 100644 --- a/tests/functional/cyclers/r1_final/graph.plain.ref +++ b/tests/functional/cyclers/r1_final/graph.plain.ref @@ -1,5 +1,5 @@ -edge "foo.20140102T1200Z" "final_foo.20140102T1200Z" +edge "20140102T1200Z/foo" "20140102T1200Z/final_foo" graph -node "final_foo.20140102T1200Z" "final_foo\n20140102T1200Z" -node "foo.20140102T1200Z" "foo\n20140102T1200Z" +node "20140102T1200Z/final_foo" "final_foo\n20140102T1200Z" +node "20140102T1200Z/foo" "foo\n20140102T1200Z" stop diff --git a/tests/functional/cyclers/r1_final/reference.log b/tests/functional/cyclers/r1_final/reference.log index 315257254eb..8022ceb304d 100644 --- a/tests/functional/cyclers/r1_final/reference.log +++ b/tests/functional/cyclers/r1_final/reference.log @@ -1,4 +1,4 @@ -2014/03/31 10:14:53 INFO - Initial point: 20140101 -2014/03/31 10:14:53 INFO - Final point: 20140102T12 -2014/03/31 10:14:53 DEBUG - foo.20140102T1200Z -triggered off [] -2014/03/31 10:15:06 DEBUG - final_foo.20140102T1200Z -triggered off ['foo.20140102T1200Z'] +Initial point: 20140101 +Final point: 20140102T12 +20140102T1200Z/foo -triggered off [] +20140102T1200Z/final_foo -triggered off ['20140102T1200Z/foo'] diff --git a/tests/functional/cyclers/r1_initial/graph.plain.ref b/tests/functional/cyclers/r1_initial/graph.plain.ref index 28a9940172f..589d3e20932 100644 --- a/tests/functional/cyclers/r1_initial/graph.plain.ref +++ b/tests/functional/cyclers/r1_initial/graph.plain.ref @@ -1,11 +1,11 @@ -edge "cold_foo.20140101T0000Z" "foo.20140101T0000Z" -edge "foo.20140101T0000Z" "foo.20140101T1200Z" -edge "foo.20140101T1200Z" "foo.20140102T0000Z" -edge "foo.20140102T0000Z" "foo.20140102T1200Z" +edge "20140101T0000Z/cold_foo" "20140101T0000Z/foo" +edge "20140101T0000Z/foo" "20140101T1200Z/foo" +edge "20140101T1200Z/foo" "20140102T0000Z/foo" +edge "20140102T0000Z/foo" "20140102T1200Z/foo" graph -node "cold_foo.20140101T0000Z" "cold_foo\n20140101T0000Z" -node "foo.20140101T0000Z" "foo\n20140101T0000Z" -node "foo.20140101T1200Z" "foo\n20140101T1200Z" -node "foo.20140102T0000Z" "foo\n20140102T0000Z" -node "foo.20140102T1200Z" "foo\n20140102T1200Z" +node "20140101T0000Z/cold_foo" "cold_foo\n20140101T0000Z" +node "20140101T0000Z/foo" "foo\n20140101T0000Z" +node "20140101T1200Z/foo" "foo\n20140101T1200Z" +node "20140102T0000Z/foo" "foo\n20140102T0000Z" +node "20140102T1200Z/foo" "foo\n20140102T1200Z" stop diff --git a/tests/functional/cyclers/r1_initial/reference.log b/tests/functional/cyclers/r1_initial/reference.log index fd0ab24d382..9a61bdb4851 100644 --- a/tests/functional/cyclers/r1_initial/reference.log +++ b/tests/functional/cyclers/r1_initial/reference.log @@ -1,7 +1,7 @@ Initial point: 20140101 Final point: 20140102T12 -cold_foo.20140101T0000Z -triggered off [] -foo.20140101T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20131231T1200Z'] -foo.20140101T1200Z -triggered off ['foo.20140101T0000Z'] -foo.20140102T0000Z -triggered off ['foo.20140101T1200Z'] -foo.20140102T1200Z -triggered off ['foo.20140102T0000Z'] +20140101T0000Z/cold_foo -triggered off [] +20140101T0000Z/foo -triggered off ['20131231T1200Z/foo', '20140101T0000Z/cold_foo'] +20140101T1200Z/foo -triggered off ['20140101T0000Z/foo'] +20140102T0000Z/foo -triggered off ['20140101T1200Z/foo'] +20140102T1200Z/foo -triggered off ['20140102T0000Z/foo'] diff --git a/tests/functional/cyclers/r1_initial_back_comp_standalone_line/graph.plain.ref b/tests/functional/cyclers/r1_initial_back_comp_standalone_line/graph.plain.ref index ae96b92deff..effc50ffc6a 100644 --- a/tests/functional/cyclers/r1_initial_back_comp_standalone_line/graph.plain.ref +++ b/tests/functional/cyclers/r1_initial_back_comp_standalone_line/graph.plain.ref @@ -1,7 +1,7 @@ -edge "cold_foo.2014010100" "foo_midnight.2014010100" -edge "foo_midnight.2014010100" "foo_midnight.2014010200" +edge "2014010100/cold_foo" "2014010100/foo_midnight" +edge "2014010100/foo_midnight" "2014010200/foo_midnight" graph -node "cold_foo.2014010100" "cold_foo\n2014010100" -node "foo_midnight.2014010100" "foo_midnight\n2014010100" -node "foo_midnight.2014010200" "foo_midnight\n2014010200" +node "2014010100/cold_foo" "cold_foo\n2014010100" +node "2014010100/foo_midnight" "foo_midnight\n2014010100" +node "2014010200/foo_midnight" "foo_midnight\n2014010200" stop diff --git a/tests/functional/cyclers/r1_initial_back_comp_standalone_line/reference.log b/tests/functional/cyclers/r1_initial_back_comp_standalone_line/reference.log index 47c6f970c57..a540a5e1ab3 100644 --- a/tests/functional/cyclers/r1_initial_back_comp_standalone_line/reference.log +++ b/tests/functional/cyclers/r1_initial_back_comp_standalone_line/reference.log @@ -1,7 +1,7 @@ -2014-11-21T10:40:43Z INFO - Initial point: 2014010100 -2014-11-21T10:40:43Z INFO - Final point: 2014010400 -2014-11-21T10:40:43Z DEBUG - cold_foo.2014010100 -triggered off [] -2014-11-21T10:40:46Z DEBUG - foo_midnight.2014010100 -triggered off ['cold_foo.2014010100'] -2014-11-21T10:40:49Z DEBUG - foo_midnight.2014010200 -triggered off ['foo_midnight.2014010100'] -2014-11-21T10:40:52Z DEBUG - foo_midnight.2014010300 -triggered off ['foo_midnight.2014010200'] -2014-11-21T10:40:55Z DEBUG - foo_midnight.2014010400 -triggered off ['foo_midnight.2014010300'] +Initial point: 2014010100 +Final point: 2014010400 +2014010100/cold_foo -triggered off [] +2014010100/foo_midnight -triggered off ['2014010100/cold_foo'] +2014010200/foo_midnight -triggered off ['2014010100/foo_midnight'] +2014010300/foo_midnight -triggered off ['2014010200/foo_midnight'] +2014010400/foo_midnight -triggered off ['2014010300/foo_midnight'] diff --git a/tests/functional/cyclers/r1_initial_immortal/flow.cylc b/tests/functional/cyclers/r1_initial_immortal/flow.cylc index 45c7be6dbe4..00b634e9e3f 100644 --- a/tests/functional/cyclers/r1_initial_immortal/flow.cylc +++ b/tests/functional/cyclers/r1_initial_immortal/flow.cylc @@ -11,4 +11,4 @@ [[root]] script = true [[stop]] - script = cylc shutdown "${CYLC_WORKFLOW_ID}" '20140107' + script = cylc stop "${CYLC_WORKFLOW_ID}//20140107" diff --git a/tests/functional/cyclers/r1_initial_immortal/graph.plain.ref b/tests/functional/cyclers/r1_initial_immortal/graph.plain.ref index d39e654a168..494c0315f1f 100644 --- a/tests/functional/cyclers/r1_initial_immortal/graph.plain.ref +++ b/tests/functional/cyclers/r1_initial_immortal/graph.plain.ref @@ -1,61 +1,61 @@ -edge "cold_foo.20140101T0000Z" "foo.20140101T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140101T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140102T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140102T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140103T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140103T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140104T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140104T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140105T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140105T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140106T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140106T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140107T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140107T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140108T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140108T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140109T0000Z" -edge "cold_foo.20140101T0000Z" "foo.20140109T1200Z" -edge "cold_foo.20140101T0000Z" "foo.20140110T0000Z" -edge "foo.20140101T0000Z" "foo.20140101T1200Z" -edge "foo.20140101T1200Z" "foo.20140102T0000Z" -edge "foo.20140102T0000Z" "foo.20140102T1200Z" -edge "foo.20140102T1200Z" "foo.20140103T0000Z" -edge "foo.20140103T0000Z" "foo.20140103T1200Z" -edge "foo.20140103T1200Z" "foo.20140104T0000Z" -edge "foo.20140104T0000Z" "foo.20140104T1200Z" -edge "foo.20140104T1200Z" "foo.20140105T0000Z" -edge "foo.20140105T0000Z" "foo.20140105T1200Z" -edge "foo.20140105T1200Z" "foo.20140106T0000Z" -edge "foo.20140106T0000Z" "foo.20140106T1200Z" -edge "foo.20140106T1200Z" "foo.20140107T0000Z" -edge "foo.20140107T0000Z" "foo.20140107T1200Z" -edge "foo.20140107T1200Z" "foo.20140108T0000Z" -edge "foo.20140108T0000Z" "foo.20140108T1200Z" -edge "foo.20140108T1200Z" "foo.20140109T0000Z" -edge "foo.20140109T0000Z" "foo.20140109T1200Z" -edge "foo.20140109T1200Z" "foo.20140110T0000Z" -edge "stop.20140105T0000Z" "foo.20140105T0000Z" +edge "20140101T0000Z/cold_foo" "20140101T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140101T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140102T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140102T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140103T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140103T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140104T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140104T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140105T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140105T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140106T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140106T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140107T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140107T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140108T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140108T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140109T0000Z/foo" +edge "20140101T0000Z/cold_foo" "20140109T1200Z/foo" +edge "20140101T0000Z/cold_foo" "20140110T0000Z/foo" +edge "20140101T0000Z/foo" "20140101T1200Z/foo" +edge "20140101T1200Z/foo" "20140102T0000Z/foo" +edge "20140102T0000Z/foo" "20140102T1200Z/foo" +edge "20140102T1200Z/foo" "20140103T0000Z/foo" +edge "20140103T0000Z/foo" "20140103T1200Z/foo" +edge "20140103T1200Z/foo" "20140104T0000Z/foo" +edge "20140104T0000Z/foo" "20140104T1200Z/foo" +edge "20140104T1200Z/foo" "20140105T0000Z/foo" +edge "20140105T0000Z/foo" "20140105T1200Z/foo" +edge "20140105T0000Z/stop" "20140105T0000Z/foo" +edge "20140105T1200Z/foo" "20140106T0000Z/foo" +edge "20140106T0000Z/foo" "20140106T1200Z/foo" +edge "20140106T1200Z/foo" "20140107T0000Z/foo" +edge "20140107T0000Z/foo" "20140107T1200Z/foo" +edge "20140107T1200Z/foo" "20140108T0000Z/foo" +edge "20140108T0000Z/foo" "20140108T1200Z/foo" +edge "20140108T1200Z/foo" "20140109T0000Z/foo" +edge "20140109T0000Z/foo" "20140109T1200Z/foo" +edge "20140109T1200Z/foo" "20140110T0000Z/foo" graph -node "cold_foo.20140101T0000Z" "cold_foo\n20140101T0000Z" -node "foo.20140101T0000Z" "foo\n20140101T0000Z" -node "foo.20140101T1200Z" "foo\n20140101T1200Z" -node "foo.20140102T0000Z" "foo\n20140102T0000Z" -node "foo.20140102T1200Z" "foo\n20140102T1200Z" -node "foo.20140103T0000Z" "foo\n20140103T0000Z" -node "foo.20140103T1200Z" "foo\n20140103T1200Z" -node "foo.20140104T0000Z" "foo\n20140104T0000Z" -node "foo.20140104T1200Z" "foo\n20140104T1200Z" -node "foo.20140105T0000Z" "foo\n20140105T0000Z" -node "foo.20140105T1200Z" "foo\n20140105T1200Z" -node "foo.20140106T0000Z" "foo\n20140106T0000Z" -node "foo.20140106T1200Z" "foo\n20140106T1200Z" -node "foo.20140107T0000Z" "foo\n20140107T0000Z" -node "foo.20140107T1200Z" "foo\n20140107T1200Z" -node "foo.20140108T0000Z" "foo\n20140108T0000Z" -node "foo.20140108T1200Z" "foo\n20140108T1200Z" -node "foo.20140109T0000Z" "foo\n20140109T0000Z" -node "foo.20140109T1200Z" "foo\n20140109T1200Z" -node "foo.20140110T0000Z" "foo\n20140110T0000Z" -node "stop.20140105T0000Z" "stop\n20140105T0000Z" +node "20140101T0000Z/cold_foo" "cold_foo\n20140101T0000Z" +node "20140101T0000Z/foo" "foo\n20140101T0000Z" +node "20140101T1200Z/foo" "foo\n20140101T1200Z" +node "20140102T0000Z/foo" "foo\n20140102T0000Z" +node "20140102T1200Z/foo" "foo\n20140102T1200Z" +node "20140103T0000Z/foo" "foo\n20140103T0000Z" +node "20140103T1200Z/foo" "foo\n20140103T1200Z" +node "20140104T0000Z/foo" "foo\n20140104T0000Z" +node "20140104T1200Z/foo" "foo\n20140104T1200Z" +node "20140105T0000Z/foo" "foo\n20140105T0000Z" +node "20140105T0000Z/stop" "stop\n20140105T0000Z" +node "20140105T1200Z/foo" "foo\n20140105T1200Z" +node "20140106T0000Z/foo" "foo\n20140106T0000Z" +node "20140106T1200Z/foo" "foo\n20140106T1200Z" +node "20140107T0000Z/foo" "foo\n20140107T0000Z" +node "20140107T1200Z/foo" "foo\n20140107T1200Z" +node "20140108T0000Z/foo" "foo\n20140108T0000Z" +node "20140108T1200Z/foo" "foo\n20140108T1200Z" +node "20140109T0000Z/foo" "foo\n20140109T0000Z" +node "20140109T1200Z/foo" "foo\n20140109T1200Z" +node "20140110T0000Z/foo" "foo\n20140110T0000Z" stop diff --git a/tests/functional/cyclers/r1_initial_immortal/reference.log b/tests/functional/cyclers/r1_initial_immortal/reference.log index d88af7b9c40..eaf2ccf05e1 100644 --- a/tests/functional/cyclers/r1_initial_immortal/reference.log +++ b/tests/functional/cyclers/r1_initial_immortal/reference.log @@ -1,17 +1,17 @@ Initial point: 20140101T0000Z Final point: None -cold_foo.20140101T0000Z -triggered off [] -foo.20140101T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20131231T1200Z'] -foo.20140101T1200Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140101T0000Z'] -foo.20140102T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140101T1200Z'] -foo.20140102T1200Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140102T0000Z'] -foo.20140103T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140102T1200Z'] -foo.20140103T1200Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140103T0000Z'] -stop.20140105T0000Z -triggered off [] -foo.20140104T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140103T1200Z'] -foo.20140104T1200Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140104T0000Z'] -foo.20140105T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140104T1200Z', 'stop.20140105T0000Z'] -foo.20140105T1200Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140105T0000Z'] -foo.20140106T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140105T1200Z'] -foo.20140106T1200Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140106T0000Z'] -foo.20140107T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo.20140106T1200Z'] +20140101T0000Z/cold_foo -triggered off [] +20140101T0000Z/foo -triggered off ['20131231T1200Z/foo', '20140101T0000Z/cold_foo'] +20140101T1200Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140101T0000Z/foo'] +20140102T0000Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140101T1200Z/foo'] +20140102T1200Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140102T0000Z/foo'] +20140103T0000Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140102T1200Z/foo'] +20140103T1200Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140103T0000Z/foo'] +20140105T0000Z/stop -triggered off [] +20140104T0000Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140103T1200Z/foo'] +20140104T1200Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140104T0000Z/foo'] +20140105T0000Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140104T1200Z/foo', '20140105T0000Z/stop'] +20140105T1200Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140105T0000Z/foo'] +20140106T0000Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140105T1200Z/foo'] +20140106T1200Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140106T0000Z/foo'] +20140107T0000Z/foo -triggered off ['20140101T0000Z/cold_foo', '20140106T1200Z/foo'] diff --git a/tests/functional/cyclers/r1_middle/graph.plain.ref b/tests/functional/cyclers/r1_middle/graph.plain.ref index 7686125f7fc..d4c3037c4d3 100644 --- a/tests/functional/cyclers/r1_middle/graph.plain.ref +++ b/tests/functional/cyclers/r1_middle/graph.plain.ref @@ -1,5 +1,5 @@ -edge "foo.20140101T0010Z" "bar.20140101T0010Z" +edge "20140101T0010Z/foo" "20140101T0010Z/bar" graph -node "bar.20140101T0010Z" "bar\n20140101T0010Z" -node "foo.20140101T0010Z" "foo\n20140101T0010Z" +node "20140101T0010Z/bar" "bar\n20140101T0010Z" +node "20140101T0010Z/foo" "foo\n20140101T0010Z" stop diff --git a/tests/functional/cyclers/r1_middle/reference.log b/tests/functional/cyclers/r1_middle/reference.log index aae0da8c2d1..f09b55a0245 100644 --- a/tests/functional/cyclers/r1_middle/reference.log +++ b/tests/functional/cyclers/r1_middle/reference.log @@ -1,4 +1,4 @@ -2014/03/31 10:15:01 INFO - Initial point: 20140101 -2014/03/31 10:15:01 INFO - Final point: 20140102T12 -2014/03/31 10:15:01 DEBUG - foo.20140101T0010Z -triggered off [] -2014/03/31 10:15:21 DEBUG - bar.20140101T0010Z -triggered off ['foo.20140101T0010Z'] +Initial point: 20140101 +Final point: 20140102T12 +20140101T0010Z/foo -triggered off [] +20140101T0010Z/bar -triggered off ['20140101T0010Z/foo'] diff --git a/tests/functional/cyclers/r1_multi_start/graph.plain.ref b/tests/functional/cyclers/r1_multi_start/graph.plain.ref index d91bc3454c4..02124987d94 100644 --- a/tests/functional/cyclers/r1_multi_start/graph.plain.ref +++ b/tests/functional/cyclers/r1_multi_start/graph.plain.ref @@ -1,17 +1,17 @@ -edge "cold_foo.20140101T0000Z" "foo_dawn.20140101T0600Z" -edge "cold_foo.20140101T0000Z" "foo_midnight.20140101T0000Z" -edge "foo_dawn.20140101T0600Z" "foo_dawn.20140102T0600Z" -edge "foo_dawn.20140102T0600Z" "foo_dawn.20140103T0600Z" -edge "foo_midnight.20140101T0000Z" "foo_midnight.20140102T0000Z" -edge "foo_midnight.20140102T0000Z" "foo_midnight.20140103T0000Z" -edge "foo_midnight.20140103T0000Z" "foo_midnight.20140104T0000Z" +edge "20140101T0000Z/cold_foo" "20140101T0000Z/foo_midnight" +edge "20140101T0000Z/cold_foo" "20140101T0600Z/foo_dawn" +edge "20140101T0000Z/foo_midnight" "20140102T0000Z/foo_midnight" +edge "20140101T0600Z/foo_dawn" "20140102T0600Z/foo_dawn" +edge "20140102T0000Z/foo_midnight" "20140103T0000Z/foo_midnight" +edge "20140102T0600Z/foo_dawn" "20140103T0600Z/foo_dawn" +edge "20140103T0000Z/foo_midnight" "20140104T0000Z/foo_midnight" graph -node "cold_foo.20140101T0000Z" "cold_foo\n20140101T0000Z" -node "foo_dawn.20140101T0600Z" "foo_dawn\n20140101T0600Z" -node "foo_dawn.20140102T0600Z" "foo_dawn\n20140102T0600Z" -node "foo_dawn.20140103T0600Z" "foo_dawn\n20140103T0600Z" -node "foo_midnight.20140101T0000Z" "foo_midnight\n20140101T0000Z" -node "foo_midnight.20140102T0000Z" "foo_midnight\n20140102T0000Z" -node "foo_midnight.20140103T0000Z" "foo_midnight\n20140103T0000Z" -node "foo_midnight.20140104T0000Z" "foo_midnight\n20140104T0000Z" +node "20140101T0000Z/cold_foo" "cold_foo\n20140101T0000Z" +node "20140101T0000Z/foo_midnight" "foo_midnight\n20140101T0000Z" +node "20140101T0600Z/foo_dawn" "foo_dawn\n20140101T0600Z" +node "20140102T0000Z/foo_midnight" "foo_midnight\n20140102T0000Z" +node "20140102T0600Z/foo_dawn" "foo_dawn\n20140102T0600Z" +node "20140103T0000Z/foo_midnight" "foo_midnight\n20140103T0000Z" +node "20140103T0600Z/foo_dawn" "foo_dawn\n20140103T0600Z" +node "20140104T0000Z/foo_midnight" "foo_midnight\n20140104T0000Z" stop diff --git a/tests/functional/cyclers/r1_multi_start/reference.log b/tests/functional/cyclers/r1_multi_start/reference.log index 4cd0d46c6f2..5e9c3870a75 100644 --- a/tests/functional/cyclers/r1_multi_start/reference.log +++ b/tests/functional/cyclers/r1_multi_start/reference.log @@ -1,10 +1,10 @@ Initial point: 2014-01-01 Final point: 2014-01-04 -cold_foo.20140101T0000Z -triggered off [] -foo_midnight.20140101T0000Z -triggered off ['cold_foo.20140101T0000Z', 'foo_midnight.20131231T0000Z'] -foo_dawn.20140101T0600Z -triggered off ['cold_foo.20140101T0000Z', 'foo_dawn.20131231T0600Z'] -foo_midnight.20140102T0000Z -triggered off ['foo_midnight.20140101T0000Z'] -foo_dawn.20140102T0600Z -triggered off ['foo_dawn.20140101T0600Z'] -foo_midnight.20140103T0000Z -triggered off ['foo_midnight.20140102T0000Z'] -foo_dawn.20140103T0600Z -triggered off ['foo_dawn.20140102T0600Z'] -foo_midnight.20140104T0000Z -triggered off ['foo_midnight.20140103T0000Z'] +20140101T0000Z/cold_foo -triggered off [] +20140101T0000Z/foo_midnight -triggered off ['20131231T0000Z/foo_midnight', '20140101T0000Z/cold_foo'] +20140101T0600Z/foo_dawn -triggered off ['20131231T0600Z/foo_dawn', '20140101T0000Z/cold_foo'] +20140102T0000Z/foo_midnight -triggered off ['20140101T0000Z/foo_midnight'] +20140102T0600Z/foo_dawn -triggered off ['20140101T0600Z/foo_dawn'] +20140103T0000Z/foo_midnight -triggered off ['20140102T0000Z/foo_midnight'] +20140103T0600Z/foo_dawn -triggered off ['20140102T0600Z/foo_dawn'] +20140104T0000Z/foo_midnight -triggered off ['20140103T0000Z/foo_midnight'] diff --git a/tests/functional/cyclers/r1_restricted/graph.plain.ref b/tests/functional/cyclers/r1_restricted/graph.plain.ref index a1ab2ffa127..7e595a2c709 100644 --- a/tests/functional/cyclers/r1_restricted/graph.plain.ref +++ b/tests/functional/cyclers/r1_restricted/graph.plain.ref @@ -1,17 +1,17 @@ -edge "foo.20130808T0000Z" "foo.20130808T0600Z" -edge "foo.20130808T0600Z" "bar.20130808T0600Z" -edge "foo.20130808T0600Z" "foo.20130808T1200Z" -edge "foo.20130808T1200Z" "bar.20130808T1200Z" -edge "foo.20130808T1200Z" "foo.20130808T1800Z" -edge "foo.20130808T1800Z" "bar.20130808T1800Z" -edge "setup_foo.20130808T0000Z" "foo.20130808T0000Z" +edge "20130808T0000Z/foo" "20130808T0600Z/foo" +edge "20130808T0000Z/setup_foo" "20130808T0000Z/foo" +edge "20130808T0600Z/foo" "20130808T0600Z/bar" +edge "20130808T0600Z/foo" "20130808T1200Z/foo" +edge "20130808T1200Z/foo" "20130808T1200Z/bar" +edge "20130808T1200Z/foo" "20130808T1800Z/foo" +edge "20130808T1800Z/foo" "20130808T1800Z/bar" graph -node "bar.20130808T0600Z" "bar\n20130808T0600Z" -node "bar.20130808T1200Z" "bar\n20130808T1200Z" -node "bar.20130808T1800Z" "bar\n20130808T1800Z" -node "foo.20130808T0000Z" "foo\n20130808T0000Z" -node "foo.20130808T0600Z" "foo\n20130808T0600Z" -node "foo.20130808T1200Z" "foo\n20130808T1200Z" -node "foo.20130808T1800Z" "foo\n20130808T1800Z" -node "setup_foo.20130808T0000Z" "setup_foo\n20130808T0000Z" +node "20130808T0000Z/foo" "foo\n20130808T0000Z" +node "20130808T0000Z/setup_foo" "setup_foo\n20130808T0000Z" +node "20130808T0600Z/bar" "bar\n20130808T0600Z" +node "20130808T0600Z/foo" "foo\n20130808T0600Z" +node "20130808T1200Z/bar" "bar\n20130808T1200Z" +node "20130808T1200Z/foo" "foo\n20130808T1200Z" +node "20130808T1800Z/bar" "bar\n20130808T1800Z" +node "20130808T1800Z/foo" "foo\n20130808T1800Z" stop diff --git a/tests/functional/cyclers/r1_restricted/reference.log b/tests/functional/cyclers/r1_restricted/reference.log index ffb7efde487..4b6f753a3a6 100644 --- a/tests/functional/cyclers/r1_restricted/reference.log +++ b/tests/functional/cyclers/r1_restricted/reference.log @@ -1,10 +1,10 @@ -2015-01-06T10:55:56Z INFO - Initial point: 20130808T0000Z -2015-01-06T10:55:56Z INFO - Final point: 20130808T1800Z -2015-01-06T10:55:56Z DEBUG - setup_foo.20130808T0000Z -triggered off [] -2015-01-06T10:56:06Z DEBUG - foo.20130808T0000Z -triggered off ['setup_foo.20130808T0000Z'] -2015-01-06T10:56:10Z DEBUG - foo.20130808T0600Z -triggered off ['foo.20130808T0000Z'] -2015-01-06T10:56:15Z DEBUG - foo.20130808T1200Z -triggered off ['foo.20130808T0600Z'] -2015-01-06T10:56:15Z DEBUG - bar.20130808T0600Z -triggered off ['foo.20130808T0600Z'] -2015-01-06T10:56:32Z DEBUG - bar.20130808T1200Z -triggered off ['foo.20130808T1200Z'] -2015-01-06T10:56:32Z DEBUG - foo.20130808T1800Z -triggered off ['foo.20130808T1200Z'] -2015-01-06T10:56:48Z DEBUG - bar.20130808T1800Z -triggered off ['foo.20130808T1800Z'] +Initial point: 20130808T0000Z +Final point: 20130808T1800Z +20130808T0000Z/setup_foo -triggered off [] +20130808T0000Z/foo -triggered off ['20130808T0000Z/setup_foo'] +20130808T0600Z/foo -triggered off ['20130808T0000Z/foo'] +20130808T1200Z/foo -triggered off ['20130808T0600Z/foo'] +20130808T0600Z/bar -triggered off ['20130808T0600Z/foo'] +20130808T1200Z/bar -triggered off ['20130808T1200Z/foo'] +20130808T1800Z/foo -triggered off ['20130808T1200Z/foo'] +20130808T1800Z/bar -triggered off ['20130808T1800Z/foo'] diff --git a/tests/functional/cyclers/r5_final/graph.plain.ref b/tests/functional/cyclers/r5_final/graph.plain.ref index 9a77153f669..38d659d59af 100644 --- a/tests/functional/cyclers/r5_final/graph.plain.ref +++ b/tests/functional/cyclers/r5_final/graph.plain.ref @@ -1,17 +1,17 @@ -edge "xyzzy.20140102T0000Z" "bar.20140102T0000Z" -edge "xyzzy.20140102T0300Z" "bar.20140102T0300Z" -edge "xyzzy.20140102T0600Z" "bar.20140102T0600Z" -edge "xyzzy.20140102T0900Z" "bar.20140102T0900Z" -edge "xyzzy.20140102T1200Z" "bar.20140102T1200Z" +edge "20140102T0000Z/xyzzy" "20140102T0000Z/bar" +edge "20140102T0300Z/xyzzy" "20140102T0300Z/bar" +edge "20140102T0600Z/xyzzy" "20140102T0600Z/bar" +edge "20140102T0900Z/xyzzy" "20140102T0900Z/bar" +edge "20140102T1200Z/xyzzy" "20140102T1200Z/bar" graph -node "bar.20140102T0000Z" "bar\n20140102T0000Z" -node "bar.20140102T0300Z" "bar\n20140102T0300Z" -node "bar.20140102T0600Z" "bar\n20140102T0600Z" -node "bar.20140102T0900Z" "bar\n20140102T0900Z" -node "bar.20140102T1200Z" "bar\n20140102T1200Z" -node "xyzzy.20140102T0000Z" "xyzzy\n20140102T0000Z" -node "xyzzy.20140102T0300Z" "xyzzy\n20140102T0300Z" -node "xyzzy.20140102T0600Z" "xyzzy\n20140102T0600Z" -node "xyzzy.20140102T0900Z" "xyzzy\n20140102T0900Z" -node "xyzzy.20140102T1200Z" "xyzzy\n20140102T1200Z" +node "20140102T0000Z/bar" "bar\n20140102T0000Z" +node "20140102T0000Z/xyzzy" "xyzzy\n20140102T0000Z" +node "20140102T0300Z/bar" "bar\n20140102T0300Z" +node "20140102T0300Z/xyzzy" "xyzzy\n20140102T0300Z" +node "20140102T0600Z/bar" "bar\n20140102T0600Z" +node "20140102T0600Z/xyzzy" "xyzzy\n20140102T0600Z" +node "20140102T0900Z/bar" "bar\n20140102T0900Z" +node "20140102T0900Z/xyzzy" "xyzzy\n20140102T0900Z" +node "20140102T1200Z/bar" "bar\n20140102T1200Z" +node "20140102T1200Z/xyzzy" "xyzzy\n20140102T1200Z" stop diff --git a/tests/functional/cyclers/r5_final/reference.log b/tests/functional/cyclers/r5_final/reference.log index d68bf6de17d..e1e8c5ec224 100644 --- a/tests/functional/cyclers/r5_final/reference.log +++ b/tests/functional/cyclers/r5_final/reference.log @@ -1,12 +1,12 @@ -2014/03/31 10:15:08 INFO - Initial point: 20140101 -2014/03/31 10:15:08 INFO - Final point: 20140102T12 -2014/03/31 10:15:08 DEBUG - xyzzy.20140102T0000Z -triggered off [] -2014/03/31 10:15:12 DEBUG - xyzzy.20140102T0300Z -triggered off [] -2014/03/31 10:15:15 DEBUG - xyzzy.20140102T0600Z -triggered off [] -2014/03/31 10:15:23 DEBUG - bar.20140102T0000Z -triggered off ['xyzzy.20140102T0000Z'] -2014/03/31 10:15:27 DEBUG - bar.20140102T0300Z -triggered off ['xyzzy.20140102T0300Z'] -2014/03/31 10:15:30 DEBUG - bar.20140102T0600Z -triggered off ['xyzzy.20140102T0600Z'] -2014/03/31 10:15:40 DEBUG - xyzzy.20140102T0900Z -triggered off [] -2014/03/31 10:15:44 DEBUG - xyzzy.20140102T1200Z -triggered off [] -2014/03/31 10:15:54 DEBUG - bar.20140102T0900Z -triggered off ['xyzzy.20140102T0900Z'] -2014/03/31 10:15:57 DEBUG - bar.20140102T1200Z -triggered off ['xyzzy.20140102T1200Z'] +Initial point: 20140101 +Final point: 20140102T12 +20140102T0000Z/xyzzy -triggered off [] +20140102T0300Z/xyzzy -triggered off [] +20140102T0600Z/xyzzy -triggered off [] +20140102T0000Z/bar -triggered off ['20140102T0000Z/xyzzy'] +20140102T0300Z/bar -triggered off ['20140102T0300Z/xyzzy'] +20140102T0600Z/bar -triggered off ['20140102T0600Z/xyzzy'] +20140102T0900Z/xyzzy -triggered off [] +20140102T1200Z/xyzzy -triggered off [] +20140102T0900Z/bar -triggered off ['20140102T0900Z/xyzzy'] +20140102T1200Z/bar -triggered off ['20140102T1200Z/xyzzy'] diff --git a/tests/functional/cyclers/r5_initial-integer/graph.plain.ref b/tests/functional/cyclers/r5_initial-integer/graph.plain.ref index 54439103459..d5a68e1c848 100644 --- a/tests/functional/cyclers/r5_initial-integer/graph.plain.ref +++ b/tests/functional/cyclers/r5_initial-integer/graph.plain.ref @@ -1,19 +1,19 @@ -edge "xyzzy.1" "bar.1" -edge "xyzzy.2" "bar.2" -edge "xyzzy.3" "bar.3" -edge "xyzzy.4" "bar.4" -edge "xyzzy.5" "bar.5" +edge "1/xyzzy" "1/bar" +edge "2/xyzzy" "2/bar" +edge "3/xyzzy" "3/bar" +edge "4/xyzzy" "4/bar" +edge "5/xyzzy" "5/bar" graph -node "bar.1" "bar\n1" -node "bar.2" "bar\n2" -node "bar.3" "bar\n3" -node "bar.4" "bar\n4" -node "bar.5" "bar\n5" -node "xyzzy.1" "xyzzy\n1" -node "xyzzy.2" "xyzzy\n2" -node "xyzzy.3" "xyzzy\n3" -node "xyzzy.4" "xyzzy\n4" -node "xyzzy.5" "xyzzy\n5" -node "xyzzy.6" "xyzzy\n6" -node "xyzzy.7" "xyzzy\n7" +node "1/bar" "bar\n1" +node "2/bar" "bar\n2" +node "3/bar" "bar\n3" +node "4/bar" "bar\n4" +node "5/bar" "bar\n5" +node "1/xyzzy" "xyzzy\n1" +node "2/xyzzy" "xyzzy\n2" +node "3/xyzzy" "xyzzy\n3" +node "4/xyzzy" "xyzzy\n4" +node "5/xyzzy" "xyzzy\n5" +node "6/xyzzy" "xyzzy\n6" +node "7/xyzzy" "xyzzy\n7" stop diff --git a/tests/functional/cyclers/r5_initial-integer/reference.log b/tests/functional/cyclers/r5_initial-integer/reference.log index b6ecf4b0d1e..bbe2d296ed0 100644 --- a/tests/functional/cyclers/r5_initial-integer/reference.log +++ b/tests/functional/cyclers/r5_initial-integer/reference.log @@ -1,14 +1,14 @@ Initial point: 1 Final point: 7 -xyzzy.1 -triggered off [] -xyzzy.2 -triggered off [] -xyzzy.3 -triggered off [] -bar.1 -triggered off ['xyzzy.1'] -bar.2 -triggered off ['xyzzy.2'] -xyzzy.4 -triggered off [] -bar.3 -triggered off ['xyzzy.3'] -bar.4 -triggered off ['xyzzy.4'] -xyzzy.5 -triggered off [] -bar.5 -triggered off ['xyzzy.5'] -xyzzy.6 -triggered off [] -xyzzy.7 -triggered off [] +1/xyzzy -triggered off [] +2/xyzzy -triggered off [] +3/xyzzy -triggered off [] +1/bar -triggered off ['1/xyzzy'] +2/bar -triggered off ['2/xyzzy'] +4/xyzzy -triggered off [] +3/bar -triggered off ['3/xyzzy'] +4/bar -triggered off ['4/xyzzy'] +5/xyzzy -triggered off [] +5/bar -triggered off ['5/xyzzy'] +6/xyzzy -triggered off [] +7/xyzzy -triggered off [] diff --git a/tests/functional/cyclers/r5_initial/graph.plain.ref b/tests/functional/cyclers/r5_initial/graph.plain.ref index 8c1af6749a2..54b304eb73e 100644 --- a/tests/functional/cyclers/r5_initial/graph.plain.ref +++ b/tests/functional/cyclers/r5_initial/graph.plain.ref @@ -1,19 +1,19 @@ -edge "xyzzy.20140101T0000Z" "bar.20140101T0000Z" -edge "xyzzy.20140101T0300Z" "bar.20140101T0300Z" -edge "xyzzy.20140101T0600Z" "bar.20140101T0600Z" -edge "xyzzy.20140101T0900Z" "bar.20140101T0900Z" -edge "xyzzy.20140101T1200Z" "bar.20140101T1200Z" +edge "20140101T0000Z/xyzzy" "20140101T0000Z/bar" +edge "20140101T0300Z/xyzzy" "20140101T0300Z/bar" +edge "20140101T0600Z/xyzzy" "20140101T0600Z/bar" +edge "20140101T0900Z/xyzzy" "20140101T0900Z/bar" +edge "20140101T1200Z/xyzzy" "20140101T1200Z/bar" graph -node "bar.20140101T0000Z" "bar\n20140101T0000Z" -node "bar.20140101T0300Z" "bar\n20140101T0300Z" -node "bar.20140101T0600Z" "bar\n20140101T0600Z" -node "bar.20140101T0900Z" "bar\n20140101T0900Z" -node "bar.20140101T1200Z" "bar\n20140101T1200Z" -node "xyzzy.20140101T0000Z" "xyzzy\n20140101T0000Z" -node "xyzzy.20140101T0300Z" "xyzzy\n20140101T0300Z" -node "xyzzy.20140101T0600Z" "xyzzy\n20140101T0600Z" -node "xyzzy.20140101T0900Z" "xyzzy\n20140101T0900Z" -node "xyzzy.20140101T1200Z" "xyzzy\n20140101T1200Z" -node "xyzzy.20140101T1500Z" "xyzzy\n20140101T1500Z" -node "xyzzy.20140101T1800Z" "xyzzy\n20140101T1800Z" +node "20140101T0000Z/bar" "bar\n20140101T0000Z" +node "20140101T0000Z/xyzzy" "xyzzy\n20140101T0000Z" +node "20140101T0300Z/bar" "bar\n20140101T0300Z" +node "20140101T0300Z/xyzzy" "xyzzy\n20140101T0300Z" +node "20140101T0600Z/bar" "bar\n20140101T0600Z" +node "20140101T0600Z/xyzzy" "xyzzy\n20140101T0600Z" +node "20140101T0900Z/bar" "bar\n20140101T0900Z" +node "20140101T0900Z/xyzzy" "xyzzy\n20140101T0900Z" +node "20140101T1200Z/bar" "bar\n20140101T1200Z" +node "20140101T1200Z/xyzzy" "xyzzy\n20140101T1200Z" +node "20140101T1500Z/xyzzy" "xyzzy\n20140101T1500Z" +node "20140101T1800Z/xyzzy" "xyzzy\n20140101T1800Z" stop diff --git a/tests/functional/cyclers/r5_initial/reference.log b/tests/functional/cyclers/r5_initial/reference.log index 03edaa0f7b2..59e69d142e6 100644 --- a/tests/functional/cyclers/r5_initial/reference.log +++ b/tests/functional/cyclers/r5_initial/reference.log @@ -1,14 +1,14 @@ Initial point: 20140101 Final point: 20140102T12 -xyzzy.20140101T0000Z -triggered off [] -xyzzy.20140101T0300Z -triggered off [] -xyzzy.20140101T0600Z -triggered off [] -bar.20140101T0000Z -triggered off ['xyzzy.20140101T0000Z'] -bar.20140101T0300Z -triggered off ['xyzzy.20140101T0300Z'] -xyzzy.20140101T0900Z -triggered off [] -bar.20140101T0600Z -triggered off ['xyzzy.20140101T0600Z'] -bar.20140101T0900Z -triggered off ['xyzzy.20140101T0900Z'] -xyzzy.20140101T1200Z -triggered off [] -bar.20140101T1200Z -triggered off ['xyzzy.20140101T1200Z'] -xyzzy.20140101T1500Z -triggered off [] -xyzzy.20140101T1800Z -triggered off [] +20140101T0000Z/xyzzy -triggered off [] +20140101T0300Z/xyzzy -triggered off [] +20140101T0600Z/xyzzy -triggered off [] +20140101T0000Z/bar -triggered off ['20140101T0000Z/xyzzy'] +20140101T0300Z/bar -triggered off ['20140101T0300Z/xyzzy'] +20140101T0900Z/xyzzy -triggered off [] +20140101T0600Z/bar -triggered off ['20140101T0600Z/xyzzy'] +20140101T0900Z/bar -triggered off ['20140101T0900Z/xyzzy'] +20140101T1200Z/xyzzy -triggered off [] +20140101T1200Z/bar -triggered off ['20140101T1200Z/xyzzy'] +20140101T1500Z/xyzzy -triggered off [] +20140101T1800Z/xyzzy -triggered off [] diff --git a/tests/functional/cyclers/rmany_reverse/graph.plain.ref b/tests/functional/cyclers/rmany_reverse/graph.plain.ref index 509dcd2e7b9..fb8731c5b64 100644 --- a/tests/functional/cyclers/rmany_reverse/graph.plain.ref +++ b/tests/functional/cyclers/rmany_reverse/graph.plain.ref @@ -1,14 +1,14 @@ -edge "foo.20150221T0000Z" "nonstop.20150221T0000Z" -edge "foo.20150221T0600Z" "nonstop.20150221T0600Z" -edge "foo.20150221T1200Z" "nonstop.20150221T1200Z" -edge "foo.20150221T1800Z" "stop.20150221T1800Z" +edge "20150221T0000Z/foo" "20150221T0000Z/nonstop" +edge "20150221T0600Z/foo" "20150221T0600Z/nonstop" +edge "20150221T1200Z/foo" "20150221T1200Z/nonstop" +edge "20150221T1800Z/foo" "20150221T1800Z/stop" graph -node "foo.20150221T0000Z" "foo\n20150221T0000Z" -node "foo.20150221T0600Z" "foo\n20150221T0600Z" -node "foo.20150221T1200Z" "foo\n20150221T1200Z" -node "foo.20150221T1800Z" "foo\n20150221T1800Z" -node "nonstop.20150221T0000Z" "nonstop\n20150221T0000Z" -node "nonstop.20150221T0600Z" "nonstop\n20150221T0600Z" -node "nonstop.20150221T1200Z" "nonstop\n20150221T1200Z" -node "stop.20150221T1800Z" "stop\n20150221T1800Z" +node "20150221T0000Z/foo" "foo\n20150221T0000Z" +node "20150221T0000Z/nonstop" "nonstop\n20150221T0000Z" +node "20150221T0600Z/foo" "foo\n20150221T0600Z" +node "20150221T0600Z/nonstop" "nonstop\n20150221T0600Z" +node "20150221T1200Z/foo" "foo\n20150221T1200Z" +node "20150221T1200Z/nonstop" "nonstop\n20150221T1200Z" +node "20150221T1800Z/foo" "foo\n20150221T1800Z" +node "20150221T1800Z/stop" "stop\n20150221T1800Z" stop diff --git a/tests/functional/cyclers/rmany_reverse/reference.log b/tests/functional/cyclers/rmany_reverse/reference.log index ddf2e24cd6b..7616522ae07 100644 --- a/tests/functional/cyclers/rmany_reverse/reference.log +++ b/tests/functional/cyclers/rmany_reverse/reference.log @@ -1,10 +1,10 @@ -2015-03-16T09:23:19Z INFO - Initial point: 20150221T0000Z -2015-03-16T09:23:19Z INFO - Final point: 20150221T1800Z -2015-03-16T09:23:19Z DEBUG - foo.20150221T0000Z -triggered off [] -2015-03-16T09:23:21Z DEBUG - foo.20150221T0600Z -triggered off [] -2015-03-16T09:23:23Z DEBUG - foo.20150221T1200Z -triggered off [] -2015-03-16T09:23:34Z DEBUG - nonstop.20150221T0000Z -triggered off ['foo.20150221T0000Z'] -2015-03-16T09:23:36Z DEBUG - nonstop.20150221T0600Z -triggered off ['foo.20150221T0600Z'] -2015-03-16T09:23:38Z DEBUG - nonstop.20150221T1200Z -triggered off ['foo.20150221T1200Z'] -2015-03-16T09:23:45Z DEBUG - foo.20150221T1800Z -triggered off [] -2015-03-16T09:23:59Z DEBUG - stop.20150221T1800Z -triggered off ['foo.20150221T1800Z'] +Initial point: 20150221T0000Z +Final point: 20150221T1800Z +20150221T0000Z/foo -triggered off [] +20150221T0600Z/foo -triggered off [] +20150221T1200Z/foo -triggered off [] +20150221T0000Z/nonstop -triggered off ['20150221T0000Z/foo'] +20150221T0600Z/nonstop -triggered off ['20150221T0600Z/foo'] +20150221T1200Z/nonstop -triggered off ['20150221T1200Z/foo'] +20150221T1800Z/foo -triggered off [] +20150221T1800Z/stop -triggered off ['20150221T1800Z/foo'] diff --git a/tests/functional/cyclers/rnone_reverse/graph.plain.ref b/tests/functional/cyclers/rnone_reverse/graph.plain.ref index 509dcd2e7b9..fb8731c5b64 100644 --- a/tests/functional/cyclers/rnone_reverse/graph.plain.ref +++ b/tests/functional/cyclers/rnone_reverse/graph.plain.ref @@ -1,14 +1,14 @@ -edge "foo.20150221T0000Z" "nonstop.20150221T0000Z" -edge "foo.20150221T0600Z" "nonstop.20150221T0600Z" -edge "foo.20150221T1200Z" "nonstop.20150221T1200Z" -edge "foo.20150221T1800Z" "stop.20150221T1800Z" +edge "20150221T0000Z/foo" "20150221T0000Z/nonstop" +edge "20150221T0600Z/foo" "20150221T0600Z/nonstop" +edge "20150221T1200Z/foo" "20150221T1200Z/nonstop" +edge "20150221T1800Z/foo" "20150221T1800Z/stop" graph -node "foo.20150221T0000Z" "foo\n20150221T0000Z" -node "foo.20150221T0600Z" "foo\n20150221T0600Z" -node "foo.20150221T1200Z" "foo\n20150221T1200Z" -node "foo.20150221T1800Z" "foo\n20150221T1800Z" -node "nonstop.20150221T0000Z" "nonstop\n20150221T0000Z" -node "nonstop.20150221T0600Z" "nonstop\n20150221T0600Z" -node "nonstop.20150221T1200Z" "nonstop\n20150221T1200Z" -node "stop.20150221T1800Z" "stop\n20150221T1800Z" +node "20150221T0000Z/foo" "foo\n20150221T0000Z" +node "20150221T0000Z/nonstop" "nonstop\n20150221T0000Z" +node "20150221T0600Z/foo" "foo\n20150221T0600Z" +node "20150221T0600Z/nonstop" "nonstop\n20150221T0600Z" +node "20150221T1200Z/foo" "foo\n20150221T1200Z" +node "20150221T1200Z/nonstop" "nonstop\n20150221T1200Z" +node "20150221T1800Z/foo" "foo\n20150221T1800Z" +node "20150221T1800Z/stop" "stop\n20150221T1800Z" stop diff --git a/tests/functional/cyclers/rnone_reverse/reference.log b/tests/functional/cyclers/rnone_reverse/reference.log index ddf2e24cd6b..7616522ae07 100644 --- a/tests/functional/cyclers/rnone_reverse/reference.log +++ b/tests/functional/cyclers/rnone_reverse/reference.log @@ -1,10 +1,10 @@ -2015-03-16T09:23:19Z INFO - Initial point: 20150221T0000Z -2015-03-16T09:23:19Z INFO - Final point: 20150221T1800Z -2015-03-16T09:23:19Z DEBUG - foo.20150221T0000Z -triggered off [] -2015-03-16T09:23:21Z DEBUG - foo.20150221T0600Z -triggered off [] -2015-03-16T09:23:23Z DEBUG - foo.20150221T1200Z -triggered off [] -2015-03-16T09:23:34Z DEBUG - nonstop.20150221T0000Z -triggered off ['foo.20150221T0000Z'] -2015-03-16T09:23:36Z DEBUG - nonstop.20150221T0600Z -triggered off ['foo.20150221T0600Z'] -2015-03-16T09:23:38Z DEBUG - nonstop.20150221T1200Z -triggered off ['foo.20150221T1200Z'] -2015-03-16T09:23:45Z DEBUG - foo.20150221T1800Z -triggered off [] -2015-03-16T09:23:59Z DEBUG - stop.20150221T1800Z -triggered off ['foo.20150221T1800Z'] +Initial point: 20150221T0000Z +Final point: 20150221T1800Z +20150221T0000Z/foo -triggered off [] +20150221T0600Z/foo -triggered off [] +20150221T1200Z/foo -triggered off [] +20150221T0000Z/nonstop -triggered off ['20150221T0000Z/foo'] +20150221T0600Z/nonstop -triggered off ['20150221T0600Z/foo'] +20150221T1200Z/nonstop -triggered off ['20150221T1200Z/foo'] +20150221T1800Z/foo -triggered off [] +20150221T1800Z/stop -triggered off ['20150221T1800Z/foo'] diff --git a/tests/functional/cyclers/subhourly/graph.plain.ref b/tests/functional/cyclers/subhourly/graph.plain.ref index 2acf73664c2..03fc261a0a2 100644 --- a/tests/functional/cyclers/subhourly/graph.plain.ref +++ b/tests/functional/cyclers/subhourly/graph.plain.ref @@ -1,17 +1,17 @@ -edge "foo.20131231T2300Z" "bar.20131231T2300Z" -edge "foo.20131231T2300Z" "foo.20131231T2330Z" -edge "foo.20131231T2330Z" "bar.20131231T2330Z" -edge "foo.20131231T2330Z" "foo.20140101T0000Z" -edge "foo.20140101T0000Z" "bar.20140101T0000Z" -edge "foo.20140101T0000Z" "foo.20140101T0030Z" -edge "foo.20140101T0030Z" "bar.20140101T0030Z" +edge "20131231T2300Z/foo" "20131231T2300Z/bar" +edge "20131231T2300Z/foo" "20131231T2330Z/foo" +edge "20131231T2330Z/foo" "20131231T2330Z/bar" +edge "20131231T2330Z/foo" "20140101T0000Z/foo" +edge "20140101T0000Z/foo" "20140101T0000Z/bar" +edge "20140101T0000Z/foo" "20140101T0030Z/foo" +edge "20140101T0030Z/foo" "20140101T0030Z/bar" graph -node "bar.20131231T2300Z" "bar\n20131231T2300Z" -node "bar.20131231T2330Z" "bar\n20131231T2330Z" -node "bar.20140101T0000Z" "bar\n20140101T0000Z" -node "bar.20140101T0030Z" "bar\n20140101T0030Z" -node "foo.20131231T2300Z" "foo\n20131231T2300Z" -node "foo.20131231T2330Z" "foo\n20131231T2330Z" -node "foo.20140101T0000Z" "foo\n20140101T0000Z" -node "foo.20140101T0030Z" "foo\n20140101T0030Z" +node "20131231T2300Z/bar" "bar\n20131231T2300Z" +node "20131231T2300Z/foo" "foo\n20131231T2300Z" +node "20131231T2330Z/bar" "bar\n20131231T2330Z" +node "20131231T2330Z/foo" "foo\n20131231T2330Z" +node "20140101T0000Z/bar" "bar\n20140101T0000Z" +node "20140101T0000Z/foo" "foo\n20140101T0000Z" +node "20140101T0030Z/bar" "bar\n20140101T0030Z" +node "20140101T0030Z/foo" "foo\n20140101T0030Z" stop diff --git a/tests/functional/cyclers/subhourly/reference.log b/tests/functional/cyclers/subhourly/reference.log index 4c490cf3008..6278e824239 100644 --- a/tests/functional/cyclers/subhourly/reference.log +++ b/tests/functional/cyclers/subhourly/reference.log @@ -1,10 +1,10 @@ Initial point: 20131231T2300 Final point: 20140101T0050 -foo.20131231T2300Z -triggered off ['foo.20131231T2230Z'] -bar.20131231T2300Z -triggered off ['foo.20131231T2300Z'] -foo.20131231T2330Z -triggered off ['foo.20131231T2300Z'] -bar.20131231T2330Z -triggered off ['foo.20131231T2330Z'] -foo.20140101T0000Z -triggered off ['foo.20131231T2330Z'] -bar.20140101T0000Z -triggered off ['foo.20140101T0000Z'] -foo.20140101T0030Z -triggered off ['foo.20140101T0000Z'] -bar.20140101T0030Z -triggered off ['foo.20140101T0030Z'] +20131231T2300Z/foo -triggered off ['20131231T2230Z/foo'] +20131231T2300Z/bar -triggered off ['20131231T2300Z/foo'] +20131231T2330Z/foo -triggered off ['20131231T2300Z/foo'] +20131231T2330Z/bar -triggered off ['20131231T2330Z/foo'] +20140101T0000Z/foo -triggered off ['20131231T2330Z/foo'] +20140101T0000Z/bar -triggered off ['20140101T0000Z/foo'] +20140101T0030Z/foo -triggered off ['20140101T0000Z/foo'] +20140101T0030Z/bar -triggered off ['20140101T0030Z/foo'] diff --git a/tests/functional/cyclers/weekly/graph.plain.ref b/tests/functional/cyclers/weekly/graph.plain.ref index 8898faecc32..ae1c883d2f0 100644 --- a/tests/functional/cyclers/weekly/graph.plain.ref +++ b/tests/functional/cyclers/weekly/graph.plain.ref @@ -1,25 +1,25 @@ -edge "foo.20050107T1200Z" "bar.20050107T1200Z" -edge "foo.20050107T1200Z" "foo.20050114T1200Z" -edge "foo.20050114T1200Z" "bar.20050114T1200Z" -edge "foo.20050114T1200Z" "foo.20050121T1200Z" -edge "foo.20050121T1200Z" "bar.20050121T1200Z" -edge "foo.20050121T1200Z" "foo.20050128T1200Z" -edge "foo.20050128T1200Z" "bar.20050128T1200Z" -edge "foo.20050128T1200Z" "foo.20050204T1200Z" -edge "foo.20050204T1200Z" "bar.20050204T1200Z" -edge "foo.20050204T1200Z" "foo.20050211T1200Z" -edge "foo.20050211T1200Z" "bar.20050211T1200Z" +edge "20050107T1200Z/foo" "20050107T1200Z/bar" +edge "20050107T1200Z/foo" "20050114T1200Z/foo" +edge "20050114T1200Z/foo" "20050114T1200Z/bar" +edge "20050114T1200Z/foo" "20050121T1200Z/foo" +edge "20050121T1200Z/foo" "20050121T1200Z/bar" +edge "20050121T1200Z/foo" "20050128T1200Z/foo" +edge "20050128T1200Z/foo" "20050128T1200Z/bar" +edge "20050128T1200Z/foo" "20050204T1200Z/foo" +edge "20050204T1200Z/foo" "20050204T1200Z/bar" +edge "20050204T1200Z/foo" "20050211T1200Z/foo" +edge "20050211T1200Z/foo" "20050211T1200Z/bar" graph -node "bar.20050107T1200Z" "bar\n20050107T1200Z" -node "bar.20050114T1200Z" "bar\n20050114T1200Z" -node "bar.20050121T1200Z" "bar\n20050121T1200Z" -node "bar.20050128T1200Z" "bar\n20050128T1200Z" -node "bar.20050204T1200Z" "bar\n20050204T1200Z" -node "bar.20050211T1200Z" "bar\n20050211T1200Z" -node "foo.20050107T1200Z" "foo\n20050107T1200Z" -node "foo.20050114T1200Z" "foo\n20050114T1200Z" -node "foo.20050121T1200Z" "foo\n20050121T1200Z" -node "foo.20050128T1200Z" "foo\n20050128T1200Z" -node "foo.20050204T1200Z" "foo\n20050204T1200Z" -node "foo.20050211T1200Z" "foo\n20050211T1200Z" +node "20050107T1200Z/bar" "bar\n20050107T1200Z" +node "20050107T1200Z/foo" "foo\n20050107T1200Z" +node "20050114T1200Z/bar" "bar\n20050114T1200Z" +node "20050114T1200Z/foo" "foo\n20050114T1200Z" +node "20050121T1200Z/bar" "bar\n20050121T1200Z" +node "20050121T1200Z/foo" "foo\n20050121T1200Z" +node "20050128T1200Z/bar" "bar\n20050128T1200Z" +node "20050128T1200Z/foo" "foo\n20050128T1200Z" +node "20050204T1200Z/bar" "bar\n20050204T1200Z" +node "20050204T1200Z/foo" "foo\n20050204T1200Z" +node "20050211T1200Z/bar" "bar\n20050211T1200Z" +node "20050211T1200Z/foo" "foo\n20050211T1200Z" stop diff --git a/tests/functional/cyclers/weekly/reference.log b/tests/functional/cyclers/weekly/reference.log index 2df442b8d3c..51e624d87af 100644 --- a/tests/functional/cyclers/weekly/reference.log +++ b/tests/functional/cyclers/weekly/reference.log @@ -1,14 +1,14 @@ Initial point: 2005W015T12 Final point: 2005W065T11-0100 -foo.20050107T1200Z -triggered off ['foo.20041231T1200Z'] -bar.20050107T1200Z -triggered off ['foo.20050107T1200Z'] -foo.20050114T1200Z -triggered off ['foo.20050107T1200Z'] -bar.20050114T1200Z -triggered off ['foo.20050114T1200Z'] -foo.20050121T1200Z -triggered off ['foo.20050114T1200Z'] -bar.20050121T1200Z -triggered off ['foo.20050121T1200Z'] -foo.20050128T1200Z -triggered off ['foo.20050121T1200Z'] -bar.20050128T1200Z -triggered off ['foo.20050128T1200Z'] -foo.20050204T1200Z -triggered off ['foo.20050128T1200Z'] -bar.20050204T1200Z -triggered off ['foo.20050204T1200Z'] -foo.20050211T1200Z -triggered off ['foo.20050204T1200Z'] -bar.20050211T1200Z -triggered off ['foo.20050211T1200Z'] +20050107T1200Z/foo -triggered off ['20041231T1200Z/foo'] +20050107T1200Z/bar -triggered off ['20050107T1200Z/foo'] +20050114T1200Z/foo -triggered off ['20050107T1200Z/foo'] +20050114T1200Z/bar -triggered off ['20050114T1200Z/foo'] +20050121T1200Z/foo -triggered off ['20050114T1200Z/foo'] +20050121T1200Z/bar -triggered off ['20050121T1200Z/foo'] +20050128T1200Z/foo -triggered off ['20050121T1200Z/foo'] +20050128T1200Z/bar -triggered off ['20050128T1200Z/foo'] +20050204T1200Z/foo -triggered off ['20050128T1200Z/foo'] +20050204T1200Z/bar -triggered off ['20050204T1200Z/foo'] +20050211T1200Z/foo -triggered off ['20050204T1200Z/foo'] +20050211T1200Z/bar -triggered off ['20050211T1200Z/foo'] diff --git a/tests/functional/cyclers/yearly/graph.plain.ref b/tests/functional/cyclers/yearly/graph.plain.ref index ccf530b1cd2..49e188cad05 100644 --- a/tests/functional/cyclers/yearly/graph.plain.ref +++ b/tests/functional/cyclers/yearly/graph.plain.ref @@ -1,13 +1,13 @@ -edge "foo.20050123T1200Z" "bar.20050123T1200Z" -edge "foo.20050123T1200Z" "foo.20060123T1200Z" -edge "foo.20060123T1200Z" "bar.20060123T1200Z" -edge "foo.20060123T1200Z" "foo.20070123T1200Z" -edge "foo.20070123T1200Z" "bar.20070123T1200Z" +edge "20050123T1200Z/foo" "20050123T1200Z/bar" +edge "20050123T1200Z/foo" "20060123T1200Z/foo" +edge "20060123T1200Z/foo" "20060123T1200Z/bar" +edge "20060123T1200Z/foo" "20070123T1200Z/foo" +edge "20070123T1200Z/foo" "20070123T1200Z/bar" graph -node "bar.20050123T1200Z" "bar\n20050123T1200Z" -node "bar.20060123T1200Z" "bar\n20060123T1200Z" -node "bar.20070123T1200Z" "bar\n20070123T1200Z" -node "foo.20050123T1200Z" "foo\n20050123T1200Z" -node "foo.20060123T1200Z" "foo\n20060123T1200Z" -node "foo.20070123T1200Z" "foo\n20070123T1200Z" +node "20050123T1200Z/bar" "bar\n20050123T1200Z" +node "20050123T1200Z/foo" "foo\n20050123T1200Z" +node "20060123T1200Z/bar" "bar\n20060123T1200Z" +node "20060123T1200Z/foo" "foo\n20060123T1200Z" +node "20070123T1200Z/bar" "bar\n20070123T1200Z" +node "20070123T1200Z/foo" "foo\n20070123T1200Z" stop diff --git a/tests/functional/cyclers/yearly/reference.log b/tests/functional/cyclers/yearly/reference.log index 95d3e5bd2af..f42e689bebb 100644 --- a/tests/functional/cyclers/yearly/reference.log +++ b/tests/functional/cyclers/yearly/reference.log @@ -1,8 +1,8 @@ Initial point: 2005023T12 Final point: 2008001T11 -foo.20050123T1200Z -triggered off ['foo.20040123T1200Z'] -bar.20050123T1200Z -triggered off ['foo.20050123T1200Z'] -foo.20060123T1200Z -triggered off ['foo.20050123T1200Z'] -bar.20060123T1200Z -triggered off ['foo.20060123T1200Z'] -foo.20070123T1200Z -triggered off ['foo.20060123T1200Z'] -bar.20070123T1200Z -triggered off ['foo.20070123T1200Z'] +20050123T1200Z/foo -triggered off ['20040123T1200Z/foo'] +20050123T1200Z/bar -triggered off ['20050123T1200Z/foo'] +20060123T1200Z/foo -triggered off ['20050123T1200Z/foo'] +20060123T1200Z/bar -triggered off ['20060123T1200Z/foo'] +20070123T1200Z/foo -triggered off ['20060123T1200Z/foo'] +20070123T1200Z/bar -triggered off ['20070123T1200Z/foo'] diff --git a/tests/functional/cylc-cat-log/00-local.t b/tests/functional/cylc-cat-log/00-local.t index 822e16c0f77..bc081993a4e 100755 --- a/tests/functional/cylc-cat-log/00-local.t +++ b/tests/functional/cylc-cat-log/00-local.t @@ -37,11 +37,11 @@ UserInputError: The '-f' option is for job logs only. __END__ #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-out -run_ok "${TEST_NAME}" cylc cat-log -f o "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f o "${WORKFLOW_NAME}//1/a-task" grep_ok '^the quick brown fox$' "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-job -run_ok "${TEST_NAME}" cylc cat-log -f j "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f j "${WORKFLOW_NAME}//1/a-task" contains_ok "${TEST_NAME}.stdout" - << __END__ # SCRIPT: # Write to task stdout log @@ -55,23 +55,23 @@ cylc message -p WARNING 'marmite and squashed bananas' __END__ #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-err -run_ok "${TEST_NAME}" cylc cat-log -f e "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f e "${WORKFLOW_NAME}//1/a-task" grep_ok "jumped over the lazy dog" "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-status -run_ok "${TEST_NAME}" cylc cat-log -f s "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f s "${WORKFLOW_NAME}//1/a-task" grep_ok "CYLC_JOB_RUNNER_NAME=background" "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-activity -run_ok "${TEST_NAME}" cylc cat-log -f a "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f a "${WORKFLOW_NAME}//1/a-task" grep_ok '\[jobs-submit ret_code\] 0' "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-custom -run_ok "${TEST_NAME}" cylc cat-log -f 'job.custom-log' "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f 'job.custom-log' "${WORKFLOW_NAME}//1/a-task" grep_ok "drugs and money" "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-list-local-NN -run_ok "${TEST_NAME}" cylc cat-log -f a -m l "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f a -m l "${WORKFLOW_NAME}//1/a-task" contains_ok "${TEST_NAME}.stdout" <<__END__ job job-activity.log @@ -82,7 +82,7 @@ job.status __END__ #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-list-local-01 -run_ok "${TEST_NAME}" cylc cat-log -f a -m l -s 1 "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f a -m l -s 1 "${WORKFLOW_NAME}//1/a-task" contains_ok "${TEST_NAME}.stdout" <<__END__ job job-activity.log @@ -93,18 +93,18 @@ job.status __END__ #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-list-local-02 -run_fail cylc cat-log -f j -m l -s 2 "${WORKFLOW_NAME}" a-task.1 +run_fail cylc cat-log -f j -m l -s 2 "${WORKFLOW_NAME}//1/a-task" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-log-dir-NN -run_ok "${TEST_NAME}" cylc cat-log -f j -m d "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f j -m d "${WORKFLOW_NAME}//1/a-task" grep_ok "${WORKFLOW_NAME}/log/job/1/a-task/NN$" "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-log-dir-01 -run_ok "${TEST_NAME}" cylc cat-log -f j -m d -s 1 "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f j -m d -s 1 "${WORKFLOW_NAME}//1/a-task" grep_ok "${WORKFLOW_NAME}/log/job/1/a-task/01$" "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-job-path -run_ok "${TEST_NAME}" cylc cat-log -f j -m p "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f j -m p "${WORKFLOW_NAME}//1/a-task" grep_ok "${WORKFLOW_NAME}/log/job/1/a-task/NN/job$" "${TEST_NAME}.stdout" #------------------------------------------------------------------------------- purge diff --git a/tests/functional/cylc-cat-log/01-remote.t b/tests/functional/cylc-cat-log/01-remote.t index 38176b3f908..9ff6429c9d6 100755 --- a/tests/functional/cylc-cat-log/01-remote.t +++ b/tests/functional/cylc-cat-log/01-remote.t @@ -33,11 +33,11 @@ TEST_NAME="${TEST_NAME_BASE}-run" workflow_run_ok "${TEST_NAME}" cylc play --debug --no-detach "${WORKFLOW_NAME}" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-out -cylc cat-log -f o "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f o "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok '^the quick brown fox$' "${TEST_NAME}.out" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-task-job -cylc cat-log -f j "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f j "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" contains_ok "${TEST_NAME}.out" - << __END__ # SCRIPT: # Write to task stdout log @@ -50,27 +50,27 @@ __END__ #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-err -cylc cat-log -f e "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f e "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok "jumped over the lazy dog" "${TEST_NAME}.out" #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-status -cylc cat-log -f s "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f s "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok "CYLC_JOB_RUNNER_NAME=background" "${TEST_NAME}.out" #------------------------------------------------------------------------------- # local TEST_NAME=${TEST_NAME_BASE}-task-activity -cylc cat-log -f a "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f a "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok '\[jobs-submit ret_code\] 0' "${TEST_NAME}.out" #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-custom -cylc cat-log -f 'job.custom-log' "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f 'job.custom-log' "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok "drugs and money" "${TEST_NAME}.out" #------------------------------------------------------------------------------- # local TEST_NAME=${TEST_NAME_BASE}-task-list-local-NN -cylc cat-log -f a -m l "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f a -m l "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" contains_ok "${TEST_NAME}.out" <<__END__ job job-activity.log @@ -78,7 +78,7 @@ __END__ #------------------------------------------------------------------------------- # local TEST_NAME=${TEST_NAME_BASE}-task-list-local-01 -cylc cat-log -f a -m l -s 1 "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f a -m l -s 1 "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" contains_ok "${TEST_NAME}.out" <<__END__ job job-activity.log @@ -86,7 +86,7 @@ __END__ #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-list-remote-NN -cylc cat-log -f j -m l "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f j -m l "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" contains_ok "${TEST_NAME}.out" <<__END__ job job.custom-log @@ -98,17 +98,17 @@ __END__ #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-log-dir-NN -cylc cat-log -f j -m d "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -f j -m d "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok "${WORKFLOW_NAME}/log/job/1/a-task/NN$" "${TEST_NAME}.out" #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-log-dir-01 -cylc cat-log -m d -f j -s 1 "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -m d -f j -s 1 "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok "${WORKFLOW_NAME}/log/job/1/a-task/01$" "${TEST_NAME}.out" #------------------------------------------------------------------------------- # remote TEST_NAME=${TEST_NAME_BASE}-task-job-path -cylc cat-log -m p -f j "${WORKFLOW_NAME}" a-task.1 >"${TEST_NAME}.out" +cylc cat-log -m p -f j "${WORKFLOW_NAME}//1/a-task" >"${TEST_NAME}.out" grep_ok "${WORKFLOW_NAME}/log/job/1/a-task/NN/job$" "${TEST_NAME}.out" #------------------------------------------------------------------------------- # Clean up the task host. diff --git a/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/flow.cylc b/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/flow.cylc index fab258091c0..e24201699c4 100644 --- a/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/flow.cylc +++ b/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/flow.cylc @@ -19,6 +19,6 @@ [[b-task]] script = """ sleep 10 # wait for buffer to flush? - cylc cat-log --debug -f o "${CYLC_WORKFLOW_ID}" 'a-task.1' | grep 'rubbish' - cylc cat-log --debug -f e "${CYLC_WORKFLOW_ID}" 'a-task.1' | grep 'garbage' + cylc cat-log --debug -f o "${CYLC_WORKFLOW_ID}//1/a-task" | grep 'rubbish' + cylc cat-log --debug -f e "${CYLC_WORKFLOW_ID}//1/a-task" | grep 'garbage' """ diff --git a/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/reference.log b/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/reference.log index 00bb14acdaf..ff21a9c98c9 100644 --- a/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/reference.log +++ b/tests/functional/cylc-cat-log/02-remote-custom-runtime-viewer-pbs/reference.log @@ -1,4 +1,4 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - a-task.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - b-task.1 -triggered off ['a-task.1'] +Initial point: 1 +Final point: 1 +1/a-task -triggered off [] +1/b-task -triggered off ['1/a-task'] diff --git a/tests/functional/cylc-cat-log/03-bad-workflow.t b/tests/functional/cylc-cat-log/03-bad-workflow.t index e9ab2e43074..7d6fb3264a2 100755 --- a/tests/functional/cylc-cat-log/03-bad-workflow.t +++ b/tests/functional/cylc-cat-log/03-bad-workflow.t @@ -27,7 +27,7 @@ cmp_ok "${TEST_NAME_BASE}-workflow.stderr" <<__ERR__ UserInputError: The '-f' option is for job logs only. __ERR__ -run_fail "${TEST_NAME_BASE}-workflow" cylc cat-log -f j "${BAD_NAME}" "garbage.1" +run_fail "${TEST_NAME_BASE}-workflow" cylc cat-log -f j "${BAD_NAME}//1/garbage" cmp_ok "${TEST_NAME_BASE}-workflow.stderr" <<__ERR__ file not found: ${CYLC_RUN_DIR}/${BAD_NAME}/log/job/1/garbage/NN/job __ERR__ diff --git a/tests/functional/cylc-cat-log/04-local-tail.t b/tests/functional/cylc-cat-log/04-local-tail.t index 9c64d97051e..741e8bb58a2 100755 --- a/tests/functional/cylc-cat-log/04-local-tail.t +++ b/tests/functional/cylc-cat-log/04-local-tail.t @@ -15,7 +15,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . #------------------------------------------------------------------------------- -# Test "cylc cat-log" with a custom tail command. +# Test "cylc cat-log" with a custom tail /command . "$(dirname "$0")/test_header" #------------------------------------------------------------------------------- set_test_number 3 @@ -28,16 +28,11 @@ create_test_global_config "" " #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-validate" run_ok "${TEST_NAME}" cylc validate "${WORKFLOW_NAME}" -#------------------------------------------------------------------------------- -# Run detached. workflow_run_ok "${TEST_NAME_BASE}-run" cylc play "${WORKFLOW_NAME}" -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- cylc workflow-state "${WORKFLOW_NAME}" -t 'foo' -p '1' -S 'start' --interval=1 sleep 1 TEST_NAME=${TEST_NAME_BASE}-cat-log -cylc cat-log "${WORKFLOW_NAME}" -f o -m t foo.1 > "${TEST_NAME}.out" +cylc cat-log "${WORKFLOW_NAME}//1/foo" -f o -m t > "${TEST_NAME}.out" grep_ok "HELLO from foo 1" "${TEST_NAME}.out" #------------------------------------------------------------------------------- cylc stop --kill --max-polls=20 --interval=1 "${WORKFLOW_NAME}" diff --git a/tests/functional/cylc-cat-log/04-local-tail/flow.cylc b/tests/functional/cylc-cat-log/04-local-tail/flow.cylc index 4180e36d4cf..1a28555e5cb 100644 --- a/tests/functional/cylc-cat-log/04-local-tail/flow.cylc +++ b/tests/functional/cylc-cat-log/04-local-tail/flow.cylc @@ -8,7 +8,8 @@ [runtime] [[foo]] script = """ -for I in $(seq 1 100); do - echo "from $CYLC_TASK_NAME $I" - sleep 1 -done""" + for I in $(seq 1 100); do + echo "from $CYLC_TASK_NAME $I" + sleep 1 + done + """ diff --git a/tests/functional/cylc-cat-log/05-remote-tail.t b/tests/functional/cylc-cat-log/05-remote-tail.t index e918709ee80..f3a787b5675 100755 --- a/tests/functional/cylc-cat-log/05-remote-tail.t +++ b/tests/functional/cylc-cat-log/05-remote-tail.t @@ -41,12 +41,12 @@ $SCP "${PWD}/bin/my-tailer.sh" \ # Run detached. workflow_run_ok "${TEST_NAME_BASE}-run" cylc play "${WORKFLOW_NAME}" #------------------------------------------------------------------------------- -poll_grep_workflow_log -E 'foo\.1 preparing .* => submitted' +poll_grep_workflow_log -E '1/foo preparing .* => submitted' # cylc cat-log -m 't' tail-follows a file, so needs to be killed. # Send interrupt signal to tail command after 15 seconds. TEST_NAME="${TEST_NAME_BASE}-cat-log" timeout -s 'INT' 15 \ - cylc cat-log "${WORKFLOW_NAME}" -f 'o' -m 't' 'foo.1' --force-remote \ + cylc cat-log "${WORKFLOW_NAME}//1/foo" -f 'o' -m 't' --force-remote \ >"${TEST_NAME}.out" 2>"${TEST_NAME}.err" || true grep_ok "HELLO from foo 1" "${TEST_NAME}.out" #------------------------------------------------------------------------------- diff --git a/tests/functional/cylc-cat-log/09-cat-running.t b/tests/functional/cylc-cat-log/09-cat-running.t index 5c07d74175b..fea12354cbf 100755 --- a/tests/functional/cylc-cat-log/09-cat-running.t +++ b/tests/functional/cylc-cat-log/09-cat-running.t @@ -16,8 +16,8 @@ # along with this program. If not, see . #------------------------------------------------------------------------------- # Test "cylc cat-log" of currently-running local and remote jobs. -. "$(dirname "$0")/test_header" export REQUIRE_PLATFORM='loc:remote comms:tcp' +. "$(dirname "$0")/test_header" set_test_number 2 reftest purge diff --git a/tests/functional/cylc-cat-log/09-cat-running/flow.cylc b/tests/functional/cylc-cat-log/09-cat-running/flow.cylc index 22b845fff74..bcf5b32b8b8 100644 --- a/tests/functional/cylc-cat-log/09-cat-running/flow.cylc +++ b/tests/functional/cylc-cat-log/09-cat-running/flow.cylc @@ -1,13 +1,16 @@ #!Jinja2 + [scheduler] [[events]] abort on stall timeout = True stall timeout = PT0S abort on inactivity timeout = True inactivity timeout = PT3M + [scheduling] [[graph]] R1 = local-task:echo & remote-task:echo => cat-log + [runtime] [[ECHO]] script = """ @@ -26,8 +29,12 @@ [[cat-log]] script = """ cylc__job__wait_cylc_message_started - for TASK in local-task.1 remote-task.1; do - cylc cat-log --debug -f o "${CYLC_WORKFLOW_ID}" $TASK | grep 'rubbish' - cylc cat-log --debug -f e "${CYLC_WORKFLOW_ID}" $TASK | grep 'garbage' + for TASK in '1/local-task' '1/remote-task'; do + cylc cat-log --debug -f o \ + "${CYLC_WORKFLOW_ID}//${TASK}" \ + | grep 'rubbish' + cylc cat-log --debug -f e \ + "${CYLC_WORKFLOW_ID}//${TASK}" \ + | grep 'garbage' done """ diff --git a/tests/functional/cylc-cat-log/09-cat-running/reference.log b/tests/functional/cylc-cat-log/09-cat-running/reference.log index ac7301af8e1..b0bf51390e6 100644 --- a/tests/functional/cylc-cat-log/09-cat-running/reference.log +++ b/tests/functional/cylc-cat-log/09-cat-running/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -local-task.1 -triggered off [] -remote-task.1 -triggered off [] -cat-log.1 -triggered off ['local-task.1', 'remote-task.1'] +1/local-task -triggered off [] +1/remote-task -triggered off [] +1/cat-log -triggered off ['1/local-task', '1/remote-task'] diff --git a/tests/functional/cylc-cat-log/10-remote-no-retrieve.t b/tests/functional/cylc-cat-log/10-remote-no-retrieve.t index 67b09c879bf..def88f0c064 100755 --- a/tests/functional/cylc-cat-log/10-remote-no-retrieve.t +++ b/tests/functional/cylc-cat-log/10-remote-no-retrieve.t @@ -33,12 +33,12 @@ TEST_NAME="${TEST_NAME_BASE}-run" workflow_run_ok "${TEST_NAME}" cylc play --debug --no-detach "${WORKFLOW_NAME}" # Local job.out should not exist (not retrieved). -LOCAL_JOB_DIR=$(cylc cat-log -f a -m d "${WORKFLOW_NAME}" a-task.1) +LOCAL_JOB_DIR=$(cylc cat-log -f a -m d "${WORKFLOW_NAME}//1/a-task") exists_fail "${LOCAL_JOB_DIR}/job.out" # Cat the remote one. TEST_NAME=${TEST_NAME_BASE}-task-out -run_ok "${TEST_NAME}" cylc cat-log -f o "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f o "${WORKFLOW_NAME}//1/a-task" grep_ok '^the quick brown fox$' "${TEST_NAME}.stdout" purge diff --git a/tests/functional/cylc-cat-log/11-remote-retrieve.t b/tests/functional/cylc-cat-log/11-remote-retrieve.t index 880551733b5..9875f5fe699 100755 --- a/tests/functional/cylc-cat-log/11-remote-retrieve.t +++ b/tests/functional/cylc-cat-log/11-remote-retrieve.t @@ -33,20 +33,21 @@ TEST_NAME="${TEST_NAME_BASE}-run" workflow_run_ok "${TEST_NAME}" cylc play --debug --no-detach "${WORKFLOW_NAME}" # Local job.out should exist (retrieved). -LOCAL_JOB_OUT=$(cylc cat-log -f a -m d "${WORKFLOW_NAME}" a-task.1)/job.out +LOCAL_JOB_OUT=$(cylc cat-log -f a -m d "${WORKFLOW_NAME}//1/a-task")/job.out exists_ok "${LOCAL_JOB_OUT}" -# Distinguish local from remote job.out. +# Distinguish local from remote job.out perl -pi -e 's/fox/FOX/' "${LOCAL_JOB_OUT}" # Cat the remote one. TEST_NAME=${TEST_NAME_BASE}-out-rem -run_ok "${TEST_NAME}" cylc cat-log --force-remote -f o "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log --force-remote -f o \ + "${WORKFLOW_NAME}//1/a-task" grep_ok '^the quick brown fox$' "${TEST_NAME}.stdout" # Cat the local one. TEST_NAME=${TEST_NAME_BASE}-out-loc -run_ok "${TEST_NAME}" cylc cat-log -f o "${WORKFLOW_NAME}" a-task.1 +run_ok "${TEST_NAME}" cylc cat-log -f o "${WORKFLOW_NAME}//1/a-task" grep_ok '^the quick brown FOX$' "${TEST_NAME}.stdout" purge diff --git a/tests/functional/cylc-cat-log/editor/bin/run_tests.sh b/tests/functional/cylc-cat-log/editor/bin/run_tests.sh index 8d701bf7541..f7c6ce7fbfd 100644 --- a/tests/functional/cylc-cat-log/editor/bin/run_tests.sh +++ b/tests/functional/cylc-cat-log/editor/bin/run_tests.sh @@ -44,10 +44,12 @@ function run_tests { export ORIGFILE="${JOBFILE}.orig" # Check we can view the job log file in the "editor". TEST_NAME="${TEST_NAME_BASE}-${JOBFILE}" - run_ok "${TEST_NAME}" cylc cat-log -f "${JOBFILE}" -m e "${WORKFLOW_NAME}" foo.1 - # Compare viewed (i.e. copied by the fake editor) file with the original. + run_ok "${TEST_NAME}" cylc cat-log -f "${JOBFILE}" -m e \ + "${WORKFLOW_NAME}//1/foo" + # Compare viewed (i.e copied by the fake editor) file with the original. # (The original must be catted as it could be a remote log file). - cylc cat-log -f "${JOBFILE}" -m c "${WORKFLOW_NAME}" foo.1 > "${ORIGFILE}" + cylc cat-log -f "${JOBFILE}" -m c \ + "${WORKFLOW_NAME}//1/foo" > "${ORIGFILE}" cmp_ok "${DESTFILE}" "${ORIGFILE}" done @@ -55,6 +57,7 @@ function run_tests { TEST_NAME="${TEST_NAME_BASE}-job" JOBFILE="job" export DESTFILE="${JOBFILE}.edit" - run_ok "${TEST_NAME}" cylc cat-log -m e --geditor -f j "${WORKFLOW_NAME}" foo.1 + run_ok "${TEST_NAME}" cylc cat-log -m e --geditor -f j \ + "${WORKFLOW_NAME}//1/foo" cmp_ok "${DESTFILE}" "${JOB_LOG_DIR}/${JOBFILE}" } diff --git a/tests/functional/cylc-get-config/00-simple.t b/tests/functional/cylc-get-config/00-simple.t index 12dcbc5b0dc..89c3713628d 100755 --- a/tests/functional/cylc-get-config/00-simple.t +++ b/tests/functional/cylc-get-config/00-simple.t @@ -24,8 +24,11 @@ init_workflow "${TEST_NAME_BASE}" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/flow.cyl #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-all" run_ok "${TEST_NAME}" cylc config -d "${WORKFLOW_NAME}" -run_ok "${TEST_NAME}-validate" cylc validate --check-circular "${TEST_NAME}.stdout" +mkdir tmp_src +cp "${TEST_NAME}.stdout" tmp_src/flow.cylc +run_ok "${TEST_NAME}-validate" cylc validate --check-circular ./tmp_src cmp_ok "${TEST_NAME}.stderr" <'/dev/null' +rm -rf tmp_src #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-section1" run_ok "${TEST_NAME}" cylc config -d --item=[scheduling] "${WORKFLOW_NAME}" diff --git a/tests/functional/cylc-get-config/02-cycling.t b/tests/functional/cylc-get-config/02-cycling.t index 7273a4a708b..1a36850eb30 100755 --- a/tests/functional/cylc-get-config/02-cycling.t +++ b/tests/functional/cylc-get-config/02-cycling.t @@ -23,7 +23,10 @@ set_test_number 2 init_workflow "${TEST_NAME_BASE}" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/flow.cylc" run_ok "${TEST_NAME_BASE}" cylc config "${WORKFLOW_NAME}" +mkdir temp +cp "${TEST_NAME_BASE}.stdout" temp/flow.cylc run_ok "${TEST_NAME_BASE}-validate" \ - cylc validate --check-circular "${TEST_NAME_BASE}.stdout" + cylc validate --check-circular ./temp +rm -rf temp purge exit diff --git a/tests/functional/cylc-get-config/02-cycling/flow.cylc b/tests/functional/cylc-get-config/02-cycling/flow.cylc index 6538078bb5d..7033ed6c6ff 100644 --- a/tests/functional/cylc-get-config/02-cycling/flow.cylc +++ b/tests/functional/cylc-get-config/02-cycling/flow.cylc @@ -6,6 +6,6 @@ [runtime] [[foo]] script = """ -echo this -echo that -""" + echo this + echo that + """ diff --git a/tests/functional/cylc-get-config/06-compat.t b/tests/functional/cylc-get-config/06-compat.t index b4ee822b2ee..a76f51a22a2 100644 --- a/tests/functional/cylc-get-config/06-compat.t +++ b/tests/functional/cylc-get-config/06-compat.t @@ -43,9 +43,9 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [[[ P1D!(01T, 11T) ]]] graph = t3 __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}-validate" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}-validate" cylc validate . run_ok "${TEST_NAME_BASE}-dependencies" \ - cylc config --item='[scheduling][graph]' 'flow.cylc' + cylc config --item='[scheduling][graph]' . cmp_ok "${TEST_NAME_BASE}-dependencies.stdout" <<'__OUT__' R1 = """ r1 diff --git a/tests/functional/cylc-get-cylc-version/00-basic/reference.log b/tests/functional/cylc-get-cylc-version/00-basic/reference.log index a9719a177e1..08fe5d5558a 100644 --- a/tests/functional/cylc-get-cylc-version/00-basic/reference.log +++ b/tests/functional/cylc-get-cylc-version/00-basic/reference.log @@ -1,3 +1,3 @@ -2014-12-03T15:40:50+13 INFO - Initial point: 1 -2014-12-03T15:40:50+13 INFO - Final point: 1 -2014-12-03T15:40:50+13 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/cylc-graph-diff/00-simple.t b/tests/functional/cylc-graph-diff/00-simple.t index ecd7099a60d..2493791f016 100644 --- a/tests/functional/cylc-graph-diff/00-simple.t +++ b/tests/functional/cylc-graph-diff/00-simple.t @@ -42,7 +42,7 @@ run_fail "${TEST_NAME}" \ cylc graph "${DIFF_WORKFLOW_NAME}" --diff "${CONTROL_WORKFLOW_NAME}.bad" cmp_ok "${TEST_NAME}.stdout" "${WORKFLOW}/test_file_in_workflow" echo "Outside workflow" > test_file_outside_workflow # Carry out actual test with abspath: -cylc install -C "$PWD/${WORKFLOW}" -named_grep_ok "File inside flow VC'd" "Inside workflow" "${RUN_DIR}/log/version/uncommitted.diff" -grep_fail "Outside workflow" "${RUN_DIR}/log/version/uncommitted.diff" +run_ok "${TEST_NAME_BASE}-install" \ + cylc install \ + -C "$PWD/${WORKFLOW}" \ + --flow-name "${WORKFLOW_NAME}" +named_grep_ok \ + "File inside flow VC'd" \ + "Inside workflow" \ + "${WORKFLOW_RUN_DIR}/log/version/uncommitted.diff" +grep_fail "Outside workflow" "${WORKFLOW_RUN_DIR}/log/version/uncommitted.diff" # Carry out actual test with relpath: cylc install -C "${WORKFLOW}" -named_grep_ok "File inside flow VC'd" "Inside workflow" "${RUN_DIR}/log/version/uncommitted.diff" -grep_fail "Outside workflow" "${RUN_DIR}/log/version/uncommitted.diff" +named_grep_ok \ + "File inside flow VC'd" \ + "Inside workflow" \ + "${WORKFLOW_RUN_DIR}/log/version/uncommitted.diff" +grep_fail "Outside workflow" "${WORKFLOW_RUN_DIR}/log/version/uncommitted.diff" -# Clean up installed flow: -rm -fr "${HOME}/cylc-run/${WORKFLOW}" +purge diff --git a/tests/functional/cylc-install/06-check-logs-svn.t b/tests/functional/cylc-install/06-check-logs-svn.t index a6e1ba1a5dd..3cf6639cade 100644 --- a/tests/functional/cylc-install/06-check-logs-svn.t +++ b/tests/functional/cylc-install/06-check-logs-svn.t @@ -21,13 +21,13 @@ svn --version || skip_all "svn not installed" -set_test_number 2 +set_test_number 3 -WORKFLOW=$(date | md5sum | awk '{print $1}') -RUN_DIR="${HOME}/cylc-run/${WORKFLOW}" +WORKFLOW="$(date | md5sum | awk '{print $1}')" +WORKFLOW_NAME="$(workflow_id "${TEST_NAME_BASE}")" +WORKFLOW_RUN_DIR="${RUN_DIR}/${WORKFLOW_NAME}" WORKDIR1="${PWD}/workdir1" - # Create a workflow in a subdirectory of the test tmpdir mkdir -p "${WORKDIR1}/${WORKFLOW}" cat > "${WORKDIR1}/${WORKFLOW}/flow.cylc" <<__HEREDOC__ @@ -54,9 +54,16 @@ echo "Inside workflow" > "${WORKFLOW}/test_file_in_workflow" echo "Outside workflow" > test_file_outside_workflow # Carry out actual test: -cylc install -C "$PWD/${WORKFLOW}" --no-run-name -named_grep_ok "File inside flow VC'd" "Inside workflow" "${RUN_DIR}/log/version/uncommitted.diff" -grep_fail "Outside workflow" "${RUN_DIR}/log/version/uncommitted.diff" -# Clean up installed flow: -rm -fr "${RUN_DIR}" +run_ok "${TEST_NAME_BASE}-install" \ + cylc install \ + -C "$PWD/${WORKFLOW}" \ + --no-run-name \ + --flow-name "${WORKFLOW_NAME}" +named_grep_ok \ + "File inside flow VC'd" \ + "Inside workflow" \ + "${WORKFLOW_RUN_DIR}/log/version/uncommitted.diff" +grep_fail "Outside workflow" "${WORKFLOW_RUN_DIR}/logversion./uncommitted.diff" + +purge diff --git a/tests/functional/cylc-kill/00-multi-hosts-compat/flow.cylc b/tests/functional/cylc-kill/00-multi-hosts-compat/flow.cylc index 17aea52a2e7..bd5af22473d 100644 --- a/tests/functional/cylc-kill/00-multi-hosts-compat/flow.cylc +++ b/tests/functional/cylc-kill/00-multi-hosts-compat/flow.cylc @@ -3,7 +3,7 @@ [scheduler] UTC mode = True [[events]] - expected task failures = local-1.1, local-2.1, local-3.1, remote-1.1, remote-2.1 + expected task failures = 1/local-1, 1/local-2, 1/local-3, 1/remote-1, 1/remote-2 [scheduling] [[graph]] @@ -24,6 +24,6 @@ platform = {{CYLC_TEST_PLATFORM}} [[killer]] script = """ - cylc kill "${CYLC_WORKFLOW_ID}" KILLABLE 1 + cylc kill "${CYLC_WORKFLOW_ID}//1/KILLABLE" cylc stop "${CYLC_WORKFLOW_ID}" """ diff --git a/tests/functional/cylc-kill/00-multi-hosts-compat/reference.log b/tests/functional/cylc-kill/00-multi-hosts-compat/reference.log index 6cbaca3b3bc..c259f4afaf9 100644 --- a/tests/functional/cylc-kill/00-multi-hosts-compat/reference.log +++ b/tests/functional/cylc-kill/00-multi-hosts-compat/reference.log @@ -1,8 +1,8 @@ -2015-08-24T15:20:15Z INFO - Initial point: 1 -2015-08-24T15:20:15Z INFO - Final point: 1 -2015-08-24T15:20:16Z DEBUG - remote-1.1 -triggered off [] -2015-08-24T15:20:16Z DEBUG - local-1.1 -triggered off ['remote-1.1', 'remote-2.1'] -2015-08-24T15:20:16Z DEBUG - local-2.1 -triggered off ['remote-1.1', 'remote-2.1'] -2015-08-24T15:20:16Z DEBUG - remote-2.1 -triggered off [] -2015-08-24T15:20:16Z DEBUG - local-3.1 -triggered off ['remote-1.1', 'remote-2.1'] -2015-08-24T15:20:19Z DEBUG - killer.1 -triggered off ['local-1.1', 'local-2.1', 'local-3.1', 'remote-1.1', 'remote-2.1'] +Initial point: 1 +Final point: 1 +1/remote-1 -triggered off [] +1/local-1 -triggered off ['1/remote-1', '1/remote-2'] +1/local-2 -triggered off ['1/remote-1', '1/remote-2'] +1/remote-2 -triggered off [] +1/local-3 -triggered off ['1/remote-1', '1/remote-2'] +1/killer -triggered off ['1/local-1', '1/local-2', '1/local-3', '1/remote-1', '1/remote-2'] diff --git a/tests/functional/cylc-kill/01-multi-hosts/flow.cylc b/tests/functional/cylc-kill/01-multi-hosts/flow.cylc index 0ff3d9254dd..350c49aadbd 100644 --- a/tests/functional/cylc-kill/01-multi-hosts/flow.cylc +++ b/tests/functional/cylc-kill/01-multi-hosts/flow.cylc @@ -2,7 +2,7 @@ [scheduler] UTC mode = True [[events]] - expected task failures = local-1.1, local-2.1, local-3.1, remote-1.1, remote-2.1 + expected task failures = 1/local-1, 1/local-2, 1/local-3, 1/remote-1, 1/remote-2 [scheduling] [[graph]] @@ -23,6 +23,6 @@ platform = {{ CYLC_TEST_PLATFORM }} [[killer]] script = """ - cylc kill "${CYLC_WORKFLOW_ID}" KILLABLE.1 + cylc kill "${CYLC_WORKFLOW_ID}//1/KILLABLE" cylc stop "${CYLC_WORKFLOW_ID}" """ diff --git a/tests/functional/cylc-kill/01-multi-hosts/reference.log b/tests/functional/cylc-kill/01-multi-hosts/reference.log index 6cbaca3b3bc..c259f4afaf9 100644 --- a/tests/functional/cylc-kill/01-multi-hosts/reference.log +++ b/tests/functional/cylc-kill/01-multi-hosts/reference.log @@ -1,8 +1,8 @@ -2015-08-24T15:20:15Z INFO - Initial point: 1 -2015-08-24T15:20:15Z INFO - Final point: 1 -2015-08-24T15:20:16Z DEBUG - remote-1.1 -triggered off [] -2015-08-24T15:20:16Z DEBUG - local-1.1 -triggered off ['remote-1.1', 'remote-2.1'] -2015-08-24T15:20:16Z DEBUG - local-2.1 -triggered off ['remote-1.1', 'remote-2.1'] -2015-08-24T15:20:16Z DEBUG - remote-2.1 -triggered off [] -2015-08-24T15:20:16Z DEBUG - local-3.1 -triggered off ['remote-1.1', 'remote-2.1'] -2015-08-24T15:20:19Z DEBUG - killer.1 -triggered off ['local-1.1', 'local-2.1', 'local-3.1', 'remote-1.1', 'remote-2.1'] +Initial point: 1 +Final point: 1 +1/remote-1 -triggered off [] +1/local-1 -triggered off ['1/remote-1', '1/remote-2'] +1/local-2 -triggered off ['1/remote-1', '1/remote-2'] +1/remote-2 -triggered off [] +1/local-3 -triggered off ['1/remote-1', '1/remote-2'] +1/killer -triggered off ['1/local-1', '1/local-2', '1/local-3', '1/remote-1', '1/remote-2'] diff --git a/tests/functional/cylc-kill/02-submitted/flow.cylc b/tests/functional/cylc-kill/02-submitted/flow.cylc index a7e04244619..f9d0e0fda39 100644 --- a/tests/functional/cylc-kill/02-submitted/flow.cylc +++ b/tests/functional/cylc-kill/02-submitted/flow.cylc @@ -1,31 +1,34 @@ #!Jinja2 + [scheduler] UTC mode = True [[events]] - expected task failures = killable-1.1, killable-2.1, killable-3.1 + expected task failures = 1/killable-1, 1/killable-2, 1/killable-3 + [scheduling] [[graph]] - R1=""" -KILLABLE:submit-all? => killer -KILLABLE:submit-fail-all? => stopper -""" + R1 = """ + KILLABLE:submit-all? => killer + KILLABLE:submit-fail-all? => stopper + """ + [runtime] [[KILLABLE]] init-script=""" -echo "CYLC_JOB_PID=$$" >>"$0.status" -sleep 60 -""" + echo "CYLC_JOB_PID=$$" >>"$0.status" + sleep 60 + """ script=true [[killable-1, killable-2, killable-3]] inherit=KILLABLE [[killer]] script=""" -cylc__job__wait_cylc_message_started -cylc__job__poll_grep_workflow_log -F 'killable-1.1 -triggered' -cylc__job__poll_grep_workflow_log -F 'killable-2.1 -triggered' -cylc__job__poll_grep_workflow_log -F 'killable-3.1 -triggered' -# (Avoid killing myself if my started message hasn't arrived yet:) -cylc kill "${CYLC_WORKFLOW_ID}" 'killable*:submitted' -""" + cylc__job__wait_cylc_message_started + cylc__job__poll_grep_workflow_log -F '1/killable-1 -triggered' + cylc__job__poll_grep_workflow_log -F '1/killable-2 -triggered' + cylc__job__poll_grep_workflow_log -F '1/killable-3 -triggered' + # (Avoid killing myself if my started message hasn't arrived yet:) + cylc kill "${CYLC_WORKFLOW_ID}//*/killable*:submitted" + """ [[stopper]] script=cylc stop "${CYLC_WORKFLOW_ID}" diff --git a/tests/functional/cylc-kill/02-submitted/reference.log b/tests/functional/cylc-kill/02-submitted/reference.log index c22104a198a..47a53cfb08a 100644 --- a/tests/functional/cylc-kill/02-submitted/reference.log +++ b/tests/functional/cylc-kill/02-submitted/reference.log @@ -1,7 +1,7 @@ -2015-08-24T15:20:15Z INFO - Initial point: 1 -2015-08-24T15:20:15Z INFO - Final point: 1 -2015-08-24T15:20:16Z DEBUG - killable-1.1 -triggered off [] -2015-08-24T15:20:16Z DEBUG - killable-2.1 -triggered off [] -2015-08-24T15:20:16Z DEBUG - killable-3.1 -triggered off [] -2015-08-24T15:20:19Z DEBUG - killer.1 -triggered off ['killable-1.1', 'killable-2.1', 'killable-3.1'] -2015-08-24T15:20:19Z DEBUG - stopper.1 -triggered off ['killable-1.1', 'killable-2.1', 'killable-3.1'] +Initial point: 1 +Final point: 1 +1/killable-1 -triggered off [] +1/killable-2 -triggered off [] +1/killable-3 -triggered off [] +1/killer -triggered off ['1/killable-1', '1/killable-2', '1/killable-3'] +1/stopper -triggered off ['1/killable-1', '1/killable-2', '1/killable-3'] diff --git a/tests/functional/cylc-kill/03-simulation.t b/tests/functional/cylc-kill/03-simulation.t index 81d44eb6109..f9152a84a1f 100755 --- a/tests/functional/cylc-kill/03-simulation.t +++ b/tests/functional/cylc-kill/03-simulation.t @@ -28,15 +28,15 @@ run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" cylc play --debug -m simulation "${WORKFLOW_NAME}" >/dev/null 2>&1 # wait for simulated job start -poll_grep_workflow_log "foo.1 .* running" -E +poll_grep_workflow_log "1/foo .* running" -E # kill it -run_ok killer cylc kill "${WORKFLOW_NAME}" foo.1 +run_ok killer cylc kill "${WORKFLOW_NAME}//1/foo" # wait for shut down poll_grep_workflow_log "INFO - DONE" # check the sim job was kiled -grep_workflow_log_ok killed "foo.1 .* failed" -E +grep_workflow_log_ok killed "1/foo .* failed" -E purge diff --git a/tests/functional/cylc-list/00-options.t b/tests/functional/cylc-list/00-options.t index 5f526b11158..3f46974b5f5 100755 --- a/tests/functional/cylc-list/00-options.t +++ b/tests/functional/cylc-list/00-options.t @@ -85,21 +85,21 @@ root root __DONE__ #------------------------------------------------------------------------------ cat > res.out << __DONE__ -cujo.20140808T0000Z -cujo.20140809T0000Z -cujo.20140810T0000Z -cujo.20140811T0000Z -cujo.20140812T0000Z -fido.20140808T0000Z -fido.20140809T0000Z -fido.20140810T0000Z -fido.20140811T0000Z -fido.20140812T0000Z -manny.20140808T0000Z -manny.20140809T0000Z -manny.20140810T0000Z -manny.20140811T0000Z -manny.20140812T0000Z +20140808T0000Z/cujo +20140808T0000Z/fido +20140808T0000Z/manny +20140809T0000Z/cujo +20140809T0000Z/fido +20140809T0000Z/manny +20140810T0000Z/cujo +20140810T0000Z/fido +20140810T0000Z/manny +20140811T0000Z/cujo +20140811T0000Z/fido +20140811T0000Z/manny +20140812T0000Z/cujo +20140812T0000Z/fido +20140812T0000Z/manny __DONE__ TEST_NAME=${TEST_NAME_BASE}-opt-p1 @@ -112,15 +112,15 @@ cylc ls -p ,20140812T0000Z "${WORKFLOW_NAME}" > list-p2.out cmp_ok list-p2.out res.out cat > res2.out << __DONE__ -cujo.20140808T0000Z -cujo.20140809T0000Z -cujo.20140810T0000Z -fido.20140808T0000Z -fido.20140809T0000Z -fido.20140810T0000Z -manny.20140808T0000Z -manny.20140809T0000Z -manny.20140810T0000Z +20140808T0000Z/cujo +20140808T0000Z/fido +20140808T0000Z/manny +20140809T0000Z/cujo +20140809T0000Z/fido +20140809T0000Z/manny +20140810T0000Z/cujo +20140810T0000Z/fido +20140810T0000Z/manny __DONE__ diff --git a/tests/functional/cylc-message/00-ssh/reference.log b/tests/functional/cylc-message/00-ssh/reference.log index 533b727af79..9dfc9f578aa 100644 --- a/tests/functional/cylc-message/00-ssh/reference.log +++ b/tests/functional/cylc-message/00-ssh/reference.log @@ -1,4 +1,3 @@ -2015-08-26T10:10:10Z INFO - Initial point: 1 -2015-08-26T10:10:10Z INFO - Final point: 1 -2015-08-26T10:10:10Z DEBUG - t0.1 -triggered off [] -2015-08-26T10:10:10Z DEBUG - t1.1 -triggered off ['t0.1'] +Final point: 1 +1/t0 -triggered off [] +1/t1 -triggered off ['1/t0'] diff --git a/tests/functional/cylc-message/02-multi.t b/tests/functional/cylc-message/02-multi.t index 80684779d95..ddc2b9e9c50 100755 --- a/tests/functional/cylc-message/02-multi.t +++ b/tests/functional/cylc-message/02-multi.t @@ -57,19 +57,19 @@ sed -i 's/\(^.*\) at .*$/\1/;' 'sed.out' # Note: the continuation bit gets printed twice, because the message gets a # warning as being unhandled. cmp_ok 'sed.out' <<__LOG__ -INFO - [foo.1 submitted job:01 flows:1] (received)started -WARNING - [foo.1 running job:01 flows:1] (received)Warn this -INFO - [foo.1 running job:01 flows:1] (received)Greeting -WARNING - [foo.1 running job:01 flows:1] (received)Warn that -DEBUG - [foo.1 running job:01 flows:1] (received)Remove stuffs such as +INFO - [1/foo submitted job:01 flows:1] (received)started +WARNING - [1/foo running job:01 flows:1] (received)Warn this +INFO - [1/foo running job:01 flows:1] (received)Greeting +WARNING - [1/foo running job:01 flows:1] (received)Warn that +DEBUG - [1/foo running job:01 flows:1] (received)Remove stuffs such as ${LOG_INDENT}badness ${LOG_INDENT}slowness ${LOG_INDENT}and other incorrectness. ${LOG_INDENT}badness ${LOG_INDENT}slowness ${LOG_INDENT}and other incorrectness. -INFO - [foo.1 running job:01 flows:1] (received)whatever -INFO - [foo.1 running job:01 flows:1] (received)succeeded +INFO - [1/foo running job:01 flows:1] (received)whatever +INFO - [1/foo running job:01 flows:1] (received)succeeded __LOG__ purge diff --git a/tests/functional/cylc-ping/00-simple/reference.log b/tests/functional/cylc-ping/00-simple/reference.log index 830c8bef5db..1a9f846c98d 100644 --- a/tests/functional/cylc-ping/00-simple/reference.log +++ b/tests/functional/cylc-ping/00-simple/reference.log @@ -1,4 +1,4 @@ -2013/09/30 16:48:11 INFO - Initial point: 1 -2013/09/30 16:48:11 INFO - Final point: 1 -2013/09/30 16:48:11 DEBUG - foo.1 -triggered off [] -2013/09/30 16:48:16 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/cylc-ping/04-check-keys-remote.t b/tests/functional/cylc-ping/04-check-keys-remote.t index d41a7fe9bc6..4d7f91ad479 100644 --- a/tests/functional/cylc-ping/04-check-keys-remote.t +++ b/tests/functional/cylc-ping/04-check-keys-remote.t @@ -51,7 +51,7 @@ workflow_run_ok "${TEST_NAME_BASE}-run" cylc play \ "${WORKFLOW_NAME}" \ --no-detach -KEYS_FILE="$(cylc cat-log -m p "$WORKFLOW_NAME" 'keys.1' -f job-find-out)" +KEYS_FILE="$(cylc cat-log -m p "$WORKFLOW_NAME//1/keys" -f job-find-out)" if [[ "$CYLC_TEST_PLATFORM" == *shared* ]]; then cmp_ok "$KEYS_FILE" <<__OUT__ client.key_secret diff --git a/tests/functional/cylc-play/05-start-task.t b/tests/functional/cylc-play/05-start-task.t index 9177d501721..9db6c6d1165 100644 --- a/tests/functional/cylc-play/05-start-task.t +++ b/tests/functional/cylc-play/05-start-task.t @@ -25,6 +25,6 @@ install_workflow "${TEST_NAME_BASE}" run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" workflow_run_ok "${TEST_NAME_BASE}-run" \ - cylc play --no-detach --reference-test -t bar.3 -t war.3 "${WORKFLOW_NAME}" + cylc play --no-detach --reference-test -t 3/bar -t 3/war "${WORKFLOW_NAME}" purge diff --git a/tests/functional/cylc-play/05-start-task/reference.log b/tests/functional/cylc-play/05-start-task/reference.log index e58777a6323..50123a29da4 100644 --- a/tests/functional/cylc-play/05-start-task/reference.log +++ b/tests/functional/cylc-play/05-start-task/reference.log @@ -1,7 +1,7 @@ -Start task: ['bar.3', 'war.3'] +Start task: ['3/bar', '3/war'] Initial point: 1 Final point: 3 -bar.3 -triggered off [] -war.3 -triggered off [] -baz.3 -triggered off ['bar.3'] -waz.3 -triggered off ['war.3'] +3/bar -triggered off [] +3/war -triggered off [] +3/baz -triggered off ['3/bar'] +3/waz -triggered off ['3/war'] diff --git a/tests/functional/cylc-poll/00-basic/flow.cylc b/tests/functional/cylc-poll/00-basic/flow.cylc index 9237f9447a9..f0d5f7cedbf 100644 --- a/tests/functional/cylc-poll/00-basic/flow.cylc +++ b/tests/functional/cylc-poll/00-basic/flow.cylc @@ -10,4 +10,4 @@ do done """ [[b]] - script = cylc poll "$CYLC_WORKFLOW_ID" 'a.1' + script = cylc poll "$CYLC_WORKFLOW_ID//1/a" diff --git a/tests/functional/cylc-poll/00-basic/reference.log b/tests/functional/cylc-poll/00-basic/reference.log index e22a751c729..5d97dd71863 100644 --- a/tests/functional/cylc-poll/00-basic/reference.log +++ b/tests/functional/cylc-poll/00-basic/reference.log @@ -1,4 +1,4 @@ -2013/12/09 16:14:26 INFO - Initial point: 1 -2013/12/09 16:14:26 INFO - Final point: 1 -2013/12/09 16:14:26 DEBUG - a.1 -triggered off [] -2013/12/09 16:14:29 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/01-task-failed/flow.cylc b/tests/functional/cylc-poll/01-task-failed/flow.cylc index f3811363b67..ae60fb45bb8 100644 --- a/tests/functional/cylc-poll/01-task-failed/flow.cylc +++ b/tests/functional/cylc-poll/01-task-failed/flow.cylc @@ -1,12 +1,14 @@ [meta] title = "Test workflow for task state change on poll result." - description = """Task A fails silently - it will be stuck in 'running' -unless polled. Task B then polls A to find it has failed, allowing A to -suicide via a :fail trigger, and the workflow to shut down successfully.""" + description = """ + Task A fails silently - it will be stuck in 'running' + unless polled. Task B then polls A to find it has failed, allowing A to + suicide via a :fail trigger, and the workflow to shut down successfully. + """ [scheduler] [[events]] - expected task failures = a.1 + expected task failures = 1/a [scheduling] [[graph]] @@ -22,7 +24,7 @@ suicide via a :fail trigger, and the workflow to shut down successfully.""" exit 1 """ [[b]] - script = cylc poll "$CYLC_WORKFLOW_ID" 'a' + script = cylc poll "$CYLC_WORKFLOW_ID//*/a" [[handled]] # (allows a:fail to be removed as handled) script = true diff --git a/tests/functional/cylc-poll/01-task-failed/reference.log b/tests/functional/cylc-poll/01-task-failed/reference.log index 17955e92ea1..b011c0830bc 100644 --- a/tests/functional/cylc-poll/01-task-failed/reference.log +++ b/tests/functional/cylc-poll/01-task-failed/reference.log @@ -1,5 +1,5 @@ -2014/03/03 16:07:55 INFO - Initial point: 1 -2014/03/03 16:07:55 INFO - Final point: 1 -2014/03/03 16:07:55 DEBUG - a.1 -triggered off [] -2014/03/03 16:07:58 DEBUG - b.1 -triggered off ['a.1'] -2014/03/03 16:07:58 DEBUG - handled.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/handled -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/02-task-submit-failed/flow.cylc b/tests/functional/cylc-poll/02-task-submit-failed/flow.cylc index 3b73789b2a7..0750c43086e 100644 --- a/tests/functional/cylc-poll/02-task-submit-failed/flow.cylc +++ b/tests/functional/cylc-poll/02-task-submit-failed/flow.cylc @@ -2,7 +2,7 @@ [scheduler] [[events]] - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] @@ -17,7 +17,7 @@ [[poll_foo]] script = """ cylc__job__wait_cylc_message_started - cylc poll "$CYLC_WORKFLOW_ID" 'foo' + cylc poll "$CYLC_WORKFLOW_ID//*/foo" """ [[stop]] script = cylc stop $CYLC_WORKFLOW_ID diff --git a/tests/functional/cylc-poll/02-task-submit-failed/reference.log b/tests/functional/cylc-poll/02-task-submit-failed/reference.log index a7a04210882..6d7d7c267b4 100644 --- a/tests/functional/cylc-poll/02-task-submit-failed/reference.log +++ b/tests/functional/cylc-poll/02-task-submit-failed/reference.log @@ -1,6 +1,6 @@ -2014-10-22T10:14:15+01 INFO - Initial point: 1 -2014-10-22T10:14:15+01 INFO - Final point: 1 -2014-10-22T10:14:15+01 DEBUG - foo.1 -triggered off [] -2014-10-22T10:14:16+01 DEBUG - kill_foo_submit.1 -triggered off ['foo.1'] -2014-10-22T10:14:24+01 DEBUG - poll_foo.1 -triggered off ['kill_foo_submit.1'] -2014-10-22T10:14:32+01 DEBUG - stop.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/kill_foo_submit -triggered off ['1/foo'] +1/poll_foo -triggered off ['1/kill_foo_submit'] +1/stop -triggered off ['1/foo'] diff --git a/tests/functional/cylc-poll/04-poll-multi-hosts/flow.cylc b/tests/functional/cylc-poll/04-poll-multi-hosts/flow.cylc index f1dbfe37e93..10b36b8677c 100644 --- a/tests/functional/cylc-poll/04-poll-multi-hosts/flow.cylc +++ b/tests/functional/cylc-poll/04-poll-multi-hosts/flow.cylc @@ -2,7 +2,7 @@ [scheduler] UTC mode = True [[events]] - expected task failures = local-fail-1.1, local-fail-2.1, remote-fail-1.1 + expected task failures = 1/local-fail-1, 1/local-fail-2, 1/remote-fail-1 [scheduling] [[graph]] R1 = """ @@ -40,6 +40,6 @@ platform = {{ environ['CYLC_TEST_PLATFORM'] }} [[poller]] script = """ - cylc poll "${CYLC_WORKFLOW_ID}" 'POLLABLE' + cylc poll "${CYLC_WORKFLOW_ID}//*/POLLABLE" cylc stop "${CYLC_WORKFLOW_ID}" """ diff --git a/tests/functional/cylc-poll/04-poll-multi-hosts/reference.log b/tests/functional/cylc-poll/04-poll-multi-hosts/reference.log index 66d51882ef1..b138fad799a 100644 --- a/tests/functional/cylc-poll/04-poll-multi-hosts/reference.log +++ b/tests/functional/cylc-poll/04-poll-multi-hosts/reference.log @@ -1,9 +1,9 @@ -2015-08-24T13:53:25Z INFO - Initial point: 1 -2015-08-24T13:53:25Z INFO - Final point: 1 -2015-08-24T13:53:26Z DEBUG - remote-success-1.1 -triggered off [] -2015-08-24T13:53:26Z DEBUG - remote-fail-1.1 -triggered off [] -2015-08-24T13:53:26Z DEBUG - local-fail-2.1 -triggered off [] -2015-08-24T13:53:26Z DEBUG - remote-success-2.1 -triggered off [] -2015-08-24T13:53:26Z DEBUG - local-success-1.1 -triggered off [] -2015-08-24T13:53:26Z DEBUG - local-fail-1.1 -triggered off [] -2015-08-24T13:53:31Z DEBUG - poller.1 -triggered off ['local-fail-1.1', 'local-fail-2.1', 'local-success-1.1', 'remote-fail-1.1', 'remote-success-1.1', 'remote-success-2.1'] +Initial point: 1 +Final point: 1 +1/remote-success-1 -triggered off [] +1/remote-fail-1 -triggered off [] +1/local-fail-2 -triggered off [] +1/remote-success-2 -triggered off [] +1/local-success-1 -triggered off [] +1/local-fail-1 -triggered off [] +1/poller -triggered off ['1/local-fail-1', '1/local-fail-2', '1/local-success-1', '1/remote-fail-1', '1/remote-success-1', '1/remote-success-2'] diff --git a/tests/functional/cylc-poll/05-poll-multi-messages/flow.cylc b/tests/functional/cylc-poll/05-poll-multi-messages/flow.cylc index b24ac3219ec..9adf11d9107 100644 --- a/tests/functional/cylc-poll/05-poll-multi-messages/flow.cylc +++ b/tests/functional/cylc-poll/05-poll-multi-messages/flow.cylc @@ -1,42 +1,44 @@ #!Jinja2 + [scheduler] UTC mode = True + [scheduling] [[graph]] - R1=""" -speaker1:start & speaker2:start => poller -speaker1:hello1 & speaker1:hello2 & speaker2:greet => finisher -""" + R1 = """ + speaker1:start & speaker2:start => poller + speaker1:hello1 & speaker1:hello2 & speaker2:greet => finisher + """ [runtime] [[speaker1]] - script=""" -# Wait for "cylc message started" command -cylc__job__wait_cylc_message_started -# Simulate "cylc message", messages written to status file but failed to -# get sent back to the workflow -{ - echo "CYLC_MESSAGE=$(date +%FT%H:%M:%SZ)|INFO|hello1" - echo "CYLC_MESSAGE=$(date +%FT%H:%M:%SZ)|INFO|hello2" -} >>"${CYLC_TASK_LOG_ROOT}.status" -cylc__job__poll_grep_workflow_log -E 'speaker1\.1 running .* \(polled\)hello1' -cylc__job__poll_grep_workflow_log -E 'speaker1\.1 running .* \(polled\)hello2' -""" - [[[outputs]]] - hello1 = "hello1" - hello2 = "hello2" + script = """ + # Wait for "cylc message started" command + cylc__job__wait_cylc_message_started + # Simulate "cylc message", messages written to status file but failed to + # get sent back to the workflow + { + echo "CYLC_MESSAGE=$(date +%FT%H:%M:%SZ)|INFO|hello1" + echo "CYLC_MESSAGE=$(date +%FT%H:%M:%SZ)|INFO|hello2" + } >>"${CYLC_TASK_LOG_ROOT}.status" + cylc__job__poll_grep_workflow_log -E '1/speaker1 running .* \(polled\)hello1' + cylc__job__poll_grep_workflow_log -E '1/speaker1 running .* \(polled\)hello2' + """ + [[[outputs]]] + hello1 = "hello1" + hello2 = "hello2" [[speaker2]] script=""" -# Wait for "cylc message started" command -cylc__job__wait_cylc_message_started -# Simulate "cylc message", messages written to status file but failed to -# get sent back to the workflow -echo "CYLC_MESSAGE=$(date +%FT%H:%M:%SZ)|INFO|greet" \ - >>"${CYLC_TASK_LOG_ROOT}.status" -cylc__job__poll_grep_workflow_log -E 'speaker2\.1 running .* \(polled\)greet' -""" + # Wait for "cylc message started" command + cylc__job__wait_cylc_message_started + # Simulate "cylc message", messages written to status file but failed to + # get sent back to the workflow + echo "CYLC_MESSAGE=$(date +%FT%H:%M:%SZ)|INFO|greet" \ + >>"${CYLC_TASK_LOG_ROOT}.status" + cylc__job__poll_grep_workflow_log -E '1/speaker2 running .* \(polled\)greet' + """ [[[outputs]]] greet = "greet" [[finisher]] script=true [[poller]] - script=cylc poll "${CYLC_WORKFLOW_ID}" 'speaker[12]' + script=cylc poll "${CYLC_WORKFLOW_ID}//*/speaker[12]" diff --git a/tests/functional/cylc-poll/05-poll-multi-messages/reference.log b/tests/functional/cylc-poll/05-poll-multi-messages/reference.log index f1af07f04e4..d6ce897fdf1 100644 --- a/tests/functional/cylc-poll/05-poll-multi-messages/reference.log +++ b/tests/functional/cylc-poll/05-poll-multi-messages/reference.log @@ -1,6 +1,6 @@ -2015-08-24T16:19:01Z INFO - Initial point: 1 -2015-08-24T16:19:01Z INFO - Final point: 1 -2015-08-24T16:19:01Z DEBUG - speaker1.1 -triggered off [] -2015-08-24T16:19:01Z DEBUG - speaker2.1 -triggered off [] -2015-08-24T16:19:04Z DEBUG - poller.1 -triggered off ['speaker1.1', 'speaker2.1'] -2015-08-24T16:19:07Z DEBUG - finisher.1 -triggered off ['speaker1.1', 'speaker1.1', 'speaker2.1'] +Initial point: 1 +Final point: 1 +1/speaker1 -triggered off [] +1/speaker2 -triggered off [] +1/poller -triggered off ['1/speaker1', '1/speaker2'] +1/finisher -triggered off ['1/speaker1', '1/speaker1', '1/speaker2'] diff --git a/tests/functional/cylc-poll/06-loadleveler/flow.cylc b/tests/functional/cylc-poll/06-loadleveler/flow.cylc index a6db546071d..18623d22e0f 100644 --- a/tests/functional/cylc-poll/06-loadleveler/flow.cylc +++ b/tests/functional/cylc-poll/06-loadleveler/flow.cylc @@ -15,4 +15,4 @@ resources=ConsumableCpus(1) ConsumableMemory(64mb) wall_clock_limit=180,120 [[b]] - script = cylc poll "$CYLC_WORKFLOW_ID" 'a' + script = cylc poll "$CYLC_WORKFLOW_ID//*/a" diff --git a/tests/functional/cylc-poll/06-loadleveler/reference.log b/tests/functional/cylc-poll/06-loadleveler/reference.log index e22a751c729..5d97dd71863 100644 --- a/tests/functional/cylc-poll/06-loadleveler/reference.log +++ b/tests/functional/cylc-poll/06-loadleveler/reference.log @@ -1,4 +1,4 @@ -2013/12/09 16:14:26 INFO - Initial point: 1 -2013/12/09 16:14:26 INFO - Final point: 1 -2013/12/09 16:14:26 DEBUG - a.1 -triggered off [] -2013/12/09 16:14:29 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/07-pbs/flow.cylc b/tests/functional/cylc-poll/07-pbs/flow.cylc index 439767cb41b..ace8622e877 100644 --- a/tests/functional/cylc-poll/07-pbs/flow.cylc +++ b/tests/functional/cylc-poll/07-pbs/flow.cylc @@ -7,4 +7,4 @@ script = sleep 20 platform = {{ environ['CYLC_TEST_PLATFORM'] }} [[b]] - script = cylc poll "$CYLC_WORKFLOW_ID" 'a' + script = cylc poll "$CYLC_WORKFLOW_ID//*/a" diff --git a/tests/functional/cylc-poll/07-pbs/reference.log b/tests/functional/cylc-poll/07-pbs/reference.log index e22a751c729..5d97dd71863 100644 --- a/tests/functional/cylc-poll/07-pbs/reference.log +++ b/tests/functional/cylc-poll/07-pbs/reference.log @@ -1,4 +1,4 @@ -2013/12/09 16:14:26 INFO - Initial point: 1 -2013/12/09 16:14:26 INFO - Final point: 1 -2013/12/09 16:14:26 DEBUG - a.1 -triggered off [] -2013/12/09 16:14:29 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/08-slurm/flow.cylc b/tests/functional/cylc-poll/08-slurm/flow.cylc index 439767cb41b..ace8622e877 100644 --- a/tests/functional/cylc-poll/08-slurm/flow.cylc +++ b/tests/functional/cylc-poll/08-slurm/flow.cylc @@ -7,4 +7,4 @@ script = sleep 20 platform = {{ environ['CYLC_TEST_PLATFORM'] }} [[b]] - script = cylc poll "$CYLC_WORKFLOW_ID" 'a' + script = cylc poll "$CYLC_WORKFLOW_ID//*/a" diff --git a/tests/functional/cylc-poll/08-slurm/reference.log b/tests/functional/cylc-poll/08-slurm/reference.log index e22a751c729..5d97dd71863 100644 --- a/tests/functional/cylc-poll/08-slurm/reference.log +++ b/tests/functional/cylc-poll/08-slurm/reference.log @@ -1,4 +1,4 @@ -2013/12/09 16:14:26 INFO - Initial point: 1 -2013/12/09 16:14:26 INFO - Final point: 1 -2013/12/09 16:14:26 DEBUG - a.1 -triggered off [] -2013/12/09 16:14:29 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/09-lsf/flow.cylc b/tests/functional/cylc-poll/09-lsf/flow.cylc index 439767cb41b..ace8622e877 100644 --- a/tests/functional/cylc-poll/09-lsf/flow.cylc +++ b/tests/functional/cylc-poll/09-lsf/flow.cylc @@ -7,4 +7,4 @@ script = sleep 20 platform = {{ environ['CYLC_TEST_PLATFORM'] }} [[b]] - script = cylc poll "$CYLC_WORKFLOW_ID" 'a' + script = cylc poll "$CYLC_WORKFLOW_ID//*/a" diff --git a/tests/functional/cylc-poll/09-lsf/reference.log b/tests/functional/cylc-poll/09-lsf/reference.log index e22a751c729..5d97dd71863 100644 --- a/tests/functional/cylc-poll/09-lsf/reference.log +++ b/tests/functional/cylc-poll/09-lsf/reference.log @@ -1,4 +1,4 @@ -2013/12/09 16:14:26 INFO - Initial point: 1 -2013/12/09 16:14:26 INFO - Final point: 1 -2013/12/09 16:14:26 DEBUG - a.1 -triggered off [] -2013/12/09 16:14:29 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/10-basic-compat/flow.cylc b/tests/functional/cylc-poll/10-basic-compat/flow.cylc index 1f43073b03c..ed0ca8c5116 100644 --- a/tests/functional/cylc-poll/10-basic-compat/flow.cylc +++ b/tests/functional/cylc-poll/10-basic-compat/flow.cylc @@ -5,4 +5,7 @@ [[a]] script = sleep 20 [[b]] - script = cylc__job__wait_cylc_message_started; cylc poll "$CYLC_WORKFLOW_ID" 'a' '1' + script = """ + cylc__job__wait_cylc_message_started + cylc poll "$CYLC_WORKFLOW_ID//1/a" + """ diff --git a/tests/functional/cylc-poll/10-basic-compat/reference.log b/tests/functional/cylc-poll/10-basic-compat/reference.log index e22a751c729..5d97dd71863 100644 --- a/tests/functional/cylc-poll/10-basic-compat/reference.log +++ b/tests/functional/cylc-poll/10-basic-compat/reference.log @@ -1,4 +1,4 @@ -2013/12/09 16:14:26 INFO - Initial point: 1 -2013/12/09 16:14:26 INFO - Final point: 1 -2013/12/09 16:14:26 DEBUG - a.1 -triggered off [] -2013/12/09 16:14:29 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-poll/11-event-time/flow.cylc b/tests/functional/cylc-poll/11-event-time/flow.cylc index 13783197751..1daac98a337 100644 --- a/tests/functional/cylc-poll/11-event-time/flow.cylc +++ b/tests/functional/cylc-poll/11-event-time/flow.cylc @@ -6,14 +6,17 @@ [[w1]] init-script=cylc__job__disable_fail_signals ERR EXIT script=""" -cylc__job__wait_cylc_message_started -# Append to job.status -cat >>"${CYLC_TASK_LOG_ROOT}.status" <<__STATUS__ -CYLC_JOB_EXIT=SUCCEEDED -CYLC_JOB_EXIT_TIME=$(date -u +'%FT%H:%M:%SZ') -__STATUS__ -# Exit without trap -exit 1 -""" + cylc__job__wait_cylc_message_started + # Append to job.status + cat >>"${CYLC_TASK_LOG_ROOT}.status" <<__STATUS__ + CYLC_JOB_EXIT=SUCCEEDED + CYLC_JOB_EXIT_TIME=$(date -u +'%FT%H:%M:%SZ') + __STATUS__ + # Exit without trap + exit 1 + """ [[w2]] - script=cylc__job__wait_cylc_message_started; cylc poll "${CYLC_WORKFLOW_ID}" 'w1.1' + script = """ + cylc__job__wait_cylc_message_started + cylc poll "${CYLC_WORKFLOW_ID}//1/w1" + """ diff --git a/tests/functional/cylc-poll/11-event-time/reference.log b/tests/functional/cylc-poll/11-event-time/reference.log index 45373679aaa..efbcf882dd4 100644 --- a/tests/functional/cylc-poll/11-event-time/reference.log +++ b/tests/functional/cylc-poll/11-event-time/reference.log @@ -1,4 +1,4 @@ -2016-07-04T12:36:16+01 INFO - Initial point: 1 -2016-07-04T12:36:16+01 INFO - Final point: 1 -2016-07-04T12:36:16+01 DEBUG - w1.1 -triggered off [] -2016-07-04T12:36:18+01 DEBUG - w2.1 -triggered off ['w1.1'] +Initial point: 1 +Final point: 1 +1/w1 -triggered off [] +1/w2 -triggered off ['1/w1'] diff --git a/tests/functional/cylc-poll/13-comm-method.t b/tests/functional/cylc-poll/13-comm-method.t index ce97785bc94..b35303bdd62 100755 --- a/tests/functional/cylc-poll/13-comm-method.t +++ b/tests/functional/cylc-poll/13-comm-method.t @@ -39,7 +39,7 @@ PRE_MSG='health:' POST_MSG='.*, polling intervals=10\*PT6S...' for INDEX in 1 2; do for STAGE in 'submission' 'execution'; do - grep_ok "t${INDEX}\.1 .* ${PRE_MSG} ${STAGE}${POST_MSG}" "${LOG_FILE}" -E + grep_ok "1/t${INDEX} .* ${PRE_MSG} ${STAGE}${POST_MSG}" "${LOG_FILE}" -E done done #------------------------------------------------------------------------------- diff --git a/tests/functional/cylc-poll/13-comm-method/reference.log b/tests/functional/cylc-poll/13-comm-method/reference.log index 813f98f9dc4..9b438a8836b 100644 --- a/tests/functional/cylc-poll/13-comm-method/reference.log +++ b/tests/functional/cylc-poll/13-comm-method/reference.log @@ -1,4 +1,4 @@ -2015-01-06T11:46:00Z INFO - Initial point: 1 -2015-01-06T11:46:00Z INFO - Final point: 1 -2015-01-06T11:46:00Z DEBUG - t1.1 -triggered off [] -2015-01-06T11:46:00Z DEBUG - t2.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off [] diff --git a/tests/functional/cylc-poll/14-intervals.t b/tests/functional/cylc-poll/14-intervals.t index b39ddf787ab..0827e458abe 100755 --- a/tests/functional/cylc-poll/14-intervals.t +++ b/tests/functional/cylc-poll/14-intervals.t @@ -41,7 +41,7 @@ for INDEX in 1 2; do POLL_INT='2\*PT1S,10\*PT6S,' fi POST_MSG=".*, polling intervals=${POLL_INT}..." - grep_ok "t${INDEX}\.1 .* ${PRE_MSG} ${STAGE}${POST_MSG}" "${LOG_FILE}" -E + grep_ok "1/t${INDEX} .* ${PRE_MSG} ${STAGE}${POST_MSG}" "${LOG_FILE}" -E done done #------------------------------------------------------------------------------- diff --git a/tests/functional/cylc-poll/14-intervals/reference.log b/tests/functional/cylc-poll/14-intervals/reference.log index 813f98f9dc4..9b438a8836b 100644 --- a/tests/functional/cylc-poll/14-intervals/reference.log +++ b/tests/functional/cylc-poll/14-intervals/reference.log @@ -1,4 +1,4 @@ -2015-01-06T11:46:00Z INFO - Initial point: 1 -2015-01-06T11:46:00Z INFO - Final point: 1 -2015-01-06T11:46:00Z DEBUG - t1.1 -triggered off [] -2015-01-06T11:46:00Z DEBUG - t2.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off [] diff --git a/tests/functional/cylc-poll/15-job-st-file-no-batch.t b/tests/functional/cylc-poll/15-job-st-file-no-batch.t index 8b5ead23684..5f47a38ab87 100755 --- a/tests/functional/cylc-poll/15-job-st-file-no-batch.t +++ b/tests/functional/cylc-poll/15-job-st-file-no-batch.t @@ -28,7 +28,7 @@ LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" run_ok "${TEST_NAME_BASE}-log-1" \ grep -F '[jobs-poll err] 1/t1/01/job.status: incomplete job runner info' "${LOG}" run_ok "${TEST_NAME_BASE}-log-2" \ - grep -E 't1\.1 running .*\(polled\)failed' "${LOG}" + grep -E '1/t1 running .*\(polled\)failed' "${LOG}" purge exit diff --git a/tests/functional/cylc-poll/15-job-st-file-no-batch/reference.log b/tests/functional/cylc-poll/15-job-st-file-no-batch/reference.log index aabe514a849..7afe901c28f 100644 --- a/tests/functional/cylc-poll/15-job-st-file-no-batch/reference.log +++ b/tests/functional/cylc-poll/15-job-st-file-no-batch/reference.log @@ -1,3 +1,3 @@ -2015-01-06T11:46:00Z INFO - Initial point: 1 -2015-01-06T11:46:00Z INFO - Final point: 1 -2015-01-06T11:46:00Z DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/cylc-poll/17-pbs-cant-connect.t b/tests/functional/cylc-poll/17-pbs-cant-connect.t index c4728fb17f8..8eede7059b6 100755 --- a/tests/functional/cylc-poll/17-pbs-cant-connect.t +++ b/tests/functional/cylc-poll/17-pbs-cant-connect.t @@ -42,14 +42,14 @@ workflow_run_ok "${TEST_NAME_BASE}-run" \ sed -n 's/^.*\(\[jobs-poll err\]\) \(Connection refused\).*$/\1\n\2/p; s/^.*\(\[jobs-poll err\]\).*$/\1/p; s/^.*\(Connection refused\).*$/\1/p; - s/^.*\(INFO - \[t1.1\] status=running: (polled)started\).*$/\1/p' \ + s/^.*\(INFO - \[1/t1\] status=running: (polled)started\).*$/\1/p' \ "${WORKFLOW_RUN_DIR}/log/workflow/log" >'sed-log.out' contains_ok 'sed-log.out' <<'__LOG__' [jobs-poll err] Connection refused __LOG__ contains_ok 'sed-log.out' <<'__LOG__' -INFO - [t1.1] status=running: (polled)started +INFO - [1/t1] status=running: (polled)started __LOG__ purge diff --git a/tests/functional/cylc-poll/17-pbs-cant-connect/reference.log b/tests/functional/cylc-poll/17-pbs-cant-connect/reference.log index 11ca3ad4b2b..7afe901c28f 100644 --- a/tests/functional/cylc-poll/17-pbs-cant-connect/reference.log +++ b/tests/functional/cylc-poll/17-pbs-cant-connect/reference.log @@ -1,3 +1,3 @@ -2015-12-17T16:00:01+13 INFO - Initial point: 1 -2015-12-17T16:00:01+13 INFO - Final point: 1 -2015-12-17T16:00:01+13 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/cylc-remove/00-simple/flow.cylc b/tests/functional/cylc-remove/00-simple/flow.cylc index 49ed6e48d81..15c0b09dc64 100644 --- a/tests/functional/cylc-remove/00-simple/flow.cylc +++ b/tests/functional/cylc-remove/00-simple/flow.cylc @@ -3,7 +3,7 @@ [[events]] stall timeout = PT20S abort on stall timeout = True - expected task failures = b.1 + expected task failures = 1/b [scheduling] [[graph]] R1 = """a => b => c @@ -15,10 +15,10 @@ script = false [[cleaner]] script = """ -cylc__job__poll_grep_workflow_log -E 'b\.1 running .* \(received\)failed' -# Remove the unhandled failed task. -cylc remove "$CYLC_WORKFLOW_ID" 'b.1' -# Remove waiting c.1 -# (not auto-removed because parent b.1, an unhandled fail, is not finished.) -cylc remove "$CYLC_WORKFLOW_ID" '1/c:waiting' +cylc__job__poll_grep_workflow_log -E '1/b\ running .* \(received\)failed' +# Remove the unhandled failed task +cylc remove "$CYLC_WORKFLOW_ID//1/b" +# Remove waiting 1/c +# (not auto-removed because parent 1/b, an unhandled fail, is not finished.) +cylc remove "$CYLC_WORKFLOW_ID//1/c:waiting" """ diff --git a/tests/functional/cylc-remove/00-simple/reference.log b/tests/functional/cylc-remove/00-simple/reference.log index 4c5678fad34..fab1b253db2 100644 --- a/tests/functional/cylc-remove/00-simple/reference.log +++ b/tests/functional/cylc-remove/00-simple/reference.log @@ -1,5 +1,5 @@ -2013/10/02 11:54:04 INFO - Initial point: 1 -2013/10/02 11:54:04 INFO - Final point: 1 -2013/10/02 11:54:04 DEBUG - a.1 -triggered off [] -2013/10/02 11:54:11 DEBUG - cleaner.1 -triggered off [] -2013/10/02 11:54:07 DEBUG - b.1 -triggered off ['a.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/cleaner -triggered off [] +1/b -triggered off ['1/a'] diff --git a/tests/functional/cylc-remove/02-cycling/flow.cylc b/tests/functional/cylc-remove/02-cycling/flow.cylc index 8330815fdd4..a2a236eb004 100644 --- a/tests/functional/cylc-remove/02-cycling/flow.cylc +++ b/tests/functional/cylc-remove/02-cycling/flow.cylc @@ -5,37 +5,41 @@ [[events]] stall timeout = PT30S abort on stall timeout = True - expected task failures = bar.2020, baz.2021 + expected task failures = 2020/bar, 2021/baz + [scheduling] initial cycle point = 2020 final cycle point = 2021 [[graph]] R1 = remover P1Y = foo => bar & baz => waz + [runtime] [[remover]] script = """ -cylc__job__poll_grep_workflow_log -E 'bar\.2020 running .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'baz\.2021 running .* \(received\)failed' -# Remove the two unhandled failed tasks. -cylc remove $CYLC_WORKFLOW_ID */ba*:failed -# Remove the two unsatisfied waiting tasks. -cylc remove $CYLC_WORKFLOW_ID */waz -# Exit so workflow can shut down. -""" + cylc__job__poll_grep_workflow_log -E '2020/bar running .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '2021/baz running .* \(received\)failed' + # Remove the two unhandled failed tasks. + cylc remove "$CYLC_WORKFLOW_ID//*/ba*:failed" + # Remove the two unsatisfied waiting tasks. + cylc remove "$CYLC_WORKFLOW_ID//*/waz" + # Exit so workflow can shut down. + """ [[foo, waz]] script = true [[bar]] script = """ -if [[ $CYLC_TASK_CYCLE_POINT == 2020 ]]; then - false -else - true -fi""" + if [[ $CYLC_TASK_CYCLE_POINT == 2020 ]]; then + false + else + true + fi + """ [[baz]] script = """ -if [[ $CYLC_TASK_CYCLE_POINT == 2021 ]]; then - false -else - true -fi""" + if [[ $CYLC_TASK_CYCLE_POINT == 2021 ]]; then + false + else + true + fi + """ diff --git a/tests/functional/cylc-remove/02-cycling/reference.log b/tests/functional/cylc-remove/02-cycling/reference.log index 3f23d5586c1..1a8ff0121a2 100644 --- a/tests/functional/cylc-remove/02-cycling/reference.log +++ b/tests/functional/cylc-remove/02-cycling/reference.log @@ -1,11 +1,11 @@ -2016-07-07T22:17:12Z INFO - Run mode: live -2016-07-07T22:17:12Z INFO - Initial point: 2020 -2016-07-07T22:17:12Z INFO - Final point: 2021 -2016-07-07T22:17:12Z INFO - Cold Start 2020 -2016-07-07T22:17:12Z DEBUG - remover.2020 -triggered off [] -2016-07-07T22:17:12Z DEBUG - foo.2020 -triggered off [] -2016-07-07T22:17:14Z DEBUG - foo.2021 -triggered off [] -2016-07-07T22:17:29Z DEBUG - bar.2020 -triggered off ['foo.2020'] -2016-07-07T22:17:29Z DEBUG - bar.2021 -triggered off ['foo.2021'] -2016-07-07T22:17:29Z DEBUG - baz.2020 -triggered off ['foo.2020'] -2016-07-07T22:17:29Z DEBUG - baz.2021 -triggered off ['foo.2021'] +Run mode: live +Initial point: 2020 +Final point: 2021 +Cold Start 2020 +2020/remover -triggered off [] +2020/foo -triggered off [] +2021/foo -triggered off [] +2020/bar -triggered off ['2020/foo'] +2021/bar -triggered off ['2021/foo'] +2020/baz -triggered off ['2020/foo'] +2021/baz -triggered off ['2021/foo'] diff --git a/tests/functional/cylc-show/01-clock-triggered.t b/tests/functional/cylc-show/01-clock-triggered.t index 3e847fc99dc..ff4cc16a07f 100644 --- a/tests/functional/cylc-show/01-clock-triggered.t +++ b/tests/functional/cylc-show/01-clock-triggered.t @@ -39,15 +39,15 @@ description: (not given) URL: (not given) prerequisites (- => not satisfied): - + woo.20141106T0900Z succeeded + + 20141106T0900Z/woo succeeded outputs (- => not completed): - - foo.20141106T0900Z expired - + foo.20141106T0900Z submitted - - foo.20141106T0900Z submit-failed - + foo.20141106T0900Z started - - foo.20141106T0900Z succeeded - - foo.20141106T0900Z failed + - 20141106T0900Z/foo expired + + 20141106T0900Z/foo submitted + - 20141106T0900Z/foo submit-failed + + 20141106T0900Z/foo started + - 20141106T0900Z/foo succeeded + - 20141106T0900Z/foo failed other (- => not satisfied): + Clock trigger time reached diff --git a/tests/functional/cylc-show/03-clock-triggered-non-utc-mode.t b/tests/functional/cylc-show/03-clock-triggered-non-utc-mode.t index 2d913254cbd..78756c7e117 100644 --- a/tests/functional/cylc-show/03-clock-triggered-non-utc-mode.t +++ b/tests/functional/cylc-show/03-clock-triggered-non-utc-mode.t @@ -53,15 +53,15 @@ description: (not given) URL: (not given) prerequisites (- => not satisfied): - + woo.20140808T0900$TZ_OFFSET_BASIC succeeded + + 20140808T0900$TZ_OFFSET_BASIC/woo succeeded outputs (- => not completed): - - foo.20140808T0900$TZ_OFFSET_BASIC expired - + foo.20140808T0900$TZ_OFFSET_BASIC submitted - - foo.20140808T0900$TZ_OFFSET_BASIC submit-failed - + foo.20140808T0900$TZ_OFFSET_BASIC started - - foo.20140808T0900$TZ_OFFSET_BASIC succeeded - - foo.20140808T0900$TZ_OFFSET_BASIC failed + - 20140808T0900$TZ_OFFSET_BASIC/foo expired + + 20140808T0900$TZ_OFFSET_BASIC/foo submitted + - 20140808T0900$TZ_OFFSET_BASIC/foo submit-failed + + 20140808T0900$TZ_OFFSET_BASIC/foo started + - 20140808T0900$TZ_OFFSET_BASIC/foo succeeded + - 20140808T0900$TZ_OFFSET_BASIC/foo failed other (- => not satisfied): + Clock trigger time reached diff --git a/tests/functional/cylc-show/05-complex.t b/tests/functional/cylc-show/05-complex.t index b449e20b4ff..f4b4354f568 100644 --- a/tests/functional/cylc-show/05-complex.t +++ b/tests/functional/cylc-show/05-complex.t @@ -38,53 +38,53 @@ description: (not given) URL: (not given) prerequisites (- => not satisfied): - + 0 & 1 & (2 | (3 & 4)) & 5 - + 0 = a.20000101T0000Z succeeded - + 1 = b.20000101T0000Z succeeded - + 2 = c.20000101T0000Z succeeded - + 3 = d.20000101T0000Z succeeded - + 4 = e.20000101T0000Z succeeded - + 5 = f.19991231T0000Z succeeded + + 1 & 2 & (3 | (4 & 5)) & 0 + + 0 = 19991231T0000Z/f succeeded + + 1 = 20000101T0000Z/a succeeded + + 2 = 20000101T0000Z/b succeeded + + 3 = 20000101T0000Z/c succeeded + + 4 = 20000101T0000Z/d succeeded + + 5 = 20000101T0000Z/e succeeded outputs (- => not completed): - - f.20000101T0000Z expired - + f.20000101T0000Z submitted - - f.20000101T0000Z submit-failed - + f.20000101T0000Z started - - f.20000101T0000Z succeeded - - f.20000101T0000Z failed -a.20000101T0000Z succeeded -b.20000101T0000Z succeeded -c.20000101T0000Z succeeded -d.20000101T0000Z succeeded -e.20000101T0000Z succeeded -f.19991231T0000Z succeeded + - 20000101T0000Z/f expired + + 20000101T0000Z/f submitted + - 20000101T0000Z/f submit-failed + + 20000101T0000Z/f started + - 20000101T0000Z/f succeeded + - 20000101T0000Z/f failed +19991231T0000Z/f succeeded +20000101T0000Z/a succeeded +20000101T0000Z/b succeeded +20000101T0000Z/c succeeded +20000101T0000Z/d succeeded +20000101T0000Z/e succeeded title: (not given) description: (not given) URL: (not given) prerequisites (- => not satisfied): - + 0 & 1 & (2 | (3 & 4)) & 5 - + 0 = a.20000102T0000Z succeeded - + 1 = b.20000102T0000Z succeeded - + 2 = c.20000102T0000Z succeeded - + 3 = d.20000102T0000Z succeeded - + 4 = e.20000102T0000Z succeeded - + 5 = f.20000101T0000Z succeeded + + 1 & 2 & (3 | (4 & 5)) & 0 + + 0 = 20000101T0000Z/f succeeded + + 1 = 20000102T0000Z/a succeeded + + 2 = 20000102T0000Z/b succeeded + + 3 = 20000102T0000Z/c succeeded + + 4 = 20000102T0000Z/d succeeded + + 5 = 20000102T0000Z/e succeeded outputs (- => not completed): - - f.20000102T0000Z expired - + f.20000102T0000Z submitted - - f.20000102T0000Z submit-failed - + f.20000102T0000Z started - - f.20000102T0000Z succeeded - - f.20000102T0000Z failed -a.20000102T0000Z succeeded -b.20000102T0000Z succeeded -c.20000102T0000Z succeeded -d.20000102T0000Z succeeded -e.20000102T0000Z succeeded -f.20000101T0000Z succeeded + - 20000102T0000Z/f expired + + 20000102T0000Z/f submitted + - 20000102T0000Z/f submit-failed + + 20000102T0000Z/f started + - 20000102T0000Z/f succeeded + - 20000102T0000Z/f failed +20000101T0000Z/f succeeded +20000102T0000Z/a succeeded +20000102T0000Z/b succeeded +20000102T0000Z/c succeeded +20000102T0000Z/d succeeded +20000102T0000Z/e succeeded __OUT__ #------------------------------------------------------------------------------- purge diff --git a/tests/functional/cylc-show/05-complex/flow.cylc b/tests/functional/cylc-show/05-complex/flow.cylc index a911b021760..4e56cf06191 100644 --- a/tests/functional/cylc-show/05-complex/flow.cylc +++ b/tests/functional/cylc-show/05-complex/flow.cylc @@ -1,20 +1,23 @@ #!Jinja2 + [scheduler] UTC mode = True + [scheduling] initial cycle point = 2000 final cycle point = +P1D runahead limit = P2 [[graph]] T00 = a & b & (c | (d & e)) & f[-P1D] => f + [runtime] [[root]] script = true [[a, b, c, d, e]] [[f]] script = """ -# show myself. -sleep 4 -cylc show ${CYLC_WORKFLOW_ID} f.${CYLC_TASK_CYCLE_POINT} >>{{ TEST_OUTPUT_PATH }} -cylc show --list-prereqs ${CYLC_WORKFLOW_ID} f.${CYLC_TASK_CYCLE_POINT} >>{{ TEST_OUTPUT_PATH }} -""" + # show myself. + sleep 4 + cylc show "${CYLC_WORKFLOW_ID}//${CYLC_TASK_CYCLE_POINT}/f" >>{{ TEST_OUTPUT_PATH }} + cylc show --list-prereqs "${CYLC_WORKFLOW_ID}//${CYLC_TASK_CYCLE_POINT}/f" >>{{ TEST_OUTPUT_PATH }} + """ diff --git a/tests/functional/cylc-show/clock-triggered-non-utc-mode/flow.cylc b/tests/functional/cylc-show/clock-triggered-non-utc-mode/flow.cylc index bdbbd1c3380..08454250665 100644 --- a/tests/functional/cylc-show/clock-triggered-non-utc-mode/flow.cylc +++ b/tests/functional/cylc-show/clock-triggered-non-utc-mode/flow.cylc @@ -16,5 +16,5 @@ cycle point time zone = {{ TZ_OFFSET_BASIC }} [[show]] script = """ sleep 4 -cylc show "$CYLC_WORKFLOW_ID" foo.20140808T0900{{ TZ_OFFSET_BASIC }} >{{ TEST_SHOW_OUTPUT_PATH }} +cylc show "$CYLC_WORKFLOW_ID//20140808T0900{{ TZ_OFFSET_BASIC }}/foo" >{{ TEST_SHOW_OUTPUT_PATH }} """ diff --git a/tests/functional/cylc-show/clock-triggered-non-utc-mode/reference-untz.log b/tests/functional/cylc-show/clock-triggered-non-utc-mode/reference-untz.log index 04d3fb6ef1b..071f81d159a 100644 --- a/tests/functional/cylc-show/clock-triggered-non-utc-mode/reference-untz.log +++ b/tests/functional/cylc-show/clock-triggered-non-utc-mode/reference-untz.log @@ -1,7 +1,7 @@ -2014-11-26T18:56:18+07 INFO - Run mode: live -2014-11-26T18:56:18+07 INFO - Initial point: 20140808T0900$TZ_OFFSET_BASIC -2014-11-26T18:56:18+07 INFO - Final point: 20140808T0900$TZ_OFFSET_BASIC -2014-11-26T18:56:18+07 INFO - Cold Start 20140808T0900$TZ_OFFSET_BASIC -2014-11-26T18:56:18+07 DEBUG - woo.20140808T0900$TZ_OFFSET_BASIC -triggered off [] -2014-11-26T18:56:21+07 DEBUG - foo.20140808T0900$TZ_OFFSET_BASIC -triggered off ['woo.20140808T0900$TZ_OFFSET_BASIC'] -2014-11-26T18:56:23+07 DEBUG - show.20140808T0900$TZ_OFFSET_BASIC -triggered off ['woo.20140808T0900$TZ_OFFSET_BASIC'] +Run mode: live +Initial point: 20140808T0900$TZ_OFFSET_BASIC +Final point: 20140808T0900$TZ_OFFSET_BASIC +Cold Start 20140808T0900$TZ_OFFSET_BASIC +20140808T0900$TZ_OFFSET_BASIC/woo -triggered off [] +20140808T0900$TZ_OFFSET_BASIC/foo -triggered off ['20140808T0900$TZ_OFFSET_BASIC/woo'] +20140808T0900$TZ_OFFSET_BASIC/show -triggered off ['20140808T0900$TZ_OFFSET_BASIC/woo'] diff --git a/tests/functional/cylc-show/clock-triggered/flow.cylc b/tests/functional/cylc-show/clock-triggered/flow.cylc index a52fe4df71a..2c048bf3045 100644 --- a/tests/functional/cylc-show/clock-triggered/flow.cylc +++ b/tests/functional/cylc-show/clock-triggered/flow.cylc @@ -1,6 +1,8 @@ #!jinja2 + [scheduler] UTC mode = True + [scheduling] initial cycle point = 20141106T09 final cycle point = 20141106T09 @@ -8,13 +10,16 @@ clock-trigger = foo(PT5M) [[graph]] PT1H = "woo => foo & show" + [runtime] [[woo]] script = true [[foo]] - script = sleep 10 + script = """ + cylc workflow-state "$CYLC_WORKFLOW_ID" -p "$CYLC_TASK_CYCLE_POINT" -t 'show' -S finish --interval 1 + """ [[show]] script = """ -sleep 4 -cylc show "$CYLC_WORKFLOW_ID" foo.20141106T0900Z >{{ TEST_OUTPUT_PATH }} -""" + cylc workflow-state "$CYLC_WORKFLOW_ID" -p "$CYLC_TASK_CYCLE_POINT" -t 'show' -S running --interval 1 + cylc show "$CYLC_WORKFLOW_ID//20141106T0900Z/foo" >{{ TEST_OUTPUT_PATH }} + """ diff --git a/tests/functional/cylc-show/clock-triggered/reference.log b/tests/functional/cylc-show/clock-triggered/reference.log index c36a65f88f6..5fb433475fb 100644 --- a/tests/functional/cylc-show/clock-triggered/reference.log +++ b/tests/functional/cylc-show/clock-triggered/reference.log @@ -1,5 +1,5 @@ -2014-11-17T09:10:23Z INFO - Initial point: 20141106T0900Z -2014-11-17T09:10:23Z INFO - Final point: 20141106T0900Z -2014-11-17T09:10:23Z DEBUG - woo.20141106T0900Z -triggered off [] -2014-11-17T09:10:26Z DEBUG - foo.20141106T0900Z -triggered off ['woo.20141106T0900Z'] -2014-11-17T09:10:26Z DEBUG - show.20141106T0900Z -triggered off ['woo.20141106T0900Z'] +Initial point: 20141106T0900Z +Final point: 20141106T0900Z +20141106T0900Z/woo -triggered off [] +20141106T0900Z/foo -triggered off ['20141106T0900Z/woo'] +20141106T0900Z/show -triggered off ['20141106T0900Z/woo'] diff --git a/tests/functional/cylc-trigger/00-compat/flow.cylc b/tests/functional/cylc-trigger/00-compat/flow.cylc index 030b8d72b71..6beeecbb440 100644 --- a/tests/functional/cylc-trigger/00-compat/flow.cylc +++ b/tests/functional/cylc-trigger/00-compat/flow.cylc @@ -3,6 +3,6 @@ R1 = foo => bar [runtime] [[foo]] - script = cylc trigger "${CYLC_WORKFLOW_ID}" 'bar.1' + script = cylc trigger "${CYLC_WORKFLOW_ID}//1/bar" [[bar]] script = true diff --git a/tests/functional/cylc-trigger/00-compat/reference.log b/tests/functional/cylc-trigger/00-compat/reference.log index cac15d56684..499c919d40d 100644 --- a/tests/functional/cylc-trigger/00-compat/reference.log +++ b/tests/functional/cylc-trigger/00-compat/reference.log @@ -1,4 +1,4 @@ -2014-10-14T16:38:14+01 INFO - Initial point: 1 -2014-10-14T16:38:14+01 INFO - Final point: 1 -2014-10-14T16:38:14+01 DEBUG - foo.1 -triggered off [] -2014-10-14T16:38:17+01 DEBUG - bar.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off [] diff --git a/tests/functional/cylc-trigger/01-queued/flow.cylc b/tests/functional/cylc-trigger/01-queued/flow.cylc index 512d92c72cd..023a87f804f 100644 --- a/tests/functional/cylc-trigger/01-queued/flow.cylc +++ b/tests/functional/cylc-trigger/01-queued/flow.cylc @@ -11,7 +11,7 @@ inherit = METASYNTACTIC script = """ cylc__job__wait_cylc_message_started - cylc trigger $CYLC_WORKFLOW_ID bar 1 + cylc trigger "$CYLC_WORKFLOW_ID//1/bar" """ [[bar]] inherit = METASYNTACTIC diff --git a/tests/functional/cylc-trigger/01-queued/reference.log b/tests/functional/cylc-trigger/01-queued/reference.log index 9095e1795a2..1a9f846c98d 100644 --- a/tests/functional/cylc-trigger/01-queued/reference.log +++ b/tests/functional/cylc-trigger/01-queued/reference.log @@ -1,4 +1,4 @@ -2014-10-14T16:46:26+01 INFO - Initial point: 1 -2014-10-14T16:46:26+01 INFO - Final point: 1 -2014-10-14T16:46:26+01 DEBUG - foo.1 -triggered off [] -2014-10-14T16:46:39+01 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/cylc-trigger/02-filter-failed/flow.cylc b/tests/functional/cylc-trigger/02-filter-failed/flow.cylc index 3778272e219..e5a3065782e 100644 --- a/tests/functional/cylc-trigger/02-filter-failed/flow.cylc +++ b/tests/functional/cylc-trigger/02-filter-failed/flow.cylc @@ -1,13 +1,15 @@ [scheduler] [[events]] - expected task failures = fixable1.1, fixable2.1, fixable3.1 + expected task failures = 1/fixable1, 1/fixable2, 1/fixable3 + [scheduling] [[graph]] -# Unhandled failures stay around for retriggering by "fixer" + # Unhandled failures stay around for retriggering by "fixer" R1 = """ -fixer -FIXABLES:succeed-all => Z -""" + fixer + FIXABLES:succeed-all => Z + """ + [runtime] [[FIXABLES]] script = test "${CYLC_TASK_SUBMIT_NUMBER}" -eq 2 @@ -15,11 +17,11 @@ FIXABLES:succeed-all => Z inherit = FIXABLES [[fixer]] script = """ -cylc__job__wait_cylc_message_started -cylc__job__poll_grep_workflow_log -E 'fixable1\.1 running .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable2\.1 running .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable3\.1 running .* \(received\)failed' -cylc trigger "${CYLC_WORKFLOW_ID}" '1/fixable*' + cylc__job__wait_cylc_message_started + cylc__job__poll_grep_workflow_log -E '1/fixable1 running .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '1/fixable2 running .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '1/fixable3 running .* \(received\)failed' + cylc trigger "${CYLC_WORKFLOW_ID}//1/fixable*" """ [[Z]] script = true diff --git a/tests/functional/cylc-trigger/02-filter-failed/reference.log b/tests/functional/cylc-trigger/02-filter-failed/reference.log index de3e06e7929..93f99cf4ff4 100644 --- a/tests/functional/cylc-trigger/02-filter-failed/reference.log +++ b/tests/functional/cylc-trigger/02-filter-failed/reference.log @@ -1,11 +1,11 @@ -2016-01-14T11:55:10Z INFO - Initial point: 1 -2016-01-14T11:55:10Z INFO - Final point: 1 -2016-01-14T11:55:10Z DEBUG - fixable1.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable2.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable3.1 -triggered off [] -2016-01-14T11:55:13Z DEBUG - fixer.1 -triggered off [] -2016-01-14T11:55:15Z DEBUG - fixable1.1 -triggered off [] -2016-01-14T11:55:15Z DEBUG - fixable2.1 -triggered off [] -2016-01-14T11:55:15Z DEBUG - fixable3.1 -triggered off [] -2016-01-14T11:55:18Z DEBUG - z1.1 -triggered off ['fixable1.1', 'fixable2.1', 'fixable3.1'] -2016-01-14T11:55:18Z DEBUG - z2.1 -triggered off ['fixable1.1', 'fixable2.1', 'fixable3.1'] +Initial point: 1 +Final point: 1 +1/fixable1 -triggered off [] +1/fixable2 -triggered off [] +1/fixable3 -triggered off [] +1/fixer -triggered off [] +1/fixable1 -triggered off [] +1/fixable2 -triggered off [] +1/fixable3 -triggered off [] +1/z1 -triggered off ['1/fixable1', '1/fixable2', '1/fixable3'] +1/z2 -triggered off ['1/fixable1', '1/fixable2', '1/fixable3'] diff --git a/tests/functional/cylc-trigger/04-filter-names.t b/tests/functional/cylc-trigger/04-filter-names.t index 7e03adfaf43..d27263857d5 100755 --- a/tests/functional/cylc-trigger/04-filter-names.t +++ b/tests/functional/cylc-trigger/04-filter-names.t @@ -24,7 +24,7 @@ install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" run_ok "${TEST_NAME_BASE}" cylc play --reference-test --debug --no-detach "${WORKFLOW_NAME}" -# Ensure that loser.1 is only triggered once. +# Ensure that 1/loser is only triggered once. JOB_LOG_DIR="$RUN_DIR/${WORKFLOW_NAME}/log/job" run_ok "${TEST_NAME_BASE}-loser-nn" \ test "$(readlink "${JOB_LOG_DIR}/1/loser/NN")" = '01' diff --git a/tests/functional/cylc-trigger/04-filter-names/flow.cylc b/tests/functional/cylc-trigger/04-filter-names/flow.cylc index 37c366bc3e7..5997dcaa201 100644 --- a/tests/functional/cylc-trigger/04-filter-names/flow.cylc +++ b/tests/functional/cylc-trigger/04-filter-names/flow.cylc @@ -1,13 +1,13 @@ [scheduler] [[events]] - expected task failures = fixable-1a.1, fixable-1b.1, fixable-2a.1, fixable-2b.1, fixable-3.1, loser.1 + expected task failures = 1/fixable-1a, 1/fixable-1b, 1/fixable-2a, 1/fixable-2b, 1/fixable-3, 1/loser [scheduling] [[graph]] R1 = """ -# Unhandled failures stay around for retriggering by "fixer" -fixer -FIXABLES:succeed-all & loser:fail => Z -""" + # Unhandled failures stay around for retriggering by "fixer" + fixer + FIXABLES:succeed-all & loser:fail => Z + """ [runtime] [[FIXABLES]] script = test "${CYLC_TASK_SUBMIT_NUMBER}" -eq 2 @@ -21,14 +21,15 @@ FIXABLES:succeed-all & loser:fail => Z inherit = FIXABLE-3 [[fixer]] script = """ -cylc__job__wait_cylc_message_started -cylc__job__poll_grep_workflow_log -E 'fixable-1a\.1 .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable-1b\.1 .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable-2a\.1 .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable-2b\.1 .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable-3\.1 .* \(received\)failed' -cylc trigger "${CYLC_WORKFLOW_ID}" '1/FIXABLE-1' '1/fixable-2*' '1/fixable-3' -""" + cylc__job__wait_cylc_message_started + cylc__job__poll_grep_workflow_log -E '1/fixable-1a .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '1/fixable-1b .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '1/fixable-2a .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '1/fixable-2b .* \(received\)failed' + cylc__job__poll_grep_workflow_log -E '1/fixable-3 .* \(received\)failed' + cylc trigger "${CYLC_WORKFLOW_ID}//" \ + '//1/FIXABLE-1' '//1/fixable-2*' '//1/fixable-3' + """ [[loser]] script = false [[Z]] diff --git a/tests/functional/cylc-trigger/04-filter-names/reference.log b/tests/functional/cylc-trigger/04-filter-names/reference.log index b1c43bb6d03..4aa02415625 100644 --- a/tests/functional/cylc-trigger/04-filter-names/reference.log +++ b/tests/functional/cylc-trigger/04-filter-names/reference.log @@ -1,16 +1,16 @@ -2016-01-14T11:55:10Z INFO - Initial point: 1 -2016-01-14T11:55:10Z INFO - Final point: 1 -2016-01-14T11:55:10Z DEBUG - fixable-1a.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-1b.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-2a.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-2b.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-3.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - loser.1 -triggered off [] -2016-01-14T11:55:13Z DEBUG - fixer.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-1a.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-1b.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-2a.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-2b.1 -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable-3.1 -triggered off [] -2016-01-14T11:55:13Z DEBUG - z1.1 -triggered off ['fixable-1a.1', 'fixable-1b.1', 'fixable-2a.1', 'fixable-2b.1', 'fixable-3.1', 'loser.1'] -2016-01-14T11:55:18Z DEBUG - z2.1 -triggered off ['fixable-1a.1', 'fixable-1b.1', 'fixable-2a.1', 'fixable-2b.1', 'fixable-3.1', 'loser.1'] +Initial point: 1 +Final point: 1 +1/fixable-1a -triggered off [] +1/fixable-1b -triggered off [] +1/fixable-2a -triggered off [] +1/fixable-2b -triggered off [] +1/fixable-3 -triggered off [] +1/loser -triggered off [] +1/fixer -triggered off [] +1/fixable-1a -triggered off [] +1/fixable-1b -triggered off [] +1/fixable-2a -triggered off [] +1/fixable-2b -triggered off [] +1/fixable-3 -triggered off [] +1/z1 -triggered off ['1/fixable-1a', '1/fixable-1b', '1/fixable-2a', '1/fixable-2b', '1/fixable-3', '1/loser'] +1/z2 -triggered off ['1/fixable-1a', '1/fixable-1b', '1/fixable-2a', '1/fixable-2b', '1/fixable-3', '1/loser'] diff --git a/tests/functional/cylc-trigger/05-filter-cycles.t b/tests/functional/cylc-trigger/05-filter-cycles.t deleted file mode 100755 index 4b4f80c3b9c..00000000000 --- a/tests/functional/cylc-trigger/05-filter-cycles.t +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash -# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. -# Copyright (C) NIWA & British Crown (Met Office) & Contributors. -# -# 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. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -#------------------------------------------------------------------------------- -# Test triggering all tasks in a cycle point. -. "$(dirname "$0")/test_header" - -set_test_number 3 -install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" - -run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" -run_ok "${TEST_NAME_BASE}" cylc play --reference-test --debug --no-detach "${WORKFLOW_NAME}" - -# Ensure that fixable.20100101T0000Z is only triggered once. -JOB_LOG_DIR="$RUN_DIR/${WORKFLOW_NAME}/log/job" -run_ok "${TEST_NAME_BASE}-fixable.20100101T0000Z-nn" \ - test "$(readlink "${JOB_LOG_DIR}/20100101T0000Z/fixable/NN")" = '01' - -purge -exit diff --git a/tests/functional/cylc-trigger/05-filter-cycles/flow.cylc b/tests/functional/cylc-trigger/05-filter-cycles/flow.cylc deleted file mode 100644 index 2953007c234..00000000000 --- a/tests/functional/cylc-trigger/05-filter-cycles/flow.cylc +++ /dev/null @@ -1,27 +0,0 @@ -[scheduler] - UTC mode = True - [[events]] - expected task failures = fixable.19700101T0000Z, fixable.19900101T0000Z, fixable.20100101T0000Z -[scheduling] - initial cycle point = 1970 - final cycle point = 2010 - [[graph]] -# fixable in the first two cycles fail and get retriggered, -# but is left as failed in the last cycle. -# Putting fixer at an offset to avoid retriggering it as well by the '*' glob. - P20Y = fixable? - R1/2009 = fixer - R1/2010 = """ - fixer[-P1Y] & fixable:fail? => z""" -[runtime] - [[fixable]] - script = test "${CYLC_TASK_SUBMIT_NUMBER}" -eq 2 - [[fixer]] - script = """ -cylc__job__wait_cylc_message_started -cylc__job__poll_grep_workflow_log -E 'fixable\.19700101T0000Z .* \(received\)failed' -cylc__job__poll_grep_workflow_log -E 'fixable\.19900101T0000Z .* \(received\)failed' -cylc trigger "${CYLC_WORKFLOW_ID}" '19700101T0000Z/*' '19900101T0000Z/*' -""" - [[z]] - script = true diff --git a/tests/functional/cylc-trigger/05-filter-cycles/reference.log b/tests/functional/cylc-trigger/05-filter-cycles/reference.log deleted file mode 100644 index 3db7854757d..00000000000 --- a/tests/functional/cylc-trigger/05-filter-cycles/reference.log +++ /dev/null @@ -1,9 +0,0 @@ -2016-01-14T11:55:10Z INFO - Initial point: 19700101T0000Z -2016-01-14T11:55:10Z INFO - Final point: 20100101T0000Z -2016-01-14T11:55:10Z DEBUG - fixable.19700101T0000Z -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable.19900101T0000Z -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable.20100101T0000Z -triggered off [] -2016-01-14T11:55:13Z DEBUG - fixer.20090101T0000Z -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable.19700101T0000Z -triggered off [] -2016-01-14T11:55:10Z DEBUG - fixable.19900101T0000Z -triggered off [] -2016-01-14T11:55:13Z DEBUG - z.20100101T0000Z -triggered off ['fixable.20100101T0000Z', 'fixer.20090101T0000Z'] diff --git a/tests/functional/cylc-trigger/06-already-active/flow.cylc b/tests/functional/cylc-trigger/06-already-active/flow.cylc index 6755cb47998..98e3398f1f2 100644 --- a/tests/functional/cylc-trigger/06-already-active/flow.cylc +++ b/tests/functional/cylc-trigger/06-already-active/flow.cylc @@ -9,14 +9,14 @@ [runtime] [[triggerer]] script = """ - cylc__job__poll_grep_workflow_log "triggeree\.1 .* running" -E - cylc trigger $CYLC_WORKFLOW_NAME triggeree.1 + cylc__job__poll_grep_workflow_log "1/triggeree .* running" -E + cylc trigger "$CYLC_WORKFLOW_NAME//1/triggeree" cylc__job__poll_grep_workflow_log \ - "triggeree\.1 .* ignoring trigger - already active" -E + "1/triggeree .* ignoring trigger - already active" -E """ [[triggeree]] script = """ cylc__job__poll_grep_workflow_log \ - "triggeree\.1 .* ignoring trigger - already active" -E + "1/triggeree .* ignoring trigger - already active" -E """ diff --git a/tests/functional/database/03-remote/reference.log b/tests/functional/database/03-remote/reference.log index de9d20955c6..950ef2380b6 100644 --- a/tests/functional/database/03-remote/reference.log +++ b/tests/functional/database/03-remote/reference.log @@ -1,4 +1,4 @@ -2015-06-10T12:02:21Z INFO - Initial point: 20200101T0000Z -2015-06-10T12:02:21Z INFO - Final point: 20200101T0000Z -2015-06-10T12:02:22Z DEBUG - t2.20200101T0000Z -triggered off [] -2015-06-10T12:02:22Z DEBUG - t1.20200101T0000Z -triggered off [] +Initial point: 20200101T0000Z +Final point: 20200101T0000Z +20200101T0000Z/t2 -triggered off [] +20200101T0000Z/t1 -triggered off [] diff --git a/tests/functional/database/04-lock-recover/reference.log b/tests/functional/database/04-lock-recover/reference.log index 90d0dcafebb..41a7b4e1afa 100644 --- a/tests/functional/database/04-lock-recover/reference.log +++ b/tests/functional/database/04-lock-recover/reference.log @@ -1,14 +1,14 @@ -2015-06-10T21:54:26Z INFO - Initial point: 1 -2015-06-10T21:54:26Z INFO - Final point: 1 -2015-06-10T21:54:26Z DEBUG - locker.1 -triggered off [] -2015-06-10T21:54:47Z DEBUG - t6.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t5.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t0.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t1.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t8.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t9.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t4.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t7.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t2.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t3.1 -triggered off ['locker.1'] -2015-06-10T21:54:59Z DEBUG - done.1 -triggered off ['t0.1', 't1.1', 't2.1', 't3.1', 't4.1', 't5.1', 't6.1', 't7.1', 't8.1', 't9.1'] +Initial point: 1 +Final point: 1 +1/locker -triggered off [] +1/t6 -triggered off ['1/locker'] +1/t5 -triggered off ['1/locker'] +1/t0 -triggered off ['1/locker'] +1/t1 -triggered off ['1/locker'] +1/t8 -triggered off ['1/locker'] +1/t9 -triggered off ['1/locker'] +1/t4 -triggered off ['1/locker'] +1/t7 -triggered off ['1/locker'] +1/t2 -triggered off ['1/locker'] +1/t3 -triggered off ['1/locker'] +1/done -triggered off ['1/t0', '1/t1', '1/t2', '1/t3', '1/t4', '1/t5', '1/t6', '1/t7', '1/t8', '1/t9'] diff --git a/tests/functional/database/05-lock-recover-100/reference.log b/tests/functional/database/05-lock-recover-100/reference.log index 9119629630d..e6b7f9bb439 100644 --- a/tests/functional/database/05-lock-recover-100/reference.log +++ b/tests/functional/database/05-lock-recover-100/reference.log @@ -1,13 +1,13 @@ -2015-06-10T21:54:26Z INFO - Initial point: 1 -2015-06-10T21:54:26Z INFO - Final point: 1 -2015-06-10T21:54:26Z DEBUG - locker.1 -triggered off [] -2015-06-10T21:54:47Z DEBUG - t6.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t5.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t0.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t1.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t8.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t9.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t4.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t7.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t2.1 -triggered off ['locker.1'] -2015-06-10T21:54:47Z DEBUG - t3.1 -triggered off ['locker.1'] +Initial point: 1 +Final point: 1 +1/locker -triggered off [] +1/t6 -triggered off ['1/locker'] +1/t5 -triggered off ['1/locker'] +1/t0 -triggered off ['1/locker'] +1/t1 -triggered off ['1/locker'] +1/t8 -triggered off ['1/locker'] +1/t9 -triggered off ['1/locker'] +1/t4 -triggered off ['1/locker'] +1/t7 -triggered off ['1/locker'] +1/t2 -triggered off ['1/locker'] +1/t3 -triggered off ['1/locker'] diff --git a/tests/functional/database/06-task-message/flow.cylc b/tests/functional/database/06-task-message/flow.cylc index 76abffe1ad0..abaeb94c079 100644 --- a/tests/functional/database/06-task-message/flow.cylc +++ b/tests/functional/database/06-task-message/flow.cylc @@ -6,11 +6,11 @@ [runtime] [[t1]] script = """ -sleep 1 -cylc message -p 'WARNING' 'You have been warned' -sleep 1 -cylc message -p 'CRITICAL' 'You are being critical' -sleep 1 -cylc message 'You are normal' -sleep 1 -""" + sleep 1 + cylc message -p 'WARNING' 'You have been warned' + sleep 1 + cylc message -p 'CRITICAL' 'You are being critical' + sleep 1 + cylc message 'You are normal' + sleep 1 + """ diff --git a/tests/functional/database/06-task-message/reference.log b/tests/functional/database/06-task-message/reference.log index 152e277f9ff..7afe901c28f 100644 --- a/tests/functional/database/06-task-message/reference.log +++ b/tests/functional/database/06-task-message/reference.log @@ -1,3 +1,3 @@ -2015-06-10T21:54:26Z INFO - Initial point: 1 -2015-06-10T21:54:26Z INFO - Final point: 1 -2015-06-10T21:54:26Z DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/directives/01-at/flow.cylc b/tests/functional/directives/01-at/flow.cylc index 8ae8c68f073..ce901aa573c 100644 --- a/tests/functional/directives/01-at/flow.cylc +++ b/tests/functional/directives/01-at/flow.cylc @@ -2,7 +2,7 @@ [scheduler] [[events]] - expected task failures = rem2.1 + expected task failures = 1/rem2 [scheduling] [[graph]] @@ -21,4 +21,4 @@ inherit = ATSETTINGS script = "sleep 30" [[killer]] - script = cylc kill "$CYLC_WORKFLOW_ID" 'rem2'; sleep 10 + script = cylc kill "$CYLC_WORKFLOW_ID//*/rem2"; sleep 10 diff --git a/tests/functional/directives/01-at/reference.log b/tests/functional/directives/01-at/reference.log index 51a7734b494..f682241524a 100644 --- a/tests/functional/directives/01-at/reference.log +++ b/tests/functional/directives/01-at/reference.log @@ -1,5 +1,5 @@ -2013/10/15 12:23:16 INFO - Initial point: 1 -2013/10/15 12:23:16 INFO - Final point: 1 -2013/10/15 12:23:16 DEBUG - rem1.1 -triggered off [] -2013/10/15 12:23:31 DEBUG - rem2.1 -triggered off ['rem1.1'] -2013/10/15 12:23:34 DEBUG - killer.1 -triggered off ['rem2.1'] +Initial point: 1 +Final point: 1 +1/rem1 -triggered off [] +1/rem2 -triggered off ['1/rem1'] +1/killer -triggered off ['1/rem2'] diff --git a/tests/functional/directives/loadleveler/flow.cylc b/tests/functional/directives/loadleveler/flow.cylc index ab6b306b4c4..15dc15928ed 100644 --- a/tests/functional/directives/loadleveler/flow.cylc +++ b/tests/functional/directives/loadleveler/flow.cylc @@ -26,4 +26,4 @@ inherit = LLSETTINGS script = "sleep 30" [[killer]] - script = cylc kill "$CYLC_WORKFLOW_ID" 'rem2'; sleep 10 + script = cylc kill "$CYLC_WORKFLOW_ID//*/rem2"; sleep 10 diff --git a/tests/functional/directives/loadleveler/reference.log b/tests/functional/directives/loadleveler/reference.log index c1c53c1a5ac..07187e45321 100644 --- a/tests/functional/directives/loadleveler/reference.log +++ b/tests/functional/directives/loadleveler/reference.log @@ -1,5 +1,5 @@ -2013/09/20 15:17:44 INFO - Initial point: 1 -2013/09/20 15:17:44 INFO - Final point: 1 -2013/09/20 15:17:44 DEBUG - rem1.1 -triggered off [] -2013/09/20 15:18:06 DEBUG - rem2.1 -triggered off ['rem1.1'] -2013/09/20 15:18:14 DEBUG - killer.1 -triggered off ['rem2.1'] +Initial point: 1 +Final point: 1 +1/rem1 -triggered off [ +1/rem2 -triggered off ['1/rem1' +1/killer -triggered 0off ['1/rem2'] diff --git a/tests/functional/directives/pbs/flow.cylc b/tests/functional/directives/pbs/flow.cylc index 1b81bed8e90..4159790355a 100644 --- a/tests/functional/directives/pbs/flow.cylc +++ b/tests/functional/directives/pbs/flow.cylc @@ -24,4 +24,4 @@ inherit = PBS_SETTINGS script = "sleep 30" [[killer]] - script = cylc kill "$CYLC_WORKFLOW_ID" 'rem2'; sleep 10 + script = cylc kill "$CYLC_WORKFLOW_ID//*/rem2"; sleep 10 diff --git a/tests/functional/directives/pbs/reference.log b/tests/functional/directives/pbs/reference.log index c1c53c1a5ac..f682241524a 100644 --- a/tests/functional/directives/pbs/reference.log +++ b/tests/functional/directives/pbs/reference.log @@ -1,5 +1,5 @@ -2013/09/20 15:17:44 INFO - Initial point: 1 -2013/09/20 15:17:44 INFO - Final point: 1 -2013/09/20 15:17:44 DEBUG - rem1.1 -triggered off [] -2013/09/20 15:18:06 DEBUG - rem2.1 -triggered off ['rem1.1'] -2013/09/20 15:18:14 DEBUG - killer.1 -triggered off ['rem2.1'] +Initial point: 1 +Final point: 1 +1/rem1 -triggered off [] +1/rem2 -triggered off ['1/rem1'] +1/killer -triggered off ['1/rem2'] diff --git a/tests/functional/directives/slurm/flow.cylc b/tests/functional/directives/slurm/flow.cylc index aef43e0e5af..0c4b3cb88d5 100644 --- a/tests/functional/directives/slurm/flow.cylc +++ b/tests/functional/directives/slurm/flow.cylc @@ -23,4 +23,4 @@ inherit = SLURM_SETTINGS script = "sleep 30" [[killer]] - script = cylc kill "$CYLC_WORKFLOW_ID" 'rem2'; sleep 10 + script = cylc kill "$CYLC_WORKFLOW_ID//*/rem2"; sleep 10 diff --git a/tests/functional/directives/slurm/reference.log b/tests/functional/directives/slurm/reference.log index c1c53c1a5ac..f682241524a 100644 --- a/tests/functional/directives/slurm/reference.log +++ b/tests/functional/directives/slurm/reference.log @@ -1,5 +1,5 @@ -2013/09/20 15:17:44 INFO - Initial point: 1 -2013/09/20 15:17:44 INFO - Final point: 1 -2013/09/20 15:17:44 DEBUG - rem1.1 -triggered off [] -2013/09/20 15:18:06 DEBUG - rem2.1 -triggered off ['rem1.1'] -2013/09/20 15:18:14 DEBUG - killer.1 -triggered off ['rem2.1'] +Initial point: 1 +Final point: 1 +1/rem1 -triggered off [] +1/rem2 -triggered off ['1/rem1'] +1/killer -triggered off ['1/rem2'] diff --git a/tests/functional/events/09-task-event-mail/reference.log b/tests/functional/events/09-task-event-mail/reference.log index ad325b7e670..b04faad5885 100644 --- a/tests/functional/events/09-task-event-mail/reference.log +++ b/tests/functional/events/09-task-event-mail/reference.log @@ -1,4 +1,4 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t1 -triggered off [] diff --git a/tests/functional/events/10-task-event-job-logs-retrieve/reference.log b/tests/functional/events/10-task-event-job-logs-retrieve/reference.log index c2ce855fc1f..7c166061128 100644 --- a/tests/functional/events/10-task-event-job-logs-retrieve/reference.log +++ b/tests/functional/events/10-task-event-job-logs-retrieve/reference.log @@ -1,5 +1,5 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t1 -triggered off [] +1/t1 -triggered off [] diff --git a/tests/functional/events/11-cycle-task-event-job-logs-retrieve/reference.log b/tests/functional/events/11-cycle-task-event-job-logs-retrieve/reference.log index f24ec3827b7..68a1e1d0b79 100644 --- a/tests/functional/events/11-cycle-task-event-job-logs-retrieve/reference.log +++ b/tests/functional/events/11-cycle-task-event-job-logs-retrieve/reference.log @@ -1,8 +1,8 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 20200202T0202Z -2015-06-19T14:47:30+01 INFO - Final point: 20200202T0202Z -2015-06-19T14:47:30+01 DEBUG - t1.20200202T0202Z -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.20200202T0202Z -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.20200202T0202Z -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t2.20200202T0202Z -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t2.20200202T0202Z -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t2.20200202T0202Z -triggered off [] +Initial point: 20200202T0202Z +Final point: 20200202T0202Z +20200202T0202Z/t1 -triggered off [] +20200202T0202Z/t1 -triggered off [] +20200202T0202Z/t1 -triggered off [] +20200202T0202Z/t2 -triggered off [] +20200202T0202Z/t2 -triggered off [] +20200202T0202Z/t2 -triggered off [] diff --git a/tests/functional/events/18-workflow-event-mail/reference.log b/tests/functional/events/18-workflow-event-mail/reference.log index 153ed868ab4..7afe901c28f 100644 --- a/tests/functional/events/18-workflow-event-mail/reference.log +++ b/tests/functional/events/18-workflow-event-mail/reference.log @@ -1,3 +1,3 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/events/20-workflow-event-handlers/flow.cylc b/tests/functional/events/20-workflow-event-handlers/flow.cylc index ee03142de7f..4661030d895 100644 --- a/tests/functional/events/20-workflow-event-handlers/flow.cylc +++ b/tests/functional/events/20-workflow-event-handlers/flow.cylc @@ -1,6 +1,6 @@ #!jinja2 [meta] - title=Workflow Event Mail + title = Workflow Event Mail URL = http://myworkflows.com/${CYLC_WORKFLOW_ID}.html workflow-priority = HIGH @@ -13,8 +13,8 @@ [scheduling] [[graph]] - R1=t1 + R1 = t1 [runtime] [[t1]] - script=true + script = true diff --git a/tests/functional/events/20-workflow-event-handlers/reference.log b/tests/functional/events/20-workflow-event-handlers/reference.log index 153ed868ab4..7afe901c28f 100644 --- a/tests/functional/events/20-workflow-event-handlers/reference.log +++ b/tests/functional/events/20-workflow-event-handlers/reference.log @@ -1,3 +1,3 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/events/23-workflow-stalled-handler/flow.cylc b/tests/functional/events/23-workflow-stalled-handler/flow.cylc index beafeab78b3..5981611b409 100644 --- a/tests/functional/events/23-workflow-stalled-handler/flow.cylc +++ b/tests/functional/events/23-workflow-stalled-handler/flow.cylc @@ -1,9 +1,9 @@ [scheduler] [[events]] - stall handlers = "cylc set-outputs --flow=1 %(workflow)s bar.1" + stall handlers = "cylc set-outputs --flow=1 %(workflow)s//1/bar" stall timeout = PT0S abort on stall timeout = False - expected task failures = bar.1 + expected task failures = 1/bar [scheduling] [[graph]] R1 = foo => bar => baz @@ -14,4 +14,4 @@ [[bar]] script = false [[baz]] - script = cylc remove $CYLC_WORKFLOW_ID bar.1 + script = cylc remove "$CYLC_WORKFLOW_ID//1/bar" diff --git a/tests/functional/events/23-workflow-stalled-handler/reference.log b/tests/functional/events/23-workflow-stalled-handler/reference.log index 7ce66da63d2..6071bccd364 100644 --- a/tests/functional/events/23-workflow-stalled-handler/reference.log +++ b/tests/functional/events/23-workflow-stalled-handler/reference.log @@ -1,5 +1,5 @@ -2016-05-20T10:22:52Z INFO - Initial point: 1 -2016-05-20T10:22:52Z INFO - Final point: 1 -2016-05-20T10:22:52Z DEBUG - foo.1 -triggered off [] -2016-05-20T10:22:55Z DEBUG - bar.1 -triggered off ['foo.1'] -2016-05-20T10:23:01Z DEBUG - baz.1 -triggered off ['bar.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] +1/baz -triggered off ['1/bar'] diff --git a/tests/functional/events/26-workflow-stalled-dump-prereq.t b/tests/functional/events/26-workflow-stalled-dump-prereq.t index 7bf72a9fb61..3f3af23a865 100755 --- a/tests/functional/events/26-workflow-stalled-dump-prereq.t +++ b/tests/functional/events/26-workflow-stalled-dump-prereq.t @@ -30,13 +30,13 @@ grep_ok '"abort on stall timeout" is set' "${TEST_NAME_BASE}-run.stderr" grep_ok "WARNING - Incomplete tasks:" "${TEST_NAME_BASE}-run.stderr" -grep_ok "bar.20100101T0000Z did not complete required outputs: \['succeeded'\]" \ +grep_ok "20100101T0000Z/bar did not complete required outputs: \['succeeded'\]" \ "${TEST_NAME_BASE}-run.stderr" grep_ok "WARNING - Unsatisfied prerequisites:" \ "${TEST_NAME_BASE}-run.stderr" -grep_ok "foo.20100101T0600Z is waiting on \['bar.20100101T0000Z:succeeded'\]" \ +grep_ok "20100101T0600Z/foo is waiting on \['20100101T0000Z/bar:succeeded'\]" \ "${TEST_NAME_BASE}-run.stderr" purge diff --git a/tests/functional/events/26-workflow-stalled-dump-prereq/flow.cylc b/tests/functional/events/26-workflow-stalled-dump-prereq/flow.cylc index 788713baf3d..3f4b5800fb7 100644 --- a/tests/functional/events/26-workflow-stalled-dump-prereq/flow.cylc +++ b/tests/functional/events/26-workflow-stalled-dump-prereq/flow.cylc @@ -3,7 +3,7 @@ [[events]] abort on stall timeout = True stall timeout = PT0S - expected task failures = bar.20100101T0000Z + expected task failures = 20100101T0000Z/bar [scheduling] initial cycle point = 20100101T0000Z [[graph]] diff --git a/tests/functional/events/26-workflow-stalled-dump-prereq/reference.log b/tests/functional/events/26-workflow-stalled-dump-prereq/reference.log index c0875cca7a5..8ae8c9d07cf 100644 --- a/tests/functional/events/26-workflow-stalled-dump-prereq/reference.log +++ b/tests/functional/events/26-workflow-stalled-dump-prereq/reference.log @@ -1,4 +1,4 @@ -2016-06-15T08:31:23Z INFO - Initial point: 20100101T0000Z -2016-06-15T08:31:23Z INFO - Final point: None -2016-06-15T08:31:23Z DEBUG - foo.20100101T0000Z -triggered off [] -2016-06-15T08:31:27Z DEBUG - bar.20100101T0000Z -triggered off ['foo.20100101T0000Z'] +Initial point: 20100101T0000Z +Final point: None +20100101T0000Z/foo -triggered off [] +20100101T0000Z/bar -triggered off ['20100101T0000Z/foo'] diff --git a/tests/functional/events/27-workflow-stalled-dump-prereq-fam.t b/tests/functional/events/27-workflow-stalled-dump-prereq-fam.t index 1c2f7f81886..300dd6c10d5 100755 --- a/tests/functional/events/27-workflow-stalled-dump-prereq-fam.t +++ b/tests/functional/events/27-workflow-stalled-dump-prereq-fam.t @@ -31,19 +31,19 @@ grep_ok '"abort on stall timeout" is set' "${TEST_NAME_BASE}-run.stderr" grep_ok "WARNING - Incomplete tasks:" "${TEST_NAME_BASE}-run.stderr" -grep_ok "foo.1 did not complete required outputs: \['succeeded'\]" \ +grep_ok "1/foo did not complete required outputs: \['succeeded'\]" \ "${TEST_NAME_BASE}-run.stderr" grep_ok "WARNING - Unsatisfied prerequisites:" \ "${TEST_NAME_BASE}-run.stderr" -grep_ok "f_1.1 is waiting on \['foo.1:succeeded'\]" \ +grep_ok "1/f_1 is waiting on \['1/foo:succeeded'\]" \ "${TEST_NAME_BASE}-run.stderr" -grep_ok "f_2.1 is waiting on \['foo.1:succeeded'\]" \ +grep_ok "1/f_2 is waiting on \['1/foo:succeeded'\]" \ "${TEST_NAME_BASE}-run.stderr" -grep_ok "f_3.1 is waiting on \['foo.1:succeeded'\]" \ +grep_ok "1/f_3 is waiting on \['1/foo:succeeded'\]" \ "${TEST_NAME_BASE}-run.stderr" purge diff --git a/tests/functional/events/27-workflow-stalled-dump-prereq-fam/flow.cylc b/tests/functional/events/27-workflow-stalled-dump-prereq-fam/flow.cylc index 78a8a1f732a..70e68e80fa8 100644 --- a/tests/functional/events/27-workflow-stalled-dump-prereq-fam/flow.cylc +++ b/tests/functional/events/27-workflow-stalled-dump-prereq-fam/flow.cylc @@ -4,7 +4,7 @@ [[events]] abort on stall timeout = true stall timeout = PT0S - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] # will abort on stall with unhandled failed foo diff --git a/tests/functional/events/27-workflow-stalled-dump-prereq-fam/reference.log b/tests/functional/events/27-workflow-stalled-dump-prereq-fam/reference.log index 321aea31ee9..caf4fedabcb 100644 --- a/tests/functional/events/27-workflow-stalled-dump-prereq-fam/reference.log +++ b/tests/functional/events/27-workflow-stalled-dump-prereq-fam/reference.log @@ -1,4 +1,4 @@ -INFO - Initial point: 1 -INFO - Final point: 1 -DEBUG - foo.1 -triggered off [] -DEBUG - goo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/goo -triggered off [] diff --git a/tests/functional/events/29-task-event-mail-1/reference.log b/tests/functional/events/29-task-event-mail-1/reference.log index ad325b7e670..b04faad5885 100644 --- a/tests/functional/events/29-task-event-mail-1/reference.log +++ b/tests/functional/events/29-task-event-mail-1/reference.log @@ -1,4 +1,4 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t1 -triggered off [] diff --git a/tests/functional/events/30-task-event-mail-2/flow.cylc b/tests/functional/events/30-task-event-mail-2/flow.cylc index c8ab5ac13d5..ee8e25d10eb 100644 --- a/tests/functional/events/30-task-event-mail-2/flow.cylc +++ b/tests/functional/events/30-task-event-mail-2/flow.cylc @@ -1,12 +1,12 @@ #!jinja2 [meta] - title=Task Event Mail + title = Task Event Mail [scheduler] [[events]] abort on stall timeout = True stall timeout = PT20S - expected task failures = t1.1, t2.1, t3.1, t4.1, t5.1 + expected task failures = 1/t1, 1/t2, 1/t3, 1/t4, 1/t5 [[mail]] footer = see: http://localhost/stuff/%(owner)s/%(workflow)s/ task event batch interval = PT15S @@ -17,7 +17,7 @@ [runtime] [[t1, t2, t3, t4, t5]] - script=false + script = false [[[job]]] execution retry delays = 2*PT20S [[[events]]] diff --git a/tests/functional/events/30-task-event-mail-2/reference.log b/tests/functional/events/30-task-event-mail-2/reference.log index fb59c4372c3..c2f9f649cf2 100644 --- a/tests/functional/events/30-task-event-mail-2/reference.log +++ b/tests/functional/events/30-task-event-mail-2/reference.log @@ -1,17 +1,17 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t2.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t2.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t2.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t3.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t3.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t3.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t4.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t4.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t4.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t5.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t5.1 -triggered off [] -2015-06-19T14:47:30+01 DEBUG - t5.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t1 -triggered off [] +1/t1 -triggered off [] +1/t2 -triggered off [] +1/t2 -triggered off [] +1/t2 -triggered off [] +1/t3 -triggered off [] +1/t3 -triggered off [] +1/t3 -triggered off [] +1/t4 -triggered off [] +1/t4 -triggered off [] +1/t4 -triggered off [] +1/t5 -triggered off [] +1/t5 -triggered off [] +1/t5 -triggered off [] diff --git a/tests/functional/events/32-task-event-job-logs-retrieve-2/reference.log b/tests/functional/events/32-task-event-job-logs-retrieve-2/reference.log index 153ed868ab4..7afe901c28f 100644 --- a/tests/functional/events/32-task-event-job-logs-retrieve-2/reference.log +++ b/tests/functional/events/32-task-event-job-logs-retrieve-2/reference.log @@ -1,3 +1,3 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/events/33-task-event-job-logs-retrieve-3/flow.cylc b/tests/functional/events/33-task-event-job-logs-retrieve-3/flow.cylc index bed63ae25bf..6853299d9a2 100644 --- a/tests/functional/events/33-task-event-job-logs-retrieve-3/flow.cylc +++ b/tests/functional/events/33-task-event-job-logs-retrieve-3/flow.cylc @@ -6,7 +6,7 @@ [[events]] abort on stall timeout = True stall timeout = PT1M - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] diff --git a/tests/functional/events/33-task-event-job-logs-retrieve-3/reference.log b/tests/functional/events/33-task-event-job-logs-retrieve-3/reference.log index 153ed868ab4..7afe901c28f 100644 --- a/tests/functional/events/33-task-event-job-logs-retrieve-3/reference.log +++ b/tests/functional/events/33-task-event-job-logs-retrieve-3/reference.log @@ -1,3 +1,3 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/events/34-task-abort.t b/tests/functional/events/34-task-abort.t index d9d3db6135c..ce0f154ff70 100755 --- a/tests/functional/events/34-task-abort.t +++ b/tests/functional/events/34-task-abort.t @@ -29,9 +29,9 @@ workflow_run_ok "${TEST_NAME_BASE}-run" \ LOG="${WORKFLOW_RUN_DIR}/log/job/1/foo/NN/job-activity.log" grep "event-handler" "${LOG}" > 'edited-job-activity.log' cmp_ok 'edited-job-activity.log' <<'__LOG__' -[(('event-handler-00', 'failed'), 2) cmd] echo "!!!FAILED!!!" failed foo.1 2 '"ERROR: rust never sleeps"' +[(('event-handler-00', 'failed'), 2) cmd] echo "!!!FAILED!!!" failed 1/foo 2 '"ERROR: rust never sleeps"' [(('event-handler-00', 'failed'), 2) ret_code] 0 -[(('event-handler-00', 'failed'), 2) out] !!!FAILED!!! failed foo.1 2 "ERROR: rust never sleeps" +[(('event-handler-00', 'failed'), 2) out] !!!FAILED!!! failed 1/foo 2 "ERROR: rust never sleeps" __LOG__ #------------------------------------------------------------------------------- # Check job stdout stops at the abort call. diff --git a/tests/functional/events/34-task-abort/flow.cylc b/tests/functional/events/34-task-abort/flow.cylc index 29a74b3d2e6..ee023ff414e 100644 --- a/tests/functional/events/34-task-abort/flow.cylc +++ b/tests/functional/events/34-task-abort/flow.cylc @@ -2,7 +2,7 @@ title = "Test job abort with retries and failed handler" [scheduler] [[events]] - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] R1 = "foo:fail => handled" diff --git a/tests/functional/events/34-task-abort/reference.log b/tests/functional/events/34-task-abort/reference.log index e0cd6251894..14d6615829e 100644 --- a/tests/functional/events/34-task-abort/reference.log +++ b/tests/functional/events/34-task-abort/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -foo.1 -triggered off [] -handled.1 -triggered off ['foo.1'] +1/foo -triggered off [] +1/foo -triggered off [] +1/handled -triggered off ['1/foo'] diff --git a/tests/functional/events/36-task-event-bad-custom-template/reference.log b/tests/functional/events/36-task-event-bad-custom-template/reference.log index 153ed868ab4..7afe901c28f 100644 --- a/tests/functional/events/36-task-event-bad-custom-template/reference.log +++ b/tests/functional/events/36-task-event-bad-custom-template/reference.log @@ -1,3 +1,3 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/events/37-workflow-event-bad-custom-template/reference.log b/tests/functional/events/37-workflow-event-bad-custom-template/reference.log index 153ed868ab4..7afe901c28f 100644 --- a/tests/functional/events/37-workflow-event-bad-custom-template/reference.log +++ b/tests/functional/events/37-workflow-event-bad-custom-template/reference.log @@ -1,3 +1,3 @@ -2015-06-19T14:47:30+01 INFO - Initial point: 1 -2015-06-19T14:47:30+01 INFO - Final point: 1 -2015-06-19T14:47:30+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/events/38-task-event-handler-custom.t b/tests/functional/events/38-task-event-handler-custom.t index e972165f585..fa8ab3e89c7 100755 --- a/tests/functional/events/38-task-event-handler-custom.t +++ b/tests/functional/events/38-task-event-handler-custom.t @@ -26,9 +26,9 @@ workflow_run_ok "${TEST_NAME_BASE}-run" \ FOO_ACTIVITY_LOG="${WORKFLOW_RUN_DIR}/log/job/1/foo/NN/job-activity.log" WORKFLOW_LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" grep_ok \ -"\[(('event-handler-00', 'custom-1'), 1) out\] !!CUSTOM!! foo.1 fugu Data ready for barring" \ +"\[(('event-handler-00', 'custom-1'), 1) out\] !!CUSTOM!! 1/foo fugu Data ready for barring" \ "${FOO_ACTIVITY_LOG}" -grep_ok "foo\.1 .*Data ready for barring" "${WORKFLOW_LOG}" -E -grep_ok "foo\.1 .*Data ready for bazzing" "${WORKFLOW_LOG}" -E -grep_ok "foo\.1 .*Aren't the hydrangeas nice" "${WORKFLOW_LOG}" -E +grep_ok "1/foo .*Data ready for barring" "${WORKFLOW_LOG}" -E +grep_ok "1/foo .*Data ready for bazzing" "${WORKFLOW_LOG}" -E +grep_ok "1/foo .*Aren't the hydrangeas nice" "${WORKFLOW_LOG}" -E purge diff --git a/tests/functional/events/38-task-event-handler-custom/flow.cylc b/tests/functional/events/38-task-event-handler-custom/flow.cylc index cbbb5edc3fe..0ab74791f79 100644 --- a/tests/functional/events/38-task-event-handler-custom/flow.cylc +++ b/tests/functional/events/38-task-event-handler-custom/flow.cylc @@ -10,19 +10,19 @@ [[root]] script = true [[[events]]] - custom handlers = echo !!CUSTOM!! %(name)s.%(point)s %(fish)s %(message)s + custom handlers = echo !!CUSTOM!! %(point)s/%(name)s %(fish)s %(message)s [[[meta]]] fish = trout [[foo]] script = """ -cylc__job__wait_cylc_message_started -# Output message for triggering, and custom event handler. -cylc message -p CUSTOM "Data ready for barring" -# Generic message, not for triggering or custom event handler. -cylc message "Aren't the hydrangeas nice?" -# Output message for triggering, not custom event handler. -cylc message "Data ready for bazzing" -""" + cylc__job__wait_cylc_message_started + # Output message for triggering, and custom event handler. + cylc message -p CUSTOM "Data ready for barring" + # Generic message, not for triggering or custom event handler. + cylc message "Aren't the hydrangeas nice?" + # Output message for triggering, not custom event handler. + cylc message "Data ready for bazzing" + """ [[[outputs]]] a = "Data ready for barring" b = "Data ready for bazzing" diff --git a/tests/functional/events/38-task-event-handler-custom/reference.log b/tests/functional/events/38-task-event-handler-custom/reference.log index 658dd72271b..e8f8bc9ed21 100644 --- a/tests/functional/events/38-task-event-handler-custom/reference.log +++ b/tests/functional/events/38-task-event-handler-custom/reference.log @@ -1,5 +1,5 @@ -2017-08-26T13:08:15+12 INFO - Initial point: 1 -2017-08-26T13:08:15+12 INFO - Final point: 1 -2017-08-26T13:08:15+12 DEBUG - foo.1 -triggered off [] -2017-08-26T13:08:19+12 DEBUG - bar.1 -triggered off ['foo.1'] -2017-08-26T13:08:24+12 DEBUG - baz.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] +1/baz -triggered off ['1/foo'] diff --git a/tests/functional/events/47-long-output.t b/tests/functional/events/47-long-output.t index ece63460087..ea5515c18db 100755 --- a/tests/functional/events/47-long-output.t +++ b/tests/functional/events/47-long-output.t @@ -45,7 +45,7 @@ cd "$WORKFLOW_RUN_DIR" || exit 1 cat >'reference.log' <<'__REFLOG__' Initial point: 1 Final point: 1 -t1.1 -triggered off [] +1/t1 -triggered off [] __REFLOG__ run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" @@ -81,7 +81,7 @@ cd "${WORKFLOW_RUN_DIR}" || exit 1 cat >'reference.log' <<'__REFLOG__' Initial point: 1 Final point: 1 -t1.1 -triggered off [] +1/t1 -triggered off [] __REFLOG__ run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" diff --git a/tests/functional/events/48-workflow-aborted/reference.log b/tests/functional/events/48-workflow-aborted/reference.log index af6bdc4bf8c..8280a95f63a 100644 --- a/tests/functional/events/48-workflow-aborted/reference.log +++ b/tests/functional/events/48-workflow-aborted/reference.log @@ -1,3 +1,3 @@ -2016-05-23T12:58:33Z INFO - Initial point: 1 -2016-05-23T12:58:33Z INFO - Final point: 1 -2016-05-23T12:58:33Z DEBUG - modify.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/modify -triggered off [] diff --git a/tests/functional/events/50-ref-test-fail/reference.log b/tests/functional/events/50-ref-test-fail/reference.log index 5f39c53e492..c5802d782d2 100644 --- a/tests/functional/events/50-ref-test-fail/reference.log +++ b/tests/functional/events/50-ref-test-fail/reference.log @@ -1,4 +1,4 @@ -2016-05-23T12:58:33Z INFO - Initial point: 1 -2016-05-23T12:58:33Z INFO - Final point: 1 -2016-05-23T12:58:33Z DEBUG - t1.1 -triggered off [] -2016-05-23T12:58:33Z DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/events/stall-timeout-ref/flow.cylc b/tests/functional/events/stall-timeout-ref/flow.cylc index d2143f5cfe3..856eaab5b10 100644 --- a/tests/functional/events/stall-timeout-ref/flow.cylc +++ b/tests/functional/events/stall-timeout-ref/flow.cylc @@ -5,7 +5,7 @@ [[events]] abort on stall timeout = True stall timeout = PT1S - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] diff --git a/tests/functional/events/stall-timeout-ref/reference.log b/tests/functional/events/stall-timeout-ref/reference.log index 6a2ea7efa67..08fe5d5558a 100644 --- a/tests/functional/events/stall-timeout-ref/reference.log +++ b/tests/functional/events/stall-timeout-ref/reference.log @@ -1,3 +1,3 @@ -2014-07-01T15:33:14+01 INFO - Initial point: 1 -2014-07-01T15:33:14+01 INFO - Final point: 1 -2014-07-01T15:33:14+01 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/execution-time-limit/02-slurm/reference.log b/tests/functional/execution-time-limit/02-slurm/reference.log index 028fabb14e7..3754564d016 100644 --- a/tests/functional/execution-time-limit/02-slurm/reference.log +++ b/tests/functional/execution-time-limit/02-slurm/reference.log @@ -1,4 +1,4 @@ -2015-12-17T16:00:01+13 INFO - Initial point: 1 -2015-12-17T16:00:01+13 INFO - Final point: 1 -2015-12-17T16:00:01+13 DEBUG - foo.1 -triggered off [] -2015-12-17T16:00:01+13 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/foo -triggered off [] diff --git a/tests/functional/ext-trigger/00-satellite/reference.log b/tests/functional/ext-trigger/00-satellite/reference.log index 0722369f09e..ffe71b3b6f5 100644 --- a/tests/functional/ext-trigger/00-satellite/reference.log +++ b/tests/functional/ext-trigger/00-satellite/reference.log @@ -1,25 +1,25 @@ Initial point: 1 Final point: 5 -prep.1 -triggered off [] -satsim.1 -triggered off ['prep.1'] -get_data.1 -triggered off ['get_data.0', 'prep.1'] -get_data.2 -triggered off ['get_data.1'] -proc1.1 -triggered off ['get_data.1'] -proc2.1 -triggered off ['proc1.1'] -get_data.3 -triggered off ['get_data.2'] -proc1.2 -triggered off ['get_data.2'] -get_data.4 -triggered off ['get_data.3'] -products.1 -triggered off ['proc2.1'] -proc1.3 -triggered off ['get_data.3'] -proc2.2 -triggered off ['proc1.2'] -get_data.5 -triggered off ['get_data.4'] -products.2 -triggered off ['proc2.2'] -proc2.3 -triggered off ['proc1.3'] -proc1.4 -triggered off ['get_data.4'] -proc2.4 -triggered off ['proc1.4'] -products.3 -triggered off ['proc2.3'] -proc1.5 -triggered off ['get_data.5'] -products.4 -triggered off ['proc2.4'] -proc2.5 -triggered off ['proc1.5'] -products.5 -triggered off ['proc2.5'] -collate.5 -triggered off ['products.5'] +1/prep -triggered off [] +1/satsim -triggered off ['1/prep'] +1/get_data -triggered off ['0/get_data', '1/prep'] +2/get_data -triggered off ['1/get_data'] +1/proc1 -triggered off ['1/get_data'] +1/proc2 -triggered off ['1/proc1'] +3/get_data -triggered off ['2/get_data'] +2/proc1 -triggered off ['2/get_data'] +4/get_data -triggered off ['3/get_data'] +1/products -triggered off ['1/proc2'] +3/proc1 -triggered off ['3/get_data'] +2/proc2 -triggered off ['2/proc1'] +5/get_data -triggered off ['4/get_data'] +2/products -triggered off ['2/proc2'] +3/proc2 -triggered off ['3/proc1'] +4/proc1 -triggered off ['4/get_data'] +4/proc2 -triggered off ['4/proc1'] +3/products -triggered off ['3/proc2'] +5/proc1 -triggered off ['5/get_data'] +4/products -triggered off ['4/proc2'] +5/proc2 -triggered off ['5/proc1'] +5/products -triggered off ['5/proc2'] +5/collate -triggered off ['5/products'] diff --git a/tests/functional/ext-trigger/01-no-nudge/flow.cylc b/tests/functional/ext-trigger/01-no-nudge/flow.cylc index 6065ea5e8e0..6183aa36820 100644 --- a/tests/functional/ext-trigger/01-no-nudge/flow.cylc +++ b/tests/functional/ext-trigger/01-no-nudge/flow.cylc @@ -30,9 +30,9 @@ [runtime] [[foo]] script = """ - cylc kill "$CYLC_WORKFLOW_NAME" 'bar.1' - cylc__job__poll_grep_workflow_log -E 'bar\.1 .* \(internal\)failed' - cylc release "$CYLC_WORKFLOW_ID" 'bar.1' + cylc kill "$CYLC_WORKFLOW_NAME//1/bar" + cylc__job__poll_grep_workflow_log -E '1/bar .* \(internal\)failed' + cylc release "$CYLC_WORKFLOW_ID//1/bar" """ [[bar]] script = """ diff --git a/tests/functional/graph-equivalence/03-multiline_and1.t b/tests/functional/graph-equivalence/03-multiline_and1.t index 39f408307f9..7302d5b8690 100644 --- a/tests/functional/graph-equivalence/03-multiline_and1.t +++ b/tests/functional/graph-equivalence/03-multiline_and1.t @@ -36,7 +36,7 @@ delete_db TEST_NAME="${TEST_NAME_BASE}-check-c" cylc play "${WORKFLOW_NAME}" --hold-after=1 1>'out' 2>&1 poll_grep_workflow_log 'Setting hold cycle point' -cylc show "${WORKFLOW_NAME}" 'c.1' | sed -n "/prerequisites/,/outputs/p" > 'c-prereqs' +cylc show "${WORKFLOW_NAME}//1/c" | sed -n "/prerequisites/,/outputs/p" > 'c-prereqs' contains_ok "${TEST_SOURCE_DIR}/multiline_and_refs/c-ref" 'c-prereqs' cylc shutdown "${WORKFLOW_NAME}" --now #------------------------------------------------------------------------------- diff --git a/tests/functional/graph-equivalence/04-multiline_and2.t b/tests/functional/graph-equivalence/04-multiline_and2.t index 615ae61841b..aa64ac714a0 100644 --- a/tests/functional/graph-equivalence/04-multiline_and2.t +++ b/tests/functional/graph-equivalence/04-multiline_and2.t @@ -37,7 +37,7 @@ delete_db TEST_NAME="${TEST_NAME_BASE}-check-c" cylc play "${WORKFLOW_NAME}" --hold-after=1 1>'out' 2>&1 poll_grep_workflow_log 'Setting hold cycle point' -cylc show "${WORKFLOW_NAME}" 'c.1' | sed -n "/prerequisites/,/outputs/p" > 'c-prereqs' +cylc show "${WORKFLOW_NAME}//1/c" | sed -n "/prerequisites/,/outputs/p" > 'c-prereqs' contains_ok "${TEST_SOURCE_DIR}/multiline_and_refs/c-ref-2" 'c-prereqs' cylc shutdown --max-polls=20 --interval=2 --now "${WORKFLOW_NAME}" #------------------------------------------------------------------------------- diff --git a/tests/functional/graph-equivalence/multiline_and1/reference.log b/tests/functional/graph-equivalence/multiline_and1/reference.log index fb612d18b35..15bb79e8cff 100644 --- a/tests/functional/graph-equivalence/multiline_and1/reference.log +++ b/tests/functional/graph-equivalence/multiline_and1/reference.log @@ -1,5 +1,5 @@ -2013/09/30 15:37:47 INFO - Initial point: 1 -2013/09/30 15:37:47 INFO - Final point: 1 -2013/09/30 15:37:47 DEBUG - a.1 -triggered off [] -2013/09/30 15:37:47 DEBUG - b.1 -triggered off [] -2013/09/30 15:37:51 DEBUG - c.1 -triggered off ['a.1', 'b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off [] +1/c -triggered off ['1/a', '1/b'] diff --git a/tests/functional/graph-equivalence/multiline_and2/reference.log b/tests/functional/graph-equivalence/multiline_and2/reference.log index fb612d18b35..15bb79e8cff 100644 --- a/tests/functional/graph-equivalence/multiline_and2/reference.log +++ b/tests/functional/graph-equivalence/multiline_and2/reference.log @@ -1,5 +1,5 @@ -2013/09/30 15:37:47 INFO - Initial point: 1 -2013/09/30 15:37:47 INFO - Final point: 1 -2013/09/30 15:37:47 DEBUG - a.1 -triggered off [] -2013/09/30 15:37:47 DEBUG - b.1 -triggered off [] -2013/09/30 15:37:51 DEBUG - c.1 -triggered off ['a.1', 'b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off [] +1/c -triggered off ['1/a', '1/b'] diff --git a/tests/functional/graph-equivalence/multiline_and_refs/c-ref b/tests/functional/graph-equivalence/multiline_and_refs/c-ref index 35ea7325fc4..bf5a5267fc8 100644 --- a/tests/functional/graph-equivalence/multiline_and_refs/c-ref +++ b/tests/functional/graph-equivalence/multiline_and_refs/c-ref @@ -1,6 +1,6 @@ prerequisites (- => not satisfied): - - a.1 succeeded - - b.1 succeeded + - 1/a succeeded + - 1/b succeeded outputs (- => not completed): (None) diff --git a/tests/functional/graph-equivalence/multiline_and_refs/c-ref-2 b/tests/functional/graph-equivalence/multiline_and_refs/c-ref-2 index 35ea7325fc4..bf5a5267fc8 100644 --- a/tests/functional/graph-equivalence/multiline_and_refs/c-ref-2 +++ b/tests/functional/graph-equivalence/multiline_and_refs/c-ref-2 @@ -1,6 +1,6 @@ prerequisites (- => not satisfied): - - a.1 succeeded - - b.1 succeeded + - 1/a succeeded + - 1/b succeeded outputs (- => not completed): (None) diff --git a/tests/functional/graph-equivalence/splitline_refs/b-ref b/tests/functional/graph-equivalence/splitline_refs/b-ref index 281b20497ce..09d12220661 100644 --- a/tests/functional/graph-equivalence/splitline_refs/b-ref +++ b/tests/functional/graph-equivalence/splitline_refs/b-ref @@ -1,4 +1,4 @@ prerequisites (- => not satisfied): - + a.1 succeeded + + 1/a succeeded outputs (- => not completed): diff --git a/tests/functional/graph-equivalence/splitline_refs/c-ref b/tests/functional/graph-equivalence/splitline_refs/c-ref index e985cbcceb4..d2d1e3e4a15 100644 --- a/tests/functional/graph-equivalence/splitline_refs/c-ref +++ b/tests/functional/graph-equivalence/splitline_refs/c-ref @@ -1,4 +1,4 @@ prerequisites (- => not satisfied): - + b.1 succeeded + + 1/b succeeded outputs (- => not completed): diff --git a/tests/functional/graph-equivalence/test1/flow.cylc b/tests/functional/graph-equivalence/test1/flow.cylc index ca92456503d..df1afae7c22 100644 --- a/tests/functional/graph-equivalence/test1/flow.cylc +++ b/tests/functional/graph-equivalence/test1/flow.cylc @@ -5,16 +5,19 @@ [runtime] [[a]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'a.1' \ - | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/a-prereqs -""" + cylc show "${CYLC_WORKFLOW_ID}//1/a" \ + | sed -n "/prerequisites/,/outputs/p" \ + > {{TEST_OUTPUT_PATH}}/a-prereqs + """ [[b]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'b.1' \ - | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/b-prereqs -""" + cylc show "${CYLC_WORKFLOW_ID}//1/b" \ + | sed -n "/prerequisites/,/outputs/p" \ + > {{TEST_OUTPUT_PATH}}/b-prereqs + """ [[c]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'c.1' \ - | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/c-prereqs -""" + cylc show "${CYLC_WORKFLOW_ID}//1/c" \ + | sed -n "/prerequisites/,/outputs/p" \ + > {{TEST_OUTPUT_PATH}}/c-prereqs + """ diff --git a/tests/functional/graph-equivalence/test1/reference.log b/tests/functional/graph-equivalence/test1/reference.log index b41e55e07de..941f8bc8dcd 100644 --- a/tests/functional/graph-equivalence/test1/reference.log +++ b/tests/functional/graph-equivalence/test1/reference.log @@ -1,5 +1,4 @@ -2013/09/30 15:24:42 INFO - Initial point: 1 -2013/09/30 15:24:42 INFO - Final point: 1 -2013/09/30 15:24:42 DEBUG - a.1 -triggered off [] -2013/09/30 15:24:45 DEBUG - b.1 -triggered off ['a.1'] -2013/09/30 15:24:47 DEBUG - c.1 -triggered off ['b.1'] +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] diff --git a/tests/functional/graph-equivalence/test2/flow.cylc b/tests/functional/graph-equivalence/test2/flow.cylc index 7fe91822fe2..628747a9a80 100644 --- a/tests/functional/graph-equivalence/test2/flow.cylc +++ b/tests/functional/graph-equivalence/test2/flow.cylc @@ -6,17 +6,17 @@ [runtime] [[a]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'a.1' \ +cylc show "${CYLC_WORKFLOW_ID}//1/a" \ | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/a-prereqs """ [[b]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'b.1' \ +cylc show "${CYLC_WORKFLOW_ID}//1/b" \ | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/b-prereqs """ [[c]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'c.1' \ +cylc show "${CYLC_WORKFLOW_ID}//1/c" \ | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/c-prereqs """ diff --git a/tests/functional/graph-equivalence/test2/reference.log b/tests/functional/graph-equivalence/test2/reference.log index 1e8dd40d1cd..ade8b593f7f 100644 --- a/tests/functional/graph-equivalence/test2/reference.log +++ b/tests/functional/graph-equivalence/test2/reference.log @@ -1,5 +1,5 @@ -2013/09/30 15:23:52 INFO - Initial point: 1 -2013/09/30 15:23:52 INFO - Final point: 1 -2013/09/30 15:23:52 DEBUG - a.1 -triggered off [] -2013/09/30 15:23:56 DEBUG - b.1 -triggered off ['a.1'] -2013/09/30 15:23:59 DEBUG - c.1 -triggered off ['b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] diff --git a/tests/functional/graph-equivalence/test3/flow.cylc b/tests/functional/graph-equivalence/test3/flow.cylc index a4e122142dc..4ea084cf4a4 100644 --- a/tests/functional/graph-equivalence/test3/flow.cylc +++ b/tests/functional/graph-equivalence/test3/flow.cylc @@ -6,16 +6,16 @@ [runtime] [[a]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'a.1' \ +cylc show "${CYLC_WORKFLOW_ID}//1/a" \ | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/a-prereqs """ [[b]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'b.1' \ +cylc show "${CYLC_WORKFLOW_ID}//1/b" \ | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/b-prereqs """ [[c]] script = """ -cylc show "${CYLC_WORKFLOW_ID}" 'c.1' \ +cylc show "${CYLC_WORKFLOW_ID}//1/c" \ | sed -n "/prerequisites/,/outputs/p" > {{TEST_OUTPUT_PATH}}/c-prereqs """ diff --git a/tests/functional/graph-equivalence/test3/reference.log b/tests/functional/graph-equivalence/test3/reference.log index 162eb234576..ade8b593f7f 100644 --- a/tests/functional/graph-equivalence/test3/reference.log +++ b/tests/functional/graph-equivalence/test3/reference.log @@ -1,5 +1,5 @@ -2013/09/30 15:24:19 INFO - Initial point: 1 -2013/09/30 15:24:19 INFO - Final point: 1 -2013/09/30 15:24:19 DEBUG - a.1 -triggered off [] -2013/09/30 15:24:22 DEBUG - b.1 -triggered off ['a.1'] -2013/09/30 15:24:25 DEBUG - c.1 -triggered off ['b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] diff --git a/tests/functional/graphing/00-boundaries/20140808T00.graph.plain.ref b/tests/functional/graphing/00-boundaries/20140808T00.graph.plain.ref index 31d7eb9c078..3e5c3e0a545 100644 --- a/tests/functional/graphing/00-boundaries/20140808T00.graph.plain.ref +++ b/tests/functional/graphing/00-boundaries/20140808T00.graph.plain.ref @@ -1,7 +1,7 @@ -edge "foo.20140808T0000+12" "bar.20140808T0000+12" +edge "20140808T0000+12/foo" "20140808T0000+12/bar" graph -node "bar.20140808T0000+12" "bar\n20140808T0000+12" -node "foo.20140808T0000+12" "foo\n20140808T0000+12" -node "foo.20140808T0600+12" "foo\n20140808T0600+12" -node "foo.20140808T1200+12" "foo\n20140808T1200+12" +node "20140808T0000+12/bar" "bar\n20140808T0000+12" +node "20140808T0000+12/foo" "foo\n20140808T0000+12" +node "20140808T0600+12/foo" "foo\n20140808T0600+12" +node "20140808T1200+12/foo" "foo\n20140808T1200+12" stop diff --git a/tests/functional/graphing/00-boundaries/20140808T06.graph.plain.ref b/tests/functional/graphing/00-boundaries/20140808T06.graph.plain.ref index 348595fbae3..dc973e91c97 100644 --- a/tests/functional/graphing/00-boundaries/20140808T06.graph.plain.ref +++ b/tests/functional/graphing/00-boundaries/20140808T06.graph.plain.ref @@ -1,5 +1,5 @@ graph -node "foo.20140808T0600+12" "foo\n20140808T0600+12" -node "foo.20140808T1200+12" "foo\n20140808T1200+12" -node "foo.20140808T1800+12" "foo\n20140808T1800+12" +node "20140808T0600+12/foo" "foo\n20140808T0600+12" +node "20140808T1200+12/foo" "foo\n20140808T1200+12" +node "20140808T1800+12/foo" "foo\n20140808T1800+12" stop diff --git a/tests/functional/graphing/02-icp-task-missing/graph.plain.ref b/tests/functional/graphing/02-icp-task-missing/graph.plain.ref index 99ac3d4a380..e1931e80480 100644 --- a/tests/functional/graphing/02-icp-task-missing/graph.plain.ref +++ b/tests/functional/graphing/02-icp-task-missing/graph.plain.ref @@ -1,9 +1,9 @@ -edge "NZC1.20150304T2100Z" "pc.20150305T0000Z" -edge "NZC1.20150305T2100Z" "pc.20150306T0000Z" +edge "20150304T2100Z/NZC1" "20150305T0000Z/pc" +edge "20150305T2100Z/NZC1" "20150306T0000Z/pc" graph -node "NZC1.20150304T2100Z" "NZC1\n20150304T2100Z" -node "NZC1.20150305T2100Z" "NZC1\n20150305T2100Z" -node "pc.20150304T0000Z" "pc\n20150304T0000Z" -node "pc.20150305T0000Z" "pc\n20150305T0000Z" -node "pc.20150306T0000Z" "pc\n20150306T0000Z" +node "20150304T0000Z/pc" "pc\n20150304T0000Z" +node "20150304T2100Z/NZC1" "NZC1\n20150304T2100Z" +node "20150305T0000Z/pc" "pc\n20150305T0000Z" +node "20150305T2100Z/NZC1" "NZC1\n20150305T2100Z" +node "20150306T0000Z/pc" "pc\n20150306T0000Z" stop diff --git a/tests/functional/graphing/05-suicide-family/graph.plain.ref b/tests/functional/graphing/05-suicide-family/graph.plain.ref index 635f35fa9fa..45be8d2f902 100644 --- a/tests/functional/graphing/05-suicide-family/graph.plain.ref +++ b/tests/functional/graphing/05-suicide-family/graph.plain.ref @@ -1,3 +1,3 @@ graph -node "foo.1" "foo\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/graphing/05-suicide-family/graph.plain.suicide.ref b/tests/functional/graphing/05-suicide-family/graph.plain.suicide.ref index fc4765485d1..8b22139076f 100644 --- a/tests/functional/graphing/05-suicide-family/graph.plain.suicide.ref +++ b/tests/functional/graphing/05-suicide-family/graph.plain.suicide.ref @@ -1,5 +1,5 @@ -edge "foo.1" "BAR.1" +edge "1/foo" "1/BAR" graph -node "BAR.1" "BAR\n1" -node "foo.1" "foo\n1" +node "1/BAR" "BAR\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/graphing/06-family-or.t b/tests/functional/graphing/06-family-or.t index af4c5d02bf4..e1eefd1be27 100755 --- a/tests/functional/graphing/06-family-or.t +++ b/tests/functional/graphing/06-family-or.t @@ -45,20 +45,20 @@ run_ok "${TEST_NAME_BASE}-validate" cylc validate "${PWD}/flow.cylc" graph_workflow "${PWD}/flow.cylc" "graph.plain" \ -g A -g B -g X 20000101T0000Z 20000103T0000Z cmp_ok 'graph.plain' - <<'__GRAPH__' -edge "A.20000101T0000Z" "c.20000102T0000Z" -edge "A.20000102T0000Z" "c.20000103T0000Z" -edge "B.20000101T0000Z" "c.20000102T0000Z" -edge "B.20000102T0000Z" "c.20000103T0000Z" +edge "20000101T0000Z/A" "20000102T0000Z/c" +edge "20000101T0000Z/B" "20000102T0000Z/c" +edge "20000102T0000Z/A" "20000103T0000Z/c" +edge "20000102T0000Z/B" "20000103T0000Z/c" graph -node "A.20000101T0000Z" "A\n20000101T0000Z" -node "A.20000102T0000Z" "A\n20000102T0000Z" -node "A.20000103T0000Z" "A\n20000103T0000Z" -node "B.20000101T0000Z" "B\n20000101T0000Z" -node "B.20000102T0000Z" "B\n20000102T0000Z" -node "B.20000103T0000Z" "B\n20000103T0000Z" -node "c.20000101T0000Z" "c\n20000101T0000Z" -node "c.20000102T0000Z" "c\n20000102T0000Z" -node "c.20000103T0000Z" "c\n20000103T0000Z" +node "20000101T0000Z/A" "A\n20000101T0000Z" +node "20000101T0000Z/B" "B\n20000101T0000Z" +node "20000101T0000Z/c" "c\n20000101T0000Z" +node "20000102T0000Z/A" "A\n20000102T0000Z" +node "20000102T0000Z/B" "B\n20000102T0000Z" +node "20000102T0000Z/c" "c\n20000102T0000Z" +node "20000103T0000Z/A" "A\n20000103T0000Z" +node "20000103T0000Z/B" "B\n20000103T0000Z" +node "20000103T0000Z/c" "c\n20000103T0000Z" stop __GRAPH__ diff --git a/tests/functional/graphing/07-stop-at-final-point/graph.plain.ref b/tests/functional/graphing/07-stop-at-final-point/graph.plain.ref index 13c106be504..806e5a2e121 100644 --- a/tests/functional/graphing/07-stop-at-final-point/graph.plain.ref +++ b/tests/functional/graphing/07-stop-at-final-point/graph.plain.ref @@ -1,23 +1,23 @@ -edge "baz.2015-01-03" "stop.2015-01-03" -edge "foo.2015-01-01" "bar.2015-01-01" -edge "foo.2015-01-01" "baz.2015-01-01" -edge "foo.2015-01-01" "foo.2015-01-02" -edge "foo.2015-01-02" "bar.2015-01-02" -edge "foo.2015-01-02" "baz.2015-01-02" -edge "foo.2015-01-02" "foo.2015-01-03" -edge "foo.2015-01-03" "bar.2015-01-03" -edge "foo.2015-01-03" "baz.2015-01-03" -edge "start.2015-01-01" "foo.2015-01-01" +edge "2015-01-01/foo" "2015-01-01/bar" +edge "2015-01-01/foo" "2015-01-01/baz" +edge "2015-01-01/foo" "2015-01-02/foo" +edge "2015-01-01/start" "2015-01-01/foo" +edge "2015-01-02/foo" "2015-01-02/bar" +edge "2015-01-02/foo" "2015-01-02/baz" +edge "2015-01-02/foo" "2015-01-03/foo" +edge "2015-01-03/baz" "2015-01-03/stop" +edge "2015-01-03/foo" "2015-01-03/bar" +edge "2015-01-03/foo" "2015-01-03/baz" graph -node "bar.2015-01-01" "bar\n2015-01-01" -node "bar.2015-01-02" "bar\n2015-01-02" -node "bar.2015-01-03" "bar\n2015-01-03" -node "baz.2015-01-01" "baz\n2015-01-01" -node "baz.2015-01-02" "baz\n2015-01-02" -node "baz.2015-01-03" "baz\n2015-01-03" -node "foo.2015-01-01" "foo\n2015-01-01" -node "foo.2015-01-02" "foo\n2015-01-02" -node "foo.2015-01-03" "foo\n2015-01-03" -node "start.2015-01-01" "start\n2015-01-01" -node "stop.2015-01-03" "stop\n2015-01-03" +node "2015-01-01/bar" "bar\n2015-01-01" +node "2015-01-01/baz" "baz\n2015-01-01" +node "2015-01-01/foo" "foo\n2015-01-01" +node "2015-01-01/start" "start\n2015-01-01" +node "2015-01-02/bar" "bar\n2015-01-02" +node "2015-01-02/baz" "baz\n2015-01-02" +node "2015-01-02/foo" "foo\n2015-01-02" +node "2015-01-03/bar" "bar\n2015-01-03" +node "2015-01-03/baz" "baz\n2015-01-03" +node "2015-01-03/foo" "foo\n2015-01-03" +node "2015-01-03/stop" "stop\n2015-01-03" stop diff --git a/tests/functional/graphing/08-ungrouped/graph.plain.ref b/tests/functional/graphing/08-ungrouped/graph.plain.ref index fc4765485d1..8b22139076f 100644 --- a/tests/functional/graphing/08-ungrouped/graph.plain.ref +++ b/tests/functional/graphing/08-ungrouped/graph.plain.ref @@ -1,5 +1,5 @@ -edge "foo.1" "BAR.1" +edge "1/foo" "1/BAR" graph -node "BAR.1" "BAR\n1" -node "foo.1" "foo\n1" +node "1/BAR" "BAR\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/graphing/08-ungrouped/graph.plain.ungrouped.ref b/tests/functional/graphing/08-ungrouped/graph.plain.ungrouped.ref index 21aaf1c1613..300ce5eb38d 100644 --- a/tests/functional/graphing/08-ungrouped/graph.plain.ungrouped.ref +++ b/tests/functional/graphing/08-ungrouped/graph.plain.ungrouped.ref @@ -1,9 +1,9 @@ -edge "foo.1" "bar1.1" -edge "foo.1" "bar2.1" -edge "foo.1" "bar3.1" +edge "1/foo" "1/bar1" +edge "1/foo" "1/bar2" +edge "1/foo" "1/bar3" graph -node "bar1.1" "bar1\n1" -node "bar2.1" "bar2\n1" -node "bar3.1" "bar3\n1" -node "foo.1" "foo\n1" +node "1/bar1" "bar1\n1" +node "1/bar2" "bar2\n1" +node "1/bar3" "bar3\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/graphing/09-close-fam/graph.plain.ref b/tests/functional/graphing/09-close-fam/graph.plain.ref index 576dc29dfb7..e3e334b41f4 100644 --- a/tests/functional/graphing/09-close-fam/graph.plain.ref +++ b/tests/functional/graphing/09-close-fam/graph.plain.ref @@ -1,7 +1,7 @@ -edge "FAM.1" "bar.1" -edge "foo.1" "FAM.1" +edge "1/FAM" "1/bar" +edge "1/foo" "1/FAM" graph -node "FAM.1" "FAM\n1" -node "bar.1" "bar\n1" -node "foo.1" "foo\n1" +node "1/FAM" "FAM\n1" +node "1/bar" "bar\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/graphing/09-close-fam/graph.plain.ungrouped.ref b/tests/functional/graphing/09-close-fam/graph.plain.ungrouped.ref index 49dd9ba5fc9..89d139411d1 100644 --- a/tests/functional/graphing/09-close-fam/graph.plain.ungrouped.ref +++ b/tests/functional/graphing/09-close-fam/graph.plain.ungrouped.ref @@ -1,13 +1,13 @@ -edge "foo.1" "wam.1" -edge "foo.1" "x.1" -edge "foo.1" "y.1" -edge "wam.1" "bar.1" -edge "x.1" "bar.1" -edge "y.1" "bar.1" +edge "1/foo" "1/wam" +edge "1/foo" "1/x" +edge "1/foo" "1/y" +edge "1/wam" "1/bar" +edge "1/x" "1/bar" +edge "1/y" "1/bar" graph -node "bar.1" "bar\n1" -node "foo.1" "foo\n1" -node "wam.1" "wam\n1" -node "x.1" "x\n1" -node "y.1" "y\n1" +node "1/bar" "bar\n1" +node "1/foo" "foo\n1" +node "1/wam" "wam\n1" +node "1/x" "x\n1" +node "1/y" "y\n1" stop diff --git a/tests/functional/graphing/09-ref-graph/graph.ref b/tests/functional/graphing/09-ref-graph/graph.ref index 31d7eb9c078..3e5c3e0a545 100644 --- a/tests/functional/graphing/09-ref-graph/graph.ref +++ b/tests/functional/graphing/09-ref-graph/graph.ref @@ -1,7 +1,7 @@ -edge "foo.20140808T0000+12" "bar.20140808T0000+12" +edge "20140808T0000+12/foo" "20140808T0000+12/bar" graph -node "bar.20140808T0000+12" "bar\n20140808T0000+12" -node "foo.20140808T0000+12" "foo\n20140808T0000+12" -node "foo.20140808T0600+12" "foo\n20140808T0600+12" -node "foo.20140808T1200+12" "foo\n20140808T1200+12" +node "20140808T0000+12/bar" "bar\n20140808T0000+12" +node "20140808T0000+12/foo" "foo\n20140808T0000+12" +node "20140808T0600+12/foo" "foo\n20140808T0600+12" +node "20140808T1200+12/foo" "foo\n20140808T1200+12" stop diff --git a/tests/functional/graphing/10-ghost-nodes/graph.plain.ref b/tests/functional/graphing/10-ghost-nodes/graph.plain.ref index 9090cb6fb62..86e45db4ff8 100644 --- a/tests/functional/graphing/10-ghost-nodes/graph.plain.ref +++ b/tests/functional/graphing/10-ghost-nodes/graph.plain.ref @@ -1,10 +1,10 @@ -edge "foo.1" "foo.2" -edge "foo.3" "foo.4" -edge "foo.4" "foo.5" +edge "1/foo" "2/foo" +edge "3/foo" "4/foo" +edge "4/foo" "5/foo" graph -node "foo.1" "foo\n1" -node "foo.2" "foo\n2" -node "foo.3" "foo\n3" -node "foo.4" "foo\n4" -node "foo.5" "foo\n5" +node "1/foo" "foo\n1" +node "2/foo" "foo\n2" +node "3/foo" "foo\n3" +node "4/foo" "foo\n4" +node "5/foo" "foo\n5" stop diff --git a/tests/functional/graphing/11-nested-fam/graph.plain.ref b/tests/functional/graphing/11-nested-fam/graph.plain.ref index e1ad10430d7..c70d1640453 100644 --- a/tests/functional/graphing/11-nested-fam/graph.plain.ref +++ b/tests/functional/graphing/11-nested-fam/graph.plain.ref @@ -1,4 +1,4 @@ -edge "TOP.1" "TOP.1" +edge "1/TOP" "1/TOP" graph -node "TOP.1" "TOP\n1" +node "1/TOP" "TOP\n1" stop diff --git a/tests/functional/graphing/11-nested-fam/graph.plain.ungrouped.ref b/tests/functional/graphing/11-nested-fam/graph.plain.ungrouped.ref index 42dec70e0f4..2fa892d432c 100644 --- a/tests/functional/graphing/11-nested-fam/graph.plain.ungrouped.ref +++ b/tests/functional/graphing/11-nested-fam/graph.plain.ungrouped.ref @@ -1,5 +1,5 @@ -edge "foo.1" "bar.1" +edge "1/foo" "1/bar" graph -node "bar.1" "bar\n1" -node "foo.1" "foo\n1" +node "1/bar" "bar\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/graphql/01-workflow.t b/tests/functional/graphql/01-workflow.t index b6f100996c5..ae488bc4f88 100755 --- a/tests/functional/graphql/01-workflow.t +++ b/tests/functional/graphql/01-workflow.t @@ -117,7 +117,7 @@ cmp_json "${TEST_NAME}-out" "${TEST_NAME_BASE}-workflows.stdout" << __HERE__ ], "states": ["waiting"], "latestStateTasks": { - "waiting": ["foo.20210101T0000Z"] + "waiting": ["20210101T0000Z/foo"] } } ] diff --git a/tests/functional/graphql/02-root-queries.t b/tests/functional/graphql/02-root-queries.t deleted file mode 100755 index 6090975f419..00000000000 --- a/tests/functional/graphql/02-root-queries.t +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env bash -# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. -# Copyright (C) NIWA & British Crown (Met Office) & Contributors. -# -# 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. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -#------------------------------------------------------------------------------- -# Test workflow graphql interface -. "$(dirname "$0")/test_header" -#------------------------------------------------------------------------------- -set_test_number 4 -#------------------------------------------------------------------------------- -install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" - -# run workflow -run_ok "${TEST_NAME_BASE}-run" cylc play "${WORKFLOW_NAME}" - -# query workflow -TEST_NAME="${TEST_NAME_BASE}-root-queries" -ID_DELIM="$(python -c 'from cylc.flow import ID_DELIM;print(ID_DELIM)')" -read -r -d '' rootQueries <<_args_ -{ - "request_string": " -query { - workflows(ids: [\"*${ID_DELIM}${WORKFLOW_NAME}:running\"]) { - id - } - job(id: \"${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo${ID_DELIM}1\") { - id - } - jobs(workflows: [\"*${ID_DELIM}*\"], ids: [\"*${ID_DELIM}*${ID_DELIM}1\"], sort: {keys: [\"id\"], reverse: false}) { - id - } - task(id: \"${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo\") { - id - } - tasks(sort: {keys: [\"id\"], reverse: false}) { - id - } - taskProxy(id: \"${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo\") { - id - } - taskProxies(workflows: [\"*${ID_DELIM}*\"], ids: [\"*${ID_DELIM}*\"], isHeld: false, sort: {keys: [\"id\"], reverse: false}) { - id - } - family(id: \"${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}FAM\") { - id - } - families(sort: {keys: [\"id\"], reverse: false}) { - id - } - familyProxy(id: \"${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}FAM\") { - id - } - familyProxies(workflows: [\"*${ID_DELIM}*\"], ids: [\"20190101T00${ID_DELIM}FAM2\"]) { - id - } - edges(workflows: [\"${USER}${ID_DELIM}${WORKFLOW_NAME}\"], sort: {keys: [\"id\"], reverse: false}) { - id - } - nodesEdges(workflows: [\"*${ID_DELIM}*\"], ids: [\"foo\"], distance: 1, sort: {keys: [\"id\"], reverse: false}) { - nodes { - id - } - edges { - id - } - } -}", - "variables": null -} -_args_ -run_graphql_ok "${TEST_NAME}" "${WORKFLOW_NAME}" "${rootQueries}" - -# scrape workflow info from contact file -TEST_NAME="${TEST_NAME_BASE}-contact" -run_ok "${TEST_NAME_BASE}-contact" cylc get-contact "${WORKFLOW_NAME}" - -# stop workflow -cylc stop --max-polls=10 --interval=2 --kill "${WORKFLOW_NAME}" - -# compare to expectation -cmp_json "${TEST_NAME}-out" "${TEST_NAME_BASE}-root-queries.stdout" << __HERE__ -{ - "workflows": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}" - } - ], - "job": { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo${ID_DELIM}1" - }, - "jobs": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}baa${ID_DELIM}1" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo${ID_DELIM}1" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}qar${ID_DELIM}1" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}qux${ID_DELIM}1" - } - ], - "task": { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo" - }, - "tasks": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}baa" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}bar" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qar" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qaz" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qux" - } - ], - "taskProxy": { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo" - }, - "taskProxies": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}baa" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}bar" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}qar" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}qaz" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}qux" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190201T00${ID_DELIM}baa" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190201T00${ID_DELIM}foo" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190201T00${ID_DELIM}qar" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190201T00${ID_DELIM}qux" - } - ], - "family": { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}FAM" - }, - "families": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}FAM" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}FAM2" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}FAM3" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}FAM4" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}root" - } - ], - "familyProxy": { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}FAM" - }, - "familyProxies": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}FAM2" - } - ], - "edges": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}baa.20190101T00${ID_DELIM}baa.20190201T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}baa.20190101T00${ID_DELIM}qaz.20190101T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo.20190101T00${ID_DELIM}bar.20190101T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo.20190101T00${ID_DELIM}foo.20190201T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qar.20190101T00${ID_DELIM}qar.20190201T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qux.20190101T00${ID_DELIM}bar.20190101T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qux.20190101T00${ID_DELIM}qaz.20190101T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}qux.20190101T00${ID_DELIM}qux.20190201T00" - } - ], - "nodesEdges": { - "nodes": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}bar" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190101T00${ID_DELIM}foo" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}20190201T00${ID_DELIM}foo" - } - ], - "edges": [ - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo.20190101T00${ID_DELIM}bar.20190101T00" - }, - { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}foo.20190101T00${ID_DELIM}foo.20190201T00" - } - ] - } -} -__HERE__ - -purge diff --git a/tests/functional/graphql/02-root-queries/flow.cylc b/tests/functional/graphql/02-root-queries/flow.cylc deleted file mode 100644 index 94914be4142..00000000000 --- a/tests/functional/graphql/02-root-queries/flow.cylc +++ /dev/null @@ -1,102 +0,0 @@ -[meta] - title = BAZ - description = Some workflow baz - URL = 'tcp://localhost:/graphql' - group = round table - importance = critical - ranking = one - -[scheduler] - cycle point format = CCYYMMDDThh - UTC mode = True - -[scheduling] - initial cycle point = 20190101T00 - [[graph]] - P1M = """ -foo[-P1M] => foo -qux[-P1M] => qux -baa[-P1M] => baa -qar[-P1M] => qar - -@wall_clock => foo & qux - -foo | qux => bar -qux => qaz -baa => qaz -""" - -[runtime] - [[root]] - init-script = echo 'Me first' - env-script = echo "Hi first, I'm second" - script = sleep 5; echo "$GREETING" - exit-script = echo 'Yay!' - err-script = echo 'Boo!' - - [[FAM]] - [[[meta]]] - title = "Some Top family" - URL = "https://github.com/cylc/cylc-flow" - importance = Critical - alerts = none - - [[FAM2]] - inherit = FAM - - [[FAM3]] - inherit = FAM2 - - [[FAM4]] - [[[meta]]] - title = "Some Top family" - - [[FAM5]] - env-script = sleep 10; echo "Yawn, sleepy second here" - [[[meta]]] - title = "Some Top family" - - [[foo]] - inherit = FAM3 - [[[meta]]] - description = "some task foo" - [[[environment]]] - GREETING = "Hello from foo!" - - [[bar]] - inherit = FAM3 - [[[meta]]] - description = "some task bar" - [[[environment]]] - GREETING = "Hello from bar!" - - [[qux]] - inherit = FAM4 - [[[meta]]] - description = "some task qux" - [[[environment]]] - GREETING = "Hello from qux!" - - [[qaz]] - inherit = FAM4, FAM - [[[meta]]] - description = "some task qaz" - [[[environment]]] - GREETING = "Hello from qaz!" - [[[outputs]]] - trigger1 = "data ready" - - [[qar]] - inherit = FAM, FAM5, FAM4 - [[[meta]]] - description = "some task qaz" - [[[environment]]] - GREETING = "Hello from qaz!" - [[[outputs]]] - trigger1 = "data ready" - - [[baa]] - [[[meta]]] - description = "some task baa" - [[[environment]]] - GREETING = "Hello from baa!" diff --git a/tests/functional/graphql/03-is-held-arg.t b/tests/functional/graphql/03-is-held-arg.t index 7f17ab59756..414f2842526 100755 --- a/tests/functional/graphql/03-is-held-arg.t +++ b/tests/functional/graphql/03-is-held-arg.t @@ -16,6 +16,7 @@ # along with this program. If not, see . #------------------------------------------------------------------------------- # Test workflow graphql interface +# TODO: convert to integration test . "$(dirname "$0")/test_header" #------------------------------------------------------------------------------- set_test_number 4 @@ -41,7 +42,6 @@ sleep 1 # query workflow TEST_NAME="${TEST_NAME_BASE}-is-held-arg" -ID_DELIM="$(python -c 'from cylc.flow import ID_DELIM;print(ID_DELIM)')" read -r -d '' isHeld <<_args_ { "request_string": " @@ -52,11 +52,11 @@ query { taskProxies(isHeld: true) { id jobs { - submittedTime + submittedTime startedTime } } - familyProxies(exids: [\"root\"], isHeld: true) { + familyProxies(exids: [\"*/root\"], isHeld: true) { id } } @@ -73,7 +73,7 @@ run_ok "${TEST_NAME_BASE}-contact" cylc get-contact "${WORKFLOW_NAME}" # stop workflow cylc stop --max-polls=10 --interval=2 --kill "${WORKFLOW_NAME}" -RESPONSE="${TEST_NAME_BASE}-is-held-arg.stdout" +RESPONSE="${TEST_NAME_BASE}-is-held-arg.stdout" perl -pi -e 's/("submittedTime":).*$/${1} "blargh",/' "${RESPONSE}" perl -pi -e 's/("startedTime":).*$/${1} "blargh"/' "${RESPONSE}" @@ -86,7 +86,7 @@ cmp_json "${TEST_NAME}-out" "$RESPONSE" << __HERE__ "isHeldTotal": 1, "taskProxies": [ { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}1${ID_DELIM}foo", + "id": "~${USER}/${WORKFLOW_NAME}//1/foo", "jobs": [ { "submittedTime": "blargh", @@ -97,7 +97,7 @@ cmp_json "${TEST_NAME}-out" "$RESPONSE" << __HERE__ ], "familyProxies": [ { - "id": "${USER}${ID_DELIM}${WORKFLOW_NAME}${ID_DELIM}1${ID_DELIM}BAZ" + "id": "~${USER}/${WORKFLOW_NAME}//1/BAZ" } ] } diff --git a/tests/functional/hold-release/00-workflow/reference.log b/tests/functional/hold-release/00-workflow/reference.log index 0c223910f44..948aed354dd 100644 --- a/tests/functional/hold-release/00-workflow/reference.log +++ b/tests/functional/hold-release/00-workflow/reference.log @@ -1,5 +1,5 @@ -2014/01/10 08:41:32 INFO - Initial point: 20140101T00 -2014/01/10 08:41:32 INFO - Final point: 20140101T00 -2014/01/10 08:41:32 DEBUG - holdrelease.20140101T00 -triggered off [] -2014/01/10 08:41:50 DEBUG - foo.20140101T00 -triggered off ['holdrelease.20140101T00'] -2014/01/10 08:41:50 DEBUG - bar.20140101T00 -triggered off ['holdrelease.20140101T00'] +Initial point: 20140101T00 +Final point: 20140101T00 +20140101T00/holdrelease -triggered off [] +20140101T00/foo -triggered off ['20140101T00/holdrelease'] +20140101T00/bar -triggered off ['20140101T00/holdrelease'] diff --git a/tests/functional/hold-release/01-beyond-stop/reference.log b/tests/functional/hold-release/01-beyond-stop/reference.log index 435fdc9395d..e6ed1bf4a0f 100644 --- a/tests/functional/hold-release/01-beyond-stop/reference.log +++ b/tests/functional/hold-release/01-beyond-stop/reference.log @@ -1,3 +1,3 @@ -2014-09-08T09:42:52+12 DEBUG - foo.20140101T00 -triggered off [] -2014-09-08T09:42:54+12 DEBUG - holdrelease.20140101T00 -triggered off ['foo.20140101T00'] -2014-09-08T09:42:54+12 DEBUG - bar.20140101T00 -triggered off ['foo.20140101T00'] +20140101T00/foo -triggered off [] +20140101T00/holdrelease -triggered off ['20140101T00/foo'] +20140101T00/bar -triggered off ['20140101T00/foo'] diff --git a/tests/functional/hold-release/02-hold-on-spawn.t b/tests/functional/hold-release/02-hold-on-spawn.t index 24c2a2a3b2c..342c3aceb57 100755 --- a/tests/functional/hold-release/02-hold-on-spawn.t +++ b/tests/functional/hold-release/02-hold-on-spawn.t @@ -30,10 +30,10 @@ __FLOW_CONFIG__ workflow_run_ok "${TEST_NAME_BASE}-run" cylc play --hold-after=0 "${WORKFLOW_NAME}" -cylc release "${WORKFLOW_NAME}" foo.1 -# foo.1 should run and spawn bar.1 as waiting and held +cylc release "${WORKFLOW_NAME}//1/foo" +# 1/foo should run and spawn 1/bar as waiting and held -poll_grep_workflow_log -E 'bar\.1 .* spawned' +poll_grep_workflow_log -E '1/bar .* spawned' sqlite3 "${WORKFLOW_RUN_DIR}/log/db" \ 'SELECT cycle, name, status, is_held FROM task_pool' > task-pool.out diff --git a/tests/functional/hold-release/05-release.t b/tests/functional/hold-release/05-release.t index bb9303120e9..0dd50fd3f39 100755 --- a/tests/functional/hold-release/05-release.t +++ b/tests/functional/hold-release/05-release.t @@ -35,16 +35,17 @@ init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' cylc__job__wait_cylc_message_started cylc hold --after=0 ${CYLC_WORKFLOW_ID} cylc__job__poll_grep_workflow_log 'Command succeeded: set_hold_point' - cylc release ${CYLC_WORKFLOW_ID} '*FF.1' # inexact fam - cylc release ${CYLC_WORKFLOW_ID} 'TOAST.1' # exact fam - cylc release ${CYLC_WORKFLOW_ID} 'cat*.1' # inexact tasks - cylc release ${CYLC_WORKFLOW_ID} 'dog1.1' # exact tasks - cylc release ${CYLC_WORKFLOW_ID} 'stop.1' # exact tasks + cylc release "${CYLC_WORKFLOW_ID}//1/*FF" # inexact fam + cylc release "${CYLC_WORKFLOW_ID}//1/TOAST" # exact fam + cylc release "${CYLC_WORKFLOW_ID}//1/cat*" # inexact tasks + cylc release "${CYLC_WORKFLOW_ID}//1/dog1" # exact tasks + cylc release "${CYLC_WORKFLOW_ID}//1/stop" # exact tasks # TODO: finished tasks are not removed if held: should this be the case? # (is this related to killed tasks being held to prevent retries?) - cylc release ${CYLC_WORKFLOW_ID} 'spawner.1' - cylc release ${CYLC_WORKFLOW_ID} 'holdrelease.1' + cylc release "${CYLC_WORKFLOW_ID}//1/spawner" + cylc release "${CYLC_WORKFLOW_ID}//1/holdrelease" + """ [[STUFF]] [[TOAST]] @@ -64,7 +65,7 @@ init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' inherit = STOP script = """ cylc__job__poll_grep_workflow_log -E \ - 'dog1\.1 succeeded .* task proxy removed \(finished\)' + '1/dog1 succeeded .* task proxy removed \(finished\)' cylc stop "${CYLC_WORKFLOW_ID}" """ __FLOW_CONFIG__ diff --git a/tests/functional/hold-release/08-hold.t b/tests/functional/hold-release/08-hold.t index 9052640019d..db453a38b64 100755 --- a/tests/functional/hold-release/08-hold.t +++ b/tests/functional/hold-release/08-hold.t @@ -32,20 +32,20 @@ init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' [runtime] [[holdrelease]] script = """ -cylc__job__wait_cylc_message_started -cylc__job__poll_grep_workflow_log -E 'foo\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'bar\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'cheese\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'jam\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'cat1\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'cat2\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'dog1\.1 .* spawned' -cylc__job__poll_grep_workflow_log -E 'dog2\.1 .* spawned' -cylc hold ${CYLC_WORKFLOW_ID} '*FF.1' # inexact fam -cylc hold ${CYLC_WORKFLOW_ID} 'TOAST.1' # exact fam -cylc hold ${CYLC_WORKFLOW_ID} 'cat*.1' # inexact tasks -cylc hold ${CYLC_WORKFLOW_ID} 'dog1.1' # exact tasks -""" + cylc__job__wait_cylc_message_started + cylc__job__poll_grep_workflow_log -E '1/foo .* spawned' + cylc__job__poll_grep_workflow_log -E '1/bar .* spawned' + cylc__job__poll_grep_workflow_log -E '1/cheese .* spawned' + cylc__job__poll_grep_workflow_log -E '1/jam .* spawned' + cylc__job__poll_grep_workflow_log -E '1/cat1 .* spawned' + cylc__job__poll_grep_workflow_log -E '1/cat2 .* spawned' + cylc__job__poll_grep_workflow_log -E '1/dog1 .* spawned' + cylc__job__poll_grep_workflow_log -E '1/dog2 .* spawned' + cylc hold "${CYLC_WORKFLOW_ID}//1/*FF" # inexact fam + cylc hold "${CYLC_WORKFLOW_ID}//1/TOAST" # exact fam + cylc hold "${CYLC_WORKFLOW_ID}//1/cat*" # inexact tasks + cylc hold "${CYLC_WORKFLOW_ID}//1/dog1" # exact tasks + """ [[STUFF]] [[TOAST]] [[STOP]] @@ -63,8 +63,8 @@ cylc hold ${CYLC_WORKFLOW_ID} 'dog1.1' # exact tasks [[stop]] inherit = STOP script = """ - sleep 5 - cylc stop "${CYLC_WORKFLOW_ID}" + sleep 5 + cylc stop "${CYLC_WORKFLOW_ID}" """ __FLOW_CONFIG__ @@ -73,7 +73,7 @@ run_ok "${TEST_NAME_BASE}-val" cylc validate "${WORKFLOW_NAME}" workflow_run_ok "${TEST_NAME_BASE}-run" \ cylc play --debug --no-detach --abort-if-any-task-fails "${WORKFLOW_NAME}" -# Should shut down with all the held tasks in the held state, and dog.2 +# Should shut down with all the held tasks in the held state, and 2/dog # finished and gone from the task pool. sqlite3 "${WORKFLOW_RUN_DIR}/log/db" \ diff --git a/tests/functional/hold-release/11-retrying/flow.cylc b/tests/functional/hold-release/11-retrying/flow.cylc index 769105382a8..03cd0f6b039 100644 --- a/tests/functional/hold-release/11-retrying/flow.cylc +++ b/tests/functional/hold-release/11-retrying/flow.cylc @@ -18,26 +18,26 @@ t-retry-able => t-analyse [[t-hold-release]] script = """ cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 running job:01.* \(received\)failed' + '1/t-retry-able running job:01.* \(received\)failed' cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 running job:01.* => waiting' + '1/t-retry-able running job:01.* => waiting' cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 waiting job:01.* retrying in PT15S' + '1/t-retry-able waiting job:01.* retrying in PT15S' - cylc hold "${CYLC_WORKFLOW_ID}" 't-retry-able.1' + cylc hold "${CYLC_WORKFLOW_ID}//1/t-retry-able" cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 waiting job:01.* => waiting\(held\)' + '1/t-retry-able waiting job:01.* => waiting\(held\)' - cylc release "${CYLC_WORKFLOW_ID}" 't-retry-able.1' + cylc release "${CYLC_WORKFLOW_ID}//1/t-retry-able" cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 waiting\(held\) job:01.* => waiting' + '1/t-retry-able waiting\(held\) job:01.* => waiting' cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 waiting job:01.* => waiting\(queued\)' + '1/t-retry-able waiting job:01.* => waiting\(queued\)' """ [[t-analyse]] script = """ diff --git a/tests/functional/hold-release/11-retrying/reference.log b/tests/functional/hold-release/11-retrying/reference.log index 6ee1dfd29b2..f1f1c935d3b 100644 --- a/tests/functional/hold-release/11-retrying/reference.log +++ b/tests/functional/hold-release/11-retrying/reference.log @@ -1,7 +1,7 @@ -2014-12-17T15:48:59Z INFO - Initial point: 1 -2014-12-17T15:48:59Z INFO - Final point: 1 -2014-12-17T15:48:59Z DEBUG - t-retry-able.1 -triggered off [] -2014-12-17T15:49:00Z DEBUG - t-hold-release.1 -triggered off ['t-retry-able.1'] -2014-12-17T15:49:16Z DEBUG - t-retry-able.1 -triggered off [] -2014-12-17T15:49:19Z DEBUG - t-retry-able.1 -triggered off [] -2014-12-17T15:49:22Z DEBUG - t-analyse.1 -triggered off ['t-retry-able.1'] +Initial point: 1 +Final point: 1 +1/t-retry-able -triggered off [] +1/t-hold-release -triggered off ['1/t-retry-able'] +1/t-retry-able -triggered off [] +1/t-retry-able -triggered off [] +1/t-analyse -triggered off ['1/t-retry-able'] diff --git a/tests/functional/hold-release/17-hold-after-point/reference.log b/tests/functional/hold-release/17-hold-after-point/reference.log index 924b00af88a..f20677a188f 100644 --- a/tests/functional/hold-release/17-hold-after-point/reference.log +++ b/tests/functional/hold-release/17-hold-after-point/reference.log @@ -1,5 +1,5 @@ Initial point: 20100101T0000Z Final point: 20100110T0000Z -stopper.20100101T0000Z -triggered off [] -foo.20100101T0000Z -triggered off ['foo.20091231T0000Z'] -foo.20100102T0000Z -triggered off ['foo.20100101T0000Z'] +20100101T0000Z/stopper -triggered off [] +20100101T0000Z/foo -triggered off ['20091231T0000Z/foo'] +20100102T0000Z/foo -triggered off ['20100101T0000Z/foo'] diff --git a/tests/functional/hold-release/18-hold-cycle-globs/flow.cylc b/tests/functional/hold-release/18-hold-cycle-globs/flow.cylc index 971891ca4ef..a74c7a20c3f 100644 --- a/tests/functional/hold-release/18-hold-cycle-globs/flow.cylc +++ b/tests/functional/hold-release/18-hold-cycle-globs/flow.cylc @@ -23,13 +23,13 @@ [runtime] [[holder]] script = """ - cylc__job__poll_grep_workflow_log -E 't1\.19900101T0000Z .* spawned' - cylc__job__poll_grep_workflow_log -E 't2\.20100101T0000Z .* spawned' - cylc__job__poll_grep_workflow_log -E 't3\.20300101T0000Z .* spawned' - cylc hold "${CYLC_WORKFLOW_ID}" '*/t*' + cylc__job__poll_grep_workflow_log -E '19900101T0000Z/t1 .* spawned' + cylc__job__poll_grep_workflow_log -E '20100101T0000Z/t2 .* spawned' + cylc__job__poll_grep_workflow_log -E '20300101T0000Z/t3 .* spawned' + cylc hold "${CYLC_WORKFLOW_ID}//*/t*" """ [[releaser]] - script = cylc release "${CYLC_WORKFLOW_ID}" '20*/t*' + script = cylc release "${CYLC_WORKFLOW_ID}//20*/t*" [[stopper]] script = cylc stop "${CYLC_WORKFLOW_ID}" [[spawner, t1, t2, t3]] diff --git a/tests/functional/hold-release/18-hold-cycle-globs/reference.log b/tests/functional/hold-release/18-hold-cycle-globs/reference.log index 8fdfd61b69e..cb9bdd22a3b 100644 --- a/tests/functional/hold-release/18-hold-cycle-globs/reference.log +++ b/tests/functional/hold-release/18-hold-cycle-globs/reference.log @@ -1,8 +1,8 @@ -2016-01-15T16:16:58Z INFO - Initial point: 19900101T0000Z -2016-01-15T16:16:58Z INFO - Final point: 20300101T0000Z -2016-01-15T16:16:58Z DEBUG - spawner.19900101T0000Z -triggered off [] -2016-01-15T16:16:58Z DEBUG - holder.19900101T0000Z -triggered off [] -2016-01-15T16:17:04Z DEBUG - releaser.19900101T0000Z -triggered off ['holder.19900101T0000Z'] -2016-01-15T16:17:16Z DEBUG - t2.20100101T0000Z -triggered off ['releaser.19900101T0000Z', 'spawner.19900101T0000Z'] -2016-01-15T16:17:16Z DEBUG - t3.20300101T0000Z -triggered off ['releaser.19900101T0000Z', 'spawner.19900101T0000Z'] -2016-01-15T16:17:16Z DEBUG - stopper.20300101T0000Z -triggered off ['releaser.19900101T0000Z', 't2.20100101T0000Z', 't3.20300101T0000Z'] +Initial point: 19900101T0000Z +Final point: 20300101T0000Z +19900101T0000Z/spawner -triggered off [] +19900101T0000Z/holder -triggered off [] +19900101T0000Z/releaser -triggered off ['19900101T0000Z/holder'] +20100101T0000Z/t2 -triggered off ['19900101T0000Z/releaser', '19900101T0000Z/spawner'] +20300101T0000Z/t3 -triggered off ['19900101T0000Z/releaser', '19900101T0000Z/spawner'] +20300101T0000Z/stopper -triggered off ['19900101T0000Z/releaser', '20100101T0000Z/t2', '20300101T0000Z/t3'] diff --git a/tests/functional/hold-release/19-no-reset-prereq-on-waiting/flow.cylc b/tests/functional/hold-release/19-no-reset-prereq-on-waiting/flow.cylc index 518a5fb947c..9ad270b4e84 100644 --- a/tests/functional/hold-release/19-no-reset-prereq-on-waiting/flow.cylc +++ b/tests/functional/hold-release/19-no-reset-prereq-on-waiting/flow.cylc @@ -7,20 +7,20 @@ [scheduling] [[graph]] R1 = """ -spawner => t1 -holder => t1 -holder => releaser -""" + spawner => t1 + holder => t1 + holder => releaser + """ [runtime] [[spawner, t1]] script = true [[holder]] script = """ -cylc__job__poll_grep_workflow_log -E 't1\.1 .* spawned' -cylc hold "${CYLC_WORKFLOW_ID}" 't1.1' -""" + cylc__job__poll_grep_workflow_log -E '1/t1 .* spawned' + cylc hold "${CYLC_WORKFLOW_ID}//1/t1" + """ [[releaser]] script = """ -cylc__job__wait_cylc_message_started -cylc release "${CYLC_WORKFLOW_ID}" 't1.1' -""" + cylc__job__wait_cylc_message_started + cylc release "${CYLC_WORKFLOW_ID}//1/t1" + """ diff --git a/tests/functional/hold-release/19-no-reset-prereq-on-waiting/reference.log b/tests/functional/hold-release/19-no-reset-prereq-on-waiting/reference.log index 83c3bb2f3dd..3dec051588e 100644 --- a/tests/functional/hold-release/19-no-reset-prereq-on-waiting/reference.log +++ b/tests/functional/hold-release/19-no-reset-prereq-on-waiting/reference.log @@ -1,6 +1,6 @@ -2016-05-24T13:56:51Z INFO - Initial point: 20160101T0000Z -2016-05-24T13:56:51Z INFO - Final point: 20160101T0000Z -2016-05-24T13:56:51Z DEBUG - spawner.1 -triggered off [] -2016-05-24T13:56:51Z DEBUG - holder.1 -triggered off [] -2016-05-24T13:56:54Z DEBUG - releaser.1 -triggered off ['holder.1'] -2016-05-24T13:56:56Z DEBUG - t1.1 -triggered off ['holder.1', 'spawner.1'] +Initial point: 20160101T0000Z +Final point: 20160101T0000Z +1/spawner -triggered off [] +1/holder -triggered off [] +1/releaser -triggered off ['1/holder'] +1/t1 -triggered off ['1/holder', '1/spawner'] diff --git a/tests/functional/include-files/00-basic.t b/tests/functional/include-files/00-basic.t index 44112ccc8b0..7ad1ed2f63a 100644 --- a/tests/functional/include-files/00-basic.t +++ b/tests/functional/include-files/00-basic.t @@ -27,12 +27,14 @@ TEST_NAME="${TEST_NAME_BASE}-validate" run_ok "${TEST_NAME}.1" cylc val "${WORKFLOW_NAME}" # test workflow validates as inlined during editing -cylc view --inline --stdout "${WORKFLOW_NAME}" > inlined.cylc -run_ok "${TEST_NAME}.2" cylc val inlined.cylc +mkdir inlined +cylc view --inline --stdout "${WORKFLOW_NAME}" > inlined/flow.cylc +run_ok "${TEST_NAME}.2" cylc val ./inlined #------------------------------------------------------------------------------- # compare inlined workflow def with reference copy TEST_NAME=${TEST_NAME_BASE}-compare -cmp_ok inlined.cylc "${TEST_SOURCE_DIR}/workflow/ref-inlined.cylc" +cmp_ok inlined/flow.cylc "${TEST_SOURCE_DIR}/workflow/ref-inlined.cylc" +rm -rf inlined #------------------------------------------------------------------------------- purge #------------------------------------------------------------------------------- diff --git a/tests/functional/intelligent-host-selection/02-badhosts.t b/tests/functional/intelligent-host-selection/02-badhosts.t index 6c89a48420e..fb721530308 100644 --- a/tests/functional/intelligent-host-selection/02-badhosts.t +++ b/tests/functional/intelligent-host-selection/02-badhosts.t @@ -60,11 +60,11 @@ LOGFILE="${WORKFLOW_RUN_DIR}/log/workflow/log" # Check that badhosttask has submit failed, but not good or mixed named_grep_ok "badhost task submit failed" \ - "badhosttask\.1 .* submit-failed" "${LOGFILE}" + "1/badhosttask .* submit-failed" "${LOGFILE}" named_grep_ok "goodhost suceeded" \ - "mixedhosttask\.1 .* succeeded" "${LOGFILE}" + "1/mixedhosttask .* succeeded" "${LOGFILE}" named_grep_ok "mixedhost task suceeded" \ - "goodhosttask\.1 .* succeeded" "${LOGFILE}" + "1/goodhosttask .* succeeded" "${LOGFILE}" # Check that when a task fail badhosts associated with that task's platform # are removed from the badhosts set. diff --git a/tests/functional/intelligent-host-selection/03-polling.t b/tests/functional/intelligent-host-selection/03-polling.t index 9f8b4f243d4..3035dcdebfc 100644 --- a/tests/functional/intelligent-host-selection/03-polling.t +++ b/tests/functional/intelligent-host-selection/03-polling.t @@ -65,7 +65,7 @@ LOGFILE="${WORKFLOW_RUN_DIR}/log/workflow/log" named_grep_ok \ "job poll fails" \ "unreachable_host has been added to the list of unreachable hosts" \ - "${LOGFILE}" "-P" + "${LOGFILE}" named_grep_ok "job poll retries & succeeds" \ "\[jobs-poll out\] \[TASK JOB SUMMARY\].*1/mixedhosttask/01" \ diff --git a/tests/functional/intelligent-host-selection/03-polling/flow.cylc b/tests/functional/intelligent-host-selection/03-polling/flow.cylc index e489e26276e..a0ddb0b78a7 100644 --- a/tests/functional/intelligent-host-selection/03-polling/flow.cylc +++ b/tests/functional/intelligent-host-selection/03-polling/flow.cylc @@ -8,7 +8,7 @@ Tasks [scheduler] [[events]] - expected task failures = t1.1, t2.1 + expected task failures = 1/t1, 1/t2 [scheduling] @@ -37,12 +37,12 @@ Tasks [[stop_g]] script=""" sleep 5 # Give the badhosts list time to empty - cylc kill "$CYLC_WORKFLOW_ID" 'goodhosttask.1' || true + cylc kill "$CYLC_WORKFLOW_ID//1/goodhosttask" || true """ [[stop_m]] script=""" sleep 5 # Give the badhosts list time to empty - cylc kill "$CYLC_WORKFLOW_ID" 'mixedhosttask.1' || true + cylc kill "$CYLC_WORKFLOW_ID//1/mixedhosttask" || true cylc stop $CYLC_WORKFLOW_ID """ diff --git a/tests/functional/intelligent-host-selection/04-kill.t b/tests/functional/intelligent-host-selection/04-kill.t index 3a5c7099e5c..7f96dc92f61 100644 --- a/tests/functional/intelligent-host-selection/04-kill.t +++ b/tests/functional/intelligent-host-selection/04-kill.t @@ -19,7 +19,6 @@ # so that kill will need to retry, despite 'unreachable_host' being idetified # as unreachable by job submission. export REQUIRE_PLATFORM='loc:remote fs:indep comms:tcp' - . "$(dirname "$0")/test_header" #------------------------------------------------------------------------------- @@ -58,7 +57,7 @@ LOGFILE="${WORKFLOW_RUN_DIR}/log/workflow/log" # are removed from the badhosts set. named_grep_ok "job kill fails" \ "unreachable_host has been added to the list of unreachable hosts" \ - "${LOGFILE}" "-P" + "${LOGFILE}" named_grep_ok "job kill retries & succeeds" \ "\[jobs-kill out\] \[TASK JOB SUMMARY\].*1/mixedhosttask/01" \ diff --git a/tests/functional/intelligent-host-selection/04-kill/flow.cylc b/tests/functional/intelligent-host-selection/04-kill/flow.cylc index c99c4da27c3..ee90a5ecc69 100644 --- a/tests/functional/intelligent-host-selection/04-kill/flow.cylc +++ b/tests/functional/intelligent-host-selection/04-kill/flow.cylc @@ -1,15 +1,15 @@ [meta] -title = "Try out scenarios for intelligent host selection." -description = """ -Tasks -- goodhost: a control to check that everything works -- badhost is always going to fail -- mixedhost contains some hosts that will and won't fail -""" + title = "Try out scenarios for intelligent host selection." + description = """ + Tasks + - goodhost: a control to check that everything works + - badhost is always going to fail + - mixedhost contains some hosts that will and won't fail + """ [scheduler] [[events]] - expected task failures = goodhosttask.1, mixedhosttask.1 + expected task failures = 1/goodhosttask, 1/mixedhosttask [scheduling] @@ -23,7 +23,6 @@ Tasks mixedhosttask:start => stop_m """ - [runtime] [[root]] script = sleep 120 & echo $! >file; wait @@ -31,7 +30,7 @@ Tasks [[mystop]] script=""" sleep 5 # Give the badhosts list time to empty - cylc kill "$CYLC_WORKFLOW_ID" "$TASK" || true + cylc kill "$CYLC_WORKFLOW_ID//$TASK" cylc stop $CYLC_WORKFLOW_ID """ @@ -46,9 +45,9 @@ Tasks [[stop_g]] inherit = mystop [[[environment]]] - TASK = goodhosttask.1 + TASK = 1/goodhosttask [[stop_m]] inherit = mystop [[[environment]]] - TASK = mixedhosttask.1 + TASK = 1/mixedhosttask diff --git a/tests/functional/intelligent-host-selection/05-from-platform-group.t b/tests/functional/intelligent-host-selection/05-from-platform-group.t index df187a5a350..073292b606b 100644 --- a/tests/functional/intelligent-host-selection/05-from-platform-group.t +++ b/tests/functional/intelligent-host-selection/05-from-platform-group.t @@ -76,7 +76,7 @@ log_scan \ "platform: ${CYLC_TEST_PLATFORM} - Could not connect to unreachable_host." \ "platform: ${CYLC_TEST_PLATFORM} - remote init (on ${CYLC_TEST_HOST})" \ "platform: ${CYLC_TEST_PLATFORM} - file install (on ${CYLC_TEST_HOST})" \ - "\[ugly\.1 preparing job:01 flows:1\] => submitted" + "\[1/ugly preparing job:01 flows:1\] => submitted" purge exit 0 diff --git a/tests/functional/intelligent-host-selection/05-from-platform-group/reference.log b/tests/functional/intelligent-host-selection/05-from-platform-group/reference.log index b24819703ba..f9d59c105f7 100644 --- a/tests/functional/intelligent-host-selection/05-from-platform-group/reference.log +++ b/tests/functional/intelligent-host-selection/05-from-platform-group/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -good.1 -triggered off [] -ugly.1 -triggered off ['good.1'] +1/good -triggered off [] +1/ugly -triggered off ['1/good'] diff --git a/tests/functional/intelligent-host-selection/06-from-platform-group-fails.t b/tests/functional/intelligent-host-selection/06-from-platform-group-fails.t index 973938a4cf5..f7594d185b2 100644 --- a/tests/functional/intelligent-host-selection/06-from-platform-group-fails.t +++ b/tests/functional/intelligent-host-selection/06-from-platform-group-fails.t @@ -45,8 +45,8 @@ logfile="${WORKFLOW_RUN_DIR}/log/workflow/log" # Check workflow fails for the reason we want it to fail named_grep_ok \ - "Workflow stalled with bad.1 (submit-failed)" \ - "bad.1 did not complete required outputs" \ + "Workflow stalled with 1/bad (submit-failed)" \ + "1/bad did not complete required outputs" \ "$logfile" # Look for message indicating that remote init has failed on each bad_host diff --git a/tests/functional/intelligent-host-selection/06-from-platform-group-fails/flow.cylc b/tests/functional/intelligent-host-selection/06-from-platform-group-fails/flow.cylc index 93975c9d333..bb44e8a5f65 100644 --- a/tests/functional/intelligent-host-selection/06-from-platform-group-fails/flow.cylc +++ b/tests/functional/intelligent-host-selection/06-from-platform-group-fails/flow.cylc @@ -1,14 +1,14 @@ - [meta] -title = "Try out scenarios for intelligent host selection." -description = """ -Tasks -===== + title = "Try out scenarios for intelligent host selection." + description = """ + Tasks + ===== + + Bad + --- + Fails on all hosts on all plaforms + """ -Bad ---- -Fails on all hosts on all plaforms -""" [scheduler] [[events]] stall timeout = PT0S diff --git a/tests/functional/intercycle/00-past/reference.log b/tests/functional/intercycle/00-past/reference.log index 6032615829a..b6812f68ad1 100644 --- a/tests/functional/intercycle/00-past/reference.log +++ b/tests/functional/intercycle/00-past/reference.log @@ -1,6 +1,6 @@ -2012/08/21 13:32:04 INFO - Initial point: 20120101T0000Z -2012/08/21 13:32:04 INFO - Final point: 20120101T1800Z -2012/08/21 13:32:04 DEBUG - A.20120101T0000Z -triggered off [] -2012/08/21 13:32:04 DEBUG - A.20120101T1200Z -triggered off [] -2012/08/21 13:32:14 DEBUG - B.20120101T0600Z -triggered off ['A.20120101T0000Z'] -2012/08/21 13:32:15 DEBUG - B.20120101T1800Z -triggered off ['A.20120101T1200Z'] +Initial point: 20120101T0000Z +Final point: 20120101T1800Z +20120101T0000Z/A -triggered off [] +20120101T1200Z/A -triggered off [] +20120101T0600Z/B -triggered off ['20120101T0000Z/A'] +20120101T1800Z/B -triggered off ['20120101T1200Z/A'] diff --git a/tests/functional/intercycle/01-future/reference.log b/tests/functional/intercycle/01-future/reference.log index df995ca7b45..d622f0e1820 100644 --- a/tests/functional/intercycle/01-future/reference.log +++ b/tests/functional/intercycle/01-future/reference.log @@ -1,8 +1,8 @@ -2014-05-19T17:32:12 INFO - Initial point: 20120101T00 -2014-05-19T17:32:12 INFO - Final point: 20120101T18 -2014-05-19T17:32:12 DEBUG - a.20120101T06 -triggered off [] -2014-05-19T17:32:16 DEBUG - a.20120101T12 -triggered off [] -2014-05-19T17:32:16 DEBUG - b.20120101T00 -triggered off ['a.20120101T06'] -2014-05-19T17:32:20 DEBUG - b.20120101T06 -triggered off ['a.20120101T12'] -2014-05-19T17:32:20 DEBUG - a.20120101T18 -triggered off [] -2014-05-19T17:32:29 DEBUG - b.20120101T12 -triggered off ['a.20120101T18'] +Initial point: 20120101T00 +Final point: 20120101T18 +20120101T06/a -triggered off [] +20120101T12/a -triggered off [] +20120101T00/b -triggered off ['20120101T06/a'] +20120101T06/b -triggered off ['20120101T12/a'] +20120101T18/a -triggered off [] +20120101T12/b -triggered off ['20120101T18/a'] diff --git a/tests/functional/intercycle/02-integer-abs/reference.log b/tests/functional/intercycle/02-integer-abs/reference.log index 91a4a82f369..3244c14e8ae 100644 --- a/tests/functional/intercycle/02-integer-abs/reference.log +++ b/tests/functional/intercycle/02-integer-abs/reference.log @@ -1,8 +1,8 @@ -2016-12-16T12:14:01Z INFO - Initial point: 1 -2016-12-16T12:14:01Z INFO - Final point: 5 -2016-12-16T12:14:01Z DEBUG - start.2 -triggered off [] -2016-12-16T12:14:04Z DEBUG - foo.1 -triggered off ['start.2'] -2016-12-16T12:14:06Z DEBUG - foo.2 -triggered off ['start.2'] -2016-12-16T12:14:08Z DEBUG - foo.3 -triggered off ['start.2'] -2016-12-16T12:14:10Z DEBUG - foo.4 -triggered off ['start.2'] -2016-12-16T12:14:12Z DEBUG - foo.5 -triggered off ['start.2'] +Initial point: 1 +Final point: 5 +2/start -triggered off [] +1/foo -triggered off ['2/start'] +2/foo -triggered off ['2/start'] +3/foo -triggered off ['2/start'] +4/foo -triggered off ['2/start'] +5/foo -triggered off ['2/start'] diff --git a/tests/functional/intercycle/03-datetime-abs/reference.log b/tests/functional/intercycle/03-datetime-abs/reference.log index ca5be8d09cc..222079d49ef 100644 --- a/tests/functional/intercycle/03-datetime-abs/reference.log +++ b/tests/functional/intercycle/03-datetime-abs/reference.log @@ -1,5 +1,5 @@ -2016-12-16T12:23:36Z INFO - Initial point: 20100101T0000Z -2016-12-16T12:23:36Z INFO - Final point: 20100102T0000Z -2016-12-16T12:23:36Z DEBUG - fixed_cycle.20100101T0600Z -triggered off [] -2016-12-16T12:23:36Z DEBUG - init_cycle.20100101T0000Z -triggered off [] -2016-12-16T12:23:39Z DEBUG - foo.20100101T1200Z -triggered off ['fixed_cycle.20100101T0600Z'] +Initial point: 20100101T0000Z +Final point: 20100102T0000Z +20100101T0600Z/fixed_cycle -triggered off [] +20100101T0000Z/init_cycle -triggered off [] +20100101T1200Z/foo -triggered off ['20100101T0600Z/fixed_cycle'] diff --git a/tests/functional/intercycle/04-datetime-abs-2/reference.log b/tests/functional/intercycle/04-datetime-abs-2/reference.log index 536399547e6..3c8a449f725 100644 --- a/tests/functional/intercycle/04-datetime-abs-2/reference.log +++ b/tests/functional/intercycle/04-datetime-abs-2/reference.log @@ -1,7 +1,7 @@ -2016-12-16T12:54:36Z INFO - Initial point: 20000101T0000Z -2016-12-16T12:54:36Z INFO - Final point: 20000103T0000Z -2016-12-16T12:54:36Z DEBUG - start.20000101T0000Z -triggered off [] -2016-12-16T12:54:39Z DEBUG - foo.20000101T0000Z -triggered off ['start.20000101T0000Z'] -2016-12-16T12:54:41Z DEBUG - foo.20000102T0000Z -triggered off ['start.20000101T0000Z'] -2016-12-16T12:54:43Z DEBUG - foo.20000103T0000Z -triggered off ['start.20000101T0000Z'] -2016-12-16T12:54:44Z DEBUG - bar.20000102T1200Z -triggered off ['foo.20000102T0000Z'] +Initial point: 20000101T0000Z +Final point: 20000103T0000Z +20000101T0000Z/start -triggered off [] +20000101T0000Z/foo -triggered off ['20000101T0000Z/start'] +20000102T0000Z/foo -triggered off ['20000101T0000Z/start'] +20000103T0000Z/foo -triggered off ['20000101T0000Z/start'] +20000102T1200Z/bar -triggered off ['20000102T0000Z/foo'] diff --git a/tests/functional/intercycle/05-datetime-abs-3/reference.log b/tests/functional/intercycle/05-datetime-abs-3/reference.log index ca5be8d09cc..222079d49ef 100644 --- a/tests/functional/intercycle/05-datetime-abs-3/reference.log +++ b/tests/functional/intercycle/05-datetime-abs-3/reference.log @@ -1,5 +1,5 @@ -2016-12-16T12:23:36Z INFO - Initial point: 20100101T0000Z -2016-12-16T12:23:36Z INFO - Final point: 20100102T0000Z -2016-12-16T12:23:36Z DEBUG - fixed_cycle.20100101T0600Z -triggered off [] -2016-12-16T12:23:36Z DEBUG - init_cycle.20100101T0000Z -triggered off [] -2016-12-16T12:23:39Z DEBUG - foo.20100101T1200Z -triggered off ['fixed_cycle.20100101T0600Z'] +Initial point: 20100101T0000Z +Final point: 20100102T0000Z +20100101T0600Z/fixed_cycle -triggered off [] +20100101T0000Z/init_cycle -triggered off [] +20100101T1200Z/foo -triggered off ['20100101T0600Z/fixed_cycle'] diff --git a/tests/functional/jinja2/09-custom-jinja2-filters/reference.log b/tests/functional/jinja2/09-custom-jinja2-filters/reference.log index 34a969cafd7..4b721e65a97 100644 --- a/tests/functional/jinja2/09-custom-jinja2-filters/reference.log +++ b/tests/functional/jinja2/09-custom-jinja2-filters/reference.log @@ -1,6 +1,6 @@ -2018-10-22T15:43:24Z INFO - Initial point: 01231212T1212Z -2018-10-22T15:43:24Z INFO - Final point: None -2018-10-22T15:43:24Z DEBUG - strftime.01231212T1212Z -triggered off [] -2018-10-22T15:43:28Z DEBUG - pad.01231212T1212Z -triggered off ['strftime.01231212T1212Z'] -2018-10-22T15:43:32Z DEBUG - duration_as.01231212T1212Z -triggered off ['pad.01231212T1212Z'] -2018-10-22T15:43:36Z DEBUG - end.01231212T1212Z -triggered off ['duration_as.01231212T1212Z'] +Initial point: 01231212T1212Z +Final point: None +01231212T1212Z/strftime -triggered off [] +01231212T1212Z/pad -triggered off ['01231212T1212Z/strftime'] +01231212T1212Z/duration_as -triggered off ['01231212T1212Z/pad'] +01231212T1212Z/end -triggered off ['01231212T1212Z/duration_as'] diff --git a/tests/functional/jinja2/commandline-set/reference.log b/tests/functional/jinja2/commandline-set/reference.log index 234e2470d95..8af8300429b 100644 --- a/tests/functional/jinja2/commandline-set/reference.log +++ b/tests/functional/jinja2/commandline-set/reference.log @@ -1,4 +1,4 @@ -2013/11/08 22:20:16 INFO - Initial point: 20100101T0000Z -2013/11/08 22:20:16 INFO - Final point: 20120101T0000Z -2013/11/08 22:20:16 DEBUG - foo.20100101T0000Z -triggered off [] -2013/11/08 22:20:20 DEBUG - foo.20120101T0000Z -triggered off [] +Initial point: 20100101T0000Z +Final point: 20120101T0000Z +20100101T0000Z/foo -triggered off [] +20120101T0000Z/foo -triggered off [] diff --git a/tests/functional/job-file-trap/00-sigusr1.t b/tests/functional/job-file-trap/00-sigusr1.t index 61b48185272..7755e76d15c 100755 --- a/tests/functional/job-file-trap/00-sigusr1.t +++ b/tests/functional/job-file-trap/00-sigusr1.t @@ -31,7 +31,7 @@ run_tests() { # Needs to be detaching: workflow_run_ok "${TEST_NAME}" cylc play --reference-test "${WORKFLOW_NAME}" - # Make sure t1.1.1's status file is in place + # Make sure 1/t1's status file is in place T1_STATUS_FILE="${WORKFLOW_RUN_DIR}/log/job/1/t1/01/job.status" poll_grep -E 'CYLC_JOB_ID=' "${T1_STATUS_FILE}" diff --git a/tests/functional/job-file-trap/00-sigusr1/reference.log b/tests/functional/job-file-trap/00-sigusr1/reference.log index 1f83a00d13d..c5802d782d2 100644 --- a/tests/functional/job-file-trap/00-sigusr1/reference.log +++ b/tests/functional/job-file-trap/00-sigusr1/reference.log @@ -1,4 +1,4 @@ -2014/01/24 12:25:52 INFO - Initial point: 1 -2014/01/24 12:25:52 INFO - Final point: 1 -2014/01/24 12:25:52 DEBUG - t1.1 -triggered off [] -2014/01/24 12:26:48 DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/job-file-trap/01-loadleveler/reference.log b/tests/functional/job-file-trap/01-loadleveler/reference.log index cb7c9049b16..364dfd20da6 100644 --- a/tests/functional/job-file-trap/01-loadleveler/reference.log +++ b/tests/functional/job-file-trap/01-loadleveler/reference.log @@ -1,4 +1,4 @@ -2014/02/05 12:14:06 INFO - Initial point: 1 -2014/02/05 12:14:06 INFO - Final point: 1 -2014/02/05 12:14:06 DEBUG - t2.1 -triggered off [] -2014/02/05 12:14:06 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t2 -triggered off [] +1/t1 -triggered off [] diff --git a/tests/functional/job-file-trap/02-pipefail/flow.cylc b/tests/functional/job-file-trap/02-pipefail/flow.cylc index 37bcd35158b..6c13626995f 100644 --- a/tests/functional/job-file-trap/02-pipefail/flow.cylc +++ b/tests/functional/job-file-trap/02-pipefail/flow.cylc @@ -3,7 +3,7 @@ [[events]] abort on stall timeout = True stall timeout = PT0S - expected task failures = t1.1, t2.1 + expected task failures = 1/t1, 1/t2 [scheduling] [[graph]] diff --git a/tests/functional/job-file-trap/02-pipefail/reference.log b/tests/functional/job-file-trap/02-pipefail/reference.log index 543740b05b2..7afe901c28f 100644 --- a/tests/functional/job-file-trap/02-pipefail/reference.log +++ b/tests/functional/job-file-trap/02-pipefail/reference.log @@ -1,3 +1,3 @@ -2014/01/24 12:25:52 INFO - Initial point: 1 -2014/01/24 12:25:52 INFO - Final point: 1 -2014/01/24 12:25:52 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/job-kill/00-local/flow.cylc b/tests/functional/job-kill/00-local/flow.cylc index 9d962bacd98..9e9f1104afe 100644 --- a/tests/functional/job-kill/00-local/flow.cylc +++ b/tests/functional/job-kill/00-local/flow.cylc @@ -1,26 +1,31 @@ #!Jinja2 [scheduler] [[events]] - expected task failures = t1.1, t2.1, t3.1, t4.1, stop2.1 + expected task failures = 1/t1, 1/t2, 1/t3, 1/t4, 1/stop2 + [scheduling] [[graph]] - R1=""" - t1:start & t2:start => stop1 => - t3:start & t4:start => stop2? - stop2:fail? => shutdown""" + R1 = """ + t1:start & t2:start => stop1 => + t3:start & t4:start => stop2? + stop2:fail? => shutdown + """ + [runtime] [[T]] - script=sleep 120 & echo $! >file; wait + script = sleep 120 & echo $! >file; wait [[t1, t2, t3, t4]] - inherit=T + inherit= T [[stop1]] - script=""" -# Kill t1.1 and t2.1 explicitly. -cylc kill $CYLC_WORKFLOW_ID t1.1 t2.1 || true""" + script = """ + # Kill 1/t1 and 1/t2 explicitly. + cylc kill $CYLC_WORKFLOW_ID// //1/t1 //1/t2 || true + """ [[stop2]] - script=""" -# Kill t3.1, t4.1, and myself! implicitly (kill all active tasks). -cylc kill $CYLC_WORKFLOW_ID || true -sleep 30""" + script = """ + # Kill 1/t3, 1/t4, and myself! implicitly (kill all active tasks). + cylc kill "$CYLC_WORKFLOW_ID//*" || true + sleep 30 + """ [[shutdown]] script = "cylc stop $CYLC_WORKFLOW_ID" diff --git a/tests/functional/job-kill/00-local/reference.log b/tests/functional/job-kill/00-local/reference.log index f10e554c828..fd6d668ffea 100644 --- a/tests/functional/job-kill/00-local/reference.log +++ b/tests/functional/job-kill/00-local/reference.log @@ -1,9 +1,9 @@ -2019-04-10T16:15:32+12:00 INFO - Initial point: 1 -2019-04-10T16:15:32+12:00 INFO - Final point: 1 -2019-04-10T16:15:32+12:00 DEBUG - t2.1 -triggered off [] -2019-04-10T16:15:32+12:00 DEBUG - t1.1 -triggered off [] -2019-04-10T16:15:36+12:00 DEBUG - stop1.1 -triggered off ['t1.1', 't2.1'] -2019-04-10T16:15:39+12:00 DEBUG - t4.1 -triggered off ['stop1.1'] -2019-04-10T16:15:39+12:00 DEBUG - t3.1 -triggered off ['stop1.1'] -2019-04-10T16:15:43+12:00 DEBUG - stop2.1 -triggered off ['t3.1', 't4.1'] -2019-04-10T16:15:46+12:00 DEBUG - shutdown.1 -triggered off ['stop2.1'] +Initial point: 1 +Final point: 1 +1/t2 -triggered off [] +1/t1 -triggered off [] +1/stop1 -triggered off ['1/t1', '1/t2'] +1/t4 -triggered off ['1/stop1'] +1/t3 -triggered off ['1/stop1'] +1/stop2 -triggered off ['1/t3', '1/t4'] +1/shutdown -triggered off ['1/stop2'] diff --git a/tests/functional/job-kill/01-remote/flow.cylc b/tests/functional/job-kill/01-remote/flow.cylc index 39bb35180ee..13a18256d1a 100644 --- a/tests/functional/job-kill/01-remote/flow.cylc +++ b/tests/functional/job-kill/01-remote/flow.cylc @@ -2,7 +2,7 @@ [scheduler] [[events]] - expected task failures = t1.1, t2.1 + expected task failures = 1/t1, 1/t2 [scheduling] [[graph]] @@ -21,6 +21,6 @@ inherit=T [[stop]] script=""" - cylc kill "$CYLC_WORKFLOW_ID" 't1.1' 't2.1' || true + cylc kill "$CYLC_WORKFLOW_ID//" '//1/t1' '//1/t2' || true cylc stop $CYLC_WORKFLOW_ID """ diff --git a/tests/functional/job-kill/01-remote/reference.log b/tests/functional/job-kill/01-remote/reference.log index 1bf41797f8b..70785574d2d 100644 --- a/tests/functional/job-kill/01-remote/reference.log +++ b/tests/functional/job-kill/01-remote/reference.log @@ -1,5 +1,5 @@ -2013/12/18 09:20:57 INFO - Initial point: 1 -2013/12/18 09:20:57 INFO - Final point: 1 -2013/12/18 09:20:57 DEBUG - t2.1 -triggered off [] -2013/12/18 09:20:57 DEBUG - t1.1 -triggered off [] -2013/12/18 09:21:02 DEBUG - stop.1 -triggered off ['t1.1', 't2.1'] +Initial point: 1 +Final point: 1 +1/t2 -triggered off [] +1/t1 -triggered off [] +1/stop -triggered off ['1/t1', '1/t2'] diff --git a/tests/functional/job-kill/02-loadleveler/flow.cylc b/tests/functional/job-kill/02-loadleveler/flow.cylc index 982b9e29965..9696c151f68 100644 --- a/tests/functional/job-kill/02-loadleveler/flow.cylc +++ b/tests/functional/job-kill/02-loadleveler/flow.cylc @@ -2,7 +2,7 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] @@ -22,6 +22,6 @@ wall_clock_limit=180,120 [[stop]] script=""" - cylc kill "$CYLC_WORKFLOW_ID" 't1' + cylc kill "$CYLC_WORKFLOW_ID//*/t1" cylc stop "$CYLC_WORKFLOW_ID" """ diff --git a/tests/functional/job-kill/02-loadleveler/reference.log b/tests/functional/job-kill/02-loadleveler/reference.log index 5344b1b947e..e79eed34a4d 100644 --- a/tests/functional/job-kill/02-loadleveler/reference.log +++ b/tests/functional/job-kill/02-loadleveler/reference.log @@ -1,4 +1,4 @@ -2013/12/18 09:59:04 INFO - Initial point: 1 -2013/12/18 09:59:04 INFO - Final point: 1 -2013/12/18 09:59:04 DEBUG - t1.1 -triggered off [] -2013/12/18 09:59:21 DEBUG - stop.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +t11/ -triggered off [] +1/stop -triggered off ['t11/'] diff --git a/tests/functional/job-kill/03-slurm/flow.cylc b/tests/functional/job-kill/03-slurm/flow.cylc index 3bfbd64a5fb..e1cec3f86f5 100644 --- a/tests/functional/job-kill/03-slurm/flow.cylc +++ b/tests/functional/job-kill/03-slurm/flow.cylc @@ -2,7 +2,7 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] @@ -16,6 +16,6 @@ --time=03:00 [[stop]] script=""" - cylc kill "$CYLC_WORKFLOW_ID" 't1' + cylc kill "$CYLC_WORKFLOW_ID//*/t1" cylc stop "$CYLC_WORKFLOW_ID" """ diff --git a/tests/functional/job-kill/03-slurm/reference.log b/tests/functional/job-kill/03-slurm/reference.log index 5344b1b947e..a3c7a2551ba 100644 --- a/tests/functional/job-kill/03-slurm/reference.log +++ b/tests/functional/job-kill/03-slurm/reference.log @@ -1,4 +1,4 @@ -2013/12/18 09:59:04 INFO - Initial point: 1 -2013/12/18 09:59:04 INFO - Final point: 1 -2013/12/18 09:59:04 DEBUG - t1.1 -triggered off [] -2013/12/18 09:59:21 DEBUG - stop.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/stop -triggered off ['1/t1'] diff --git a/tests/functional/job-kill/04-pbs/flow.cylc b/tests/functional/job-kill/04-pbs/flow.cylc index b7009cb33fe..7760be965f8 100644 --- a/tests/functional/job-kill/04-pbs/flow.cylc +++ b/tests/functional/job-kill/04-pbs/flow.cylc @@ -2,7 +2,7 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] @@ -20,6 +20,6 @@ -l select=1:ncpus=1:mem=15mb [[stop]] script=""" - cylc kill "$CYLC_WORKFLOW_ID" 't1' + cylc kill "$CYLC_WORKFLOW_ID//*/t1" cylc stop "$CYLC_WORKFLOW_ID" """ diff --git a/tests/functional/job-kill/04-pbs/reference.log b/tests/functional/job-kill/04-pbs/reference.log index 5344b1b947e..a3c7a2551ba 100644 --- a/tests/functional/job-kill/04-pbs/reference.log +++ b/tests/functional/job-kill/04-pbs/reference.log @@ -1,4 +1,4 @@ -2013/12/18 09:59:04 INFO - Initial point: 1 -2013/12/18 09:59:04 INFO - Final point: 1 -2013/12/18 09:59:04 DEBUG - t1.1 -triggered off [] -2013/12/18 09:59:21 DEBUG - stop.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/stop -triggered off ['1/t1'] diff --git a/tests/functional/job-submission/00-user/reference.log b/tests/functional/job-submission/00-user/reference.log index f28e3ea63e5..98357b5267c 100644 --- a/tests/functional/job-submission/00-user/reference.log +++ b/tests/functional/job-submission/00-user/reference.log @@ -1,4 +1,4 @@ -2015-12-17T16:00:01+13 INFO - Initial point: 1 -2015-12-17T16:00:01+13 INFO - Final point: 1 -2015-12-17T16:00:01+13 DEBUG - bar.1 -triggered off [] -2015-12-17T16:00:01+13 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/bar -triggered off [] +1/foo -triggered off [] diff --git a/tests/functional/job-submission/01-job-nn-localhost/reference.log b/tests/functional/job-submission/01-job-nn-localhost/reference.log index a5b35a259c9..08fe5d5558a 100644 --- a/tests/functional/job-submission/01-job-nn-localhost/reference.log +++ b/tests/functional/job-submission/01-job-nn-localhost/reference.log @@ -1,3 +1,3 @@ -2014-08-14T20:15:16Z INFO - Initial point: 1 -2014-08-14T20:15:16Z INFO - Final point: 1 -2014-08-14T20:18:56Z DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/job-submission/04-submit-num/flow.cylc b/tests/functional/job-submission/04-submit-num/flow.cylc index ca06d20fcbe..12c8ef6a9dc 100644 --- a/tests/functional/job-submission/04-submit-num/flow.cylc +++ b/tests/functional/job-submission/04-submit-num/flow.cylc @@ -20,7 +20,7 @@ [[[job]]] execution retry delays=2*PT0S [[bar]] - script = cylc trigger "${CYLC_WORKFLOW_ID}" foo.1 + script = cylc trigger "${CYLC_WORKFLOW_ID}//1/foo" [[baz]] script = """ printf "%d\n" {1..4} | cmp - "${CYLC_WORKFLOW_RUN_DIR}/foo-submits.txt" diff --git a/tests/functional/job-submission/06-garbage/flow.cylc b/tests/functional/job-submission/06-garbage/flow.cylc index 0ac517446a2..bf5c4a55e3f 100644 --- a/tests/functional/job-submission/06-garbage/flow.cylc +++ b/tests/functional/job-submission/06-garbage/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] diff --git a/tests/functional/job-submission/06-garbage/reference.log b/tests/functional/job-submission/06-garbage/reference.log index a533abdfc83..c5802d782d2 100644 --- a/tests/functional/job-submission/06-garbage/reference.log +++ b/tests/functional/job-submission/06-garbage/reference.log @@ -1,4 +1,4 @@ -2015-05-05T10:33:27+01 INFO - Initial point: 1 -2015-05-05T10:33:27+01 INFO - Final point: 1 -2015-05-05T10:33:27+01 DEBUG - t1.1 -triggered off [] -2015-05-05T10:33:28+01 DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/job-submission/07-multi/reference.log b/tests/functional/job-submission/07-multi/reference.log index cb78fd9aea9..92b69ac2d63 100644 --- a/tests/functional/job-submission/07-multi/reference.log +++ b/tests/functional/job-submission/07-multi/reference.log @@ -1,44 +1,44 @@ Initial point: 20200101T0000Z Final point: 20250101T0000Z -t5.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t1.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t0.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t2.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t4.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t3.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t6.20200101T0000Z -triggered off ['t0.20190101T0000Z', 't1.20190101T0000Z', 't2.20190101T0000Z', 't3.20190101T0000Z', 't4.20190101T0000Z', 't5.20190101T0000Z', 't6.20190101T0000Z'] -t5.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t1.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t0.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t2.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t4.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t3.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t6.20210101T0000Z -triggered off ['t0.20200101T0000Z', 't1.20200101T0000Z', 't2.20200101T0000Z', 't3.20200101T0000Z', 't4.20200101T0000Z', 't5.20200101T0000Z', 't6.20200101T0000Z'] -t5.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t2.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t3.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t0.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t4.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t1.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t6.20220101T0000Z -triggered off ['t0.20210101T0000Z', 't1.20210101T0000Z', 't2.20210101T0000Z', 't3.20210101T0000Z', 't4.20210101T0000Z', 't5.20210101T0000Z', 't6.20210101T0000Z'] -t2.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t4.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t5.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t1.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t6.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t3.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t0.20230101T0000Z -triggered off ['t0.20220101T0000Z', 't1.20220101T0000Z', 't2.20220101T0000Z', 't3.20220101T0000Z', 't4.20220101T0000Z', 't5.20220101T0000Z', 't6.20220101T0000Z'] -t5.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t0.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t2.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t3.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t6.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t1.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t4.20240101T0000Z -triggered off ['t0.20230101T0000Z', 't1.20230101T0000Z', 't2.20230101T0000Z', 't3.20230101T0000Z', 't4.20230101T0000Z', 't5.20230101T0000Z', 't6.20230101T0000Z'] -t4.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] -t6.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] -t2.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] -t3.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] -t1.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] -t0.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] -t5.20250101T0000Z -triggered off ['t0.20240101T0000Z', 't1.20240101T0000Z', 't2.20240101T0000Z', 't3.20240101T0000Z', 't4.20240101T0000Z', 't5.20240101T0000Z', 't6.20240101T0000Z'] +20200101T0000Z/t5 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20200101T0000Z/t1 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20200101T0000Z/t0 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20200101T0000Z/t2 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20200101T0000Z/t4 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20200101T0000Z/t3 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20200101T0000Z/t6 -triggered off ['20190101T0000Z/t0', '20190101T0000Z/t1', '20190101T0000Z/t2', '20190101T0000Z/t3', '20190101T0000Z/t4', '20190101T0000Z/t5', '20190101T0000Z/t6'] +20210101T0000Z/t5 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20210101T0000Z/t1 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20210101T0000Z/t0 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20210101T0000Z/t2 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20210101T0000Z/t4 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20210101T0000Z/t3 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20210101T0000Z/t6 -triggered off ['20200101T0000Z/t0', '20200101T0000Z/t1', '20200101T0000Z/t2', '20200101T0000Z/t3', '20200101T0000Z/t4', '20200101T0000Z/t5', '20200101T0000Z/t6'] +20220101T0000Z/t5 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20220101T0000Z/t2 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20220101T0000Z/t3 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20220101T0000Z/t0 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20220101T0000Z/t4 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20220101T0000Z/t1 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20220101T0000Z/t6 -triggered off ['20210101T0000Z/t0', '20210101T0000Z/t1', '20210101T0000Z/t2', '20210101T0000Z/t3', '20210101T0000Z/t4', '20210101T0000Z/t5', '20210101T0000Z/t6'] +20230101T0000Z/t2 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20230101T0000Z/t4 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20230101T0000Z/t5 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20230101T0000Z/t1 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20230101T0000Z/t6 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20230101T0000Z/t3 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20230101T0000Z/t0 -triggered off ['20220101T0000Z/t0', '20220101T0000Z/t1', '20220101T0000Z/t2', '20220101T0000Z/t3', '20220101T0000Z/t4', '20220101T0000Z/t5', '20220101T0000Z/t6'] +20240101T0000Z/t5 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20240101T0000Z/t0 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20240101T0000Z/t2 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20240101T0000Z/t3 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20240101T0000Z/t6 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20240101T0000Z/t1 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20240101T0000Z/t4 -triggered off ['20230101T0000Z/t0', '20230101T0000Z/t1', '20230101T0000Z/t2', '20230101T0000Z/t3', '20230101T0000Z/t4', '20230101T0000Z/t5', '20230101T0000Z/t6'] +20250101T0000Z/t4 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] +20250101T0000Z/t6 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] +20250101T0000Z/t2 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] +20250101T0000Z/t3 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] +20250101T0000Z/t1 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] +20250101T0000Z/t0 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] +20250101T0000Z/t5 -triggered off ['20240101T0000Z/t0', '20240101T0000Z/t1', '20240101T0000Z/t2', '20240101T0000Z/t3', '20240101T0000Z/t4', '20240101T0000Z/t5', '20240101T0000Z/t6'] diff --git a/tests/functional/job-submission/08-activity-log-host/flow.cylc b/tests/functional/job-submission/08-activity-log-host/flow.cylc index 4b084710a3e..aa4eeffb3ca 100644 --- a/tests/functional/job-submission/08-activity-log-host/flow.cylc +++ b/tests/functional/job-submission/08-activity-log-host/flow.cylc @@ -4,10 +4,10 @@ UTC mode = True [scheduling] - initial cycle point=1999 - final cycle point=1999 + initial cycle point = 1999 + final cycle point = 1999 [[graph]] - P1Y=sleeper:start => killer => releaser + P1Y = sleeper:start => killer => releaser [runtime] [[sleeper]] @@ -16,6 +16,9 @@ [[[job]]] execution retry delays = PT1S [[killer]] - script = cylc kill "${CYLC_WORKFLOW_ID}" sleeper.1999 + script = cylc kill "${CYLC_WORKFLOW_ID}//1999*/sleeper" [[releaser]] - script = cylc__job__wait_cylc_message_started; cylc release "${CYLC_WORKFLOW_ID}" sleeper.1999 + script = """ + cylc__job__wait_cylc_message_started + cylc release "${CYLC_WORKFLOW_ID}//1999*/sleeper" + """ diff --git a/tests/functional/job-submission/08-activity-log-host/reference.log b/tests/functional/job-submission/08-activity-log-host/reference.log index 1f044328bec..1ecf6c748b2 100644 --- a/tests/functional/job-submission/08-activity-log-host/reference.log +++ b/tests/functional/job-submission/08-activity-log-host/reference.log @@ -1,6 +1,6 @@ -2015-09-02T13:21:42Z INFO - Initial point: 19990101T0000Z -2015-09-02T13:21:42Z INFO - Final point: 19990101T0000Z -2015-09-02T13:21:42Z DEBUG - sleeper.19990101T0000Z -triggered off [] -2015-09-02T13:21:42Z DEBUG - killer.19990101T0000Z -triggered off ['sleeper.19990101T0000Z'] -2015-09-02T13:21:42Z DEBUG - releaser.19990101T0000Z -triggered off ['killer.19990101T0000Z'] -2015-09-02T13:21:42Z DEBUG - sleeper.19990101T0000Z -triggered off [] +Initial point: 19990101T0000Z +Final point: 19990101T0000Z +19990101T0000Z/sleeper -triggered off [] +19990101T0000Z/killer -triggered off ['19990101T0000Z/sleeper'] +19990101T0000Z/releaser -triggered off ['19990101T0000Z/killer'] +19990101T0000Z/sleeper -triggered off [] diff --git a/tests/functional/job-submission/09-activity-log-host-bad-submit/flow.cylc b/tests/functional/job-submission/09-activity-log-host-bad-submit/flow.cylc index 7c8ed2af672..0a5bdb05b60 100644 --- a/tests/functional/job-submission/09-activity-log-host-bad-submit/flow.cylc +++ b/tests/functional/job-submission/09-activity-log-host-bad-submit/flow.cylc @@ -3,7 +3,7 @@ [scheduler] UTC mode = True [[events]] - expected task failures = bad-submitter.19990101T0000Z + expected task failures = 19990101T0000Z/bad-submitter [scheduling] initial cycle point=1999 diff --git a/tests/functional/job-submission/09-activity-log-host-bad-submit/reference.log b/tests/functional/job-submission/09-activity-log-host-bad-submit/reference.log index 9cd653ce08a..dad45b45f31 100644 --- a/tests/functional/job-submission/09-activity-log-host-bad-submit/reference.log +++ b/tests/functional/job-submission/09-activity-log-host-bad-submit/reference.log @@ -1,4 +1,4 @@ -2016-02-16T12:58:29Z INFO - Initial point: 19990101T0000Z -2016-02-16T12:58:29Z INFO - Final point: 19990101T0000Z -2016-02-16T12:58:29Z DEBUG - bad-submitter.19990101T0000Z -triggered off [] -2016-02-16T12:58:30Z DEBUG - grepper.19990101T0000Z -triggered off ['bad-submitter.19990101T0000Z'] +Initial point: 19990101T0000Z +Final point: 19990101T0000Z +19990101T0000Z/bad-submitter -triggered off [] +19990101T0000Z/grepper -triggered off ['19990101T0000Z/bad-submitter'] diff --git a/tests/functional/job-submission/10-at-shell/reference.log b/tests/functional/job-submission/10-at-shell/reference.log index 4f25c730785..08fe5d5558a 100644 --- a/tests/functional/job-submission/10-at-shell/reference.log +++ b/tests/functional/job-submission/10-at-shell/reference.log @@ -1,3 +1,3 @@ -2015-12-17T16:00:01+13 INFO - Initial point: 1 -2015-12-17T16:00:01+13 INFO - Final point: 1 -2015-12-17T16:00:01+13 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/job-submission/11-garbage-platform-command/flow.cylc b/tests/functional/job-submission/11-garbage-platform-command/flow.cylc index f2b633c81ed..1955c1e81ad 100644 --- a/tests/functional/job-submission/11-garbage-platform-command/flow.cylc +++ b/tests/functional/job-submission/11-garbage-platform-command/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] @@ -14,5 +14,5 @@ script = """ cylc broadcast "${CYLC_WORKFLOW_ID}" \ -n 't1' -p '1' -s 'platform=localhost' - cylc trigger "${CYLC_WORKFLOW_ID}" 't1.1' + cylc trigger "${CYLC_WORKFLOW_ID}//1/t1" """ diff --git a/tests/functional/job-submission/11-garbage-platform-command/reference.log b/tests/functional/job-submission/11-garbage-platform-command/reference.log index a8e722a5633..e8f23b4fb95 100644 --- a/tests/functional/job-submission/11-garbage-platform-command/reference.log +++ b/tests/functional/job-submission/11-garbage-platform-command/reference.log @@ -1,5 +1,5 @@ -2015-05-05T10:33:27+01 INFO - Initial point: 1 -2015-05-05T10:33:27+01 INFO - Final point: 1 -2015-05-05T10:33:27+01 DEBUG - t1.1 -triggered off [] -2015-05-05T10:33:28+01 DEBUG - t2.1 -triggered off ['t1.1'] -2015-05-05T10:33:27+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] +1/t1 -triggered off [] diff --git a/tests/functional/job-submission/12-tidy-submits-of-prev-run/reference.log b/tests/functional/job-submission/12-tidy-submits-of-prev-run/reference.log index a4f6920c939..b04faad5885 100644 --- a/tests/functional/job-submission/12-tidy-submits-of-prev-run/reference.log +++ b/tests/functional/job-submission/12-tidy-submits-of-prev-run/reference.log @@ -1,4 +1,4 @@ -2015-05-05T10:33:27+01 INFO - Initial point: 1 -2015-05-05T10:33:27+01 INFO - Final point: 1 -2015-05-05T10:33:27+01 DEBUG - t1.1 -triggered off [] -2015-05-05T10:33:27+01 DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t1 -triggered off [] diff --git a/tests/functional/job-submission/15-garbage-platform-command-2/reference.log b/tests/functional/job-submission/15-garbage-platform-command-2/reference.log index 997a46467ec..38abe30ecf2 100644 --- a/tests/functional/job-submission/15-garbage-platform-command-2/reference.log +++ b/tests/functional/job-submission/15-garbage-platform-command-2/reference.log @@ -1,12 +1,12 @@ -2018-02-23T15:03:50Z INFO - Initial point: 1 -2018-02-23T15:03:50Z INFO - Final point: 1 -2018-02-23T15:03:51Z DEBUG - foo_i3.1 -triggered off [] -2018-02-23T15:03:51Z DEBUG - foo_i1.1 -triggered off [] -2018-02-23T15:03:51Z DEBUG - foo_i4.1 -triggered off [] -2018-02-23T15:03:51Z DEBUG - foo_i2.1 -triggered off [] -2018-02-23T15:03:51Z DEBUG - foo_i5.1 -triggered off [] -2018-02-23T15:04:53Z DEBUG - foo_i3.1 -triggered off [] -2018-02-23T15:04:53Z DEBUG - foo_i1.1 -triggered off [] -2018-02-23T15:04:53Z DEBUG - foo_i4.1 -triggered off [] -2018-02-23T15:04:53Z DEBUG - foo_i2.1 -triggered off [] -2018-02-23T15:04:53Z DEBUG - foo_i5.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo_i3 -triggered off [] +1/foo_i1 -triggered off [] +1/foo_i4 -triggered off [] +1/foo_i2 -triggered off [] +1/foo_i5 -triggered off [] +1/foo_i3 -triggered off [] +1/foo_i1 -triggered off [] +1/foo_i4 -triggered off [] +1/foo_i2 -triggered off [] +1/foo_i5 -triggered off [] diff --git a/tests/functional/job-submission/17-remote-localtime/reference.log b/tests/functional/job-submission/17-remote-localtime/reference.log index f95f3c71849..7afe901c28f 100644 --- a/tests/functional/job-submission/17-remote-localtime/reference.log +++ b/tests/functional/job-submission/17-remote-localtime/reference.log @@ -1,3 +1,3 @@ -2014-08-14T20:15:16Z INFO - Initial point: 1 -2014-08-14T20:15:16Z INFO - Final point: 1 -2014-08-14T20:15:16Z DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/job-submission/18-clean-env.t b/tests/functional/job-submission/18-clean-env.t index f57aa2bbf5c..a4802e602ed 100755 --- a/tests/functional/job-submission/18-clean-env.t +++ b/tests/functional/job-submission/18-clean-env.t @@ -37,7 +37,7 @@ export BEEF=wellington export CHEESE=melted workflow_run_ok "${TEST_NAME_BASE}-run" \ cylc play --debug --no-detach "${WORKFLOW_NAME}" -cylc cat-log "${WORKFLOW_NAME}" foo.1 > job.out +cylc cat-log "${WORKFLOW_NAME}//1/foo" > job.out grep_ok "BEEF wellington" job.out grep_ok "CHEESE undefined" job.out diff --git a/tests/functional/job-submission/19-platform_select.t b/tests/functional/job-submission/19-platform_select.t index 6f8a4787028..ece4e8d78ac 100755 --- a/tests/functional/job-submission/19-platform_select.t +++ b/tests/functional/job-submission/19-platform_select.t @@ -36,17 +36,17 @@ logfile="${WORKFLOW_RUN_DIR}/log/workflow/log" # Check that host = $(hostname) is correctly evaluated grep_ok \ - "platform_subshell\.1.*evaluated as improbable platform name" \ + "1/platform_subshell.*evaluated as improbable platform name" \ "${logfile}" # Check that host = `hostname` is correctly evaluated grep_ok \ - "host_subshell_backticks\.1.*\`hostname\` evaluated as localhost" \ + "1/host_subshell_backticks.*\`hostname\` evaluated as localhost" \ "${logfile}" # Check that platform = $(echo "improbable platform name") correctly evaluated grep_ok \ - "platform_subshell\.1.*evaluated as improbable platform name" \ + "1/platform_subshell.*evaluated as improbable platform name" \ "${logfile}" purge diff --git a/tests/functional/job-submission/19-platform_select/flow.cylc b/tests/functional/job-submission/19-platform_select/flow.cylc index f18ba42bd9c..0775447321c 100644 --- a/tests/functional/job-submission/19-platform_select/flow.cylc +++ b/tests/functional/job-submission/19-platform_select/flow.cylc @@ -43,4 +43,4 @@ purpose = """ host = `hostname` [[fin]] - script = cylc remove ${CYLC_SUITE_NAME} platform_* + script = cylc remove "${CYLC_SUITE_NAME}//1/platform_*" diff --git a/tests/functional/job-submission/20-check-chunking/reference.log b/tests/functional/job-submission/20-check-chunking/reference.log index 6fc99c9d212..3258ff3580b 100644 --- a/tests/functional/job-submission/20-check-chunking/reference.log +++ b/tests/functional/job-submission/20-check-chunking/reference.log @@ -1,8 +1,8 @@ Initial point: 1 Final point: 1 -t1_p3.1 -triggered off [] -t1_p4.1 -triggered off [] -t1_p2.1 -triggered off [] -t1_p5.1 -triggered off [] -t1_p1.1 -triggered off [] -fin.1 -triggered off ['t1_p1.1', 't1_p2.1', 't1_p3.1', 't1_p4.1', 't1_p5.1'] +1/t1_p3 -triggered off [] +1/t1_p4 -triggered off [] +1/t1_p2 -triggered off [] +1/t1_p5 -triggered off [] +1/t1_p1 -triggered off [] +1/fin -triggered off ['1/t1_p1', '1/t1_p2', '1/t1_p3', '1/t1_p4', '1/t1_p5'] diff --git a/tests/functional/jobscript/00-torture/reference.log b/tests/functional/jobscript/00-torture/reference.log index a640543c5dd..08fe5d5558a 100644 --- a/tests/functional/jobscript/00-torture/reference.log +++ b/tests/functional/jobscript/00-torture/reference.log @@ -1,3 +1,3 @@ -2012/08/23 14:34:52 INFO - Initial point: 1 -2012/08/23 14:34:52 INFO - Final point: 1 -2012/08/23 14:34:52 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/lib/bash/test_header b/tests/functional/lib/bash/test_header index 24e4daa5780..f4a2ae76ea4 100644 --- a/tests/functional/lib/bash/test_header +++ b/tests/functional/lib/bash/test_header @@ -467,11 +467,17 @@ graph_workflow() { >"${OUTPUT_FILE}" 2>"${OUTPUT_FILE}".err } +workflow_id() { + local TEST_NAME="${1:-${TEST_NAME_BASE}}" + local TEST_SOURCE_BASE="${2:-${TEST_NAME}}" + echo "${CYLC_TEST_REG_BASE}/${TEST_SOURCE_DIR_BASE}/${TEST_NAME}" +} + init_workflow() { local TEST_NAME="$1" local FLOW_CONFIG="${2:--}" local RUN_NUMS="${3:-false}" - WORKFLOW_NAME="${CYLC_TEST_REG_BASE}/${TEST_SOURCE_DIR_BASE}/${TEST_NAME}" + WORKFLOW_NAME="$(workflow_id "${TEST_NAME}")" WORKFLOW_RUN_DIR="${RUN_DIR}/${WORKFLOW_NAME}" mkdir -p "${TEST_DIR}/${WORKFLOW_NAME}/" cat "${FLOW_CONFIG}" >"${TEST_DIR}/${WORKFLOW_NAME}/flow.cylc" @@ -486,7 +492,7 @@ init_workflow() { install_workflow() { local TEST_NAME="${1:-${TEST_NAME_BASE}}" local TEST_SOURCE_BASE="${2:-${TEST_NAME}}" - WORKFLOW_NAME="${CYLC_TEST_REG_BASE}/${TEST_SOURCE_DIR_BASE}/${TEST_NAME}" + WORKFLOW_NAME="$(workflow_id "${TEST_NAME}" "${TEST_SOURCE_BASE}")" WORKFLOW_RUN_DIR="${RUN_DIR}/${WORKFLOW_NAME}" mkdir -p "${TEST_DIR}/${WORKFLOW_NAME}/" # make source dir cp -r "${TEST_SOURCE_DIR}/${TEST_SOURCE_BASE}/"* "${TEST_DIR}/${WORKFLOW_NAME}/" @@ -548,6 +554,8 @@ log_scan () { make_rnd_workflow() { # Create a randomly-named workflow source directory. # Define its run directory. + # TODO: export a WORKFLOW_NAME variable so tests can get cylc-install + # to install under the regular test hierarchy RND_WORKFLOW_NAME="cylctb-x$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6)" RND_WORKFLOW_SOURCE="$PWD/${RND_WORKFLOW_NAME}" mkdir -p "${RND_WORKFLOW_SOURCE}" @@ -832,6 +840,8 @@ create_test_global_config() { stall timeout = PT5M abort on inactivity timeout = true abort on workflow timeout = true + [install] + max depth = 5 __HERE__ # add global-tests.cylc USER_TESTS_CONF_FILE="$(_get_test_config_file)" diff --git a/tests/functional/message-triggers/00-basic/reference.log b/tests/functional/message-triggers/00-basic/reference.log index 19256b1a2e9..ec481750edf 100644 --- a/tests/functional/message-triggers/00-basic/reference.log +++ b/tests/functional/message-triggers/00-basic/reference.log @@ -1,11 +1,11 @@ Initial point: 20140801T0000Z Final point: 20141201T0000Z -baz.20140801T0000Z -triggered off ['foo.20140601T0000Z'] -foo.20140801T0000Z -triggered off [] -foo.20141001T0000Z -triggered off [] -bar.20140801T0000Z -triggered off ['foo.20140801T0000Z'] -foo.20141201T0000Z -triggered off [] -baz.20141001T0000Z -triggered off ['foo.20140801T0000Z'] -bar.20141001T0000Z -triggered off ['foo.20141001T0000Z'] -baz.20141201T0000Z -triggered off ['foo.20141001T0000Z'] -bar.20141201T0000Z -triggered off ['foo.20141201T0000Z'] +20140801T0000Z/baz -triggered off ['20140601T0000Z/foo'] +20140801T0000Z/foo -triggered off [] +20141001T0000Z/foo -triggered off [] +20140801T0000Z/bar -triggered off ['20140801T0000Z/foo'] +20141201T0000Z/foo -triggered off [] +20141001T0000Z/baz -triggered off ['20140801T0000Z/foo'] +20141001T0000Z/bar -triggered off ['20141001T0000Z/foo'] +20141201T0000Z/baz -triggered off ['20141001T0000Z/foo'] +20141201T0000Z/bar -triggered off ['20141201T0000Z/foo'] diff --git a/tests/functional/modes/01-dummy/flow.cylc b/tests/functional/modes/01-dummy/flow.cylc index 7cf2a310d98..dd37c83c7dc 100644 --- a/tests/functional/modes/01-dummy/flow.cylc +++ b/tests/functional/modes/01-dummy/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = a.1, b.1, c.1 + expected task failures = 1/a, 1/b, 1/c [scheduling] [[graph]] R1 = """a:fail? => b? diff --git a/tests/functional/modes/01-dummy/reference.log b/tests/functional/modes/01-dummy/reference.log index 3f7ff94c142..ade8b593f7f 100644 --- a/tests/functional/modes/01-dummy/reference.log +++ b/tests/functional/modes/01-dummy/reference.log @@ -1,5 +1,5 @@ -2013/09/18 14:50:46 INFO - Initial point: 1 -2013/09/18 14:50:47 INFO - Final point: 1 -2013/09/18 14:50:52 DEBUG - a.1 -triggered off [] -2013/09/18 15:09:09 DEBUG - b.1 -triggered off ['a.1'] -2013/09/18 15:21:34 DEBUG - c.1 -triggered off ['b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] diff --git a/tests/functional/modes/02-dummy-message-outputs/reference.log b/tests/functional/modes/02-dummy-message-outputs/reference.log index a059536d2f4..1a9f846c98d 100644 --- a/tests/functional/modes/02-dummy-message-outputs/reference.log +++ b/tests/functional/modes/02-dummy-message-outputs/reference.log @@ -1,4 +1,4 @@ -2016-06-21T00:17:00Z INFO - Initial point: 1 -2016-06-21T00:17:00Z INFO - Final point: 1 -2016-06-21T00:17:00Z DEBUG - foo.1 -triggered off [] -2016-06-21T00:17:16Z DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/offset/00-final-simple/reference.log b/tests/functional/offset/00-final-simple/reference.log index a1e822fc17e..9d74ac30954 100644 --- a/tests/functional/offset/00-final-simple/reference.log +++ b/tests/functional/offset/00-final-simple/reference.log @@ -1,8 +1,8 @@ Initial point: 20100101T0000+01 Final point: 20100106T0000+01 -foo.20100101T0000+01 -triggered off ['foo.20091231T0000+01'] -foo.20100102T0000+01 -triggered off ['foo.20100101T0000+01'] -foo.20100103T0000+01 -triggered off ['foo.20100102T0000+01'] -foo.20100104T0000+01 -triggered off ['foo.20100103T0000+01'] -foo.20100105T0000+01 -triggered off ['foo.20100104T0000+01'] -foo.20100106T0000+01 -triggered off ['foo.20100105T0000+01'] +20100101T0000+01/foo -triggered off ['20091231T0000+01/foo'] +20100102T0000+01/foo -triggered off ['20100101T0000+01/foo'] +20100103T0000+01/foo -triggered off ['20100102T0000+01/foo'] +20100104T0000+01/foo -triggered off ['20100103T0000+01/foo'] +20100105T0000+01/foo -triggered off ['20100104T0000+01/foo'] +20100106T0000+01/foo -triggered off ['20100105T0000+01/foo'] diff --git a/tests/functional/offset/01-final-next/reference.log b/tests/functional/offset/01-final-next/reference.log index 7ecae48ade2..de687166a2e 100644 --- a/tests/functional/offset/01-final-next/reference.log +++ b/tests/functional/offset/01-final-next/reference.log @@ -1,4 +1,4 @@ Initial point: 20100101T0000+01 Final point: 20100101T0600+01 -foo.20100101T0000+01 -triggered off ['foo.20091231T1800+01'] -foo.20100101T0600+01 -triggered off ['foo.20100101T0000+01'] +20100101T0000+01/foo -triggered off ['20091231T1800+01/foo'] +20100101T0600+01/foo -triggered off ['20100101T0000+01/foo'] diff --git a/tests/functional/offset/02-final-chain/reference.log b/tests/functional/offset/02-final-chain/reference.log index 6e44ae7933f..6752ca7a65c 100644 --- a/tests/functional/offset/02-final-chain/reference.log +++ b/tests/functional/offset/02-final-chain/reference.log @@ -1,8 +1,8 @@ Initial point: 20100101T0000+01 Final point: 20100102T0600+01 -foo.20100101T0000+01 -triggered off ['foo.20091231T1800+01'] -foo.20100101T0600+01 -triggered off ['foo.20100101T0000+01'] -foo.20100101T1200+01 -triggered off ['foo.20100101T0600+01'] -foo.20100101T1800+01 -triggered off ['foo.20100101T1200+01'] -foo.20100102T0000+01 -triggered off ['foo.20100101T1800+01'] -foo.20100102T0600+01 -triggered off ['foo.20100102T0000+01'] +20100101T0000+01/foo -triggered off ['20091231T1800+01/foo'] +20100101T0600+01/foo -triggered off ['20100101T0000+01/foo'] +20100101T1200+01/foo -triggered off ['20100101T0600+01/foo'] +20100101T1800+01/foo -triggered off ['20100101T1200+01/foo'] +20100102T0000+01/foo -triggered off ['20100101T1800+01/foo'] +20100102T0600+01/foo -triggered off ['20100102T0000+01/foo'] diff --git a/tests/functional/offset/03-final-next-chain/reference.log b/tests/functional/offset/03-final-next-chain/reference.log index d75c55ddb9f..3674ab28829 100644 --- a/tests/functional/offset/03-final-next-chain/reference.log +++ b/tests/functional/offset/03-final-next-chain/reference.log @@ -1,5 +1,5 @@ Initial point: 20100101T0000+01 Final point: 20100101T1200+01 -foo.20100101T0000+01 -triggered off ['foo.20091231T1800+01'] -foo.20100101T0600+01 -triggered off ['foo.20100101T0000+01'] -foo.20100101T1200+01 -triggered off ['foo.20100101T0600+01'] +20100101T0000+01/foo -triggered off ['20091231T1800+01/foo'] +20100101T0600+01/foo -triggered off ['20100101T0000+01/foo'] +20100101T1200+01/foo -triggered off ['20100101T0600+01/foo'] diff --git a/tests/functional/offset/04-cycle-offset-chain/reference.log b/tests/functional/offset/04-cycle-offset-chain/reference.log index d75c55ddb9f..3674ab28829 100644 --- a/tests/functional/offset/04-cycle-offset-chain/reference.log +++ b/tests/functional/offset/04-cycle-offset-chain/reference.log @@ -1,5 +1,5 @@ Initial point: 20100101T0000+01 Final point: 20100101T1200+01 -foo.20100101T0000+01 -triggered off ['foo.20091231T1800+01'] -foo.20100101T0600+01 -triggered off ['foo.20100101T0000+01'] -foo.20100101T1200+01 -triggered off ['foo.20100101T0600+01'] +20100101T0000+01/foo -triggered off ['20091231T1800+01/foo'] +20100101T0600+01/foo -triggered off ['20100101T0000+01/foo'] +20100101T1200+01/foo -triggered off ['20100101T0600+01/foo'] diff --git a/tests/functional/offset/05-long-final-chain/reference.log b/tests/functional/offset/05-long-final-chain/reference.log index d19a35632df..27e979297ed 100644 --- a/tests/functional/offset/05-long-final-chain/reference.log +++ b/tests/functional/offset/05-long-final-chain/reference.log @@ -1,9 +1,9 @@ Initial point: 20100101T0000+01 Final point: 20100102T1200+01 -foo.20100101T0000+01 -triggered off ['foo.20091231T1800+01'] -foo.20100101T0600+01 -triggered off ['foo.20100101T0000+01'] -foo.20100101T1200+01 -triggered off ['foo.20100101T0600+01'] -foo.20100101T1800+01 -triggered off ['foo.20100101T1200+01'] -foo.20100102T0000+01 -triggered off ['foo.20100101T1800+01'] -foo.20100102T0600+01 -triggered off ['foo.20100102T0000+01'] -foo.20100102T1200+01 -triggered off ['foo.20100102T0600+01'] +20100101T0000+01/foo -triggered off ['20091231T1800+01/foo'] +20100101T0600+01/foo -triggered off ['20100101T0000+01/foo'] +20100101T1200+01/foo -triggered off ['20100101T0600+01/foo'] +20100101T1800+01/foo -triggered off ['20100101T1200+01/foo'] +20100102T0000+01/foo -triggered off ['20100101T1800+01/foo'] +20100102T0600+01/foo -triggered off ['20100102T0000+01/foo'] +20100102T1200+01/foo -triggered off ['20100102T0600+01/foo'] diff --git a/tests/functional/optional-outputs/00-stall-on-partial.t b/tests/functional/optional-outputs/00-stall-on-partial.t index 56cc5a69375..ac5be3c3299 100644 --- a/tests/functional/optional-outputs/00-stall-on-partial.t +++ b/tests/functional/optional-outputs/00-stall-on-partial.t @@ -29,7 +29,7 @@ workflow_run_fail "${TEST_NAME_BASE}-run" \ LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" grep_ok "Unsatisfied prerequisites" "${LOG}" -grep_ok "bar\.1 is waiting on \['foo\.1:y'\]" "${LOG}" +grep_ok "1/bar is waiting on \['1/foo:y'\]" "${LOG}" grep_ok "Workflow stalled" "${LOG}" purge diff --git a/tests/functional/optional-outputs/00-stall-on-partial/reference.log b/tests/functional/optional-outputs/00-stall-on-partial/reference.log index 9ca1c1c7e49..9d540a69254 100644 --- a/tests/functional/optional-outputs/00-stall-on-partial/reference.log +++ b/tests/functional/optional-outputs/00-stall-on-partial/reference.log @@ -1,3 +1,3 @@ Initial point: 1 Final point: None -foo.1 -triggered off [] +1/foo -triggered off [] diff --git a/tests/functional/optional-outputs/01-stall-on-incomplete.t b/tests/functional/optional-outputs/01-stall-on-incomplete.t index f16e9f7351a..5b6cd623973 100644 --- a/tests/functional/optional-outputs/01-stall-on-incomplete.t +++ b/tests/functional/optional-outputs/01-stall-on-incomplete.t @@ -30,7 +30,7 @@ workflow_run_fail "${TEST_NAME_BASE}-run" \ LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" grep_ok "Incomplete tasks" "${LOG}" -grep_ok "foo\.1 did not complete required outputs: \['y'\]" "${LOG}" +grep_ok "1/foo did not complete required outputs: \['y'\]" "${LOG}" grep_ok "Workflow stalled" "${LOG}" purge diff --git a/tests/functional/optional-outputs/01-stall-on-incomplete/reference.log b/tests/functional/optional-outputs/01-stall-on-incomplete/reference.log index 9ca1c1c7e49..9d540a69254 100644 --- a/tests/functional/optional-outputs/01-stall-on-incomplete/reference.log +++ b/tests/functional/optional-outputs/01-stall-on-incomplete/reference.log @@ -1,3 +1,3 @@ Initial point: 1 Final point: None -foo.1 -triggered off [] +1/foo -triggered off [] diff --git a/tests/functional/optional-outputs/02-no-stall-on-optional/reference.log b/tests/functional/optional-outputs/02-no-stall-on-optional/reference.log index 2806ef65e6e..83020f658fc 100644 --- a/tests/functional/optional-outputs/02-no-stall-on-optional/reference.log +++ b/tests/functional/optional-outputs/02-no-stall-on-optional/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 2 -foo.1 -triggered off [] -foo.2 -triggered off [] +1/foo -triggered off [] +2/foo -triggered off [] diff --git a/tests/functional/optional-outputs/03-c7backcompat/reference.log b/tests/functional/optional-outputs/03-c7backcompat/reference.log index 1f455427830..1a9f846c98d 100644 --- a/tests/functional/optional-outputs/03-c7backcompat/reference.log +++ b/tests/functional/optional-outputs/03-c7backcompat/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -bar.1 -triggered off ['foo.1'] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/optional-outputs/04-c7backcompat-blocked-task.t b/tests/functional/optional-outputs/04-c7backcompat-blocked-task.t index e089286b95e..d62f83ce476 100644 --- a/tests/functional/optional-outputs/04-c7backcompat-blocked-task.t +++ b/tests/functional/optional-outputs/04-c7backcompat-blocked-task.t @@ -40,7 +40,7 @@ workflow_run_fail "${TEST_NAME_BASE}-run" \ grep_workflow_log_ok grep-1 "WARNING - Unsatisfied prerequisites" grep_workflow_log_ok grep-2 "Workflow stalled" -grep_workflow_log_ok grep-3 "bar\.1 is waiting on \['foo\.1:x'\]" +grep_workflow_log_ok grep-3 "1/bar is waiting on \['1/foo:x'\]" grep_workflow_log_ok grep-4 'Workflow shutting down \- "abort on stall timeout" is set' purge diff --git a/tests/functional/optional-outputs/05-c7backcompat-blocked-task-2.t b/tests/functional/optional-outputs/05-c7backcompat-blocked-task-2.t index 90c2116baac..a914d6504e0 100644 --- a/tests/functional/optional-outputs/05-c7backcompat-blocked-task-2.t +++ b/tests/functional/optional-outputs/05-c7backcompat-blocked-task-2.t @@ -40,7 +40,7 @@ workflow_run_fail "${TEST_NAME_BASE}-run" \ grep_workflow_log_ok grep-1 "WARNING - Unsatisfied prerequisites" grep_workflow_log_ok grep-2 "Workflow stalled" -grep_workflow_log_ok grep-3 "baz\.1 is waiting on" +grep_workflow_log_ok grep-3 "1/baz is waiting on" grep_workflow_log_ok grep-4 'Workflow shutting down \- "abort on stall timeout" is set' purge diff --git a/tests/functional/optional-outputs/06-c7backcompat-family.t b/tests/functional/optional-outputs/06-c7backcompat-family.t index 4c6b852fe00..026917b75f7 100644 --- a/tests/functional/optional-outputs/06-c7backcompat-family.t +++ b/tests/functional/optional-outputs/06-c7backcompat-family.t @@ -40,12 +40,12 @@ workflow_run_fail "${TEST_NAME_BASE}-run" \ grep_workflow_log_ok grep-1 "Workflow stalled" grep_workflow_log_ok grep-2 "WARNING - Unsatisfied prerequisites" -grep_workflow_log_ok grep-3 "stall01\.1 is waiting on" -grep_workflow_log_ok grep-4 "stall02\.1 is waiting on" -grep_workflow_log_ok grep-5 "stall03\.1 is waiting on" -grep_workflow_log_ok grep-6 "stall04\.1 is waiting on" -grep_workflow_log_ok grep-7 "stall05\.1 is waiting on" -grep_workflow_log_ok grep-8 "stall06\.1 is waiting on" +grep_workflow_log_ok grep-3 "1/stall01 is waiting on" +grep_workflow_log_ok grep-4 "1/stall02 is waiting on" +grep_workflow_log_ok grep-5 "1/stall03 is waiting on" +grep_workflow_log_ok grep-6 "1/stall04 is waiting on" +grep_workflow_log_ok grep-7 "1/stall05 is waiting on" +grep_workflow_log_ok grep-8 "1/stall06 is waiting on" grep_workflow_log_ok grep-9 'Workflow shutting down \- "abort on stall timeout" is set' purge diff --git a/tests/functional/param_expand/01-basic.t b/tests/functional/param_expand/01-basic.t index e1aee262e11..20c06d5a3b9 100644 --- a/tests/functional/param_expand/01-basic.t +++ b/tests/functional/param_expand/01-basic.t @@ -38,8 +38,8 @@ qux => waz [[qux]] [[waz]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-01" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'01.graph' +run_ok "${TEST_NAME_BASE}-01" cylc validate . +cylc graph --reference . >'01.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/01.graph.ref" '01.graph' cat >'flow.cylc' <<'__WORKFLOW__' @@ -56,8 +56,8 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-02" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'02.graph' +run_ok "${TEST_NAME_BASE}-02" cylc validate . +cylc graph --reference . >'02.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/02.graph.ref" '02.graph' cat >'flow.cylc' <<'__WORKFLOW__' @@ -74,8 +74,8 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-03" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'03.graph' +run_ok "${TEST_NAME_BASE}-03" cylc validate . +cylc graph --reference . >'03.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/03.graph.ref" '03.graph' cat >'flow.cylc' <<'__WORKFLOW__' @@ -92,8 +92,8 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-04" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'04.graph' +run_ok "${TEST_NAME_BASE}-04" cylc validate . +cylc graph --reference . >'04.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/04.graph.ref" '04.graph' cat >'flow.cylc' <<'__WORKFLOW__' @@ -110,7 +110,7 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_fail "${TEST_NAME_BASE}-05" cylc validate "flow.cylc" +run_fail "${TEST_NAME_BASE}-05" cylc validate . cmp_ok "${TEST_NAME_BASE}-05.stderr" <<'__ERR__' IllegalValueError: (type=parameter) [task parameters]i = space is dangerous - (space is dangerous: bad value) __ERR__ @@ -129,7 +129,7 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_fail "${TEST_NAME_BASE}-06" cylc validate "flow.cylc" +run_fail "${TEST_NAME_BASE}-06" cylc validate . cmp_ok "${TEST_NAME_BASE}-06.stderr" <<'__ERR__' IllegalValueError: (type=parameter) [task parameters]i = mix, 1..10 - (mixing int range and str) __ERR__ @@ -148,8 +148,8 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-07" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'07.graph' +run_ok "${TEST_NAME_BASE}-07" cylc validate . +cylc graph --reference . >'07.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/07.graph.ref" '07.graph' cat >'flow.cylc' <<'__WORKFLOW__' @@ -166,7 +166,7 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_fail "${TEST_NAME_BASE}-08" cylc validate "flow.cylc" +run_fail "${TEST_NAME_BASE}-08" cylc validate . cmp_ok "${TEST_NAME_BASE}-08.stderr" <<'__ERR__' IllegalValueError: (type=parameter) [task parameters]i = 1..2 3..4 - (1..2 3..4: bad value) __ERR__ @@ -185,7 +185,7 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_fail "${TEST_NAME_BASE}-09" cylc validate "flow.cylc" +run_fail "${TEST_NAME_BASE}-09" cylc validate . cmp_ok "${TEST_NAME_BASE}-09.stderr" <<'__ERR__' ParamExpandError: parameter i is not defined in foo __ERR__ @@ -202,7 +202,7 @@ foo => bar [[foo]] [[bar]] __WORKFLOW__ -run_fail "${TEST_NAME_BASE}-10" cylc validate "flow.cylc" +run_fail "${TEST_NAME_BASE}-10" cylc validate . cmp_ok "${TEST_NAME_BASE}-10.stderr" <<'__ERR__' ParamExpandError: parameter i is not defined in : foo=>bar __ERR__ @@ -221,8 +221,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[foo]] [[bar]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-11" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'11.graph' +run_ok "${TEST_NAME_BASE}-11" cylc validate . +cylc graph --reference . >'11.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/11.graph.ref" '11.graph' cat >'flow.cylc' <<'__WORKFLOW__' @@ -239,8 +239,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[foo]] [[bar]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-12" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'12.graph' +run_ok "${TEST_NAME_BASE}-12" cylc validate . +cylc graph --reference . >'12.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/12.graph.ref" '12.graph' # Parameter with various meta characters @@ -258,8 +258,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[foo

]] [[bar

]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-13" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'13.graph' +run_ok "${TEST_NAME_BASE}-13" cylc validate . +cylc graph --reference . >'13.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/13.graph.ref" '13.graph' # Parameter as task name @@ -280,8 +280,8 @@ foo => => bar [[foo, bar, , ]] script = true __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-14" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'14.graph' +run_ok "${TEST_NAME_BASE}-14" cylc validate . +cylc graph --reference . >'14.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/14.graph.ref" '14.graph' # Parameter in middle of family name @@ -297,8 +297,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[xy]] inherit = XY __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-15" cylc validate "flow.cylc" -cylc graph --reference --group="" 'flow.cylc' >'15.graph' +run_ok "${TEST_NAME_BASE}-15" cylc validate . +cylc graph --reference --group="" . >'15.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/15.graph.ref" '15.graph' # -ve offset on RHS @@ -313,8 +313,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' script = true [[foo]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-16" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'16.graph' +run_ok "${TEST_NAME_BASE}-16" cylc validate . +cylc graph --reference . >'16.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/16.graph.ref" '16.graph' # +ve offset @@ -329,8 +329,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' script = true [[foo]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-17" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'17.graph' +run_ok "${TEST_NAME_BASE}-17" cylc validate . +cylc graph --reference . >'17.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/17.graph.ref" '17.graph' # Negative integers @@ -345,8 +345,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' script = true [[foo]] __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-18" cylc validate "flow.cylc" -cylc graph --reference 'flow.cylc' >'18.graph' +run_ok "${TEST_NAME_BASE}-18" cylc validate . +cylc graph --reference . >'18.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/18.graph.ref" '18.graph' # Reference by value, with -+ meta characters @@ -368,13 +368,13 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[[environment]]] FC = gfortran __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-19" cylc validate --debug "flow.cylc" -cylc graph --reference 'flow.cylc' >'19.graph' +run_ok "${TEST_NAME_BASE}-19" cylc validate --debug . +cylc graph --reference . >'19.graph' cmp_ok "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/19.graph.ref" '19.graph' # Note: This also demonstrates current badness of "cylc config"... # Inconsistence between graph/runtime whitespace handling. # Inconsistence between graph/runtime parameter expansion. -cylc config 'flow.cylc' >'19.cylc' +cylc config . >'19.cylc' cmp_ok '19.cylc' <<'__FLOW_CONFIG__' [task parameters] lang = c++, fortran-2008 diff --git a/tests/functional/param_expand/01-basic/01.graph.ref b/tests/functional/param_expand/01-basic/01.graph.ref index 7fec74b765c..3c8e9f9b237 100644 --- a/tests/functional/param_expand/01-basic/01.graph.ref +++ b/tests/functional/param_expand/01-basic/01.graph.ref @@ -1,48 +1,48 @@ -edge "foo_cat.1" "bar_j1.1" -edge "foo_cat.1" "bar_j2.1" -edge "foo_cat.1" "bar_j3.1" -edge "foo_cat.1" "bar_j4.1" -edge "foo_cat.1" "bar_j5.1" -edge "foo_dog.1" "bar_j1.1" -edge "foo_dog.1" "bar_j2.1" -edge "foo_dog.1" "bar_j3.1" -edge "foo_dog.1" "bar_j4.1" -edge "foo_dog.1" "bar_j5.1" -edge "foo_fish.1" "bar_j1.1" -edge "foo_fish.1" "bar_j2.1" -edge "foo_fish.1" "bar_j3.1" -edge "foo_fish.1" "bar_j4.1" -edge "foo_fish.1" "bar_j5.1" -edge "qux_j1.1" "waz_k1.1" -edge "qux_j1.1" "waz_k5.1" -edge "qux_j1.1" "waz_k9.1" -edge "qux_j2.1" "waz_k1.1" -edge "qux_j2.1" "waz_k5.1" -edge "qux_j2.1" "waz_k9.1" -edge "qux_j3.1" "waz_k1.1" -edge "qux_j3.1" "waz_k5.1" -edge "qux_j3.1" "waz_k9.1" -edge "qux_j4.1" "waz_k1.1" -edge "qux_j4.1" "waz_k5.1" -edge "qux_j4.1" "waz_k9.1" -edge "qux_j5.1" "waz_k1.1" -edge "qux_j5.1" "waz_k5.1" -edge "qux_j5.1" "waz_k9.1" +edge "1/foo_cat" "1/bar_j1" +edge "1/foo_cat" "1/bar_j2" +edge "1/foo_cat" "1/bar_j3" +edge "1/foo_cat" "1/bar_j4" +edge "1/foo_cat" "1/bar_j5" +edge "1/foo_dog" "1/bar_j1" +edge "1/foo_dog" "1/bar_j2" +edge "1/foo_dog" "1/bar_j3" +edge "1/foo_dog" "1/bar_j4" +edge "1/foo_dog" "1/bar_j5" +edge "1/foo_fish" "1/bar_j1" +edge "1/foo_fish" "1/bar_j2" +edge "1/foo_fish" "1/bar_j3" +edge "1/foo_fish" "1/bar_j4" +edge "1/foo_fish" "1/bar_j5" +edge "1/qux_j1" "1/waz_k1" +edge "1/qux_j1" "1/waz_k5" +edge "1/qux_j1" "1/waz_k9" +edge "1/qux_j2" "1/waz_k1" +edge "1/qux_j2" "1/waz_k5" +edge "1/qux_j2" "1/waz_k9" +edge "1/qux_j3" "1/waz_k1" +edge "1/qux_j3" "1/waz_k5" +edge "1/qux_j3" "1/waz_k9" +edge "1/qux_j4" "1/waz_k1" +edge "1/qux_j4" "1/waz_k5" +edge "1/qux_j4" "1/waz_k9" +edge "1/qux_j5" "1/waz_k1" +edge "1/qux_j5" "1/waz_k5" +edge "1/qux_j5" "1/waz_k9" graph -node "bar_j1.1" "bar_j1\n1" -node "bar_j2.1" "bar_j2\n1" -node "bar_j3.1" "bar_j3\n1" -node "bar_j4.1" "bar_j4\n1" -node "bar_j5.1" "bar_j5\n1" -node "foo_cat.1" "foo_cat\n1" -node "foo_dog.1" "foo_dog\n1" -node "foo_fish.1" "foo_fish\n1" -node "qux_j1.1" "qux_j1\n1" -node "qux_j2.1" "qux_j2\n1" -node "qux_j3.1" "qux_j3\n1" -node "qux_j4.1" "qux_j4\n1" -node "qux_j5.1" "qux_j5\n1" -node "waz_k1.1" "waz_k1\n1" -node "waz_k5.1" "waz_k5\n1" -node "waz_k9.1" "waz_k9\n1" +node "1/bar_j1" "bar_j1\n1" +node "1/bar_j2" "bar_j2\n1" +node "1/bar_j3" "bar_j3\n1" +node "1/bar_j4" "bar_j4\n1" +node "1/bar_j5" "bar_j5\n1" +node "1/foo_cat" "foo_cat\n1" +node "1/foo_dog" "foo_dog\n1" +node "1/foo_fish" "foo_fish\n1" +node "1/qux_j1" "qux_j1\n1" +node "1/qux_j2" "qux_j2\n1" +node "1/qux_j3" "qux_j3\n1" +node "1/qux_j4" "qux_j4\n1" +node "1/qux_j5" "qux_j5\n1" +node "1/waz_k1" "waz_k1\n1" +node "1/waz_k5" "waz_k5\n1" +node "1/waz_k9" "waz_k9\n1" stop diff --git a/tests/functional/param_expand/01-basic/02.graph.ref b/tests/functional/param_expand/01-basic/02.graph.ref index cd26f0f17a2..731ee9c94aa 100644 --- a/tests/functional/param_expand/01-basic/02.graph.ref +++ b/tests/functional/param_expand/01-basic/02.graph.ref @@ -1,41 +1,41 @@ -edge "foo_i001.1" "bar_i001.1" -edge "foo_i002.1" "bar_i002.1" -edge "foo_i003.1" "bar_i003.1" -edge "foo_i004.1" "bar_i004.1" -edge "foo_i005.1" "bar_i005.1" -edge "foo_i025.1" "bar_i025.1" -edge "foo_i030.1" "bar_i030.1" -edge "foo_i031.1" "bar_i031.1" -edge "foo_i032.1" "bar_i032.1" -edge "foo_i033.1" "bar_i033.1" -edge "foo_i034.1" "bar_i034.1" -edge "foo_i035.1" "bar_i035.1" -edge "foo_i110.1" "bar_i110.1" +edge "1/foo_i001" "1/bar_i001" +edge "1/foo_i002" "1/bar_i002" +edge "1/foo_i003" "1/bar_i003" +edge "1/foo_i004" "1/bar_i004" +edge "1/foo_i005" "1/bar_i005" +edge "1/foo_i025" "1/bar_i025" +edge "1/foo_i030" "1/bar_i030" +edge "1/foo_i031" "1/bar_i031" +edge "1/foo_i032" "1/bar_i032" +edge "1/foo_i033" "1/bar_i033" +edge "1/foo_i034" "1/bar_i034" +edge "1/foo_i035" "1/bar_i035" +edge "1/foo_i110" "1/bar_i110" graph -node "bar_i001.1" "bar_i001\n1" -node "bar_i002.1" "bar_i002\n1" -node "bar_i003.1" "bar_i003\n1" -node "bar_i004.1" "bar_i004\n1" -node "bar_i005.1" "bar_i005\n1" -node "bar_i025.1" "bar_i025\n1" -node "bar_i030.1" "bar_i030\n1" -node "bar_i031.1" "bar_i031\n1" -node "bar_i032.1" "bar_i032\n1" -node "bar_i033.1" "bar_i033\n1" -node "bar_i034.1" "bar_i034\n1" -node "bar_i035.1" "bar_i035\n1" -node "bar_i110.1" "bar_i110\n1" -node "foo_i001.1" "foo_i001\n1" -node "foo_i002.1" "foo_i002\n1" -node "foo_i003.1" "foo_i003\n1" -node "foo_i004.1" "foo_i004\n1" -node "foo_i005.1" "foo_i005\n1" -node "foo_i025.1" "foo_i025\n1" -node "foo_i030.1" "foo_i030\n1" -node "foo_i031.1" "foo_i031\n1" -node "foo_i032.1" "foo_i032\n1" -node "foo_i033.1" "foo_i033\n1" -node "foo_i034.1" "foo_i034\n1" -node "foo_i035.1" "foo_i035\n1" -node "foo_i110.1" "foo_i110\n1" +node "1/bar_i001" "bar_i001\n1" +node "1/bar_i002" "bar_i002\n1" +node "1/bar_i003" "bar_i003\n1" +node "1/bar_i004" "bar_i004\n1" +node "1/bar_i005" "bar_i005\n1" +node "1/bar_i025" "bar_i025\n1" +node "1/bar_i030" "bar_i030\n1" +node "1/bar_i031" "bar_i031\n1" +node "1/bar_i032" "bar_i032\n1" +node "1/bar_i033" "bar_i033\n1" +node "1/bar_i034" "bar_i034\n1" +node "1/bar_i035" "bar_i035\n1" +node "1/bar_i110" "bar_i110\n1" +node "1/foo_i001" "foo_i001\n1" +node "1/foo_i002" "foo_i002\n1" +node "1/foo_i003" "foo_i003\n1" +node "1/foo_i004" "foo_i004\n1" +node "1/foo_i005" "foo_i005\n1" +node "1/foo_i025" "foo_i025\n1" +node "1/foo_i030" "foo_i030\n1" +node "1/foo_i031" "foo_i031\n1" +node "1/foo_i032" "foo_i032\n1" +node "1/foo_i033" "foo_i033\n1" +node "1/foo_i034" "foo_i034\n1" +node "1/foo_i035" "foo_i035\n1" +node "1/foo_i110" "foo_i110\n1" stop diff --git a/tests/functional/param_expand/01-basic/03.graph.ref b/tests/functional/param_expand/01-basic/03.graph.ref index 12d5f21eb07..59812789986 100644 --- a/tests/functional/param_expand/01-basic/03.graph.ref +++ b/tests/functional/param_expand/01-basic/03.graph.ref @@ -1,8 +1,8 @@ -edge "foo_a-t.1" "bar_a-t.1" -edge "foo_c-g.1" "bar_c-g.1" +edge "1/foo_a-t" "1/bar_a-t" +edge "1/foo_c-g" "1/bar_c-g" graph -node "bar_a-t.1" "bar_a-t\n1" -node "bar_c-g.1" "bar_c-g\n1" -node "foo_a-t.1" "foo_a-t\n1" -node "foo_c-g.1" "foo_c-g\n1" +node "1/bar_a-t" "bar_a-t\n1" +node "1/bar_c-g" "bar_c-g\n1" +node "1/foo_a-t" "foo_a-t\n1" +node "1/foo_c-g" "foo_c-g\n1" stop diff --git a/tests/functional/param_expand/01-basic/04.graph.ref b/tests/functional/param_expand/01-basic/04.graph.ref index 6859458fc06..82f94b55fed 100644 --- a/tests/functional/param_expand/01-basic/04.graph.ref +++ b/tests/functional/param_expand/01-basic/04.graph.ref @@ -1,14 +1,14 @@ -edge "foo_100.1" "bar_100.1" -edge "foo_99+1.1" "bar_99+1.1" -edge "foo_hundred.1" "bar_hundred.1" -edge "foo_one-hundred.1" "bar_one-hundred.1" +edge "1/foo_100" "1/bar_100" +edge "1/foo_99+1" "1/bar_99+1" +edge "1/foo_hundred" "1/bar_hundred" +edge "1/foo_one-hundred" "1/bar_one-hundred" graph -node "bar_100.1" "bar_100\n1" -node "bar_99+1.1" "bar_99+1\n1" -node "bar_hundred.1" "bar_hundred\n1" -node "bar_one-hundred.1" "bar_one-hundred\n1" -node "foo_100.1" "foo_100\n1" -node "foo_99+1.1" "foo_99+1\n1" -node "foo_hundred.1" "foo_hundred\n1" -node "foo_one-hundred.1" "foo_one-hundred\n1" +node "1/bar_100" "bar_100\n1" +node "1/bar_99+1" "bar_99+1\n1" +node "1/bar_hundred" "bar_hundred\n1" +node "1/bar_one-hundred" "bar_one-hundred\n1" +node "1/foo_100" "foo_100\n1" +node "1/foo_99+1" "foo_99+1\n1" +node "1/foo_hundred" "foo_hundred\n1" +node "1/foo_one-hundred" "foo_one-hundred\n1" stop diff --git a/tests/functional/param_expand/01-basic/07.graph.ref b/tests/functional/param_expand/01-basic/07.graph.ref index 953be36130f..41b1e03342d 100644 --- a/tests/functional/param_expand/01-basic/07.graph.ref +++ b/tests/functional/param_expand/01-basic/07.graph.ref @@ -1,8 +1,8 @@ -edge "foo_a.1" "bar_a.1" -edge "foo_b.1" "bar_b.1" +edge "1/foo_a" "1/bar_a" +edge "1/foo_b" "1/bar_b" graph -node "bar_a.1" "bar_a\n1" -node "bar_b.1" "bar_b\n1" -node "foo_a.1" "foo_a\n1" -node "foo_b.1" "foo_b\n1" +node "1/bar_a" "bar_a\n1" +node "1/bar_b" "bar_b\n1" +node "1/foo_a" "foo_a\n1" +node "1/foo_b" "foo_b\n1" stop diff --git a/tests/functional/param_expand/01-basic/11.graph.ref b/tests/functional/param_expand/01-basic/11.graph.ref index bbfa56095a7..466a029dc15 100644 --- a/tests/functional/param_expand/01-basic/11.graph.ref +++ b/tests/functional/param_expand/01-basic/11.graph.ref @@ -1,17 +1,17 @@ -edge "foo@001.1" "bar@001.1" -edge "foo@002.1" "bar@002.1" -edge "foo@003.1" "bar@003.1" -edge "foo@004.1" "bar@004.1" -edge "foo@005.1" "bar@005.1" +edge "1/foo@001" "1/bar@001" +edge "1/foo@002" "1/bar@002" +edge "1/foo@003" "1/bar@003" +edge "1/foo@004" "1/bar@004" +edge "1/foo@005" "1/bar@005" graph -node "bar@001.1" "bar@001\n1" -node "bar@002.1" "bar@002\n1" -node "bar@003.1" "bar@003\n1" -node "bar@004.1" "bar@004\n1" -node "bar@005.1" "bar@005\n1" -node "foo@001.1" "foo@001\n1" -node "foo@002.1" "foo@002\n1" -node "foo@003.1" "foo@003\n1" -node "foo@004.1" "foo@004\n1" -node "foo@005.1" "foo@005\n1" +node "1/bar@001" "bar@001\n1" +node "1/bar@002" "bar@002\n1" +node "1/bar@003" "bar@003\n1" +node "1/bar@004" "bar@004\n1" +node "1/bar@005" "bar@005\n1" +node "1/foo@001" "foo@001\n1" +node "1/foo@002" "foo@002\n1" +node "1/foo@003" "foo@003\n1" +node "1/foo@004" "foo@004\n1" +node "1/foo@005" "foo@005\n1" stop diff --git a/tests/functional/param_expand/01-basic/12.graph.ref b/tests/functional/param_expand/01-basic/12.graph.ref index 7a74f468675..5669d46ecfa 100644 --- a/tests/functional/param_expand/01-basic/12.graph.ref +++ b/tests/functional/param_expand/01-basic/12.graph.ref @@ -1,17 +1,17 @@ -edge "foo+%j001.1" "bar+%j001.1" -edge "foo+%j002.1" "bar+%j002.1" -edge "foo+%j003.1" "bar+%j003.1" -edge "foo+%j004.1" "bar+%j004.1" -edge "foo+%j005.1" "bar+%j005.1" +edge "1/foo+%j001" "1/bar+%j001" +edge "1/foo+%j002" "1/bar+%j002" +edge "1/foo+%j003" "1/bar+%j003" +edge "1/foo+%j004" "1/bar+%j004" +edge "1/foo+%j005" "1/bar+%j005" graph -node "bar+%j001.1" "bar+%j001\n1" -node "bar+%j002.1" "bar+%j002\n1" -node "bar+%j003.1" "bar+%j003\n1" -node "bar+%j004.1" "bar+%j004\n1" -node "bar+%j005.1" "bar+%j005\n1" -node "foo+%j001.1" "foo+%j001\n1" -node "foo+%j002.1" "foo+%j002\n1" -node "foo+%j003.1" "foo+%j003\n1" -node "foo+%j004.1" "foo+%j004\n1" -node "foo+%j005.1" "foo+%j005\n1" +node "1/bar+%j001" "bar+%j001\n1" +node "1/bar+%j002" "bar+%j002\n1" +node "1/bar+%j003" "bar+%j003\n1" +node "1/bar+%j004" "bar+%j004\n1" +node "1/bar+%j005" "bar+%j005\n1" +node "1/foo+%j001" "foo+%j001\n1" +node "1/foo+%j002" "foo+%j002\n1" +node "1/foo+%j003" "foo+%j003\n1" +node "1/foo+%j004" "foo+%j004\n1" +node "1/foo+%j005" "foo+%j005\n1" stop diff --git a/tests/functional/param_expand/01-basic/13.graph.ref b/tests/functional/param_expand/01-basic/13.graph.ref index bc5a0c6954c..9655cdc3979 100644 --- a/tests/functional/param_expand/01-basic/13.graph.ref +++ b/tests/functional/param_expand/01-basic/13.graph.ref @@ -1,14 +1,14 @@ -edge "foo%percent.1" "bar%percent.1" -edge "foo+plus.1" "bar+plus.1" -edge "foo-minus.1" "bar-minus.1" -edge "foo@at.1" "bar@at.1" +edge "1/foo%percent" "1/bar%percent" +edge "1/foo+plus" "1/bar+plus" +edge "1/foo-minus" "1/bar-minus" +edge "1/foo@at" "1/bar@at" graph -node "bar%percent.1" "bar%percent\n1" -node "bar+plus.1" "bar+plus\n1" -node "bar-minus.1" "bar-minus\n1" -node "bar@at.1" "bar@at\n1" -node "foo%percent.1" "foo%percent\n1" -node "foo+plus.1" "foo+plus\n1" -node "foo-minus.1" "foo-minus\n1" -node "foo@at.1" "foo@at\n1" +node "1/bar%percent" "bar%percent\n1" +node "1/bar+plus" "bar+plus\n1" +node "1/bar-minus" "bar-minus\n1" +node "1/bar@at" "bar@at\n1" +node "1/foo%percent" "foo%percent\n1" +node "1/foo+plus" "foo+plus\n1" +node "1/foo-minus" "foo-minus\n1" +node "1/foo@at" "foo@at\n1" stop diff --git a/tests/functional/param_expand/01-basic/14.graph.ref b/tests/functional/param_expand/01-basic/14.graph.ref index 12e080652b8..6f76cc7d68d 100644 --- a/tests/functional/param_expand/01-basic/14.graph.ref +++ b/tests/functional/param_expand/01-basic/14.graph.ref @@ -1,25 +1,25 @@ -edge "earth.1" "bar.1" -edge "foo.1" "earth.1" -edge "foo.1" "i0.1" -edge "foo.1" "i1.1" -edge "foo.1" "i2.1" -edge "foo.1" "mars.1" -edge "foo.1" "mercury.1" -edge "foo.1" "venus.1" -edge "i0.1" "bar.1" -edge "i1.1" "bar.1" -edge "i2.1" "bar.1" -edge "mars.1" "bar.1" -edge "mercury.1" "bar.1" -edge "venus.1" "bar.1" +edge "1/earth" "1/bar" +edge "1/foo" "1/earth" +edge "1/foo" "1/i0" +edge "1/foo" "1/i1" +edge "1/foo" "1/i2" +edge "1/foo" "1/mars" +edge "1/foo" "1/mercury" +edge "1/foo" "1/venus" +edge "1/i0" "1/bar" +edge "1/i1" "1/bar" +edge "1/i2" "1/bar" +edge "1/mars" "1/bar" +edge "1/mercury" "1/bar" +edge "1/venus" "1/bar" graph -node "bar.1" "bar\n1" -node "earth.1" "earth\n1" -node "foo.1" "foo\n1" -node "i0.1" "i0\n1" -node "i1.1" "i1\n1" -node "i2.1" "i2\n1" -node "mars.1" "mars\n1" -node "mercury.1" "mercury\n1" -node "venus.1" "venus\n1" +node "1/bar" "bar\n1" +node "1/earth" "earth\n1" +node "1/foo" "foo\n1" +node "1/i0" "i0\n1" +node "1/i1" "i1\n1" +node "1/i2" "i2\n1" +node "1/mars" "mars\n1" +node "1/mercury" "mercury\n1" +node "1/venus" "venus\n1" stop diff --git a/tests/functional/param_expand/01-basic/15.graph.ref b/tests/functional/param_expand/01-basic/15.graph.ref index 53a1990a727..2db2a98fb35 100644 --- a/tests/functional/param_expand/01-basic/15.graph.ref +++ b/tests/functional/param_expand/01-basic/15.graph.ref @@ -1,6 +1,6 @@ graph -node "X_earthY.1" "X_earthY\n1" -node "X_marsY.1" "X_marsY\n1" -node "X_mercuryY.1" "X_mercuryY\n1" -node "X_venusY.1" "X_venusY\n1" +node "1/X_earthY" "X_earthY\n1" +node "1/X_marsY" "X_marsY\n1" +node "1/X_mercuryY" "X_mercuryY\n1" +node "1/X_venusY" "X_venusY\n1" stop diff --git a/tests/functional/param_expand/01-basic/16.graph.ref b/tests/functional/param_expand/01-basic/16.graph.ref index 6bfaf0c6e49..9472ff8883e 100644 --- a/tests/functional/param_expand/01-basic/16.graph.ref +++ b/tests/functional/param_expand/01-basic/16.graph.ref @@ -1,5 +1,5 @@ -edge "foo_dog.1" "foo_cat.1" +edge "1/foo_dog" "1/foo_cat" graph -node "foo_cat.1" "foo_cat\n1" -node "foo_dog.1" "foo_dog\n1" +node "1/foo_cat" "foo_cat\n1" +node "1/foo_dog" "foo_dog\n1" stop diff --git a/tests/functional/param_expand/01-basic/17.graph.ref b/tests/functional/param_expand/01-basic/17.graph.ref index b489c9316a9..b7647de3ed3 100644 --- a/tests/functional/param_expand/01-basic/17.graph.ref +++ b/tests/functional/param_expand/01-basic/17.graph.ref @@ -1,5 +1,5 @@ -edge "foo_cat.1" "foo_dog.1" +edge "1/foo_cat" "1/foo_dog" graph -node "foo_cat.1" "foo_cat\n1" -node "foo_dog.1" "foo_dog\n1" +node "1/foo_cat" "foo_cat\n1" +node "1/foo_dog" "foo_dog\n1" stop diff --git a/tests/functional/param_expand/01-basic/18.graph.ref b/tests/functional/param_expand/01-basic/18.graph.ref index e38c2934335..5a6813fe72e 100644 --- a/tests/functional/param_expand/01-basic/18.graph.ref +++ b/tests/functional/param_expand/01-basic/18.graph.ref @@ -1,7 +1,7 @@ graph -node "foo_m+00.1" "foo_m+00\n1" -node "foo_m+06.1" "foo_m+06\n1" -node "foo_m+12.1" "foo_m+12\n1" -node "foo_m-06.1" "foo_m-06\n1" -node "foo_m-12.1" "foo_m-12\n1" +node "1/foo_m+00" "foo_m+00\n1" +node "1/foo_m+06" "foo_m+06\n1" +node "1/foo_m+12" "foo_m+12\n1" +node "1/foo_m-06" "foo_m-06\n1" +node "1/foo_m-12" "foo_m-12\n1" stop diff --git a/tests/functional/param_expand/01-basic/19.graph.ref b/tests/functional/param_expand/01-basic/19.graph.ref index 2e83ef196d8..b45e815304f 100644 --- a/tests/functional/param_expand/01-basic/19.graph.ref +++ b/tests/functional/param_expand/01-basic/19.graph.ref @@ -1,5 +1,5 @@ -edge "c++.1" "fortran-2008.1" +edge "1/c++" "1/fortran-2008" graph -node "c++.1" "c++\n1" -node "fortran-2008.1" "fortran-2008\n1" +node "1/c++" "c++\n1" +node "1/fortran-2008" "fortran-2008\n1" stop diff --git a/tests/functional/param_expand/02-param_val.t b/tests/functional/param_expand/02-param_val.t index b186770fcb9..6e92a646a62 100644 --- a/tests/functional/param_expand/02-param_val.t +++ b/tests/functional/param_expand/02-param_val.t @@ -41,15 +41,15 @@ __WORKFLOW__ TNAME=${TEST_NAME_BASE}-1 # validate -run_ok "${TNAME}" cylc validate "flow.cylc" +run_ok "${TNAME}" cylc validate . # family graph -graph_workflow "flow.cylc" "${TNAME}-graph-fam" --group="" +graph_workflow . "${TNAME}-graph-fam" --group="" cmp_ok "${TNAME}-graph-fam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-fam-1.ref" # task graph -graph_workflow "flow.cylc" "${TNAME}-graph-exp" +graph_workflow . "${TNAME}-graph-exp" cmp_ok "${TNAME}-graph-exp" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-exp-1.ref" # inheritance graph -graph_workflow "flow.cylc" "${TNAME}-graph-nam" -n +graph_workflow . "${TNAME}-graph-nam" -n cmp_ok "${TNAME}-graph-nam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-nam-1.ref" #------------------------------------------------------------------------------ @@ -73,15 +73,15 @@ __WORKFLOW__ TNAME=${TEST_NAME_BASE}-2 # validate -run_ok "${TNAME}" cylc validate "flow.cylc" +run_ok "${TNAME}" cylc validate . # family graph -graph_workflow "flow.cylc" "${TNAME}-graph-fam" "--group=" +graph_workflow . "${TNAME}-graph-fam" "--group=" cmp_ok "${TNAME}-graph-fam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-fam-1.ref" # task graph -graph_workflow "flow.cylc" "${TNAME}-graph-exp" +graph_workflow . "${TNAME}-graph-exp" cmp_ok "${TNAME}-graph-exp" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-exp-1.ref" # inheritance graph -graph_workflow "flow.cylc" "${TNAME}-graph-nam" -n +graph_workflow . "${TNAME}-graph-nam" -n cmp_ok "${TNAME}-graph-nam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-nam-1.ref" #------------------------------------------------------------------------------ @@ -106,15 +106,15 @@ __WORKFLOW__ TNAME=${TEST_NAME_BASE}-3 # validate -run_ok "${TNAME}" cylc validate "flow.cylc" +run_ok "${TNAME}" cylc validate . # family graph -graph_workflow "flow.cylc" "${TNAME}-graph-fam" "--group=" +graph_workflow . "${TNAME}-graph-fam" "--group=" cmp_ok "${TNAME}-graph-fam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-fam-1.ref" # task graph -graph_workflow "flow.cylc" "${TNAME}-graph-exp" +graph_workflow . "${TNAME}-graph-exp" cmp_ok "${TNAME}-graph-exp" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-exp-1.ref" # inheritance graph -graph_workflow "flow.cylc" "${TNAME}-graph-nam" -n +graph_workflow . "${TNAME}-graph-nam" -n cmp_ok "${TNAME}-graph-nam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-nam-1.ref" #------------------------------------------------------------------------------ @@ -138,15 +138,15 @@ __WORKFLOW__ TNAME=${TEST_NAME_BASE}-4 # validate -run_ok "${TNAME}" cylc validate "flow.cylc" +run_ok "${TNAME}" cylc validate . # family graph -graph_workflow "flow.cylc" "${TNAME}-graph-fam" "--group=" +graph_workflow . "${TNAME}-graph-fam" "--group=" cmp_ok "${TNAME}-graph-fam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-fam-b.ref" # task graph -graph_workflow "flow.cylc" "${TNAME}-graph-exp" +graph_workflow . "${TNAME}-graph-exp" cmp_ok "${TNAME}-graph-exp" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-exp-b.ref" # inheritance graph -graph_workflow "flow.cylc" "${TNAME}-graph-nam" -n +graph_workflow . "${TNAME}-graph-nam" -n cmp_ok "${TNAME}-graph-nam" "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/graph-nam-b.ref" #------------------------------------------------------------------------------ @@ -170,7 +170,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' inherit = "FAM" # OK (plain task can inherit from specific params) __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-5" cylc validate "flow.cylc" +run_ok "${TEST_NAME_BASE}-5" cylc validate . #------------------------------------------------------------------------------ cat >'flow.cylc' <<'__WORKFLOW__' @@ -189,8 +189,8 @@ cat >'flow.cylc' <<'__WORKFLOW__' inherit = BAR, BAZ __WORKFLOW__ -run_ok "${TEST_NAME_BASE}-6" cylc validate 'flow.cylc' -cylc graph --reference 'flow.cylc' 1>'06.graph' +run_ok "${TEST_NAME_BASE}-6" cylc validate . +cylc graph --reference . 1>'06.graph' cmp_ok '06.graph' "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/06.graph.ref" #------------------------------------------------------------------------------ @@ -213,7 +213,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' __WORKFLOW__ TNAME=${TEST_NAME_BASE}-err-1 -run_fail "${TNAME}" cylc validate "flow.cylc" +run_fail "${TNAME}" cylc validate . cmp_ok "${TNAME}.stderr" - << __ERR__ ParamExpandError: illegal value 'i=frog' in 'inherit = FAM' __ERR__ @@ -240,7 +240,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' __WORKFLOW__ TNAME="${TEST_NAME_BASE}-err-2" -run_fail "${TNAME}" cylc validate "flow.cylc" +run_fail "${TNAME}" cylc validate . cmp_ok "${TNAME}.stderr" - << __ERR__ ParamExpandError: parameter 'i' undefined in 'inherit = FAM' __ERR__ diff --git a/tests/functional/param_expand/02-param_val/06.graph.ref b/tests/functional/param_expand/02-param_val/06.graph.ref index b37c5447205..11459c71ea5 100644 --- a/tests/functional/param_expand/02-param_val/06.graph.ref +++ b/tests/functional/param_expand/02-param_val/06.graph.ref @@ -1,33 +1,33 @@ -edge "foo.1" "bar_cat_baz_j1.1" -edge "foo.1" "bar_cat_baz_j2.1" -edge "foo.1" "bar_cat_baz_j3.1" -edge "foo.1" "bar_cat_baz_j4.1" -edge "foo.1" "bar_cat_baz_j5.1" -edge "foo.1" "bar_dog_baz_j1.1" -edge "foo.1" "bar_dog_baz_j2.1" -edge "foo.1" "bar_dog_baz_j3.1" -edge "foo.1" "bar_dog_baz_j4.1" -edge "foo.1" "bar_dog_baz_j5.1" -edge "foo.1" "bar_fish_baz_j1.1" -edge "foo.1" "bar_fish_baz_j2.1" -edge "foo.1" "bar_fish_baz_j3.1" -edge "foo.1" "bar_fish_baz_j4.1" -edge "foo.1" "bar_fish_baz_j5.1" +edge "1/foo" "1/bar_cat_baz_j1" +edge "1/foo" "1/bar_cat_baz_j2" +edge "1/foo" "1/bar_cat_baz_j3" +edge "1/foo" "1/bar_cat_baz_j4" +edge "1/foo" "1/bar_cat_baz_j5" +edge "1/foo" "1/bar_dog_baz_j1" +edge "1/foo" "1/bar_dog_baz_j2" +edge "1/foo" "1/bar_dog_baz_j3" +edge "1/foo" "1/bar_dog_baz_j4" +edge "1/foo" "1/bar_dog_baz_j5" +edge "1/foo" "1/bar_fish_baz_j1" +edge "1/foo" "1/bar_fish_baz_j2" +edge "1/foo" "1/bar_fish_baz_j3" +edge "1/foo" "1/bar_fish_baz_j4" +edge "1/foo" "1/bar_fish_baz_j5" graph -node "bar_cat_baz_j1.1" "bar_cat_baz_j1\n1" -node "bar_cat_baz_j2.1" "bar_cat_baz_j2\n1" -node "bar_cat_baz_j3.1" "bar_cat_baz_j3\n1" -node "bar_cat_baz_j4.1" "bar_cat_baz_j4\n1" -node "bar_cat_baz_j5.1" "bar_cat_baz_j5\n1" -node "bar_dog_baz_j1.1" "bar_dog_baz_j1\n1" -node "bar_dog_baz_j2.1" "bar_dog_baz_j2\n1" -node "bar_dog_baz_j3.1" "bar_dog_baz_j3\n1" -node "bar_dog_baz_j4.1" "bar_dog_baz_j4\n1" -node "bar_dog_baz_j5.1" "bar_dog_baz_j5\n1" -node "bar_fish_baz_j1.1" "bar_fish_baz_j1\n1" -node "bar_fish_baz_j2.1" "bar_fish_baz_j2\n1" -node "bar_fish_baz_j3.1" "bar_fish_baz_j3\n1" -node "bar_fish_baz_j4.1" "bar_fish_baz_j4\n1" -node "bar_fish_baz_j5.1" "bar_fish_baz_j5\n1" -node "foo.1" "foo\n1" +node "1/bar_cat_baz_j1" "bar_cat_baz_j1\n1" +node "1/bar_cat_baz_j2" "bar_cat_baz_j2\n1" +node "1/bar_cat_baz_j3" "bar_cat_baz_j3\n1" +node "1/bar_cat_baz_j4" "bar_cat_baz_j4\n1" +node "1/bar_cat_baz_j5" "bar_cat_baz_j5\n1" +node "1/bar_dog_baz_j1" "bar_dog_baz_j1\n1" +node "1/bar_dog_baz_j2" "bar_dog_baz_j2\n1" +node "1/bar_dog_baz_j3" "bar_dog_baz_j3\n1" +node "1/bar_dog_baz_j4" "bar_dog_baz_j4\n1" +node "1/bar_dog_baz_j5" "bar_dog_baz_j5\n1" +node "1/bar_fish_baz_j1" "bar_fish_baz_j1\n1" +node "1/bar_fish_baz_j2" "bar_fish_baz_j2\n1" +node "1/bar_fish_baz_j3" "bar_fish_baz_j3\n1" +node "1/bar_fish_baz_j4" "bar_fish_baz_j4\n1" +node "1/bar_fish_baz_j5" "bar_fish_baz_j5\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/param_expand/02-param_val/graph-exp-1.ref b/tests/functional/param_expand/02-param_val/graph-exp-1.ref index 792975c7888..fa6a5df3697 100644 --- a/tests/functional/param_expand/02-param_val/graph-exp-1.ref +++ b/tests/functional/param_expand/02-param_val/graph-exp-1.ref @@ -1,35 +1,35 @@ -edge "bar_cat_j3.1" "boo.1" -edge "foo.1" "bar_cat_j1.1" -edge "foo.1" "bar_cat_j2.1" -edge "foo.1" "bar_cat_j3.1" -edge "foo.1" "bar_cat_j4.1" -edge "foo.1" "bar_cat_j5.1" -edge "foo.1" "bar_dog_j1.1" -edge "foo.1" "bar_dog_j2.1" -edge "foo.1" "bar_dog_j3.1" -edge "foo.1" "bar_dog_j4.1" -edge "foo.1" "bar_dog_j5.1" -edge "foo.1" "bar_fish_j1.1" -edge "foo.1" "bar_fish_j2.1" -edge "foo.1" "bar_fish_j3.1" -edge "foo.1" "bar_fish_j4.1" -edge "foo.1" "bar_fish_j5.1" +edge "1/bar_cat_j3" "1/boo" +edge "1/foo" "1/bar_cat_j1" +edge "1/foo" "1/bar_cat_j2" +edge "1/foo" "1/bar_cat_j3" +edge "1/foo" "1/bar_cat_j4" +edge "1/foo" "1/bar_cat_j5" +edge "1/foo" "1/bar_dog_j1" +edge "1/foo" "1/bar_dog_j2" +edge "1/foo" "1/bar_dog_j3" +edge "1/foo" "1/bar_dog_j4" +edge "1/foo" "1/bar_dog_j5" +edge "1/foo" "1/bar_fish_j1" +edge "1/foo" "1/bar_fish_j2" +edge "1/foo" "1/bar_fish_j3" +edge "1/foo" "1/bar_fish_j4" +edge "1/foo" "1/bar_fish_j5" graph -node "bar_cat_j1.1" "bar_cat_j1\n1" -node "bar_cat_j2.1" "bar_cat_j2\n1" -node "bar_cat_j3.1" "bar_cat_j3\n1" -node "bar_cat_j4.1" "bar_cat_j4\n1" -node "bar_cat_j5.1" "bar_cat_j5\n1" -node "bar_dog_j1.1" "bar_dog_j1\n1" -node "bar_dog_j2.1" "bar_dog_j2\n1" -node "bar_dog_j3.1" "bar_dog_j3\n1" -node "bar_dog_j4.1" "bar_dog_j4\n1" -node "bar_dog_j5.1" "bar_dog_j5\n1" -node "bar_fish_j1.1" "bar_fish_j1\n1" -node "bar_fish_j2.1" "bar_fish_j2\n1" -node "bar_fish_j3.1" "bar_fish_j3\n1" -node "bar_fish_j4.1" "bar_fish_j4\n1" -node "bar_fish_j5.1" "bar_fish_j5\n1" -node "boo.1" "boo\n1" -node "foo.1" "foo\n1" +node "1/bar_cat_j1" "bar_cat_j1\n1" +node "1/bar_cat_j2" "bar_cat_j2\n1" +node "1/bar_cat_j3" "bar_cat_j3\n1" +node "1/bar_cat_j4" "bar_cat_j4\n1" +node "1/bar_cat_j5" "bar_cat_j5\n1" +node "1/bar_dog_j1" "bar_dog_j1\n1" +node "1/bar_dog_j2" "bar_dog_j2\n1" +node "1/bar_dog_j3" "bar_dog_j3\n1" +node "1/bar_dog_j4" "bar_dog_j4\n1" +node "1/bar_dog_j5" "bar_dog_j5\n1" +node "1/bar_fish_j1" "bar_fish_j1\n1" +node "1/bar_fish_j2" "bar_fish_j2\n1" +node "1/bar_fish_j3" "bar_fish_j3\n1" +node "1/bar_fish_j4" "bar_fish_j4\n1" +node "1/bar_fish_j5" "bar_fish_j5\n1" +node "1/boo" "boo\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/param_expand/02-param_val/graph-exp-b.ref b/tests/functional/param_expand/02-param_val/graph-exp-b.ref index 792975c7888..fa6a5df3697 100644 --- a/tests/functional/param_expand/02-param_val/graph-exp-b.ref +++ b/tests/functional/param_expand/02-param_val/graph-exp-b.ref @@ -1,35 +1,35 @@ -edge "bar_cat_j3.1" "boo.1" -edge "foo.1" "bar_cat_j1.1" -edge "foo.1" "bar_cat_j2.1" -edge "foo.1" "bar_cat_j3.1" -edge "foo.1" "bar_cat_j4.1" -edge "foo.1" "bar_cat_j5.1" -edge "foo.1" "bar_dog_j1.1" -edge "foo.1" "bar_dog_j2.1" -edge "foo.1" "bar_dog_j3.1" -edge "foo.1" "bar_dog_j4.1" -edge "foo.1" "bar_dog_j5.1" -edge "foo.1" "bar_fish_j1.1" -edge "foo.1" "bar_fish_j2.1" -edge "foo.1" "bar_fish_j3.1" -edge "foo.1" "bar_fish_j4.1" -edge "foo.1" "bar_fish_j5.1" +edge "1/bar_cat_j3" "1/boo" +edge "1/foo" "1/bar_cat_j1" +edge "1/foo" "1/bar_cat_j2" +edge "1/foo" "1/bar_cat_j3" +edge "1/foo" "1/bar_cat_j4" +edge "1/foo" "1/bar_cat_j5" +edge "1/foo" "1/bar_dog_j1" +edge "1/foo" "1/bar_dog_j2" +edge "1/foo" "1/bar_dog_j3" +edge "1/foo" "1/bar_dog_j4" +edge "1/foo" "1/bar_dog_j5" +edge "1/foo" "1/bar_fish_j1" +edge "1/foo" "1/bar_fish_j2" +edge "1/foo" "1/bar_fish_j3" +edge "1/foo" "1/bar_fish_j4" +edge "1/foo" "1/bar_fish_j5" graph -node "bar_cat_j1.1" "bar_cat_j1\n1" -node "bar_cat_j2.1" "bar_cat_j2\n1" -node "bar_cat_j3.1" "bar_cat_j3\n1" -node "bar_cat_j4.1" "bar_cat_j4\n1" -node "bar_cat_j5.1" "bar_cat_j5\n1" -node "bar_dog_j1.1" "bar_dog_j1\n1" -node "bar_dog_j2.1" "bar_dog_j2\n1" -node "bar_dog_j3.1" "bar_dog_j3\n1" -node "bar_dog_j4.1" "bar_dog_j4\n1" -node "bar_dog_j5.1" "bar_dog_j5\n1" -node "bar_fish_j1.1" "bar_fish_j1\n1" -node "bar_fish_j2.1" "bar_fish_j2\n1" -node "bar_fish_j3.1" "bar_fish_j3\n1" -node "bar_fish_j4.1" "bar_fish_j4\n1" -node "bar_fish_j5.1" "bar_fish_j5\n1" -node "boo.1" "boo\n1" -node "foo.1" "foo\n1" +node "1/bar_cat_j1" "bar_cat_j1\n1" +node "1/bar_cat_j2" "bar_cat_j2\n1" +node "1/bar_cat_j3" "bar_cat_j3\n1" +node "1/bar_cat_j4" "bar_cat_j4\n1" +node "1/bar_cat_j5" "bar_cat_j5\n1" +node "1/bar_dog_j1" "bar_dog_j1\n1" +node "1/bar_dog_j2" "bar_dog_j2\n1" +node "1/bar_dog_j3" "bar_dog_j3\n1" +node "1/bar_dog_j4" "bar_dog_j4\n1" +node "1/bar_dog_j5" "bar_dog_j5\n1" +node "1/bar_fish_j1" "bar_fish_j1\n1" +node "1/bar_fish_j2" "bar_fish_j2\n1" +node "1/bar_fish_j3" "bar_fish_j3\n1" +node "1/bar_fish_j4" "bar_fish_j4\n1" +node "1/bar_fish_j5" "bar_fish_j5\n1" +node "1/boo" "boo\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/param_expand/02-param_val/graph-fam-1.ref b/tests/functional/param_expand/02-param_val/graph-fam-1.ref index c529ec7570c..4a85a9e3f1f 100644 --- a/tests/functional/param_expand/02-param_val/graph-fam-1.ref +++ b/tests/functional/param_expand/02-param_val/graph-fam-1.ref @@ -1,35 +1,35 @@ -edge "FAM_cat_j3.1" "boo.1" -edge "foo.1" "FAM_cat_j1.1" -edge "foo.1" "FAM_cat_j2.1" -edge "foo.1" "FAM_cat_j3.1" -edge "foo.1" "FAM_cat_j4.1" -edge "foo.1" "FAM_cat_j5.1" -edge "foo.1" "FAM_dog_j1.1" -edge "foo.1" "FAM_dog_j2.1" -edge "foo.1" "FAM_dog_j3.1" -edge "foo.1" "FAM_dog_j4.1" -edge "foo.1" "FAM_dog_j5.1" -edge "foo.1" "FAM_fish_j1.1" -edge "foo.1" "FAM_fish_j2.1" -edge "foo.1" "FAM_fish_j3.1" -edge "foo.1" "FAM_fish_j4.1" -edge "foo.1" "FAM_fish_j5.1" +edge "1/FAM_cat_j3" "1/boo" +edge "1/foo" "1/FAM_cat_j1" +edge "1/foo" "1/FAM_cat_j2" +edge "1/foo" "1/FAM_cat_j3" +edge "1/foo" "1/FAM_cat_j4" +edge "1/foo" "1/FAM_cat_j5" +edge "1/foo" "1/FAM_dog_j1" +edge "1/foo" "1/FAM_dog_j2" +edge "1/foo" "1/FAM_dog_j3" +edge "1/foo" "1/FAM_dog_j4" +edge "1/foo" "1/FAM_dog_j5" +edge "1/foo" "1/FAM_fish_j1" +edge "1/foo" "1/FAM_fish_j2" +edge "1/foo" "1/FAM_fish_j3" +edge "1/foo" "1/FAM_fish_j4" +edge "1/foo" "1/FAM_fish_j5" graph -node "FAM_cat_j1.1" "FAM_cat_j1\n1" -node "FAM_cat_j2.1" "FAM_cat_j2\n1" -node "FAM_cat_j3.1" "FAM_cat_j3\n1" -node "FAM_cat_j4.1" "FAM_cat_j4\n1" -node "FAM_cat_j5.1" "FAM_cat_j5\n1" -node "FAM_dog_j1.1" "FAM_dog_j1\n1" -node "FAM_dog_j2.1" "FAM_dog_j2\n1" -node "FAM_dog_j3.1" "FAM_dog_j3\n1" -node "FAM_dog_j4.1" "FAM_dog_j4\n1" -node "FAM_dog_j5.1" "FAM_dog_j5\n1" -node "FAM_fish_j1.1" "FAM_fish_j1\n1" -node "FAM_fish_j2.1" "FAM_fish_j2\n1" -node "FAM_fish_j3.1" "FAM_fish_j3\n1" -node "FAM_fish_j4.1" "FAM_fish_j4\n1" -node "FAM_fish_j5.1" "FAM_fish_j5\n1" -node "boo.1" "boo\n1" -node "foo.1" "foo\n1" +node "1/FAM_cat_j1" "FAM_cat_j1\n1" +node "1/FAM_cat_j2" "FAM_cat_j2\n1" +node "1/FAM_cat_j3" "FAM_cat_j3\n1" +node "1/FAM_cat_j4" "FAM_cat_j4\n1" +node "1/FAM_cat_j5" "FAM_cat_j5\n1" +node "1/FAM_dog_j1" "FAM_dog_j1\n1" +node "1/FAM_dog_j2" "FAM_dog_j2\n1" +node "1/FAM_dog_j3" "FAM_dog_j3\n1" +node "1/FAM_dog_j4" "FAM_dog_j4\n1" +node "1/FAM_dog_j5" "FAM_dog_j5\n1" +node "1/FAM_fish_j1" "FAM_fish_j1\n1" +node "1/FAM_fish_j2" "FAM_fish_j2\n1" +node "1/FAM_fish_j3" "FAM_fish_j3\n1" +node "1/FAM_fish_j4" "FAM_fish_j4\n1" +node "1/FAM_fish_j5" "FAM_fish_j5\n1" +node "1/boo" "boo\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/param_expand/02-param_val/graph-fam-b.ref b/tests/functional/param_expand/02-param_val/graph-fam-b.ref index c434f17ad42..b71bd255ff4 100644 --- a/tests/functional/param_expand/02-param_val/graph-fam-b.ref +++ b/tests/functional/param_expand/02-param_val/graph-fam-b.ref @@ -1,33 +1,33 @@ -edge "FAM_dog_j1.1" "boo.1" -edge "foo.1" "FAM_cat_j1.1" -edge "foo.1" "FAM_cat_j2.1" -edge "foo.1" "FAM_cat_j4.1" -edge "foo.1" "FAM_cat_j5.1" -edge "foo.1" "FAM_dog_j1.1" -edge "foo.1" "FAM_dog_j2.1" -edge "foo.1" "FAM_dog_j3.1" -edge "foo.1" "FAM_dog_j4.1" -edge "foo.1" "FAM_dog_j5.1" -edge "foo.1" "FAM_fish_j1.1" -edge "foo.1" "FAM_fish_j2.1" -edge "foo.1" "FAM_fish_j3.1" -edge "foo.1" "FAM_fish_j4.1" -edge "foo.1" "FAM_fish_j5.1" +edge "1/FAM_dog_j1" "1/boo" +edge "1/foo" "1/FAM_cat_j1" +edge "1/foo" "1/FAM_cat_j2" +edge "1/foo" "1/FAM_cat_j4" +edge "1/foo" "1/FAM_cat_j5" +edge "1/foo" "1/FAM_dog_j1" +edge "1/foo" "1/FAM_dog_j2" +edge "1/foo" "1/FAM_dog_j3" +edge "1/foo" "1/FAM_dog_j4" +edge "1/foo" "1/FAM_dog_j5" +edge "1/foo" "1/FAM_fish_j1" +edge "1/foo" "1/FAM_fish_j2" +edge "1/foo" "1/FAM_fish_j3" +edge "1/foo" "1/FAM_fish_j4" +edge "1/foo" "1/FAM_fish_j5" graph -node "FAM_cat_j1.1" "FAM_cat_j1\n1" -node "FAM_cat_j2.1" "FAM_cat_j2\n1" -node "FAM_cat_j4.1" "FAM_cat_j4\n1" -node "FAM_cat_j5.1" "FAM_cat_j5\n1" -node "FAM_dog_j1.1" "FAM_dog_j1\n1" -node "FAM_dog_j2.1" "FAM_dog_j2\n1" -node "FAM_dog_j3.1" "FAM_dog_j3\n1" -node "FAM_dog_j4.1" "FAM_dog_j4\n1" -node "FAM_dog_j5.1" "FAM_dog_j5\n1" -node "FAM_fish_j1.1" "FAM_fish_j1\n1" -node "FAM_fish_j2.1" "FAM_fish_j2\n1" -node "FAM_fish_j3.1" "FAM_fish_j3\n1" -node "FAM_fish_j4.1" "FAM_fish_j4\n1" -node "FAM_fish_j5.1" "FAM_fish_j5\n1" -node "boo.1" "boo\n1" -node "foo.1" "foo\n1" +node "1/FAM_cat_j1" "FAM_cat_j1\n1" +node "1/FAM_cat_j2" "FAM_cat_j2\n1" +node "1/FAM_cat_j4" "FAM_cat_j4\n1" +node "1/FAM_cat_j5" "FAM_cat_j5\n1" +node "1/FAM_dog_j1" "FAM_dog_j1\n1" +node "1/FAM_dog_j2" "FAM_dog_j2\n1" +node "1/FAM_dog_j3" "FAM_dog_j3\n1" +node "1/FAM_dog_j4" "FAM_dog_j4\n1" +node "1/FAM_dog_j5" "FAM_dog_j5\n1" +node "1/FAM_fish_j1" "FAM_fish_j1\n1" +node "1/FAM_fish_j2" "FAM_fish_j2\n1" +node "1/FAM_fish_j3" "FAM_fish_j3\n1" +node "1/FAM_fish_j4" "FAM_fish_j4\n1" +node "1/FAM_fish_j5" "FAM_fish_j5\n1" +node "1/boo" "boo\n1" +node "1/foo" "foo\n1" stop diff --git a/tests/functional/param_expand/03-env-tmpl/reference.log b/tests/functional/param_expand/03-env-tmpl/reference.log index 3f64c423c00..2175d4acffb 100644 --- a/tests/functional/param_expand/03-env-tmpl/reference.log +++ b/tests/functional/param_expand/03-env-tmpl/reference.log @@ -1,13 +1,12 @@ Initial point: 1 Final point: 1 -t1_num099_this.1 -triggered off [] -t2_num099_this.1 -triggered off ['t1_num099_this.1'] -t1_num099_that.1 -triggered off [] -t2_num099_that.1 -triggered off ['t1_num099_that.1'] -t1_num101_this.1 -triggered off [] -t2_num101_this.1 -triggered off ['t1_num101_this.1'] -t1_num101_that.1 -triggered off [] -t2_num101_that.1 -triggered off ['t1_num101_that.1'] -x_that.1 -triggered off [] -x_this.1 -triggered off [] - +1/t1_num099_this -triggered off [] +1/t2_num099_this -triggered off ['1/t1_num099_this'] +1/t1_num099_that -triggered off [] +1/t2_num099_that -triggered off ['1/t1_num099_that'] +1/t1_num101_this -triggered off [] +1/t2_num101_this -triggered off ['1/t1_num101_this'] +1/t1_num101_that -triggered off [] +1/t2_num101_that -triggered off ['1/t1_num101_that'] +1/x_that -triggered off [] +1/x_this -triggered off [] diff --git a/tests/functional/pause-resume/00-workflow/reference.log b/tests/functional/pause-resume/00-workflow/reference.log index b62bab41316..bb2ee4d5b31 100644 --- a/tests/functional/pause-resume/00-workflow/reference.log +++ b/tests/functional/pause-resume/00-workflow/reference.log @@ -1,3 +1,3 @@ -DEBUG - pause_resume.20140101T00 -triggered off [] -DEBUG - foo.20140101T00 -triggered off ['pause_resume.20140101T00'] -DEBUG - bar.20140101T00 -triggered off ['pause_resume.20140101T00'] +20140101T00/pause_resume -triggered off [] +20140101T00/foo -triggered off ['20140101T00/pause_resume'] +20140101T00/bar -triggered off ['20140101T00/pause_resume'] diff --git a/tests/functional/pause-resume/01-beyond-stop/reference.log b/tests/functional/pause-resume/01-beyond-stop/reference.log index 504b86f3f29..457ce83dc8d 100644 --- a/tests/functional/pause-resume/01-beyond-stop/reference.log +++ b/tests/functional/pause-resume/01-beyond-stop/reference.log @@ -1,3 +1,3 @@ -DEBUG - foo.20140101T00 -triggered off [] -DEBUG - pause_resume.20140101T00 -triggered off ['foo.20140101T00'] -DEBUG - bar.20140101T00 -triggered off ['foo.20140101T00'] +20140101T00/foo -triggered off [] +20140101T00/pause_resume -triggered off ['20140101T00/foo'] +20140101T00/bar -triggered off ['20140101T00/foo'] diff --git a/tests/functional/pause-resume/12-pause-then-retry/flow.cylc b/tests/functional/pause-resume/12-pause-then-retry/flow.cylc index dac9929a003..84ee88140fe 100644 --- a/tests/functional/pause-resume/12-pause-then-retry/flow.cylc +++ b/tests/functional/pause-resume/12-pause-then-retry/flow.cylc @@ -22,24 +22,24 @@ cylc__job__poll_grep_workflow_log -F 'Command succeeded: pause' # Poll t-submit-retry-able, should return submit-fail - cylc poll "${CYLC_WORKFLOW_ID}" 't-submit-retry-able' + cylc poll "${CYLC_WORKFLOW_ID}//*/t-submit-retry-able" # Allow t-retry-able to continue rm -f "${CYLC_WORKFLOW_RUN_DIR}/file" cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 running .* => waiting' + '1/t-retry-able running .* => waiting' cylc__job__poll_grep_workflow_log -E \ - 't-submit-retry-able\.1 submitted .* => waiting' + '1/t-submit-retry-able submitted .* => waiting' # Resume the workflow cylc play "${CYLC_WORKFLOW_ID}" cylc__job__poll_grep_workflow_log -E \ - 't-retry-able\.1 waiting .* => waiting\(queued\)' + '1/t-retry-able waiting .* => waiting\(queued\)' cylc__job__poll_grep_workflow_log -E \ - 't-submit-retry-able\.1 waiting .* => waiting\(queued\)' + '1/t-submit-retry-able waiting .* => waiting\(queued\)' """ [[t-retry-able]] script = """ diff --git a/tests/functional/pause-resume/12-pause-then-retry/reference.log b/tests/functional/pause-resume/12-pause-then-retry/reference.log index f16f34995e0..95d58ee3e29 100644 --- a/tests/functional/pause-resume/12-pause-then-retry/reference.log +++ b/tests/functional/pause-resume/12-pause-then-retry/reference.log @@ -1,7 +1,6 @@ -2014-12-18T16:14:12Z INFO - Initial point: 1 -2014-12-18T16:14:12Z INFO - Final point: 1 -2014-12-18T16:14:12Z DEBUG - t-submit-retry-able.1 -triggered off [] -2014-12-18T16:14:12Z DEBUG - t-retry-able.1 -triggered off [] -2014-12-18T16:14:15Z DEBUG - t-pause.1 -triggered off ['t-retry-able.1', 't-submit-retry-able.1'] -2014-12-18T16:14:24Z DEBUG - t-retry-able.1 -triggered off [] -2014-12-18T16:14:25Z DEBUG - t-submit-retry-able.1 -triggered off [] +Final point: 1 +1/t-submit-retry-able -triggered off [] +1/t-retry-able -triggered off [] +1/t-pause -triggered off ['1/t-retry-able', '1/t-submit-retry-able'] +1/t-retry-able -triggered off [] +1/t-submit-retry-able -triggered off [] diff --git a/tests/functional/pause-resume/21-client/reference.log b/tests/functional/pause-resume/21-client/reference.log index e54adb0330b..7afe901c28f 100644 --- a/tests/functional/pause-resume/21-client/reference.log +++ b/tests/functional/pause-resume/21-client/reference.log @@ -1,3 +1,3 @@ -2016-10-10T14:01:04Z INFO - Initial point: 1 -2016-10-10T14:01:04Z INFO - Final point: 1 -2016-10-10T14:01:05Z DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/periodicals/Daily/reference.log b/tests/functional/periodicals/Daily/reference.log index 5e21b55647b..58028894257 100644 --- a/tests/functional/periodicals/Daily/reference.log +++ b/tests/functional/periodicals/Daily/reference.log @@ -1,5 +1,5 @@ -2014/05/15 22:12:12 INFO - Initial point: 20140107T0000Z -2014/05/15 22:12:12 INFO - Final point: 20140118T0000Z -2014/05/15 22:12:17 DEBUG - a.20140110T0600Z -triggered off [] -2014/05/15 22:12:21 DEBUG - a.20140113T0600Z -triggered off [] -2014/05/15 22:12:25 DEBUG - a.20140116T0600Z -triggered off [] +Initial point: 20140107T0000Z +Final point: 20140118T0000Z +20140110T0600Z/a -triggered off [] +20140113T0600Z/a -triggered off [] +20140116T0600Z/a -triggered off [] diff --git a/tests/functional/periodicals/Monthly-reorder/reference.log b/tests/functional/periodicals/Monthly-reorder/reference.log index 7ef09bf7657..19e278365ca 100644 --- a/tests/functional/periodicals/Monthly-reorder/reference.log +++ b/tests/functional/periodicals/Monthly-reorder/reference.log @@ -1,11 +1,11 @@ Initial point: 20130130T0000Z Final point: 20130202T0000Z -dummy.20130130T0000Z -triggered off ['daily.20130129T0000Z'] -daily.20130130T0000Z -triggered off [] -dummy.20130131T0000Z -triggered off ['daily.20130130T0000Z'] -daily.20130131T0000Z -triggered off [] -dummy.20130201T0000Z -triggered off ['daily.20130131T0000Z'] -daily.20130201T0000Z -triggered off [] -monthly.20130201T0000Z -triggered off ['dummy.20130201T0000Z'] -dummy.20130202T0000Z -triggered off ['daily.20130201T0000Z'] -daily.20130202T0000Z -triggered off [] +20130130T0000Z/dummy -triggered off ['20130129T0000Z/daily'] +20130130T0000Z/daily -triggered off [] +20130131T0000Z/dummy -triggered off ['20130130T0000Z/daily'] +20130131T0000Z/daily -triggered off [] +20130201T0000Z/dummy -triggered off ['20130131T0000Z/daily'] +20130201T0000Z/daily -triggered off [] +20130201T0000Z/monthly -triggered off ['20130201T0000Z/dummy'] +20130202T0000Z/dummy -triggered off ['20130201T0000Z/daily'] +20130202T0000Z/daily -triggered off [] diff --git a/tests/functional/periodicals/Monthly/reference.log b/tests/functional/periodicals/Monthly/reference.log index 3987fb8f2d5..faf7d19e728 100644 --- a/tests/functional/periodicals/Monthly/reference.log +++ b/tests/functional/periodicals/Monthly/reference.log @@ -1,4 +1,4 @@ -2013/11/01 15:41:48 INFO - Initial point: 20100201T0000Z -2013/11/01 15:41:48 INFO - Final point: 20100801T0000Z -2013/11/01 15:41:48 DEBUG - a.20100401T0000Z -triggered off [] -2013/11/01 15:41:53 DEBUG - a.20100701T0000Z -triggered off [] +Initial point: 20100201T0000Z +Final point: 20100801T0000Z +20100401T0000Z/a -triggered off [] +20100701T0000Z/a -triggered off [] diff --git a/tests/functional/periodicals/Yearly/reference.log b/tests/functional/periodicals/Yearly/reference.log index c4f742be5a0..4a194661d79 100644 --- a/tests/functional/periodicals/Yearly/reference.log +++ b/tests/functional/periodicals/Yearly/reference.log @@ -1,4 +1,4 @@ -2013/11/01 14:15:49 INFO - Initial point: 20110101T0000Z -2013/11/01 14:15:49 INFO - Final point: 20180101T0000Z -2013/11/01 14:15:49 DEBUG - a.20130101T0000Z -triggered off [] -2013/11/01 14:15:54 DEBUG - a.20160101T0000Z -triggered off [] +Initial point: 20110101T0000Z +Final point: 20180101T0000Z +20130101T0000Z/a -triggered off [] +20160101T0000Z/a -triggered off [] diff --git a/tests/functional/platforms/01-platform-basic.t b/tests/functional/platforms/01-platform-basic.t index 4a48861d29f..07aaaaed666 100755 --- a/tests/functional/platforms/01-platform-basic.t +++ b/tests/functional/platforms/01-platform-basic.t @@ -45,4 +45,4 @@ platform=lewis __FLOW_CONFIG__ -run_ok "${TEST_NAME}" cylc validate flow.cylc +run_ok "${TEST_NAME}" cylc validate . diff --git a/tests/functional/platforms/02-host-to-platform-upgrade.t b/tests/functional/platforms/02-host-to-platform-upgrade.t index 9b096da5fa1..476965aaae7 100644 --- a/tests/functional/platforms/02-host-to-platform-upgrade.t +++ b/tests/functional/platforms/02-host-to-platform-upgrade.t @@ -53,7 +53,7 @@ workflow_run_ok "${TEST_NAME_BASE}-run" \ grep "host=" "${WORKFLOW_RUN_DIR}/log/workflow/log" > hosts.log -grep_ok "\[t2\.2.*\].*host=${CYLC_TEST_HOST}" hosts.log +grep_ok "\[2/t2.*\].*host=${CYLC_TEST_HOST}" hosts.log purge exit diff --git a/tests/functional/platforms/02-host-to-platform-upgrade/reference.log b/tests/functional/platforms/02-host-to-platform-upgrade/reference.log index 7e38174f71d..f5bb03f781c 100644 --- a/tests/functional/platforms/02-host-to-platform-upgrade/reference.log +++ b/tests/functional/platforms/02-host-to-platform-upgrade/reference.log @@ -1,10 +1,10 @@ Initial point: 1 Final point: 1 -fin.1 -triggered off ['no_settings.1', 't1.1', 't2.1'] -fin.2 -triggered off ['no_settings.2', 't1.2', 't2.2'] -no_settings.1 -triggered off [] -no_settings.2 -triggered off [] -t1.1 -triggered off [] -t1.2 -triggered off [] -t2.1 -triggered off [] -t2.2 -triggered off [] +1/fin -triggered off ['1/no_settings', '1/t1', '1/t2'] +2/fin -triggered off ['2/no_settings', '2/t1', '2/t2'] +1/no_settings -triggered off [] +2/no_settings -triggered off [] +1/t1 -triggered off [] +2/t1 -triggered off [] +1/t2 -triggered off [] +2/t2 -triggered off [] diff --git a/tests/functional/platforms/04-host-to-platform-upgrade-fail-inherit.t b/tests/functional/platforms/04-host-to-platform-upgrade-fail-inherit.t index 6b2362dfd03..8812fefc0de 100644 --- a/tests/functional/platforms/04-host-to-platform-upgrade-fail-inherit.t +++ b/tests/functional/platforms/04-host-to-platform-upgrade-fail-inherit.t @@ -38,7 +38,7 @@ workflow_run_fail "${TEST_NAME_BASE}-run" \ cylc play --debug --no-detach "${WORKFLOW_NAME}" # Grep for inherit-fail to fail later at submit time -grep_ok "WorkflowConfigError:.*non-valid-child.1" \ +grep_ok "WorkflowConfigError:.*1/non-valid-child" \ "${TEST_NAME_BASE}-run.stderr" purge diff --git a/tests/functional/pre-initial/00-simple/reference.log b/tests/functional/pre-initial/00-simple/reference.log index a0b14207da2..2f053e674b1 100644 --- a/tests/functional/pre-initial/00-simple/reference.log +++ b/tests/functional/pre-initial/00-simple/reference.log @@ -1,4 +1,4 @@ -2014-04-24T16:05:37 INFO - Initial point: 20100101T0000Z -2014-04-24T16:05:37 INFO - Final point: 20100102T0000Z -2014-04-24T16:05:37 DEBUG - a.20100101T0000Z -triggered off ['a.20091231T0000Z'] -2014-04-24T16:05:43 DEBUG - a.20100102T0000Z -triggered off ['a.20100101T0000Z'] +Initial point: 20100101T0000Z +Final point: 20100102T0000Z +20100101T0000Z/a -triggered off ['20091231T0000Z/a'] +20100102T0000Z/a -triggered off ['20100101T0000Z/a'] diff --git a/tests/functional/pre-initial/01-basic/reference.log b/tests/functional/pre-initial/01-basic/reference.log index 0f654719080..f8e9ebfb9b9 100644 --- a/tests/functional/pre-initial/01-basic/reference.log +++ b/tests/functional/pre-initial/01-basic/reference.log @@ -1,6 +1,6 @@ -2014-04-24T16:36:50 INFO - Initial point: 20100101T0000Z -2014-04-24T16:36:50 INFO - Final point: 20100102T0000Z -2014-04-24T16:36:50 DEBUG - b.20100101T0000Z -triggered off [] -2014-04-24T16:36:54 DEBUG - b.20100102T0000Z -triggered off [] -2014-04-24T16:36:55 DEBUG - a.20100101T0000Z -triggered off ['a.20091231T0000Z', 'b.20100101T0000Z'] -2014-04-24T16:37:01 DEBUG - a.20100102T0000Z -triggered off ['a.20100101T0000Z', 'b.20100102T0000Z'] +Initial point: 20100101T0000Z +Final point: 20100102T0000Z +20100101T0000Z/b -triggered off [] +20100102T0000Z/b -triggered off [] +20100101T0000Z/a -triggered off ['20091231T0000Z/a', '20100101T0000Z/b'] +20100102T0000Z/a -triggered off ['20100101T0000Z/a', '20100102T0000Z/b'] diff --git a/tests/functional/pre-initial/02-advanced/reference.log b/tests/functional/pre-initial/02-advanced/reference.log index b653e408067..9592b07f619 100644 --- a/tests/functional/pre-initial/02-advanced/reference.log +++ b/tests/functional/pre-initial/02-advanced/reference.log @@ -1,17 +1,17 @@ -2014-04-24T16:42:00 INFO - Initial point: 20100101T0000Z -2014-04-24T16:42:00 INFO - Final point: 20100102T0000Z -2014-04-24T16:42:00 DEBUG - b.20100101T0000Z -triggered off [] -2014-04-24T16:42:04 DEBUG - b.20100101T0600Z -triggered off [] -2014-04-24T16:42:05 DEBUG - a.20100101T0000Z -triggered off ['a.20091231T1800Z', 'b.20100101T0000Z', 'c.20091231T1800Z'] -2014-04-24T16:42:05 DEBUG - c.20100101T0000Z -triggered off ['a.20091231T1800Z', 'b.20100101T0000Z', 'c.20091231T1800Z'] -2014-04-24T16:42:07 DEBUG - b.20100101T1200Z -triggered off [] -2014-04-24T16:42:11 DEBUG - a.20100101T0600Z -triggered off ['a.20100101T0000Z', 'b.20100101T0600Z', 'c.20100101T0000Z'] -2014-04-24T16:42:11 DEBUG - c.20100101T0600Z -triggered off ['a.20100101T0000Z', 'b.20100101T0600Z', 'c.20100101T0000Z'] -2014-04-24T16:42:13 DEBUG - b.20100101T1800Z -triggered off [] -2014-04-24T16:42:17 DEBUG - a.20100101T1200Z -triggered off ['a.20100101T0600Z', 'b.20100101T1200Z', 'c.20100101T0600Z'] -2014-04-24T16:42:17 DEBUG - c.20100101T1200Z -triggered off ['a.20100101T0600Z', 'b.20100101T1200Z', 'c.20100101T0600Z'] -2014-04-24T16:42:19 DEBUG - b.20100102T0000Z -triggered off [] -2014-04-24T16:42:23 DEBUG - c.20100101T1800Z -triggered off ['a.20100101T1200Z', 'b.20100101T1800Z', 'c.20100101T1200Z'] -2014-04-24T16:42:23 DEBUG - a.20100101T1800Z -triggered off ['a.20100101T1200Z', 'b.20100101T1800Z', 'c.20100101T1200Z'] -2014-04-24T16:42:28 DEBUG - a.20100102T0000Z -triggered off ['a.20100101T1800Z', 'b.20100102T0000Z', 'c.20100101T1800Z'] -2014-04-24T16:42:28 DEBUG - c.20100102T0000Z -triggered off ['a.20100101T1800Z', 'b.20100102T0000Z', 'c.20100101T1800Z'] +Initial point: 20100101T0000Z +Final point: 20100102T0000Z +20100101T0000Z/b -triggered off [] +20100101T0600Z/b -triggered off [] +20100101T0000Z/a -triggered off ['20091231T1800Z/a', '20091231T1800Z/c', '20100101T0000Z/b'] +20100101T0000Z/c -triggered off ['20091231T1800Z/a', '20091231T1800Z/c', '20100101T0000Z/b'] +20100101T1200Z/b -triggered off [] +20100101T0600Z/a -triggered off ['20100101T0000Z/a', '20100101T0000Z/c', '20100101T0600Z/b'] +20100101T0600Z/c -triggered off ['20100101T0000Z/a', '20100101T0000Z/c', '20100101T0600Z/b'] +20100101T1800Z/b -triggered off [] +20100101T1200Z/a -triggered off ['20100101T0600Z/a', '20100101T0600Z/c', '20100101T1200Z/b'] +20100101T1200Z/c -triggered off ['20100101T0600Z/a', '20100101T0600Z/c', '20100101T1200Z/b'] +20100102T0000Z/b -triggered off [] +20100101T1800Z/c -triggered off ['20100101T1200Z/a', '20100101T1200Z/c', '20100101T1800Z/b'] +20100101T1800Z/a -triggered off ['20100101T1200Z/a', '20100101T1200Z/c', '20100101T1800Z/b'] +20100102T0000Z/a -triggered off ['20100101T1800Z/a', '20100101T1800Z/c', '20100102T0000Z/b'] +20100102T0000Z/c -triggered off ['20100101T1800Z/a', '20100101T1800Z/c', '20100102T0000Z/b'] diff --git a/tests/functional/pre-initial/03-drop/reference.log b/tests/functional/pre-initial/03-drop/reference.log index 021795a0379..cecb29f06a0 100644 --- a/tests/functional/pre-initial/03-drop/reference.log +++ b/tests/functional/pre-initial/03-drop/reference.log @@ -1,12 +1,12 @@ -2014-04-24T16:32:27 INFO - Initial point: 20100101T0000Z -2014-04-24T16:32:27 INFO - Final point: 20100102T0000Z -2014-04-24T16:32:27 DEBUG - a.20100101T0000Z -triggered off ['a.20091231T1800Z', 'b.20091231T1800Z'] -2014-04-24T16:32:33 DEBUG - b.20100101T0000Z -triggered off ['a.20100101T0000Z'] -2014-04-24T16:32:37 DEBUG - a.20100101T0600Z -triggered off ['a.20100101T0000Z', 'b.20100101T0000Z'] -2014-04-24T16:32:42 DEBUG - b.20100101T0600Z -triggered off ['a.20100101T0600Z'] -2014-04-24T16:32:47 DEBUG - a.20100101T1200Z -triggered off ['a.20100101T0600Z', 'b.20100101T0600Z'] -2014-04-24T16:32:51 DEBUG - b.20100101T1200Z -triggered off ['a.20100101T1200Z'] -2014-04-24T16:32:56 DEBUG - a.20100101T1800Z -triggered off ['a.20100101T1200Z', 'b.20100101T1200Z'] -2014-04-24T16:33:02 DEBUG - b.20100101T1800Z -triggered off ['a.20100101T1800Z'] -2014-04-24T16:33:06 DEBUG - a.20100102T0000Z -triggered off ['a.20100101T1800Z', 'b.20100101T1800Z'] -2014-04-24T16:33:10 DEBUG - b.20100102T0000Z -triggered off ['a.20100102T0000Z'] +Initial point: 20100101T0000Z +Final point: 20100102T0000Z +20100101T0000Z/a -triggered off ['20091231T1800Z/a', '20091231T1800Z/b'] +20100101T0000Z/b -triggered off ['20100101T0000Z/a'] +20100101T0600Z/a -triggered off ['20100101T0000Z/a', '20100101T0000Z/b'] +20100101T0600Z/b -triggered off ['20100101T0600Z/a'] +20100101T1200Z/a -triggered off ['20100101T0600Z/a', '20100101T0600Z/b'] +20100101T1200Z/b -triggered off ['20100101T1200Z/a'] +20100101T1800Z/a -triggered off ['20100101T1200Z/a', '20100101T1200Z/b'] +20100101T1800Z/b -triggered off ['20100101T1800Z/a'] +20100102T0000Z/a -triggered off ['20100101T1800Z/a', '20100101T1800Z/b'] +20100102T0000Z/b -triggered off ['20100102T0000Z/a'] diff --git a/tests/functional/pre-initial/06-over-bracketed/reference.log b/tests/functional/pre-initial/06-over-bracketed/reference.log index cf0ea943989..5246592f6c6 100644 --- a/tests/functional/pre-initial/06-over-bracketed/reference.log +++ b/tests/functional/pre-initial/06-over-bracketed/reference.log @@ -1,6 +1,6 @@ -2014-05-19T16:58:04 INFO - Initial point: 20131225T1200Z -2014-05-19T16:58:04 INFO - Final point: 20131225T1200Z -2014-05-19T16:58:04 DEBUG - c.20131225T1200Z -triggered off [] -2014-05-19T16:58:04 DEBUG - d.20131225T1200Z -triggered off ['a.20131224T1200Z', 'b.20131224T1200Z', 'c.20131224T1200Z'] -2014-05-19T16:58:04 DEBUG - a.20131225T1200Z -triggered off [] -2014-05-19T16:58:04 DEBUG - b.20131225T1200Z -triggered off [] +Initial point: 20131225T1200Z +Final point: 20131225T1200Z +20131225T1200Z/c -triggered off [] +20131225T1200Z/d -triggered off ['20131224T1200Z/a', '20131224T1200Z/b', '20131224T1200Z/c'] +20131225T1200Z/a -triggered off [] +20131225T1200Z/b -triggered off [] diff --git a/tests/functional/pre-initial/07-simple-messaging/reference.log b/tests/functional/pre-initial/07-simple-messaging/reference.log index ec2c8ba64bd..c0ded6d4887 100644 --- a/tests/functional/pre-initial/07-simple-messaging/reference.log +++ b/tests/functional/pre-initial/07-simple-messaging/reference.log @@ -1,4 +1,4 @@ -2014/01/02 15:46:52 INFO - Initial point: 20100808T0000Z -2014/01/02 15:46:52 INFO - Final point: 20100809T0000Z -2014/01/02 15:46:52 DEBUG - foo.20100808T0000Z -triggered off ['foo.20100807T0000Z'] -2014/01/02 15:46:57 DEBUG - foo.20100809T0000Z -triggered off ['foo.20100808T0000Z'] +Initial point: 20100808T0000Z +Final point: 20100809T0000Z +20100808T0000Z/foo -triggered off ['20100807T0000Z/foo'] +20100809T0000Z/foo -triggered off ['20100808T0000Z/foo'] diff --git a/tests/functional/pre-initial/08-conditional-messaging/flow.cylc b/tests/functional/pre-initial/08-conditional-messaging/flow.cylc index 7b531fe1678..0ac121a8514 100644 --- a/tests/functional/pre-initial/08-conditional-messaging/flow.cylc +++ b/tests/functional/pre-initial/08-conditional-messaging/flow.cylc @@ -2,7 +2,7 @@ UTC mode = True allow implicit tasks = True [[events]] - expected task failures = bar.20100809T0000Z + expected task failures = 20100809T0000Z/bar [scheduling] initial cycle point = 20100808T00 diff --git a/tests/functional/pre-initial/08-conditional-messaging/reference.log b/tests/functional/pre-initial/08-conditional-messaging/reference.log index 37f3cee1329..92ce8535996 100644 --- a/tests/functional/pre-initial/08-conditional-messaging/reference.log +++ b/tests/functional/pre-initial/08-conditional-messaging/reference.log @@ -1,7 +1,7 @@ -2014/01/02 15:42:26 INFO - Initial point: 20100808T0000Z -2014/01/02 15:42:26 INFO - Final point: 20100809T0000Z -2014/01/02 15:42:26 DEBUG - bar.20100808T0000Z -triggered off [] -2014/01/02 15:42:30 DEBUG - foo.20100808T0000Z -triggered off ['bar.20100808T0000Z', 'foo.20100807T0000Z'] -2014/01/02 15:42:30 DEBUG - bar.20100809T0000Z -triggered off [] -2014/01/02 15:42:34 DEBUG - foo.20100809T0000Z -triggered off ['foo.20100808T0000Z'] -2014/01/02 15:42:34 DEBUG - handled.20100809T0000Z -triggered off ['bar.20100809T0000Z'] +Initial point: 20100808T0000Z +Final point: 20100809T0000Z +20100808T0000Z/bar -triggered off [] +20100808T0000Z/foo -triggered off ['20100807T0000Z/foo', '20100808T0000Z/bar'] +20100809T0000Z/bar -triggered off [] +20100809T0000Z/foo -triggered off ['20100808T0000Z/foo'] +20100809T0000Z/handled -triggered off ['20100809T0000Z/bar'] diff --git a/tests/functional/pre-initial/12-warm-restart.t b/tests/functional/pre-initial/12-warm-restart.t index 00a0b8e2936..467d0e67683 100644 --- a/tests/functional/pre-initial/12-warm-restart.t +++ b/tests/functional/pre-initial/12-warm-restart.t @@ -37,9 +37,9 @@ poll_workflow_running #------------------------------------------------------------------------------- # Check pre-reqs TEST_NAME=${TEST_NAME_BASE}-check-prereq -run_ok "${TEST_NAME}" cylc show "${WORKFLOW_NAME}" foo.20130101T1200Z --list-prereqs +run_ok "${TEST_NAME}" cylc show "${WORKFLOW_NAME}//20130101T1200Z/foo" --list-prereqs cmp_ok "${TEST_NAME}.stdout" <<'__OUT__' -foo.20130101T0600Z succeeded +20130101T0600Z/foo succeeded __OUT__ #------------------------------------------------------------------------------- # Stop workflow diff --git a/tests/functional/pre-initial/warm-insert/flow.cylc b/tests/functional/pre-initial/warm-insert/flow.cylc index b154c26031c..28551b3f0e2 100644 --- a/tests/functional/pre-initial/warm-insert/flow.cylc +++ b/tests/functional/pre-initial/warm-insert/flow.cylc @@ -26,6 +26,5 @@ [[foo,bar]] [[inserter]] script = """ - cylc trigger --reflow --meta="other" $CYLC_WORKFLOW_ID foo.20100101T1200Z + cylc trigger --reflow --meta="other" "$CYLC_WORKFLOW_ID//20100101T1200Z/foo" """ - \ No newline at end of file diff --git a/tests/functional/pre-initial/warm-insert/reference.log b/tests/functional/pre-initial/warm-insert/reference.log index ae0b23c6f7c..b766debd91a 100644 --- a/tests/functional/pre-initial/warm-insert/reference.log +++ b/tests/functional/pre-initial/warm-insert/reference.log @@ -1,7 +1,7 @@ -2016-08-26T09:19:57Z DEBUG - inserter.20100101T1800Z -triggered off [] -2016-08-26T09:19:57Z DEBUG - foo.20100101T1800Z -triggered off [] -2016-08-26T09:20:04Z DEBUG - bar.20100101T1800Z -triggered off ['foo.20100101T1800Z', 'inserter.20100101T1800Z'] -2016-08-26T09:20:12Z DEBUG - foo.20100102T0000Z -triggered off [] -2016-08-26T09:20:19Z DEBUG - bar.20100102T0000Z -triggered off ['foo.20100102T0000Z'] -2016-08-26T09:20:28Z DEBUG - foo.20100101T1200Z -triggered off [] -2016-08-26T09:20:36Z DEBUG - bar.20100101T1200Z -triggered off ['foo.20100101T1200Z'] +20100101T1800Z/inserter -triggered off [] +20100101T1800Z/foo -triggered off [] +20100101T1800Z/bar -triggered off ['20100101T1800Z/foo', '20100101T1800Z/inserter'] +20100102T0000Z/foo -triggered off [] +20100102T0000Z/bar -triggered off ['20100102T0000Z/foo'] +20100101T1200Z/foo -triggered off [] +20100101T1200Z/bar -triggered off ['20100101T1200Z/foo'] diff --git a/tests/functional/pre-initial/warm-offset/reference.log b/tests/functional/pre-initial/warm-offset/reference.log index 85197509dfc..f3ade15f86c 100644 --- a/tests/functional/pre-initial/warm-offset/reference.log +++ b/tests/functional/pre-initial/warm-offset/reference.log @@ -1,6 +1,6 @@ -2013/09/11 10:39:10 INFO - Initial point: 20130101T0600Z -2013/09/11 10:39:10 INFO - Final point: 20130102T0000Z -2013/09/11 10:39:10 DEBUG - foo.20130101T0600Z -triggered off ['foo.20130101T0000Z'] -2013/09/11 10:39:14 DEBUG - foo.20130101T1200Z -triggered off ['foo.20130101T0600Z'] -2013/09/11 10:39:17 DEBUG - foo.20130101T1800Z -triggered off ['foo.20130101T1200Z'] -2013/09/11 10:39:20 DEBUG - foo.20130102T0000Z -triggered off ['foo.20130101T1800Z'] +Initial point: 20130101T0600Z +Final point: 20130102T0000Z +20130101T0600Z/foo -triggered off ['20130101T0000Z/foo'] +20130101T1200Z/foo -triggered off ['20130101T0600Z/foo'] +20130101T1800Z/foo -triggered off ['20130101T1200Z/foo'] +20130102T0000Z/foo -triggered off ['20130101T1800Z/foo'] diff --git a/tests/functional/pre-initial/warm-start-iso/reference.log b/tests/functional/pre-initial/warm-start-iso/reference.log index 10884546025..5b207b46452 100644 --- a/tests/functional/pre-initial/warm-start-iso/reference.log +++ b/tests/functional/pre-initial/warm-start-iso/reference.log @@ -1,10 +1,10 @@ -2014-08-04T11:20:42Z INFO - Initial point: 20130101T0000Z -2014-08-04T11:20:42Z INFO - Start point: 20130102T0000Z -2014-08-04T11:20:42Z INFO - Final point: 20130103T0000Z -2014-08-04T11:20:42Z DEBUG - qux.20130102T0000Z -triggered off ['foo.20130101T0000Z', 'qux.20130101T1800Z'] -2014-08-04T11:20:42Z DEBUG - wibble.20130102T0000Z -triggered off [] -2014-08-04T11:20:44Z DEBUG - wibble.20130102T0600Z -triggered off [] -2014-08-04T11:20:45Z DEBUG - qux.20130102T0600Z -triggered off ['foo.20130101T0000Z', 'qux.20130102T0000Z'] -2014-08-04T11:20:48Z DEBUG - qux.20130102T1200Z -triggered off ['foo.20130101T0000Z', 'qux.20130102T0600Z'] -2014-08-04T11:20:51Z DEBUG - qux.20130102T1800Z -triggered off ['foo.20130101T0000Z', 'qux.20130102T1200Z'] -2014-08-04T11:20:55Z DEBUG - qux.20130103T0000Z -triggered off ['foo.20130101T0000Z', 'qux.20130102T1800Z'] +Initial point: 20130101T0000Z +Start point: 20130102T0000Z +Final point: 20130103T0000Z +20130102T0000Z/qux -triggered off ['20130101T0000Z/foo', '20130101T1800Z/qux'] +20130102T0000Z/wibble -triggered off [] +20130102T0600Z/wibble -triggered off [] +20130102T0600Z/qux -triggered off ['20130101T0000Z/foo', '20130102T0000Z/qux'] +20130102T1200Z/qux -triggered off ['20130101T0000Z/foo', '20130102T0600Z/qux'] +20130102T1800Z/qux -triggered off ['20130101T0000Z/foo', '20130102T1200Z/qux'] +20130103T0000Z/qux -triggered off ['20130101T0000Z/foo', '20130102T1800Z/qux'] diff --git a/tests/functional/pre-initial/warm-start/reference.log b/tests/functional/pre-initial/warm-start/reference.log index 3e5b37d1da9..7b9ef096175 100644 --- a/tests/functional/pre-initial/warm-start/reference.log +++ b/tests/functional/pre-initial/warm-start/reference.log @@ -1,7 +1,6 @@ -2013-09-11T10:42:03Z INFO - Initial point: 20130101T0000Z -2013-09-11T10:42:03Z INFO - Final point: 20130102T0000Z -2013-09-11T10:42:03Z DEBUG - foo.20130101T0000Z -triggered off ['foo.20121231T1800Z'] -2013-09-11T10:42:07Z DEBUG - foo.20130101T0600Z -triggered off ['foo.20130101T0000Z'] -2013-09-11T10:42:10Z DEBUG - foo.20130101T1200Z -triggered off ['foo.20130101T0600Z'] -2013-09-11T10:42:13Z DEBUG - foo.20130101T1800Z -triggered off ['foo.20130101T1200Z'] -2013-09-11T10:42:16Z DEBUG - foo.20130102T0000Z -triggered off ['foo.20130101T1800Z'] +Final point: 20130102T0000Z +20130101T0000Z/foo -triggered off ['20121231T1800Z/foo'] +20130101T0600Z/foo -triggered off ['20130101T0000Z/foo'] +20130101T1200Z/foo -triggered off ['20130101T0600Z/foo'] +20130101T1800Z/foo -triggered off ['20130101T1200Z/foo'] +20130102T0000Z/foo -triggered off ['20130101T1800Z/foo'] diff --git a/tests/functional/queues/02-queueorder/reference.log b/tests/functional/queues/02-queueorder/reference.log index 78f227355fb..563acc2ae89 100644 --- a/tests/functional/queues/02-queueorder/reference.log +++ b/tests/functional/queues/02-queueorder/reference.log @@ -1,17 +1,17 @@ -2018-03-13T14:22:38Z INFO - Initial point: 1 -2018-03-13T14:22:38Z INFO - Final point: 1 -2018-03-13T14:22:38Z DEBUG - delay_n1.1 -triggered off [] -2018-03-13T14:22:38Z DEBUG - hold.1 -triggered off [] -2018-03-13T14:22:40Z DEBUG - delay_n2.1 -triggered off ['delay_n1.1'] -2018-03-13T14:22:42Z DEBUG - delay_n3.1 -triggered off ['delay_n2.1'] -2018-03-13T14:22:44Z DEBUG - delay_n4.1 -triggered off ['delay_n3.1'] -2018-03-13T14:22:47Z DEBUG - delay_n5.1 -triggered off ['delay_n4.1'] -2018-03-13T14:22:48Z DEBUG - proc_n1.1 -triggered off ['delay_n1.1'] -2018-03-13T14:22:49Z DEBUG - delay_n6.1 -triggered off ['delay_n5.1'] -2018-03-13T14:22:50Z DEBUG - proc_n2.1 -triggered off ['delay_n2.1'] -2018-03-13T14:22:52Z DEBUG - delay_n7.1 -triggered off ['delay_n6.1'] -2018-03-13T14:22:52Z DEBUG - proc_n3.1 -triggered off ['delay_n3.1'] -2018-03-13T14:22:54Z DEBUG - proc_n4.1 -triggered off ['delay_n4.1'] -2018-03-13T14:22:56Z DEBUG - proc_n5.1 -triggered off ['delay_n5.1'] -2018-03-13T14:22:58Z DEBUG - proc_n6.1 -triggered off ['delay_n6.1'] -2018-03-13T14:23:00Z DEBUG - proc_n7.1 -triggered off ['delay_n7.1'] +Initial point: 1 +Final point: 1 +1/delay_n1 -triggered off [] +1/hold -triggered off [] +1/delay_n2 -triggered off ['1/delay_n1'] +1/delay_n3 -triggered off ['1/delay_n2'] +1/delay_n4 -triggered off ['1/delay_n3'] +1/delay_n5 -triggered off ['1/delay_n4'] +1/proc_n1 -triggered off ['1/delay_n1'] +1/delay_n6 -triggered off ['1/delay_n5'] +1/proc_n2 -triggered off ['1/delay_n2'] +1/delay_n7 -triggered off ['1/delay_n6'] +1/proc_n3 -triggered off ['1/delay_n3'] +1/proc_n4 -triggered off ['1/delay_n4'] +1/proc_n5 -triggered off ['1/delay_n5'] +1/proc_n6 -triggered off ['1/delay_n6'] +1/proc_n7 -triggered off ['1/delay_n7'] diff --git a/tests/functional/queues/qsize/reference.log b/tests/functional/queues/qsize/reference.log index 5b44928e53e..c6ede8462c9 100644 --- a/tests/functional/queues/qsize/reference.log +++ b/tests/functional/queues/qsize/reference.log @@ -1,15 +1,15 @@ -2013/11/07 12:01:39 INFO - Initial point: 1 -2013/11/07 12:01:39 INFO - Final point: 1 -2013/11/07 12:01:39 DEBUG - monitor.1 -triggered off [] -2013/11/07 12:01:42 DEBUG - a.1 -triggered off ['monitor.1'] -2013/11/07 12:01:42 DEBUG - c.1 -triggered off ['monitor.1'] -2013/11/07 12:01:55 DEBUG - b.1 -triggered off ['monitor.1'] -2013/11/07 12:01:55 DEBUG - e.1 -triggered off ['monitor.1'] -2013/11/07 12:02:09 DEBUG - g.1 -triggered off ['monitor.1'] -2013/11/07 12:02:09 DEBUG - f.1 -triggered off ['monitor.1'] -2013/11/07 12:02:22 DEBUG - i.1 -triggered off ['monitor.1'] -2013/11/07 12:02:22 DEBUG - h.1 -triggered off ['monitor.1'] -2013/11/07 12:02:35 DEBUG - k.1 -triggered off ['monitor.1'] -2013/11/07 12:02:35 DEBUG - j.1 -triggered off ['monitor.1'] -2013/11/07 12:02:48 DEBUG - l.1 -triggered off ['monitor.1'] -2013/11/07 12:02:48 DEBUG - d.1 -triggered off ['monitor.1'] +Initial point: 1 +Final point: 1 +1/monitor -triggered off [] +1/a -triggered off ['1/monitor'] +1/c -triggered off ['1/monitor'] +1/b -triggered off ['1/monitor'] +1/e -triggered off ['1/monitor'] +1/g -triggered off ['1/monitor'] +1/f -triggered off ['1/monitor'] +1/i -triggered off ['1/monitor'] +1/h -triggered off ['1/monitor'] +1/k -triggered off ['1/monitor'] +1/j -triggered off ['1/monitor'] +1/l -triggered off ['1/monitor'] +1/d -triggered off ['1/monitor'] diff --git a/tests/functional/recurrence-min/00-basic/reference.log b/tests/functional/recurrence-min/00-basic/reference.log index 592fe2fb796..8e7f1c25aae 100644 --- a/tests/functional/recurrence-min/00-basic/reference.log +++ b/tests/functional/recurrence-min/00-basic/reference.log @@ -1,3 +1,3 @@ -2015-03-12T12:00:09Z INFO - Initial point: 20100101T0300Z -2015-03-12T12:00:09Z INFO - Final point: None -2015-03-12T12:00:09Z DEBUG - foo.20100101T0600Z -triggered off [] +Initial point: 20100101T0300Z +Final point: None +20100101T0600Z/foo -triggered off [] diff --git a/tests/functional/recurrence-min/01-offset-initial/reference.log b/tests/functional/recurrence-min/01-offset-initial/reference.log index 58ab8f5056a..44cb0a12a65 100644 --- a/tests/functional/recurrence-min/01-offset-initial/reference.log +++ b/tests/functional/recurrence-min/01-offset-initial/reference.log @@ -1,3 +1,3 @@ -2015-03-12T12:01:29Z INFO - Initial point: 20100101T0300Z -2015-03-12T12:01:29Z INFO - Final point: None -2015-03-12T12:01:29Z DEBUG - foo.20100101T0400Z -triggered off [] +Initial point: 20100101T0300Z +Final point: None +20100101T0400Z/foo -triggered off [] diff --git a/tests/functional/recurrence-min/02-offset-truncated/reference.log b/tests/functional/recurrence-min/02-offset-truncated/reference.log index 5d4ac0df923..77bf7a5d29c 100644 --- a/tests/functional/recurrence-min/02-offset-truncated/reference.log +++ b/tests/functional/recurrence-min/02-offset-truncated/reference.log @@ -1,3 +1,3 @@ -2015-03-12T12:02:58Z INFO - Initial point: 20100101T0300Z -2015-03-12T12:02:58Z INFO - Final point: None -2015-03-12T12:02:58Z DEBUG - foo.20100101T0700Z -triggered off [] +Initial point: 20100101T0300Z +Final point: None +20100101T0700Z/foo -triggered off [] diff --git a/tests/functional/recurrence-min/03-neg-offset-truncated/reference.log b/tests/functional/recurrence-min/03-neg-offset-truncated/reference.log index 25521eea6b3..44cb0a12a65 100644 --- a/tests/functional/recurrence-min/03-neg-offset-truncated/reference.log +++ b/tests/functional/recurrence-min/03-neg-offset-truncated/reference.log @@ -1,3 +1,3 @@ -2015-03-12T12:06:30Z INFO - Initial point: 20100101T0300Z -2015-03-12T12:06:30Z INFO - Final point: None -2015-03-12T12:06:30Z DEBUG - foo.20100101T0400Z -triggered off [] +Initial point: 20100101T0300Z +Final point: None +20100101T0400Z/foo -triggered off [] diff --git a/tests/functional/reload/00-simple/reference.log b/tests/functional/reload/00-simple/reference.log index c9c49a03559..ade8b593f7f 100644 --- a/tests/functional/reload/00-simple/reference.log +++ b/tests/functional/reload/00-simple/reference.log @@ -1,5 +1,5 @@ -2013/11/05 11:01:45 INFO - Initial point: 1 -2013/11/05 11:01:45 INFO - Final point: 1 -2013/11/05 11:01:45 DEBUG - a.1 -triggered off [] -2013/11/05 11:01:49 DEBUG - b.1 -triggered off ['a.1'] -2013/11/05 11:01:58 DEBUG - c.1 -triggered off ['b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] diff --git a/tests/functional/reload/01-startup/reference.log b/tests/functional/reload/01-startup/reference.log index 07d35fa13ee..5cf728111a2 100644 --- a/tests/functional/reload/01-startup/reference.log +++ b/tests/functional/reload/01-startup/reference.log @@ -1,13 +1,13 @@ Initial point: 20100101T00 Final point: 20100102T00 -start.20100101T00 -triggered off [] -a.20100101T00 -triggered off ['c.20091231T18', 'start.20100101T00'] -b.20100101T00 -triggered off ['a.20100101T00'] -c.20100101T00 -triggered off ['b.20100101T00'] -a.20100101T06 -triggered off ['c.20100101T00'] -b.20100101T06 -triggered off ['a.20100101T06'] -c.20100101T06 -triggered off ['b.20100101T06'] -c.20100101T18 -triggered off [] -a.20100102T00 -triggered off ['c.20100101T18'] -b.20100102T00 -triggered off ['a.20100102T00'] -c.20100102T00 -triggered off ['b.20100102T00'] +20100101T00/start -triggered off [] +20100101T00/a -triggered off ['20091231T18/c', '20100101T00/start'] +20100101T00/b -triggered off ['20100101T00/a'] +20100101T00/c -triggered off ['20100101T00/b'] +20100101T06/a -triggered off ['20100101T00/c'] +20100101T06/b -triggered off ['20100101T06/a'] +20100101T06/c -triggered off ['20100101T06/b'] +20100101T18/c -triggered off [] +20100102T00/a -triggered off ['20100101T18/c'] +20100102T00/b -triggered off ['20100102T00/a'] +20100102T00/c -triggered off ['20100102T00/b'] diff --git a/tests/functional/reload/02-content/reference.log b/tests/functional/reload/02-content/reference.log index 38933924c55..a1f5f0c4726 100644 --- a/tests/functional/reload/02-content/reference.log +++ b/tests/functional/reload/02-content/reference.log @@ -1,4 +1,4 @@ -2013/11/05 10:48:58 INFO - Initial point: 1 -2013/11/05 10:48:58 INFO - Final point: 1 -2013/11/05 10:48:58 DEBUG - reloader.1 -triggered off [] -2013/11/05 10:49:02 DEBUG - foo.1 -triggered off ['reloader.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/foo -triggered off ['1/reloader'] diff --git a/tests/functional/reload/03-queues/reference.log b/tests/functional/reload/03-queues/reference.log index 583e6bf3b6b..70d9c8ddabf 100644 --- a/tests/functional/reload/03-queues/reference.log +++ b/tests/functional/reload/03-queues/reference.log @@ -1,16 +1,16 @@ -2013/11/18 14:56:41 INFO - Initial point: 1 -2013/11/18 14:56:41 INFO - Final point: 1 -2013/11/18 14:56:41 DEBUG - reloader.1 -triggered off [] -2013/11/18 14:56:44 DEBUG - a.1 -triggered off ['reloader.1'] -2013/11/18 14:56:44 DEBUG - c.1 -triggered off ['reloader.1'] -2013/11/18 14:56:44 DEBUG - b.1 -triggered off ['reloader.1'] -2013/11/18 14:56:44 DEBUG - e.1 -triggered off ['reloader.1'] -2013/11/18 14:56:50 DEBUG - monitor.1 -triggered off ['reloader.1'] -2013/11/18 14:56:57 DEBUG - d.1 -triggered off ['reloader.1'] -2013/11/18 14:56:57 DEBUG - g.1 -triggered off ['reloader.1'] -2013/11/18 14:56:57 DEBUG - f.1 -triggered off ['reloader.1'] -2013/11/18 14:57:11 DEBUG - i.1 -triggered off ['reloader.1'] -2013/11/18 14:57:11 DEBUG - h.1 -triggered off ['reloader.1'] -2013/11/18 14:57:12 DEBUG - k.1 -triggered off ['reloader.1'] -2013/11/18 14:57:24 DEBUG - j.1 -triggered off ['reloader.1'] -2013/11/18 14:57:24 DEBUG - l.1 -triggered off ['reloader.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/a -triggered off ['1/reloader'] +1/c -triggered off ['1/reloader'] +1/b -triggered off ['1/reloader'] +1/e -triggered off ['1/reloader'] +1/monitor -triggered off ['1/reloader'] +1/d -triggered off ['1/reloader'] +1/g -triggered off ['1/reloader'] +1/f -triggered off ['1/reloader'] +1/i -triggered off ['1/reloader'] +1/h -triggered off ['1/reloader'] +1/k -triggered off ['1/reloader'] +1/j -triggered off ['1/reloader'] +1/l -triggered off ['1/reloader'] diff --git a/tests/functional/reload/04-inheritance/reference.log b/tests/functional/reload/04-inheritance/reference.log index b6ba2bad0e7..2f0de54d795 100644 --- a/tests/functional/reload/04-inheritance/reference.log +++ b/tests/functional/reload/04-inheritance/reference.log @@ -1,4 +1,4 @@ -2013/11/05 11:00:11 INFO - Initial point: 1 -2013/11/05 11:00:11 INFO - Final point: 1 -2013/11/05 11:00:11 DEBUG - reloader.1 -triggered off [] -2013/11/05 11:00:20 DEBUG - inheritor.1 -triggered off ['reloader.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/inheritor -triggered off ['1/reloader'] diff --git a/tests/functional/reload/05-graphing-simple/reference.log b/tests/functional/reload/05-graphing-simple/reference.log index d46e7eb2529..9964f993934 100644 --- a/tests/functional/reload/05-graphing-simple/reference.log +++ b/tests/functional/reload/05-graphing-simple/reference.log @@ -1,6 +1,6 @@ -2013/11/05 10:59:35 INFO - Initial point: 1 -2013/11/05 10:59:35 INFO - Final point: 1 -2013/11/05 10:59:35 DEBUG - reloader.1 -triggered off [] -2013/11/05 10:59:44 DEBUG - inter.1 -triggered off ['reloader.1'] -2013/11/05 10:59:44 DEBUG - foo.1 -triggered off ['inter.1'] -2013/11/05 10:59:52 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/inter -triggered off ['1/reloader'] +1/foo -triggered off ['1/inter'] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/reload/06-graphing-fam/reference.log b/tests/functional/reload/06-graphing-fam/reference.log index c894fe05e91..30d8db6346e 100644 --- a/tests/functional/reload/06-graphing-fam/reference.log +++ b/tests/functional/reload/06-graphing-fam/reference.log @@ -1,12 +1,12 @@ -2013/11/05 10:58:59 INFO - Initial point: 1 -2013/11/05 10:58:59 INFO - Final point: 1 -2013/11/05 10:58:59 DEBUG - reloader.1 -triggered off [] -2013/11/05 10:58:59 DEBUG - inter.1 -triggered off ['reloader.1'] -2013/11/05 10:59:08 DEBUG - a.1 -triggered off ['inter.1'] -2013/11/05 10:59:08 DEBUG - c.1 -triggered off ['inter.1'] -2013/11/05 10:59:08 DEBUG - b.1 -triggered off ['inter.1'] -2013/11/05 10:59:08 DEBUG - d.1 -triggered off ['inter.1'] -2013/11/05 10:59:16 DEBUG - e.1 -triggered off ['a.1', 'b.1', 'c.1', 'd.1'] -2013/11/05 10:59:16 DEBUG - g.1 -triggered off ['a.1', 'b.1', 'c.1', 'd.1'] -2013/11/05 10:59:16 DEBUG - f.1 -triggered off ['a.1', 'b.1', 'c.1', 'd.1'] -2013/11/05 10:59:16 DEBUG - h.1 -triggered off ['a.1', 'b.1', 'c.1', 'd.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/inter -triggered off ['1/reloader'] +1/a -triggered off ['1/inter'] +1/c -triggered off ['1/inter'] +1/b -triggered off ['1/inter'] +1/d -triggered off ['1/inter'] +1/e -triggered off ['1/a', '1/b', '1/c', '1/d'] +1/g -triggered off ['1/a', '1/b', '1/c', '1/d'] +1/f -triggered off ['1/a', '1/b', '1/c', '1/d'] +1/h -triggered off ['1/a', '1/b', '1/c', '1/d'] diff --git a/tests/functional/reload/07-final-cycle/reference.log b/tests/functional/reload/07-final-cycle/reference.log index 30d66a78d3c..157e4afbf15 100644 --- a/tests/functional/reload/07-final-cycle/reference.log +++ b/tests/functional/reload/07-final-cycle/reference.log @@ -1,6 +1,6 @@ Initial point: 20100101T0000Z Final point: 20100102T0000Z -reloader.20100101T0000Z -triggered off [] -a.20100101T0000Z -triggered off ['a.20091231T1800Z', 'reloader.20100101T0000Z'] -a.20100101T0600Z -triggered off ['a.20100101T0000Z'] -a.20100101T1200Z -triggered off ['a.20100101T0600Z'] +20100101T0000Z/reloader -triggered off [] +20100101T0000Z/a -triggered off ['20091231T1800Z/a', '20100101T0000Z/reloader'] +20100101T0600Z/a -triggered off ['20100101T0000Z/a'] +20100101T1200Z/a -triggered off ['20100101T0600Z/a'] diff --git a/tests/functional/reload/08-cycle/reference.log b/tests/functional/reload/08-cycle/reference.log index 1a9f2558fc9..c72b82eb258 100644 --- a/tests/functional/reload/08-cycle/reference.log +++ b/tests/functional/reload/08-cycle/reference.log @@ -1,7 +1,7 @@ Initial point: 20100101T0000Z Final point: 20100101T1800Z -reloader.20100101T0000Z -triggered off [] -a.20100101T0000Z -triggered off ['a.20091231T1800Z', 'reloader.20100101T0000Z'] -a.20100101T0600Z -triggered off ['a.20100101T0000Z'] -a.20100101T1200Z -triggered off ['a.20100101T0600Z'] -a.20100101T1800Z -triggered off ['a.20100101T1200Z'] +20100101T0000Z/reloader -triggered off [] +20100101T0000Z/a -triggered off ['20091231T1800Z/a', '20100101T0000Z/reloader'] +20100101T0600Z/a -triggered off ['20100101T0000Z/a'] +20100101T1200Z/a -triggered off ['20100101T0600Z/a'] +20100101T1800Z/a -triggered off ['20100101T1200Z/a'] diff --git a/tests/functional/reload/11-retrying/flow.cylc b/tests/functional/reload/11-retrying/flow.cylc index 52191a76d40..d5b278b2798 100644 --- a/tests/functional/reload/11-retrying/flow.cylc +++ b/tests/functional/reload/11-retrying/flow.cylc @@ -1,28 +1,30 @@ [meta] title = "test that a reloaded retrying task does retry" - description = """this requires some state vars to be carried over to the -new task proxy; ref github #945""" + description = """ + this requires some state vars to be carried over to the + new task proxy; ref github #945 + """ [scheduling] [[graph]] R1 = retrier & reloader [runtime] [[retrier]] script = """ -cylc__job__wait_cylc_message_started -sleep 1 -if ((CYLC_TASK_TRY_NUMBER == 1)); then - # Kill the job, so task will go into waiting (held) - cylc kill "${CYLC_WORKFLOW_ID}" 'retrier.1' - sleep 120 # Does not matter how long as the job will be killed -fi + cylc__job__wait_cylc_message_started + sleep 1 + if ((CYLC_TASK_TRY_NUMBER == 1)); then + # Kill the job, so task will go into waiting (held) + cylc kill "${CYLC_WORKFLOW_ID}//1/retrier" + sleep 120 # Does not matter how long as the job will be killed + fi """ [[[job]]] execution retry delays = PT0S [[reloader]] script = """ -cylc__job__poll_grep_workflow_log -E 'retrier\.1 running\(held\) .* => waiting\(held\)' -cylc reload "${CYLC_WORKFLOW_ID}" -cylc reload "${CYLC_WORKFLOW_ID}" -cylc__job__poll_grep_workflow_log -F 'Reload completed' -cylc release "${CYLC_WORKFLOW_ID}" 'retrier.1' + cylc__job__poll_grep_workflow_log -E '1/retrier running\(held\) .* => waiting\(held\)' + cylc reload "${CYLC_WORKFLOW_ID}" + cylc reload "${CYLC_WORKFLOW_ID}" + cylc__job__poll_grep_workflow_log -F 'Reload completed' + cylc release "${CYLC_WORKFLOW_ID}//1/retrier" """ diff --git a/tests/functional/reload/11-retrying/reference.log b/tests/functional/reload/11-retrying/reference.log index 159fd1d4564..bda2f612bf2 100644 --- a/tests/functional/reload/11-retrying/reference.log +++ b/tests/functional/reload/11-retrying/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -retrier.1 -triggered off [] -reloader.1 -triggered off [] -retrier.1 -triggered off [] +1/retrier -triggered off [] +1/reloader -triggered off [] +1/retrier -triggered off [] diff --git a/tests/functional/reload/12-remove-task/reference.log b/tests/functional/reload/12-remove-task/reference.log index ffbaf9322f1..332b846626f 100644 --- a/tests/functional/reload/12-remove-task/reference.log +++ b/tests/functional/reload/12-remove-task/reference.log @@ -1,5 +1,5 @@ -2014-10-29T15:19:51Z INFO - Initial point: 1 -2014-10-29T15:19:51Z INFO - Final point: 1 -2014-10-29T15:19:51Z DEBUG - reloader.1 -triggered off [] -2014-10-29T15:20:05Z DEBUG - inter.1 -triggered off ['reloader.1'] -2014-10-29T15:20:05Z DEBUG - foo.1 -triggered off ['inter.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/inter -triggered off ['1/reloader'] +1/foo -triggered off ['1/inter'] diff --git a/tests/functional/reload/13-add-task/reference.log b/tests/functional/reload/13-add-task/reference.log index e13c9fd8127..e82950a62be 100644 --- a/tests/functional/reload/13-add-task/reference.log +++ b/tests/functional/reload/13-add-task/reference.log @@ -1,5 +1,5 @@ -2014-10-31T13:50:55+13 INFO - Initial point: 1 -2014-10-31T13:50:55+13 INFO - Final point: 1 -2014-10-31T13:50:55+13 DEBUG - reloader.1 -triggered off [] -2014-10-31T13:51:08+13 DEBUG - foo.1 -triggered off ['reloader.1'] -2014-10-31T13:51:08+13 DEBUG - add_me.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/foo -triggered off ['1/reloader'] +1/add_me -triggered off ['1/foo'] diff --git a/tests/functional/reload/14-waiting/flow.cylc b/tests/functional/reload/14-waiting/flow.cylc index 3cbfe60f8c2..f81ac3533b0 100644 --- a/tests/functional/reload/14-waiting/flow.cylc +++ b/tests/functional/reload/14-waiting/flow.cylc @@ -24,7 +24,7 @@ done [[reloader]] script = """ cylc reload "${CYLC_WORKFLOW_ID}" -cylc__job__poll_grep_workflow_log -E 'waiter\.1 .* reloaded task definition' +cylc__job__poll_grep_workflow_log -E '1/waiter .* reloaded task definition' rm -f "${CYLC_WORKFLOW_WORK_DIR}/1/sleeping-waiter/file" rm -f "${CYLC_WORKFLOW_WORK_DIR}/1/starter/file" """ diff --git a/tests/functional/reload/14-waiting/reference.log b/tests/functional/reload/14-waiting/reference.log index eaf0099bdbb..e9cf3b1b2e0 100644 --- a/tests/functional/reload/14-waiting/reference.log +++ b/tests/functional/reload/14-waiting/reference.log @@ -1,6 +1,6 @@ -2014-11-13T10:12:31Z INFO - Initial point: 1 -2014-11-13T10:12:31Z INFO - Final point: 1 -2014-11-13T10:12:31Z DEBUG - starter.1 -triggered off [] -2014-11-13T10:12:31Z DEBUG - sleeping-waiter.1 -triggered off [] -2014-11-13T10:12:34Z DEBUG - reloader.1 -triggered off ['sleeping-waiter.1'] -2014-11-13T10:12:40Z DEBUG - waiter.1 -triggered off ['sleeping-waiter.1', 'starter.1'] +Initial point: 1 +Final point: 1 +1/starter -triggered off [] +1/sleeping-waiter -triggered off [] +1/reloader -triggered off ['1/sleeping-waiter'] +1/waiter -triggered off ['1/sleeping-waiter', '1/starter'] diff --git a/tests/functional/reload/16-remove-add-alter-task/reference.log b/tests/functional/reload/16-remove-add-alter-task/reference.log index 0abd8f98e78..cde339ee931 100644 --- a/tests/functional/reload/16-remove-add-alter-task/reference.log +++ b/tests/functional/reload/16-remove-add-alter-task/reference.log @@ -1,5 +1,5 @@ -2016-05-03T09:57:39Z INFO - Initial point: 1 -2016-05-03T09:57:39Z INFO - Final point: 1 -2016-05-03T09:57:39Z DEBUG - reloader.1 -triggered off [] -2016-05-03T09:57:39Z DEBUG - inter.1 -triggered off ['reloader.1'] -2016-05-03T09:58:24Z DEBUG - remove_add_alter_me.1 -triggered off ['inter.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/inter -triggered off ['1/reloader'] +1/remove_add_alter_me -triggered off ['1/inter'] diff --git a/tests/functional/reload/17-graphing-change.t b/tests/functional/reload/17-graphing-change.t index d2824653d4c..81aa8b58754 100755 --- a/tests/functional/reload/17-graphing-change.t +++ b/tests/functional/reload/17-graphing-change.t @@ -66,8 +66,8 @@ cp "${TEST_SOURCE_DIR}/graphing-change/flow-2.cylc" \ "${RUN_DIR}/${WORKFLOW_NAME}/flow.cylc" # Spawn a couple of task proxies, to get "task definition removed" message. -cylc set-outputs --flow=1 "${WORKFLOW_NAME}" foo.1 -cylc set-outputs --flow=1 "${WORKFLOW_NAME}" baz.1 +cylc set-outputs --flow=1 "${WORKFLOW_NAME}//1/foo" +cylc set-outputs --flow=1 "${WORKFLOW_NAME}//1/baz" # reload workflow run_ok "${TEST_NAME_BASE}-swap-reload" cylc reload "${WORKFLOW_NAME}" poll grep_workflow_log_n_times 'Reload completed' 3 @@ -76,8 +76,8 @@ poll grep_workflow_log_n_times 'Reload completed' 3 grep_ok "Added task: 'one'" "${LOG_FILE}" grep_ok "Added task: 'add'" "${LOG_FILE}" grep_ok "Added task: 'boo'" "${LOG_FILE}" -grep_ok "\\[bar.*\\].*task definition removed" "${LOG_FILE}" -grep_ok "\\[bol.*\\].*task definition removed" "${LOG_FILE}" +grep_ok "\\[1/bar.*\\].*task definition removed" "${LOG_FILE}" +grep_ok "\\[1/bol.*\\].*task definition removed" "${LOG_FILE}" run_ok "${TEST_NAME_BASE}-stop" \ cylc stop --max-polls=10 --interval=2 "${WORKFLOW_NAME}" diff --git a/tests/functional/reload/18-broadcast-insert/flow.cylc b/tests/functional/reload/18-broadcast-insert/flow.cylc index 50766e6c3a4..35f52f9cbb5 100644 --- a/tests/functional/reload/18-broadcast-insert/flow.cylc +++ b/tests/functional/reload/18-broadcast-insert/flow.cylc @@ -5,9 +5,12 @@ [runtime] [[foo]] script=""" -cylc broadcast "${CYLC_WORKFLOW_ID}" -s '[environment]CYLC_TEST_VAR=1' -cp -p "${CYLC_WORKFLOW_RUN_DIR}/flow-2.cylc" "${CYLC_WORKFLOW_RUN_DIR}/flow.cylc" -cylc reload "${CYLC_WORKFLOW_ID}" -sleep 5 -cylc trigger "${CYLC_WORKFLOW_ID}" 'bar.1' -""" + cylc broadcast "${CYLC_WORKFLOW_ID}" \ + -s '[environment]CYLC_TEST_VAR=1' + cp -p \ + "${CYLC_WORKFLOW_RUN_DIR}/flow-2.cylc" \ + "${CYLC_WORKFLOW_RUN_DIR}/flow.cylc" + cylc reload "${CYLC_WORKFLOW_ID}" + sleep 5 + cylc trigger "${CYLC_WORKFLOW_ID}//1/bar" + """ diff --git a/tests/functional/reload/18-broadcast-insert/reference.log b/tests/functional/reload/18-broadcast-insert/reference.log index 77198278217..499c919d40d 100644 --- a/tests/functional/reload/18-broadcast-insert/reference.log +++ b/tests/functional/reload/18-broadcast-insert/reference.log @@ -1,4 +1,4 @@ -2016-07-08T14:53:12+01 INFO - Initial point: 1 -2016-07-08T14:53:12+01 INFO - Final point: 1 -2016-07-08T14:53:12+01 DEBUG - foo.1 -triggered off [] -2016-07-08T14:53:19+01 DEBUG - bar.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off [] diff --git a/tests/functional/reload/19-remote-kill/flow.cylc b/tests/functional/reload/19-remote-kill/flow.cylc index 4a40264b300..2bd548b15f7 100644 --- a/tests/functional/reload/19-remote-kill/flow.cylc +++ b/tests/functional/reload/19-remote-kill/flow.cylc @@ -4,7 +4,7 @@ [[events]] abort on stall timeout = True stall timeout = PT0S - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] @@ -16,8 +16,8 @@ cylc__job__wait_cylc_message_started cylc reload "${CYLC_WORKFLOW_ID}" cylc__job__poll_grep_workflow_log -F 'Reload completed' - cylc kill "${CYLC_WORKFLOW_ID}" 'foo.1' - cylc__job__poll_grep_workflow_log -E 'foo\.1 failed\(held\) job:01.* job killed' + cylc kill "${CYLC_WORKFLOW_ID}//1/foo" + cylc__job__poll_grep_workflow_log -E '1/foo failed\(held\) job:01.* job killed' """ [[[job]]] execution time limit = PT1M diff --git a/tests/functional/reload/19-remote-kill/reference.log b/tests/functional/reload/19-remote-kill/reference.log index da823349e1a..1a9f846c98d 100644 --- a/tests/functional/reload/19-remote-kill/reference.log +++ b/tests/functional/reload/19-remote-kill/reference.log @@ -1,4 +1,4 @@ -2016-07-08T14:53:12+01 INFO - Initial point: 1 -2016-07-08T14:53:12+01 INFO - Final point: 1 -2016-07-08T14:53:12+01 DEBUG - foo.1 -triggered off [] -2016-07-08T14:53:19+01 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/reload/20-stop-point/flow.cylc b/tests/functional/reload/20-stop-point/flow.cylc index 5a74161ea70..538328c8ee2 100644 --- a/tests/functional/reload/20-stop-point/flow.cylc +++ b/tests/functional/reload/20-stop-point/flow.cylc @@ -15,7 +15,7 @@ [runtime] [[set-stop-point]] - script = cylc stop "${CYLC_WORKFLOW_ID}" '3' + script = cylc stop "${CYLC_WORKFLOW_ID}//3" [[reload]] script = """ cylc__job__wait_cylc_message_started diff --git a/tests/functional/reload/20-stop-point/reference.log b/tests/functional/reload/20-stop-point/reference.log index 950ddb5dd9e..2822c1470fa 100644 --- a/tests/functional/reload/20-stop-point/reference.log +++ b/tests/functional/reload/20-stop-point/reference.log @@ -1,7 +1,7 @@ -INFO - Initial point: 1 -INFO - Final point: 5 -DEBUG - set-stop-point.1 -triggered off [] -DEBUG - reload.1 -triggered off ['set-stop-point.1'] -DEBUG - t1.1 -triggered off ['reload.1', 't1.0'] -DEBUG - t1.2 -triggered off ['t1.1'] -DEBUG - t1.3 -triggered off ['t1.2'] +Initial point: 1 +Final point: 5 +1/set-stop-point -triggered off [] +1/reload -triggered off ['1/set-stop-point'] +1/t1 -triggered off ['0/t1', '1/reload'] +2/t1 -triggered off ['1/t1'] +3/t1 -triggered off ['2/t1'] diff --git a/tests/functional/reload/21-submit-fail/flow.cylc b/tests/functional/reload/21-submit-fail/flow.cylc index 5a5b5c0a1e1..c1821e1b81f 100644 --- a/tests/functional/reload/21-submit-fail/flow.cylc +++ b/tests/functional/reload/21-submit-fail/flow.cylc @@ -3,7 +3,7 @@ [[events]] abort on stall timeout = True stall timeout = PT0S - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] R1=""" diff --git a/tests/functional/reload/garbage/reference.log b/tests/functional/reload/garbage/reference.log index 7f5efb47268..a1f5f0c4726 100644 --- a/tests/functional/reload/garbage/reference.log +++ b/tests/functional/reload/garbage/reference.log @@ -1,4 +1,4 @@ -2013/11/06 10:27:36 INFO - Initial point: 1 -2013/11/06 10:27:36 INFO - Final point: 1 -2013/11/06 10:27:36 DEBUG - reloader.1 -triggered off [] -2013/11/06 10:27:45 DEBUG - foo.1 -triggered off ['reloader.1'] +Initial point: 1 +Final point: 1 +1/reloader -triggered off [] +1/foo -triggered off ['1/reloader'] diff --git a/tests/functional/reload/runahead/flow.cylc b/tests/functional/reload/runahead/flow.cylc index cc0d837a789..5f6640ee6c9 100644 --- a/tests/functional/reload/runahead/flow.cylc +++ b/tests/functional/reload/runahead/flow.cylc @@ -3,6 +3,7 @@ [[events]] stall timeout = PT0.2M abort on stall timeout = True + [scheduling] initial cycle point = 2010-01-01 final cycle point = 2010-01-05 @@ -11,6 +12,7 @@ # oops is stuck waiting task to hold back runahead R1/T00 = "foo & reloader => oops" T00/PT6H = "foo => bar" + [runtime] [[foo]] script = false @@ -18,7 +20,7 @@ script = true [[reloader]] script = """ -cylc__job__poll_grep_workflow_log -E "foo\.${CYLC_TASK_CYCLE_POINT} running .*\(received\)failed" -perl -pi -e 's/(runahead limit = )P2( # marker)/\1 P4\2/' $CYLC_WORKFLOW_RUN_DIR/flow.cylc -cylc reload $CYLC_WORKFLOW_ID -""" + cylc__job__poll_grep_workflow_log -E "${CYLC_TASK_CYCLE_POINT}/foo running .*\(received\)failed" + perl -pi -e 's/(runahead limit = )P2( # marker)/\1 P4\2/' $CYLC_WORKFLOW_RUN_DIR/flow.cylc + cylc reload $CYLC_WORKFLOW_ID + """ diff --git a/tests/functional/remote/03-polled-task-started/flow.cylc b/tests/functional/remote/03-polled-task-started/flow.cylc index d74820c50ed..45bd9ae43c8 100644 --- a/tests/functional/remote/03-polled-task-started/flow.cylc +++ b/tests/functional/remote/03-polled-task-started/flow.cylc @@ -2,7 +2,7 @@ [scheduler] allow implicit tasks = True [[events]] - expected task failures = janeway.1 + expected task failures = 1/janeway [scheduling] cycling mode = integer [[graph]] diff --git a/tests/functional/remote/03-polled-task-started/reference.log b/tests/functional/remote/03-polled-task-started/reference.log index 10ad68e1c41..9824d27682e 100644 --- a/tests/functional/remote/03-polled-task-started/reference.log +++ b/tests/functional/remote/03-polled-task-started/reference.log @@ -1,5 +1,5 @@ -DEBUG - picard.1 -triggered off [] -DEBUG - worf.1 -triggered off ['picard.1'] -DEBUG - riker.1 -triggered off ['picard.1'] -DEBUG - janeway.1 -triggered off [] -DEBUG - tuvok.1 -triggered off ['janeway.1'] +1/picard -triggered off [] +1/worf -triggered off ['1/picard'] +1/riker -triggered off ['1/picard'] +1/janeway -triggered off [] +1/tuvok -triggered off ['1/janeway'] diff --git a/tests/functional/remote/05-remote-init.t b/tests/functional/remote/05-remote-init.t index a66a23371df..648c0727b58 100644 --- a/tests/functional/remote/05-remote-init.t +++ b/tests/functional/remote/05-remote-init.t @@ -53,8 +53,8 @@ g|0|0|localhost __SELECT__ grep_ok "WARNING - Incomplete tasks:" "${TEST_NAME_BASE}-run.stderr" -grep_ok "a.1 did not complete required outputs" "${TEST_NAME_BASE}-run.stderr" -grep_ok "b.1 did not complete required outputs" "${TEST_NAME_BASE}-run.stderr" +grep_ok "1/a did not complete required outputs" "${TEST_NAME_BASE}-run.stderr" +grep_ok "1/b did not complete required outputs" "${TEST_NAME_BASE}-run.stderr" purge exit diff --git a/tests/functional/remote/06-poll.t b/tests/functional/remote/06-poll.t index 5d7200bb25b..251c62961ca 100644 --- a/tests/functional/remote/06-poll.t +++ b/tests/functional/remote/06-poll.t @@ -52,8 +52,8 @@ log_scan \ "$(cylc cat-log -m p "$WORKFLOW_NAME")" \ 10 \ 1 \ - '\[foo\.1 submitted .* (polled)foo' \ - '\[foo\.1 submitted .* (polled)succeeded' + '\[1/foo submitted .* (polled)foo' \ + '\[1/foo submitted .* (polled)succeeded' purge exit diff --git a/tests/functional/remote/basic/reference.log b/tests/functional/remote/basic/reference.log index daab7c24b9b..08fe5d5558a 100644 --- a/tests/functional/remote/basic/reference.log +++ b/tests/functional/remote/basic/reference.log @@ -1,3 +1,3 @@ -2015-02-03T15:12:56Z INFO - Initial point: 1 -2015-02-03T15:12:56Z INFO - Final point: 1 -2015-02-03T15:12:56Z DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/restart/08-stop-after-cycle-point.t b/tests/functional/restart/08-stop-after-cycle-point.t index ed6e090904c..aaac8d8b30b 100644 --- a/tests/functional/restart/08-stop-after-cycle-point.t +++ b/tests/functional/restart/08-stop-after-cycle-point.t @@ -59,7 +59,7 @@ workflow_run_ok "${TEST_NAME_BASE}-restart-db-stopcp" \ dumpdbtables # Stop point should be removed from DB once reached cmp_ok stopcp.out < /dev/null -# Task hello.1974 (after stop point) should be spawned but not submitted +# Task 1974/hello (after stop point) should be spawned but not submitted cmp_ok taskpool.out <<'__OUT__' 1974|hello|waiting __OUT__ diff --git a/tests/functional/restart/08-stop-after-cycle-point/reference.log b/tests/functional/restart/08-stop-after-cycle-point/reference.log index 5d409627723..dadf3f0c405 100644 --- a/tests/functional/restart/08-stop-after-cycle-point/reference.log +++ b/tests/functional/restart/08-stop-after-cycle-point/reference.log @@ -1,4 +1,4 @@ -Initial point: 19700101T0000Z -Final point: 19700101T0300Z -hello.19700101T0000Z -triggered off ['hello.19691231T2300Z'] -hello.19700101T0100Z -triggered off ['hello.19700101T0000Z'] +nitial point: 19700101T0000Z +inal point: 19700101T0300Z +19700101T0000Z/hello -triggered off ['19691231T2300Z/hello'] +19700101T0100Z/hello -triggered off ['19700101T0000Z/hello'] diff --git a/tests/functional/restart/16-template-vars/reference.log b/tests/functional/restart/16-template-vars/reference.log index 127ccdd8873..df6f2c7ca76 100644 --- a/tests/functional/restart/16-template-vars/reference.log +++ b/tests/functional/restart/16-template-vars/reference.log @@ -1,4 +1,4 @@ -2016-06-30T11:27:42Z INFO - Initial point: 20160101T0000Z -2016-06-30T11:27:42Z INFO - Final point: 20200101T0000Z -2016-06-30T11:27:42Z DEBUG - foo.20190101T0000Z -triggered off [] -2016-06-30T11:27:44Z DEBUG - foo.20200101T0000Z -triggered off [] +Initial point: 20160101T0000Z +Final point: 20200101T0000Z +20190101T0000Z/foo -triggered off [] +20200101T0000Z/foo -triggered off [] diff --git a/tests/functional/restart/18-template-vars-override/reference.log b/tests/functional/restart/18-template-vars-override/reference.log index e7e59303de4..d32a8934c83 100644 --- a/tests/functional/restart/18-template-vars-override/reference.log +++ b/tests/functional/restart/18-template-vars-override/reference.log @@ -1,6 +1,6 @@ -2016-06-30T11:27:42Z INFO - Initial point: 20160101T0000Z -2016-06-30T11:27:42Z INFO - Final point: 20220101T0000Z -2016-06-30T11:27:42Z DEBUG - foo.20190101T0000Z -triggered off [] -2016-06-30T11:27:44Z DEBUG - foo.20200101T0000Z -triggered off [] -2016-06-30T11:27:44Z DEBUG - foo.20210101T0000Z -triggered off [] -2016-06-30T11:27:44Z DEBUG - foo.20220101T0000Z -triggered off [] +Initial point: 20160101T0000Z +Final point: 20220101T0000Z +20190101T0000Z/foo -triggered off [] +20200101T0000Z/foo -triggered off [] +20210101T0000Z/foo -triggered off [] +20220101T0000Z/foo -triggered off [] diff --git a/tests/functional/restart/20-event-retry.t b/tests/functional/restart/20-event-retry.t index d00f9d9c0ca..a3a4e496348 100755 --- a/tests/functional/restart/20-event-retry.t +++ b/tests/functional/restart/20-event-retry.t @@ -33,7 +33,7 @@ cmp_ok "${WORKFLOWD}/file" <<'__TEXT__' 2 __TEXT__ grep_ok 'LOADING task action timers' "${WORKFLOWD}/log/workflow/log" -grep_ok "+ t01\\.1 \[\['event-handler-00', 'succeeded'\], 1\]" "${WORKFLOWD}/log/workflow/log" +grep_ok "+ 1/t01 \[\['event-handler-00', 'succeeded'\], 1\]" "${WORKFLOWD}/log/workflow/log" purge exit diff --git a/tests/functional/restart/22-hold.t b/tests/functional/restart/22-hold.t index fb10fd4e4a3..777c50d5313 100755 --- a/tests/functional/restart/22-hold.t +++ b/tests/functional/restart/22-hold.t @@ -40,7 +40,7 @@ cmp_ok 'tasks_to_hold-1.out' << __EOF__ __EOF__ workflow_run_ok "${TEST_NAME_BASE}-restart" cylc play "${WORKFLOW_NAME}" --debug --no-detach -grep_ok 'INFO - + t2\.2016 waiting (held)' "${WORKFLOW_RUN_DIR}/log/workflow/log" +grep_ok 'INFO - + 2016/t2 waiting (held)' "${WORKFLOW_RUN_DIR}/log/workflow/log" # Check task pool sqlite3 "${WORKFLOW_RUN_DIR}/log/db" \ 'SELECT * FROM task_pool' >'task_pool-end.out' diff --git a/tests/functional/restart/22-hold/flow.cylc b/tests/functional/restart/22-hold/flow.cylc index 8a752db7549..4f2b44bdde8 100644 --- a/tests/functional/restart/22-hold/flow.cylc +++ b/tests/functional/restart/22-hold/flow.cylc @@ -17,11 +17,11 @@ [[t1]] script = """ if [[ "${CYLC_TASK_CYCLE_POINT}" == '2016' ]]; then - cylc__job__poll_grep_workflow_log -E 't2\.2016 .* spawned' - cylc hold "${CYLC_WORKFLOW_ID}" t2.2016 t2.2017 + cylc__job__poll_grep_workflow_log -E '2016/t2 .* spawned' + cylc hold "${CYLC_WORKFLOW_ID}//" //2016/t2 //2017/t2 cylc stop "${CYLC_WORKFLOW_ID}" else - cylc release "${CYLC_WORKFLOW_ID}" t2.2016 t2.2017 + cylc release "${CYLC_WORKFLOW_ID}//" //2016/t2 //2017/t2 fi """ [[fast]] diff --git a/tests/functional/restart/23-hold-retry.t b/tests/functional/restart/23-hold-retry.t index ac66242cb09..b53d9fe6f12 100755 --- a/tests/functional/restart/23-hold-retry.t +++ b/tests/functional/restart/23-hold-retry.t @@ -35,9 +35,9 @@ __OUT__ cylc play "${WORKFLOW_NAME}" --debug --no-detach 1>'out' 2>&1 & WORKFLOW_PID=$! -poll_grep_workflow_log -F 'INFO - + t1.1 waiting (held)' +poll_grep_workflow_log -F 'INFO - + 1/t1 waiting (held)' -run_ok "${TEST_NAME_BASE}-release" cylc release "${WORKFLOW_NAME}" t1.1 +run_ok "${TEST_NAME_BASE}-release" cylc release "${WORKFLOW_NAME}//1/t1" poll_grep_workflow_log -F 'INFO - DONE' diff --git a/tests/functional/restart/23-hold-retry/flow.cylc b/tests/functional/restart/23-hold-retry/flow.cylc index 81c5caa42e1..aca690e275f 100644 --- a/tests/functional/restart/23-hold-retry/flow.cylc +++ b/tests/functional/restart/23-hold-retry/flow.cylc @@ -10,11 +10,11 @@ [runtime] [[t1]] script = """ -if ((CYLC_TASK_TRY_NUMBER == 1)); then - cylc stop "${CYLC_WORKFLOW_ID}" - cylc kill "${CYLC_WORKFLOW_ID}" "${CYLC_TASK_ID}" - sleep 120 # Should not matter because the job will be killed -fi -""" + if ((CYLC_TASK_TRY_NUMBER == 1)); then + cylc stop "${CYLC_WORKFLOW_ID}" + cylc kill "${CYLC_WORKFLOW_ID}//${CYLC_TASK_ID}" + sleep 120 # Should not matter because the job will be killed + fi + """ [[[job]]] execution retry delays = PT0S diff --git a/tests/functional/restart/25-hold-workflow.t b/tests/functional/restart/25-hold-workflow.t index f6b005313bd..058d9e15107 100755 --- a/tests/functional/restart/25-hold-workflow.t +++ b/tests/functional/restart/25-hold-workflow.t @@ -39,11 +39,11 @@ cylc play "${WORKFLOW_NAME}" --debug --no-detach 1>"${TEST_NAME_BASE}-restart.ou CYLC_RESTART_PID=$! poll_workflow_running -cylc release "${WORKFLOW_NAME}" 't2.2016' +cylc release "${WORKFLOW_NAME}//2016/t2" poll_grep 'CYLC_JOB_EXIT' "${WORKFLOW_RUN_DIR}/log/job/2016/t2/01/job.status" cylc release --all "${WORKFLOW_NAME}" -cylc poll "${WORKFLOW_NAME}" +cylc poll "${WORKFLOW_NAME}//*" # Ensure workflow has completed run_ok "${TEST_NAME_BASE}-restart" wait "${CYLC_RESTART_PID}" diff --git a/tests/functional/restart/26-remote-kill.t b/tests/functional/restart/26-remote-kill.t index 66aa8226254..13ce44e9349 100755 --- a/tests/functional/restart/26-remote-kill.t +++ b/tests/functional/restart/26-remote-kill.t @@ -30,7 +30,7 @@ cmp_ok 't1-status.out' <<<'running' run_ok "${TEST_NAME_BASE}-restart" cylc play "${WORKFLOW_NAME}" # Ensure workflow has started poll_workflow_running -cylc kill "${WORKFLOW_NAME}" 't1.1' +cylc kill "${WORKFLOW_NAME}//1/t1" # Ensure workflow has completed poll_workflow_stopped diff --git a/tests/functional/restart/27-broadcast-timeout/reference.log b/tests/functional/restart/27-broadcast-timeout/reference.log index 952af530a21..f5b07b250ba 100644 --- a/tests/functional/restart/27-broadcast-timeout/reference.log +++ b/tests/functional/restart/27-broadcast-timeout/reference.log @@ -1,3 +1,3 @@ -2017-03-02T20:25:55Z INFO - Initial point: 1 -2017-03-02T20:25:55Z INFO - Final point: 1 -2017-03-02T20:25:55Z DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/restart/28-execution-timeout.t b/tests/functional/restart/28-execution-timeout.t index d607a16398a..e0b51fd4304 100755 --- a/tests/functional/restart/28-execution-timeout.t +++ b/tests/functional/restart/28-execution-timeout.t @@ -25,9 +25,9 @@ workflow_run_ok "${TEST_NAME_BASE}-run" cylc play "${WORKFLOW_NAME}" --no-detach workflow_run_ok "${TEST_NAME_BASE}-restart" \ cylc play "${WORKFLOW_NAME}" --no-detach --reference-test contains_ok "${WORKFLOW_RUN_DIR}/log/job/1/foo/NN/job-activity.log" <<'__LOG__' -[(('event-handler-00', 'execution timeout'), 1) cmd] echo foo.1 'execution timeout' +[(('event-handler-00', 'execution timeout'), 1) cmd] echo 1/foo 'execution timeout' [(('event-handler-00', 'execution timeout'), 1) ret_code] 0 -[(('event-handler-00', 'execution timeout'), 1) out] foo.1 execution timeout +[(('event-handler-00', 'execution timeout'), 1) out] 1/foo execution timeout __LOG__ purge exit diff --git a/tests/functional/restart/28-execution-timeout/reference.log b/tests/functional/restart/28-execution-timeout/reference.log index 952af530a21..f5b07b250ba 100644 --- a/tests/functional/restart/28-execution-timeout/reference.log +++ b/tests/functional/restart/28-execution-timeout/reference.log @@ -1,3 +1,3 @@ -2017-03-02T20:25:55Z INFO - Initial point: 1 -2017-03-02T20:25:55Z INFO - Final point: 1 -2017-03-02T20:25:55Z DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/restart/30-outputs/reference.log b/tests/functional/restart/30-outputs/reference.log index d3bb47356bc..81f9ff26df7 100644 --- a/tests/functional/restart/30-outputs/reference.log +++ b/tests/functional/restart/30-outputs/reference.log @@ -1,3 +1,3 @@ -2017-07-19T14:54:42+01 INFO - Initial point: 1 -2017-07-19T14:54:42+01 INFO - Final point: 1 -2017-07-19T14:54:43+01 DEBUG - t3.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t3 -triggered off ['1/t1'] diff --git a/tests/functional/restart/32-reload-runahead-no-stop-point/reference.log b/tests/functional/restart/32-reload-runahead-no-stop-point/reference.log index 76382012786..341200729fc 100644 --- a/tests/functional/restart/32-reload-runahead-no-stop-point/reference.log +++ b/tests/functional/restart/32-reload-runahead-no-stop-point/reference.log @@ -1,4 +1,4 @@ 2017-07-19T14:54:42+01 INFO - Initial point: 2018 -2017-07-19T14:54:43+01 DEBUG - t1.2018 -triggered off [] -2017-07-19T14:54:43+01 DEBUG - t2.2018 -triggered off ['t1.2018'] -2017-07-19T14:54:43+01 DEBUG - t3.2018 -triggered off ['t2.2018'] +2018/t1 -triggered off [] +2018/t2 -triggered off ['2018/t1'] +2018/t3 -triggered off ['2018/t2'] diff --git a/tests/functional/restart/41-auto-restart-local-jobs.t b/tests/functional/restart/41-auto-restart-local-jobs.t index 407dd7d451b..d2a7e5fecf4 100644 --- a/tests/functional/restart/41-auto-restart-local-jobs.t +++ b/tests/functional/restart/41-auto-restart-local-jobs.t @@ -92,7 +92,7 @@ poll_workflow_restart # ensure the workflow DOESN'T WAIT for local jobs to complete before stopping TEST_NAME="${TEST_NAME_BASE}-force-mode" -cylc trigger "${WORKFLOW_NAME}" bar.1 +cylc trigger "${WORKFLOW_NAME}//1/bar" cylc workflow-state "${WORKFLOW_NAME}" --task='bar' --status='running' --point=1 \ --interval=1 --max-polls=20 >& $ERR @@ -110,7 +110,7 @@ log_scan "${TEST_NAME}-stop" "${FILE}" 40 1 \ 'This workflow will be shutdown as the workflow host is unable to continue' \ 'Workflow shutting down - REQUEST(NOW)' \ 'Orphaned task jobs:' \ - '* bar.1 (running)' + '* 1/bar (running)' cylc stop "${WORKFLOW_NAME}" --now --now 2>/dev/null || true poll_workflow_stopped diff --git a/tests/functional/restart/45-stop-task.t b/tests/functional/restart/45-stop-task.t index 77804856f14..a02be2f5501 100644 --- a/tests/functional/restart/45-stop-task.t +++ b/tests/functional/restart/45-stop-task.t @@ -30,12 +30,12 @@ set_test_number 10 # Event should look like this: # Start workflow -# At t1.1, set stop task to t5.1 -# At t2.1, stop workflow at t2.1 +# At 1/t1, set stop task to 1/t5 +# At 1/t2, stop workflow at 1/t2 # Restart -# Workflow runs to stop task t5.1, reset stop task. +# Workflow runs to stop task 1/t5, reset stop task. # Restart -# Workflow stops normally at t8.1 +# Workflow stops normally at 1/t8 init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' [task parameters] i = 1..8 @@ -52,7 +52,7 @@ init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' [[t]] script = true [[t]] - script = cylc stop "${CYLC_WORKFLOW_ID}" 't_i5.1' + script = cylc stop "${CYLC_WORKFLOW_ID}//1/t_i5" [[t]] script = cylc stop "${CYLC_WORKFLOW_ID}" __FLOW_CONFIG__ @@ -61,7 +61,7 @@ run_ok "${TEST_NAME_BASE}-validate" cylc validate "${WORKFLOW_NAME}" workflow_run_ok "${TEST_NAME_BASE}-run" cylc play "${WORKFLOW_NAME}" --no-detach dumpdbtables -cmp_ok 'stoptask.out' <<<'stop_task|t_i5.1' +cmp_ok 'stoptask.out' <<<'stop_task|1/t_i5' cmp_ok 'taskpool.out' <<'__OUT__' 1|t_i3|waiting __OUT__ diff --git a/tests/functional/restart/50-two-flows/flow.cylc b/tests/functional/restart/50-two-flows/flow.cylc index 0536767a3a9..99ac60f5ccc 100644 --- a/tests/functional/restart/50-two-flows/flow.cylc +++ b/tests/functional/restart/50-two-flows/flow.cylc @@ -14,15 +14,15 @@ [[a]] script = """ if ((CYLC_TASK_FLOWS == 2)); then - cylc__job__poll_grep_workflow_log "\[c\.1 .* succeeded" + cylc__job__poll_grep_workflow_log "\[1/c .* succeeded" fi """ [[b, d]] [[c]] script = """ if ((CYLC_TASK_FLOWS == 1)); then - cylc trigger --reflow --meta="cheese wizard" $CYLC_WORKFLOW_NAME a.1 - cylc__job__poll_grep_workflow_log "\[a\.1 submitted job:02 flows:2\] => running" + cylc trigger --reflow --meta="cheese wizard" "$CYLC_WORKFLOW_NAME//1/a" + cylc__job__poll_grep_workflow_log "\[1/a submitted job:02 flows:2\] => running" cylc stop $CYLC_WORKFLOW_NAME fi """ diff --git a/tests/functional/restart/50-two-flows/reference.log b/tests/functional/restart/50-two-flows/reference.log index d62d02d8d6a..cfb7e7217ee 100644 --- a/tests/functional/restart/50-two-flows/reference.log +++ b/tests/functional/restart/50-two-flows/reference.log @@ -1,6 +1,6 @@ Initial point: 1 Final point: 1 -a.1 -triggered off [] -b.1 -triggered off ['a.1'] -c.1 -triggered off ['b.1'] -a.1 -triggered off [] +1/a -triggered off [] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] +1/a -triggered off [] diff --git a/tests/functional/restart/50-two-flows/reference.restart.log b/tests/functional/restart/50-two-flows/reference.restart.log index a34a4b194e6..704adbb7831 100644 --- a/tests/functional/restart/50-two-flows/reference.restart.log +++ b/tests/functional/restart/50-two-flows/reference.restart.log @@ -1,6 +1,6 @@ Initial point: 1 Final point: 1 -d.1 -triggered off ['c.1'] -b.1 -triggered off ['a.1'] -c.1 -triggered off ['b.1'] -d.1 -triggered off ['c.1'] +1/d -triggered off ['1/c'] +1/b -triggered off ['1/a'] +1/c -triggered off ['1/b'] +1/d -triggered off ['1/c'] diff --git a/tests/functional/restart/53-task-prerequisites.t b/tests/functional/restart/53-task-prerequisites.t index 3748658550d..93af161a4b9 100644 --- a/tests/functional/restart/53-task-prerequisites.t +++ b/tests/functional/restart/53-task-prerequisites.t @@ -42,7 +42,7 @@ __EOF__ workflow_run_fail "${TEST_NAME_BASE}-restart" cylc play "${WORKFLOW_NAME}" --stopcp=3 --no-detach -# Check bar.2 is still waiting (i.e. prereqs not satisfied): +# Check 2/bar is still waiting (i.e. prereqs not satisfied): TEST_NAME="${TEST_NAME_BASE}-db-task-pool" QUERY='SELECT cycle, name, status FROM task_pool ORDER BY cycle, name;' run_ok "$TEST_NAME" sqlite3 "$DB_FILE" "$QUERY" diff --git a/tests/functional/restart/pre-init-2/reference.log b/tests/functional/restart/pre-init-2/reference.log index f68aa4eff56..6b3f582a872 100644 --- a/tests/functional/restart/pre-init-2/reference.log +++ b/tests/functional/restart/pre-init-2/reference.log @@ -1,6 +1,6 @@ -2014/05/10 22:17:20 INFO - Initial point: 20100808T00 -2014/05/10 22:17:20 INFO - Final point: 20100810T00 -2014/05/10 22:17:20 DEBUG - bar.20100809T00 -triggered off ['foo.20100808T00'] -2014/05/10 22:17:20 DEBUG - foo.20100809T00 -triggered off [] -2014/05/10 22:17:25 DEBUG - foo.20100810T00 -triggered off [] -2014/05/10 22:17:35 DEBUG - bar.20100810T00 -triggered off ['foo.20100809T00'] +Initial point: 20100808T00 +Final point: 20100810T00 +20100809T00/bar -triggered off ['20100808T00/foo'] +20100809T00/foo -triggered off [] +20100810T00/foo -triggered off [] +20100810T00/bar -triggered off ['20100809T00/foo'] diff --git a/tests/functional/restart/reload/reference.log b/tests/functional/restart/reload/reference.log index 6a49bc0414e..74a47a9a898 100644 --- a/tests/functional/restart/reload/reference.log +++ b/tests/functional/restart/reload/reference.log @@ -1,5 +1,5 @@ -2014/03/21 11:39:23 INFO - Initial point: 20100808T0000Z -2014/03/21 11:39:23 INFO - Final point: 20100809T0000Z -2014/03/21 11:39:24 DEBUG - bar.20100808T0000Z -triggered off ['foo.20100808T0000Z'] -2014/03/21 11:39:24 DEBUG - foo.20100809T0000Z -triggered off ['foo.20100808T0000Z'] -2014/03/21 11:39:28 DEBUG - bar.20100809T0000Z -triggered off ['foo.20100809T0000Z'] +Initial point: 20100808T0000Z +Final point: 20100809T0000Z +20100808T0000Z/bar -triggered off ['20100808T0000Z/foo'] +20100809T0000Z/foo -triggered off ['20100808T0000Z/foo'] +20100809T0000Z/bar -triggered off ['20100809T0000Z/foo'] diff --git a/tests/functional/retries/02-xtriggers/reference.log b/tests/functional/retries/02-xtriggers/reference.log index 8bf75d5d5c6..c12aa15b8ce 100644 --- a/tests/functional/retries/02-xtriggers/reference.log +++ b/tests/functional/retries/02-xtriggers/reference.log @@ -1,8 +1,8 @@ Initial point: 1 Final point: 1 -retry.1 -triggered off [] -retry.1 -triggered off [] -retry.1 -triggered off [] -retry.1 -triggered off [] -retry.1 -triggered off [] -test.1 -triggered off ['retry.1'] +1/retry -triggered off [] +1/retry -triggered off [] +1/retry -triggered off [] +1/retry -triggered off [] +1/retry -triggered off [] +1/test -triggered off ['1/retry'] diff --git a/tests/functional/retries/execution/reference.log b/tests/functional/retries/execution/reference.log index 48cc39e56df..49143cbac59 100644 --- a/tests/functional/retries/execution/reference.log +++ b/tests/functional/retries/execution/reference.log @@ -1,6 +1,6 @@ -2013/11/07 14:54:01 INFO - Initial point: 1 -2013/11/07 14:54:01 INFO - Final point: 1 -2013/11/07 14:54:01 DEBUG - foo.1 -triggered off [] -2013/11/07 14:54:10 DEBUG - foo.1 -triggered off [] -2013/11/07 14:54:18 DEBUG - foo.1 -triggered off [] -2013/11/07 14:54:26 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/foo -triggered off [] +1/foo -triggered off [] +1/foo -triggered off [] diff --git a/tests/functional/retries/submission/flow.cylc b/tests/functional/retries/submission/flow.cylc index 2d36485bfe4..9d650a18b71 100644 --- a/tests/functional/retries/submission/flow.cylc +++ b/tests/functional/retries/submission/flow.cylc @@ -4,7 +4,7 @@ stall timeout = PT0S abort on inactivity timeout = True inactivity timeout = PT3M - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] R1 = "foo:submit-fail => !foo" diff --git a/tests/functional/retries/submission/reference.log b/tests/functional/retries/submission/reference.log index 3a872eed200..49143cbac59 100644 --- a/tests/functional/retries/submission/reference.log +++ b/tests/functional/retries/submission/reference.log @@ -1,6 +1,6 @@ -2013/11/07 15:57:47 INFO - Initial point: 1 -2013/11/07 15:57:47 INFO - Final point: 1 -2013/11/07 15:57:47 DEBUG - foo.1 -triggered off [] -2013/11/07 15:57:55 DEBUG - foo.1 -triggered off [] -2013/11/07 15:58:02 DEBUG - foo.1 -triggered off [] -2013/11/07 15:58:09 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/foo -triggered off [] +1/foo -triggered off [] +1/foo -triggered off [] diff --git a/tests/functional/runahead/06-release-update.t b/tests/functional/runahead/06-release-update.t index 3daaca6664a..d52b12272a6 100644 --- a/tests/functional/runahead/06-release-update.t +++ b/tests/functional/runahead/06-release-update.t @@ -27,7 +27,7 @@ CYLC_RUN_PID="$!" poll_workflow_running YYYY="$(date +%Y)" NEXT1=$(( YYYY + 1 )) -poll_grep_workflow_log -E "bar\.${NEXT1} .* spawned" +poll_grep_workflow_log -E "${NEXT1}/bar .* spawned" # sleep a little to allow the datastore to update (`cylc dump` sees the # datastore) TODO can we avoid this flaky sleep somehow? diff --git a/tests/functional/runahead/default-future/flow.cylc b/tests/functional/runahead/default-future/flow.cylc index 706993f0ca9..295ed5c3a0c 100644 --- a/tests/functional/runahead/default-future/flow.cylc +++ b/tests/functional/runahead/default-future/flow.cylc @@ -27,7 +27,7 @@ [[spawner]] script = """ # spawn wibble - cylc set-outputs --flow=1 $CYLC_WORKFLOW_ID foo.20100101T0800Z + cylc set-outputs --flow=1 $CYLC_WORKFLOW_ID 20100101T0800Z/foo """ [[foo]] script = false diff --git a/tests/functional/shutdown/00-cycle/flow.cylc b/tests/functional/shutdown/00-cycle/flow.cylc index 132c14f045d..11ea3f5d53c 100644 --- a/tests/functional/shutdown/00-cycle/flow.cylc +++ b/tests/functional/shutdown/00-cycle/flow.cylc @@ -9,4 +9,4 @@ [[a,c]] script = "true" [[stopper]] - script = "cylc shutdown $CYLC_WORKFLOW_ID 2010-01-01; sleep 5" + script = "cylc shutdown $CYLC_WORKFLOW_ID//2010-01-01; sleep 5" diff --git a/tests/functional/shutdown/00-cycle/reference.log b/tests/functional/shutdown/00-cycle/reference.log index 44466a07edd..d342a08cfda 100644 --- a/tests/functional/shutdown/00-cycle/reference.log +++ b/tests/functional/shutdown/00-cycle/reference.log @@ -1,5 +1,5 @@ Initial point: 20100101T0000Z Final point: 20100105T0000Z -a.20100101T0000Z -triggered off ['a.20091231T1800Z', 'c.20091231T1800Z'] -stopper.20100101T0000Z -triggered off ['a.20100101T0000Z'] -c.20100101T0000Z -triggered off ['stopper.20100101T0000Z'] +20100101T0000Z/a -triggered off ['20091231T1800Z/a', '20091231T1800Z/c'] +20100101T0000Z/stopper -triggered off ['20100101T0000Z/a'] +20100101T0000Z/c -triggered off ['20100101T0000Z/stopper'] diff --git a/tests/functional/shutdown/01-task/flow.cylc b/tests/functional/shutdown/01-task/flow.cylc index ddf7b9d484d..531990e91e5 100644 --- a/tests/functional/shutdown/01-task/flow.cylc +++ b/tests/functional/shutdown/01-task/flow.cylc @@ -10,4 +10,4 @@ script = "true" [[stopper]] script = """ -cylc shutdown $CYLC_WORKFLOW_ID a.20100101T06; sleep 5""" +cylc shutdown $CYLC_WORKFLOW_ID 20100101T06/a; sleep 5""" diff --git a/tests/functional/shutdown/01-task/reference.log b/tests/functional/shutdown/01-task/reference.log index 0f171b67f63..6c658fc7384 100644 --- a/tests/functional/shutdown/01-task/reference.log +++ b/tests/functional/shutdown/01-task/reference.log @@ -1,6 +1,6 @@ -2013-10-31T01:27:58Z INFO - Initial point: 20100101T0000Z -2013-10-31T01:27:58Z INFO - Final point: 20100105T0000Z -2013-10-31T01:27:58Z DEBUG - a.20100101T0000Z -triggered off ['c.20091231T1800Z'] -2013-10-31T01:28:06Z DEBUG - stopper.20100101T0000Z -triggered off ['a.20100101T0000Z'] -2013-10-31T01:28:13Z DEBUG - c.20100101T0000Z -triggered off ['stopper.20100101T0000Z'] -2013-10-31T01:28:20Z DEBUG - a.20100101T0600Z -triggered off ['c.20100101T0000Z'] +Initial point: 20100101T0000Z +Final point: 20100105T0000Z +20100101T0000Z/a -triggered off ['20091231T1800Z/c'] +20100101T0000Z/stopper -triggered off ['20100101T0000Z/a'] +20100101T0000Z/c -triggered off ['20100101T0000Z/stopper'] +20100101T0600Z/a -triggered off ['20100101T0000Z/c'] diff --git a/tests/functional/shutdown/04-kill/flow.cylc b/tests/functional/shutdown/04-kill/flow.cylc index cfd0b11b0a3..e8e48857fcd 100644 --- a/tests/functional/shutdown/04-kill/flow.cylc +++ b/tests/functional/shutdown/04-kill/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] @@ -11,7 +11,7 @@ script = sleep 60 [[t2]] script = """ -cylc shutdown "${CYLC_WORKFLOW_ID}" -sleep 1 -cylc kill "${CYLC_WORKFLOW_ID}" 't1' -""" + cylc shutdown "${CYLC_WORKFLOW_ID}" + sleep 1 + cylc kill "${CYLC_WORKFLOW_ID}//*/t1" + """ diff --git a/tests/functional/shutdown/04-kill/reference.log b/tests/functional/shutdown/04-kill/reference.log index 8472fb930c8..c5802d782d2 100644 --- a/tests/functional/shutdown/04-kill/reference.log +++ b/tests/functional/shutdown/04-kill/reference.log @@ -1,4 +1,4 @@ -2014-08-27T11:46:52+01 INFO - Initial point: 1 -2014-08-27T11:46:52+01 INFO - Final point: 1 -2014-08-27T11:46:52+01 DEBUG - t1.1 -triggered off [] -2014-08-27T11:46:54+01 DEBUG - t2.1 -triggered off ['t1.1'] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] +1/t2 -triggered off ['1/t1'] diff --git a/tests/functional/shutdown/07-task-fail.t b/tests/functional/shutdown/07-task-fail.t index ec1115b6b2a..b497b740475 100755 --- a/tests/functional/shutdown/07-task-fail.t +++ b/tests/functional/shutdown/07-task-fail.t @@ -28,10 +28,10 @@ LOGD="$RUN_DIR/${WORKFLOW_NAME}/log" grep_ok "ERROR - Workflow shutting down - AUTOMATIC(ON-TASK-FAILURE)" \ "${LOGD}/workflow/log" JLOGD="${LOGD}/job/1/t1/01" -# Check that t1.1 event handler runs +# Check that 1/t1 event handler runs run_ok "${TEST_NAME_BASE}-activity-log" \ grep -q -F \ - "[(('event-handler-00', 'failed'), 1) out] Unfortunately t1.1 failed" \ + "[(('event-handler-00', 'failed'), 1) out] Unfortunately 1/t1 failed" \ "${JLOGD}/job-activity.log" # Check that t2.1 did not run exists_fail "${LOGD}/1/t2" diff --git a/tests/functional/shutdown/08-now1.t b/tests/functional/shutdown/08-now1.t index 9ae716f6527..c6f2137f0c1 100755 --- a/tests/functional/shutdown/08-now1.t +++ b/tests/functional/shutdown/08-now1.t @@ -26,14 +26,14 @@ workflow_run_ok "${TEST_NAME_BASE}-run" cylc play --no-detach "${WORKFLOW_NAME}" LOGD="$RUN_DIR/${WORKFLOW_NAME}/log" grep_ok 'INFO - Workflow shutting down - REQUEST(NOW)' "${LOGD}/workflow/log" JLOGD="${LOGD}/job/1/t1/01" -# Check that t1.1 event handler runs +# Check that 1/t1 event handler runs run_ok "${TEST_NAME_BASE}-activity-log-succeeded" \ grep -q -F \ - "[(('event-handler-00', 'succeeded'), 1) out] Well done t1.1 succeeded" \ + "[(('event-handler-00', 'succeeded'), 1) out] Well done 1/t1 succeeded" \ "${JLOGD}/job-activity.log" run_ok "${TEST_NAME_BASE}-activity-log-started" \ grep -q -F \ - "[(('event-handler-00', 'started'), 1) out] Hello t1.1 started" \ + "[(('event-handler-00', 'started'), 1) out] Hello 1/t1 started" \ "${JLOGD}/job-activity.log" # Check that t2.1 did not run exists_fail "${LOGD}/job/1/t2" diff --git a/tests/functional/shutdown/09-now2.t b/tests/functional/shutdown/09-now2.t index 297eeb8cd68..4c3b7bec598 100755 --- a/tests/functional/shutdown/09-now2.t +++ b/tests/functional/shutdown/09-now2.t @@ -26,20 +26,20 @@ workflow_run_ok "${TEST_NAME_BASE}-run" cylc play --no-detach "${WORKFLOW_NAME}" LOGD="$RUN_DIR/${WORKFLOW_NAME}/log" grep_ok 'INFO - Workflow shutting down - REQUEST(NOW-NOW)' "${LOGD}/workflow/log" grep_ok 'WARNING - Orphaned task jobs' "${LOGD}/workflow/log" -grep_ok '\* t1.1 (running)' "${LOGD}/workflow/log" +grep_ok '\* 1/t1 (running)' "${LOGD}/workflow/log" JLOGD="${LOGD}/job/1/t1/01" -# Check that t1.1 event handler runs +# Check that 1/t1 event handler runs run_fail "${TEST_NAME_BASE}-activity-log-succeeded" \ grep -q -F \ - "[(('event-handler-00', 'succeeded'), 1) out] Well done t1.1 succeeded" \ + "[(('event-handler-00', 'succeeded'), 1) out] Well done 1/t1 succeeded" \ "${JLOGD}/job-activity.log" run_fail "${TEST_NAME_BASE}-activity-log-started" \ grep -q -F \ - "[(('event-handler-00', 'started'), 1) out] Hello t1.1 started" \ + "[(('event-handler-00', 'started'), 1) out] Hello 1/t1 started" \ "${JLOGD}/job-activity.log" -# Check that t2.1 did not run +# Check that 1/t2 did not run exists_fail "${LOGD}/job/1/t2" -# In SoD the restart does not stall and abort, because t1.1:failed can be removed +# In SoD the restart does not stall and abort, because 1/t1:failed can be removed # as handled. workflow_run_ok "${TEST_NAME_BASE}-restart" cylc play --no-detach "${WORKFLOW_NAME}" purge diff --git a/tests/functional/shutdown/21-stop-kill.t b/tests/functional/shutdown/21-stop-kill.t index 07eb6105deb..ca21a23d0fe 100644 --- a/tests/functional/shutdown/21-stop-kill.t +++ b/tests/functional/shutdown/21-stop-kill.t @@ -43,6 +43,6 @@ run_ok "${TEST_NAME_BASE}" cylc play --no-detach "${WORKFLOW_NAME}" --debug WORKFLOW_LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" named_grep_ok 'jobs kill succeeded' "jobs-kill ret_code\] 0" "${WORKFLOW_LOG}" -named_grep_ok 'jobs kill killed foo.1' "jobs-kill out.*1/foo/01" "${WORKFLOW_LOG}" +named_grep_ok 'jobs kill killed 1/foo' "jobs-kill out.*1/foo/01" "${WORKFLOW_LOG}" purge diff --git a/tests/functional/shutdown/22-stop-now.t b/tests/functional/shutdown/22-stop-now.t index c036caf5b76..16bc7bc26d4 100644 --- a/tests/functional/shutdown/22-stop-now.t +++ b/tests/functional/shutdown/22-stop-now.t @@ -44,6 +44,6 @@ WORKFLOW_LOG="${WORKFLOW_RUN_DIR}/log/workflow/log" log_scan "${TEST_NAME_BASE}-orphaned" "${WORKFLOW_LOG}" 1 1 \ 'Orphaned task jobs.*' \ - '.*foo.1' + '1/.*foo' purge diff --git a/tests/functional/spawn-on-demand/00-no-reflow/flow.cylc b/tests/functional/spawn-on-demand/00-no-reflow/flow.cylc index f9ea33dfb46..5b506242d28 100644 --- a/tests/functional/spawn-on-demand/00-no-reflow/flow.cylc +++ b/tests/functional/spawn-on-demand/00-no-reflow/flow.cylc @@ -10,6 +10,6 @@ [runtime] [[triggerer]] script = """ -# Cause only bar.1 to run again. -cylc trigger ${CYLC_WORKFLOW_ID} bar.1 + # Cause only 1/bar to run again. + cylc trigger "${CYLC_WORKFLOW_ID}//1/bar" """ diff --git a/tests/functional/spawn-on-demand/00-no-reflow/reference.log b/tests/functional/spawn-on-demand/00-no-reflow/reference.log index 5d694634d7a..176e79f124a 100644 --- a/tests/functional/spawn-on-demand/00-no-reflow/reference.log +++ b/tests/functional/spawn-on-demand/00-no-reflow/reference.log @@ -1,10 +1,10 @@ Initial point: 1 Final point: 2 -foo.1 -triggered off ['foo.0'] -bar.1 -triggered off ['foo.1'] -foo.2 -triggered off ['foo.1'] -baz.1 -triggered off ['bar.1'] -bar.2 -triggered off ['foo.2'] -triggerer.2 -triggered off ['foo.2'] -bar.1 -triggered off [] -baz.2 -triggered off ['bar.2'] +1/foo -triggered off ['0/foo'] +1/bar -triggered off ['1/foo'] +2/foo -triggered off ['1/foo'] +1/baz -triggered off ['1/bar'] +2/bar -triggered off ['2/foo'] +2/triggerer -triggered off ['2/foo'] +1/bar -triggered off [] +2/baz -triggered off ['2/bar'] diff --git a/tests/functional/spawn-on-demand/01-reflow/flow.cylc b/tests/functional/spawn-on-demand/01-reflow/flow.cylc index 7cae2411756..61008dc5f1f 100644 --- a/tests/functional/spawn-on-demand/01-reflow/flow.cylc +++ b/tests/functional/spawn-on-demand/01-reflow/flow.cylc @@ -11,6 +11,6 @@ [runtime] [[triggerer]] script = """ -# Cause both bar.1 and baz.1 to run again. -cylc trigger --reflow --meta=cheese ${CYLC_WORKFLOW_ID} bar.1 + # Cause both 1/bar and 1/baz to run again. + cylc trigger --reflow --meta=cheese "${CYLC_WORKFLOW_ID}//1/bar" """ diff --git a/tests/functional/spawn-on-demand/01-reflow/reference.log b/tests/functional/spawn-on-demand/01-reflow/reference.log index 1612ec0804f..48550ec827a 100644 --- a/tests/functional/spawn-on-demand/01-reflow/reference.log +++ b/tests/functional/spawn-on-demand/01-reflow/reference.log @@ -1,9 +1,9 @@ Initial point: 1 Final point: 2 -foo.1 -triggered off [] -bar.1 -triggered off ['foo.1'] -baz.1 -triggered off ['bar.1'] -foo.2 -triggered off ['foo.1'] -triggerer.2 -triggered off ['foo.2'] -bar.1 -triggered off [] -baz.1 -triggered off ['bar.1'] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] +1/baz -triggered off ['1/bar'] +2/foo -triggered off ['1/foo'] +2/triggerer -triggered off ['2/foo'] +1/bar -triggered off [] +1/baz -triggered off ['1/bar'] diff --git a/tests/functional/spawn-on-demand/02-merge/flow.cylc b/tests/functional/spawn-on-demand/02-merge/flow.cylc index e69432fd1a7..922a6749b76 100644 --- a/tests/functional/spawn-on-demand/02-merge/flow.cylc +++ b/tests/functional/spawn-on-demand/02-merge/flow.cylc @@ -1,4 +1,4 @@ -# foo.3 triggers a new flow at foo.1 and waits for it to catch up and merge. +# 3/foo triggers a new flow at 1/foo and waits for it to catch up and merge. # bar checks for the expected flow names at each cycle point. [scheduling] cycling mode = integer @@ -10,7 +10,7 @@ [[foo]] script = """ if (( CYLC_TASK_CYCLE_POINT == 3 )); then - cylc trigger --reflow --meta=other ${CYLC_WORKFLOW_ID} foo.1 + cylc trigger --reflow --meta=other "${CYLC_WORKFLOW_ID}//1/foo" cylc__job__poll_grep_workflow_log 'Merged in' fi """ diff --git a/tests/functional/spawn-on-demand/02-merge/reference.log b/tests/functional/spawn-on-demand/02-merge/reference.log index aafee13a9cb..e150aa34f34 100644 --- a/tests/functional/spawn-on-demand/02-merge/reference.log +++ b/tests/functional/spawn-on-demand/02-merge/reference.log @@ -1,12 +1,12 @@ Initial point: 1 Final point: 3 -foo.1 -triggered off ['foo.0'] -foo.2 -triggered off ['foo.1'] -bar.1 -triggered off ['foo.1'] -foo.3 -triggered off ['foo.2'] -bar.2 -triggered off ['foo.2'] -foo.1 -triggered off ['foo.0'] -foo.2 -triggered off ['foo.1'] -bar.1 -triggered off ['foo.1'] -bar.2 -triggered off ['foo.2'] -bar.3 -triggered off ['foo.3'] +1/foo -triggered off ['0/foo'] +2/foo -triggered off ['1/foo'] +1/bar -triggered off ['1/foo'] +3/foo -triggered off ['2/foo'] +2/bar -triggered off ['2/foo'] +1/foo -triggered off ['0/foo'] +2/foo -triggered off ['1/foo'] +1/bar -triggered off ['1/foo'] +2/bar -triggered off ['2/foo'] +3/bar -triggered off ['3/foo'] diff --git a/tests/functional/spawn-on-demand/03-conditional/reference.log b/tests/functional/spawn-on-demand/03-conditional/reference.log index 287996e785c..b65ed80d93f 100644 --- a/tests/functional/spawn-on-demand/03-conditional/reference.log +++ b/tests/functional/spawn-on-demand/03-conditional/reference.log @@ -1,7 +1,7 @@ Initial point: 1 Final point: 1 -delay.1 -triggered off [] -foo.1 -triggered off [] -baz.1 -triggered off ['foo.1'] -qux.1 -triggered off ['baz.1'] -bar.1 -triggered off ['delay.1'] +1/delay -triggered off [] +1/foo -triggered off [] +1/baz -triggered off ['1/foo'] +1/qux -triggered off ['1/baz'] +1/bar -triggered off ['1/delay'] diff --git a/tests/functional/spawn-on-demand/04-branch/reference.log b/tests/functional/spawn-on-demand/04-branch/reference.log index 8b14d5cdf2c..e84e80f221c 100644 --- a/tests/functional/spawn-on-demand/04-branch/reference.log +++ b/tests/functional/spawn-on-demand/04-branch/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -fish.1 -triggered off ['foo.1'] -done.1 -triggered off ['fish.1'] +1/foo -triggered off [] +1/fish -triggered off ['1/foo'] +1/done -triggered off ['1/fish'] diff --git a/tests/functional/spawn-on-demand/05-stop-flow/reference.log b/tests/functional/spawn-on-demand/05-stop-flow/reference.log index 1f455427830..1a9f846c98d 100644 --- a/tests/functional/spawn-on-demand/05-stop-flow/reference.log +++ b/tests/functional/spawn-on-demand/05-stop-flow/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -bar.1 -triggered off ['foo.1'] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/spawn-on-demand/06-stop-flow-2/flow.cylc b/tests/functional/spawn-on-demand/06-stop-flow-2/flow.cylc index 7ff895fe768..d8500639001 100644 --- a/tests/functional/spawn-on-demand/06-stop-flow-2/flow.cylc +++ b/tests/functional/spawn-on-demand/06-stop-flow-2/flow.cylc @@ -20,7 +20,7 @@ fi [[baz]] script = """ if (( CYLC_TASK_SUBMIT_NUMBER == 1 )); then - cylc trigger --reflow --meta=other ${CYLC_WORKFLOW_ID} foo.1 - cylc__job__poll_grep_workflow_log -E "bar\.1 running job:02.* => succeeded" + cylc trigger --reflow --meta=other "${CYLC_WORKFLOW_ID}//1/foo" + cylc__job__poll_grep_workflow_log -E "1/bar running job:02.* => succeeded" fi """ diff --git a/tests/functional/spawn-on-demand/06-stop-flow-2/reference.log b/tests/functional/spawn-on-demand/06-stop-flow-2/reference.log index d747b2b6068..79c8201a601 100644 --- a/tests/functional/spawn-on-demand/06-stop-flow-2/reference.log +++ b/tests/functional/spawn-on-demand/06-stop-flow-2/reference.log @@ -1,8 +1,8 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -bar.1 -triggered off ['foo.1'] -baz.1 -triggered off ['bar.1'] -foo.1 -triggered off [] -bar.1 -triggered off ['foo.1'] -qux.1 -triggered off ['baz.1'] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] +1/baz -triggered off ['1/bar'] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] +1/qux -triggered off ['1/baz'] diff --git a/tests/functional/spawn-on-demand/07-abs-triggers/flow.cylc b/tests/functional/spawn-on-demand/07-abs-triggers/flow.cylc index 2c2a77c4085..8084e5c0abe 100644 --- a/tests/functional/spawn-on-demand/07-abs-triggers/flow.cylc +++ b/tests/functional/spawn-on-demand/07-abs-triggers/flow.cylc @@ -14,9 +14,9 @@ [runtime] [[start]] script = """ -# Ensure that bar.1,2 are spawned by foo.1,2 and not by start.2 -# (so the scheduler must update their prereqs when start.2 finishes). -cylc__job__poll_grep_workflow_log -E "bar\.2 .* spawned" + # Ensure that 1,2/bar are spawned by 1,2/foo and not by 2/start + # (so the scheduler must update their prereqs when 2/start finishes). + cylc__job__poll_grep_workflow_log -E "2/bar .* spawned" """ [[foo]] [[bar]] diff --git a/tests/functional/spawn-on-demand/07-abs-triggers/reference.log b/tests/functional/spawn-on-demand/07-abs-triggers/reference.log index beccbd94c55..b27f0a18fd1 100644 --- a/tests/functional/spawn-on-demand/07-abs-triggers/reference.log +++ b/tests/functional/spawn-on-demand/07-abs-triggers/reference.log @@ -1,9 +1,9 @@ Initial point: 1 Final point: 5 -start.2 -triggered off [] -foo.1 -triggered off [] -foo.2 -triggered off [] -foo.3 -triggered off [] -bar.1 -triggered off ['foo.1', 'start.2'] -bar.2 -triggered off ['foo.2', 'start.2'] -bar.3 -triggered off ['foo.3', 'start.2'] +2/start -triggered off [] +1/foo -triggered off [] +2/foo -triggered off [] +3/foo -triggered off [] +1/bar -triggered off ['1/foo', '2/start'] +2/bar -triggered off ['2/foo', '2/start'] +3/bar -triggered off ['2/start', '3/foo'] diff --git a/tests/functional/spawn-on-demand/08-lost-parents/reference.log b/tests/functional/spawn-on-demand/08-lost-parents/reference.log index d04a13765dd..e8f6be64551 100644 --- a/tests/functional/spawn-on-demand/08-lost-parents/reference.log +++ b/tests/functional/spawn-on-demand/08-lost-parents/reference.log @@ -1,12 +1,12 @@ Initial point: 1 Final point: 6 -dad.1 -triggered off [] -dad.2 -triggered off [] -dad.3 -triggered off [] -child.1 -triggered off ['dad.1'] -child.2 -triggered off ['dad.2'] -child.3 -triggered off ['dad.3'] -mum.5 -triggered off [] -child.4 -triggered off [] -child.5 -triggered off ['mum.5'] -child.6 -triggered off [] +1/dad -triggered off [] +2/dad -triggered off [] +3/dad -triggered off [] +1/child -triggered off ['1/dad'] +2/child -triggered off ['2/dad'] +3/child -triggered off ['3/dad'] +5/mum -triggered off [] +4/child -triggered off [] +5/child -triggered off ['5/mum'] +6/child -triggered off [] diff --git a/tests/functional/spawn-on-demand/09-set-outputs/flow.cylc b/tests/functional/spawn-on-demand/09-set-outputs/flow.cylc index f4122e049a8..1d1d7e7e061 100644 --- a/tests/functional/spawn-on-demand/09-set-outputs/flow.cylc +++ b/tests/functional/spawn-on-demand/09-set-outputs/flow.cylc @@ -35,7 +35,7 @@ [[foo]] # Hang about until setter is finished. script = """ - cylc__job__poll_grep_workflow_log -E "setter\.1 .* => succeeded" + cylc__job__poll_grep_workflow_log -E "1/setter .* => succeeded" """ [[bar]] script = true @@ -43,11 +43,11 @@ # (To the rescue). script = """ # Set foo outputs while it still exists in the pool. - cylc set-outputs --flow=2 --output=out1 --output=out2 "${CYLC_WORKFLOW_ID}" 1/foo + cylc set-outputs --flow=2 --output=out1 --output=out2 "${CYLC_WORKFLOW_ID}//1/foo" # Set bar outputs after it is gone from the pool. - cylc__job__poll_grep_workflow_log -E "bar\.1 .*task proxy removed" - cylc set-outputs --flow=2 --output=out1 --output=out2 "${CYLC_WORKFLOW_ID}" 1/bar + cylc__job__poll_grep_workflow_log -E "1/bar .*task proxy removed" + cylc set-outputs --flow=2 --output=out1 --output=out2 "${CYLC_WORKFLOW_ID}//1/bar" """ [[qux, quw, fux, fuw]] script = true diff --git a/tests/functional/spawn-on-demand/09-set-outputs/reference.log b/tests/functional/spawn-on-demand/09-set-outputs/reference.log index d762d9151e8..2e06a15bd25 100644 --- a/tests/functional/spawn-on-demand/09-set-outputs/reference.log +++ b/tests/functional/spawn-on-demand/09-set-outputs/reference.log @@ -1,9 +1,9 @@ Initial point: 1 Final point: 1 -setter.1 -triggered off [] -foo.1 -triggered off [] -bar.1 -triggered off [] -qux.1 -triggered off ['foo.1'] -quw.1 -triggered off ['foo.1'] -fux.1 -triggered off ['bar.1'] -fuw.1 -triggered off ['bar.1'] +1/setter -triggered off [] +1/foo -triggered off [] +1/bar -triggered off [] +1/qux -triggered off ['1/foo'] +1/quw -triggered off ['1/foo'] +1/fux -triggered off ['1/bar'] +1/fuw -triggered off ['1/bar'] diff --git a/tests/functional/spawn-on-demand/10-retrigger/flow.cylc b/tests/functional/spawn-on-demand/10-retrigger/flow.cylc index 9f226237c00..2bdd4365a07 100644 --- a/tests/functional/spawn-on-demand/10-retrigger/flow.cylc +++ b/tests/functional/spawn-on-demand/10-retrigger/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = oops.1 + expected task failures = 1/oops [scheduling] [[graph]] R1 = """ @@ -18,7 +18,7 @@ """ [[triggerer]] script = """ - cylc__job__poll_grep_workflow_log -E 'oops\.1 running .* \(received\)failed' - cylc trigger ${CYLC_WORKFLOW_ID} oops.1 + cylc__job__poll_grep_workflow_log -E '1/oops running .* \(received\)failed' + cylc trigger "${CYLC_WORKFLOW_ID}//1/oops" """ [[foo, bar]] diff --git a/tests/functional/spawn-on-demand/10-retrigger/reference.log b/tests/functional/spawn-on-demand/10-retrigger/reference.log index 1a0556aa260..7c9a0a19599 100644 --- a/tests/functional/spawn-on-demand/10-retrigger/reference.log +++ b/tests/functional/spawn-on-demand/10-retrigger/reference.log @@ -1,7 +1,7 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -oops.1 -triggered off ['foo.1'] -triggerer.1 -triggered off ['foo.1'] -oops.1 -triggered off ['foo.1'] -bar.1 -triggered off ['oops.1'] +1/foo -triggered off [] +1/oops -triggered off ['1/foo'] +1/triggerer -triggered off ['1/foo'] +1/oops -triggered off ['1/foo'] +1/bar -triggered off ['1/oops'] diff --git a/tests/functional/spawn-on-demand/11-abs-suicide/flow.cylc b/tests/functional/spawn-on-demand/11-abs-suicide/flow.cylc index 02e1f59d5c5..b5d74bb0c2b 100644 --- a/tests/functional/spawn-on-demand/11-abs-suicide/flow.cylc +++ b/tests/functional/spawn-on-demand/11-abs-suicide/flow.cylc @@ -7,7 +7,7 @@ [[events]] stall timeout = PT0S abort on stall timeout = True - expected task failures = a.1 + expected task failures = 1/a [scheduling] cycling mode = integer @@ -26,6 +26,6 @@ [[a]] # Fail after c is spawned out to the runahead limit. script = """ - cylc__job__poll_grep_workflow_log "spawned c\.5" + cylc__job__poll_grep_workflow_log "spawned 5/c" false """ diff --git a/tests/functional/spawn-on-demand/11-abs-suicide/reference.log b/tests/functional/spawn-on-demand/11-abs-suicide/reference.log index aee3a7467b1..f5eab103f98 100644 --- a/tests/functional/spawn-on-demand/11-abs-suicide/reference.log +++ b/tests/functional/spawn-on-demand/11-abs-suicide/reference.log @@ -1,13 +1,13 @@ Initial point: 1 Final point: 5 -a.1 -triggered off [] -b.1 -triggered off [] -b.2 -triggered off [] -b.3 -triggered off [] -b.4 -triggered off [] -b.5 -triggered off [] -x.1 -triggered off ['a.1', 'b.1'] -x.4 -triggered off ['a.1', 'b.4'] -x.2 -triggered off ['a.1', 'b.2'] -x.3 -triggered off ['a.1', 'b.3'] -x.5 -triggered off ['a.1', 'b.5'] +1/a -triggered off [] +1/b -triggered off [] +2/b -triggered off [] +3/b -triggered off [] +4/b -triggered off [] +5/b -triggered off [] +1/x -triggered off ['1/a', '1/b'] +4/x -triggered off ['1/a', '4/b'] +2/x -triggered off ['1/a', '2/b'] +3/x -triggered off ['1/a', '3/b'] +5/x -triggered off ['1/a', '5/b'] diff --git a/tests/functional/spawn-on-demand/11-hold-not-spawned/flow.cylc b/tests/functional/spawn-on-demand/11-hold-not-spawned/flow.cylc index fd77a4ae2c2..6660aa04406 100644 --- a/tests/functional/spawn-on-demand/11-hold-not-spawned/flow.cylc +++ b/tests/functional/spawn-on-demand/11-hold-not-spawned/flow.cylc @@ -9,12 +9,12 @@ [runtime] [[holder]] script = """ - cylc hold $CYLC_WORKFLOW_NAME holdee.1 + cylc hold "$CYLC_WORKFLOW_NAME//1/holdee" """ [[holdee]] script = true [[stopper]] script = """ - cylc__job__poll_grep_workflow_log "\[holdee\.1 .* holding \(as requested earlier\)" -E + cylc__job__poll_grep_workflow_log "\[1/holdee .* holding \(as requested earlier\)" -E cylc stop $CYLC_WORKFLOW_NAME """ diff --git a/tests/functional/spawn-on-demand/11-hold-not-spawned/reference.log b/tests/functional/spawn-on-demand/11-hold-not-spawned/reference.log index 993f20ff786..026ca709c94 100644 --- a/tests/functional/spawn-on-demand/11-hold-not-spawned/reference.log +++ b/tests/functional/spawn-on-demand/11-hold-not-spawned/reference.log @@ -1,4 +1,4 @@ Initial point: 1 Final point: 1 -holder.1 -triggered off [] -stopper.1 -triggered off ['holder.1'] +1/holder -triggered off [] +1/stopper -triggered off ['1/holder'] diff --git a/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/flow.cylc b/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/flow.cylc index 146ca413ed8..315007c52fa 100644 --- a/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/flow.cylc +++ b/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/flow.cylc @@ -1,4 +1,4 @@ -# Test that `cylc set-outputs` does not cause reflow by default. +# Test that `cylc set-outputs` does not cause reflow by default # Task setter should cause bar to run, but not subsequently baz. [scheduler] @@ -7,7 +7,7 @@ stall timeout = PT0S inactivity timeout = PT30S abort on inactivity timeout = True - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] R1 = """ @@ -21,5 +21,5 @@ script = true [[setter]] script = """ - cylc set-outputs "${CYLC_WORKFLOW_ID}" 1/foo + cylc set-outputs "${CYLC_WORKFLOW_ID}//1/foo" """ diff --git a/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/reference.log b/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/reference.log index 714e8c62c4c..2322cc234da 100644 --- a/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/reference.log +++ b/tests/functional/spawn-on-demand/12-set-outputs-no-reflow/reference.log @@ -1,5 +1,5 @@ Initial point: 1 Final point: 1 -foo.1 -triggered off [] -setter.1 -triggered off ['foo.1'] -bar.1 -triggered off ['foo.1'] +1/foo -triggered off [] +1/setter -triggered off ['1/foo'] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/special/00-sequential/reference.log b/tests/functional/special/00-sequential/reference.log index a8dfdbf81c8..f5b1ffb7dbe 100644 --- a/tests/functional/special/00-sequential/reference.log +++ b/tests/functional/special/00-sequential/reference.log @@ -1,7 +1,7 @@ -2014/01/07 16:58:20 INFO - Initial point: 20100101T00 -2014/01/07 16:58:20 INFO - Final point: 20100101T18 -2014/01/07 16:58:20 DEBUG - monitor.20100101T00 -triggered off [] -2014/01/07 16:58:24 DEBUG - foo.20100101T00 -triggered off ['monitor.20100101T00'] -2014/01/07 16:58:37 DEBUG - foo.20100101T06 -triggered off ['foo.20100101T00'] -2014/01/07 16:58:49 DEBUG - foo.20100101T12 -triggered off ['foo.20100101T06'] -2014/01/07 16:59:01 DEBUG - foo.20100101T18 -triggered off ['foo.20100101T12'] +Initial point: 20100101T00 +Final point: 20100101T18 +20100101T00/monitor -triggered off [] +20100101T00/foo -triggered off ['20100101T00/monitor'] +20100101T06/foo -triggered off ['20100101T00/foo'] +20100101T12/foo -triggered off ['20100101T06/foo'] +20100101T18/foo -triggered off ['20100101T12/foo'] diff --git a/tests/functional/startup/00-state-summary.t b/tests/functional/startup/00-state-summary.t index 5de22868a13..a4a02208899 100644 --- a/tests/functional/startup/00-state-summary.t +++ b/tests/functional/startup/00-state-summary.t @@ -30,7 +30,7 @@ run_ok "${TEST_NAME}" cylc validate "${WORKFLOW_NAME}" cylc play --no-detach "${WORKFLOW_NAME}" > /dev/null 2>&1 # Restart with a failed task and a succeeded task. cylc play "${WORKFLOW_NAME}" -poll_grep_workflow_log -E 'foo\.1 .* \(polled\)failed' +poll_grep_workflow_log -E '1/foo .* \(polled\)failed' cylc dump "${WORKFLOW_NAME}" > dump.out TEST_NAME=${TEST_NAME_BASE}-grep # State summary should not just say "Initializing..." diff --git a/tests/functional/startup/01-log-flow-config.t b/tests/functional/startup/01-log-flow-config.t index 886bacdc72f..f6542c45cda 100644 --- a/tests/functional/startup/01-log-flow-config.t +++ b/tests/functional/startup/01-log-flow-config.t @@ -61,11 +61,16 @@ LOGD="${RUN_DIR}/${WORKFLOW_NAME}/log/flow-config" START_CONFIG="$(ls "${LOGD}/"*-start.cylc)" REL_CONFIG="$(ls "${LOGD}/"*-reload.cylc)" RES_CONFIG="$(ls "${LOGD}/"*-restart.cylc)" +mkdir start_config +mkdir res_config +cp "$START_CONFIG" start_config/flow.cylc +cp "$RES_CONFIG" res_config/flow.cylc # The generated *-run.cylc and *-reload.cylc should be identical # The generated *.cylc files should validate cmp_ok "${START_CONFIG}" "${REL_CONFIG}" -run_ok "${TEST_NAME_BASE}-validate-start-config" cylc validate "${START_CONFIG}" -run_ok "${TEST_NAME_BASE}-validate-restart-config" cylc validate "${RES_CONFIG}" +run_ok "${TEST_NAME_BASE}-validate-start-config" cylc validate ./start_config +run_ok "${TEST_NAME_BASE}-validate-restart-config" cylc validate ./res_config +rm -rf start_config res_config diff -u "${START_CONFIG}" "${RES_CONFIG}" >'diff.out' contains_ok 'diff.out' <<'__DIFF__' diff --git a/tests/functional/task-name/00-basic/reference.log b/tests/functional/task-name/00-basic/reference.log index c0548eadb8c..6c745e556a9 100644 --- a/tests/functional/task-name/00-basic/reference.log +++ b/tests/functional/task-name/00-basic/reference.log @@ -1,26 +1,26 @@ Initial point: 20150101T0000Z Final point: 20200101T0000Z -t1.20150101T0000Z -triggered off ['t1.20130101T0000Z'] -t1.20160101T0000Z -triggered off ['t1.20140101T0000Z'] -t1.20170101T0000Z -triggered off ['t1.20150101T0000Z'] -t1-a.20150101T0000Z -triggered off ['t1.20150101T0000Z'] -t1-a.20160101T0000Z -triggered off ['t1.20160101T0000Z'] -t1+a.20150101T0000Z -triggered off ['t1-a.20150101T0000Z'] -t1-a.20170101T0000Z -triggered off ['t1.20170101T0000Z'] -t1+a.20160101T0000Z -triggered off ['t1-a.20160101T0000Z'] -t1%a.20150101T0000Z -triggered off ['t1+a.20150101T0000Z'] -t1+a.20170101T0000Z -triggered off ['t1-a.20170101T0000Z'] -t1%a.20160101T0000Z -triggered off ['t1+a.20160101T0000Z'] -t1.20180101T0000Z -triggered off ['t1.20160101T0000Z'] -t1%a.20170101T0000Z -triggered off ['t1+a.20170101T0000Z'] -t1.20190101T0000Z -triggered off ['t1.20170101T0000Z'] -t1-a.20180101T0000Z -triggered off ['t1.20180101T0000Z'] -t1.20200101T0000Z -triggered off ['t1.20180101T0000Z'] -t1-a.20190101T0000Z -triggered off ['t1.20190101T0000Z'] -t1+a.20180101T0000Z -triggered off ['t1-a.20180101T0000Z'] -t1-a.20200101T0000Z -triggered off ['t1.20200101T0000Z'] -t1+a.20190101T0000Z -triggered off ['t1-a.20190101T0000Z'] -t1%a.20180101T0000Z -triggered off ['t1+a.20180101T0000Z'] -t1+a.20200101T0000Z -triggered off ['t1-a.20200101T0000Z'] -t1%a.20190101T0000Z -triggered off ['t1+a.20190101T0000Z'] -t1%a.20200101T0000Z -triggered off ['t1+a.20200101T0000Z'] +20150101T0000Z/t1 -triggered off ['20130101T0000Z/t1'] +20160101T0000Z/t1 -triggered off ['20140101T0000Z/t1'] +20170101T0000Z/t1 -triggered off ['20150101T0000Z/t1'] +20150101T0000Z/t1-a -triggered off ['20150101T0000Z/t1'] +20160101T0000Z/t1-a -triggered off ['20160101T0000Z/t1'] +20150101T0000Z/t1+a -triggered off ['20150101T0000Z/t1-a'] +20170101T0000Z/t1-a -triggered off ['20170101T0000Z/t1'] +20160101T0000Z/t1+a -triggered off ['20160101T0000Z/t1-a'] +20150101T0000Z/t1%a -triggered off ['20150101T0000Z/t1+a'] +20170101T0000Z/t1+a -triggered off ['20170101T0000Z/t1-a'] +20160101T0000Z/t1%a -triggered off ['20160101T0000Z/t1+a'] +20180101T0000Z/t1 -triggered off ['20160101T0000Z/t1'] +20170101T0000Z/t1%a -triggered off ['20170101T0000Z/t1+a'] +20190101T0000Z/t1 -triggered off ['20170101T0000Z/t1'] +20180101T0000Z/t1-a -triggered off ['20180101T0000Z/t1'] +20200101T0000Z/t1 -triggered off ['20180101T0000Z/t1'] +20190101T0000Z/t1-a -triggered off ['20190101T0000Z/t1'] +20180101T0000Z/t1+a -triggered off ['20180101T0000Z/t1-a'] +20200101T0000Z/t1-a -triggered off ['20200101T0000Z/t1'] +20190101T0000Z/t1+a -triggered off ['20190101T0000Z/t1-a'] +20180101T0000Z/t1%a -triggered off ['20180101T0000Z/t1+a'] +20200101T0000Z/t1+a -triggered off ['20200101T0000Z/t1-a'] +20190101T0000Z/t1%a -triggered off ['20190101T0000Z/t1+a'] +20200101T0000Z/t1%a -triggered off ['20200101T0000Z/t1+a'] diff --git a/tests/functional/triggering/00-recovery/flow.cylc b/tests/functional/triggering/00-recovery/flow.cylc index 145387f10d7..c677aae7930 100644 --- a/tests/functional/triggering/00-recovery/flow.cylc +++ b/tests/functional/triggering/00-recovery/flow.cylc @@ -10,7 +10,7 @@ UTC mode = True allow implicit tasks = True [[events]] - expected task failures = model.20110101T1200Z + expected task failures = 20110101T1200Z/model [scheduling] initial cycle point = 20110101T00 diff --git a/tests/functional/triggering/00-recovery/reference.log b/tests/functional/triggering/00-recovery/reference.log index b41e2213677..a5f3f3b1928 100644 --- a/tests/functional/triggering/00-recovery/reference.log +++ b/tests/functional/triggering/00-recovery/reference.log @@ -1,10 +1,10 @@ -2012/09/12 09:36:00 INFO - Initial point: 20110101T0000Z -2012/09/12 09:36:00 INFO - Final point: 20110101T1200Z -2012/09/12 09:36:00 DEBUG - pre.20110101T0000Z -triggered off [] -2012/09/12 09:36:00 DEBUG - pre.20110101T1200Z -triggered off [] -2012/09/12 09:36:01 DEBUG - model.20110101T0000Z -triggered off ['pre.20110101T0000Z'] -2012/09/12 09:36:01 DEBUG - model.20110101T1200Z -triggered off ['pre.20110101T1200Z'] -2012/09/12 09:36:02 DEBUG - post.20110101T0000Z -triggered off ['model.20110101T0000Z'] -2012/09/12 09:36:02 DEBUG - diagnose.20110101T1200Z -triggered off ['model.20110101T1200Z'] -2012/09/12 09:36:02 DEBUG - recover.20110101T1200Z -triggered off ['diagnose.20110101T1200Z'] -2012/09/12 09:36:03 DEBUG - post.20110101T1200Z -triggered off ['recover.20110101T1200Z'] +Initial point: 20110101T0000Z +Final point: 20110101T1200Z +20110101T0000Z/pre -triggered off [] +20110101T1200Z/pre -triggered off [] +20110101T0000Z/model -triggered off ['20110101T0000Z/pre'] +20110101T1200Z/model -triggered off ['20110101T1200Z/pre'] +20110101T0000Z/post -triggered off ['20110101T0000Z/model'] +20110101T1200Z/diagnose -triggered off ['20110101T1200Z/model'] +20110101T1200Z/recover -triggered off ['20110101T1200Z/diagnose'] +20110101T1200Z/post -triggered off ['20110101T1200Z/recover'] diff --git a/tests/functional/triggering/00a-recovery/flow.cylc b/tests/functional/triggering/00a-recovery/flow.cylc index 5f8907c9dc0..fbd9c9db8a9 100644 --- a/tests/functional/triggering/00a-recovery/flow.cylc +++ b/tests/functional/triggering/00a-recovery/flow.cylc @@ -13,7 +13,7 @@ UTC mode = True allow implicit tasks = True [[events]] - expected task failures = model.20110101T1200Z + expected task failures = 20110101T1200Z/model [scheduling] initial cycle point = 20110101T00 diff --git a/tests/functional/triggering/00a-recovery/reference.log b/tests/functional/triggering/00a-recovery/reference.log index b41e2213677..a5f3f3b1928 100644 --- a/tests/functional/triggering/00a-recovery/reference.log +++ b/tests/functional/triggering/00a-recovery/reference.log @@ -1,10 +1,10 @@ -2012/09/12 09:36:00 INFO - Initial point: 20110101T0000Z -2012/09/12 09:36:00 INFO - Final point: 20110101T1200Z -2012/09/12 09:36:00 DEBUG - pre.20110101T0000Z -triggered off [] -2012/09/12 09:36:00 DEBUG - pre.20110101T1200Z -triggered off [] -2012/09/12 09:36:01 DEBUG - model.20110101T0000Z -triggered off ['pre.20110101T0000Z'] -2012/09/12 09:36:01 DEBUG - model.20110101T1200Z -triggered off ['pre.20110101T1200Z'] -2012/09/12 09:36:02 DEBUG - post.20110101T0000Z -triggered off ['model.20110101T0000Z'] -2012/09/12 09:36:02 DEBUG - diagnose.20110101T1200Z -triggered off ['model.20110101T1200Z'] -2012/09/12 09:36:02 DEBUG - recover.20110101T1200Z -triggered off ['diagnose.20110101T1200Z'] -2012/09/12 09:36:03 DEBUG - post.20110101T1200Z -triggered off ['recover.20110101T1200Z'] +Initial point: 20110101T0000Z +Final point: 20110101T1200Z +20110101T0000Z/pre -triggered off [] +20110101T1200Z/pre -triggered off [] +20110101T0000Z/model -triggered off ['20110101T0000Z/pre'] +20110101T1200Z/model -triggered off ['20110101T1200Z/pre'] +20110101T0000Z/post -triggered off ['20110101T0000Z/model'] +20110101T1200Z/diagnose -triggered off ['20110101T1200Z/model'] +20110101T1200Z/recover -triggered off ['20110101T1200Z/diagnose'] +20110101T1200Z/post -triggered off ['20110101T1200Z/recover'] diff --git a/tests/functional/triggering/01-or-conditional/flow.cylc b/tests/functional/triggering/01-or-conditional/flow.cylc index 672ac89ba7c..62159c87604 100644 --- a/tests/functional/triggering/01-or-conditional/flow.cylc +++ b/tests/functional/triggering/01-or-conditional/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = b.1, c.1 + expected task failures = 1/b, 1/c [scheduling] [[graph]] R1 = """ diff --git a/tests/functional/triggering/01-or-conditional/reference.log b/tests/functional/triggering/01-or-conditional/reference.log index 422c4b012bc..1ae8384bda3 100644 --- a/tests/functional/triggering/01-or-conditional/reference.log +++ b/tests/functional/triggering/01-or-conditional/reference.log @@ -1,7 +1,7 @@ Initial point: 1 Final point: 1 -a.1 -triggered off [] -b.1 -triggered off [] -c.1 -triggered off ['a.1'] -d.1 -triggered off ['a.1'] -e.1 -triggered off ['d.1'] +1/a -triggered off [] +1/b -triggered off [] +1/c -triggered off ['1/a'] +1/d -triggered off ['1/a'] +1/e -triggered off ['1/d'] diff --git a/tests/functional/triggering/02-fam-start-all/reference.log b/tests/functional/triggering/02-fam-start-all/reference.log index 17fa5833369..6f6ac242fe5 100644 --- a/tests/functional/triggering/02-fam-start-all/reference.log +++ b/tests/functional/triggering/02-fam-start-all/reference.log @@ -1,6 +1,6 @@ -2013/11/05 15:25:53 INFO - Initial point: 1 -2013/11/05 15:25:53 INFO - Final point: 1 -2013/11/05 15:25:53 DEBUG - a.1 -triggered off [] -2013/11/05 15:25:53 DEBUG - c.1 -triggered off [] -2013/11/05 15:25:53 DEBUG - b.1 -triggered off [] -2013/11/05 15:25:57 DEBUG - foo.1 -triggered off ['a.1', 'b.1', 'c.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/a', '1/b', '1/c'] diff --git a/tests/functional/triggering/03-fam-succeed-all/reference.log b/tests/functional/triggering/03-fam-succeed-all/reference.log index 8d9931e0dbe..6f6ac242fe5 100644 --- a/tests/functional/triggering/03-fam-succeed-all/reference.log +++ b/tests/functional/triggering/03-fam-succeed-all/reference.log @@ -1,6 +1,6 @@ -2013/11/05 15:29:45 INFO - Initial point: 1 -2013/11/05 15:29:45 INFO - Final point: 1 -2013/11/05 15:29:45 DEBUG - a.1 -triggered off [] -2013/11/05 15:29:45 DEBUG - c.1 -triggered off [] -2013/11/05 15:29:45 DEBUG - b.1 -triggered off [] -2013/11/05 15:29:49 DEBUG - foo.1 -triggered off ['a.1', 'b.1', 'c.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/a', '1/b', '1/c'] diff --git a/tests/functional/triggering/04-fam-fail-all/flow.cylc b/tests/functional/triggering/04-fam-fail-all/flow.cylc index 9eb93a4e84a..93ce6f42cc4 100644 --- a/tests/functional/triggering/04-fam-fail-all/flow.cylc +++ b/tests/functional/triggering/04-fam-fail-all/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = a.1, b.1, c.1 + expected task failures = 1/a, 1/b, 1/c [scheduling] [[graph]] diff --git a/tests/functional/triggering/04-fam-fail-all/reference.log b/tests/functional/triggering/04-fam-fail-all/reference.log index 2a1e68762a7..6f6ac242fe5 100644 --- a/tests/functional/triggering/04-fam-fail-all/reference.log +++ b/tests/functional/triggering/04-fam-fail-all/reference.log @@ -1,6 +1,6 @@ -2013/11/05 15:35:27 INFO - Initial point: 1 -2013/11/05 15:35:27 INFO - Final point: 1 -2013/11/05 15:35:27 DEBUG - a.1 -triggered off [] -2013/11/05 15:35:27 DEBUG - c.1 -triggered off [] -2013/11/05 15:35:27 DEBUG - b.1 -triggered off [] -2013/11/05 15:35:31 DEBUG - foo.1 -triggered off ['a.1', 'b.1', 'c.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/a', '1/b', '1/c'] diff --git a/tests/functional/triggering/05-fam-finish-all/flow.cylc b/tests/functional/triggering/05-fam-finish-all/flow.cylc index 4896bac184a..3190a1eed4f 100644 --- a/tests/functional/triggering/05-fam-finish-all/flow.cylc +++ b/tests/functional/triggering/05-fam-finish-all/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = a.1, c.1 + expected task failures = 1/a, 1/c [scheduling] [[graph]] diff --git a/tests/functional/triggering/05-fam-finish-all/reference.log b/tests/functional/triggering/05-fam-finish-all/reference.log index 8a0ace8d219..6f6ac242fe5 100644 --- a/tests/functional/triggering/05-fam-finish-all/reference.log +++ b/tests/functional/triggering/05-fam-finish-all/reference.log @@ -1,6 +1,6 @@ -2013/11/05 15:38:54 INFO - Initial point: 1 -2013/11/05 15:38:54 INFO - Final point: 1 -2013/11/05 15:38:54 DEBUG - a.1 -triggered off [] -2013/11/05 15:38:54 DEBUG - c.1 -triggered off [] -2013/11/05 15:38:54 DEBUG - b.1 -triggered off [] -2013/11/05 15:38:58 DEBUG - foo.1 -triggered off ['a.1', 'b.1', 'c.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/a', '1/b', '1/c'] diff --git a/tests/functional/triggering/06-fam-succeed-any/flow.cylc b/tests/functional/triggering/06-fam-succeed-any/flow.cylc index 830b3713c27..e3786726f5e 100644 --- a/tests/functional/triggering/06-fam-succeed-any/flow.cylc +++ b/tests/functional/triggering/06-fam-succeed-any/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = a.1, c.1 + expected task failures = 1/a, 1/c [scheduling] [[graph]] diff --git a/tests/functional/triggering/06-fam-succeed-any/reference.log b/tests/functional/triggering/06-fam-succeed-any/reference.log index 2a77c6d2b27..79b1eddac34 100644 --- a/tests/functional/triggering/06-fam-succeed-any/reference.log +++ b/tests/functional/triggering/06-fam-succeed-any/reference.log @@ -1,7 +1,7 @@ -2013/11/05 15:57:18 INFO - Initial point: 1 -2013/11/05 15:57:18 INFO - Final point: 1 -2013/11/05 15:57:18 DEBUG - a.1 -triggered off [] -2013/11/05 15:57:18 DEBUG - c.1 -triggered off [] -2013/11/05 15:57:18 DEBUG - b.1 -triggered off [] -2013/11/05 15:57:22 DEBUG - foo.1 -triggered off ['b.1'] -2013/11/05 15:57:22 DEBUG - handled.1 -triggered off ['a.1', 'c.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/b'] +1/handled -triggered off ['1/a', '1/c'] diff --git a/tests/functional/triggering/07-fam-fail-any/flow.cylc b/tests/functional/triggering/07-fam-fail-any/flow.cylc index 52d050b9a37..cf50c7000ad 100644 --- a/tests/functional/triggering/07-fam-fail-any/flow.cylc +++ b/tests/functional/triggering/07-fam-fail-any/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = b.1 + expected task failures = 1/b [scheduling] [[graph]] diff --git a/tests/functional/triggering/07-fam-fail-any/reference.log b/tests/functional/triggering/07-fam-fail-any/reference.log index 8f440a34a05..86a6bf44b6d 100644 --- a/tests/functional/triggering/07-fam-fail-any/reference.log +++ b/tests/functional/triggering/07-fam-fail-any/reference.log @@ -1,6 +1,6 @@ -2013/11/05 16:06:31 INFO - Initial point: 1 -2013/11/05 16:06:31 INFO - Final point: 1 -2013/11/05 16:06:31 DEBUG - a.1 -triggered off [] -2013/11/05 16:06:31 DEBUG - c.1 -triggered off [] -2013/11/05 16:06:31 DEBUG - b.1 -triggered off [] -2013/11/05 16:06:35 DEBUG - foo.1 -triggered off ['b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/b'] diff --git a/tests/functional/triggering/08-fam-finish-any/reference.log b/tests/functional/triggering/08-fam-finish-any/reference.log index b98488567c8..86a6bf44b6d 100644 --- a/tests/functional/triggering/08-fam-finish-any/reference.log +++ b/tests/functional/triggering/08-fam-finish-any/reference.log @@ -1,6 +1,6 @@ -2013/11/05 16:10:08 INFO - Initial point: 1 -2013/11/05 16:10:08 INFO - Final point: 1 -2013/11/05 16:10:08 DEBUG - a.1 -triggered off [] -2013/11/05 16:10:08 DEBUG - c.1 -triggered off [] -2013/11/05 16:10:08 DEBUG - b.1 -triggered off [] -2013/11/05 16:10:12 DEBUG - foo.1 -triggered off ['b.1'] +Initial point: 1 +Final point: 1 +1/a -triggered off [] +1/c -triggered off [] +1/b -triggered off [] +1/foo -triggered off ['1/b'] diff --git a/tests/functional/triggering/09-fail/flow.cylc b/tests/functional/triggering/09-fail/flow.cylc index 1593b62a7aa..b4048e27ae5 100644 --- a/tests/functional/triggering/09-fail/flow.cylc +++ b/tests/functional/triggering/09-fail/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] diff --git a/tests/functional/triggering/09-fail/reference.log b/tests/functional/triggering/09-fail/reference.log index cf1c6db922b..1a9f846c98d 100644 --- a/tests/functional/triggering/09-fail/reference.log +++ b/tests/functional/triggering/09-fail/reference.log @@ -1,4 +1,4 @@ -2013/11/15 12:10:06 INFO - Initial point: 1 -2013/11/15 12:10:06 INFO - Final point: 1 -2013/11/15 12:10:06 DEBUG - foo.1 -triggered off [] -2013/11/15 12:10:10 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/triggering/10-finish/flow.cylc b/tests/functional/triggering/10-finish/flow.cylc index 5a9856cc248..53b78fcec1e 100644 --- a/tests/functional/triggering/10-finish/flow.cylc +++ b/tests/functional/triggering/10-finish/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] diff --git a/tests/functional/triggering/10-finish/reference.log b/tests/functional/triggering/10-finish/reference.log index 6eedd9abca0..875ed03caf9 100644 --- a/tests/functional/triggering/10-finish/reference.log +++ b/tests/functional/triggering/10-finish/reference.log @@ -1,6 +1,6 @@ -2013/11/15 12:12:45 INFO - Initial point: 1 -2013/11/15 12:12:45 INFO - Final point: 1 -2013/11/15 12:12:45 DEBUG - baz.1 -triggered off [] -2013/11/15 12:12:45 DEBUG - foo.1 -triggered off [] -2013/11/15 12:12:49 DEBUG - bar.1 -triggered off ['foo.1'] -2013/11/15 12:12:49 DEBUG - qux.1 -triggered off ['baz.1'] +Initial point: 1 +Final point: 1 +1/baz -triggered off [] +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] +1/qux -triggered off ['1/baz'] diff --git a/tests/functional/triggering/11-start/reference.log b/tests/functional/triggering/11-start/reference.log index 75a1a2f17cc..1a9f846c98d 100644 --- a/tests/functional/triggering/11-start/reference.log +++ b/tests/functional/triggering/11-start/reference.log @@ -1,4 +1,4 @@ -2013/11/15 12:14:44 INFO - Initial point: 1 -2013/11/15 12:14:44 INFO - Final point: 1 -2013/11/15 12:14:44 DEBUG - foo.1 -triggered off [] -2013/11/15 12:14:47 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/triggering/12-succeed/reference.log b/tests/functional/triggering/12-succeed/reference.log index 00a4860a141..1a9f846c98d 100644 --- a/tests/functional/triggering/12-succeed/reference.log +++ b/tests/functional/triggering/12-succeed/reference.log @@ -1,4 +1,4 @@ -2013/11/15 12:16:26 INFO - Initial point: 1 -2013/11/15 12:16:26 INFO - Final point: 1 -2013/11/15 12:16:26 DEBUG - foo.1 -triggered off [] -2013/11/15 12:16:30 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/triggering/13-submit/reference.log b/tests/functional/triggering/13-submit/reference.log index 820baea4432..1a9f846c98d 100644 --- a/tests/functional/triggering/13-submit/reference.log +++ b/tests/functional/triggering/13-submit/reference.log @@ -1,4 +1,4 @@ -2013/11/15 12:22:42 INFO - Initial point: 1 -2013/11/15 12:22:42 INFO - Final point: 1 -2013/11/15 12:22:42 DEBUG - foo.1 -triggered off [] -2013/11/15 12:22:45 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/triggering/14-submit-fail/flow.cylc b/tests/functional/triggering/14-submit-fail/flow.cylc index c604695e7a6..e2e865fa39c 100644 --- a/tests/functional/triggering/14-submit-fail/flow.cylc +++ b/tests/functional/triggering/14-submit-fail/flow.cylc @@ -1,6 +1,6 @@ [scheduler] [[events]] - expected task failures = foo.1 + expected task failures = 1/foo [scheduling] [[graph]] diff --git a/tests/functional/triggering/14-submit-fail/reference.log b/tests/functional/triggering/14-submit-fail/reference.log index 1542ec1f4c2..1a9f846c98d 100644 --- a/tests/functional/triggering/14-submit-fail/reference.log +++ b/tests/functional/triggering/14-submit-fail/reference.log @@ -1,4 +1,4 @@ -2013/11/15 12:25:18 INFO - Initial point: 1 -2013/11/15 12:25:18 INFO - Final point: 1 -2013/11/15 12:25:18 DEBUG - foo.1 -triggered off [] -2013/11/15 12:25:20 DEBUG - bar.1 -triggered off ['foo.1'] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] +1/bar -triggered off ['1/foo'] diff --git a/tests/functional/triggering/15-suicide/flow.cylc b/tests/functional/triggering/15-suicide/flow.cylc index 9e4a45c467b..eed1d934b8c 100644 --- a/tests/functional/triggering/15-suicide/flow.cylc +++ b/tests/functional/triggering/15-suicide/flow.cylc @@ -3,7 +3,7 @@ [scheduler] allow implicit tasks = True [[events]] - expected task failures = goodbye.1 + expected task failures = 1/goodbye [scheduling] [[graph]] diff --git a/tests/functional/triggering/15-suicide/reference.log b/tests/functional/triggering/15-suicide/reference.log index d53672d5559..c58830189ab 100644 --- a/tests/functional/triggering/15-suicide/reference.log +++ b/tests/functional/triggering/15-suicide/reference.log @@ -1,5 +1,5 @@ -2014/01/08 10:04:17 INFO - Initial point: 1 -2014/01/08 10:04:17 INFO - Final point: 1 -2014/01/08 10:04:17 DEBUG - hello.1 -triggered off [] -2014/01/08 10:04:30 DEBUG - goodbye.1 -triggered off ['hello.1'] -2014/01/08 10:04:44 DEBUG - really_goodbye.1 -triggered off ['goodbye.1'] +Initial point: 1 +Final point: 1 +1/hello -triggered off [] +1/goodbye -triggered off ['1/hello'] +1/really_goodbye -triggered off ['1/goodbye'] diff --git a/tests/functional/triggering/16-fam-expansion.t b/tests/functional/triggering/16-fam-expansion.t index e1c2b88b6fb..4b48161588c 100644 --- a/tests/functional/triggering/16-fam-expansion.t +++ b/tests/functional/triggering/16-fam-expansion.t @@ -32,12 +32,12 @@ workflow_run_ok "${TEST_NAME}" \ #------------------------------------------------------------------------------- contains_ok "$SHOW_OUT" <<'__SHOW_DUMP__' + (((1 | 0) & (3 | 2) & (5 | 4)) & (0 | 2 | 4)) - + 0 = foo1.1 failed - - 1 = foo1.1 succeeded - + 2 = foo2.1 failed - - 3 = foo2.1 succeeded - + 4 = foo3.1 failed - - 5 = foo3.1 succeeded + + 0 = 1/foo1 failed + - 1 = 1/foo1 succeeded + + 2 = 1/foo2 failed + - 3 = 1/foo2 succeeded + + 4 = 1/foo3 failed + - 5 = 1/foo3 succeeded __SHOW_DUMP__ #------------------------------------------------------------------------------- purge diff --git a/tests/functional/triggering/17-suicide-multi/reference.log b/tests/functional/triggering/17-suicide-multi/reference.log index ec75da6dad3..19a6da47b19 100644 --- a/tests/functional/triggering/17-suicide-multi/reference.log +++ b/tests/functional/triggering/17-suicide-multi/reference.log @@ -1,11 +1,11 @@ -2017-12-27T14:42:10Z INFO - Initial point: 1 -2017-12-27T14:42:10Z INFO - Final point: 3 -2017-12-27T14:42:10Z DEBUG - showdown.1 -triggered off ['fin.0'] -2017-12-27T14:42:13Z DEBUG - ugly.1 -triggered off ['showdown.1'] -2017-12-27T14:42:16Z DEBUG - fin.1 -triggered off ['ugly.1'] -2017-12-27T14:42:19Z DEBUG - showdown.2 -triggered off ['fin.1'] -2017-12-27T14:42:22Z DEBUG - bad.2 -triggered off ['showdown.2'] -2017-12-27T14:42:25Z DEBUG - fin.2 -triggered off ['bad.2'] -2017-12-27T14:42:28Z DEBUG - showdown.3 -triggered off ['fin.2'] -2017-12-27T14:42:32Z DEBUG - good.3 -triggered off ['showdown.3'] -2017-12-27T14:42:35Z DEBUG - fin.3 -triggered off ['good.3'] +Initial point: 1 +Final point: 3 +1/showdown -triggered off ['0/fin'] +1/ugly -triggered off ['1/showdown'] +1/fin -triggered off ['1/ugly'] +2/showdown -triggered off ['1/fin'] +2/bad -triggered off ['2/showdown'] +2/fin -triggered off ['2/bad'] +3/showdown -triggered off ['2/fin'] +3/good -triggered off ['3/showdown'] +3/fin -triggered off ['3/good'] diff --git a/tests/functional/triggering/19-and-suicide/flow.cylc b/tests/functional/triggering/19-and-suicide/flow.cylc index 2335c54c0f3..cf7ae49d129 100644 --- a/tests/functional/triggering/19-and-suicide/flow.cylc +++ b/tests/functional/triggering/19-and-suicide/flow.cylc @@ -5,7 +5,7 @@ [[events]] abort on stall timeout = True stall timeout = PT0S - expected task failures = t1.1 + expected task failures = 1/t1 [scheduling] [[graph]] R1 = """ @@ -15,8 +15,8 @@ [runtime] [[t0]] # https://github.com/cylc/cylc-flow/issues/2655 - # "t2.1" should not suicide on "t1.1:failed" - script = cylc__job__poll_grep_workflow_log -E 't1\.1 .* \(received\)failed' + # "1/t2" should not suicide on "1/t1:failed" + script = cylc__job__poll_grep_workflow_log -E '1/t1 .* \(received\)failed' [[t1]] script = false [[t2]] diff --git a/tests/functional/triggering/19-and-suicide/reference.log b/tests/functional/triggering/19-and-suicide/reference.log index 75dc65ec503..0ec8135dd57 100644 --- a/tests/functional/triggering/19-and-suicide/reference.log +++ b/tests/functional/triggering/19-and-suicide/reference.log @@ -1,5 +1,5 @@ -2018-05-08T15:09:34Z INFO - Initial point: 1 -2018-05-08T15:09:34Z INFO - Final point: 1 -2018-05-08T15:09:34Z DEBUG - t0.1 -triggered off [] -2018-05-08T15:09:34Z DEBUG - t1.1 -triggered off [] -2018-05-08T15:09:47Z DEBUG - t2.1 -triggered off ['t0.1'] +Initial point: 1 +Final point: 1 +1/t0 -triggered off [] +1/t1 -triggered off [] +1/t2 -triggered off ['1/t0'] diff --git a/tests/functional/triggering/20-and-outputs-suicide/reference.log b/tests/functional/triggering/20-and-outputs-suicide/reference.log index 2d41c0ec0d3..acaca0277d6 100644 --- a/tests/functional/triggering/20-and-outputs-suicide/reference.log +++ b/tests/functional/triggering/20-and-outputs-suicide/reference.log @@ -1,14 +1,14 @@ Initial point: 1 Final point: 3 -showdown.1 -triggered off ['fin.0'] -bad.1 -triggered off ['showdown.1'] -ugly.1 -triggered off ['showdown.1'] -fin.1 -triggered off ['bad.1', 'ugly.1'] -showdown.2 -triggered off ['fin.1'] -good.2 -triggered off ['showdown.2'] -ugly.2 -triggered off ['showdown.2'] -fin.2 -triggered off ['good.2', 'ugly.2'] -showdown.3 -triggered off ['fin.2'] -bad.3 -triggered off ['showdown.3'] -good.3 -triggered off ['showdown.3'] -fin.3 -triggered off ['bad.3', 'good.3'] +1/showdown -triggered off ['0/fin'] +1/bad -triggered off ['1/showdown'] +1/ugly -triggered off ['1/showdown'] +1/fin -triggered off ['1/bad', '1/ugly'] +2/showdown -triggered off ['1/fin'] +2/good -triggered off ['2/showdown'] +2/ugly -triggered off ['2/showdown'] +2/fin -triggered off ['2/good', '2/ugly'] +3/showdown -triggered off ['2/fin'] +3/bad -triggered off ['3/showdown'] +3/good -triggered off ['3/showdown'] +3/fin -triggered off ['3/bad', '3/good'] diff --git a/tests/functional/triggering/fam-expansion/flow.cylc b/tests/functional/triggering/fam-expansion/flow.cylc index 778f948ad78..1c34f6dc4f9 100644 --- a/tests/functional/triggering/fam-expansion/flow.cylc +++ b/tests/functional/triggering/fam-expansion/flow.cylc @@ -8,4 +8,4 @@ [[foo1,foo2,foo3]] inherit = FOO [[bar]] - script = "cylc show ${CYLC_WORKFLOW_ID} bar.1 > {{SHOW_OUT}}" + script = cylc show "${CYLC_WORKFLOW_ID}//1/bar" > {{SHOW_OUT}} diff --git a/tests/functional/validate/00-multi/reference.log b/tests/functional/validate/00-multi/reference.log index 7712e92f2eb..08fe5d5558a 100644 --- a/tests/functional/validate/00-multi/reference.log +++ b/tests/functional/validate/00-multi/reference.log @@ -1,3 +1,3 @@ -2013/04/30 09:18:53 INFO - Initial point: 1 -2013/04/30 09:18:53 INFO - Final point: 1 -2013/04/30 09:18:54 DEBUG - foo.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/foo -triggered off [] diff --git a/tests/functional/validate/01-periodical/reference.log b/tests/functional/validate/01-periodical/reference.log index d797d59afd3..6057d2d6399 100644 --- a/tests/functional/validate/01-periodical/reference.log +++ b/tests/functional/validate/01-periodical/reference.log @@ -1,6 +1,6 @@ -2013/08/19 15:29:00 INFO - Initial point: 2010010100 -2013/08/19 15:29:00 INFO - Final point: 2010010200 -2013/08/19 15:29:00 DEBUG - monthly.2010010100 -triggered off [] -2013/08/19 15:29:00 DEBUG - yearly.2010010100 -triggered off [] -2013/08/19 15:29:00 DEBUG - daily.2010010100 -triggered off [] -2013/08/19 15:29:04 DEBUG - daily.2010010200 -triggered off [] +Initial point: 2010010100 +Final point: 2010010200 +2010010100/monthly -triggered off [] +2010010100/yearly -triggered off [] +2010010100/daily -triggered off [] +2010010200/daily -triggered off [] diff --git a/tests/functional/validate/09-include-missing.t b/tests/functional/validate/09-include-missing.t index 30c3df5b4f2..76eba530389 100755 --- a/tests/functional/validate/09-include-missing.t +++ b/tests/functional/validate/09-include-missing.t @@ -21,7 +21,7 @@ set_test_number 2 echo '%include foo.cylc' >flow.cylc echo '%include bar.cylc' >foo.cylc -run_fail "${TEST_NAME_BASE}" cylc validate flow.cylc +run_fail "${TEST_NAME_BASE}" cylc validate . cmp_ok "${TEST_NAME_BASE}.stderr" <<__ERR__ IncludeFileNotFoundError: bar.cylc via foo.cylc from $PWD/flow.cylc __ERR__ diff --git a/tests/functional/validate/10-bad-recurrence.t b/tests/functional/validate/10-bad-recurrence.t index 07e1382fa0c..f72dd031461 100755 --- a/tests/functional/validate/10-bad-recurrence.t +++ b/tests/functional/validate/10-bad-recurrence.t @@ -34,7 +34,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[foo]] script = true __WORKFLOW__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: Cannot process recurrence R/T00/PT5D (initial cycle point=20140101T0000+01) (final cycle point=20140201T0000+01) __ERR__ @@ -51,7 +51,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[root]] script = true __WORKFLOW__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: Cannot process recurrence R1/P0D (initial cycle point=20140101T0000Z) (final cycle point=None) This workflow requires a final cycle point. __ERR__ @@ -71,7 +71,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[foo]] script = true __WORKFLOW__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: Cannot process recurrence R/00/P5D (initial cycle point=20140101T0000+01) (final cycle point=20140201T0000+01) '00': 2 digit centuries not allowed. Did you mean T-digit-digit e.g. 'T00'? __ERR__ @@ -85,7 +85,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[graph]] 0,6,12 = "foo" __WORKFLOW__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: Cannot process recurrence 0 (initial cycle point=20100101T0000+01) (final cycle point=None) '0': not a valid cylc-shorthand or full ISO 8601 date representation __ERR__ @@ -99,7 +99,7 @@ cat >'flow.cylc' <<'__WORKFLOW__' [[graph]] R1 = foo __WORKFLOW__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: Cannot process recurrence R1 (initial cycle point=2010010101) (final cycle point=None) '2010010101': not a valid cylc-shorthand or full ISO 8601 date representation __ERR__ diff --git a/tests/functional/validate/17-fail-old-syntax-6.t b/tests/functional/validate/17-fail-old-syntax-6.t index 9c2612f664c..f17762a89ca 100755 --- a/tests/functional/validate/17-fail-old-syntax-6.t +++ b/tests/functional/validate/17-fail-old-syntax-6.t @@ -29,7 +29,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' __FLOW_CONFIG__ #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}" -run_fail "${TEST_NAME}" cylc validate -v 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate -v . grep_ok 'WorkflowConfigError: Cannot process recurrence 12' "${TEST_NAME}.stderr" #------------------------------------------------------------------------------- exit diff --git a/tests/functional/validate/21-fail-no-graph-2.t b/tests/functional/validate/21-fail-no-graph-2.t index 50a8ce89ced..d4f77b5d602 100755 --- a/tests/functional/validate/21-fail-no-graph-2.t +++ b/tests/functional/validate/21-fail-no-graph-2.t @@ -26,7 +26,7 @@ cat > flow.cylc <<__END__ [[graph]] R1 = "" __END__ -run_fail "${TEST_NAME}" cylc validate -v flow.cylc +run_fail "${TEST_NAME}" cylc validate -v . grep_ok "No workflow dependency graph defined." "${TEST_NAME}.stderr" #------------------------------------------------------------------------------- TEST_NAME=${TEST_NAME_BASE}-no-graph @@ -35,5 +35,5 @@ cat > flow.cylc <<__END__ initial cycle point = 2015 [[graph]] __END__ -run_fail "${TEST_NAME}" cylc validate -v flow.cylc +run_fail "${TEST_NAME}" cylc validate -v . grep_ok "No workflow dependency graph defined." "${TEST_NAME}.stderr" diff --git a/tests/functional/validate/31-fail-not-integer.t b/tests/functional/validate/31-fail-not-integer.t index 106250132c5..a2d7369232a 100755 --- a/tests/functional/validate/31-fail-not-integer.t +++ b/tests/functional/validate/31-fail-not-integer.t @@ -33,7 +33,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' __FLOW_CONFIG__ #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}" -run_fail "${TEST_NAME}" cylc validate -v 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate -v . grep_ok "WorkflowConfigError: Cannot process recurrence 1" "${TEST_NAME}.stderr" #------------------------------------------------------------------------------- exit diff --git a/tests/functional/validate/40-jinja2-template-syntax-error-main.t b/tests/functional/validate/40-jinja2-template-syntax-error-main.t index 5e09eeaa06d..97cb6654339 100755 --- a/tests/functional/validate/40-jinja2-template-syntax-error-main.t +++ b/tests/functional/validate/40-jinja2-template-syntax-error-main.t @@ -22,7 +22,7 @@ set_test_number 2 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-val" -run_fail "${TEST_NAME}" cylc validate flow.cylc +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: Encountered unknown tag 'end'. Jinja was looking for the following tags: 'elif' or 'else' or 'endif'. diff --git a/tests/functional/validate/41-jinja2-template-syntax-error-cylc-include.t b/tests/functional/validate/41-jinja2-template-syntax-error-cylc-include.t index 3adbf75585a..592a523a3c7 100755 --- a/tests/functional/validate/41-jinja2-template-syntax-error-cylc-include.t +++ b/tests/functional/validate/41-jinja2-template-syntax-error-cylc-include.t @@ -22,7 +22,7 @@ set_test_number 2 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-val" -run_fail "${TEST_NAME}" cylc validate flow.cylc +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: Encountered unknown tag 'end'. Jinja was looking for the following tags: 'elif' or 'else' or 'endif'. diff --git a/tests/functional/validate/42-jinja2-template-syntax-error-jinja-include.t b/tests/functional/validate/42-jinja2-template-syntax-error-jinja-include.t index 99e64a643b8..019ef6b0078 100755 --- a/tests/functional/validate/42-jinja2-template-syntax-error-jinja-include.t +++ b/tests/functional/validate/42-jinja2-template-syntax-error-jinja-include.t @@ -22,7 +22,7 @@ set_test_number 2 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-val" -run_fail "${TEST_NAME}" cylc validate flow.cylc +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: Encountered unknown tag 'end'. Error in file "flow-includeme.cylc" diff --git a/tests/functional/validate/43-jinja2-template-error-main.t b/tests/functional/validate/43-jinja2-template-error-main.t index 2c5f96043b8..49d0763b879 100755 --- a/tests/functional/validate/43-jinja2-template-error-main.t +++ b/tests/functional/validate/43-jinja2-template-error-main.t @@ -30,7 +30,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [[foo]] script = sleep 1 __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}" cylc validate . cmp_ok "${TEST_NAME_BASE}.stderr" <<'__ERROR__' Jinja2Error: You can only sort by either "key" or "value" Context lines: diff --git a/tests/functional/validate/44-jinja2-template-not-found.t b/tests/functional/validate/44-jinja2-template-not-found.t index 9e6d9fca0c8..a1259ba4524 100755 --- a/tests/functional/validate/44-jinja2-template-not-found.t +++ b/tests/functional/validate/44-jinja2-template-not-found.t @@ -22,7 +22,7 @@ set_test_number 2 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-val" -run_fail "${TEST_NAME}" cylc validate flow.cylc +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: flow-foo.cylc Context lines: diff --git a/tests/functional/validate/45-jinja2-type-error.t b/tests/functional/validate/45-jinja2-type-error.t index e1cf2f3e5ad..ce764e628ed 100755 --- a/tests/functional/validate/45-jinja2-type-error.t +++ b/tests/functional/validate/45-jinja2-type-error.t @@ -29,7 +29,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' R1 = foo {{ 1 / 'foo' }} __FLOW_CONFIG__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: unsupported operand type(s) for /: 'int' and 'str' Context lines: @@ -44,7 +44,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' {% set foo = [1, 2] %} {% set a, b, c = foo %} __FLOW_CONFIG__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: not enough values to unpack (expected 3, got 2) Context lines: diff --git a/tests/functional/validate/49-jinja2-undefined-error.t b/tests/functional/validate/49-jinja2-undefined-error.t index f86d265d8dc..c08c7777a25 100755 --- a/tests/functional/validate/49-jinja2-undefined-error.t +++ b/tests/functional/validate/49-jinja2-undefined-error.t @@ -22,7 +22,7 @@ set_test_number 2 install_workflow "${TEST_NAME_BASE}" "${TEST_NAME_BASE}" #------------------------------------------------------------------------------- TEST_NAME="${TEST_NAME_BASE}-val" -run_fail "${TEST_NAME}" cylc validate flow.cylc +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERROR__' Jinja2Error: 'UNDEFINED_WHATEVER' is undefined Context lines: diff --git a/tests/functional/validate/50-hyphen-fam.t b/tests/functional/validate/50-hyphen-fam.t index 25be87d6d7e..d74a35a6335 100755 --- a/tests/functional/validate/50-hyphen-fam.t +++ b/tests/functional/validate/50-hyphen-fam.t @@ -30,7 +30,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' inherit = foo __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . cat >'flow.cylc' <<'__FLOW_CONFIG__' [scheduling] @@ -42,5 +42,5 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' inherit = foo __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . exit diff --git a/tests/functional/validate/51-zero-interval.t b/tests/functional/validate/51-zero-interval.t index 846871a9a41..dfa1058ff79 100755 --- a/tests/functional/validate/51-zero-interval.t +++ b/tests/functional/validate/51-zero-interval.t @@ -32,7 +32,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' script = true __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}" cylc validate . cmp_ok "${TEST_NAME_BASE}.stderr" <<'__ERR__' SequenceDegenerateError: R/20100101T0000Z/P0Y, point format CCYYMMDDThhmmZ: equal adjacent points: 20100101T0000Z => 20100101T0000Z. __ERR__ diff --git a/tests/functional/validate/52-null-timeout.t b/tests/functional/validate/52-null-timeout.t index 23c59a01946..cc96daac148 100755 --- a/tests/functional/validate/52-null-timeout.t +++ b/tests/functional/validate/52-null-timeout.t @@ -31,6 +31,6 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' execution timeout = __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . exit diff --git a/tests/functional/validate/54-self-suicide.t b/tests/functional/validate/54-self-suicide.t index 0677acadd42..ce3648f3f13 100755 --- a/tests/functional/validate/54-self-suicide.t +++ b/tests/functional/validate/54-self-suicide.t @@ -38,15 +38,15 @@ run_ok "${TEST_NAME}" cylc validate "${WORKFLOW_NAME}" TEST_NAME=${TEST_NAME_BASE}-graph-check run_ok "${TEST_NAME}" cylc graph --reference "${WORKFLOW_NAME}" cmp_ok "${TEST_NAME}.stdout" <<'__OUT__' -edge "bar.1" "baz.1" -edge "foo.1" "bar.1" -edge "foo.1" "qux.1" -edge "qux.1" "baz.1" +edge "1/bar" "1/baz" +edge "1/foo" "1/bar" +edge "1/foo" "1/qux" +edge "1/qux" "1/baz" graph -node "bar.1" "bar\n1" -node "baz.1" "baz\n1" -node "foo.1" "foo\n1" -node "qux.1" "qux\n1" +node "1/bar" "bar\n1" +node "1/baz" "baz\n1" +node "1/foo" "foo\n1" +node "1/qux" "qux\n1" stop __OUT__ #------------------------------------------------------------------------------- diff --git a/tests/functional/validate/55-hyphen-finish.t b/tests/functional/validate/55-hyphen-finish.t index 9936d544c25..34c390a33e2 100755 --- a/tests/functional/validate/55-hyphen-finish.t +++ b/tests/functional/validate/55-hyphen-finish.t @@ -30,6 +30,6 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' script = true __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . exit diff --git a/tests/functional/validate/56-succeed-sub.t b/tests/functional/validate/56-succeed-sub.t index 40eabf33edd..7ca4503a915 100755 --- a/tests/functional/validate/56-succeed-sub.t +++ b/tests/functional/validate/56-succeed-sub.t @@ -33,6 +33,6 @@ R1 = foo:fail? | (foo? & bar:fail) => something script = true __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . exit diff --git a/tests/functional/validate/57-offset-no-offset.t b/tests/functional/validate/57-offset-no-offset.t index b2679b4c7ec..9f310ba89d7 100755 --- a/tests/functional/validate/57-offset-no-offset.t +++ b/tests/functional/validate/57-offset-no-offset.t @@ -33,6 +33,6 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' script = true __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . exit diff --git a/tests/functional/validate/58-icp-quoted-now.t b/tests/functional/validate/58-icp-quoted-now.t index 69899281d14..7d8a56ef60a 100755 --- a/tests/functional/validate/58-icp-quoted-now.t +++ b/tests/functional/validate/58-icp-quoted-now.t @@ -33,6 +33,6 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' script = true __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}" cylc validate . exit diff --git a/tests/functional/validate/61-include-missing-quote.t b/tests/functional/validate/61-include-missing-quote.t index 690a6152a5f..28301676aef 100755 --- a/tests/functional/validate/61-include-missing-quote.t +++ b/tests/functional/validate/61-include-missing-quote.t @@ -25,7 +25,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' %include 'foo.cylc __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}" cylc validate . cmp_ok "${TEST_NAME_BASE}.stderr" <<__ERR__ FileParseError: mismatched quotes (in $PWD/flow.cylc): %include 'foo.cylc diff --git a/tests/functional/validate/64-circular.t b/tests/functional/validate/64-circular.t index 8775d96c34e..bfbff40c9b9 100755 --- a/tests/functional/validate/64-circular.t +++ b/tests/functional/validate/64-circular.t @@ -28,7 +28,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' R1 = a => a __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-simple-1" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-simple-1" cylc validate . contains_ok "${TEST_NAME_BASE}-simple-1.stderr" <<'__ERR__' WorkflowConfigError: self-edge detected: a:succeeded => a __ERR__ @@ -41,9 +41,9 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' R1 = a => b => c => d => a => z __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-simple-2" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-simple-2" cylc validate . contains_ok "${TEST_NAME_BASE}-simple-2.stderr" <<'__ERR__' -WorkflowConfigError: circular edges detected: d.1 => a.1 a.1 => b.1 b.1 => c.1 c.1 => d.1 +WorkflowConfigError: circular edges detected: 1/d => 1/a 1/a => 1/b 1/b => 1/c 1/c => 1/d __ERR__ cat >'flow.cylc' <<'__FLOW_CONFIG__' @@ -58,7 +58,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' inherit = FAM __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-simple-fam" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-simple-fam" cylc validate . contains_ok "${TEST_NAME_BASE}-simple-fam.stderr" <<'__ERR__' WorkflowConfigError: self-edge detected: f:succeeded => f __ERR__ @@ -77,9 +77,9 @@ a[+P1Y] => a ''' __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-intercycle-1" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-intercycle-1" cylc validate . contains_ok "${TEST_NAME_BASE}-intercycle-1.stderr" <<'__ERR__' -WorkflowConfigError: circular edges detected: a.2002 => a.2001 a.2001 => a.2002 a.2003 => a.2002 a.2002 => a.2003 +WorkflowConfigError: circular edges detected: 2002/a => 2001/a 2001/a => 2002/a 2003/a => 2002/a 2002/a => 2003/a __ERR__ cat >'flow.cylc' <<'__FLOW_CONFIG__' @@ -93,9 +93,9 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' 8/P1 = baz => foo __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-intercycle-2" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-intercycle-2" cylc validate . contains_ok "${TEST_NAME_BASE}-intercycle-2.stderr" <<'__ERR__' -WorkflowConfigError: circular edges detected: foo.8 => bar.8 bar.8 => baz.8 baz.8 => foo.8 +WorkflowConfigError: circular edges detected: 8/foo => 8/bar 8/bar => 8/baz 8/baz => 8/foo __ERR__ cat >'flow.cylc' <<'__FLOW_CONFIG__' @@ -111,9 +111,9 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' """ __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-param-1" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-param-1" cylc validate . contains_ok "${TEST_NAME_BASE}-param-1.stderr" <<'__ERR__' -WorkflowConfigError: circular edges detected: fool_foo2.1 => fool_foo1.1 fool_foo1.1 => fool_foo2.1 +WorkflowConfigError: circular edges detected: 1/fool_foo2 => 1/fool_foo1 1/fool_foo1 => 1/fool_foo2 __ERR__ cat >'flow.cylc' <<'__FLOW_CONFIG__' @@ -127,6 +127,6 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' 2/P3 = bar => foo __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}-param-2" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}-param-2" cylc validate . exit diff --git a/tests/functional/validate/65-bad-task-event-handler-tmpl.t b/tests/functional/validate/65-bad-task-event-handler-tmpl.t index 5b022fc148e..af835eb839e 100755 --- a/tests/functional/validate/65-bad-task-event-handler-tmpl.t +++ b/tests/functional/validate/65-bad-task-event-handler-tmpl.t @@ -31,7 +31,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [[[events]]] failed handlers = echo %(id)s, echo %(rubbish)s __FLOW_CONFIG__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: bad task event handler template t1: echo %(rubbish)s: KeyError('rubbish') __ERR__ @@ -47,7 +47,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [[[events]]] failed handlers = echo %(ids __FLOW_CONFIG__ -run_fail "${TEST_NAME}" cylc validate 'flow.cylc' +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WorkflowConfigError: bad task event handler template t1: echo %(ids: ValueError('incomplete format key') __ERR__ diff --git a/tests/functional/validate/66-fail-consec-spaces.t b/tests/functional/validate/66-fail-consec-spaces.t index f18d06d5f31..17556c0e686 100755 --- a/tests/functional/validate/66-fail-consec-spaces.t +++ b/tests/functional/validate/66-fail-consec-spaces.t @@ -33,7 +33,7 @@ cat > flow.cylc <<__END__ [[[directives]]] -l select=1:ncpus=24:mem=20GB # ERROR! __END__ -run_fail "${TEST_NAME}" cylc validate flow.cylc +run_fail "${TEST_NAME}" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<__END__ IllegalItemError: [runtime][task1][directives]-l select - (consecutive spaces) __END__ diff --git a/tests/functional/validate/67-relative-icp.t b/tests/functional/validate/67-relative-icp.t index f96df1ed74e..f9c9d5d70e3 100755 --- a/tests/functional/validate/67-relative-icp.t +++ b/tests/functional/validate/67-relative-icp.t @@ -34,7 +34,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' script = true __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}" cylc graph --reference 'flow.cylc' -grep_ok "t1.20171231T1200Z" "${TEST_NAME_BASE}.stdout" +run_ok "${TEST_NAME_BASE}" cylc graph --reference . +grep_ok "20171231T1200Z/t1" "${TEST_NAME_BASE}.stdout" exit diff --git a/tests/functional/validate/68-trailing_whitespace.t b/tests/functional/validate/68-trailing_whitespace.t index ca9527e737d..c1709b9a324 100644 --- a/tests/functional/validate/68-trailing_whitespace.t +++ b/tests/functional/validate/68-trailing_whitespace.t @@ -40,14 +40,14 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' """ __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-simple-fail" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-simple-fail" cylc validate . cmp_ok "${TEST_NAME_BASE}-simple-fail.stderr" <<'__ERR__' FileParseError: Syntax error line 9: Whitespace after the line continuation character (\). __ERR__ # Test example with correct syntax sed -i 's/\\ /\\/' 'flow.cylc' -run_ok "${TEST_NAME_BASE}-simple-pass" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}-simple-pass" cylc validate . exit diff --git a/tests/functional/validate/69-bare-clock-xtrigger.t b/tests/functional/validate/69-bare-clock-xtrigger.t index 59b6d05b9a3..4408a064dba 100644 --- a/tests/functional/validate/69-bare-clock-xtrigger.t +++ b/tests/functional/validate/69-bare-clock-xtrigger.t @@ -29,4 +29,4 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' T00 = "@wall_clock => foo" __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}-val" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}-val" cylc validate . diff --git a/tests/functional/validate/70-no-clock-int-cycle.t b/tests/functional/validate/70-no-clock-int-cycle.t index 7fd5d2b10ed..c0e0684ee2c 100644 --- a/tests/functional/validate/70-no-clock-int-cycle.t +++ b/tests/functional/validate/70-no-clock-int-cycle.t @@ -22,16 +22,16 @@ set_test_number 2 cat >'flow.cylc' <<'__FLOW_CONFIG__' [scheduling] - cycling mode = integer - initial cycle point = 1 - final cycle point = 2 - [[xtriggers]] - c1 = wall_clock(offset=P0Y) - [[graph]] - R/^/P1 = "@c1 & foo[-P1] => foo" + cycling mode = integer + initial cycle point = 1 + final cycle point = 2 + [[xtriggers]] + c1 = wall_clock(offset=P0Y) + [[graph]] + R/^/P1 = "@c1 & foo[-P1] => foo" __FLOW_CONFIG__ -run_fail "${TEST_NAME_BASE}-val" cylc validate 'flow.cylc' +run_fail "${TEST_NAME_BASE}-val" cylc validate '.' contains_ok "${TEST_NAME_BASE}-val.stderr" <<'__END__' WorkflowConfigError: Clock xtriggers require datetime cycling: c1 = wall_clock(offset=P0Y) diff --git a/tests/functional/validate/71-task-proxy-sequence-bounds-err.t b/tests/functional/validate/71-task-proxy-sequence-bounds-err.t index 3f36ca88032..06ead10ffab 100755 --- a/tests/functional/validate/71-task-proxy-sequence-bounds-err.t +++ b/tests/functional/validate/71-task-proxy-sequence-bounds-err.t @@ -33,7 +33,7 @@ cat > flow.cylc <<__END__ __END__ TEST_NAME="${TEST_NAME_BASE}-single" -run_ok "$TEST_NAME" cylc validate 'flow.cylc' +run_ok "$TEST_NAME" cylc validate . cmp_ok "${TEST_NAME}.stderr" <<'__ERR__' WARNING - R1/P0Y/19990101T0000Z: sequence out of bounds for initial cycle point 20000101T0000Z __ERR__ @@ -51,7 +51,7 @@ cat > flow.cylc <<__END__ __END__ TEST_NAME="${TEST_NAME_BASE}-multiple" -run_ok "$TEST_NAME" cylc validate 'flow.cylc' +run_ok "$TEST_NAME" cylc validate . contains_ok "${TEST_NAME}.stderr" <<__ERR__ WARNING - multiple sequences out of bounds for initial cycle point 20000101T0000Z: ${LOG_INDENT}R1/P0Y/19960101T0000Z, R1/P0Y/19970101T0000Z, R1/P0Y/19980101T0000Z, diff --git a/tests/functional/validate/73-xtrigger-names.t b/tests/functional/validate/73-xtrigger-names.t index ee0597b59d2..b0244f90988 100644 --- a/tests/functional/validate/73-xtrigger-names.t +++ b/tests/functional/validate/73-xtrigger-names.t @@ -33,7 +33,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [runtime] [[bar]] __FLOW_CONFIG__ -run_ok "${TEST_NAME}-valid" cylc validate flow.cylc +run_ok "${TEST_NAME}-valid" cylc validate . # test an invalid xtrigger cat >'flow.cylc' <<'__FLOW_CONFIG__' @@ -47,7 +47,7 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [[bar]] __FLOW_CONFIG__ -run_fail "${TEST_NAME}-invalid" cylc validate flow.cylc +run_fail "${TEST_NAME}-invalid" cylc validate . grep_ok 'Invalid xtrigger name' "${TEST_NAME}-invalid.stderr" exit diff --git a/tests/functional/validate/74-templatevar-types.t b/tests/functional/validate/74-templatevar-types.t index 29536075f05..215ad1ce316 100644 --- a/tests/functional/validate/74-templatevar-types.t +++ b/tests/functional/validate/74-templatevar-types.t @@ -33,14 +33,14 @@ cat >'flow.cylc' <<'__FLOW_CONFIG__' [[graph]] R1 = foo __FLOW_CONFIG__ -run_fail "${TEST_NAME}-valid" cylc validate flow.cylc -run_fail "${TEST_NAME}-valid" cylc validate flow.cylc -s 'ICP="2000"' -run_ok "${TEST_NAME}-valid" cylc validate flow.cylc -s 'ICP=2000' +run_fail "${TEST_NAME}-valid" cylc validate . +run_fail "${TEST_NAME}-valid" cylc validate . -s 'ICP="2000"' +run_ok "${TEST_NAME}-valid" cylc validate . -s 'ICP=2000' cat >'template' <<'__TEMPLATE__' ICP=2000 __TEMPLATE__ -run_fail "${TEST_NAME}-valid" cylc validate flow.cylc -run_ok "${TEST_NAME}-valid" cylc validate flow.cylc --set-file=template +run_fail "${TEST_NAME}-valid" cylc validate . +run_ok "${TEST_NAME}-valid" cylc validate . --set-file=template exit diff --git a/tests/functional/workflow-host-self-id/00-address/reference.log b/tests/functional/workflow-host-self-id/00-address/reference.log index 136d09102af..7afe901c28f 100644 --- a/tests/functional/workflow-host-self-id/00-address/reference.log +++ b/tests/functional/workflow-host-self-id/00-address/reference.log @@ -1,3 +1,3 @@ -2014-12-02T15:30:32Z INFO - Initial point: 1 -2014-12-02T15:30:32Z INFO - Final point: 1 -2014-12-02T15:30:32Z DEBUG - t1.1 -triggered off [] +Initial point: 1 +Final point: 1 +1/t1 -triggered off [] diff --git a/tests/functional/workflow-state/message/reference.log b/tests/functional/workflow-state/message/reference.log index cfd22eb6553..aba0719327d 100644 --- a/tests/functional/workflow-state/message/reference.log +++ b/tests/functional/workflow-state/message/reference.log @@ -1,4 +1,4 @@ -2017-01-26T12:14:50Z INFO - Initial point: 20100101T0000Z -2017-01-26T12:14:50Z INFO - Final point: None -2017-01-26T12:14:50Z DEBUG - t1.20100101T0000Z -triggered off [] -2017-01-26T12:14:53Z DEBUG - t2.20100101T0000Z -triggered off ['t1.20100101T0000Z'] +Initial point: 20100101T0000Z +Final point: None +20100101T0000Z/t1 -triggered off [] +20100101T0000Z/t2 -triggered off ['20100101T0000Z/t1'] diff --git a/tests/functional/workflow-state/options/reference.log b/tests/functional/workflow-state/options/reference.log index 96a3d7feea5..c4a1a78ce49 100644 --- a/tests/functional/workflow-state/options/reference.log +++ b/tests/functional/workflow-state/options/reference.log @@ -1,8 +1,8 @@ Initial point: 20100101T0000Z Final point: 20100103T0000Z -foo.20100101T0000Z -triggered off ['foo.20091231T0000Z'] -foo.20100102T0000Z -triggered off ['foo.20100101T0000Z'] -foo.20100103T0000Z -triggered off ['foo.20100102T0000Z'] -env_polling.20100102T0000Z -triggered off ['foo.20100102T0000Z'] -offset_polling.20100102T0000Z -triggered off ['foo.20100102T0000Z'] -offset_polling2.20100102T0000Z -triggered off ['foo.20100103T0000Z'] +20100101T0000Z/foo -triggered off ['20091231T0000Z/foo'] +20100102T0000Z/foo -triggered off ['20100101T0000Z/foo'] +20100103T0000Z/foo -triggered off ['20100102T0000Z/foo'] +20100102T0000Z/env_polling -triggered off ['20100102T0000Z/foo'] +20100102T0000Z/offset_polling -triggered off ['20100102T0000Z/foo'] +20100102T0000Z/offset_polling2 -triggered off ['20100103T0000Z/foo'] diff --git a/tests/functional/workflow-state/polling/reference.log b/tests/functional/workflow-state/polling/reference.log index 2412df43150..a06a3c18a42 100644 --- a/tests/functional/workflow-state/polling/reference.log +++ b/tests/functional/workflow-state/polling/reference.log @@ -1,6 +1,6 @@ -2018-10-30T13:14:12+13 INFO - Initial point: 1 -2018-10-30T13:14:12+13 INFO - Final point: 1 -2018-10-30T13:14:12+13 DEBUG - l-good.1 -triggered off [] -2018-10-30T13:14:12+13 DEBUG - lbad.1 -triggered off [] -2018-10-30T13:14:12+13 DEBUG - l-mess.1 -triggered off [] -2018-10-30T13:14:17+13 DEBUG - done.1 -triggered off ['l-mess.1'] +Initial point: 1 +Final point: 1 +1/l-good -triggered off [] +1/lbad -triggered off [] +1/l-mess -triggered off [] +1/done -triggered off ['1/l-mess'] diff --git a/tests/functional/workflow-state/template_ref/reference.log b/tests/functional/workflow-state/template_ref/reference.log index 1d5b623ef56..97101910d54 100644 --- a/tests/functional/workflow-state/template_ref/reference.log +++ b/tests/functional/workflow-state/template_ref/reference.log @@ -1,4 +1,4 @@ -2015-11-02T15:06:04Z INFO - Initial point: 2010 -2015-11-02T15:06:04Z INFO - Final point: 2011 -2015-11-02T15:06:04Z DEBUG - foo.2010 -triggered off [] -2015-11-02T15:06:06Z DEBUG - foo.2011 -triggered off [] +Initial point: 2010 +Final point: 2011 +2010/foo -triggered off [] +2011/foo -triggered off [] diff --git a/tests/functional/xtriggers/02-persistence.t b/tests/functional/xtriggers/02-persistence.t index ee042a5e955..1cc9d18ffee 100644 --- a/tests/functional/xtriggers/02-persistence.t +++ b/tests/functional/xtriggers/02-persistence.t @@ -43,8 +43,8 @@ TEST_NAME="${TEST_NAME_BASE}-run" workflow_run_ok "${TEST_NAME}" cylc play --no-detach --debug "${WORKFLOW_NAME}" # Check the broadcast result of xtrigger. -cylc cat-log "${WORKFLOW_NAME}" 'foo.2010' >'foo.2010.out' -grep_ok 'NAME is bob' 'foo.2010.out' +cylc cat-log "${WORKFLOW_NAME}//2010/foo" >'2010.foo.out' +grep_ok 'NAME is bob' '2010.foo.out' # Replace the xtrigger function with one that will fail if called again. cp "${WORKFLOW_RUN_DIR}/faker_fail.py" 'lib/python/faker.py' @@ -57,7 +57,7 @@ TEST_NAME="${TEST_NAME_BASE}-restart" workflow_run_ok "${TEST_NAME}" cylc play --no-detach "${WORKFLOW_NAME}" # Check the broadcast result has persisted from first run. -cylc cat-log "${WORKFLOW_NAME}" 'foo.2011' >'foo.2011.out' -grep_ok 'NAME is bob' 'foo.2011.out' +cylc cat-log "${WORKFLOW_NAME}//2011/foo" >'2011.foo.out' +grep_ok 'NAME is bob' '2011.foo.out' purge diff --git a/tests/functional/xtriggers/03-sequence.t b/tests/functional/xtriggers/03-sequence.t index e6253179271..f45af9b1caf 100644 --- a/tests/functional/xtriggers/03-sequence.t +++ b/tests/functional/xtriggers/03-sequence.t @@ -44,17 +44,17 @@ init_workflow "${TEST_NAME_BASE}" << '__FLOW_CONFIG__' [[foo]] __FLOW_CONFIG__ -run_ok "${TEST_NAME_BASE}-val" cylc validate 'flow.cylc' +run_ok "${TEST_NAME_BASE}-val" cylc validate "${WORKFLOW_NAME}" # Run workflow; it will stall waiting on the never-satisfied xtriggers. cylc play "${WORKFLOW_NAME}" -poll_grep_workflow_log -E 'start\.2025 .* => succeeded' +poll_grep_workflow_log -E '2025/start .* => succeeded' -cylc show "${WORKFLOW_NAME}" foo.2026 | grep -E '^ - xtrigger' > foo.2026.log +cylc show "${WORKFLOW_NAME}//2026/foo" | grep -E '^ - xtrigger' > 2026.foo.log -# foo.2026 should get only xtrigger e2. -cmp_ok foo.2026.log - <<__END__ +# 2026/foo should get only xtrigger e2. +cmp_ok 2026.foo.log - <<__END__ - xtrigger "e2 = echo(name=alice)" __END__ diff --git a/tests/integration/graphql/test_root.py b/tests/integration/graphql/test_root.py new file mode 100644 index 00000000000..f8afaa277aa --- /dev/null +++ b/tests/integration/graphql/test_root.py @@ -0,0 +1,82 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import pytest + +from cylc.flow.network.client import WorkflowRuntimeClient + + +@pytest.mark.asyncio +@pytest.fixture(scope='module') +async def harness(mod_flow, mod_scheduler, mod_run): + reg = mod_flow({ + 'scheduling': { + 'graph': { + 'R1': ''' + a + b + ''', + }, + }, + 'runtime': { + 'A1': { + 'inherit': 'A2' + }, + 'A2': { + }, + 'a': { + 'inherit': 'A1' + }, + 'b': {}, + }, + }) + schd = mod_scheduler(reg) + async with mod_run(schd): + client = WorkflowRuntimeClient(reg) + + async def _query(query_string): + nonlocal client + return await client.async_request( + 'graphql', + { + 'request_string': 'query { %s } ' % query_string, + } + ) + yield schd, client, _query + + +@pytest.mark.asyncio +async def test_workflows(harness): + """It should return True if running.""" + schd, client, query = harness + ret = await query('workflows(ids: ["%s"]) { id }' % schd.workflow) + assert ret == { + 'workflows': [ + {'id': f'~{schd.owner}/{schd.workflow}'} + ] + } + + +@pytest.mark.asyncio +async def test_jobs(harness): + """It should return True if running.""" + schd, client, query = harness + ret = await query('workflows(ids: ["%s"]) { id }' % schd.workflow) + assert ret == { + 'workflows': [ + {'id': f'~{schd.owner}/{schd.workflow}'} + ] + } diff --git a/tests/integration/test_data_store_mgr.py b/tests/integration/test_data_store_mgr.py index 613b4723830..bb790998f8a 100644 --- a/tests/integration/test_data_store_mgr.py +++ b/tests/integration/test_data_store_mgr.py @@ -17,7 +17,6 @@ import pytest from typing import TYPE_CHECKING -from cylc.flow import ID_DELIM from cylc.flow.data_store_mgr import ( FAMILY_PROXIES, JOBS, @@ -43,7 +42,7 @@ def job_config(schd): return { 'owner': schd.owner, 'submit_num': 3, - 'task_id': 'foo.1', + 'task_id': '1/foo', 'job_runner_name': 'background', 'env-script': None, 'err-script': None, @@ -78,17 +77,14 @@ def job_db_row(): ] -def ext_id(schd): - return ( - f'{schd.owner}{ID_DELIM}{schd.workflow}{ID_DELIM}' - f'1{ID_DELIM}foo{ID_DELIM}3' - ) - - def int_id(_): return '1/foo/03' +def ext_id(schd): + return f'~{schd.owner}/{schd.workflow}//{int_id(None)}' + + @pytest.mark.asyncio @pytest.fixture(scope='module') async def harness(mod_flow, mod_scheduler, mod_run): diff --git a/tests/integration/test_graphql.py b/tests/integration/test_graphql.py new file mode 100644 index 00000000000..bb4c8c7014f --- /dev/null +++ b/tests/integration/test_graphql.py @@ -0,0 +1,358 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""Test the top-level (root) GraphQL queries.""" + +import pytest +from typing import TYPE_CHECKING + +from cylc.flow.id import Tokens +from cylc.flow.network.client import WorkflowRuntimeClient + +if TYPE_CHECKING: + from cylc.flow.scheduler import Scheduler + + +# NOTE: These tests mutate the data store, so running them in isolation may +# see failures when they actually pass if you run the whole file + + +def job_config(schd): + return { + 'owner': schd.owner, + 'submit_num': 1, + 'task_id': '1/foo', + 'job_runner_name': 'background', + 'env-script': None, + 'err-script': None, + 'exit-script': None, + 'execution_time_limit': None, + 'init-script': None, + 'post-script': None, + 'pre-script': None, + 'script': 'sleep 5; echo "I come in peace"', + 'work_d': None, + 'directives': {}, + 'environment': {}, + 'param_var': {}, + 'logfiles': [], + 'platform': {'name': 'platform'}, + } + + +@pytest.fixture +def job_db_row(): + return [ + '1', + 'foo', + 'running', + 4, + '2020-04-03T13:40:18+13:00', + '2020-04-03T13:40:20+13:00', + '2020-04-03T13:40:30+13:00', + 'background', + '20542', + 'localhost', + ] + + +@pytest.mark.asyncio +@pytest.fixture(scope='module') +async def harness(mod_flow, mod_scheduler, mod_run): + flow_def = { + 'scheduler': { + 'allow implicit tasks': True + }, + 'scheduling': { + 'graph': { + 'R1': 'a => b & c => d' + } + }, + 'runtime': { + 'A': { + }, + 'B': { + 'inherit': 'A', + }, + 'b': { + 'inherit': 'B', + }, + }, + } + reg: str = mod_flow(flow_def) + schd: 'Scheduler' = mod_scheduler(reg) + async with mod_run(schd): + client = WorkflowRuntimeClient(reg) + schd.pool.hold_tasks('*') + schd.resume_workflow() + # Think this is needed to save the data state at first start (?) + # Fails without it.. and a test needs to overwrite schd data with this. + # data = schd.data_store_mgr.data[schd.data_store_mgr.workflow_id] + + workflow_tokens = Tokens( + user=schd.owner, + workflow=schd.workflow, + ) + + yield schd, client, workflow_tokens + + +@pytest.mark.asyncio +async def test_workflows(harness): + schd, client, w_tokens = harness + ret = await client.async_request( + 'graphql', + {'request_string': 'query { workflows { id } }'} + ) + assert ret == { + 'workflows': [ + { + 'id': f'{w_tokens}' + } + ] + } + + +@pytest.mark.asyncio +async def test_tasks(harness): + schd, client, w_tokens = harness + + # query "tasks" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { tasks { id } }'} + ) + ids = [ + w_tokens.duplicate(cycle=f'$namespace|{namespace}').id + for namespace in ('a', 'b', 'c', 'd') + ] + ret['tasks'].sort(key=lambda x: x['id']) + assert ret == { + 'tasks': [ + {'id': id_} + for id_ in ids + ] + } + + # query "task" + for id_ in ids: + ret = await client.async_request( + 'graphql', + {'request_string': 'query { task(id: "%s") { id } }' % id_} + ) + assert ret == { + 'task': {'id': id_} + } + + +@pytest.mark.asyncio +async def test_families(harness): + schd, client, w_tokens = harness + + # query "tasks" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { families { id } }'} + ) + ids = [ + w_tokens.duplicate( + cycle=f'$namespace|{namespace}' + ).id + for namespace in ('A', 'B', 'root') + ] + ret['families'].sort(key=lambda x: x['id']) + assert ret == { + 'families': [ + {'id': id_} + for id_ in ids + ] + } + + # query "task" + for id_ in ids: + ret = await client.async_request( + 'graphql', + {'request_string': 'query { family(id: "%s") { id } }' % id_} + ) + assert ret == { + 'family': {'id': id_} + } + + +@pytest.mark.asyncio +async def test_task_proxies(harness): + schd, client, w_tokens = harness + + # query "tasks" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { taskProxies { id } }'} + ) + ids = [ + w_tokens.duplicate( + cycle='1', + task=namespace, + ).id + # NOTE: task "d" is not in the n=1 window yet + for namespace in ('a', 'b', 'c') + ] + ret['taskProxies'].sort(key=lambda x: x['id']) + assert ret == { + 'taskProxies': [ + {'id': id_} + for id_ in ids + ] + } + + # query "task" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { taskProxy(id: "%s") { id } }' % ids[0]} + ) + assert ret == { + 'taskProxy': {'id': ids[0]} + } + + +@pytest.mark.asyncio +async def test_family_proxies(harness): + schd, client, w_tokens = harness + + # query "familys" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { familyProxies { id } }'} + ) + ids = [ + w_tokens.duplicate( + cycle='1', + task=namespace, + ).id + # NOTE: family "d" is not in the n=1 window yet + for namespace in ('A', 'B', 'root') + ] + ret['familyProxies'].sort(key=lambda x: x['id']) + assert ret == { + 'familyProxies': [ + {'id': id_} + for id_ in ids + ] + } + + # query "family" + for id_ in ids: + ret = await client.async_request( + 'graphql', + {'request_string': 'query { familyProxy(id: "%s") { id } }' % id_} + ) + assert ret == { + 'familyProxy': {'id': id_} + } + + +@pytest.mark.asyncio +async def test_edges(harness): + schd, client, w_tokens = harness + + t_tokens = [ + w_tokens.duplicate( + cycle='1', + task=namespace, + ) + # NOTE: task "d" is not in the n=1 window yet + for namespace in ('a', 'b', 'c') + ] + edges = [ + (t_tokens[0], t_tokens[1]), + (t_tokens[0], t_tokens[2]), + ] + e_ids = sorted([ + w_tokens.duplicate( + cycle=( + '$edge' + f'|{left.relative_id}' + f'|{right.relative_id}' + ) + ).id + for left, right in edges + ]) + + # query "edges" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { edges { id } }'} + ) + assert ret == { + 'edges': [ + {'id': id_} + for id_ in e_ids + ] + } + + # query "nodesEdges" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { nodesEdges { nodes {id}\nedges {id} } }'} + ) + ret['nodesEdges']['nodes'].sort(key=lambda x: x['id']) + ret['nodesEdges']['edges'].sort(key=lambda x: x['id']) + assert ret == { + 'nodesEdges': { + 'nodes': [ + {'id': tokens.id} + for tokens in t_tokens + ], + 'edges': [ + {'id': id_} + for id_ in e_ids + ], + }, + } + + +@pytest.mark.asyncio +async def test_jobs(harness): + schd, client, w_tokens = harness + + # add a job + schd.data_store_mgr.insert_job('a', '1', 'submitted', job_config(schd)) + schd.data_store_mgr.update_data_structure() + j_tokens = w_tokens.duplicate( + cycle='1', + task='a', + job='01', + ) + j_id = j_tokens.id + + # query "jobs" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { jobs { id } }'} + ) + assert ret == { + 'jobs': [ + {'id': f'{j_id}'} + ] + } + + # query "job" + ret = await client.async_request( + 'graphql', + {'request_string': 'query { job(id: "%s") { id } }' % j_id} + ) + assert ret == { + 'job': {'id': f'{j_id}'} + } diff --git a/tests/integration/test_id_cli.py b/tests/integration/test_id_cli.py new file mode 100644 index 00000000000..7d18275b7ba --- /dev/null +++ b/tests/integration/test_id_cli.py @@ -0,0 +1,112 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""Some integration tests running on live workflows to test filtering properly. +""" + +import pytest + +from cylc.flow.pathutil import get_cylc_run_dir +from cylc.flow.id_cli import parse_ids_async + + +@pytest.fixture(scope='module') +async def harness( + mod_run, + mod_scheduler, + mod_flow, + mod_one_conf, + mod_test_dir, +): + """Create three workflows, two running, one stopped.""" + reg_prefix = mod_test_dir.relative_to(get_cylc_run_dir()) + # abc:running + reg1 = mod_flow(mod_one_conf, name='abc') + schd1 = mod_scheduler(reg1) + # def:running + reg2 = mod_flow(mod_one_conf, name='def') + schd2 = mod_scheduler(reg2) + # ghi:stopped + reg3 = mod_flow(mod_one_conf, name='ghi') + async with mod_run(schd1): + async with mod_run(schd2): + yield reg_prefix, reg1, reg2, reg3 + + +@pytest.mark.asyncio +async def test_glob_wildcard(harness): + """It should search for workflows using globs.""" + reg_prefix, reg1, reg2, reg3 = harness + # '*' should return all workflows + workflows, _ = await parse_ids_async( + f'{reg_prefix / "*"}', + constraint='workflows', + match_workflows=True, + ) + assert sorted(workflows) == sorted([reg1, reg2]) + workflows, _ = await parse_ids_async( + f'{reg_prefix / "z*"}', + constraint='workflows', + match_workflows=True, + ) + assert sorted(workflows) == sorted([]) + + +@pytest.mark.asyncio +async def test_glob_pattern(harness): + """It should support fnmatch syntax including square brackets.""" + # [a]* should match workflows starting with "a" + reg_prefix, reg1, reg2, reg3 = harness + workflows, _ = await parse_ids_async( + f'{reg_prefix / "[a]*"}', + constraint='workflows', + match_workflows=True, + ) + assert sorted(workflows) == sorted([reg1]) + workflows, _ = await parse_ids_async( + f'{reg_prefix / "[z]*"}', + constraint='workflows', + match_workflows=True, + ) + assert sorted(workflows) == sorted([]) + + +@pytest.mark.asyncio +async def test_state_filter(harness): + """It should filter by workflow state.""" + reg_prefix, reg1, reg2, reg3 = harness + # '*' should return all workflows + workflows, _ = await parse_ids_async( + f'{reg_prefix / "*"}', + constraint='workflows', + match_workflows=True, + match_active=None, + ) + assert sorted(workflows) == sorted([reg1, reg2, reg3]) + workflows, _ = await parse_ids_async( + f'{reg_prefix / "*"}', + constraint='workflows', + match_workflows=True, + match_active=True, + ) + assert sorted(workflows) == sorted([reg1, reg2]) + workflows, _ = await parse_ids_async( + f'{reg_prefix / "*"}', + constraint='workflows', + match_workflows=True, + match_active=False, + ) + assert sorted(workflows) == sorted([reg3]) diff --git a/tests/integration/test_resolvers.py b/tests/integration/test_resolvers.py index 7da75d865b2..82eb4ecd8d5 100644 --- a/tests/integration/test_resolvers.py +++ b/tests/integration/test_resolvers.py @@ -18,9 +18,9 @@ import pytest from unittest.mock import Mock -from cylc.flow.data_store_mgr import ID_DELIM, EDGES, TASK_PROXIES +from cylc.flow.data_store_mgr import EDGES, TASK_PROXIES +from cylc.flow.id import Tokens from cylc.flow.network.resolvers import Resolvers -from cylc.flow.network.schema import parse_node_id from cylc.flow.scheduler import Scheduler @@ -96,7 +96,11 @@ async def mock_flow( @pytest.mark.asyncio async def test_get_workflows(mock_flow, flow_args): """Test method returning workflow messages satisfying filter args.""" - flow_args['workflows'].append((mock_flow.owner, mock_flow.name, None)) + flow_args['workflows'].append({ + 'user': mock_flow.owner, + 'workflow': mock_flow.name, + 'workflow_sel': None, + }) flow_msgs = await mock_flow.resolvers.get_workflows(flow_args) assert len(flow_msgs) == 1 @@ -105,13 +109,17 @@ async def test_get_workflows(mock_flow, flow_args): async def test_get_nodes_all(mock_flow, node_args): """Test method returning workflow(s) node message satisfying filter args. """ - node_args['workflows'].append((mock_flow.owner, mock_flow.name, None)) + node_args['workflows'].append({ + 'user': mock_flow.owner, + 'workflow': mock_flow.name, + 'workflow_sel': None, + }) node_args['states'].append('failed') nodes = await mock_flow.resolvers.get_nodes_all(TASK_PROXIES, node_args) assert len(nodes) == 0 node_args['ghosts'] = True node_args['states'] = [] - node_args['ids'].append(parse_node_id(mock_flow.node_ids[0], TASK_PROXIES)) + node_args['ids'].append(Tokens(mock_flow.node_ids[0])) nodes = [ n for n in await mock_flow.resolvers.get_nodes_all( TASK_PROXIES, node_args) @@ -124,7 +132,11 @@ async def test_get_nodes_all(mock_flow, node_args): async def test_get_nodes_by_ids(mock_flow, node_args): """Test method returning workflow(s) node messages who's ID is a match to any given.""" - node_args['workflows'].append((mock_flow.owner, mock_flow.name, None)) + node_args['workflows'].append({ + 'user': mock_flow.owner, + 'workflow': mock_flow.name, + 'workflow_sel': None + }) nodes = await mock_flow.resolvers.get_nodes_by_ids(TASK_PROXIES, node_args) assert len(nodes) == 0 @@ -144,8 +156,17 @@ async def test_get_nodes_by_ids(mock_flow, node_args): async def test_get_node_by_id(mock_flow, node_args): """Test method returning a workflow node message who's ID is a match to that given.""" - node_args['id'] = f'me{ID_DELIM}mine{ID_DELIM}20500808T00{ID_DELIM}jin' - node_args['workflows'].append((mock_flow.owner, mock_flow.name, None)) + node_args['id'] = Tokens( + user='me', + workflow='mine', + cycle='20500808T00', + task='jin', + ).id + node_args['workflows'].append({ + 'user': mock_flow.owner, + 'workflow': mock_flow.name, + 'workflow_sel': None + }) node = await mock_flow.resolvers.get_node_by_id(TASK_PROXIES, node_args) assert node is None node_args['id'] = mock_flow.node_ids[0] @@ -182,7 +203,11 @@ async def test_get_edges_by_ids(mock_flow, node_args): @pytest.mark.asyncio async def test_mutator(mock_flow, flow_args): """Test the mutation method.""" - flow_args['workflows'].append((mock_flow.owner, mock_flow.name, None)) + flow_args['workflows'].append({ + 'user': mock_flow.owner, + 'workflow': mock_flow.name, + 'workflow_sel': None + }) args = {} response = await mock_flow.resolvers.mutator( None, @@ -196,8 +221,12 @@ async def test_mutator(mock_flow, flow_args): @pytest.mark.asyncio async def test_nodes_mutator(mock_flow, flow_args): """Test the nodes mutation method.""" - flow_args['workflows'].append((mock_flow.owner, mock_flow.name, None)) - ids = [parse_node_id(n, TASK_PROXIES) for n in mock_flow.node_ids] + flow_args['workflows'].append({ + 'user': mock_flow.owner, + 'workflow': mock_flow.name, + 'workflow_sel': None, + }) + ids = [Tokens(n) for n in mock_flow.node_ids] response = await mock_flow.resolvers.nodes_mutator( None, 'force_trigger_tasks', ids, flow_args, {"reflow": False, "flow_descr": ""} diff --git a/tests/integration/test_task_pool.py b/tests/integration/test_task_pool.py index 32d0865f346..792114a845c 100644 --- a/tests/integration/test_task_pool.py +++ b/tests/integration/test_task_pool.py @@ -38,7 +38,7 @@ 'runahead limit': 'P4', 'graph': { 'P1': 'foo & bar', - 'R1/2': 'foo[1] => pub' # pub.2 doesn't spawn at start + 'R1/2': 'foo[1] => pub' # 2/pub doesn't spawn at start } }, 'runtime': { @@ -53,7 +53,7 @@ def get_task_ids( ) -> List[str]: """Helper function to return sorted task identities ("{name}.{point}") from a list of (name, point) tuples.""" - return sorted(f'{name}.{point}' for name, point in name_point_list) + return sorted(f'{point}/{name}' for name, point in name_point_list) def assert_expected_log( @@ -119,47 +119,47 @@ async def example_flow( 'items, expected_task_ids, expected_bad_items, expected_warnings', [ param( - ['foo'], ['foo.1', 'foo.2', 'foo.3', 'foo.4', 'foo.5'], [], [], + ['*/foo'], ['1/foo', '2/foo', '3/foo', '4/foo', '5/foo'], [], [], id="Basic" ), param( - ['*.1'], - ['foo.1', 'bar.1'], [], [], + ['1/*'], + ['1/foo', '1/bar'], [], [], id="Name glob" ), param( - ['FAM.1'], ['bar.1'], [], [], + ['1/FAM'], ['1/bar'], [], [], id="Family name" ), param( - ['foo.*'], ['foo.1', 'foo.2', 'foo.3', 'foo.4', 'foo.5'], [], [], + ['*/foo'], ['1/foo', '2/foo', '3/foo', '4/foo', '5/foo'], [], [], id="Point glob" ), param( ['*:waiting'], - ['foo.1', 'bar.1', 'foo.2', 'bar.2', 'foo.3', 'bar.3', 'foo.4', - 'bar.4', 'foo.5', 'bar.5'], [], [], + ['1/foo', '1/bar', '2/foo', '2/bar', '3/foo', '3/bar', '4/foo', + '4/bar', '5/foo', '5/bar'], [], [], id="Task state" ), param( - ['foo.8'], [], ['foo.8'], ["No active tasks matching: foo.8"], + ['8/foo'], [], ['8/foo'], ["No active tasks matching: 8/foo"], id="Task not yet spawned" ), param( - ['foo.1', 'bar.8'], ['foo.1'], ['bar.8'], - ["No active tasks matching: bar.8"], + ['1/foo', '8/bar'], ['1/foo'], ['8/bar'], + ["No active tasks matching: 8/bar"], id="Multiple items" ), param( - ['grogu.1', 'grogu.*'], [], ['grogu.1', 'grogu.*'], - ["No active tasks matching: grogu.1", - "No active tasks matching: grogu.*"], + ['1/grogu', '*/grogu'], [], ['1/grogu', '*/grogu'], + ["No active tasks matching: 1/grogu", + "No active tasks matching: */grogu"], id="No such task" ), param( - [], - ['foo.1', 'bar.1', 'foo.2', 'bar.2', 'foo.3', 'bar.3', 'foo.4', - 'bar.4', 'foo.5', 'bar.5'], [], [], + ['*'], + ['1/foo', '1/bar', '2/foo', '2/bar', '3/foo', '3/bar', '4/foo', + '4/bar', '5/foo', '5/bar'], [], [], id="No items given - get all tasks" ) ] @@ -180,13 +180,13 @@ async def test_filter_task_proxies( Params: items: Arg passed to filter_task_proxies(). expected_task_ids: IDs of the TaskProxys that are expected to be - returned, of the form "{name}.{point}". + returned, of the form "{point}/{name}"/ expected_bad_items: Expected to be returned. expected_warnings: Expected to be logged. """ caplog.set_level(logging.WARNING, CYLC_LOG) task_pool = mod_example_flow.pool - itasks, bad_items = task_pool.filter_task_proxies(items) + itasks, _, bad_items = task_pool.filter_task_proxies(items) task_ids = [itask.identity for itask in itasks] assert sorted(task_ids) == sorted(expected_task_ids) assert sorted(bad_items) == sorted(expected_bad_items) @@ -198,42 +198,38 @@ async def test_filter_task_proxies( 'items, expected_task_ids, expected_warnings', [ param( - ['foo.4'], ['foo.4'], [], + ['4/foo'], ['4/foo'], [], id="Basic" ), param( - ['foo'], [], ["foo - task to spawn must have a cycle point"], - id="No cycle point given" - ), - param( - ['*.2'], ['foo.2', 'bar.2', 'pub.2'], [], + ['2/*'], ['2/foo', '2/bar', '2/pub'], [], id="Name glob" ), param( - ['FAM.2'], ['bar.2'], [], + ['2/FAM'], ['2/bar'], [], id="Family name" ), param( - ['foo.*'], [], ["No matching tasks found: foo.*"], + ['*/foo'], [], ["No matching tasks found: */foo"], id="Point glob not allowed" ), param( - ['grogu.1'], [], ["No matching tasks found: grogu.1"], + ['1/grogu'], [], ["No matching tasks found: 1/grogu"], id="No such task" ), param( - ['foo.4', 'bar.2', 'grogu.1'], ['foo.4', 'bar.2'], - ["No matching tasks found: grogu.1"], + ['4/foo', '2/bar', '1/grogu'], ['4/foo', '2/bar'], + ["No matching tasks found: 1/grogu"], id="Multiple items" ), param( - ['foo.20', 'pub.1'], [], + ['20/foo', '1/pub'], [], ["Invalid cycle point for task: foo, 20", "Invalid cycle point for task: pub, 1"], id="Task not in graph at given cycle point" ), param( - ['foo.1:badger'], ['foo.1'], [], + ['1/foo:badger'], ['1/foo'], [], id="Task state is ignored" ), param([], [], [], id="No items given") @@ -254,7 +250,7 @@ async def test_match_taskdefs( items: Arg passed to match_taskdefs(). ignore_state: Arg passed to match_taskdefs(). expected_task_ids: Expected IDs of the tasks in the dict that gets - returned, of the form "{name}.{point}". + returned, of the form "{point}/{name}". expected_warnings: Expected to be logged. """ caplog.set_level(logging.WARNING, CYLC_LOG) @@ -272,37 +268,31 @@ async def test_match_taskdefs( 'items, expected_tasks_to_hold_ids, expected_warnings', [ param( - ['foo.1', 'foo.2'], ['foo.1', 'foo.2'], [], + ['1/foo', '2/foo'], ['1/foo', '2/foo'], [], id="Active & future tasks" ), param( - ['*.1', '*.2'], ['foo.1', 'bar.1'], - ["No active tasks matching: *.2"], + ['1/*', '2/*'], ['1/foo', '1/bar'], + ["No active tasks matching: 2/*"], id="Name globs hold active tasks only" ), param( - ['FAM.1', 'FAM.2'], ['bar.1'], - ["No active tasks in the family 'FAM' matching: FAM.2"], + ['1/FAM', '2/FAM'], ['1/bar'], + ["No active tasks in the family 'FAM' matching: 2/FAM"], id="Family names hold active tasks only" ), param( - ['foo.*', 'bar', 'pub', 'grogu.*'], ['foo.1', 'bar.1'], - ["No active instances of task: pub", - "No active tasks matching: grogu.*"], - id="Point globs/point omitted hold active tasks only" - ), - param( - ['grogu.1', 'foo.H', 'foo.20', 'pub.1'], [], + ['1/grogu', 'H/foo', '20/foo', '1/pub'], [], ["No matching tasks found: grogu", - "foo.H - invalid cycle point: H", + "H/foo - invalid cycle point: H", "Invalid cycle point for task: foo, 20", "Invalid cycle point for task: pub, 1"], id="Non-existent task name or invalid cycle point" ), param( - ['foo:waiting', 'foo.1:failed', 'bar.2:waiting'], ['foo.1'], - ["No active tasks matching: foo.1:failed", - "No active tasks matching: bar.2:waiting"], + ['1/foo:waiting', '1/foo:failed', '2/bar:waiting'], ['1/foo'], + ["No active tasks matching: 1/foo:failed", + "No active tasks matching: 2/bar:waiting"], id="Specifying task state works for active tasks, not future tasks" ) ] @@ -322,7 +312,7 @@ async def test_hold_tasks( Params: items: Arg passed to hold_tasks(). expected_tasks_to_hold_ids: Expected IDs of the tasks that get put in - the TaskPool.tasks_to_hold set, of the form "{name}.{point}". + the TaskPool.tasks_to_hold set, of the form "{point}/{name}"/ expected_warnings: Expected to be logged. """ expected_tasks_to_hold_ids = sorted(expected_tasks_to_hold_ids) @@ -349,8 +339,8 @@ async def test_release_held_tasks( ) -> None: """Test TaskPool.release_held_tasks(). - For a workflow with held active tasks foo.1 & bar.1, and held future task - pub.2. + For a workflow with held active tasks 1/foo & 1/bar, and held future task + 2/pub. We skip testing the matching logic here because it would be slow using the function-scoped example_flow fixture, and it would repeat what is covered @@ -358,21 +348,21 @@ async def test_release_held_tasks( """ # Setup task_pool = example_flow.pool - task_pool.hold_tasks(['foo.1', 'bar.1', 'pub.2']) + task_pool.hold_tasks(['1/foo', '1/bar', '2/pub']) for itask in task_pool.get_all_tasks(): assert itask.state.is_held is True - expected_tasks_to_hold_ids = sorted(['foo.1', 'bar.1', 'pub.2']) + expected_tasks_to_hold_ids = sorted(['1/foo', '1/bar', '2/pub']) assert get_task_ids(task_pool.tasks_to_hold) == expected_tasks_to_hold_ids db_tasks_to_hold = db_select(example_flow, True, 'tasks_to_hold') assert get_task_ids(db_tasks_to_hold) == expected_tasks_to_hold_ids # Test - task_pool.release_held_tasks(['foo.1', 'pub.2']) + task_pool.release_held_tasks(['1/foo', '2/pub']) for itask in task_pool.get_all_tasks(): - hold_expected = itask.identity == 'bar.1' + hold_expected = itask.identity == '1/bar' assert itask.state.is_held is hold_expected - expected_tasks_to_hold_ids = sorted(['bar.1']) + expected_tasks_to_hold_ids = sorted(['1/bar']) assert get_task_ids(task_pool.tasks_to_hold) == expected_tasks_to_hold_ids db_tasks_to_hold = db_select(example_flow, True, 'tasks_to_hold') @@ -383,7 +373,7 @@ async def test_release_held_tasks( @pytest.mark.parametrize( 'hold_after_point, expected_held_task_ids', [ - (0, ['foo.1', 'bar.1']), + (0, ['1/foo', '1/bar']), (1, []) ] ) diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index dff78510c68..f7d398cc637 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -29,7 +29,11 @@ ) from cylc.flow.data_store_mgr import DataStoreMgr from cylc.flow.scheduler import Scheduler -from cylc.flow.workflow_files import WorkflowFiles +from cylc.flow.workflow_files import ( + WorkflowFiles, + link_runN, + unlink_runN, +) from cylc.flow.xtrigger_mgr import XtriggerManager @@ -57,11 +61,11 @@ def _monkeymock(pypath: str, **kwargs: Any) -> Mock: return _monkeymock -def tmp_run_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): +def _tmp_run_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): """Fixture that patches the cylc-run dir to the tests's {tmp_path}/cylc-run, and optionally creates a workflow run dir inside. - (Actually the fixture is below, this is the re-usable meat of it.) + Adds the runN symlink automatically if the workflow ID ends with /run__. Args: reg: Workflow name. @@ -81,6 +85,8 @@ def _tmp_run_dir( installed: bool = False, named: bool = False ) -> Path: + nonlocal tmp_path + nonlocal monkeypatch cylc_run_dir = tmp_path / 'cylc-run' cylc_run_dir.mkdir(exist_ok=True) monkeypatch.setattr('cylc.flow.pathutil._CYLC_RUN_DIR', cylc_run_dir) @@ -89,6 +95,9 @@ def _tmp_run_dir( run_dir.mkdir(parents=True, exist_ok=True) (run_dir / WorkflowFiles.FLOW_FILE).touch(exist_ok=True) (run_dir / WorkflowFiles.Service.DIRNAME).mkdir(exist_ok=True) + if run_dir.name.startswith('run'): + unlink_runN(run_dir.parent) + link_runN(run_dir) if installed: if named: if len(Path(reg).parts) < 2: @@ -104,10 +113,9 @@ def _tmp_run_dir( return _tmp_run_dir -@pytest.fixture(name='tmp_run_dir') -def tmp_run_dir_fixture(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): - # This is the actual tmp_run_dir fixture - return tmp_run_dir(tmp_path, monkeypatch) +@pytest.fixture +def tmp_run_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): + return _tmp_run_dir(tmp_path, monkeypatch) @pytest.fixture(scope='module') @@ -115,7 +123,7 @@ def mod_tmp_run_dir(tmp_path_factory: pytest.TempPathFactory): """Module-scoped version of tmp_run_dir()""" tmp_path = tmp_path_factory.getbasetemp() with pytest.MonkeyPatch.context() as mp: - return tmp_run_dir(tmp_path, mp) + return _tmp_run_dir(tmp_path, mp) def tmp_src_dir(tmp_path: Path): diff --git a/tests/unit/job_runner_handlers/test_loadleveler.py b/tests/unit/job_runner_handlers/test_loadleveler.py index 1f84c1c286b..9c9c1402dda 100644 --- a/tests/unit/job_runner_handlers/test_loadleveler.py +++ b/tests/unit/job_runner_handlers/test_loadleveler.py @@ -29,7 +29,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '# @ job_name = chop.axe.1', @@ -50,7 +50,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '# @ job_name = chop.axe.1', diff --git a/tests/unit/job_runner_handlers/test_lsf.py b/tests/unit/job_runner_handlers/test_lsf.py index dc6b2057b1a..df20a146a98 100644 --- a/tests/unit/job_runner_handlers/test_lsf.py +++ b/tests/unit/job_runner_handlers/test_lsf.py @@ -28,7 +28,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#BSUB -J axe.1.chop', @@ -47,7 +47,7 @@ 'execution_time_limit': 200, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#BSUB -J axe.1.chop', diff --git a/tests/unit/job_runner_handlers/test_moab.py b/tests/unit/job_runner_handlers/test_moab.py index db6098d29b9..e54e03c7914 100644 --- a/tests/unit/job_runner_handlers/test_moab.py +++ b/tests/unit/job_runner_handlers/test_moab.py @@ -28,7 +28,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#PBS -N axe.1.chop', @@ -47,7 +47,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#PBS -N axe.1.chop', diff --git a/tests/unit/job_runner_handlers/test_pbs.py b/tests/unit/job_runner_handlers/test_pbs.py index 00fdd2c9959..0c65e6192f2 100644 --- a/tests/unit/job_runner_handlers/test_pbs.py +++ b/tests/unit/job_runner_handlers/test_pbs.py @@ -28,7 +28,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', 'platform': { 'job runner': 'pbs', 'job name length maximum': 100 @@ -47,7 +47,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', 'platform': { 'job runner': 'pbs', 'job name length maximum': 6 @@ -70,7 +70,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', 'platform': { 'job runner': 'pbs', 'job name length maximum': 100 diff --git a/tests/unit/job_runner_handlers/test_slurm.py b/tests/unit/job_runner_handlers/test_slurm.py index a4544bae7e2..3ba22fee358 100644 --- a/tests/unit/job_runner_handlers/test_slurm.py +++ b/tests/unit/job_runner_handlers/test_slurm.py @@ -28,7 +28,7 @@ 'execution_time_limit': 180, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#SBATCH --job-name=axe.1.chop', @@ -51,7 +51,7 @@ 'cylc-run/chop/log/job/1/axe%40HEAD/01/job' ), 'workflow_name': 'chop', - 'task_id': 'axe%40HEAD.1', + 'task_id': '1/axe%40HEAD', }, [ '#SBATCH --job-name=axe%40HEAD.1.chop', @@ -76,7 +76,7 @@ 'execution_time_limit': 200, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#SBATCH --job-name=axe.1.chop', @@ -104,7 +104,7 @@ 'execution_time_limit': 200, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#SBATCH --job-name=axe.1.chop', diff --git a/tests/unit/job_runner_handlers/test_slurm_packjob.py b/tests/unit/job_runner_handlers/test_slurm_packjob.py index 17c0cfc1e42..d59764a0dd1 100644 --- a/tests/unit/job_runner_handlers/test_slurm_packjob.py +++ b/tests/unit/job_runner_handlers/test_slurm_packjob.py @@ -33,7 +33,7 @@ 'execution_time_limit': 200, 'job_file_path': 'cylc-run/chop/log/job/1/axe/01/job', 'workflow_name': 'chop', - 'task_id': 'axe.1', + 'task_id': '1/axe', }, [ '#SBATCH --job-name=axe.1.chop', diff --git a/tests/unit/scripts/test_clean.py b/tests/unit/scripts/test_clean.py new file mode 100644 index 00000000000..ee8fdf1b17c --- /dev/null +++ b/tests/unit/scripts/test_clean.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from types import SimpleNamespace + +import pytest + +from cylc.flow.scripts.clean import scan, run + + +@pytest.mark.asyncio +async def test_scan(tmp_run_dir): + """It should scan the filesystem to expand partial IDs.""" + # regular workflows pass straight through + tmp_run_dir('foo') + workflows, multi_mode = await scan(['foo'], False) + assert workflows == ['foo'] + assert multi_mode is False + + # hierarchies, however, get expanded + tmp_run_dir('bar/run1') + workflows, multi_mode = await scan(['bar'], False) + assert workflows == ['bar/run1'] + assert multi_mode is True # because an expansion has happened + + tmp_run_dir('bar/run2') + workflows, multi_mode = await scan(['bar'], False) + assert workflows == ['bar/run1', 'bar/run2'] + assert multi_mode is True + + +@pytest.fixture +def mute(monkeypatch): + """Stop cylc clean from doing anything and log all init_clean calls.""" + items = [] + + def _clean(id_, *_): + nonlocal items + items.append(id_) + + monkeypatch.setattr('cylc.flow.scripts.clean.init_clean', _clean) + monkeypatch.setattr('cylc.flow.scripts.clean.prompt', lambda x: None) + + return items + + +@pytest.mark.asyncio +async def test_multi(tmp_run_dir, mute): + """It supports cleaning multiple workflows.""" + # cli opts + opts = SimpleNamespace() + opts.force = False + + # create three dummy workflows + tmp_run_dir('bar/pub/beer') + tmp_run_dir('baz/run1') + tmp_run_dir('foo') + + # an explicit workflow ID goes straight through + mute[:] = [] + await run('foo', opts=opts) + assert mute == ['foo'] + + # a partial hierarchical ID gets expanded to all workflows contained + # in the hierarchy (note runs are a special case of hierarchical ID) + mute[:] = [] + await run('bar', opts=opts) + assert mute == ['bar/pub/beer'] + + # test a mixture of explicit and partial IDs + mute[:] = [] + await run('bar', 'baz', 'foo', opts=opts) + assert mute == ['bar/pub/beer', 'baz/run1', 'foo'] + + # test a glob + mute[:] = [] + await run('*', opts=opts) + assert mute == ['bar/pub/beer', 'baz/run1', 'foo'] diff --git a/tests/unit/scripts/test_hold.py b/tests/unit/scripts/test_hold.py index f4456f77531..51c5bdbe652 100644 --- a/tests/unit/scripts/test_hold.py +++ b/tests/unit/scripts/test_hold.py @@ -33,10 +33,16 @@ [ (Opts(), ['*'], None), (Opts(hold_point_string='2'), [], None), - (Opts(hold_point_string='2'), ['*'], - (UserInputError, "Cannot combine --after with TASK_GLOB")), - (Opts(), [], - (UserInputError, "Missing arguments: TASK_GLOB")), + ( + Opts(hold_point_string='2'), + ['*'], + (UserInputError, "Cannot combine --after with Cylc/Task ID") + ), + ( + Opts(), + [], + (UserInputError, "Must define Cycles/Tasks") + ), ] ) def test_validate( diff --git a/tests/unit/scripts/test_release.py b/tests/unit/scripts/test_release.py index 860b3dd4f26..9880dc98959 100644 --- a/tests/unit/scripts/test_release.py +++ b/tests/unit/scripts/test_release.py @@ -33,10 +33,16 @@ [ (Opts(), ['*'], None), (Opts(release_all=True), [], None), - (Opts(release_all=True), ['*'], - (UserInputError, "Cannot combine --all with TASK_GLOB")), - (Opts(), [], - (UserInputError, "Missing arguments: TASK_GLOB")), + ( + Opts(release_all=True), + ['*'], + (UserInputError, "Cannot combine --all with Cycle/Task IDs") + ), + ( + Opts(), + [], + (UserInputError, "Must define Cycles/Tasks") + ), ] ) def test_validate( diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index 1459b3716fa..d9b5eaf6a57 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -411,13 +411,13 @@ def test_process_icp( ), ( None, - ['foo.20090802T0615+0530', 'bar.20090802T0515+0530'], + ['20090802T0615+0530/foo', '20090802T0515+0530/bar'], '20090802T0515+0530', None ), ( '20210120T1700+0530', - ['foo.20090802T0615+0530'], + ['20090802T0615+0530/foo'], None, ( UserInputError, diff --git a/tests/unit/test_data_store_mgr.py b/tests/unit/test_data_store_mgr.py index 04a0a173aa9..d9472812d62 100644 --- a/tests/unit/test_data_store_mgr.py +++ b/tests/unit/test_data_store_mgr.py @@ -19,7 +19,6 @@ from cylc.flow.data_store_mgr import ( task_mean_elapsed_time, - parse_job_item, apply_delta, WORKFLOW, DELTAS_MAP, @@ -42,23 +41,6 @@ def test_task_mean_elapsed_time(): assert result == 5.0 -def test_parse_job_item(): - """Test internal id parsing method.""" - point, name, sub_num = parse_job_item(int_id()) - tpoint, tname, tsub_num = int_id().split('/', 2) - assert (point, name, sub_num) == (tpoint, tname, int(tsub_num)) - tpoint, tname, tsub_num = parse_job_item(f'{point}/{name}') - assert name, None == (point, (tpoint, tname, tsub_num)) - tpoint, tname, tsub_num = parse_job_item(f'{name}.{point}.{sub_num}') - assert name, sub_num == (point, (tpoint, tname, tsub_num)) - tpoint, tname, tsub_num = parse_job_item(f'{name}.{point}.NotNumber') - assert name, None == (point, (tpoint, tname, tsub_num)) - tpoint, tname, tsub_num = parse_job_item(f'{name}.{point}') - assert name, None == (point, (tpoint, tname, tsub_num)) - tpoint, tname, tsub_num = parse_job_item(f'{name}') - assert name, None == (None, (tpoint, tname, tsub_num)) - - def test_apply_delta(): """Test delta application. diff --git a/tests/unit/test_id.py b/tests/unit/test_id.py new file mode 100644 index 00000000000..1ca11a1f126 --- /dev/null +++ b/tests/unit/test_id.py @@ -0,0 +1,349 @@ +# THIS FILE IS PART OF THE CYLC SUITE ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +"""Test the Cylc universal identifier system.""" + +import pytest + +from cylc.flow.id import ( + LEGACY_CYCLE_SLASH_TASK, + LEGACY_TASK_DOT_CYCLE, + RELATIVE_ID, + Tokens, + UNIVERSAL_ID, +) + + +@pytest.mark.parametrize( + 'identifier', + [ + '', + '~', + '~user//cycle' + '~flow:state', + 'flow:flow_sel:flow_sel', + ] +) +def test_univseral_id_illegal(identifier): + """Test illegal formats of the universal identifier.""" + assert UNIVERSAL_ID.match(identifier) is None + + +@pytest.mark.parametrize( + 'identifier', + [ + '~user', + '~user/', + '~user/workflow', + '~user/workflow//', + '~user/workflow:workflow_sel', + '~user/workflow:workflow_sel//', + '~user/workflow:workflow_sel//cycle', + '~user/workflow:workflow_sel//cycle/', + '~user/workflow:workflow_sel//cycle:cycle_sel', + '~user/workflow:workflow_sel//cycle:cycle_sel/', + '~user/workflow:workflow_sel//cycle:cycle_sel/task', + '~user/workflow:workflow_sel//cycle:cycle_sel/task/', + '~user/workflow:workflow_sel//cycle:cycle_sel/task:task_sel', + '~user/workflow:workflow_sel//cycle:cycle_sel/task:task_sel/', + '~user/workflow:workflow_sel//cycle:cycle_sel/task:task_sel/job', + ( + '~user/workflow:workflow_sel//cycle:cycle_sel/task:task_sel/job' + ':job_sel' + ), + 'workflow', + 'workflow//', + 'workflow:workflow_sel', + 'workflow:workflow_sel//', + 'workflow:workflow_sel//cycle', + 'workflow:workflow_sel//cycle/', + 'workflow:workflow_sel//cycle:cycle_sel', + 'workflow:workflow_sel//cycle:cycle_sel/', + 'workflow:workflow_sel//cycle:cycle_sel/task', + 'workflow:workflow_sel//cycle:cycle_sel/task/', + 'workflow:workflow_sel//cycle:cycle_sel/task:task_sel', + 'workflow:workflow_sel//cycle:cycle_sel/task:task_sel/', + 'workflow:workflow_sel//cycle:cycle_sel/task:task_sel/job', + 'workflow:workflow_sel//cycle:cycle_sel/task:task_sel/job:job_sel' + ] +) +def test_universal_id_matches(identifier): + """test every legal format of the universal identifier.""" + # fmt: off + expected_tokens = { + 'user': + 'user' if 'user' in identifier else None, + 'workflow': + 'workflow' if 'workflow' in identifier else None, + 'workflow_sel': + 'workflow_sel' if 'workflow_sel' in identifier else None, + 'cycle': + 'cycle' if 'cycle' in identifier else None, + 'cycle_sel': + 'cycle_sel' if 'cycle_sel' in identifier else None, + 'task': + 'task' if 'task' in identifier else None, + 'task_sel': + 'task_sel' if 'task_sel' in identifier else None, + 'job': + 'job' if 'job' in identifier else None, + 'job_sel': + 'job_sel' if 'job_sel' in identifier else None + } + # fmt: on + match = UNIVERSAL_ID.match(identifier) + assert match + assert match.groupdict() == expected_tokens + + +@pytest.mark.parametrize( + 'identifier', + [ + '~user/a/b/c', + '~user/a/b/c//', + '~user/a/b/c:workflow_sel', + '~user/a/b/c:workflow_sel//', + '~user/a/b/c:workflow_sel//cycle', + '~user/a/b/c:workflow_sel//cycle/', + '~user/a/b/c:workflow_sel//cycle:cycle_sel', + '~user/a/b/c:workflow_sel//cycle:cycle_sel/', + '~user/a/b/c:workflow_sel//cycle:cycle_sel/task', + '~user/a/b/c:workflow_sel//cycle:cycle_sel/task/', + '~user/a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel', + '~user/a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel/', + '~user/a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel/job', + ( + '~user/a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel/job' + ':job_sel' + ), + 'a/b/c', + 'a/b/c//', + 'a/b/c:workflow_sel', + 'a/b/c:workflow_sel//', + 'a/b/c:workflow_sel//cycle', + 'a/b/c:workflow_sel//cycle/', + 'a/b/c:workflow_sel//cycle:cycle_sel', + 'a/b/c:workflow_sel//cycle:cycle_sel/', + 'a/b/c:workflow_sel//cycle:cycle_sel/task', + 'a/b/c:workflow_sel//cycle:cycle_sel/task/', + 'a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel', + 'a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel/', + 'a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel/job', + 'a/b/c:workflow_sel//cycle:cycle_sel/task:task_sel/job:job_sel' + ] +) +def test_universal_id_matches_hierarchical(identifier): + """Test the UID with hierarchical workflow IDs.""" + # fmt: off + expected_tokens = { + 'user': + 'user' if 'user' in identifier else None, + 'workflow': + 'a/b/c', # the hierarchical workflow ID + 'workflow_sel': + 'workflow_sel' if 'workflow_sel' in identifier else None, + 'cycle': + 'cycle' if 'cycle' in identifier else None, + 'cycle_sel': + 'cycle_sel' if 'cycle_sel' in identifier else None, + 'task': + 'task' if 'task' in identifier else None, + 'task_sel': + 'task_sel' if 'task_sel' in identifier else None, + 'job': + 'job' if 'job' in identifier else None, + 'job_sel': + 'job_sel' if 'job_sel' in identifier else None + } + # fmt: on + match = UNIVERSAL_ID.match(identifier) + assert match + assert match.groupdict() == expected_tokens + + +@pytest.mark.parametrize( + 'identifier', + [ + '', + '~', + ':', + 'workflow//cycle', + 'task:task_sel:task_sel', + 'cycle/task' + '//', + '//~', + '//:', + '//workflow//cycle', + '//task:task_sel:task_sel' + ] +) +def test_relative_id_illegal(identifier): + """Test illegal formats of the universal identifier.""" + assert RELATIVE_ID.match(identifier) is None + + +@pytest.mark.parametrize( + 'identifier', + [ + '//cycle', + '//cycle/', + '//cycle:cycle_sel', + '//cycle:cycle_sel/', + '//cycle:cycle_sel/task', + '//cycle:cycle_sel/task/', + '//cycle:cycle_sel/task:task_sel', + '//cycle:cycle_sel/task:task_sel/', + '//cycle:cycle_sel/task:task_sel/job', + '//cycle:cycle_sel/task:task_sel/job:job_sel', + ] +) +def test_relative_id_matches(identifier): + """test every legal format of the relative identifier.""" + expected_tokens = { + 'cycle': 'cycle' if 'cycle' in identifier else None, + 'cycle_sel': 'cycle_sel' if 'cycle_sel' in identifier else None, + 'task': 'task' if 'task' in identifier else None, + 'task_sel': 'task_sel' if 'task_sel' in identifier else None, + 'job': 'job' if 'job' in identifier else None, + 'job_sel': 'job_sel' if 'job_sel' in identifier else None + } + match = RELATIVE_ID.match(identifier) + assert match + assert match.groupdict() == expected_tokens + + +@pytest.mark.parametrize( + 'identifier', + [ + '', + '~', + '/', + ':', + 'task.cycle', # the first digit of the cycle should be a number + '//task.123', # don't match the new format + 'task.cycle/job', + 'task:task_sel.123' # selector should suffix the cycle + ] +) +def test_legacy_task_dot_cycle_illegal(identifier): + """Test illegal formats of the legacy task.cycle identifier.""" + assert LEGACY_TASK_DOT_CYCLE.match(identifier) is None + + +@pytest.mark.parametrize( + 'identifier,expected_tokens', + [ + ( + 'task.1', # integer cycles can be one character long + {'task': 'task', 'cycle': '1', 'task_sel': None} + ), + ( + 't.a.s.k.123', + {'task': 't.a.s.k', 'cycle': '123', 'task_sel': None} + ), + ( + 'task.123:task_sel', + {'task': 'task', 'cycle': '123', 'task_sel': 'task_sel'} + ), + ] +) +def test_legacy_task_dot_cycle_matches(identifier, expected_tokens): + match = LEGACY_TASK_DOT_CYCLE.match(identifier) + assert match + assert match.groupdict() == expected_tokens + + +@pytest.mark.parametrize( + 'identifier', + [ + '', + '~', + '/', + ':', + 'cycle/task', # the first digit of the cycle should be a number + '//123/task', # don't match the new format + 'cycle/task/job' + ] +) +def test_legacy_cycle_slash_task_illegal(identifier): + """Test illegal formats of the legacy cycle/task identifier.""" + assert LEGACY_CYCLE_SLASH_TASK.match(identifier) is None + + +@pytest.mark.parametrize( + 'identifier,expected_tokens', + [ + ( + '123/task', + {'task': 'task', 'cycle': '123', 'task_sel': None} + ), + ( + '123/t.a.s.k', + {'task': 't.a.s.k', 'cycle': '123', 'task_sel': None} + ), + ( + '123/task:task_sel', + {'task': 'task', 'cycle': '123', 'task_sel': 'task_sel'} + ) + ] +) +def test_legacy_cycle_slash_task_matches(identifier, expected_tokens): + match = LEGACY_CYCLE_SLASH_TASK.match(identifier) + assert match + assert match.groupdict() == expected_tokens + + +def test_tokens(): + # tested mainly in doctests + + Tokens('a') + with pytest.raises(ValueError): + Tokens('a', 'b') + + Tokens(cycle='a') + with pytest.raises(ValueError): + Tokens(foo='a') + + Tokens()['cycle'] = 'a' + with pytest.raises(ValueError): + Tokens()['foo'] = 'a' + + assert Tokens('a') == Tokens('a') + assert Tokens('a') != Tokens('b') + assert Tokens('a', relative=True) == Tokens('a', relative=True) + assert Tokens('a', relative=True) != Tokens('b', relative=True) + assert Tokens() != Tokens('a') + assert Tokens(workflow='a') == Tokens('a') + + tokens = Tokens('a//b') + tokens.update({'cycle': 'c', 'task': 'd'}) + assert tokens == Tokens('a//c/d') + with pytest.raises(ValueError): + tokens.update({'foo': 'c'}) + + +def test_no_look_behind(): + """Ensure the UID pattern does not use lookbehinds. + + Ideally this pattern should be work for both cylc-flow and + cylc-ui. + + 2022-01-11: + * Lookbehind support is at ~75% + * https://caniuse.com/js-regexp-lookbehind + + """ + assert '?<=' not in UNIVERSAL_ID.pattern + assert '?. + +import os +from pathlib import Path +import pytest + +from cylc.flow.async_util import pipe +from cylc.flow.exceptions import UserInputError, WorkflowFilesError +from cylc.flow.id import detokenise, tokenise, Tokens +from cylc.flow.id_cli import ( + _expand_workflow_tokens, + _parse_src_path, + _validate_constraint, + _validate_workflow_ids, + _validate_number, + parse_ids_async, +) +from cylc.flow.pathutil import get_cylc_run_dir +from cylc.flow.workflow_files import WorkflowFiles + + +@pytest.fixture(scope='module') +def abc_src_dir(tmp_path_factory): + """Src dir containing three workflows, a, b & c.""" + cwd_before = Path.cwd() + tmp_path = tmp_path_factory.getbasetemp() + os.chdir(tmp_path) + for name in ('a', 'b', 'c'): + Path(tmp_path, name).mkdir() + Path(tmp_path, name, WorkflowFiles.FLOW_FILE).touch() + yield tmp_path + os.chdir(cwd_before) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out', + [ + (('a//',), ['a']), + (('a//', 'a//'), ['a']), + (('a//', 'b//'), ['a', 'b']), + ] +) +async def test_parse_ids_workflows(ids_in, ids_out): + """It should parse workflows & tasks.""" + workflows, _ = await parse_ids_async(*ids_in, constraint='workflows') + assert list(workflows) == ids_out + assert list(workflows.values()) == [[] for _ in workflows] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out', + [ + (('./a',), ['a']), + ] +) +async def test_parse_ids_workflows_src(ids_in, ids_out, abc_src_dir): + """It should parse src workflows.""" + workflows, _ = await parse_ids_async( + *ids_in, + src=True, + constraint='workflows', + ) + assert list(workflows) == ids_out + assert list(workflows.values()) == [[] for _ in workflows] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out', + [ + ( + ('a//i',), + {'a': ['//i']}, + ), + ( + ('a//i', 'a//j'), + {'a': ['//i', '//j']}, + ), + ( + ('a//i', 'b//i'), + {'a': ['//i'], 'b': ['//i']}, + ), + ( + ('a//', '//i', 'b//', '//i'), + {'a': ['//i'], 'b': ['//i']}, + ), + ] +) +async def test_parse_ids_tasks(ids_in, ids_out): + """It should parse workflow tasks in two formats.""" + workflows, _ = await parse_ids_async(*ids_in, constraint='tasks') + assert { + workflow_id: [detokenise(tokens) for tokens in tokens_list] + for workflow_id, tokens_list in workflows.items() + } == ids_out + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out', + [ + ( + ('./a', '//i'), + {'a': ['//i']} + ), + ( + ('./a', '//i', '//j', '//k'), + {'a': ['//i', '//j', '//k']} + ), + ] +) +async def test_parse_ids_tasks_src(ids_in, ids_out, abc_src_dir): + """It should parse workflow tasks for src workflows.""" + workflows, _ = await parse_ids_async(*ids_in, constraint='tasks', src=True) + assert { + workflow_id: [detokenise(tokens) for tokens in tokens_list] + for workflow_id, tokens_list in workflows.items() + } == ids_out + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out', + [ + (('a//',), {'a': []}), + ( + ('a//', 'b//', 'c//'), + {'a': [], 'b': [], 'c': []} + ), + (('a//i',), {'a': ['//i']}), + (('a//', '//i'), {'a': ['//i']}), + ( + ('a//', '//i', '//j', '//k'), + {'a': ['//i', '//j', '//k']}, + ), + (('a//', '//i', 'b//'), {'a': ['//i'], 'b': []}), + ] +) +async def test_parse_ids_mixed(ids_in, ids_out): + """It should parse mixed workflows & tasks.""" + workflows, _ = await parse_ids_async(*ids_in, constraint='mixed') + assert { + workflow_id: [detokenise(tokens) for tokens in tokens_list] + for workflow_id, tokens_list in workflows.items() + } == ids_out + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out', + [ + (('./a',), {'a': []}), + (('./a', '//i'), {'a': ['//i']}), + (('./a', '//i', '//j', '//k'), {'a': ['//i', '//j', '//k']}), + ] +) +async def test_parse_ids_mixed_src(ids_in, ids_out, abc_src_dir): + """It should parse mixed workflows & tasks from src workflows.""" + workflows, _ = await parse_ids_async(*ids_in, constraint='mixed', src=True) + assert { + workflow_id: [detokenise(tokens) for tokens in tokens_list] + for workflow_id, tokens_list in workflows.items() + } == ids_out + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,errors', + [ + (('a//',), False), + (('a//', 'b//'), False), + (('a//', 'b//', 'c//'), True), + ] +) +async def test_parse_ids_max_workflows(ids_in, errors): + """It should validate input against the max_workflows constraint.""" + try: + await parse_ids_async(*ids_in, constraint='workflows', max_workflows=2) + except UserInputError: + if not errors: + raise + else: + if errors: + raise Exception('Should have raised UserInputError') + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,errors', + [ + (('a//', '//i'), False), + (('a//', '//i', '//j'), False), + (('a//', '//i', '//j', '//k'), True), + ] +) +async def test_parse_ids_max_tasks(ids_in, errors): + """It should validate input against the max_tasks constraint.""" + try: + await parse_ids_async(*ids_in, constraint='tasks', max_tasks=2) + except UserInputError: + if not errors: + raise + else: + if errors: + raise Exception('Should have raised UserInputError') + + +@pytest.mark.asyncio +async def test_parse_ids_infer_run_name(tmp_run_dir): + """It should infer the run name for auto-numbered installations.""" + # it doesn't do anything for a named run + tmp_run_dir('foo/bar', named=True, installed=True) + workflows, *_ = await parse_ids_async('foo//', constraint='workflows') + assert list(workflows) == ['foo'] + + # it correctly identifies the latest run + tmp_run_dir('bar/run1') + workflows, *_ = await parse_ids_async('bar//', constraint='workflows') + assert list(workflows) == ['bar/run1'] + tmp_run_dir('bar/run2') + workflows, *_ = await parse_ids_async('bar//', constraint='workflows') + assert list(workflows) == ['bar/run2'] + + # it leaves the ID alone if infer_latest_runs = False + workflows, *_ = await parse_ids_async( + 'bar//', + constraint='workflows', + infer_latest_runs=False, + ) + assert list(workflows) == ['bar'] + + +@pytest.fixture +def patch_expand_workflow_tokens(monkeypatch): + """Define the output of scan events.""" + + def _patch_expand_workflow_tokens(_ids): + + async def _expand_workflow_tokens_impl(tokens, match_active=True): + nonlocal _ids + for id_ in _ids: + yield tokens.duplicate(workflow=id_) + + monkeypatch.setattr( + 'cylc.flow.id_cli._expand_workflow_tokens_impl', + _expand_workflow_tokens_impl, + ) + + _patch_expand_workflow_tokens(['xxx']) + return _patch_expand_workflow_tokens + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,ids_out,multi_mode', + [ + # multi mode should be True if multiple workflows are defined + (['a//'], ['a'], False), + (['a//', 'b//'], ['a', 'b'], True), + # or if pattern matching is used, irrespective of the number of matches + (['*//'], ['xxx'], True), + ] +) +async def test_parse_ids_multi_mode( + patch_expand_workflow_tokens, + ids_in, + ids_out, + multi_mode, +): + """It should glob for workflows. + + Note: + More advanced tests for this in the integration tests. + + """ + workflows, _multi_mode = await parse_ids_async( + *ids_in, + constraint='workflows', + match_workflows=True, + ) + assert list(workflows) == ids_out + assert _multi_mode == multi_mode + + +@pytest.fixture +def src_dir(tmp_path): + """A src dir containing a workflow called "a".""" + cwd_before = Path.cwd() + src_dir = (tmp_path / 'a') + src_dir.mkdir() + src_file = src_dir / 'flow.cylc' + src_file.touch() + os.chdir(tmp_path) + yield src_dir + os.chdir(cwd_before) + + +def test_parse_src_path(src_dir, monkeypatch): + """It should locate src dirs.""" + # valid absolute path + workflow_id, src_path, src_file_path = _parse_src_path( + str(src_dir.resolve()) + ) + assert workflow_id == 'a' + assert src_path == src_dir + assert src_file_path == src_dir / 'flow.cylc' + + # broken absolute path + with pytest.raises(UserInputError): + workflow_id, src_path, src_file_path = _parse_src_path( + str(src_dir.resolve()) + 'xyz' + ) + + # valid relative path + workflow_id, src_path, src_file_path = _parse_src_path('./a') + assert workflow_id == 'a' + assert src_path == src_dir + assert src_file_path == src_dir / 'flow.cylc' + + # broken relative path + with pytest.raises(UserInputError): + _parse_src_path('./xxx') + + # relative '.' (invalid) + with pytest.raises(WorkflowFilesError) as exc_ctx: + workflow_id, src_path, src_file_path = _parse_src_path('.') + assert 'No flow.cylc or suite.rc in .' in str(exc_ctx.value) + + # move into the src dir + monkeypatch.chdir(src_dir) + + # relative '.' (valid) + workflow_id, src_path, src_file_path = _parse_src_path('.') + assert workflow_id == 'a' + assert src_path == src_dir + assert src_file_path == src_dir / 'flow.cylc' + + # relative './' + workflow_id, src_path, src_file_path = _parse_src_path('./flow.cylc') + assert workflow_id == 'a' + assert src_path == src_dir + assert src_file_path == src_dir / 'flow.cylc' + + +@pytest.mark.asyncio +async def test_parse_ids_src_path(src_dir): + workflows, src_path = await parse_ids_async( + './a', + src=True, + constraint='workflows', + ) + assert workflows == {'a': []} + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'ids_in,error_msg', + [ + ( + ['/home/me/whatever'], + 'Invalid Cylc identifier: /home/me/whatever', + ), + ( + ['foo/..'], + 'cannot be a path that points to the cylc-run directory or above', + ), + ( + ['foo/'], + 'Invalid Cylc identifier', + ), + ( + ['~alice/foo'], + "Operating on others users' workflows is not supported", + ), + ] +) +async def test_parse_ids_invalid_ids(ids_in, error_msg): + """It should error for invalid IDs.""" + with pytest.raises(Exception) as exc_ctx: + await parse_ids_async( + *ids_in, + constraint='workflows', + ) + assert error_msg in str(exc_ctx.value) + + +@pytest.mark.asyncio +async def test_parse_ids_file(tmp_run_dir): + """It should reject IDs that are paths to files.""" + tmp_path = tmp_run_dir('x') + tmp_file = tmp_path / 'tmpfile' + tmp_file.touch() + (tmp_path / WorkflowFiles.FLOW_FILE).touch() + # using a directory should work + await parse_ids_async( + str(tmp_path.relative_to(get_cylc_run_dir())), + constraint='workflows', + ) + with pytest.raises(Exception) as exc_ctx: + # using a file should not + await parse_ids_async( + str(tmp_file.relative_to(get_cylc_run_dir())), + constraint='workflows', + ) + assert 'Workflow ID cannot be a file' in str(exc_ctx.value) + + +@pytest.mark.asyncio +async def test_parse_ids_constraint(): + """It should validate input against the constraint.""" + # constraint: workflows + await parse_ids_async('a//', constraint='workflows') + with pytest.raises(UserInputError): + await parse_ids_async('a//b', constraint='workflows') + # constraint: tasks + await parse_ids_async('a//b', constraint='tasks') + with pytest.raises(UserInputError): + await parse_ids_async('a//', constraint='tasks') + # constraint: mixed + await parse_ids_async('a//', constraint='mixed') + await parse_ids_async('a//b', constraint='mixed') + # constraint: invalid + with pytest.raises(ValueError): + await parse_ids_async('foo', constraint='bar') + + +@pytest.mark.asyncio +async def test_parse_ids_src_run(abc_src_dir, tmp_run_dir): + """It should locate the flow file when src=True.""" + # locate flow file for a src workflow + workflows, flow_file_path = await parse_ids_async( + './a', + src=True, + constraint='workflows', + ) + assert list(workflows) == ['a'] + assert flow_file_path == abc_src_dir / 'a' / WorkflowFiles.FLOW_FILE + + # locate flow file for a run workflow + run_dir = tmp_run_dir('b') + workflows, flow_file_path = await parse_ids_async( + 'b', + src=True, + constraint='workflows', + ) + assert list(workflows) == ['b'] + assert flow_file_path == run_dir / WorkflowFiles.FLOW_FILE + + +def test_validate_constraint(): + """It should validate tokens against the constraint.""" + # constraint=workflows + _validate_constraint(Tokens(workflow='a'), constraint='workflows') + with pytest.raises(UserInputError): + _validate_constraint(Tokens(cycle='a'), constraint='workflows') + with pytest.raises(UserInputError): + _validate_constraint(Tokens(), constraint='workflows') + # constraint=tasks + _validate_constraint(Tokens(cycle='a'), constraint='tasks') + with pytest.raises(UserInputError): + _validate_constraint(Tokens(workflow='a'), constraint='tasks') + with pytest.raises(UserInputError): + _validate_constraint(Tokens(), constraint='tasks') + # constraint=mixed + _validate_constraint(Tokens(workflow='a'), constraint='mixed') + _validate_constraint(Tokens(cycle='a'), constraint='mixed') + with pytest.raises(UserInputError): + _validate_constraint(Tokens(), constraint='mixed') + + +def test_validate_workflow_ids(tmp_run_dir): + _validate_workflow_ids(Tokens('workflow'), src_path='') + with pytest.raises(UserInputError): + _validate_workflow_ids(Tokens('~alice/workflow'), src_path='') + run_dir = tmp_run_dir('b') + with pytest.raises(UserInputError): + _validate_workflow_ids( + Tokens('workflow'), + src_path=run_dir / 'flow.cylc', + ) + + +def test_validate_number(): + _validate_number(Tokens('a'), max_workflows=1) + with pytest.raises(UserInputError): + _validate_number(Tokens('a'), Tokens('b'), max_workflows=1) + t1 = Tokens(cycle='1') + t2 = Tokens(cycle='2') + _validate_number(t1, max_tasks=1) + with pytest.raises(UserInputError): + _validate_number(t1, t2, max_tasks=1) + + +@pytest.fixture +def no_scan(monkeypatch): + """Disable the filesystem part of scan.""" + + @pipe + async def _scan(): + # something that looks like scan but doesn't do anything + yield + + monkeypatch.setattr('cylc.flow.id_cli.scan', _scan) + + +@pytest.mark.asyncio +async def test_expand_workflow_tokens_impl_selector(no_scan): + """It should reject filters it can't handle.""" + tokens = tokenise('~user/*') + await _expand_workflow_tokens([tokens]) + tokens['workflow_sel'] = 'stopped' + with pytest.raises(UserInputError): + await _expand_workflow_tokens([tokens]) diff --git a/tests/unit/test_id_match.py b/tests/unit/test_id_match.py new file mode 100644 index 00000000000..5497908d593 --- /dev/null +++ b/tests/unit/test_id_match.py @@ -0,0 +1,297 @@ +# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. +# Copyright (C) NIWA & British Crown (Met Office) & Contributors. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from types import SimpleNamespace + +import pytest + +from cylc.flow.id import IDTokens, Tokens +from cylc.flow.id_match import filter_ids +from cylc.flow.task_pool import Pool + + +@pytest.fixture +def task_pool(): + def _task_proxy(id_, hier): + tokens = Tokens(id_, relative=True) + itask = SimpleNamespace() + itask.id_ = id_ + itask.point = int(tokens['cycle']) + itask.state = SimpleNamespace() + itask.state.status = tokens['task_sel'] + itask.tdef = SimpleNamespace() + itask.tdef.name = tokens['task'] + if tokens['task'] in hier: + hier = hier[tokens['task']] + else: + hier = [] + hier.append('root') + itask.tdef.namespace_hierarchy = hier + return itask + + def _task_pool(pool, hier) -> 'Pool': + return { + cycle: { + id_.split(':')[0]: _task_proxy(id_, hier) + for id_ in ids + } + for cycle, ids in pool.items() + } + + return _task_pool + + +@pytest.mark.parametrize( + 'ids,matched,not_matched', + [ + ( + ['1'], + ['1/a:x', '1/b:x', '1/c:x'], + [] + ), + ( + ['2'], + [], + ['2'] + ), + ( + ['*'], + ['1/a:x', '1/b:x', '1/c:x'], + [] + ), + ( + ['1/*'], + ['1/a:x', '1/b:x', '1/c:x'], + [] + ), + ( + ['2/*'], + [], + ['2/*'] + ), + ( + ['*/*'], + ['1/a:x', '1/b:x', '1/c:x'], + [] + ), + ( + ['*/a'], + ['1/a:x'], + [] + ), + ( + ['*/z'], + [], + ['*/z'] + ), + ( + ['*/*:x'], + ['1/a:x', '1/b:x', '1/c:x'], + [], + ), + ( + ['*/*:y'], + [], + ['*/*:y'], + ), + ] +) +def test_filter_ids_task_mode(task_pool, ids, matched, not_matched): + """Ensure tasks are returned in task mode.""" + pool = task_pool( + { + 1: ['1/a:x', '1/b:x', '1/c:x'] + }, + {} + ) + + _matched, _not_matched = filter_ids([pool], ids) + assert [itask.id_ for itask in _matched] == matched + assert _not_matched == not_matched + + +@pytest.mark.parametrize( + 'ids,matched,not_matched', + [ + ( + ['1/a'], + [1], + [], + ), + ( + ['1/*'], + [1], + [], + ), + ( + ['1/*:x'], + [1], + [], + ), + ( + ['1/*:y'], + [], + ['1/*:y'], + ), + ( + ['*/*:x'], + [1], + [], + ), + ( + ['1/z'], + [], + ['1/z'], + ), + ( + ['1'], + [1], + [], + ), + ( + ['3'], + [], + ['3'], + ), + ] +) +def test_filter_ids_cycle_mode(task_pool, ids, matched, not_matched): + """Ensure cycle poinds are returned in cycle mode.""" + pool = task_pool( + { + 1: ['1/a:x', '1/b:x'], + 2: ['1/a:x'], + 3: [], + }, + {} + ) + + _matched, _not_matched = filter_ids([pool], ids, out=IDTokens.Cycle) + assert _matched == matched + assert _not_matched == not_matched + + +def test_filter_ids_invalid(caplog): + """Ensure invalid IDs are handled elegantly.""" + matched, not_matched = filter_ids([{}], ['#']) + assert matched == [] + assert not_matched == ['#'] + assert caplog.record_tuples == [ + ('cylc', 30, 'No active tasks matching: #'), + ] + caplog.clear() + matched, not_matched = filter_ids([{}], ['#'], warn=False) + assert caplog.record_tuples == [] + + +def test_filter_ids_pattern_match_off(task_pool): + """Ensure filtering works when pattern matching is turned off.""" + pool = task_pool( + { + 1: ['1/a:x'], + }, + {} + ) + + _matched, _not_matched = filter_ids( + [pool], + ['1/a'], + out=IDTokens.Task, + pattern_match=False, + ) + assert [itask.id_ for itask in _matched] == ['1/a:x'] + assert _not_matched == [] + + +def test_filter_ids_toggle_pattern_matching(task_pool, caplog): + """Ensure pattern matching can be toggled on and off.""" + pool = task_pool( + { + 1: ['1/a:x'], + }, + {} + ) + + ids = ['*/*'] + + # ensure pattern matching works + _matched, _not_matched = filter_ids( + [pool], + ids, + out=IDTokens.Task, + pattern_match=True, + ) + assert [itask.id_ for itask in _matched] == ['1/a:x'] + assert _not_matched == [] + + # ensure pattern matching can be disabled + caplog.clear() + _matched, _not_matched = filter_ids( + [pool], + ids, + out=IDTokens.Task, + pattern_match=False, + ) + assert [itask.id_ for itask in _matched] == [] + assert _not_matched == ['*/*'] + + # ensure the ID is logged + assert len(caplog.record_tuples) == 1 + assert '*/*' in caplog.record_tuples[0][2] + + +@pytest.mark.parametrize( + 'ids,matched,not_matched', + [ + (['1/A'], ['1/a:x'], []), + (['1/B'], ['1/b1:x', '1/b2:x'], []), + (['1/C'], [], ['1/C']), + (['1/root'], ['1/a:x', '1/b1:x', '1/b2:x'], []), + ] +) +def test_filter_ids_namespace_hierarchy(task_pool, ids, matched, not_matched): + """Ensure matching includes namespaces.""" + pool = task_pool( + { + 1: ['1/a:x', '1/b1:x', '1/b2:x'] + }, + { + 'a': ['A'], + 'b1': ['B'], + 'b2': ['B'], + }, + ) + + _matched, _not_matched = filter_ids( + [pool], + ids, + pattern_match=False, + ) + + assert [itask.id_ for itask in _matched] == matched + assert _not_matched == not_matched + + +def test_filter_ids_out_format(): + filter_ids({}, [], out=IDTokens.Cycle) + with pytest.raises(ValueError): + filter_ids({}, [], out=IDTokens.Job) + + +def test_filter_ids_log_errors(caplog): + _, _not_matched = filter_ids({}, ['/////']) + assert _not_matched == ['/////'] + assert caplog.record_tuples == [('cylc', 30, 'Invalid ID: /////')] diff --git a/tests/unit/test_job_file.py b/tests/unit/test_job_file.py index 8a66f38c256..2d654d0c1aa 100644 --- a/tests/unit/test_job_file.py +++ b/tests/unit/test_job_file.py @@ -82,7 +82,7 @@ def test_write(fixture_get_platform): ) job_conf = { "platform": platform, - "task_id": "baa", + "task_id": "1/baa", "workflow_name": "farm_noises", "work_d": "farm_noises/work_d", "uuid_str": "neigh", @@ -117,7 +117,7 @@ def test_write(fixture_get_platform): """Test the header is correctly written""" expected = ('#!/bin/bash -l\n#\n# ++++ THIS IS A CYLC TASK JOB SCRIPT ' - '++++\n# Workflow: farm_noises\n# Task: baa\n# Job ' + '++++\n# Workflow: farm_noises\n# Task: 1/baa\n# Job ' 'log directory: 1/baa/01\n# Job submit method: ' 'background\n# Job submit command template: woof\n#' ' Execution time limit: moo') @@ -130,7 +130,7 @@ def test_write(fixture_get_platform): "job runner": "background", "execution_time_limit": "moo", "workflow_name": "farm_noises", - "task_id": "baa", + "task_id": "1/baa", "job_d": "1/baa/01" } @@ -151,12 +151,12 @@ def test_write(fixture_get_platform): "directives": {"moo": "foo", "cluck": "bar"}, "workflow_name": "farm_noises", - "task_id": "baa", + "task_id": "1/baa", "job_d": "1/test_task_id/01", "job_file_path": "directory/job", "execution_time_limit": 60 }, - ('\n\n# DIRECTIVES:\n# @ job_name = farm_noises.baa' + ('\n\n# DIRECTIVES:\n# @ job_name = farm_noises.baa.1' '\n# @ output = directory/job.out\n# @ error = directory/' 'job.err\n# @ wall_clock_limit = 120,60\n# @ moo = foo' '\n# @ cluck = bar\n# @ queue') @@ -170,14 +170,17 @@ def test_write(fixture_get_platform): }, "directives": {}, "workflow_name": "farm_noises", - "task_id": "baa", + "task_id": "1/baa", "job_d": "1/test_task_id/01", "job_file_path": "directory/job", "execution_time_limit": 60 }, - ('\n\n# DIRECTIVES:\n#SBATCH --job-name=baa.farm_noises\n#SBATCH ' - '--output=directory/job.out\n#SBATCH --error=directory/' - 'job.err\n#SBATCH --time=1:00') + ( + '\n\n# DIRECTIVES:\n#SBATCH ' + '--job-name=baa.1.farm_noises\n#SBATCH ' + '--output=directory/job.out\n#SBATCH --error=directory/' + 'job.err\n#SBATCH --time=1:00' + ) ), ( # Check pbs max job name length @@ -189,7 +192,7 @@ def test_write(fixture_get_platform): }, "directives": {}, "workflow_name": "farm_noises", - "task_id": "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "task_id": "1/baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "job_d": "1/test_task_id/01", "job_file_path": "directory/job", "execution_time_limit": 60 @@ -208,13 +211,13 @@ def test_write(fixture_get_platform): "-q": "queuename", "-l": "s_vmem=1G,s_cpu=60"}, "workflow_name": "farm_noises", - "task_id": "baa", + "task_id": "1/baa", "job_d": "1/test_task_id/01", "job_file_path": "$HOME/directory/job", "execution_time_limit": 1000 }, - ('\n\n# DIRECTIVES:\n#$ -N farm_noises.baa\n#$ -o directory/' + ('\n\n# DIRECTIVES:\n#$ -N farm_noises.baa.1\n#$ -o directory/' 'job.out\n#$ -e directory/job.err\n#$ -l h_rt=0:16:40\n#$ -V\n#' '$ -q queuename\n#$ -l s_vmem=1G,s_cpu=60' ) @@ -478,7 +481,7 @@ def test_homeless_platform(fixture_get_platform): "platform": fixture_get_platform({ 'global init-script': 'some-script' }), - "task_id": "a", + "task_id": "1/a", "workflow_name": "b", "work_d": "c/d", "uuid_str": "e", diff --git a/tests/unit/test_task_pool.py b/tests/unit/test_task_pool.py index 8b1fa7b71f3..763e078d6a6 100644 --- a/tests/unit/test_task_pool.py +++ b/tests/unit/test_task_pool.py @@ -13,22 +13,3 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . - -import pytest -from typing import Optional, Tuple - -from cylc.flow.task_pool import TaskPool - - -@pytest.mark.parametrize( - 'item, expected', - [('foo', (None, 'foo', None)), - ('foo.*', ('*', 'foo', None)), - ('foo.*:failed', ('*', 'foo', 'failed')), - ('foo:failed', (None, 'foo', 'failed')), - ('3/foo:failed', ('3', 'foo', 'failed'))] -) -def test_parse_task_item( - item: str, expected: Tuple[Optional[str], str, Optional[str]] -) -> None: - assert TaskPool._parse_task_item(item) == expected diff --git a/tests/unit/test_workflow_files.py b/tests/unit/test_workflow_files.py index c36483a5546..a6addaaef4c 100644 --- a/tests/unit/test_workflow_files.py +++ b/tests/unit/test_workflow_files.py @@ -56,7 +56,6 @@ is_forbidden, is_installed, parse_cli_sym_dirs, - parse_reg, reinstall_workflow, search_install_source_dirs, validate_workflow_name @@ -336,266 +335,6 @@ def test_infer_latest_run__bad( assert str(exc.value) == err_msg -@pytest.fixture(scope='module') -def setup__test_parse_reg(mod_tmp_run_dir: Callable): - """Setup for test_parse_reg(). - - Returns dict of template vars tmp_path, cylc_run_dir and cwd. - """ - cylc_run_dir: Path = mod_tmp_run_dir() - numbered_workflow = cylc_run_dir / 'numbered' / 'workflow' - (numbered_workflow / 'run1').mkdir(parents=True) - (numbered_workflow / 'run1' / 'flow.cylc').touch() - (numbered_workflow / 'runN').symlink_to('run1') - non_numbered_workflow = cylc_run_dir / 'non_numbered' / 'workflow' - non_numbered_workflow.mkdir(parents=True) - (non_numbered_workflow / 'flow.cylc').touch() - (cylc_run_dir / 'empty').mkdir() - tmp_path = cylc_run_dir.parent - (tmp_path / 'random_file.cylc').touch() - mock_cwd = tmp_path / 'mock-cwd' - mock_cwd.mkdir() - (mock_cwd / 'flow.cylc').touch() - - def _setup__test_parse_reg() -> Dict[str, Path]: - return { - 'cylc_run_dir': cylc_run_dir, - 'tmp_path': tmp_path, - 'cwd': mock_cwd - } - - orig_cwd = os.getcwd() - os.chdir(mock_cwd) - yield _setup__test_parse_reg - os.chdir(orig_cwd) - - -@pytest.mark.parametrize('src', [True, False]) -@pytest.mark.parametrize( - 'reg, expected_reg, expected_path', - [ - pytest.param( - 'numbered/workflow', - 'numbered/workflow/run1', - '{cylc_run_dir}/numbered/workflow/run1', - id="numbered workflow" - ), - pytest.param( - 'numbered/workflow/runN', - 'numbered/workflow/run1', - '{cylc_run_dir}/numbered/workflow/run1', - id="numbered workflow targeted by runN" - ), - pytest.param( - 'non_numbered/workflow', - 'non_numbered/workflow', - '{cylc_run_dir}/non_numbered/workflow', - id="non-numbered workflow" - ), - ] -) -def test_parse_reg__ok( - src: bool, - reg: str, - expected_reg: str, - expected_path: str, - setup__test_parse_reg: Callable -) -> None: - """Test parse_reg() with relative reg. - - Params: - src: Arg passed to parse_reg(). - reg: Arg passed to parse_reg(). - expected_reg: Expected reg returned for both src=True|False. - expected_path: Expected path returned for src=False (for src=True, - flow.cylc will be appended). - """ - paths: dict = setup__test_parse_reg() - expected_reg = expected_reg.format(**paths) - expected_path: Path = Path(expected_path.format(**paths)) - if src: - expected_path = expected_path / WorkflowFiles.FLOW_FILE - assert parse_reg(reg, src) == (expected_reg, expected_path) - - -@pytest.mark.parametrize( - 'args, expected_reg, expected_path, expected_err_msg', - [ - pytest.param( - ('non_exist', False), - 'non_exist', - '{cylc_run_dir}/non_exist', - None, - id="non-existent workflow, src=False" - ), - pytest.param( - ('non_exist', True), - None, - None, - "No flow.cylc or suite.rc in ", - id="non-existent workflow, src=True" - ), - pytest.param( - ('empty', True), - None, - None, - "No flow.cylc or suite.rc in ", - id="empty run dir, src=True" - ), - pytest.param( - ('.', False), - None, - None, - "invalid workflow name", - id="dot for cwd, src=False" - ), - pytest.param( - ('.', True), - '{cwd}', - '{cwd}/flow.cylc', - None, - id="dot for cwd, src=True" - ), - pytest.param( - ('non_numbered/workflow/flow.cylc', False), - None, - None, - "Workflow name must refer to a directory", - id="reg refers to a file, src=False" - ), - pytest.param( - ('non_numbered/workflow/flow.cylc', True), - 'non_numbered/workflow', - '{cylc_run_dir}/non_numbered/workflow/flow.cylc', - None, - id="reg refers to a file, src=True" - ), - pytest.param( - ('{cylc_run_dir}/non_numbered/workflow', False), - None, - None, - "workflow name cannot be an absolute path", - id="reg is absolute path, src=False" - ), - pytest.param( - ('{cylc_run_dir}/non_numbered/workflow', True), - 'non_numbered/workflow', - '{cylc_run_dir}/non_numbered/workflow/flow.cylc', - None, - id="reg is absolute path, src=True" - ), - pytest.param( - ('{tmp_path}/random_file.cylc', True), - '{tmp_path}', - '{tmp_path}/random_file.cylc', - None, - id="reg is absolute path not in ~/cylc-run, src=True" - ), - pytest.param( - ('foo/../../random_file.cylc', False), - None, - None, - "cannot be a path that points to the cylc-run directory or above", - id="reg points to path above, src=False" - ), - pytest.param( - ('foo/../../random_file.cylc', True), - '{tmp_path}', - '{tmp_path}/random_file.cylc', - None, - id="reg points to path above, src=True" - ), - ] -) -def test_parse_reg__various( - args: Tuple[str, bool], - expected_reg: Optional[str], - expected_path: Optional[str], - expected_err_msg: Optional[str], - setup__test_parse_reg: Callable -) -> None: - """Test parse_reg() with various combinations of reg and src. - - Params: - args: Args passed to parse_reg(). - expected_reg: Expected reg returned. - expected_path: Expected path returned. - expected_err_msg: If an exception is expected, text that is expected - to be contained in the message. - """ - paths: Dict[str, Path] = setup__test_parse_reg() - reg, src = args - reg = reg.format(**paths) - - if expected_err_msg: - with pytest.raises(WorkflowFilesError) as exc_info: - parse_reg(reg, src) - assert expected_err_msg in str(exc_info.value) - else: - assert expected_reg is not None - assert expected_path is not None - expected_reg = expected_reg.format(**paths) - expected_path = expected_path.format(**paths) - assert parse_reg(reg, src) == (expected_reg, Path(expected_path)) - - -@pytest.mark.parametrize( - 'reg_includes_flow_file', [True, False] -) -@pytest.mark.parametrize( - 'reg, clash_msg_expected', - [('darmok/jalad', True), - ('./darmok/jalad', False)] -) -def test_parse_reg__clash( - reg: str, - clash_msg_expected: bool, - reg_includes_flow_file: bool, - tmp_run_dir: Callable, tmp_path: Path, monkeypatch: pytest.MonkeyPatch, - caplog: pytest.LogCaptureFixture -) -> None: - """Test parse_reg() with src=True and a reg that exists both under cwd - and ~/cylc-run - - Params: - reg: Workflow reg arg. - clash_msg_expected: Whether the reg clash message should get logged. - reg_includes_flow_file: Whether to add '/flow.cylc' on the end of the - reg arg passed to parse_reg(). - """ - caplog.set_level(logging.WARNING, CYLC_LOG) - FLOW_FILE = WorkflowFiles.FLOW_FILE - run_dir: Path = tmp_run_dir(reg) - cwd = tmp_path / 'mock-cwd' - (cwd / reg).mkdir(parents=True) - (cwd / reg / FLOW_FILE).touch() - monkeypatch.chdir(cwd) - - reg_arg = os.path.join(reg, FLOW_FILE) if reg_includes_flow_file else reg - if reg.startswith(f"{os.curdir}{os.sep}"): - reg = reg[2:] - # The workflow file relative to cwd should take precedence - assert parse_reg(reg_arg, src=True) == ( - str(cwd / reg), - cwd / reg / FLOW_FILE - ) - # If reg doesn't begin with './', it should warn that it also found a - # workflow in ~/cylc-run but didn't use it - if clash_msg_expected: - expected_warning = REG_CLASH_MSG.format( - os.path.join(reg, FLOW_FILE), - run_dir.relative_to(tmp_path / 'cylc-run') / FLOW_FILE - ) - assert expected_warning in caplog.messages - else: - assert caplog.record_tuples == [] - caplog.clear() - # Now test that no warning when cwd == ~/cylc-run - monkeypatch.chdir(tmp_path / 'cylc-run') - assert parse_reg(reg_arg, src=True) == (reg, run_dir / FLOW_FILE) - assert caplog.record_tuples == [] - - @pytest.mark.parametrize( 'reg, stopped, err, err_msg', [ @@ -754,89 +493,6 @@ def mock_err(*args, **kwargs): assert "Cannot remove running workflow" in str(exc.value) -@pytest.mark.asyncio -def test_init_clean__runN( - monkeymock: MonkeyMock, tmp_run_dir: Callable -): - """Test that init_clean() resolves the runN symlink""" - # Setup - run_dir: Path = tmp_run_dir('coruscant/run2') - (run_dir.parent / 'runN').symlink_to(run_dir.name) - tmp_run_dir('coruscant/run1') - mock_clean = monkeymock('cylc.flow.workflow_files.clean', spec=clean) - mock_remote_clean = monkeymock('cylc.flow.workflow_files.remote_clean') - # Test - # runN should be resolved - init_clean('coruscant/runN', opts=CleanOptions()) - mock_clean.assert_called_once_with('coruscant/run2', run_dir, None) - assert mock_remote_clean.called is False - # It should not infer run number if runN not explicitly given - with pytest.raises(WorkflowFilesError) as exc_info: - init_clean('coruscant', opts=CleanOptions()) - assert "contains the following workflows" in str(exc_info.value) - - -@pytest.mark.asyncio -@pytest.mark.parametrize('number_of_runs', [1, 2]) -@pytest.mark.parametrize( - 'force_opt', - [pytest.param(False, id="normal"), - pytest.param(True, id="--force")] -) -def test_init_clean__multiple_runs( - force_opt: bool, - number_of_runs: int, - tmp_run_dir: Callable, monkeymock: MonkeyMock, - caplog: pytest.LogCaptureFixture -) -> None: - """Test init_clean() for workflow dirs that contain 1 or more run dirs.""" - # -- Setup -- - caplog.set_level(logging.WARNING, CYLC_LOG) - for n in range(1, number_of_runs + 1): - last_run_dir: Path = tmp_run_dir(f'foo/run{n}', named=True) - workflow_dir = last_run_dir.parent # Path to cylc-run/foo - mock_clean = monkeymock( - 'cylc.flow.workflow_files.clean', spec=workflow_files.clean - ) - opts = CleanOptions(force=force_opt) - # -- Test -- - if number_of_runs > 1: - if force_opt: - # It should call clean() with 'foo' and log a warning - init_clean('foo', opts) - mock_clean.assert_called_once_with('foo', workflow_dir, None) - msg = caplog.text - else: - # It should raise - with pytest.raises(WorkflowFilesError) as exc_info: - init_clean('foo', opts) - msg = str(exc_info.value) - assert "contains the following workflows" in msg - else: - # It should call clean() with 'foo/run1' followed by 'foo' - init_clean('foo', opts) - assert mock_clean.call_args_list == [ - mock.call('foo/run1', last_run_dir, None), - mock.call('foo', workflow_dir, None) - ] - - -@pytest.mark.asyncio -def test_init_clean__parent_rm_dirs( - tmp_run_dir: Callable, monkeymock: MonkeyMock, -): - """Test that init_clean() called on a parent dir containing 1 run dir, - with the --rm dirs option, only cleans in the run dir.""" - # Setup - run_dir: Path = tmp_run_dir('naboo/run1') - for p in (run_dir, run_dir.parent): - (p / 'jarjar').mkdir() - # Test - init_clean('naboo', opts=CleanOptions(rm_dirs=['jarjar'])) - assert (run_dir / 'jarjar').exists() is False - assert (run_dir.parent / 'jarjar').exists() is True - - @pytest.mark.asyncio @pytest.mark.parametrize( 'rm_dirs, expected_clean, expected_remote_clean', diff --git a/tests/unit/tui/test_util.py b/tests/unit/tui/test_util.py index 3d36899b973..075c528c42d 100644 --- a/tests/unit/tui/test_util.py +++ b/tests/unit/tui/test_util.py @@ -192,55 +192,55 @@ def test_compute_tree(): 'id': 'workflow id', 'cyclePoints': [ { - 'id': '1|family-suffix', + 'id': '1/family-suffix', 'cyclePoint': '1' } ], 'familyProxies': [ { # top level family 'name': 'FOO', - 'id': '1|FOO', + 'id': '1/FOO', 'cyclePoint': '1', - 'firstParent': {'name': 'root', 'id': '1|root'} + 'firstParent': {'name': 'root', 'id': '1/root'} }, { # nested family 'name': 'FOOT', - 'id': '1|FOOT', + 'id': '1/FOOT', 'cyclePoint': '1', - 'firstParent': {'name': 'FOO', 'id': '1|FOO'} + 'firstParent': {'name': 'FOO', 'id': '1/FOO'} }, ], 'taskProxies': [ { # top level task 'name': 'pub', - 'id': '1|pub', - 'firstParent': {'name': 'root', 'id': '1|root'}, + 'id': '1/pub', + 'firstParent': {'name': 'root', 'id': '1/root'}, 'cyclePoint': '1', 'jobs': [] }, { # child task (belongs to family) 'name': 'fan', - 'id': '1|fan', - 'firstParent': {'name': 'fan', 'id': '1|fan'}, + 'id': '1/fan', + 'firstParent': {'name': 'fan', 'id': '1/fan'}, 'cyclePoint': '1', 'jobs': [] }, { # nested child task (belongs to incestuous family) 'name': 'fool', - 'id': '1|fool', - 'firstParent': {'name': 'FOOT', 'id': '1|FOOT'}, + 'id': '1/fool', + 'firstParent': {'name': 'FOOT', 'id': '1/FOOT'}, 'cyclePoint': '1', 'jobs': [] }, { # a task which has jobs 'name': 'worker', - 'id': '1|worker', - 'firstParent': {'name': 'root', 'id': '1|root'}, + 'id': '1/worker', + 'firstParent': {'name': 'root', 'id': '1/root'}, 'cyclePoint': '1', 'jobs': [ - {'id': 'job3', 'submitNum': '3'}, - {'id': 'job2', 'submitNum': '2'}, - {'id': 'job1', 'submitNum': '1'} + {'id': '1/worker/03', 'submitNum': '3'}, + {'id': '1/worker/02', 'submitNum': '2'}, + {'id': '1/worker/01', 'submitNum': '1'} ] } ] @@ -272,15 +272,15 @@ def test_compute_tree(): for node in cycle['children'] ] == [ # test alphabetical sorting - '1|FOO', - '1|pub', - '1|worker' + '1/FOO', + '1/pub', + '1/worker' ] # test family node family = cycle['children'][0] assert family['type_'] == 'family' - assert family['id_'] == '1|FOO' + assert family['id_'] == '1/FOO' assert list(family['data']) == [ 'name', 'id', @@ -292,7 +292,7 @@ def test_compute_tree(): # test nested family nested_family = family['children'][0] assert nested_family['type_'] == 'family' - assert nested_family['id_'] == '1|FOOT' + assert nested_family['id_'] == '1/FOOT' assert list(nested_family['data']) == [ 'name', 'id', @@ -304,7 +304,7 @@ def test_compute_tree(): # test task task = nested_family['children'][0] assert task['type_'] == 'task' - assert task['id_'] == '1|fool' + assert task['id_'] == '1/fool' assert list(task['data']) == [ 'name', 'id', @@ -320,15 +320,15 @@ def test_compute_tree(): job['id_'] for job in task['children'] ] == [ - 'job3', - 'job2', - 'job1' + '1/worker/03', + '1/worker/02', + '1/worker/01' ] # test job job = task['children'][0] assert job['type_'] == 'job' - assert job['id_'] == 'job3' + assert job['id_'] == '1/worker/03' assert list(job['data']) == [ 'id', 'submitNum' @@ -338,7 +338,7 @@ def test_compute_tree(): # test job info job_info = job['children'][0] assert job_info['type_'] == 'job_info' - assert job_info['id_'] == 'job3_info' + assert job_info['id_'] == '1/worker/03_info' assert list(job_info['data']) == [ 'id', 'submitNum'