Removing 'name' and 'tags' from workflow API and CLI
Change-Id: Ib4e9243a655175aadb76f937d8dff1e13d0c898c
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
@@ -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')
|
||||||
|
@@ -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):
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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):
|
||||||
|
Reference in New Issue
Block a user