def _create_resource(self, name, snippet, stack):
     wf = workflow.Workflow(name, snippet, stack)
     self.mistral.workflows.create.return_value = [
         FakeWorkflow('test_stack-workflow-b5fiekfci3yc')
     ]
     scheduler.TaskRunner(wf.create)()
     return wf
Exemple #2
0
 def test_signal_wrong_input_and_params_type(self):
     tmpl = template_format.parse(workflow_template_full)
     stack = utils.parse_stack(tmpl)
     rsrc_defns = stack.t.resource_definitions(stack)['create_vm']
     wf = workflow.Workflow('create_vm', rsrc_defns, stack)
     self.mistral.workflows.create.return_value = [
         FakeWorkflow('create_vm')]
     scheduler.TaskRunner(wf.create)()
     details = {'input': '3'}
     err = self.assertRaises(exception.ResourceFailure,
                             scheduler.TaskRunner(wf.signal, details))
     if six.PY3:
         entity = 'class'
     else:
         entity = 'type'
     error_message = ("StackValidationFailed: resources.create_vm: "
                      "Signal data error: Input in"
                      " signal data must be a map, find a <%s 'str'>" %
                      entity)
     self.assertEqual(error_message, six.text_type(err))
     details = {'params': '3'}
     err = self.assertRaises(exception.ResourceFailure,
                             scheduler.TaskRunner(wf.signal, details))
     error_message = ("StackValidationFailed: resources.create_vm: "
                      "Signal data error: Params "
                      "must be a map, find a <%s 'str'>" % entity)
     self.assertEqual(error_message, six.text_type(err))
 def test_signal_with_body_as_input_and_delete_with_executions(self):
     tmpl = template_format.parse(workflow_template_full)
     stack = utils.parse_stack(
         tmpl, params={'parameters': {
             'use_request_body_as_input': 'true'
         }})
     rsrc_defns = stack.t.resource_definitions(stack)['create_vm']
     wf = workflow.Workflow('create_vm', rsrc_defns, stack)
     self.mistral.workflows.create.return_value = [
         FakeWorkflow('create_vm')
     ]
     scheduler.TaskRunner(wf.create)()
     details = {'flavor': '3'}
     execution = mock.Mock()
     execution.id = '12345'
     exec_manager = executions.ExecutionManager(wf.client('mistral'))
     self.mistral.executions.create.side_effect = (
         lambda *args, **kw: exec_manager.create(*args, **kw))
     self.patchobject(exec_manager, '_create', return_value=execution)
     scheduler.TaskRunner(wf.signal, details)()
     call_args = self.mistral.executions.create.call_args
     args, _ = call_args
     expected_args = ('{"image": "31d8eeaf-686e-4e95-bb27-765014b9f20b", '
                      '"name": "create_test_server", "flavor": "3"}')
     self.validate_json_inputs(args[1], expected_args)
     self.assertEqual({'executions': '12345'}, wf.data())
     # Updating the workflow changing "use_request_body_as_input" to
     # false and signaling again with the expected request body format.
     t = template_format.parse(workflow_updating_request_body_property)
     new_stack = utils.parse_stack(t)
     rsrc_defns = new_stack.t.resource_definitions(new_stack)
     self.mistral.workflows.update.return_value = [
         FakeWorkflow('test_stack-workflow-b5fiekdsa355')
     ]
     scheduler.TaskRunner(wf.update, rsrc_defns['create_vm'])()
     self.assertTrue(self.mistral.workflows.update.called)
     self.assertEqual((wf.UPDATE, wf.COMPLETE), wf.state)
     details = {'input': {'flavor': '4'}}
     execution = mock.Mock()
     execution.id = '54321'
     exec_manager = executions.ExecutionManager(wf.client('mistral'))
     self.mistral.executions.create.side_effect = (
         lambda *args, **kw: exec_manager.create(*args, **kw))
     self.patchobject(exec_manager, '_create', return_value=execution)
     scheduler.TaskRunner(wf.signal, details)()
     call_args = self.mistral.executions.create.call_args
     args, _ = call_args
     expected_args = ('{"image": "31d8eeaf-686e-4e95-bb27-765014b9f20b", '
                      '"name": "create_test_server", "flavor": "4"}')
     self.validate_json_inputs(args[1], expected_args)
     self.assertEqual(
         {
             'executions': '54321,12345',
             'name': 'test_stack-workflow-b5fiekdsa355'
         }, wf.data())
     scheduler.TaskRunner(wf.delete)()
     self.assertEqual(2, self.mistral.executions.delete.call_count)
     self.assertEqual((wf.DELETE, wf.COMPLETE), wf.state)
    def test_create_with_task_parms(self):
        tmpl = template_format.parse(workflow_template_full)
        stack = utils.parse_stack(tmpl)

        rsrc_defns = stack.t.resource_definitions(stack)['create_vm']
        wf = workflow.Workflow('create_vm', rsrc_defns, stack)
        self.mistral.workflows.create.side_effect = (
            lambda args: self.verify_create_params(args))
        scheduler.TaskRunner(wf.create)()
