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):
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')

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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)

View File

@@ -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

View File

@@ -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')