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
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)()
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))
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)()
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))
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))
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)
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'])
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))
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
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)