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_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_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_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")
} else: app_metrics[app]['actions'][action][form]['count'] += 1 app_metrics[app]['actions'][action][form]['avg_time'] = \ (app_metrics[app]['actions'][action][form]['avg_time'] + execution_time) / 2 del __action_tmp[(app, action)] def __workflow_started_callback(sender, **kwargs): # TODO: This identifier should be replaced by step id when that happens __workflow_tmp[sender.name] = datetime.utcnow() def __workflow_ended_callback(sender, **kwargs): if sender.name in __workflow_tmp: execution_time = datetime.utcnow() - __workflow_tmp[sender.name] if sender.name not in workflow_metrics: workflow_metrics[sender.name] = { 'count': 1, 'avg_time': execution_time } else: workflow_metrics[sender.name]['count'] += 1 workflow_metrics[sender.name]['avg_time'] = ( workflow_metrics[sender.name]['avg_time'] + execution_time) / 2 del __workflow_tmp[sender.name] WorkflowExecutionStart.connect(__workflow_started_callback) WorkflowShutdown.connect(__workflow_ended_callback)