diff --git a/mistralclient/api/v2/workbooks.py b/mistralclient/api/v2/workbooks.py index d8ece843..19edadb0 100644 --- a/mistralclient/api/v2/workbooks.py +++ b/mistralclient/api/v2/workbooks.py @@ -22,31 +22,15 @@ class Workbook(base.Resource): class WorkbookManager(base.ResourceManager): resource_class = Workbook - def create(self, name, tags=None, definition=None): - self._ensure_not_empty(name=name) + def create(self, definition): + self._ensure_not_empty(definition=definition) - data = { - 'name': name, - 'tags': tags, - } + return self._create('/workbooks', {'definition': definition}) - if definition: - data.update({'definition': definition}) + def update(self, definition): + self._ensure_not_empty(definition=definition) - return self._create('/workbooks', data) - - def update(self, name, tags=None, definition=None): - self._ensure_not_empty(name=name) - - data = { - 'name': name, - 'tags': tags, - } - - if definition: - data.update({'definition': definition}) - - return self._update('/workbooks/%s' % name, data) + return self._update('/workbooks', {'definition': definition}) def list(self): return self._list('/workbooks', response_key='workbooks') diff --git a/mistralclient/commands/v2/executions.py b/mistralclient/commands/v2/executions.py index dea93c8b..3fb59646 100644 --- a/mistralclient/commands/v2/executions.py +++ b/mistralclient/commands/v2/executions.py @@ -69,9 +69,7 @@ class Get(show.ShowOne): def get_parser(self, prog_name): parser = super(Get, self).get_parser(prog_name) - parser.add_argument( - 'id', - help='Execution identifier') + parser.add_argument('id', help='Execution identifier') return parser @@ -87,17 +85,21 @@ class Create(show.ShowOne): def get_parser(self, prog_name): parser = super(Create, self).get_parser(prog_name) + parser.add_argument( 'workflow_name', - help='Execution workflow') + help='Execution workflow' + ) parser.add_argument( 'workflow_input', nargs='?', - help='Workflow input') + help='Workflow input' + ) parser.add_argument( 'params', nargs='?', - help='Workflow additional parameters') + help='Workflow additional parameters' + ) return parser @@ -132,9 +134,7 @@ class Delete(command.Command): def get_parser(self, prog_name): parser = super(Delete, self).get_parser(prog_name) - parser.add_argument( - 'id', - help='Execution identifier') + parser.add_argument('id', help='Execution identifier') return parser @@ -150,11 +150,13 @@ class Update(show.ShowOne): parser.add_argument( 'id', - help='Execution identifier') + help='Execution identifier' + ) parser.add_argument( 'state', choices=['RUNNING', 'SUSPENDED', 'STOPPED', 'SUCCESS', 'ERROR'], - help='Execution state') + help='Execution state' + ) return parser @@ -171,9 +173,8 @@ class GetInput(command.Command): def get_parser(self, prog_name): parser = super(GetInput, self).get_parser(prog_name) - parser.add_argument( - 'id', - help='Execution ID') + + parser.add_argument('id', help='Execution ID') return parser @@ -195,9 +196,8 @@ class GetOutput(command.Command): def get_parser(self, prog_name): parser = super(GetOutput, self).get_parser(prog_name) - parser.add_argument( - 'id', - help='Execution ID') + + parser.add_argument('id', help='Execution ID') return parser diff --git a/mistralclient/commands/v2/workbooks.py b/mistralclient/commands/v2/workbooks.py index 724cc98d..b788bfea 100644 --- a/mistralclient/commands/v2/workbooks.py +++ b/mistralclient/commands/v2/workbooks.py @@ -70,9 +70,12 @@ class Get(show.ShowOne): def get_parser(self, prog_name): parser = super(Get, self).get_parser(prog_name) + parser.add_argument( 'name', - help='Workbook name') + help='Workbook name' + ) + return parser def take_action(self, parsed_args): @@ -87,16 +90,9 @@ class Create(show.ShowOne): def get_parser(self, prog_name): parser = super(Create, self).get_parser(prog_name) - parser.add_argument( - 'name', - help='Workbook name') - parser.add_argument( - 'tags', - nargs='?', - help='Workbook tags separated by ","') + parser.add_argument( 'definition', - nargs='?', type=argparse.FileType('r'), help='Workbook definition file' ) @@ -104,15 +100,8 @@ class Create(show.ShowOne): return parser def take_action(self, parsed_args): - if parsed_args.definition: - workbook = workbooks.WorkbookManager(self.app.client)\ - .create(parsed_args.name, - str(parsed_args.tags).split(','), - parsed_args.definition.read()) - else: - workbook = workbooks.WorkbookManager(self.app.client)\ - .create(parsed_args.name, - str(parsed_args.tags).split(','), None) + workbook = workbooks.WorkbookManager(self.app.client)\ + .create(parsed_args.definition.read()) return format(workbook) @@ -122,9 +111,8 @@ class Delete(command.Command): def get_parser(self, prog_name): parser = super(Delete, self).get_parser(prog_name) - parser.add_argument( - 'name', - help='Workbook name') + + parser.add_argument('name', help='Workbook name') return parser @@ -137,57 +125,20 @@ class Update(show.ShowOne): def get_parser(self, prog_name): parser = super(Update, self).get_parser(prog_name) - parser.add_argument( - 'name', - help='Workbook name') - parser.add_argument( - 'tags', - nargs='?', - help='Workbook tags separated by ","') + parser.add_argument( 'definition', - nargs='?', type=argparse.FileType('r'), help='Workbook definition file' ) return parser - def take_action(self, parsed_args): - if parsed_args.definition: - workbook = workbooks.WorkbookManager(self.app.client)\ - .update(parsed_args.name, - str(parsed_args.tags).split(','), - parsed_args.definition.read()) - return format(workbook) - else: - workbook = workbooks.WorkbookManager(self.app.client)\ - .update(parsed_args.name, - tags=str(parsed_args.tags).split(',')) - return format(workbook) - - -class UploadDefinition(command.Command): - """Upload workbook definition.""" - - def get_parser(self, prog_name): - parser = super(UploadDefinition, self).get_parser(prog_name) - parser.add_argument( - 'name', - help='Workbook name') - parser.add_argument( - 'path', - type=argparse.FileType('r'), - help='Workbook definition file') - - return parser - def take_action(self, parsed_args): workbook = workbooks.WorkbookManager(self.app.client)\ - .update(parsed_args.name, - definition=parsed_args.path.read()) + .update(parsed_args.definition.read()) - self.app.stdout.write(workbook.definition or "\n") + return format(workbook) class GetDefinition(command.Command): @@ -195,9 +146,8 @@ class GetDefinition(command.Command): def get_parser(self, prog_name): parser = super(GetDefinition, self).get_parser(prog_name) - parser.add_argument( - 'name', - help='Workbook name') + + parser.add_argument('name', help='Workbook name') return parser diff --git a/mistralclient/shell.py b/mistralclient/shell.py index 44588e3e..88f3d7a7 100644 --- a/mistralclient/shell.py +++ b/mistralclient/shell.py @@ -235,8 +235,6 @@ class MistralShell(app.App): 'workbook-create': mistralclient.commands.v2.workbooks.Create, 'workbook-delete': mistralclient.commands.v2.workbooks.Delete, 'workbook-update': mistralclient.commands.v2.workbooks.Update, - 'workbook-upload-definition': - mistralclient.commands.v2.workbooks.UploadDefinition, 'workbook-get-definition': mistralclient.commands.v2.workbooks.GetDefinition, 'execution-list': mistralclient.commands.v2.executions.List, diff --git a/mistralclient/tests/unit/base.py b/mistralclient/tests/unit/base.py index 85c8ec4c..742f13a8 100644 --- a/mistralclient/tests/unit/base.py +++ b/mistralclient/tests/unit/base.py @@ -72,5 +72,7 @@ class BaseCommandTest(unittest2.TestCase): def call(self, command, app_args=[], prog_name=''): cmd = command(self.app, app_args) + parsed_args = cmd.get_parser(prog_name).parse_args(app_args) + return cmd.take_action(parsed_args) diff --git a/mistralclient/tests/unit/v2/test_cli_workbooks.py b/mistralclient/tests/unit/v2/test_cli_workbooks.py index e9bf5b81..27289774 100644 --- a/mistralclient/tests/unit/v2/test_cli_workbooks.py +++ b/mistralclient/tests/unit/v2/test_cli_workbooks.py @@ -31,7 +31,12 @@ WORKBOOK_DICT = { WB_DEF = """ -Workflows: +--- +version: '2.0 + +name: wb + +workflows: wf1: tasks: task1: @@ -45,19 +50,23 @@ WORKBOOK_WITH_DEF = workbooks.Workbook(mock, WB_WITH_DEF_DICT) class TestCLIWorkbooksV2(base.BaseCommandTest): + @mock.patch('argparse.open', create=True) @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.create') - def test_create(self, mock): + def test_create(self, mock, mock_open): mock.return_value = WORKBOOK + mock_open.return_value = mock.MagicMock(spec=file) - result = self.call(workbook_cmd.Create, app_args=['name']) + result = self.call(workbook_cmd.Create, app_args=['wb.yaml']) self.assertEqual(('a', 'a, b', '1', '1'), result[1]) + @mock.patch('argparse.open', create=True) @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.update') - def test_update(self, mock): + def test_update(self, mock, mock_open): mock.return_value = WORKBOOK + mock_open.return_value = mock.MagicMock(spec=file) - result = self.call(workbook_cmd.Update, app_args=['name']) + result = self.call(workbook_cmd.Update, app_args=['definition']) self.assertEqual(('a', 'a, b', '1', '1'), result[1]) @@ -81,21 +90,7 @@ class TestCLIWorkbooksV2(base.BaseCommandTest): def test_delete(self, mock): self.assertIsNone(self.call(workbook_cmd.Delete, app_args=['name'])) - @mock.patch('argparse.open', create=True) - @mock.patch( - 'mistralclient.api.v2.workbooks.WorkbookManager.update' - ) - def test_upload_definition(self, mock, mock_open): - mock.return_value = WORKBOOK_WITH_DEF - mock_open.return_value = mock.MagicMock(spec=file) - - result = self.call(workbook_cmd.UploadDefinition, - app_args=['name', '1.txt']) - - self.assertIsNone(result) - - @mock.patch('mistralclient.api.v2.workbooks.' - 'WorkbookManager.get') + @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.get') def test_get_definition(self, mock): mock.return_value = WORKBOOK_WITH_DEF diff --git a/mistralclient/tests/unit/v2/test_workbooks.py b/mistralclient/tests/unit/v2/test_workbooks.py index 30e363e6..3646e953 100644 --- a/mistralclient/tests/unit/v2/test_workbooks.py +++ b/mistralclient/tests/unit/v2/test_workbooks.py @@ -24,62 +24,58 @@ WB_DEF = """ --- version: 2.0 +name: wb + workflows: wf1: type: direct - parameters: + input: - param1 - param2 tasks: task1: action: std.http url="localhost:8989" - on-success: test_subsequent + on-success: + - test_subsequent test_subsequent: - action: std.http url="http://some_url" - parameters: - server_id: 1 + action: std.http url="http://some_url" server_id=1 """ -WORKBOOK = { - 'name': "my_workbook", - 'tags': ['deployment', 'demo'], - 'definition': WB_DEF -} +WORKBOOK = {'definition': WB_DEF} URL_TEMPLATE = '/workbooks' URL_TEMPLATE_NAME = '/workbooks/%s' -URL_TEMPLATE_DEFINITION = '/workbooks/%s/definition' class TestWorkbooksV2(base.BaseClientV2Test): def test_create(self): mock = self.mock_http_post(content=WORKBOOK) - wb = self.workbooks.create(WORKBOOK['name'], - WORKBOOK['tags'], - WORKBOOK['definition']) + wb = self.workbooks.create(WORKBOOK['definition']) self.assertIsNotNone(wb) - self.assertEqual(workbooks.Workbook(self.workbooks, - WORKBOOK).__dict__, wb.__dict__) + self.assertEqual( + workbooks.Workbook(self.workbooks, WORKBOOK).__dict__, + wb.__dict__ + ) + mock.assert_called_once_with(URL_TEMPLATE, json.dumps(WORKBOOK)) def test_update(self): mock = self.mock_http_put(content=WORKBOOK) - wb = self.workbooks.update(WORKBOOK['name'], - WORKBOOK['tags'], - WORKBOOK['definition']) + wb = self.workbooks.update(WORKBOOK['definition']) self.assertIsNotNone(wb) - self.assertEqual(workbooks.Workbook(self.workbooks, - WORKBOOK).__dict__, wb.__dict__) - mock.assert_called_once_with( - URL_TEMPLATE_NAME % WORKBOOK['name'], - json.dumps(WORKBOOK)) + self.assertEqual( + workbooks.Workbook(self.workbooks, WORKBOOK).__dict__, + wb.__dict__ + ) + + mock.assert_called_once_with(URL_TEMPLATE, json.dumps(WORKBOOK)) def test_list(self): mock = self.mock_http_get(content={'workbooks': [WORKBOOK]}) @@ -87,25 +83,32 @@ class TestWorkbooksV2(base.BaseClientV2Test): workbook_list = self.workbooks.list() self.assertEqual(1, len(workbook_list)) + wb = workbook_list[0] - self.assertEqual(workbooks.Workbook(self.workbooks, - WORKBOOK).__dict__, wb.__dict__) + self.assertEqual( + workbooks.Workbook(self.workbooks, WORKBOOK).__dict__, + wb.__dict__ + ) + mock.assert_called_once_with(URL_TEMPLATE) def test_get(self): mock = self.mock_http_get(content=WORKBOOK) - wb = self.workbooks.get(WORKBOOK['name']) + wb = self.workbooks.get('wb') self.assertIsNotNone(wb) - self.assertEqual(workbooks.Workbook(self.workbooks, - WORKBOOK).__dict__, wb.__dict__) - mock.assert_called_once_with(URL_TEMPLATE_NAME % WORKBOOK['name']) + self.assertEqual( + workbooks.Workbook(self.workbooks, WORKBOOK).__dict__, + wb.__dict__ + ) + + mock.assert_called_once_with(URL_TEMPLATE_NAME % 'wb') def test_delete(self): mock = self.mock_http_delete(status_code=204) - self.workbooks.delete(WORKBOOK['name']) + self.workbooks.delete('wb') - mock.assert_called_once_with(URL_TEMPLATE_NAME % WORKBOOK['name']) + mock.assert_called_once_with(URL_TEMPLATE_NAME % 'wb')