Removing 'name' and 'tags' from workflow API and CLI

Change-Id: Ib4e9243a655175aadb76f937d8dff1e13d0c898c
This commit is contained in:
Renat Akhmerov
2014-09-22 16:10:31 -07:00
parent 6920a5eb86
commit d994cad38c
5 changed files with 70 additions and 112 deletions

View File

@@ -107,12 +107,12 @@ class ResourceManager(object):
def _list(self, url, response_key=None):
resp = self.client.http_client.get(url)
if resp.status_code == 200:
return [self.resource_class(self, resource_data)
for resource_data in extract_json(resp, response_key)]
else:
if resp.status_code != 200:
self._raise_api_exception(resp)
return [self.resource_class(self, resource_data)
for resource_data in extract_json(resp, response_key)]
def _get(self, url, response_key=None):
resp = self.client.http_client.get(url)

View File

@@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import json
from mistralclient.api import base
@@ -22,29 +24,33 @@ class Workflow(base.Resource):
class WorkflowManager(base.ResourceManager):
resource_class = Workflow
def create(self, name, definition, tags=None):
self._ensure_not_empty(name=name, definition=definition)
def create(self, definition):
self._ensure_not_empty(definition=definition)
data = {
'name': name,
'definition': definition,
'tags': tags,
}
resp = self.client.http_client.post(
'/workflows',
json.dumps({'definition': definition})
)
return self._create('/workflows', data)
if resp.status_code != 201:
self._raise_api_exception(resp)
def update(self, name, definition=None, tags=None):
self._ensure_not_empty(name=name)
return [self.resource_class(self, resource_data)
for resource_data in base.extract_json(resp, 'workflows')]
data = {
'name': name,
'tags': tags,
}
def update(self, definition):
self._ensure_not_empty(definition=definition)
if definition:
data.update({'definition': definition})
resp = self.client.http_client.put(
'/workflows',
json.dumps({'definition': definition})
)
return self._update('/workflows/%s' % name, data)
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, 'workflows')]
def list(self):
return self._list('/workflows', response_key='workflows')

View File

@@ -35,10 +35,12 @@ def format(workflow=None):
)
if workflow:
tags = getattr(workflow, 'tags', None) or []
data = (
workflow.name,
', '.join(workflow.tags or '') or '<none>',
workflow.created_at,
', '.join(tags) or '<none>',
workflow.created_at
)
if hasattr(workflow, 'updated_at'):
@@ -55,10 +57,9 @@ class List(lister.Lister):
"""List all workflows."""
def take_action(self, parsed_args):
data = [
format(workflow)[1] for workflow
in workflows.WorkflowManager(self.app.client).list()
]
wf_list = workflows.WorkflowManager(self.app.client).list()
data = [format(wf)[1] for wf in wf_list]
if data:
return format()[0], data
@@ -77,27 +78,19 @@ class Get(show.ShowOne):
return parser
def take_action(self, parsed_args):
workflow = workflows.WorkflowManager(self.app.client).get(
parsed_args.name)
wf = workflows.WorkflowManager(self.app.client).get(parsed_args.name)
return format(workflow)
return format(wf)
class Create(show.ShowOne):
class Create(lister.Lister):
"""Create new workflow."""
def get_parser(self, prog_name):
parser = super(Create, self).get_parser(prog_name)
parser.add_argument('name', help='Workflow name')
parser.add_argument(
'tags',
nargs='?',
help='Workflow tags separated by ","'
)
parser.add_argument(
'definition',
nargs='?',
type=argparse.FileType('r'),
help='Workflow definition file'
)
@@ -109,12 +102,15 @@ class Create(show.ShowOne):
raise RuntimeError("You must provide path to workflow "
"definition file.")
workflow = workflows.WorkflowManager(self.app.client)\
.create(parsed_args.name,
parsed_args.definition.read(),
str(parsed_args.tags).split(','))
wf_list = workflows.WorkflowManager(self.app.client)\
.create(parsed_args.definition.read())
return format(workflow)
data = [format(wf)[1] for wf in wf_list]
if data:
return format()[0], data
else:
return format()
class Delete(command.Command):
@@ -131,62 +127,30 @@ class Delete(command.Command):
workflows.WorkflowManager(self.app.client).delete(parsed_args.name)
class Update(show.ShowOne):
class Update(lister.Lister):
"""Update workflow."""
def get_parser(self, prog_name):
parser = super(Update, self).get_parser(prog_name)
parser.add_argument('name', help='Workflow name')
parser.add_argument(
'tags',
nargs='?',
help='Workflow tags separated by ","'
)
parser.add_argument(
'definition',
nargs='?',
type=argparse.FileType('r'),
help='Workflow definition'
)
return parser
def take_action(self, parsed_args):
if parsed_args.definition:
workflow = workflows.WorkflowManager(self.app.client)\
.update(parsed_args.name,
open(parsed_args.definition).read(),
str(parsed_args.tags).split(','))
wf_list = workflows.WorkflowManager(self.app.client)\
.update(parsed_args.definition.read())
data = [format(wf)[1] for wf in wf_list]
if data:
return format()[0], data
else:
workflow = workflows.WorkflowManager(self.app.client)\
.update(parsed_args.name,
None,
str(parsed_args.tags).split(','))
return format(workflow)
class UploadDefinition(command.Command):
"""Upload workflow definition."""
def get_parser(self, prog_name):
parser = super(UploadDefinition, self).get_parser(prog_name)
parser.add_argument('name', help='Workflow name')
parser.add_argument(
'path',
type=argparse.FileType('r'),
help='Workflow definition file'
)
return parser
def take_action(self, parsed_args):
workflow = workflows.WorkflowManager(self.app.client)\
.update(parsed_args.name,
definition=parsed_args.path.read())
self.app.stdout.write(workflow.definition or "\n")
return format()
class GetDefinition(command.Command):

