Provide an ability to make action/workflow public

Closes-Bug: #1436384

Depends-On: I776d10e8c3303e6c7d6430a0f338d6f6cbb255a9

Change-Id: I4a4072f0a4387ab4cc79522403d9f4daa9d4f01e
This commit is contained in:
Nikolay Mahotkin
2015-09-16 18:07:59 +03:00
parent b42c7c5696
commit 5937d2a711
8 changed files with 165 additions and 24 deletions

View File

@@ -22,11 +22,11 @@ class Action(base.Resource):
class ActionManager(base.ResourceManager):
resource_class = Action
def create(self, definition):
def create(self, definition, scope='private'):
self._ensure_not_empty(definition=definition)
resp = self.client.http_client.post(
'/actions',
'/actions?scope=%s' % scope,
definition,
headers={'content-type': 'text/plain'}
)
@@ -37,11 +37,11 @@ class ActionManager(base.ResourceManager):
return [self.resource_class(self, resource_data)
for resource_data in base.extract_json(resp, 'actions')]
def update(self, definition):
def update(self, definition, scope='private'):
self._ensure_not_empty(definition=definition)
resp = self.client.http_client.put(
'/actions',
'/actions?scope=%s' % scope,
definition,
headers={'content-type': 'text/plain'}
)

View File

@@ -23,11 +23,11 @@ class Workflow(base.Resource):
class WorkflowManager(base.ResourceManager):
resource_class = Workflow
def create(self, definition):
def create(self, definition, scope='private'):
self._ensure_not_empty(definition=definition)
resp = self.client.http_client.post(
'/workflows',
'/workflows?scope=%s' % scope,
definition,
headers={'content-type': 'text/plain'}
)
@@ -38,11 +38,11 @@ class WorkflowManager(base.ResourceManager):
return [self.resource_class(self, resource_data)
for resource_data in base.extract_json(resp, 'workflows')]
def update(self, definition):
def update(self, definition, scope='private'):
self._ensure_not_empty(definition=definition)
resp = self.client.http_client.put(
'/workflows',
'/workflows?scope=%s' % scope,
definition,
headers={'content-type': 'text/plain'}
)

View File

@@ -105,6 +105,11 @@ class Create(base.MistralLister):
type=argparse.FileType('r'),
help='Action definition file'
)
parser.add_argument(
'--public',
action='store_true',
help='With this flag action will be marked as "public".'
)
return parser
@@ -116,8 +121,12 @@ class Create(base.MistralLister):
return format_list
def _get_resources(self, parsed_args):
scope = 'public' if parsed_args.public else 'private'
return actions.ActionManager(self.app.client).create(
parsed_args.definition.read())
parsed_args.definition.read(),
scope=scope
)
class Delete(command.Command):
@@ -151,6 +160,11 @@ class Update(base.MistralLister):
type=argparse.FileType('r'),
help='Action definition file'
)
parser.add_argument(
'--public',
action='store_true',
help='With this flag action will be marked as "public".'
)
return parser
@@ -158,8 +172,12 @@ class Update(base.MistralLister):
return format
def _get_resources(self, parsed_args):
scope = 'public' if parsed_args.public else 'private'
return actions.ActionManager(self.app.client).update(
parsed_args.definition.read())
parsed_args.definition.read(),
scope=scope
)
class GetDefinition(command.Command):

View File

@@ -98,6 +98,11 @@ class Create(base.MistralLister):
type=argparse.FileType('r'),
help='Workflow definition file'
)
parser.add_argument(
'--public',
action='store_true',
help='With this flag workflow will be marked as "public".'
)
return parser
@@ -110,8 +115,12 @@ class Create(base.MistralLister):
"definition file.")
def _get_resources(self, parsed_args):
scope = 'public' if parsed_args.public else 'private'
return workflows.WorkflowManager(self.app.client).create(
parsed_args.definition.read())
parsed_args.definition.read(),
scope=scope
)
class Delete(command.Command):
@@ -145,6 +154,11 @@ class Update(base.MistralLister):
type=argparse.FileType('r'),
help='Workflow definition'
)
parser.add_argument(
'--public',
action='store_true',
help='With this flag workflow will be marked as "public".'
)
return parser
@@ -152,8 +166,11 @@ class Update(base.MistralLister):
return format
def _get_resources(self, parsed_args):
scope = 'public' if parsed_args.public else 'private'
return workflows.WorkflowManager(self.app.client).update(
parsed_args.definition.read()
parsed_args.definition.read(),
scope=scope
)

View File

