Getting rid of 'name' and 'tags' for workbook create/update

Change-Id: I745af78861d098f4f8dedbcf1045d55cdd6e328b
This commit is contained in:
Renat Akhmerov
2014-09-22 12:31:40 -07:00
parent 83dcea1e46
commit 4642ba1526
7 changed files with 89 additions and 157 deletions

View File

@@ -22,31 +22,15 @@ class Workbook(base.Resource):
class WorkbookManager(base.ResourceManager): class WorkbookManager(base.ResourceManager):
resource_class = Workbook resource_class = Workbook
def create(self, name, tags=None, definition=None): def create(self, definition):
self._ensure_not_empty(name=name) self._ensure_not_empty(definition=definition)
data = { return self._create('/workbooks', {'definition': definition})
'name': name,
'tags': tags,
}
if definition: def update(self, definition):
data.update({'definition': definition}) self._ensure_not_empty(definition=definition)
return self._create('/workbooks', data) return self._update('/workbooks', {'definition': definition})
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)
def list(self): def list(self):
return self._list('/workbooks', response_key='workbooks') return self._list('/workbooks', response_key='workbooks')

View File

@@ -69,9 +69,7 @@ class Get(show.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Get, self).get_parser(prog_name) parser = super(Get, self).get_parser(prog_name)
parser.add_argument( parser.add_argument('id', help='Execution identifier')
'id',
help='Execution identifier')
return parser return parser
@@ -87,17 +85,21 @@ class Create(show.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Create, self).get_parser(prog_name) parser = super(Create, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
'workflow_name', 'workflow_name',
help='Execution workflow') help='Execution workflow'
)
parser.add_argument( parser.add_argument(
'workflow_input', 'workflow_input',
nargs='?', nargs='?',
help='Workflow input') help='Workflow input'
)
parser.add_argument( parser.add_argument(
'params', 'params',
nargs='?', nargs='?',
help='Workflow additional parameters') help='Workflow additional parameters'
)
return parser return parser
@@ -132,9 +134,7 @@ class Delete(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Delete, self).get_parser(prog_name) parser = super(Delete, self).get_parser(prog_name)
parser.add_argument( parser.add_argument('id', help='Execution identifier')
'id',
help='Execution identifier')
return parser return parser
@@ -150,11 +150,13 @@ class Update(show.ShowOne):
parser.add_argument( parser.add_argument(
'id', 'id',
help='Execution identifier') help='Execution identifier'
)
parser.add_argument( parser.add_argument(
'state', 'state',
choices=['RUNNING', 'SUSPENDED', 'STOPPED', 'SUCCESS', 'ERROR'], choices=['RUNNING', 'SUSPENDED', 'STOPPED', 'SUCCESS', 'ERROR'],
help='Execution state') help='Execution state'
)
return parser return parser
@@ -171,9 +173,8 @@ class GetInput(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(GetInput, self).get_parser(prog_name) parser = super(GetInput, self).get_parser(prog_name)
parser.add_argument(
'id', parser.add_argument('id', help='Execution ID')
help='Execution ID')
return parser return parser
@@ -195,9 +196,8 @@ class GetOutput(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(GetOutput, self).get_parser(prog_name) parser = super(GetOutput, self).get_parser(prog_name)
parser.add_argument(
'id', parser.add_argument('id', help='Execution ID')
help='Execution ID')
return parser return parser

View File

@@ -70,9 +70,12 @@ class Get(show.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Get, self).get_parser(prog_name) parser = super(Get, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
'name', 'name',
help='Workbook name') help='Workbook name'
)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
@@ -87,16 +90,9 @@ class Create(show.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Create, self).get_parser(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( parser.add_argument(
'definition', 'definition',
nargs='?',
type=argparse.FileType('r'), type=argparse.FileType('r'),
help='Workbook definition file' help='Workbook definition file'
) )
@@ -104,15 +100,8 @@ class Create(show.ShowOne):
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
if parsed_args.definition:
workbook = workbooks.WorkbookManager(self.app.client)\ workbook = workbooks.WorkbookManager(self.app.client)\
.create(parsed_args.name, .create(parsed_args.definition.read())
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)
return format(workbook) return format(workbook)
@@ -122,9 +111,8 @@ class Delete(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Delete, self).get_parser(prog_name) parser = super(Delete, self).get_parser(prog_name)
parser.add_argument(
'name', parser.add_argument('name', help='Workbook name')
help='Workbook name')
return parser return parser
@@ -137,16 +125,9 @@ class Update(show.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(Update, self).get_parser(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( parser.add_argument(
'definition', 'definition',
nargs='?',
type=argparse.FileType('r'), type=argparse.FileType('r'),
help='Workbook definition file' help='Workbook definition file'
) )
@@ -154,40 +135,10 @@ class Update(show.ShowOne):
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
if parsed_args.definition:
workbook = workbooks.WorkbookManager(self.app.client)\ workbook = workbooks.WorkbookManager(self.app.client)\
.update(parsed_args.name, .update(parsed_args.definition.read())
str(parsed_args.tags).split(','),
parsed_args.definition.read())
return format(workbook) 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())
self.app.stdout.write(workbook.definition or "\n")
class GetDefinition(command.Command): class GetDefinition(command.Command):
@@ -195,9 +146,8 @@ class GetDefinition(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(GetDefinition, self).get_parser(prog_name) parser = super(GetDefinition, self).get_parser(prog_name)
parser.add_argument(
'name', parser.add_argument('name', help='Workbook name')
help='Workbook name')
return parser return parser

View File

@@ -235,8 +235,6 @@ class MistralShell(app.App):
'workbook-create': mistralclient.commands.v2.workbooks.Create, 'workbook-create': mistralclient.commands.v2.workbooks.Create,
'workbook-delete': mistralclient.commands.v2.workbooks.Delete, 'workbook-delete': mistralclient.commands.v2.workbooks.Delete,
'workbook-update': mistralclient.commands.v2.workbooks.Update, 'workbook-update': mistralclient.commands.v2.workbooks.Update,
'workbook-upload-definition':
mistralclient.commands.v2.workbooks.UploadDefinition,
'workbook-get-definition': 'workbook-get-definition':
mistralclient.commands.v2.workbooks.GetDefinition, mistralclient.commands.v2.workbooks.GetDefinition,
'execution-list': mistralclient.commands.v2.executions.List, 'execution-list': mistralclient.commands.v2.executions.List,

View File

@@ -72,5 +72,7 @@ class BaseCommandTest(unittest2.TestCase):
def call(self, command, app_args=[], prog_name=''): def call(self, command, app_args=[], prog_name=''):
cmd = command(self.app, app_args) cmd = command(self.app, app_args)
parsed_args = cmd.get_parser(prog_name).parse_args(app_args) parsed_args = cmd.get_parser(prog_name).parse_args(app_args)
return cmd.take_action(parsed_args) return cmd.take_action(parsed_args)

View File

@@ -31,7 +31,12 @@ WORKBOOK_DICT = {
WB_DEF = """ WB_DEF = """
Workflows: ---
version: '2.0
name: wb
workflows:
wf1: wf1:
tasks: tasks:
task1: task1:
@@ -45,19 +50,23 @@ WORKBOOK_WITH_DEF = workbooks.Workbook(mock, WB_WITH_DEF_DICT)
class TestCLIWorkbooksV2(base.BaseCommandTest): class TestCLIWorkbooksV2(base.BaseCommandTest):
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.create') @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.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]) self.assertEqual(('a', 'a, b', '1', '1'), result[1])
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.update') @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.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]) self.assertEqual(('a', 'a, b', '1', '1'), result[1])
@@ -81,21 +90,7 @@ class TestCLIWorkbooksV2(base.BaseCommandTest):
def test_delete(self, mock): def test_delete(self, mock):
self.assertIsNone(self.call(workbook_cmd.Delete, app_args=['name'])) self.assertIsNone(self.call(workbook_cmd.Delete, app_args=['name']))
@mock.patch('argparse.open', create=True) @mock.patch('mistralclient.api.v2.workbooks.WorkbookManager.get')
@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')
def test_get_definition(self, mock): def test_get_definition(self, mock):
mock.return_value = WORKBOOK_WITH_DEF mock.return_value = WORKBOOK_WITH_DEF

View File

@@ -24,62 +24,58 @@ WB_DEF = """
--- ---
version: 2.0 version: 2.0
name: wb
workflows: workflows:
wf1: wf1:
type: direct type: direct
parameters: input:
- param1 - param1
- param2 - param2
tasks: tasks:
task1: task1:
action: std.http url="localhost:8989" action: std.http url="localhost:8989"
on-success: test_subsequent on-success:
- test_subsequent
test_subsequent: test_subsequent:
action: std.http url="http://some_url" action: std.http url="http://some_url" server_id=1
parameters:
server_id: 1
""" """
WORKBOOK = { WORKBOOK = {'definition': WB_DEF}
'name': "my_workbook",
'tags': ['deployment', 'demo'],
'definition': WB_DEF
}
URL_TEMPLATE = '/workbooks' URL_TEMPLATE = '/workbooks'
URL_TEMPLATE_NAME = '/workbooks/%s' URL_TEMPLATE_NAME = '/workbooks/%s'
URL_TEMPLATE_DEFINITION = '/workbooks/%s/definition'
class TestWorkbooksV2(base.BaseClientV2Test): class TestWorkbooksV2(base.BaseClientV2Test):
def test_create(self): def test_create(self):
mock = self.mock_http_post(content=WORKBOOK) mock = self.mock_http_post(content=WORKBOOK)
wb = self.workbooks.create(WORKBOOK['name'], wb = self.workbooks.create(WORKBOOK['definition'])
WORKBOOK['tags'],
WORKBOOK['definition'])
self.assertIsNotNone(wb) self.assertIsNotNone(wb)
self.assertEqual(workbooks.Workbook(self.workbooks, self.assertEqual(
WORKBOOK).__dict__, wb.__dict__) workbooks.Workbook(self.workbooks, WORKBOOK).__dict__,
wb.__dict__
)
mock.assert_called_once_with(URL_TEMPLATE, json.dumps(WORKBOOK)) mock.assert_called_once_with(URL_TEMPLATE, json.dumps(WORKBOOK))
def test_update(self): def test_update(self):
mock = self.mock_http_put(content=WORKBOOK) mock = self.mock_http_put(content=WORKBOOK)
wb = self.workbooks.update(WORKBOOK['name'], wb = self.workbooks.update(WORKBOOK['definition'])
WORKBOOK['tags'],
WORKBOOK['definition'])
self.assertIsNotNone(wb) self.assertIsNotNone(wb)
self.assertEqual(workbooks.Workbook(self.workbooks, self.assertEqual(
WORKBOOK).__dict__, wb.__dict__) workbooks.Workbook(self.workbooks, WORKBOOK).__dict__,
mock.assert_called_once_with( wb.__dict__
URL_TEMPLATE_NAME % WORKBOOK['name'], )
json.dumps(WORKBOOK))
mock.assert_called_once_with(URL_TEMPLATE, json.dumps(WORKBOOK))
def test_list(self): def test_list(self):
mock = self.mock_http_get(content={'workbooks': [WORKBOOK]}) mock = self.mock_http_get(content={'workbooks': [WORKBOOK]})
@@ -87,25 +83,32 @@ class TestWorkbooksV2(base.BaseClientV2Test):
workbook_list = self.workbooks.list() workbook_list = self.workbooks.list()
self.assertEqual(1, len(workbook_list)) self.assertEqual(1, len(workbook_list))
wb = workbook_list[0] wb = workbook_list[0]
self.assertEqual(workbooks.Workbook(self.workbooks, self.assertEqual(
WORKBOOK).__dict__, wb.__dict__) workbooks.Workbook(self.workbooks, WORKBOOK).__dict__,
wb.__dict__
)
mock.assert_called_once_with(URL_TEMPLATE) mock.assert_called_once_with(URL_TEMPLATE)
def test_get(self): def test_get(self):
mock = self.mock_http_get(content=WORKBOOK) mock = self.mock_http_get(content=WORKBOOK)
wb = self.workbooks.get(WORKBOOK['name']) wb = self.workbooks.get('wb')
self.assertIsNotNone(wb) self.assertIsNotNone(wb)
self.assertEqual(workbooks.Workbook(self.workbooks, self.assertEqual(
WORKBOOK).__dict__, wb.__dict__) workbooks.Workbook(self.workbooks, WORKBOOK).__dict__,
mock.assert_called_once_with(URL_TEMPLATE_NAME % WORKBOOK['name']) wb.__dict__
)
mock.assert_called_once_with(URL_TEMPLATE_NAME % 'wb')
def test_delete(self): def test_delete(self):
mock = self.mock_http_delete(status_code=204) 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')