Support workflow UUID when creating cron trigger
Add 'workflow_id' parameter for cron trigger creation, if 'workflow_id' is specified, 'workflow_name' param will be ignored. Partially implements: blueprint use-workflow-id-in-rest-api Change-Id: I0c6020cf27f88646fa82611b9be0a2c125221a2b
This commit is contained in:
parent
3e0278c27d
commit
2b9dfcdb10
@ -33,6 +33,7 @@ class CronTrigger(resource.Resource):
|
||||
id = wtypes.text
|
||||
name = wtypes.text
|
||||
workflow_name = wtypes.text
|
||||
workflow_id = wtypes.text
|
||||
workflow_input = types.jsontype
|
||||
workflow_params = types.jsontype
|
||||
|
||||
@ -51,6 +52,7 @@ class CronTrigger(resource.Resource):
|
||||
return cls(id='123e4567-e89b-12d3-a456-426655440000',
|
||||
name='my_trigger',
|
||||
workflow_name='my_wf',
|
||||
workflow_id='123e4567-e89b-12d3-a456-426655441111',
|
||||
workflow_input={},
|
||||
workflow_params={},
|
||||
scope='private',
|
||||
@ -93,12 +95,13 @@ class CronTriggersController(rest.RestController):
|
||||
|
||||
db_model = triggers.create_cron_trigger(
|
||||
values['name'],
|
||||
values['workflow_name'],
|
||||
values.get('workflow_name'),
|
||||
values.get('workflow_input'),
|
||||
values.get('workflow_params'),
|
||||
values.get('pattern'),
|
||||
values.get('first_execution_time'),
|
||||
values.get('remaining_executions')
|
||||
values.get('remaining_executions'),
|
||||
workflow_id=values.get('workflow_id')
|
||||
)
|
||||
|
||||
return CronTrigger.from_dict(db_model.to_dict())
|
||||
|
@ -373,11 +373,7 @@ def delete_workflow_definition(identifier, session=None):
|
||||
msg = "Attempt to delete a system workflow: %s" % identifier
|
||||
raise exc.DataAccessException(msg)
|
||||
|
||||
# TODO(lane): We use workflow name here instead of supporting UUID, as
|
||||
# cron-trigger is created using workflow name currently. Of course,
|
||||
# cron-trigger creation still needs to be fixed in terms of non-unique
|
||||
# workflow name in the system.
|
||||
cron_triggers = _get_associated_cron_triggers(wf_def.name)
|
||||
cron_triggers = _get_associated_cron_triggers(identifier)
|
||||
|
||||
if cron_triggers:
|
||||
raise exc.DBException(
|
||||
@ -389,11 +385,17 @@ def delete_workflow_definition(identifier, session=None):
|
||||
session.delete(wf_def)
|
||||
|
||||
|
||||
def _get_associated_cron_triggers(wf_name):
|
||||
def _get_associated_cron_triggers(wf_identifier):
|
||||
criterion = (
|
||||
{'workflow_id': wf_identifier}
|
||||
if uuidutils.is_uuid_like(wf_identifier)
|
||||
else {'workflow_name': wf_identifier}
|
||||
)
|
||||
|
||||
cron_triggers = b.model_query(
|
||||
models.CronTrigger,
|
||||
[models.CronTrigger.name]
|
||||
).filter_by(workflow_name=wf_name).all()
|
||||
).filter_by(**criterion).all()
|
||||
|
||||
return [t[0] for t in cron_triggers]
|
||||
|
||||
|
@ -60,7 +60,7 @@ def validate_cron_trigger_input(pattern, first_time, count):
|
||||
|
||||
def create_cron_trigger(name, workflow_name, workflow_input,
|
||||
workflow_params=None, pattern=None, first_time=None,
|
||||
count=None, start_time=None):
|
||||
count=None, start_time=None, workflow_id=None):
|
||||
if not start_time:
|
||||
start_time = datetime.datetime.now()
|
||||
|
||||
@ -84,7 +84,9 @@ def create_cron_trigger(name, workflow_name, workflow_input,
|
||||
next_time = get_next_execution_time(pattern, start_time)
|
||||
|
||||
with db_api.transaction():
|
||||
wf_def = db_api.get_workflow_definition(workflow_name)
|
||||
wf_def = db_api.get_workflow_definition(
|
||||
workflow_id if workflow_id else workflow_name
|
||||
)
|
||||
|
||||
eng_utils.validate_input(
|
||||
wf_def,
|
||||
@ -98,7 +100,7 @@ def create_cron_trigger(name, workflow_name, workflow_input,
|
||||
'first_execution_time': first_time,
|
||||
'next_execution_time': next_time,
|
||||
'remaining_executions': count,
|
||||
'workflow_name': workflow_name,
|
||||
'workflow_name': wf_def.name,
|
||||
'workflow_id': wf_def.id,
|
||||
'workflow_input': workflow_input or {},
|
||||
'workflow_params': workflow_params or {},
|
||||
|
@ -34,13 +34,14 @@ WF = models.WorkflowDefinition(
|
||||
}
|
||||
}
|
||||
)
|
||||
WF.update({'id': '1-2-3-4', 'name': 'my_wf'})
|
||||
WF.update({'id': '123e4567-e89b-12d3-a456-426655440000', 'name': 'my_wf'})
|
||||
|
||||
TRIGGER = {
|
||||
'id': '123',
|
||||
'name': 'my_cron_trigger',
|
||||
'pattern': '* * * * *',
|
||||
'workflow_name': WF.name,
|
||||
'workflow_id': '123e4567-e89b-12d3-a456-426655440000',
|
||||
'workflow_input': '{}',
|
||||
'workflow_params': '{}',
|
||||
'scope': 'private',
|
||||
@ -57,17 +58,9 @@ trigger_values['workflow_params'] = json.loads(
|
||||
TRIGGER_DB = models.CronTrigger()
|
||||
TRIGGER_DB.update(trigger_values)
|
||||
|
||||
|
||||
UPDATED_TRIGGER_DB = copy.copy(TRIGGER_DB)
|
||||
UPDATED_TRIGGER_DB['pattern'] = '*/1 * * * *'
|
||||
|
||||
UPDATED_TRIGGER = copy.deepcopy(TRIGGER)
|
||||
UPDATED_TRIGGER['pattern'] = '*/1 * * * *'
|
||||
|
||||
MOCK_WF = mock.MagicMock(return_value=WF)
|
||||
MOCK_TRIGGER = mock.MagicMock(return_value=TRIGGER_DB)
|
||||
MOCK_TRIGGERS = mock.MagicMock(return_value=[TRIGGER_DB])
|
||||
MOCK_UPDATED_TRIGGER = mock.MagicMock(return_value=UPDATED_TRIGGER_DB)
|
||||
MOCK_DELETE = mock.MagicMock(return_value=None)
|
||||
MOCK_EMPTY = mock.MagicMock(return_value=[])
|
||||
MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException())
|
||||
|
@ -90,6 +90,21 @@ class TriggerServiceV2Test(base.DbTestCase):
|
||||
|
||||
self.assertEqual(datetime.datetime(2010, 8, 25, 0, 10), next_time)
|
||||
|
||||
def test_trigger_create_with_wf_id(self):
|
||||
trigger = t_s.create_cron_trigger(
|
||||
'test',
|
||||
None,
|
||||
{},
|
||||
{},
|
||||
'*/5 * * * *',
|
||||
None,
|
||||
None,
|
||||
datetime.datetime(2010, 8, 25),
|
||||
workflow_id=self.wf.id
|
||||
)
|
||||
|
||||
self.assertEqual(self.wf.name, trigger.workflow_name)
|
||||
|
||||
def test_trigger_create_the_same_first_time_or_count(self):
|
||||
t_s.create_cron_trigger(
|
||||
'test',
|
||||
|
Loading…
Reference in New Issue
Block a user