diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/server.py | 6 | ||||
| -rw-r--r-- | openstackclient/identity/common.py | 16 | ||||
| -rw-r--r-- | openstackclient/identity/v3/role.py | 102 | ||||
| -rw-r--r-- | openstackclient/image/v1/image.py | 25 | ||||
| -rw-r--r-- | openstackclient/shell.py | 16 | ||||
| -rw-r--r-- | openstackclient/tests/common/test_clientmanager.py | 3 | ||||
| -rw-r--r-- | openstackclient/tests/image/v1/test_image.py | 9 |
7 files changed, 117 insertions, 60 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index e4e96ee7..41c1b904 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -1054,11 +1054,11 @@ class RescueServer(show.ShowOne): self.log.debug('take_action(%s)', parsed_args) compute_client = self.app.client_manager.compute - server = utils.find_resource( + _, body = utils.find_resource( compute_client.servers, parsed_args.server, - ).rescue() - return zip(*sorted(six.iteritems(server._info))) + ).rescue() + return zip(*sorted(six.iteritems(body))) class ResizeServer(command.Command): diff --git a/openstackclient/identity/common.py b/openstackclient/identity/common.py index 2cc68c8d..a6e674c0 100644 --- a/openstackclient/identity/common.py +++ b/openstackclient/identity/common.py @@ -48,23 +48,23 @@ def find_domain(identity_client, name_or_id): domains.Domain) -def find_group(identity_client, name_or_id): +def find_group(identity_client, name_or_id, domain_id=None): return _find_identity_resource(identity_client.groups, name_or_id, - groups.Group) + groups.Group, domain_id=domain_id) -def find_project(identity_client, name_or_id): +def find_project(identity_client, name_or_id, domain_id=None): return _find_identity_resource(identity_client.projects, name_or_id, - projects.Project) + projects.Project, domain_id=domain_id) -def find_user(identity_client, name_or_id): +def find_user(identity_client, name_or_id, domain_id=None): return _find_identity_resource(identity_client.users, name_or_id, - users.User) + users.User, domain_id=domain_id) def _find_identity_resource(identity_client_manager, name_or_id, - resource_type): + resource_type, **kwargs): """Find a specific identity resource. Using keystoneclient's manager, attempt to find a specific resource by its @@ -92,7 +92,7 @@ def _find_identity_resource(identity_client_manager, name_or_id, try: identity_resource = utils.find_resource(identity_client_manager, - name_or_id) + name_or_id, **kwargs) if identity_resource is not None: return identity_resource except identity_exc.Forbidden: diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py index 3dd998ba..bc64f7f8 100644 --- a/openstackclient/identity/v3/role.py +++ b/openstackclient/identity/v3/role.py @@ -63,6 +63,27 @@ class AddRole(command.Command): metavar='<group>', help='Include <group> (name or ID)', ) + parser.add_argument( + '--user-domain', + metavar='<user-domain>', + help=('Domain the user belongs to (name or ID). ' + 'This can be used in case collisions between user names ' + 'exist.') + ) + parser.add_argument( + '--group-domain', + metavar='<group-domain>', + help=('Domain the group belongs to (name or ID). ' + 'This can be used in case collisions between group names ' + 'exist.') + ) + parser.add_argument( + '--project-domain', + metavar='<project-domain>', + help=('Domain the project belongs to (name or ID). ' + 'This can be used in case collisions between project names ' + 'exist.') + ) return parser def take_action(self, parsed_args): @@ -78,67 +99,76 @@ class AddRole(command.Command): parsed_args.role, ) + kwargs = {} if parsed_args.user and parsed_args.domain: - user = common.find_user( + user_domain_id = self._get_domain_id_if_requested( + parsed_args.user_domain) + kwargs['user'] = common.find_user( identity_client, parsed_args.user, - ) - domain = common.find_domain( + user_domain_id, + ).id + kwargs['domain'] = common.find_domain( identity_client, parsed_args.domain, - ) - identity_client.roles.grant( - role.id, - user=user.id, - domain=domain.id, - ) + ).id elif parsed_args.user and parsed_args.project: - user = common.find_user( + user_domain_id = self._get_domain_id_if_requested( + parsed_args.user_domain) + kwargs['user'] = common.find_user( identity_client, parsed_args.user, - ) - project = common.find_project( + user_domain_id, + ).id + project_domain_id = self._get_domain_id_if_requested( + parsed_args.project_domain) + kwargs['project'] = common.find_project( identity_client, parsed_args.project, - ) - identity_client.roles.grant( - role.id, - user=user.id, - project=project.id, - ) + project_domain_id, + ).id elif parsed_args.group and parsed_args.domain: - group = common.find_group( + group_domain_id = self._get_domain_id_if_requested( + parsed_args.group_domain) + kwargs['group'] = common.find_group( identity_client, parsed_args.group, - ) - domain = common.find_domain( + group_domain_id, + ).id + kwargs['domain'] = common.find_domain( identity_client, parsed_args.domain, - ) - identity_client.roles.grant( - role.id, - group=group.id, - domain=domain.id, - ) + ).id elif parsed_args.group and parsed_args.project: - group = common.find_group( + group_domain_id = self._get_domain_id_if_requested( + parsed_args.group_domain) + kwargs['group'] = common.find_group( identity_client, parsed_args.group, - ) - project = common.find_project( + group_domain_id, + ).id + project_domain_id = self._get_domain_id_if_requested( + parsed_args.project_domain) + kwargs['project'] = common.find_project( identity_client, parsed_args.project, - ) - identity_client.roles.grant( - role.id, - group=group.id, - project=project.id, - ) + project_domain_id, + ).id else: sys.stderr.write("Role not added, incorrect set of arguments \ provided. See openstack --help for more details\n") + return + + identity_client.roles.grant(role.id, **kwargs) return + def _get_domain_id_if_requested(self, domain_name_or_id): + if domain_name_or_id is None: + return None + domain = common.find_domain(self.app.client_manager.identity, + domain_name_or_id) + return domain.id + class CreateRole(show.ShowOne): """Create new role""" diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index 830b99ba..d4d45fa2 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -508,6 +508,28 @@ class SetImage(show.ShowOne): type=int, help="Minimum RAM size needed to boot image, in megabytes", ) + container_choices = ["ami", "ari", "aki", "bare", "ovf"] + parser.add_argument( + "--container-format", + metavar="<container-format>", + help=("Container format of image. Acceptable formats: %s" % + container_choices), + choices=container_choices + ) + disk_choices = ["ami", "ari", "aki", "vhd", "vmdk", "raw", "qcow2", + "vdi", "iso"] + parser.add_argument( + "--disk-format", + metavar="<disk-format>", + help="Disk format of image. Acceptable formats: %s" % disk_choices, + choices=disk_choices + ) + parser.add_argument( + "--size", + metavar="<size>", + type=int, + help="Size of image data (in bytes)" + ) protected_group = parser.add_mutually_exclusive_group() protected_group.add_argument( "--protected", @@ -545,7 +567,8 @@ class SetImage(show.ShowOne): image_client = self.app.client_manager.image kwargs = {} - copy_attrs = ('name', 'owner', 'min_disk', 'min_ram', 'properties') + copy_attrs = ('name', 'owner', 'min_disk', 'min_ram', 'properties', + 'container_format', 'disk_format', 'size') for attr in copy_attrs: if attr in parsed_args: val = getattr(parsed_args, attr, None) diff --git a/openstackclient/shell.py b/openstackclient/shell.py index 5e291021..da985cbc 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -187,11 +187,13 @@ class OpenStackShell(app.App): verify_group = parser.add_mutually_exclusive_group() verify_group.add_argument( '--verify', - action='store_true', + default=None, + action='store_false', help='Verify server certificate (default)', ) verify_group.add_argument( '--insecure', + default=None, action='store_true', help='Disable server certificate verification', ) @@ -224,12 +226,6 @@ class OpenStackShell(app.App): # Parent __init__ parses argv into self.options super(OpenStackShell, self).initialize_app(argv) - # Resolve the verify/insecure exclusive pair here as cloud_config - # doesn't know about verify - self.options.insecure = ( - self.options.insecure and not self.options.verify - ) - # Set the default plugin to token_endpoint if rl and token are given if (self.options.url and self.options.token): # Use service token authentication @@ -253,10 +249,8 @@ class OpenStackShell(app.App): if cacert: self.verify = cacert else: - self.verify = not getattr(self.cloud.config, 'insecure', False) - - # Neutralize verify option - self.options.verify = None + self.verify = not self.cloud.config.get('insecure', False) + self.verify = self.cloud.config.get('verify', self.verify) # Save default domain self.default_domain = self.options.os_default_domain diff --git a/openstackclient/tests/common/test_clientmanager.py b/openstackclient/tests/common/test_clientmanager.py index 26cf4967..4e2f46b4 100644 --- a/openstackclient/tests/common/test_clientmanager.py +++ b/openstackclient/tests/common/test_clientmanager.py @@ -12,12 +12,13 @@ # License for the specific language governing permissions and limitations # under the License. # + +import json as jsonutils import mock from requests_mock.contrib import fixture from keystoneclient.auth.identity import v2 as auth_v2 from keystoneclient import service_catalog -from oslo_serialization import jsonutils from openstackclient.api import auth from openstackclient.api import auth_plugin diff --git a/openstackclient/tests/image/v1/test_image.py b/openstackclient/tests/image/v1/test_image.py index ef7ca9ea..eec8cfa5 100644 --- a/openstackclient/tests/image/v1/test_image.py +++ b/openstackclient/tests/image/v1/test_image.py @@ -547,6 +547,9 @@ class TestImageSet(TestImage): '--owner', 'new-owner', '--min-disk', '2', '--min-ram', '4', + '--container-format', 'ovf', + '--disk-format', 'vmdk', + '--size', '35165824', image_fakes.image_name, ] verifylist = [ @@ -554,6 +557,9 @@ class TestImageSet(TestImage): ('owner', 'new-owner'), ('min_disk', 2), ('min_ram', 4), + ('container_format', 'ovf'), + ('disk_format', 'vmdk'), + ('size', 35165824), ('image', image_fakes.image_name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -566,6 +572,9 @@ class TestImageSet(TestImage): 'owner': 'new-owner', 'min_disk': 2, 'min_ram': 4, + 'container_format': 'ovf', + 'disk_format': 'vmdk', + 'size': 35165824 } # ImageManager.update(image, **kwargs) self.images_mock.update.assert_called_with( |
