From 83dcea1e46c10471a96fc6d1169677737f479fe6 Mon Sep 17 00:00:00 2001 From: Renat Akhmerov Date: Mon, 22 Sep 2014 17:27:02 -0700 Subject: [PATCH] Removing 'name' and 'tags' from action API and CLI Change-Id: Ib02e8472b236294bd65b6f9d15d3c5cf0daa552b --- mistralclient/api/v2/actions.py | 37 ++++++++----- mistralclient/commands/v2/actions.py | 53 ++++++------------- mistralclient/shell.py | 2 - .../tests/unit/v2/test_cli_actions.py | 33 +++--------- .../tests/unit/v2/test_cli_workflows.py | 2 - 5 files changed, 46 insertions(+), 81 deletions(-) diff --git a/mistralclient/api/v2/actions.py b/mistralclient/api/v2/actions.py index 21ee6c5d..4beea116 100644 --- a/mistralclient/api/v2/actions.py +++ b/mistralclient/api/v2/actions.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json from mistralclient.api import base @@ -22,25 +23,33 @@ class Action(base.Resource): class ActionManager(base.ResourceManager): resource_class = Action - def create(self, name, definition): - self._ensure_not_empty(name=name, definition=definition) + def create(self, definition): + self._ensure_not_empty(definition=definition) - data = { - 'name': name, - 'definition': definition - } + resp = self.client.http_client.post( + '/actions', + json.dumps({'definition': definition}) + ) - return self._create('/actions', data) + if resp.status_code != 201: + self._raise_api_exception(resp) - def update(self, name, definition): - self._ensure_not_empty(name=name, definition=definition) + return [self.resource_class(self, resource_data) + for resource_data in base.extract_json(resp, 'actions')] - data = { - 'name': name, - 'definition': definition - } + def update(self, definition): + self._ensure_not_empty(definition=definition) - return self._update('/actions/%s' % name, data) + resp = self.client.http_client.put( + '/actions', + json.dumps({'definition': definition}) + ) + + if resp.status_code != 200: + self._raise_api_exception(resp) + + return [self.resource_class(self, resource_data) + for resource_data in base.extract_json(resp, 'actions')] def list(self): return self._list('/actions', response_key='actions') diff --git a/mistralclient/commands/v2/actions.py b/mistralclient/commands/v2/actions.py index 968ab9ba..ece44f5e 100644 --- a/mistralclient/commands/v2/actions.py +++ b/mistralclient/commands/v2/actions.py @@ -83,16 +83,14 @@ class Get(show.ShowOne): return format(action) -class Create(show.ShowOne): +class Create(lister.Lister): """Create new action.""" def get_parser(self, prog_name): parser = super(Create, self).get_parser(prog_name) - parser.add_argument('name', help='Action name') parser.add_argument( 'definition', - nargs='?', type=argparse.FileType('r'), help='Action definition file' ) @@ -104,11 +102,15 @@ class Create(show.ShowOne): raise RuntimeError("You must provide path to action " "definition file.") - action = actions.ActionManager(self.app.client)\ - .create(parsed_args.name, - parsed_args.definition.read()) + action_list = actions.ActionManager(self.app.client)\ + .create(parsed_args.definition.read()) - return format(action) + data = [format(action)[1] for action in action_list] + + if data: + return format()[0], data + else: + return format() class Delete(command.Command): @@ -125,16 +127,14 @@ class Delete(command.Command): actions.ActionManager(self.app.client).delete(parsed_args.name) -class Update(show.ShowOne): +class Update(lister.Lister): """Update action.""" def get_parser(self, prog_name): parser = super(Update, self).get_parser(prog_name) - parser.add_argument('name', help='Action name') parser.add_argument( 'definition', - nargs='?', type=argparse.FileType('r'), help='Action definition file' ) @@ -142,34 +142,15 @@ class Update(show.ShowOne): return parser def take_action(self, parsed_args): - action = actions.ActionManager(self.app.client)\ - .update(parsed_args.name, - parsed_args.definition.read()) + action_list = actions.ActionManager(self.app.client)\ + .update(parsed_args.definition.read()) - return format(action) + data = [format(action)[1] for action in action_list] - -class UploadDefinition(command.Command): - """Upload action definition.""" - - def get_parser(self, prog_name): - parser = super(UploadDefinition, self).get_parser(prog_name) - - parser.add_argument('name', help='Action name') - parser.add_argument( - 'path', - type=argparse.FileType('r'), - help='Action definition file' - ) - - return parser - - def take_action(self, parsed_args): - action = actions.ActionManager(self.app.client)\ - .update(parsed_args.name, - definition=parsed_args.path.read()) - - self.app.stdout.write(action.definition or "\n") + if data: + return format()[0], data + else: + return format() class GetDefinition(command.Command): diff --git a/mistralclient/shell.py b/mistralclient/shell.py index 86b4b285..44588e3e 100644 --- a/mistralclient/shell.py +++ b/mistralclient/shell.py @@ -259,8 +259,6 @@ class MistralShell(app.App): 'action-create': mistralclient.commands.v2.actions.Create, 'action-delete': mistralclient.commands.v2.actions.Delete, 'action-update': mistralclient.commands.v2.actions.Update, - 'action-upload-definition': - mistralclient.commands.v2.actions.UploadDefinition, 'action-get-definition': mistralclient.commands.v2.actions.GetDefinition, 'workflow-list': mistralclient.commands.v2.workflows.List, diff --git a/mistralclient/tests/unit/v2/test_cli_actions.py b/mistralclient/tests/unit/v2/test_cli_actions.py index 71c38e8b..0bd14a18 100644 --- a/mistralclient/tests/unit/v2/test_cli_actions.py +++ b/mistralclient/tests/unit/v2/test_cli_actions.py @@ -49,27 +49,20 @@ class TestCLIActionsV2(base.BaseCommandTest): @mock.patch('argparse.open', create=True) @mock.patch('mistralclient.api.v2.actions.ActionManager.create') def test_create(self, mock, mock_open): - mock.return_value = ACTION - mock_open.return_value = mock.MagicMock(spec=file) + mock.return_value = (ACTION,) - result = self.call( - action_cmd.Create, - app_args=['name', '1.txt'] - ) + result = self.call(action_cmd.Create, app_args=['1.txt']) - self.assertEqual(('a', 'My cool action', '1', '1'), result[1]) + self.assertEqual([('a', 'My cool action', '1', '1')], result[1]) @mock.patch('argparse.open', create=True) @mock.patch('mistralclient.api.v2.actions.ActionManager.update') def test_update(self, mock, mock_open): - mock.return_value = ACTION + mock.return_value = (ACTION,) - result = self.call( - action_cmd.Update, - app_args=['name', 'my_action.yaml'] - ) + result = self.call(action_cmd.Update, app_args=['my_action.yaml']) - self.assertEqual(('a', 'My cool action', '1', '1'), result[1]) + self.assertEqual([('a', 'My cool action', '1', '1')], result[1]) @mock.patch('mistralclient.api.v2.actions.ActionManager.list') def test_list(self, mock): @@ -91,20 +84,6 @@ class TestCLIActionsV2(base.BaseCommandTest): def test_delete(self, mock): self.assertIsNone(self.call(action_cmd.Delete, app_args=['name'])) - @mock.patch('argparse.open', create=True) - @mock.patch( - 'mistralclient.api.v2.actions.ActionManager.update' - ) - def test_upload_definition(self, mock, mock_open): - mock.return_value = ACTION_WITH_DEF - mock_open.return_value = mock.MagicMock(spec=file) - - result = self.call(action_cmd.UploadDefinition, - app_args=['name', '1.txt']) - - self.assertIsNone(result) - self.app.stdout.write.assert_called_with(ACTION_DEF) - @mock.patch('mistralclient.api.v2.actions.' 'ActionManager.get') def test_get_definition(self, mock): diff --git a/mistralclient/tests/unit/v2/test_cli_workflows.py b/mistralclient/tests/unit/v2/test_cli_workflows.py index b8ed9703..760840ac 100644 --- a/mistralclient/tests/unit/v2/test_cli_workflows.py +++ b/mistralclient/tests/unit/v2/test_cli_workflows.py @@ -49,7 +49,6 @@ class TestCLIWorkflowsV2(base.BaseCommandTest): @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.create') def test_create(self, mock, mock_open): mock.return_value = (WORKFLOW,) - mock_open.return_value = mock.MagicMock(spec=file) result = self.call(workflow_cmd.Create, app_args=['1.txt']) @@ -59,7 +58,6 @@ class TestCLIWorkflowsV2(base.BaseCommandTest): @mock.patch('mistralclient.api.v2.workflows.WorkflowManager.update') def test_update(self, mock, mock_open): mock.return_value = (WORKFLOW,) - mock_open.return_value = mock.MagicMock(spec=file) result = self.call(workflow_cmd.Update, app_args=['1.txt'])