def test_simple_tiered_workflow(self): workflow_name1 = construct_workflow_name_key('tieredWorkflow', 'parentWorkflow') workflow_name2 = construct_workflow_name_key('tieredWorkflow', 'childWorkflow') step_names = ['start', '1'] setup_subscriptions_for_step([workflow_name1, workflow_name2], step_names) self.controller.execute_workflow('tieredWorkflow', 'parentWorkflow') shutdown_pool() steps = executed_steps('defaultController', workflow_name1, self.start, datetime.utcnow()) steps.extend(executed_steps('defaultController', workflow_name2, self.start, datetime.utcnow())) ancestries = [step['ancestry'].split(',') for step in steps] name_ids = [(ancestry[-2], ancestry[-1]) for ancestry in ancestries] expected_ids = [(workflow_name1, 'start'), (workflow_name1, '1'), (workflow_name2, 'start')] orderless_list_compare(self, name_ids, expected_ids) name_result = {(workflow_name1, 'start'): {'status': 'Success', 'result': 'REPEATING: Parent Step One'}, (workflow_name2, 'start'): {'status': 'Success', 'result': 'REPEATING: Child Step One'}, (workflow_name1, '1'): {'status': 'Success', 'result': 'REPEATING: Parent Step Two'}} for step in steps: ancestry = step['ancestry'].split(',') name_id = (ancestry[-2], ancestry[-1]) self.assertIn(name_id, name_result) result = json.loads(step['data']) if type(name_result[name_id]) == dict: self.assertDictEqual(result['result'], name_result[name_id]) else: self.assertEqual(result['result'], name_result[name_id])
def test_execute_workflow_in_memory(self): sync = Event() workflow_name = 'test_name' data = {"playbook": 'basicWorkflow', "template": 'helloWorldWorkflow'} def wait_for_completion(sender, **kwargs): sync.set() WorkflowShutdown.connect(wait_for_completion) self.put_with_status_check( '/playbooks/basicWorkflow/workflows/{0}'.format(workflow_name), data=data, headers=self.headers, status_code=OBJECT_CREATED) workflow_name = helpers.construct_workflow_name_key( 'basicWorkflow', 'test_name') setup_subscriptions_for_step(workflow_name, ['start']) start = datetime.utcnow() self.post_with_status_check( '/playbooks/basicWorkflow/workflows/test_name/execute', headers=self.headers, status_code=SUCCESS_ASYNC) sync.wait(timeout=10) steps = executed_steps('defaultController', workflow_name, start, datetime.utcnow()) self.assertEqual(len(steps), 1) step = steps[0] ancestry = step['ancestry'].split(',') self.assertEqual(ancestry[-1], "start") self.assertEqual(step['data']['result'], "REPEATING: Hello World")
def test_loop(self): from gevent import monkey, spawn from gevent.event import Event from core.case.callbacks import WorkflowShutdown monkey.patch_all() workflow_name = construct_workflow_name_key('loopWorkflow', 'loopWorkflow') step_names = ['start', '1'] setup_subscriptions_for_step(workflow_name, step_names) waiter = Event() def wait_for_shutdown(sender, **kwargs): waiter.set() WorkflowShutdown.connect(wait_for_shutdown) self.controller.execute_workflow('loopWorkflow', 'loopWorkflow') shutdown_pool() steps = executed_steps('defaultController', workflow_name, self.start, datetime.utcnow()) names = [step['ancestry'].split(',')[-1] for step in steps] expected_steps = ['start', 'start', 'start', 'start', '1'] self.assertListEqual(names, expected_steps) self.assertEqual(len(steps), 5) input_output = [('start', 1), ('start', 2), ('start', 3), ('start', 4), ('1', 'REPEATING: 5')] for step_name, output in input_output: for step in steps: name = step['ancestry'].split(',') if name == step_name: result = json.loads(step['data']) self.assertEqual(result['result'], output)
def test_Loop(self): running_context.controller.load_workflows_from_file( path=config.test_workflows_path + 'loopWorkflow.workflow') workflow_name = construct_workflow_name_key('loopWorkflow', 'loopWorkflow') step_names = ['start', '1'] setup_subscriptions_for_step(workflow_name, step_names) running_context.controller.execute_workflow('loopWorkflow', 'loopWorkflow') running_context.shutdown_threads() steps = executed_steps('defaultController', workflow_name, self.start, datetime.utcnow()) names = [step['ancestry'].split(',')[-1] for step in steps] expected_steps = ['start', 'start', 'start', 'start', '1'] self.assertListEqual(names, expected_steps) self.assertEqual(len(steps), 5) input_output = [('start', 1), ('start', 2), ('start', 3), ('start', 4), ('1', 'REPEATING: 5')] for step_name, output in input_output: for step in steps: name = step['ancestry'].split(',') if name == step_name: self.assertEqual(step['data']['result'], output)
def test_TemplatedWorkflow(self): self.c.loadWorkflowsFromFile(path=config.testWorkflowsPath + 'templatedWorkflowTest.workflow') workflow_name = construct_workflow_name_key('templatedWorkflowTest', 'templatedWorkflow') step_names = ['start', '1'] setup_subscriptions_for_step(workflow_name, step_names) self.c.executeWorkflow('templatedWorkflowTest', 'templatedWorkflow') steps = executed_steps('defaultController', workflow_name, self.start, datetime.utcnow()) self.assertEqual( len(steps), 2, 'Unexpected number of steps executed. ' 'Expected {0}, got {1}'.format(2, len(steps))) names = [step['ancestry'].split(',')[-1] for step in steps] orderless_list_compare(self, names, step_names) name_result = { 'start': { "message": "HELLO WORLD" }, '1': "REPEATING: {'message': 'HELLO WORLD'}" } for step in steps: name = step['ancestry'].split(',')[-1] self.assertIn(name, name_result) if type(name_result[name]) == dict: self.assertDictEqual(step['data']['result'], name_result[name]) else: self.assertEqual(step['data']['result'], name_result[name])
def test_execute_workflow(self): flask_server.running_context.controller.initialize_threading() sync = Event() workflow = flask_server.running_context.controller.get_workflow( 'test', 'helloWorldWorkflow') step_uids = [ step.uid for step in workflow.steps.values() if step.name == 'start' ] setup_subscriptions_for_step(workflow.uid, step_uids) start = datetime.utcnow() @WorkflowShutdown.connect def wait_for_completion(sender, **kwargs): sync.set() WorkflowShutdown.connect(wait_for_completion) response = self.post_with_status_check( '/api/playbooks/test/workflows/helloWorldWorkflow/execute', headers=self.headers, status_code=SUCCESS_ASYNC) flask_server.running_context.controller.shutdown_pool(1) self.assertIn('id', response) sync.wait(timeout=10) steps = [] for uid in step_uids: steps.extend(executed_steps(uid, start, datetime.utcnow())) self.assertEqual(len(steps), 1) step = steps[0] result = step['data'] self.assertEqual(result['result'], { 'status': 'Success', 'result': 'REPEATING: Hello World' })
def test_SimpleTieredWorkflow(self): running_context.controller.load_workflows_from_file( path=config.test_workflows_path + 'tieredWorkflow.workflow') workflow_name1 = construct_workflow_name_key('tieredWorkflow', 'parentWorkflow') workflow_name2 = construct_workflow_name_key('tieredWorkflow', 'childWorkflow') step_names = ['start', '1'] setup_subscriptions_for_step([workflow_name1, workflow_name2], step_names) running_context.controller.execute_workflow('tieredWorkflow', 'parentWorkflow') running_context.shutdown_threads() steps = executed_steps('defaultController', workflow_name1, self.start, datetime.utcnow()) steps.extend( executed_steps('defaultController', workflow_name2, self.start, datetime.utcnow())) ancestries = [step['ancestry'].split(',') for step in steps] name_ids = [(ancestry[-2], ancestry[-1]) for ancestry in ancestries] expected_ids = [(workflow_name1, 'start'), (workflow_name1, '1'), (workflow_name2, 'start')] orderless_list_compare(self, name_ids, expected_ids) name_result = { (workflow_name1, 'start'): "REPEATING: Parent Step One", (workflow_name2, 'start'): "REPEATING: Child Step One", (workflow_name1, '1'): "REPEATING: Parent Step Two" } for step in steps: ancestry = step['ancestry'].split(',') name_id = (ancestry[-2], ancestry[-1]) self.assertIn(name_id, name_result) if type(name_result[name_id]) == dict: self.assertDictEqual(step['data']['result'], name_result[name_id]) else: self.assertEqual(step['data']['result'], name_result[name_id])
def executionTest(self): step_names = ['start', '1'] setup_subscriptions_for_step(self.testWorkflow.name, step_names) start = datetime.utcnow() # Check that the workflow executed correctly post-manipulation self.c.executeWorkflow(*self.id_tuple) steps = executed_steps('defaultController', self.testWorkflow.name, start, datetime.utcnow()) self.assertEqual(len(steps), 2) names = [step['ancestry'].split(',')[-1] for step in steps] orderless_list_compare(self, names, step_names) name_result = { 'start': "REPEATING: Hello World", '1': "REPEATING: This is a test." } for step in steps: name = step['ancestry'].split(',')[-1] self.assertIn(name, name_result) self.assertEqual(step['data']['result'], name_result[name])
def test_templated_workflow(self): workflow_name = construct_workflow_name_key('templatedWorkflowTest', 'templatedWorkflow') step_names = ['start', '1'] setup_subscriptions_for_step(workflow_name, step_names) self.controller.execute_workflow('templatedWorkflowTest', 'templatedWorkflow') shutdown_pool() steps = executed_steps('defaultController', workflow_name, self.start, datetime.utcnow()) self.assertEqual(len(steps), 2, 'Unexpected number of steps executed. ' 'Expected {0}, got {1}'.format(2, len(steps))) names = [step['ancestry'].split(',')[-1] for step in steps] orderless_list_compare(self, names, step_names) name_result = {'start': {'result': {'message': 'HELLO WORLD'}, 'status': 'Success'}, '1': {'status': 'Success', 'result': "REPEATING: {'message': 'HELLO WORLD'}"}} for step in steps: name = step['ancestry'].split(',')[-1] self.assertIn(name, name_result) result = json.loads(step['data']) self.assertDictEqual(result['result'], name_result[name])
def test_execute_workflow(self): sync = Event() workflow_name = helpers.construct_workflow_name_key('test', 'helloWorldWorkflow') setup_subscriptions_for_step(workflow_name, ['start']) start = datetime.utcnow() def wait_for_completion(sender, **kwargs): sync.set() WorkflowShutdown.connect(wait_for_completion) self.post_with_status_check('/playbooks/test/workflows/helloWorldWorkflow/execute', 'success', headers=self.headers) sync.wait(timeout=10) steps = executed_steps('defaultController', workflow_name, start, datetime.utcnow()) self.assertEqual(len(steps), 1) step = steps[0] ancestry = step['ancestry'].split(',') self.assertEqual(ancestry[-1], "start") self.assertEqual(step['data']['result'], "REPEATING: Hello World")
def test_templated_workflow(self): step_names = ['start', '1'] workflow = self.controller.get_workflow('templatedWorkflowTest', 'templatedWorkflow') step_uids = [ step.uid for step in workflow.steps.values() if step.name in step_names ] setup_subscriptions_for_step(workflow.uid, step_uids) self.controller.execute_workflow('templatedWorkflowTest', 'templatedWorkflow') self.controller.shutdown_pool(1) steps = [] for uid in step_uids: steps.extend(executed_steps(uid, self.start, datetime.utcnow())) self.assertEqual( len(steps), 2, 'Unexpected number of steps executed. ' 'Expected {0}, got {1}'.format(2, len(steps)))