Beispiel #1
0
    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])
Beispiel #2
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")
Beispiel #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)
    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])
Beispiel #9
0
    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])
Beispiel #10
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")
Beispiel #11
0
    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)))