Files
python-mistralclient/mistralclient/commands/v2/members.py
Bob Haddleton d53da3629f Provide consistent options and return latest execution entries
This patchset updates the *-list commands to have consistent
definitions of the sort_keys/sort_dirs/limit/filter/marker
options.  It also modified the execution-list, action-execution-list
and task-list commands to return the MOST RECENT entries by
default, when no other sort_key, sort_dir or marker options are
provided, rather than the oldest entries.  There is a new --oldest
option for these three commands to allow the user to access the
oldest entries instead of the newest.

A release note has also been created.

Change-Id: I002edd1b10ab281072cfa7501cfa763073a7781c
2018-12-19 20:51:39 -06:00

234 lines
6.5 KiB
Python

# Copyright 2016 - Catalyst IT Limited
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
from osc_lib.command import command
from mistralclient.commands.v2 import base
from mistralclient import exceptions
class MemberFormatter(base.MistralFormatter):
COLUMNS = [
('resource_id', 'Resource ID'),
('resource_type', 'Resource Type'),
('project_id', 'Resource Owner'),
('member_id', 'Member ID'),
('status', 'Status'),
('created_at', 'Created at'),
('updated_at', 'Updated at')
]
@staticmethod
def format(member=None, lister=False):
if member:
data = (
member.resource_id,
member.resource_type,
member.project_id,
member.member_id,
member.status,
member.created_at,
)
if hasattr(member, 'updated_at'):
data += (member.updated_at,)
else:
data += (None,)
else:
data = (tuple('' for _ in range(len(MemberFormatter.COLUMNS))),)
return MemberFormatter.headings(), data
class List(base.MistralLister):
"""List all members."""
def _get_format_function(self):
return MemberFormatter.format_list
def get_parser(self, parsed_args):
parser = super(List, self).get_parser(parsed_args)
parser.add_argument(
'resource_id',
help='Resource id to be shared.'
)
parser.add_argument(
'resource_type',
help='Resource type.'
)
return parser
def _get_resources(self, parsed_args):
mistral_client = self.app.client_manager.workflow_engine
return mistral_client.members.list(
parsed_args.resource_id,
parsed_args.resource_type
)
class Get(command.ShowOne):
"""Show specific member information."""
def get_parser(self, prog_name):
parser = super(Get, self).get_parser(prog_name)
parser.add_argument(
'resource',
help='Resource ID to be shared.'
)
parser.add_argument(
'resource_type',
help='Resource type.'
)
parser.add_argument(
'-m',
'--member-id',
default='',
help='Project ID to whom the resource is shared to. No need to '
'provide this param if you are the resource member.'
)
return parser
def take_action(self, parsed_args):
mistral_client = self.app.client_manager.workflow_engine
member = mistral_client.members.get(
parsed_args.resource,
parsed_args.resource_type,
parsed_args.member_id,
)
return MemberFormatter.format(member)
class Create(command.ShowOne):
"""Shares a resource to another tenant."""
def get_parser(self, prog_name):
parser = super(Create, self).get_parser(prog_name)
parser.add_argument(
'resource_id',
help='Resource ID to be shared.'
)
parser.add_argument(
'resource_type',
help='Resource type.'
)
parser.add_argument(
'member_id',
help='Project ID to whom the resource is shared to.'
)
return parser
def take_action(self, parsed_args):
mistral_client = self.app.client_manager.workflow_engine
member = mistral_client.members.create(
parsed_args.resource_id,
parsed_args.resource_type,
parsed_args.member_id,
)
return MemberFormatter.format(member)
class Delete(command.Command):
"""Delete a resource sharing relationship."""
def get_parser(self, prog_name):
parser = super(Delete, self).get_parser(prog_name)
parser.add_argument(
'resource',
help='Resource ID to be shared.'
)
parser.add_argument(
'resource_type',
help='Resource type.'
)
parser.add_argument(
'member_id',
help='Project ID to whom the resource is shared to.'
)
return parser
def take_action(self, parsed_args):
mistral_client = self.app.client_manager.workflow_engine
try:
mistral_client.members.delete(
parsed_args.resource,
parsed_args.resource_type,
parsed_args.member_id,
)
print(
"Request to delete %s member %s has been accepted." %
(parsed_args.resource_type, parsed_args.member_id)
)
except Exception as e:
print(e)
error_msg = "Unable to delete the specified member."
raise exceptions.MistralClientException(error_msg)
class Update(command.ShowOne):
"""Update resource sharing status."""
def get_parser(self, prog_name):
parser = super(Update, self).get_parser(prog_name)
parser.add_argument(
'resource_id',
help='Resource ID to be shared.'
)
parser.add_argument(
'resource_type',
help='Resource type.'
)
parser.add_argument(
'-m',
'--member-id',
default='',
help='Project ID to whom the resource is shared to. No need to '
'provide this param if you are the resource member.'
)
parser.add_argument(
'-s',
'--status',
default='accepted',
choices=['pending', 'accepted', 'rejected'],
help='status of the sharing.'
)
return parser
def take_action(self, parsed_args):
mistral_client = self.app.client_manager.workflow_engine
member = mistral_client.members.update(
parsed_args.resource_id,
parsed_args.resource_type,
parsed_args.member_id,
status=parsed_args.status
)
return MemberFormatter.format(member)