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): def _list(self, url, response_key=None):
resp = self.client.http_client.get(url) resp = self.client.http_client.get(url)
if resp.status_code == 200: if resp.status_code != 200:
return [self.resource_class(self, resource_data)
for resource_data in extract_json(resp, response_key)]
else:
self._raise_api_exception(resp) 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): def _get(self, url, response_key=None):
resp = self.client.http_client.get(url) resp = self.client.http_client.get(url)

View File

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

View File

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

View File

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

View File

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