def simple_all_convergence(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(4)] for n in nodes: g.add_node(n) r''' 0 /\ S / \ S / \ 1 2 \ / F \ / S \/ 3 ''' g.add_edge(nodes[0], nodes[1], "success_nodes") g.add_edge(nodes[0], nodes[2], "success_nodes") g.add_edge(nodes[1], nodes[3], "failure_nodes") g.add_edge(nodes[2], nodes[3], "success_nodes") nodes[3].all_parents_must_converge = True nodes[0].job = Job(status='successful') nodes[1].job = Job(status='failed') nodes[2].job = Job(status='successful') return (g, nodes)
def workflow_dag_1(wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(4)] for n in nodes: g.add_node(n) r''' 0 /\ S / \ / \ 1 | | | F | | S | | 3 | \ | F \ | \/ 2 ''' g.add_edge(nodes[0], nodes[1], "success_nodes") g.add_edge(nodes[0], nodes[2], "success_nodes") g.add_edge(nodes[1], nodes[3], "failure_nodes") g.add_edge(nodes[3], nodes[2], "failure_nodes") return (g, nodes)
def workflow_dag_canceled(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(1)] for n in nodes: g.add_node(n) r''' F0 ''' nodes[0].job = Job(status='canceled') return (g, nodes)
def workflow_dag_canceled(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(4)] for n in nodes: g.add_node(n) r''' C0 / | \ F / A| \ S / | \ 1 2 3 ''' g.add_edge(nodes[0], nodes[1], "failure_nodes") g.add_edge(nodes[0], nodes[2], "always_nodes") g.add_edge(nodes[0], nodes[3], "success_nodes") nodes[0].job = Job(status='canceled') return (g, nodes)
def workflow_dag_root_children(self, wf_node_generator): g = WorkflowDAG() wf_root_nodes = [wf_node_generator() for i in range(0, 10)] wf_leaf_nodes = [wf_node_generator() for i in range(0, 10)] for n in wf_root_nodes + wf_leaf_nodes: g.add_node(n) ''' Pair up a root node with a single child via an edge R1 R2 ... Rx | | | | | | C1 C2 Cx ''' for i, n in enumerate(wf_leaf_nodes): g.add_edge(wf_root_nodes[i], n, 'label') return (g, wf_root_nodes, wf_leaf_nodes)
def workflow_all_converge_1(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(3)] for n in nodes: g.add_node(n) r''' 0 |\ F | \ S| 1 | / |/ A 2 ''' g.add_edge(nodes[0], nodes[1], "failure_nodes") g.add_edge(nodes[0], nodes[2], "success_nodes") g.add_edge(nodes[1], nodes[2], "always_nodes") nodes[2].all_parents_must_converge = True nodes[0].job = Job(status='successful') return (g, nodes)
def complex_dag(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(10)] for n in nodes: g.add_node(n) g.add_edge(nodes[0], nodes[1], "failure_nodes") g.add_edge(nodes[0], nodes[2], "success_nodes") g.add_edge(nodes[0], nodes[3], "always_nodes") g.add_edge(nodes[1], nodes[4], "success_nodes") g.add_edge(nodes[1], nodes[5], "failure_nodes") g.add_edge(nodes[2], nodes[6], "failure_nodes") g.add_edge(nodes[3], nodes[6], "success_nodes") g.add_edge(nodes[4], nodes[6], "always_nodes") g.add_edge(nodes[6], nodes[7], "always_nodes") g.add_edge(nodes[6], nodes[8], "success_nodes") g.add_edge(nodes[6], nodes[9], "failure_nodes") return (g, nodes)
def workflow_all_converge_deep_dnr_tree(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(7)] for n in nodes: g.add_node(n) r''' 0 1 2 \ | / S \ S| / F \ | / \|/ | 3 /\ S / \ S / \ 4| | 5 \ / S \ / S \/ 6 ''' g.add_edge(nodes[0], nodes[3], "success_nodes") g.add_edge(nodes[1], nodes[3], "success_nodes") g.add_edge(nodes[2], nodes[3], "failure_nodes") g.add_edge(nodes[3], nodes[4], "success_nodes") g.add_edge(nodes[3], nodes[5], "success_nodes") g.add_edge(nodes[4], nodes[6], "success_nodes") g.add_edge(nodes[5], nodes[6], "success_nodes") nodes[3].all_parents_must_converge = True nodes[4].all_parents_must_converge = True nodes[5].all_parents_must_converge = True nodes[6].all_parents_must_converge = True nodes[0].job = Job(status='successful') nodes[1].job = Job(status='successful') nodes[2].job = Job(status='successful') return (g, nodes)
def workflow_all_converge_dnr(self, wf_node_generator): g = WorkflowDAG() nodes = [wf_node_generator() for i in range(4)] for n in nodes: g.add_node(n) r''' 0 1 2 S \ F | / F \ | / \ | / \|/ | 3 ''' g.add_edge(nodes[0], nodes[3], "success_nodes") g.add_edge(nodes[1], nodes[3], "failure_nodes") g.add_edge(nodes[2], nodes[3], "failure_nodes") nodes[3].all_parents_must_converge = True nodes[0].job = Job(status='successful') nodes[1].job = Job(status='running') nodes[2].job = Job(status='failed') return (g, nodes)
def workflow_all_converge_2(self, wf_node_generator): """The ordering of _1 and this test, _2, is _slightly_ different. The hope is that topological sorting results in 2 being processed before 3 and/or 3 before 2. """ g = WorkflowDAG() nodes = [wf_node_generator() for i in range(3)] for n in nodes: g.add_node(n) r''' 0 |\ S | \ F| 1 | / |/ A 2 ''' g.add_edge(nodes[0], nodes[1], "success_nodes") g.add_edge(nodes[0], nodes[2], "failure_nodes") g.add_edge(nodes[1], nodes[2], "always_nodes") nodes[2].all_parents_must_converge = True nodes[0].job = Job(status='successful') return (g, nodes)