From 5361652d8f0a90b5a2ef296a9fb718ac3d397ea9 Mon Sep 17 00:00:00 2001 From: Amey Bhide Date: Wed, 27 May 2015 12:31:59 -0700 Subject: Add support for volume v2 API Added following commands for volume V2 API: volume show volume delete volume type show volume type delete snapshot show snapshot delete backup show backup delete Implements: blueprint volume-v2 Change-Id: I68bd303c194f304ad15f899d335b72a8bf3ebe10 --- openstackclient/volume/client.py | 3 +- openstackclient/volume/v2/__init__.py | 0 openstackclient/volume/v2/backup.py | 70 +++++++++++++++++++++++++++ openstackclient/volume/v2/snapshot.py | 71 +++++++++++++++++++++++++++ openstackclient/volume/v2/volume.py | 83 ++++++++++++++++++++++++++++++++ openstackclient/volume/v2/volume_type.py | 68 ++++++++++++++++++++++++++ 6 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 openstackclient/volume/v2/__init__.py create mode 100644 openstackclient/volume/v2/backup.py create mode 100644 openstackclient/volume/v2/snapshot.py create mode 100644 openstackclient/volume/v2/volume.py create mode 100644 openstackclient/volume/v2/volume_type.py (limited to 'openstackclient/volume') diff --git a/openstackclient/volume/client.py b/openstackclient/volume/client.py index a7b64def..1038c407 100644 --- a/openstackclient/volume/client.py +++ b/openstackclient/volume/client.py @@ -23,7 +23,8 @@ DEFAULT_VOLUME_API_VERSION = '1' API_VERSION_OPTION = 'os_volume_api_version' API_NAME = "volume" API_VERSIONS = { - "1": "cinderclient.v1.client.Client" + "1": "cinderclient.v1.client.Client", + "2": "cinderclient.v2.client.Client" } diff --git a/openstackclient/volume/v2/__init__.py b/openstackclient/volume/v2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/openstackclient/volume/v2/backup.py b/openstackclient/volume/v2/backup.py new file mode 100644 index 00000000..bf2ea3a6 --- /dev/null +++ b/openstackclient/volume/v2/backup.py @@ -0,0 +1,70 @@ +# +# 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. +# + +"""Volume v2 Backup action implementations""" + +import logging + +from cliff import command +from cliff import show +import six + +from openstackclient.common import utils + + +class DeleteBackup(command.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( + "backups", + metavar="", + 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 + for backup in parsed_args.backups: + backup_id = utils.find_resource( + volume_client.backups, backup).id + volume_client.backups.delete(backup_id) + return + + +class ShowBackup(show.ShowOne): + """Display backup details""" + + log = logging.getLogger(__name__ + ".ShowBackup") + + def get_parser(self, prog_name): + parser = super(ShowBackup, self).get_parser(prog_name) + parser.add_argument( + "backup", + metavar="", + help="Backup to display (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 = utils.find_resource(volume_client.backups, + parsed_args.backup) + backup._info.pop("links", None) + return zip(*sorted(six.iteritems(backup._info))) diff --git a/openstackclient/volume/v2/snapshot.py b/openstackclient/volume/v2/snapshot.py new file mode 100644 index 00000000..a6b02b63 --- /dev/null +++ b/openstackclient/volume/v2/snapshot.py @@ -0,0 +1,71 @@ +# +# 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. +# + +"""Volume v2 snapshot action implementations""" + +import logging + +from cliff import command +from cliff import show +import six + +from openstackclient.common import utils + + +class DeleteSnapshot(command.Command): + """Delete volume snapshot(s)""" + + log = logging.getLogger(__name__ + ".DeleteSnapshot") + + def get_parser(self, prog_name): + parser = super(DeleteSnapshot, self).get_parser(prog_name) + parser.add_argument( + "snapshots", + metavar="", + nargs="+", + help="Snapsho(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 + 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 + + +class ShowSnapshot(show.ShowOne): + """Display snapshot details""" + + log = logging.getLogger(__name__ + ".ShowSnapshot") + + def get_parser(self, prog_name): + parser = super(ShowSnapshot, self).get_parser(prog_name) + parser.add_argument( + "snapshot", + metavar="", + help="Snapshot to display (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 = utils.find_resource( + volume_client.volume_snapshots, parsed_args.snapshot) + snapshot = volume_client.volume_snapshots.get(snapshot.id) + return zip(*sorted(six.iteritems(snapshot._info))) diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py new file mode 100644 index 00000000..e50a6f0c --- /dev/null +++ b/openstackclient/volume/v2/volume.py @@ -0,0 +1,83 @@ +# +# 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. +# + +"""Volume V2 Volume action implementations""" + +import logging + +from cliff import command +from cliff import show +import six + +from openstackclient.common import utils + + +class DeleteVolume(command.Command): + """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( + "volumes", + metavar="", + 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 volume(s), regardless of state " + "(defaults to False" + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action: (%s)", parsed_args) + volume_client = self.app.client_manager.volume + 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 + + +class ShowVolume(show.ShowOne): + """Display volume details""" + + log = logging.getLogger(__name__ + '.ShowVolume') + + def get_parser(self, prog_name): + parser = super(ShowVolume, self).get_parser(prog_name) + parser.add_argument( + 'volume', + metavar="", + help="Volume to display (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 + volume = utils.find_resource(volume_client.volumes, parsed_args.volume) + + # Remove key links from being displayed + volume._info.pop("links", None) + return zip(*sorted(six.iteritems(volume._info))) diff --git a/openstackclient/volume/v2/volume_type.py b/openstackclient/volume/v2/volume_type.py new file mode 100644 index 00000000..ae5cc8b8 --- /dev/null +++ b/openstackclient/volume/v2/volume_type.py @@ -0,0 +1,68 @@ +# +# 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. +# + +"""Volume v2 Type action implementations""" + +import logging + +from cliff import command +from cliff import show +import six + +from openstackclient.common import utils + + +class DeleteVolumeType(command.Command): + """Delete volume type""" + + log = logging.getLogger(__name__ + ".DeleteVolumeType") + + def get_parser(self, prog_name): + parser = super(DeleteVolumeType, self).get_parser(prog_name) + parser.add_argument( + "volume_type", + metavar="", + help="Volume type to delete (name or ID)" + ) + return parser + + def take_action(self, parsed_args): + self.log.info("take_action: (%s)", parsed_args) + volume_client = self.app.client_manager.volume + volume_type = utils.find_resource( + volume_client.volume_types, parsed_args.volume_type) + volume_client.volume_types.delete(volume_type.id) + return + + +class ShowVolumeType(show.ShowOne): + """Display volume type details""" + + log = logging.getLogger(__name__ + ".ShowVolumeType") + + def get_parser(self, prog_name): + parser = super(ShowVolumeType, self).get_parser(prog_name) + parser.add_argument( + "volume_type", + metavar="", + help="Volume type to display (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 + volume_type = utils.find_resource( + volume_client.volume_types, parsed_args.volume_type) + return zip(*sorted(six.iteritems(volume_type._info))) -- cgit v1.2.1