diff options
| author | whoami-rajat <rajatdhasmana@gmail.com> | 2023-02-06 23:09:03 +0530 |
|---|---|---|
| committer | whoami-rajat <rajatdhasmana@gmail.com> | 2023-02-17 12:17:22 +0000 |
| commit | ec01268ea93141439542fb162a6a12bc2bf533fe (patch) | |
| tree | 6f73657981480a52d5cc6261c4ea07e01cefe5f9 /openstackclient/volume | |
| parent | 73b4ce88eb3e71568cf5330d6c0a8a4e92287d89 (diff) | |
| download | python-openstackclient-ec01268ea93141439542fb162a6a12bc2bf533fe.tar.gz | |
Add options to create volume group from source6.1.0
This patch adds ``--source-group`` and ``--group-snapshot`` options
to the ``volume group create`` command to allow creating group from
a source group or a group snapshot.
Change-Id: I87482a5dd43c519dfdcf981635aa879914a70a5c
Diffstat (limited to 'openstackclient/volume')
| -rw-r--r-- | openstackclient/volume/v3/volume_group.py | 117 |
1 files changed, 88 insertions, 29 deletions
diff --git a/openstackclient/volume/v3/volume_group.py b/openstackclient/volume/v3/volume_group.py index db4e9a94..69b18ceb 100644 --- a/openstackclient/volume/v3/volume_group.py +++ b/openstackclient/volume/v3/volume_group.py @@ -82,15 +82,17 @@ class CreateVolumeGroup(command.ShowOne): def get_parser(self, prog_name): parser = super().get_parser(prog_name) - parser.add_argument( + source_parser = parser.add_mutually_exclusive_group() + source_parser.add_argument( 'volume_group_type', metavar='<volume_group_type>', + nargs='?', help=_('Name or ID of volume group type to use.'), ) parser.add_argument( 'volume_types', metavar='<volume_type>', - nargs='+', + nargs='*', default=[], help=_('Name or ID of volume type(s) to use.'), ) @@ -107,44 +109,101 @@ class CreateVolumeGroup(command.ShowOne): parser.add_argument( '--availability-zone', metavar='<availability-zone>', - help=_('Availability zone for volume group.'), + help=_('Availability zone for volume group. ' + '(not available if creating group from source)'), + ) + source_parser.add_argument( + '--source-group', + metavar='<source-group>', + help=_('Existing volume group (name or ID) ' + '(supported by --os-volume-api-version 3.14 or later)'), + ) + source_parser.add_argument( + '--group-snapshot', + metavar='<group-snapshot>', + help=_('Existing group snapshot (name or ID) ' + '(supported by --os-volume-api-version 3.14 or later)'), ) return parser def take_action(self, parsed_args): volume_client = self.app.client_manager.volume - if volume_client.api_version < api_versions.APIVersion('3.13'): - msg = _( - "--os-volume-api-version 3.13 or greater is required to " - "support the 'volume group create' command" - ) - raise exceptions.CommandError(msg) - - volume_group_type = utils.find_resource( - volume_client.group_types, - parsed_args.volume_group_type, - ) - - volume_types = [] - for volume_type in parsed_args.volume_types: - volume_types.append( - utils.find_resource( - volume_client.volume_types, - volume_type, + if parsed_args.volume_group_type: + if volume_client.api_version < api_versions.APIVersion('3.13'): + msg = _( + "--os-volume-api-version 3.13 or greater is required to " + "support the 'volume group create' command" ) + raise exceptions.CommandError(msg) + if not parsed_args.volume_types: + msg = _( + "<volume_types> is a required argument when creating a " + "group from group type." + ) + raise exceptions.CommandError(msg) + + volume_group_type = utils.find_resource( + volume_client.group_types, + parsed_args.volume_group_type, ) + volume_types = [] + for volume_type in parsed_args.volume_types: + volume_types.append( + utils.find_resource( + volume_client.volume_types, + volume_type, + ) + ) - group = volume_client.groups.create( - volume_group_type.id, - ','.join(x.id for x in volume_types), - parsed_args.name, - parsed_args.description, - availability_zone=parsed_args.availability_zone) + group = volume_client.groups.create( + volume_group_type.id, + ','.join(x.id for x in volume_types), + parsed_args.name, + parsed_args.description, + availability_zone=parsed_args.availability_zone) - group = volume_client.groups.get(group.id) + group = volume_client.groups.get(group.id) + return _format_group(group) - return _format_group(group) + else: + if volume_client.api_version < api_versions.APIVersion('3.14'): + msg = _( + "--os-volume-api-version 3.14 or greater is required to " + "support the 'volume group create " + "[--source-group|--group-snapshot]' command" + ) + raise exceptions.CommandError(msg) + if (parsed_args.source_group is None and + parsed_args.group_snapshot is None): + msg = _( + "Either --source-group <source_group> or " + "'--group-snapshot <group_snapshot>' needs to be " + "provided to run the 'volume group create " + "[--source-group|--group-snapshot]' command" + ) + raise exceptions.CommandError(msg) + if parsed_args.availability_zone: + msg = _("'--availability-zone' option will not work " + "if creating group from source.") + LOG.warning(msg) + + source_group = None + if parsed_args.source_group: + source_group = utils.find_resource(volume_client.groups, + parsed_args.source_group) + group_snapshot = None + if parsed_args.group_snapshot: + group_snapshot = utils.find_resource( + volume_client.group_snapshots, + parsed_args.group_snapshot) + group = volume_client.groups.create_from_src( + group_snapshot.id if group_snapshot else None, + source_group.id if source_group else None, + parsed_args.name, + parsed_args.description) + group = volume_client.groups.get(group.id) + return _format_group(group) class DeleteVolumeGroup(command.Command): |