View File

@@ -268,8 +268,6 @@ class MistralShell(app.App):
'workflow-create': mistralclient.commands.v2.workflows.Create,
'workflow-delete': mistralclient.commands.v2.workflows.Delete,
'workflow-update': mistralclient.commands.v2.workflows.Update,
'workflow-upload-definition':
mistralclient.commands.v2.workflows.UploadDefinition,
'workflow-get-definition':
mistralclient.commands.v2.workflows.GetDefinition
}

View File

@@ -30,9 +30,12 @@ WORKFLOW_DICT = {
}
WF_DEF = """
tasks:
task1:
action: nova.servers_get server="1"
version: '2.0'
flow:
tasks:
task1:
action: nova.servers_get server="1"
"""
WF_WITH_DEF_DICT = WORKFLOW_DICT.copy()
@@ -45,21 +48,22 @@ class TestCLIWorkflowsV2(base.BaseCommandTest):
@mock.patch('argparse.open', create=True)
@mock.patch('mistralclient.api.v2.workflows.WorkflowManager.create')
def test_create(self, mock, mock_open):
mock.return_value = WORKFLOW
mock.return_value = (WORKFLOW,)
mock_open.return_value = mock.MagicMock(spec=file)
result = self.call(workflow_cmd.Create,
app_args=['name', 'tag', '1.txt'])
result = self.call(workflow_cmd.Create, app_args=['1.txt'])
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.workflows.WorkflowManager.update')
def test_update(self, mock):
mock.return_value = WORKFLOW
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=['name'])
result = self.call(workflow_cmd.Update, app_args=['1.txt'])
self.assertEqual(('a', 'a, b', '1', '1'), result[1])
self.assertEqual([('a', 'a, b', '1', '1')], result[1])
@mock.patch('mistralclient.api.v2.workflows.WorkflowManager.list')
def test_list(self, mock):
@@ -81,20 +85,6 @@ class TestCLIWorkflowsV2(base.BaseCommandTest):
def test_delete(self, mock):
self.assertIsNone(self.call(workflow_cmd.Delete, app_args=['name']))
@mock.patch('argparse.open', create=True)
@mock.patch(
'mistralclient.api.v2.workflows.WorkflowManager.update'
)
def test_upload_definition(self, mock, mock_open):
mock.return_value = WORKFLOW_WITH_DEF
mock_open.return_value = mock.MagicMock(spec=file)
result = self.call(workflow_cmd.UploadDefinition,
app_args=['name', '1.txt'])
self.assertIsNone(result)
self.app.stdout.write.assert_called_with(WF_DEF)
@mock.patch('mistralclient.api.v2.workflows.'
'WorkflowManager.get')
def test_get_definition(self, mock):