@@ -92,29 +92,47 @@ class MistralClientTestBase(base.MistralCLIAuth, base.MistralCLIAltAuth):
return wb
def workflow_create(self, wf_def, admin=True):
def workflow_create(self, wf_def, admin=True, scope='private'):
params = '{0}'.format(wf_def)
if scope == 'public':
params += ' --public'
wf = self.mistral_cli(
admin,
'workflow-create',
params='{0}'.format(wf_def))
params=params
)
for workflow in wf:
self.addCleanup(self.mistral_cli,
admin,
'workflow-delete',
params=workflow['Name'])
self.addCleanup(
self.mistral_cli,
admin,
'workflow-delete',
params=workflow['Name']
)
return wf
def action_create(self, act_def, admin=True):
def action_create(self, act_def, admin=True, scope='private'):
params = '{0}'.format(act_def)
if scope == 'public':
params += ' --public'
acts = self.mistral_cli(
admin,
'action-create',
params='{0}'.format(act_def))
params=params
)
for action in acts:
self.addCleanup(self.mistral_cli,
admin,
'action-delete',
params=action['Name'])
self.addCleanup(
self.mistral_cli,
admin,
'action-delete',
params=action['Name']
)
return acts

View File

@@ -156,6 +156,19 @@ class WorkflowIsolationCLITests(base_v2.MistralClientTestBase):
params=wf[0]["Name"]
)
def test_create_public_workflow(self):
wf = self.workflow_create(self.wf_def, scope='public')
same_wf = self.mistral_alt_user(
"workflow-get",
params=wf[0]["Name"]
)
self.assertEqual(
wf[0]["Name"],
self.get_value_of_field(same_wf, "Name")
)
def test_delete_wf_from_another_tenant(self):
wf = self.workflow_create(self.wf_def)
@@ -218,6 +231,19 @@ class ActionIsolationCLITests(base_v2.MistralClientTestBase):
params=act[0]["Name"]
)
def test_create_public_action(self):
act = self.action_create(self.act_def, scope='public')
same_act = self.mistral_alt_user(
"action-get",
params=act[0]["Name"]
)
self.assertEqual(
act[0]["Name"],
self.get_value_of_field(same_act, "Name")
)
class CronTriggerIsolationCLITests(base_v2.MistralClientTestBase):

View File

@@ -62,6 +62,23 @@ class TestCLIActionsV2(base.BaseCommandTest):
result[1]
)
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.actions.ActionManager.create')
def test_create_public(self, mock, mock_open):
mock.return_value = (ACTION,)
result = self.call(
action_cmd.Create,
app_args=['1.txt', '--public']
)
self.assertEqual(
[('a', True, "param1", 'My cool action', 'test', '1', '1')],
result[1]
)
self.assertEqual('public', mock.call_args[1]['scope'])
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.actions.ActionManager.create')
def test_create_long_input(self, mock, mock_open):
@@ -93,6 +110,23 @@ class TestCLIActionsV2(base.BaseCommandTest):
result[1]
)
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.actions.ActionManager.update')
def test_update_public(self, mock, mock_open):
mock.return_value = (ACTION,)
result = self.call(
action_cmd.Update,
app_args=['my_action.yaml', '--public']
)
self.assertEqual(
[('a', True, "param1", 'My cool action', 'test', '1', '1')],
result[1]
)
self.assertEqual('public', mock.call_args[1]['scope'])
@mock.patch('mistralclient.api.v2.actions.ActionManager.list')
def test_list(self, mock):
mock.return_value = (ACTION,)

View File

@@ -56,6 +56,20 @@ class TestCLIWorkflowsV2(base.BaseCommandTest):
self.assertEqual([('a', 'a, b', 'param', '1', '1')], result[1])
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.workflows.WorkflowManager.create')
def test_create_public(self, mock, mock_open):
mock.return_value = (WORKFLOW,)
result = self.call(
workflow_cmd.Create,
app_args=['1.txt', '--public']
)
self.assertEqual([('a', 'a, b', 'param', '1', '1')], result[1])
self.assertEqual('public', mock.call_args[1]['scope'])
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.workflows.WorkflowManager.create')
def test_create_long_input(self, mock, mock_open):
@@ -83,6 +97,20 @@ class TestCLIWorkflowsV2(base.BaseCommandTest):
self.assertEqual([('a', 'a, b', 'param', '1', '1')], result[1])
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.workflows.WorkflowManager.update')
def test_update_public(self, mock, mock_open):
mock.return_value = (WORKFLOW,)
result = self.call(
workflow_cmd.Update,
app_args=['1.txt', '--public']
)
self.assertEqual([('a', 'a, b', 'param', '1', '1')], result[1])
self.assertEqual('public', mock.call_args[1]['scope'])
@mock.patch('mistralclient.api.v2.workflows.WorkflowManager.list')
def test_list(self, mock):
mock.return_value = (WORKFLOW,)