diff options
Diffstat (limited to 'openstackclient')
32 files changed, 304 insertions, 183 deletions
diff --git a/openstackclient/api/api.py b/openstackclient/api/api.py index 67386aaf..90b4e9c3 100644 --- a/openstackclient/api/api.py +++ b/openstackclient/api/api.py @@ -15,8 +15,7 @@ import simplejson as json -from keystoneclient.openstack.common.apiclient \ - import exceptions as ksc_exceptions +from keystoneclient import exceptions as ksc_exceptions from keystoneclient import session as ksc_session from openstackclient.common import exceptions diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py index 3725350a..166747d5 100644 --- a/openstackclient/compute/client.py +++ b/openstackclient/compute/client.py @@ -50,6 +50,7 @@ def make_client(instance): extensions=extensions, http_log_debug=http_log_debug, timings=instance.timing, + region_name=instance._region_name, ) return client diff --git a/openstackclient/compute/v2/security_group.py b/openstackclient/compute/v2/security_group.py index cd330857..f7ffb1d1 100644 --- a/openstackclient/compute/v2/security_group.py +++ b/openstackclient/compute/v2/security_group.py @@ -23,7 +23,7 @@ from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from novaclient.v1_1 import security_group_rules from openstackclient.common import parseractions from openstackclient.common import utils diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 5ab1d5f3..a5d8b0c3 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -511,25 +511,27 @@ class CreateServerImage(show.ShowOne): class DeleteServer(command.Command): - """Delete server command""" + """Delete server(s)""" log = logging.getLogger(__name__ + '.DeleteServer') def get_parser(self, prog_name): parser = super(DeleteServer, self).get_parser(prog_name) parser.add_argument( - 'server', + 'servers', metavar='<server>', - help=_('Server (name or ID)'), + nargs="+", + help=_('Server(s) to delete (name or ID)'), ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) compute_client = self.app.client_manager.compute - server = utils.find_resource( - compute_client.servers, parsed_args.server) - compute_client.servers.delete(server.id) + for server in parsed_args.servers: + server_obj = utils.find_resource( + compute_client.servers, server) + compute_client.servers.delete(server_obj.id) return diff --git a/openstackclient/identity/v2_0/project.py b/openstackclient/identity/v2_0/project.py index b2f99425..9b195600 100644 --- a/openstackclient/identity/v2_0/project.py +++ b/openstackclient/identity/v2_0/project.py @@ -21,7 +21,7 @@ import six from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import parseractions from openstackclient.common import utils @@ -104,16 +104,17 @@ class CreateProject(show.ShowOne): class DeleteProject(command.Command): - """Delete an existing project""" + """Delete project(s)""" log = logging.getLogger(__name__ + '.DeleteProject') def get_parser(self, prog_name): parser = super(DeleteProject, self).get_parser(prog_name) parser.add_argument( - 'project', + 'projects', metavar='<project>', - help=_('Project to delete (name or ID)'), + nargs="+", + help=_('Project(s) to delete (name or ID)'), ) return parser @@ -121,12 +122,12 @@ class DeleteProject(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity - project = utils.find_resource( - identity_client.tenants, - parsed_args.project, - ) - - identity_client.tenants.delete(project.id) + for project in parsed_args.projects: + project_obj = utils.find_resource( + identity_client.tenants, + project, + ) + identity_client.tenants.delete(project_obj.id) return diff --git a/openstackclient/identity/v2_0/role.py b/openstackclient/identity/v2_0/role.py index cec95095..d03664e0 100644 --- a/openstackclient/identity/v2_0/role.py +++ b/openstackclient/identity/v2_0/role.py @@ -21,7 +21,7 @@ import six from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import exceptions from openstackclient.common import utils @@ -114,16 +114,17 @@ class CreateRole(show.ShowOne): class DeleteRole(command.Command): - """Delete an existing role""" + """Delete role(s)""" log = logging.getLogger(__name__ + '.DeleteRole') def get_parser(self, prog_name): parser = super(DeleteRole, self).get_parser(prog_name) parser.add_argument( - 'role', + 'roles', metavar='<role>', - help=_('Role to delete (name or ID)'), + nargs="+", + help=_('Role(s) to delete (name or ID)'), ) return parser @@ -131,12 +132,12 @@ class DeleteRole(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity - role = utils.find_resource( - identity_client.roles, - parsed_args.role, - ) - - identity_client.roles.delete(role.id) + for role in parsed_args.roles: + role_obj = utils.find_resource( + identity_client.roles, + role, + ) + identity_client.roles.delete(role_obj.id) return diff --git a/openstackclient/identity/v2_0/user.py b/openstackclient/identity/v2_0/user.py index 955e19e7..b5bbce3b 100644 --- a/openstackclient/identity/v2_0/user.py +++ b/openstackclient/identity/v2_0/user.py @@ -21,7 +21,7 @@ import six from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -128,16 +128,17 @@ class CreateUser(show.ShowOne): class DeleteUser(command.Command): - """Delete user""" + """Delete user(s)""" log = logging.getLogger(__name__ + '.DeleteUser') def get_parser(self, prog_name): parser = super(DeleteUser, self).get_parser(prog_name) parser.add_argument( - 'user', + 'users', metavar='<user>', - help=_('User to delete (name or ID)'), + nargs="+", + help=_('User(s) to delete (name or ID)'), ) return parser @@ -145,12 +146,12 @@ class DeleteUser(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity - user = utils.find_resource( - identity_client.users, - parsed_args.user, - ) - - identity_client.users.delete(user.id) + for user in parsed_args.users: + user_obj = utils.find_resource( + identity_client.users, + user, + ) + identity_client.users.delete(user_obj.id) return diff --git a/openstackclient/identity/v3/domain.py b/openstackclient/identity/v3/domain.py index 1233fea5..727f5b18 100644 --- a/openstackclient/identity/v3/domain.py +++ b/openstackclient/identity/v3/domain.py @@ -22,14 +22,14 @@ import sys from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import utils from openstackclient.i18n import _ # noqa class CreateDomain(show.ShowOne): - """Create domain command""" + """Create new domain""" log = logging.getLogger(__name__ + '.CreateDomain') @@ -42,7 +42,7 @@ class CreateDomain(show.ShowOne): ) parser.add_argument( '--description', - metavar='<domain-description>', + metavar='<description>', help='New domain description', ) enable_group = parser.add_mutually_exclusive_group() @@ -87,7 +87,7 @@ class CreateDomain(show.ShowOne): class DeleteDomain(command.Command): - """Delete domain command""" + """Delete domain""" log = logging.getLogger(__name__ + '.DeleteDomain') @@ -96,7 +96,7 @@ class DeleteDomain(command.Command): parser.add_argument( 'domain', metavar='<domain>', - help='Name or ID of domain to delete', + help='Domain to delete (name or ID)', ) return parser @@ -110,7 +110,7 @@ class DeleteDomain(command.Command): class ListDomain(lister.Lister): - """List domain command""" + """List domains""" log = logging.getLogger(__name__ + '.ListDomain') @@ -126,7 +126,7 @@ class ListDomain(lister.Lister): class SetDomain(command.Command): - """Set domain command""" + """Set domain properties""" log = logging.getLogger(__name__ + '.SetDomain') @@ -135,16 +135,16 @@ class SetDomain(command.Command): parser.add_argument( 'domain', metavar='<domain>', - help='Name or ID of domain to change', + help='Domain to modify (name or ID)', ) parser.add_argument( '--name', - metavar='<new-domain-name>', + metavar='<name>', help='New domain name', ) parser.add_argument( '--description', - metavar='<domain-description>', + metavar='<description>', help='New domain description', ) enable_group = parser.add_mutually_exclusive_group() @@ -152,7 +152,7 @@ class SetDomain(command.Command): '--enable', dest='enabled', action='store_true', - help='Enable domain (default)', + help='Enable domain', ) enable_group.add_argument( '--disable', @@ -185,7 +185,7 @@ class SetDomain(command.Command): class ShowDomain(show.ShowOne): - """Show domain command""" + """Show domain details""" log = logging.getLogger(__name__ + '.ShowDomain') @@ -194,7 +194,7 @@ class ShowDomain(show.ShowOne): parser.add_argument( 'domain', metavar='<domain>', - help='Name or ID of domain to display', + help='Domain to display (name or ID)', ) return parser diff --git a/openstackclient/identity/v3/group.py b/openstackclient/identity/v3/group.py index 5d3cf642..fbd8dd72 100644 --- a/openstackclient/identity/v3/group.py +++ b/openstackclient/identity/v3/group.py @@ -22,7 +22,7 @@ import sys from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -39,12 +39,12 @@ class AddUserToGroup(command.Command): parser.add_argument( 'group', metavar='<group>', - help='Group name or ID that user will be added to', + help='Group that user will be added to (name or ID)', ) parser.add_argument( 'user', metavar='<user>', - help='User name or ID to add to group', + help='User to add to group (name or ID)', ) return parser @@ -68,7 +68,7 @@ class AddUserToGroup(command.Command): class CheckUserInGroup(command.Command): - """Checks that user is in a specific group""" + """Check user in group""" log = logging.getLogger(__name__ + '.CheckUserInGroup') @@ -77,12 +77,12 @@ class CheckUserInGroup(command.Command): parser.add_argument( 'group', metavar='<group>', - help='Group name or ID that user will be added to', + help='Group to check if user belongs to (name or ID)', ) parser.add_argument( 'user', metavar='<user>', - help='User name or ID to add to group', + help='User to check (name or ID)', ) return parser @@ -106,7 +106,7 @@ class CheckUserInGroup(command.Command): class CreateGroup(show.ShowOne): - """Create group command""" + """Create new group""" log = logging.getLogger(__name__ + '.CreateGroup') @@ -118,11 +118,11 @@ class CreateGroup(show.ShowOne): help='New group name') parser.add_argument( '--description', - metavar='<group-description>', + metavar='<description>', help='New group description') parser.add_argument( '--domain', - metavar='<group-domain>', + metavar='<domain>', help='References the domain ID or name which owns the group') parser.add_argument( '--or-show', @@ -159,16 +159,17 @@ class CreateGroup(show.ShowOne): class DeleteGroup(command.Command): - """Delete group command""" + """Delete group(s)""" log = logging.getLogger(__name__ + '.DeleteGroup') def get_parser(self, prog_name): parser = super(DeleteGroup, self).get_parser(prog_name) parser.add_argument( - 'group', + 'groups', metavar='<group>', - help='Name or ID of group to delete') + nargs="+", + help='Group(s) to delete (name or ID)') parser.add_argument( '--domain', metavar='<domain>', @@ -180,16 +181,18 @@ class DeleteGroup(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity + domain = None if parsed_args.domain: domain = common.find_domain(identity_client, parsed_args.domain) - group = utils.find_resource(identity_client.groups, - parsed_args.group, - domain_id=domain.id) - else: - group = utils.find_resource(identity_client.groups, - parsed_args.group) - - identity_client.groups.delete(group.id) + for group in parsed_args.groups: + if domain is not None: + group_obj = utils.find_resource(identity_client.groups, + group, + domain_id=domain.id) + else: + group_obj = utils.find_resource(identity_client.groups, + group) + identity_client.groups.delete(group_obj.id) return @@ -265,12 +268,12 @@ class RemoveUserFromGroup(command.Command): parser.add_argument( 'group', metavar='<group>', - help='Group name or ID that user will be removed from', + help='Group that user will be removed from (name or ID)', ) parser.add_argument( 'user', metavar='<user>', - help='User name or ID to remove from group', + help='User to remove from group (name or ID)', ) return parser @@ -294,7 +297,7 @@ class RemoveUserFromGroup(command.Command): class SetGroup(command.Command): - """Set group command""" + """Set group properties""" log = logging.getLogger(__name__ + '.SetGroup') @@ -303,18 +306,18 @@ class SetGroup(command.Command): parser.add_argument( 'group', metavar='<group>', - help='Name or ID of group to change') + help='Group to modify (name or ID)') parser.add_argument( '--name', - metavar='<new-group-name>', + metavar='<name>', help='New group name') parser.add_argument( '--domain', - metavar='<group-domain>', - help='New domain name or ID that will now own the group') + metavar='<domain>', + help='New domain that will now own the group (name or ID)') parser.add_argument( '--description', - metavar='<group-description>', + metavar='<description>', help='New group description') return parser @@ -338,7 +341,7 @@ class SetGroup(command.Command): class ShowGroup(show.ShowOne): - """Show group command""" + """Show group details""" log = logging.getLogger(__name__ + '.ShowGroup') @@ -347,7 +350,7 @@ class ShowGroup(show.ShowOne): parser.add_argument( 'group', metavar='<group>', - help='Name or ID of group to display', + help='Group to display (name or ID)', ) parser.add_argument( '--domain', diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py index 2c2d408e..28eb4277 100644 --- a/openstackclient/identity/v3/project.py +++ b/openstackclient/identity/v3/project.py @@ -21,7 +21,7 @@ import six from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import parseractions from openstackclient.common import utils @@ -117,16 +117,17 @@ class CreateProject(show.ShowOne): class DeleteProject(command.Command): - """Delete an existing project""" + """Delete project(s)""" log = logging.getLogger(__name__ + '.DeleteProject') def get_parser(self, prog_name): parser = super(DeleteProject, self).get_parser(prog_name) parser.add_argument( - 'project', + 'projects', metavar='<project>', - help='Project to delete (name or ID)', + nargs="+", + help='Project(s) to delete (name or ID)', ) parser.add_argument( '--domain', @@ -139,16 +140,18 @@ class DeleteProject(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity + domain = None if parsed_args.domain: domain = common.find_domain(identity_client, parsed_args.domain) - project = utils.find_resource(identity_client.projects, - parsed_args.project, - domain_id=domain.id) - else: - project = utils.find_resource(identity_client.projects, - parsed_args.project) - - identity_client.projects.delete(project.id) + for project in parsed_args.projects: + if domain is not None: + project_obj = utils.find_resource(identity_client.projects, + project, + domain_id=domain.id) + else: + project_obj = utils.find_resource(identity_client.projects, + project) + identity_client.projects.delete(project_obj.id) return diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py index 017ffd76..d680278e 100644 --- a/openstackclient/identity/v3/role.py +++ b/openstackclient/identity/v3/role.py @@ -22,7 +22,7 @@ import sys from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -177,16 +177,17 @@ class CreateRole(show.ShowOne): class DeleteRole(command.Command): - """Delete an existing role""" + """Delete role(s)""" log = logging.getLogger(__name__ + '.DeleteRole') def get_parser(self, prog_name): parser = super(DeleteRole, self).get_parser(prog_name) parser.add_argument( - 'role', + 'roles', metavar='<role>', - help='Role to delete (name or ID)', + nargs="+", + help='Role(s) to delete (name or ID)', ) return parser @@ -194,12 +195,12 @@ class DeleteRole(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity - role = utils.find_resource( - identity_client.roles, - parsed_args.role, - ) - - identity_client.roles.delete(role.id) + for role in parsed_args.roles: + role_obj = utils.find_resource( + identity_client.roles, + role, + ) + identity_client.roles.delete(role_obj.id) return diff --git a/openstackclient/identity/v3/role_assignment.py b/openstackclient/identity/v3/role_assignment.py index 5cc97e8d..f053b608 100644 --- a/openstackclient/identity/v3/role_assignment.py +++ b/openstackclient/identity/v3/role_assignment.py @@ -21,7 +21,7 @@ from openstackclient.common import utils class ListRoleAssignment(lister.Lister): - """Lists role assignments according to the given filters""" + """List role assignments""" log = logging.getLogger(__name__ + '.ListRoleAssignment') @@ -36,29 +36,29 @@ class ListRoleAssignment(lister.Lister): parser.add_argument( '--role', metavar='<role>', - help='Name or ID of role to filter', + help='Role to filter (name or ID)', ) user_or_group = parser.add_mutually_exclusive_group() user_or_group.add_argument( '--user', metavar='<user>', - help='Name or ID of user to filter', + help='User to filter (name or ID)', ) user_or_group.add_argument( '--group', metavar='<group>', - help='Name or ID of group to filter', + help='Group to filter (name or ID)', ) domain_or_project = parser.add_mutually_exclusive_group() domain_or_project.add_argument( '--domain', metavar='<domain>', - help='Name or ID of domain to filter', + help='Domain to filter (name or ID)', ) domain_or_project.add_argument( '--project', metavar='<project>', - help='Name or ID of project to filter', + help='Project to filter (name or ID)', ) return parser diff --git a/openstackclient/identity/v3/service.py b/openstackclient/identity/v3/service.py index 4f622269..f4c5d426 100644 --- a/openstackclient/identity/v3/service.py +++ b/openstackclient/identity/v3/service.py @@ -43,6 +43,11 @@ class CreateService(show.ShowOne): metavar='<service-name>', help='New service name', ) + parser.add_argument( + '--description', + metavar='<description>', + help='New service description', + ) enable_group = parser.add_mutually_exclusive_group() enable_group.add_argument( '--enable', @@ -67,6 +72,7 @@ class CreateService(show.ShowOne): service = identity_client.services.create( name=parsed_args.name, type=parsed_args.type, + description=parsed_args.description, enabled=enabled, ) @@ -137,6 +143,11 @@ class SetService(command.Command): metavar='<service-name>', help='New service name', ) + parser.add_argument( + '--description', + metavar='<description>', + help='New service description', + ) enable_group = parser.add_mutually_exclusive_group() enable_group.add_argument( '--enable', @@ -156,6 +167,7 @@ class SetService(command.Command): if (not parsed_args.name and not parsed_args.type + and not parsed_args.description and not parsed_args.enable and not parsed_args.disable): return @@ -167,6 +179,8 @@ class SetService(command.Command): kwargs['type'] = parsed_args.type if parsed_args.name: kwargs['name'] = parsed_args.name + if parsed_args.description: + kwargs['description'] = parsed_args.description if parsed_args.enable: kwargs['enabled'] = True if parsed_args.disable: diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py index 665dd4bb..dc5468ff 100644 --- a/openstackclient/identity/v3/user.py +++ b/openstackclient/identity/v3/user.py @@ -21,7 +21,7 @@ import six from cliff import command from cliff import lister from cliff import show -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -137,16 +137,17 @@ class CreateUser(show.ShowOne): class DeleteUser(command.Command): - """Delete user""" + """Delete user(s)""" log = logging.getLogger(__name__ + '.DeleteUser') def get_parser(self, prog_name): parser = super(DeleteUser, self).get_parser(prog_name) parser.add_argument( - 'user', + 'users', metavar='<user>', - help='User to delete (name or ID)', + nargs="+", + help='User(s) to delete (name or ID)', ) parser.add_argument( '--domain', @@ -159,16 +160,18 @@ class DeleteUser(command.Command): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity + domain = None if parsed_args.domain: domain = common.find_domain(identity_client, parsed_args.domain) - user = utils.find_resource(identity_client.users, - parsed_args.user, - domain_id=domain.id) - else: - user = utils.find_resource(identity_client.users, - parsed_args.user) - - identity_client.users.delete(user.id) + for user in parsed_args.users: + if domain is not None: + user_obj = utils.find_resource(identity_client.users, + user, + domain_id=domain.id) + else: + user_obj = utils.find_resource(identity_client.users, + user) + identity_client.users.delete(user_obj.id) return diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index 32dd388c..ca1eead4 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -262,16 +262,17 @@ class CreateImage(show.ShowOne): class DeleteImage(command.Command): - """Delete an image""" + """Delete image(s)""" log = logging.getLogger(__name__ + ".DeleteImage") def get_parser(self, prog_name): parser = super(DeleteImage, self).get_parser(prog_name) parser.add_argument( - "image", + "images", metavar="<image>", - help="Name or ID of image to delete", + nargs="+", + help="Image(s) to delete (name or ID)", ) return parser @@ -279,11 +280,12 @@ class DeleteImage(command.Command): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image - image = utils.find_resource( - image_client.images, - parsed_args.image, - ) - image_client.images.delete(image.id) + for image in parsed_args.images: + image_obj = utils.find_resource( + image_client.images, + image, + ) + image_client.images.delete(image_obj.id) class ListImage(lister.Lister): diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index c12ff11a..63351c6d 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -27,16 +27,17 @@ from openstackclient.common import utils class DeleteImage(command.Command): - """Delete an image""" + """Delete image(s)""" log = logging.getLogger(__name__ + ".DeleteImage") def get_parser(self, prog_name): parser = super(DeleteImage, self).get_parser(prog_name) parser.add_argument( - "image", + "images", metavar="<image>", - help="Name or ID of image to delete", + nargs="+", + help="Image(s) to delete (name or ID)", ) return parser @@ -44,11 +45,12 @@ class DeleteImage(command.Command): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image - image = utils.find_resource( - image_client.images, - parsed_args.image, - ) - image_client.images.delete(image.id) + for image in parsed_args.images: + image_obj = utils.find_resource( + image_client.images, + image, + ) + image_client.images.delete(image_obj.id) class ListImage(lister.Lister): diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py index f34666ba..0d68f82d 100644 --- a/openstackclient/network/v2/network.py +++ b/openstackclient/network/v2/network.py @@ -86,26 +86,27 @@ class CreateNetwork(show.ShowOne): class DeleteNetwork(command.Command): - """Delete a network""" + """Delete network(s)""" log = logging.getLogger(__name__ + '.DeleteNetwork') def get_parser(self, prog_name): parser = super(DeleteNetwork, self).get_parser(prog_name) parser.add_argument( - 'identifier', + 'networks', metavar="<network>", - help=("Name or identifier of network to delete") + nargs="+", + help=("Network(s) to delete (name or ID)") ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network - _id = common.find(client, 'network', 'networks', - parsed_args.identifier) delete_method = getattr(client, "delete_network") - delete_method(_id) + for network in parsed_args.networks: + _id = common.find(client, 'network', 'networks', network) + delete_method(_id) return diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py index 19c13440..d51beef3 100644 --- a/openstackclient/tests/compute/v2/test_server.py +++ b/openstackclient/tests/compute/v2/test_server.py @@ -232,7 +232,7 @@ class TestServerDelete(TestServer): compute_fakes.server_id, ] verifylist = [ - ('server', compute_fakes.server_id), + ('servers', [compute_fakes.server_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/identity/v2_0/test_project.py b/openstackclient/tests/identity/v2_0/test_project.py index 833b5d84..0c5ef77f 100644 --- a/openstackclient/tests/identity/v2_0/test_project.py +++ b/openstackclient/tests/identity/v2_0/test_project.py @@ -15,7 +15,7 @@ import copy -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.identity.v2_0 import project from openstackclient.tests import fakes @@ -326,7 +326,7 @@ class TestProjectDelete(TestProject): identity_fakes.project_id, ] verifylist = [ - ('project', identity_fakes.project_id), + ('projects', [identity_fakes.project_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/identity/v2_0/test_role.py b/openstackclient/tests/identity/v2_0/test_role.py index 67467747..2e3a2863 100644 --- a/openstackclient/tests/identity/v2_0/test_role.py +++ b/openstackclient/tests/identity/v2_0/test_role.py @@ -16,7 +16,7 @@ import copy import mock -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.common import exceptions from openstackclient.identity.v2_0 import role @@ -234,7 +234,7 @@ class TestRoleDelete(TestRole): identity_fakes.role_name, ] verifylist = [ - ('role', identity_fakes.role_name), + ('roles', [identity_fakes.role_name]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/identity/v2_0/test_user.py b/openstackclient/tests/identity/v2_0/test_user.py index a025dd7d..ccdf240e 100644 --- a/openstackclient/tests/identity/v2_0/test_user.py +++ b/openstackclient/tests/identity/v2_0/test_user.py @@ -16,7 +16,7 @@ import copy import mock -from keystoneclient.openstack.common.apiclient import exceptions as ksc_exc +from keystoneclient import exceptions as ksc_exc from openstackclient.identity.v2_0 import user from openstackclient.tests import fakes from openstackclient.tests.identity.v2_0 import fakes as identity_fakes @@ -443,7 +443,7 @@ class TestUserDelete(TestUser): identity_fakes.user_id, ] verifylist = [ - ('user', identity_fakes.user_id), + ('users', [identity_fakes.user_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/identity/v3/fakes.py b/openstackclient/tests/identity/v3/fakes.py index 7acaa7f1..fbdac4ed 100644 --- a/openstackclient/tests/identity/v3/fakes.py +++ b/openstackclient/tests/identity/v3/fakes.py @@ -147,11 +147,13 @@ ROLE = { service_id = 's-123' service_name = 'Texaco' service_type = 'gas' +service_description = 'oil brand' SERVICE = { 'id': service_id, 'name': service_name, 'type': service_type, + 'description': service_description, 'enabled': True, 'links': base_url + 'services/' + service_id, } diff --git a/openstackclient/tests/identity/v3/test_project.py b/openstackclient/tests/identity/v3/test_project.py index 1060a277..d16f9732 100644 --- a/openstackclient/tests/identity/v3/test_project.py +++ b/openstackclient/tests/identity/v3/test_project.py @@ -353,7 +353,7 @@ class TestProjectDelete(TestProject): identity_fakes.project_id, ] verifylist = [ - ('project', identity_fakes.project_id), + ('projects', [identity_fakes.project_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/identity/v3/test_role.py b/openstackclient/tests/identity/v3/test_role.py index 3d2a402b..1a9e6aa7 100644 --- a/openstackclient/tests/identity/v3/test_role.py +++ b/openstackclient/tests/identity/v3/test_role.py @@ -271,7 +271,7 @@ class TestRoleDelete(TestRole): identity_fakes.role_name, ] verifylist = [ - ('role', identity_fakes.role_name), + ('roles', [identity_fakes.role_name]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/identity/v3/test_service.py b/openstackclient/tests/identity/v3/test_service.py index 57db77b1..5e4dc585 100644 --- a/openstackclient/tests/identity/v3/test_service.py +++ b/openstackclient/tests/identity/v3/test_service.py @@ -51,6 +51,7 @@ class TestServiceCreate(TestService): ] verifylist = [ ('name', identity_fakes.service_name), + ('description', None), ('enable', False), ('disable', False), ('type', identity_fakes.service_type), @@ -64,12 +65,50 @@ class TestServiceCreate(TestService): self.services_mock.create.assert_called_with( name=identity_fakes.service_name, type=identity_fakes.service_type, + description=None, enabled=True, ) - collist = ('enabled', 'id', 'name', 'type') + collist = ('description', 'enabled', 'id', 'name', 'type') self.assertEqual(columns, collist) datalist = ( + identity_fakes.service_description, + True, + identity_fakes.service_id, + identity_fakes.service_name, + identity_fakes.service_type, + ) + self.assertEqual(data, datalist) + + def test_service_create_description(self): + arglist = [ + '--description', identity_fakes.service_description, + identity_fakes.service_type, + ] + verifylist = [ + ('name', None), + ('description', identity_fakes.service_description), + ('enable', False), + ('disable', False), + ('type', identity_fakes.service_type), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + columns, data = self.cmd.take_action(parsed_args) + + # ServiceManager.create(name=, type=, enabled=, **kwargs) + self.services_mock.create.assert_called_with( + name=None, + type=identity_fakes.service_type, + description=identity_fakes.service_description, + enabled=True, + ) + + collist = ('description', 'enabled', 'id', 'name', 'type') + self.assertEqual(columns, collist) + datalist = ( + identity_fakes.service_description, True, identity_fakes.service_id, identity_fakes.service_name, @@ -84,6 +123,7 @@ class TestServiceCreate(TestService): ] verifylist = [ ('name', None), + ('description', None), ('enable', True), ('disable', False), ('type', identity_fakes.service_type), @@ -97,12 +137,14 @@ class TestServiceCreate(TestService): self.services_mock.create.assert_called_with( name=None, type=identity_fakes.service_type, + description=None, enabled=True, ) - collist = ('enabled', 'id', 'name', 'type') + collist = ('description', 'enabled', 'id', 'name', 'type') self.assertEqual(columns, collist) datalist = ( + identity_fakes.service_description, True, identity_fakes.service_id, identity_fakes.service_name, @@ -117,6 +159,7 @@ class TestServiceCreate(TestService): ] verifylist = [ ('name', None), + ('description', None), ('enable', False), ('disable', True), ('type', identity_fakes.service_type), @@ -130,12 +173,14 @@ class TestServiceCreate(TestService): self.services_mock.create.assert_called_with( name=None, type=identity_fakes.service_type, + description=None, enabled=False, ) - collist = ('enabled', 'id', 'name', 'type') + collist = ('description', 'enabled', 'id', 'name', 'type') self.assertEqual(columns, collist) datalist = ( + identity_fakes.service_description, True, identity_fakes.service_id, identity_fakes.service_name, @@ -239,6 +284,7 @@ class TestServiceSet(TestService): verifylist = [ ('type', None), ('name', None), + ('description', None), ('enable', False), ('disable', False), ('service', identity_fakes.service_name), @@ -256,6 +302,7 @@ class TestServiceSet(TestService): verifylist = [ ('type', identity_fakes.service_type), ('name', None), + ('description', None), ('enable', False), ('disable', False), ('service', identity_fakes.service_name), @@ -283,6 +330,7 @@ class TestServiceSet(TestService): verifylist = [ ('type', None), ('name', identity_fakes.service_name), + ('description', None), ('enable', False), ('disable', False), ('service', identity_fakes.service_name), @@ -302,6 +350,34 @@ class TestServiceSet(TestService): **kwargs ) + def test_service_set_description(self): + arglist = [ + '--description', identity_fakes.service_description, + identity_fakes.service_name, + ] + verifylist = [ + ('type', None), + ('name', None), + ('description', identity_fakes.service_description), + ('enable', False), + ('disable', False), + ('service', identity_fakes.service_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.run(parsed_args) + self.assertEqual(result, 0) + + # Set expected values + kwargs = { + 'description': identity_fakes.service_description, + } + # ServiceManager.update(service, name=, type=, enabled=, **kwargs) + self.services_mock.update.assert_called_with( + identity_fakes.service_id, + **kwargs + ) + def test_service_set_enable(self): arglist = [ '--enable', @@ -310,6 +386,7 @@ class TestServiceSet(TestService): verifylist = [ ('type', None), ('name', None), + ('description', None), ('enable', True), ('disable', False), ('service', identity_fakes.service_name), @@ -337,6 +414,7 @@ class TestServiceSet(TestService): verifylist = [ ('type', None), ('name', None), + ('description', None), ('enable', False), ('disable', True), ('service', identity_fakes.service_name), @@ -388,9 +466,10 @@ class TestServiceShow(TestService): identity_fakes.service_name, ) - collist = ('enabled', 'id', 'name', 'type') + collist = ('description', 'enabled', 'id', 'name', 'type') self.assertEqual(columns, collist) datalist = ( + identity_fakes.service_description, True, identity_fakes.service_id, identity_fakes.service_name, diff --git a/openstackclient/tests/identity/v3/test_user.py b/openstackclient/tests/identity/v3/test_user.py index bb59ebe5..9740ed82 100644 --- a/openstackclient/tests/identity/v3/test_user.py +++ b/openstackclient/tests/identity/v3/test_user.py @@ -461,7 +461,7 @@ class TestUserDelete(TestUser): identity_fakes.user_id, ] verifylist = [ - ('user', identity_fakes.user_id), + ('users', [identity_fakes.user_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/image/v1/test_image.py b/openstackclient/tests/image/v1/test_image.py index a0566930..4d21ac48 100644 --- a/openstackclient/tests/image/v1/test_image.py +++ b/openstackclient/tests/image/v1/test_image.py @@ -288,7 +288,7 @@ class TestImageDelete(TestImage): image_fakes.image_id, ] verifylist = [ - ('image', image_fakes.image_id), + ('images', [image_fakes.image_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py index 3e9eeebb..bc61a89f 100644 --- a/openstackclient/tests/image/v2/test_image.py +++ b/openstackclient/tests/image/v2/test_image.py @@ -51,7 +51,7 @@ class TestImageDelete(TestImage): image_fakes.image_id, ] verifylist = [ - ('image', image_fakes.image_id), + ('images', [image_fakes.image_id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py index 468db5e0..b893229f 100644 --- a/openstackclient/tests/network/v2/test_network.py +++ b/openstackclient/tests/network/v2/test_network.py @@ -120,7 +120,7 @@ class TestDeleteNetwork(common.TestNetworkBase): FAKE_NAME, ] verifylist = [ - ('identifier', FAKE_NAME), + ('networks', [FAKE_NAME]), ] lister = mock.Mock(return_value={RESOURCES: [RECORD]}) self.app.client_manager.network.list_networks = lister diff --git a/openstackclient/volume/v1/backup.py b/openstackclient/volume/v1/backup.py index 992fa7be..8c16ba25 100644 --- a/openstackclient/volume/v1/backup.py +++ b/openstackclient/volume/v1/backup.py @@ -73,25 +73,27 @@ class CreateBackup(show.ShowOne): class DeleteBackup(command.Command): - """Delete backup command""" + """Delete backup(s)""" log = logging.getLogger(__name__ + '.DeleteBackup') def get_parser(self, prog_name): parser = super(DeleteBackup, self).get_parser(prog_name) parser.add_argument( - 'backup', + 'backups', metavar='<backup>', - help='Name or ID of backup to delete', + nargs="+", + help='Backup(s) to delete (name or ID)', ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) volume_client = self.app.client_manager.volume - backup_id = utils.find_resource(volume_client.backups, - parsed_args.backup).id - volume_client.backups.delete(backup_id) + for backup in parsed_args.backups: + backup_id = utils.find_resource(volume_client.backups, + backup).id + volume_client.backups.delete(backup_id) return diff --git a/openstackclient/volume/v1/snapshot.py b/openstackclient/volume/v1/snapshot.py index 9cc3c4c1..c9e1baca 100644 --- a/openstackclient/volume/v1/snapshot.py +++ b/openstackclient/volume/v1/snapshot.py @@ -74,25 +74,27 @@ class CreateSnapshot(show.ShowOne): class DeleteSnapshot(command.Command): - """Delete snapshot command""" + """Delete snapshot(s)""" log = logging.getLogger(__name__ + '.DeleteSnapshot') def get_parser(self, prog_name): parser = super(DeleteSnapshot, self).get_parser(prog_name) parser.add_argument( - 'snapshot', + 'snapshots', metavar='<snapshot>', - help='Name or ID of snapshot to delete', + nargs="+", + help='Snapshot(s) to delete (name or ID)', ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) volume_client = self.app.client_manager.volume - snapshot_id = utils.find_resource(volume_client.volume_snapshots, - parsed_args.snapshot).id - volume_client.volume_snapshots.delete(snapshot_id) + for snapshot in parsed_args.snapshots: + snapshot_id = utils.find_resource(volume_client.volume_snapshots, + snapshot).id + volume_client.volume_snapshots.delete(snapshot_id) return diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py index b78779bd..d82f6b4b 100644 --- a/openstackclient/volume/v1/volume.py +++ b/openstackclient/volume/v1/volume.py @@ -155,35 +155,37 @@ class CreateVolume(show.ShowOne): class DeleteVolume(command.Command): - """Delete a volume""" + """Delete volume(s)""" log = logging.getLogger(__name__ + '.DeleteVolume') def get_parser(self, prog_name): parser = super(DeleteVolume, self).get_parser(prog_name) parser.add_argument( - 'volume', + 'volumes', metavar='<volume>', - help='Volume to delete (name or ID)', + nargs="+", + help='Volume(s) to delete (name or ID)', ) parser.add_argument( '--force', dest='force', action='store_true', default=False, - help='Attempt forced removal of a volume, regardless of state', + help='Attempt forced removal of volume(s), regardless of state', ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) volume_client = self.app.client_manager.volume - volume = utils.find_resource( - volume_client.volumes, parsed_args.volume) - if parsed_args.force: - volume_client.volumes.force_delete(volume.id) - else: - volume_client.volumes.delete(volume.id) + for volume in parsed_args.volumes: + volume_obj = utils.find_resource( + volume_client.volumes, volume) + if parsed_args.force: + volume_client.volumes.force_delete(volume_obj.id) + else: + volume_client.volumes.delete(volume_obj.id) return |