Exemple #5
0
    def _test_validation_failed(self, templatem, error_msg):
        tmpl = template_format.parse(templatem)
        stack = utils.parse_stack(tmpl)

        rsrc_defns = stack.t.resource_definitions(stack)['workflow']

        wf = workflow.Workflow('workflow', rsrc_defns, stack)

        exc = self.assertRaises(exception.StackValidationFailed, wf.validate)
        self.assertEqual(error_msg, six.text_type(exc))
    def test_duplicate_attribute_translation_error(self):
        tmpl = template_format.parse(workflow_template_duplicate_polices)
        stack = utils.parse_stack(tmpl)

        rsrc_defns = stack.t.resource_definitions(stack)['workflow']

        workflow_rsrc = workflow.Workflow('workflow', rsrc_defns, stack)
        ex = self.assertRaises(exception.StackValidationFailed,
                               workflow_rsrc.validate)
        error_msg = ("Cannot define the following properties at "
                     "the same time: tasks.retry, tasks.policies.retry")
        self.assertIn(error_msg, six.text_type(ex))
Exemple #7
0
    def _create_resource(self, name, template=workflow_template):
        tmpl = template_format.parse(template)
        self.stack = utils.parse_stack(tmpl, stack_name='test_stack')

        resource_defns = self.stack.t.resource_definitions(self.stack)
        rsrc_defn = resource_defns['workflow']
        wf = workflow.Workflow(name, rsrc_defn, self.stack)
        self.mistral.workflows.create.return_value = [
            FakeWorkflow('test_stack-workflow-b5fiekfci3yc')
        ]
        scheduler.TaskRunner(wf.create)()
        return wf
 def test_workflow_params_override(self):
     tmpl = template_format.parse(workflow_template_with_params_override)
     stack = utils.parse_stack(tmpl)
     rsrc_defns = stack.t.resource_definitions(stack)['workflow']
     wf = workflow.Workflow('workflow', rsrc_defns, stack)
     self.mistral.workflows.create.return_value = [FakeWorkflow('workflow')]
     scheduler.TaskRunner(wf.create)()
     details = {'params': {'test': 'param_value', 'test1': 'param_value_1'}}
     execution = mock.Mock()
     execution.id = '12345'
     self.mistral.executions.create.side_effect = (
         lambda *args, **kw: self.verify_params(*args, **kw))
     scheduler.TaskRunner(wf.signal, details)()
Exemple #9
0
 def test_signal_wrong_input_key(self):
     tmpl = template_format.parse(workflow_template_full)
     stack = utils.parse_stack(tmpl)
     rsrc_defns = stack.t.resource_definitions(stack)['create_vm']
     wf = workflow.Workflow('create_vm', rsrc_defns, stack)
     self.mistral.workflows.create.return_value = [
         FakeWorkflow('create_vm')]
     scheduler.TaskRunner(wf.create)()
     details = {'input': {'1': '3'}}
     err = self.assertRaises(exception.ResourceFailure,
                             scheduler.TaskRunner(wf.signal, details))
     error_message = ("StackValidationFailed: resources.create_vm: "
                      "Signal data error: Unknown input 1")
     self.assertEqual(error_message, six.text_type(err))
Exemple #10
0
 def test_signal_failed(self):
     tmpl = template_format.parse(workflow_template_full)
     stack = utils.parse_stack(tmpl)
     rsrc_defns = stack.t.resource_definitions(stack)['create_vm']
     wf = workflow.Workflow('create_vm', rsrc_defns, stack)
     self.mistral.workflows.create.return_value = [
         FakeWorkflow('create_vm')]
     scheduler.TaskRunner(wf.create)()
     details = {'input': {'flavor': '3'}}
     self.mistral.executions.create.side_effect = Exception('boom!')
     err = self.assertRaises(exception.ResourceFailure,
                             scheduler.TaskRunner(wf.signal, details))
     self.assertEqual('Exception: resources.create_vm: boom!',
                      six.text_type(err))
