Пример #1
0
    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")
Пример #2
0
    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'
        })
Пример #3
0
    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)
Пример #4
0
    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")
Пример #5
0
            }
        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)