Merge "Making "Namespaces" section truly optional"

This commit is contained in:
Jenkins 2014-06-04 21:53:51 +00:00 committed by Gerrit Code Review
commit d4e1879925
5 changed files with 72 additions and 37 deletions

View File

@ -302,12 +302,7 @@ class Engine(object):
for task in task_list:
state, task_runtime_context = retry.get_task_runtime(task)
action_ns = workbook.namespaces.get(task.get_action_namespace())
action_spec = None
if action_ns:
action_spec = \
action_ns.actions.get(task.get_action_name())
action_spec = workbook.get_action(task.get_full_action_name())
db_task = db_api.task_create(workbook_name, execution_id, {
"name": task.name,

View File

@ -56,7 +56,6 @@ class DefaultExecutor(executor.Executor):
else:
try:
action.run()
except exc.ActionException:
self.engine.convey_task_result(task['workbook_name'],
task['execution_id'],

View File

@ -17,6 +17,7 @@ import mock
from oslo.config import cfg
from mistral import dsl_parser as parser
from mistral.tests import base
from mistral.openstack.common import log as logging
from mistral.db import api as db_api
@ -39,6 +40,16 @@ cfg.CONF.set_default('auth_enable', False, group='pecan')
#TODO(rakhmerov): add more tests for errors, execution stop etc.
WB_WITHOUT_NAMESPACES = """Workflow:
tasks:
task:
action: std.http
parameters:
method: GET
url: http://some_url
"""
@mock.patch.object(
engine.EngineClient, 'start_workflow_execution',
mock.MagicMock(side_effect=base.EngineTestCase.mock_start_workflow))
@ -274,3 +285,26 @@ class TestScalableEngine(base.EngineTestCase):
self._assert_single_item(tasks, state=states.ERROR)
self._assert_multiple_items(tasks, 5, state=states.SUCCESS)
@mock.patch.object(
concrete_engine.DefaultEngine, "_notify_task_executors",
mock.MagicMock(return_value=""))
@mock.patch.object(
engine.Engine, '_get_workbook',
mock.MagicMock(
return_value=parser.get_workbook(WB_WITHOUT_NAMESPACES)))
@mock.patch.object(
concrete_engine.DefaultEngine, '_run_tasks',
mock.MagicMock(side_effect=base.EngineTestCase.mock_run_tasks))
def test_engine_without_namespaces(self):
execution = self.engine.start_workflow_execution(WB_NAME, "task", {})
tasks = db_api.tasks_get(WB_NAME, execution['id'])
self.assertIsNotNone(tasks)
self.assertEqual(1, len(tasks))
self.assertEqual(tasks[0]['state'], states.SUCCESS)
execution = db_api.execution_get(WB_NAME, execution['id'])
self.assertEqual(execution['state'], states.SUCCESS)

View File

@ -18,10 +18,12 @@ from mistral import dsl_parser as parser
from mistral.tests import base
SIMPLE_WORKBOOK = """Workflow:
SIMPLE_WORKBOOK = """
Workflow:
tasks:
create-vms:
action: MyRest.create-vm"""
action: MyRest.create-vm
"""
class DSLModelTest(base.BaseTest):
@ -29,24 +31,22 @@ class DSLModelTest(base.BaseTest):
self.doc = base.get_resource("test_rest.yaml")
def test_load_dsl(self):
self.workbook = parser.get_workbook(self.doc)
self.assertEqual(self.workbook.workflow.tasks.items,
self.workbook.tasks.items)
self.assertEqual(self.workbook.tasks.get("create-vms").name,
"create-vms")
self.assertEqual(4,
len(self.workbook.namespaces.get("MyRest").actions))
wb = parser.get_workbook(self.doc)
self.assertEqual(wb.workflow.tasks.items, wb.tasks.items)
self.assertEqual(wb.tasks.get("create-vms").name, "create-vms")
self.assertEqual(4, len(wb.namespaces.get("MyRest").actions))
def test_tasks(self):
self.workbook = parser.get_workbook(self.doc)
self.assertEqual(len(self.workbook.tasks), 6)
wb = parser.get_workbook(self.doc)
self.assertEqual(len(wb.tasks), 6)
attach_volumes = self.workbook.tasks.get("attach-volumes")
attach_volumes = wb.tasks.get("attach-volumes")
self.assertEqual(attach_volumes.get_action_namespace(), "MyRest")
t_parameters = {"image_id": 1234, "flavor_id": 2}
create_vm_nova = self.workbook.tasks.get("create-vm-nova")
create_vm_nova = wb.tasks.get("create-vm-nova")
self.assertEqual(create_vm_nova.parameters, t_parameters)
@ -54,7 +54,8 @@ class DSLModelTest(base.BaseTest):
self.assertEqual(attach_volumes.requires, attach_requires)
subsequent = self.workbook.tasks.get("test_subsequent")
subsequent = wb.tasks.get("test_subsequent")
subseq_success = subsequent.get_on_success()
subseq_error = subsequent.get_on_error()
subseq_finish = subsequent.get_on_finish()
@ -65,9 +66,9 @@ class DSLModelTest(base.BaseTest):
self.assertEqual(subseq_finish, {"create-vms": ''})
def test_actions(self):
self.workbook = parser.get_workbook(self.doc)
wb = parser.get_workbook(self.doc)
actions = self.workbook.namespaces.get("MyRest").actions
actions = wb.namespaces.get("MyRest").actions
self.assertEqual(len(actions), 4)
@ -83,14 +84,18 @@ class DSLModelTest(base.BaseTest):
self.assertEqual('application/json',
base_params['headers']['Content-Type'])
action = wb.get_action("MyRest.create-vm")
self.assertIsNotNone(action)
self.assertEqual("create-vm", action.name)
self.assertEqual("MyRest", action.namespace)
def test_namespaces(self):
self.workbook = parser.get_workbook(self.doc)
wb = parser.get_workbook(self.doc)
namespaces = self.workbook.namespaces
self.assertEqual(len(wb.namespaces), 2)
self.assertEqual(len(namespaces), 2)
nova_namespace = namespaces.get("Nova")
nova_namespace = wb.namespaces.get("Nova")
self.assertEqual(1, len(nova_namespace.actions))
@ -98,6 +103,6 @@ class DSLModelTest(base.BaseTest):
parser.get_workbook(SIMPLE_WORKBOOK)
def test_triggers(self):
self.workbook = parser.get_workbook(self.doc)
wb = parser.get_workbook(self.doc)
self.assertEqual(len(self.workbook.get_triggers()), 1)
self.assertEqual(len(wb.get_triggers()), 1)

View File

@ -24,12 +24,14 @@ class WorkbookSpec(base.BaseSpec):
def __init__(self, doc):
super(WorkbookSpec, self).__init__(doc)
self.namespaces = None
self.namespaces = {}
if self.validate():
ns_dict = self._data.get('Namespaces')
if ns_dict:
self.namespaces = namespaces.NamespaceSpecList(ns_dict)
self.workflow = workflow.WorkflowSpec(self._data['Workflow'])
self.tasks = self.workflow.tasks
@ -47,15 +49,15 @@ class WorkbookSpec(base.BaseSpec):
return triggers
def get_action(self, task_action_name):
if task_action_name.find(":") == -1:
def get_action(self, full_action_name):
if full_action_name.find(".") == -1:
return {}
namespace_name = task_action_name.split(':')[0]
action_name = task_action_name.split(':')[1]
action = self.namespaces.get(namespace_name).actions.get(action_name)
ns_name = full_action_name.split('.')[0]
action_name = full_action_name.split('.')[1]
return action
if self.namespaces:
return self.namespaces.get(ns_name).actions.get(action_name)
def get_actions(self, namespace_name):
return self.namespaces.get(namespace_name).actions