Exemple #11
0
    def test_create_with_name(self):
        tmpl = template_format.parse(workflow_template_full)
        stack = utils.parse_stack(tmpl)

        rsrc_defns = stack.t.resource_definitions(stack)['create_vm']

        wf = workflow.Workflow('create_vm', rsrc_defns, stack)
        self.mistral.workflows.create.return_value = [
            FakeWorkflow('create_vm')]
        scheduler.TaskRunner(wf.create)()

        expected_state = (wf.CREATE, wf.COMPLETE)
        self.assertEqual(expected_state, wf.state)
        self.assertEqual('create_vm', wf.resource_id)
Exemple #12
0
    def test_policies_translation_successful(self):
        tmpl = template_format.parse(workflow_template_policies_translation)
        stack = utils.parse_stack(tmpl)
        rsrc_defns = stack.t.resource_definitions(stack)['workflow']
        wf = workflow.Workflow('workflow', rsrc_defns, stack)

        self.assertEqual([{'name': 'check_dat_thing',
                           'action': 'nova.servers_list',
                           'retry': {'delay': 5, 'count': 15},
                           'wait_before': 5,
                           'wait_after': 5,
                           'pause_before': 5,
                           'timeout': 42,
                           'concurrency': 5}], wf.properties.data['tasks'])
Exemple #13
0
    def test_create_wrong_definition(self):
        tmpl = template_format.parse(workflow_template)
        stack = utils.parse_stack(tmpl)

        rsrc_defns = stack.t.resource_definitions(stack)['workflow']

        wf = workflow.Workflow('workflow', rsrc_defns, stack)

        self.mistral.workflows.create.side_effect = Exception('boom!')

        exc = self.assertRaises(exception.ResourceFailure,
                                scheduler.TaskRunner(wf.create))
        expected_state = (wf.CREATE, wf.FAILED)
        self.assertEqual(expected_state, wf.state)
        self.assertIn('Exception: resources.workflow: boom!', str(exc))
Exemple #14
0
    def test_backward_support(self):
        tmpl = template_format.parse(workflow_template_backward_support)
        stack = utils.parse_stack(tmpl)

        rsrc_defns = stack.t.resource_definitions(stack)['create_vm']

        wf = workflow.Workflow('create_vm', rsrc_defns, stack)
        self.mistral.workflows.create.return_value = [
            FakeWorkflow('create_vm')]
        scheduler.TaskRunner(wf.create)()

        expected_state = (wf.CREATE, wf.COMPLETE)
        self.assertEqual(expected_state, wf.state)
        self.assertEqual('create_vm', wf.resource_id)
        for task in wf.properties['tasks']:
            if task['name'] is 'wait_instance':
                self.assertEqual(5, task['retry']['delay'])
                self.assertEqual(15, task['retry']['count'])
                break
Exemple #15
0
 def test_signal_and_delete_with_executions(self):
     tmpl = template_format.parse(workflow_template_full)
     stack = utils.parse_stack(tmpl)
     rsrc_defns = stack.t.resource_definitions(stack)['create_vm']
     wf = workflow.Workflow('create_vm', rsrc_defns, stack)
     self.mistral.workflows.create.return_value = [
         FakeWorkflow('create_vm')]
     scheduler.TaskRunner(wf.create)()
     details = {'input': {'flavor': '3'}}
     execution = mock.Mock()
     execution.id = '12345'
     # Invoke the real create method (bug 1453539)
     exec_manager = executions.ExecutionManager(wf.client('mistral'))
     self.mistral.executions.create.side_effect = (
         lambda *args, **kw: exec_manager.create(*args, **kw))
     self.patchobject(exec_manager, '_create', return_value=execution)
     scheduler.TaskRunner(wf.signal, details)()
     self.assertEqual({'executions': '12345'}, wf.data())
     scheduler.TaskRunner(wf.delete)()
     self.assertEqual(1, self.mistral.executions.delete.call_count)
     self.assertEqual((wf.DELETE, wf.COMPLETE), wf.state)