Add encryption-type-delete to cinderclient

This modification adds support for deleting volume encryption types.
The encryption-type-delete command accepts a single argument, the
name or ID of the volume type whose associated encryption type should
be deleted. The encryption type may only be deleted if the associated
volume type is unused.

blueprint encrypt-cinder-volumes

Change-Id: Ie189e7ec91f5a8adc9d3496911de2811ad40f282
This commit is contained in:
Peter Hamilton
2013-11-19 08:11:58 -05:00
parent 6e214b2c03
commit 38388f892b
10 changed files with 58 additions and 6 deletions

View File

@@ -468,6 +468,9 @@ class FakeHTTPClient(base_client.HTTPClient):
def put_types_1_encryption_1(self, body, **kw): def put_types_1_encryption_1(self, body, **kw):
return (200, {}, {}) return (200, {}, {})
def delete_types_1_encryption_provider(self, **kw):
return (202, {}, None)
# #
# Set/Unset metadata # Set/Unset metadata
# #

View File

@@ -275,8 +275,14 @@ class ShellTest(utils.TestCase):
def test_encryption_type_delete(self): def test_encryption_type_delete(self):
""" """
Test encryption-type-delete shell command. Test encryption-type-delete shell command.
Verify one GET/one DELETE requests are made per command invocation:
- one GET request to retrieve the relevant volume type information
- one DELETE request to delete the encryption type information
""" """
self.skipTest("Not implemented") self.run_command('encryption-type-delete 1')
self.assert_called('DELETE', '/types/1/encryption/provider')
self.assert_called_anytime('GET', '/types/1')
def test_migrate_volume(self): def test_migrate_volume(self):
self.run_command('migrate 1234 fakehost --force-host-copy=True') self.run_command('migrate 1234 fakehost --force-host-copy=True')

View File

@@ -91,5 +91,10 @@ class VolumeEncryptionTypesTest(utils.TestCase):
def test_delete(self): def test_delete(self):
""" """
Unit test for VolumeEncryptionTypesManager.delete Unit test for VolumeEncryptionTypesManager.delete
Verify that one DELETE request is made for encryption type deletion
Verify that encryption type deletion returns None
""" """
self.skipTest("Not implemented") result = cs.volume_encryption_types.delete(1)
cs.assert_called('DELETE', '/types/1/encryption/provider')
self.assertIsNone(result, "delete result must be None")

View File

@@ -475,6 +475,9 @@ class FakeHTTPClient(base_client.HTTPClient):
def put_types_1_encryption_1(self, body, **kw): def put_types_1_encryption_1(self, body, **kw):
return (200, {}, {}) return (200, {}, {})
def delete_types_1_encryption_provider(self, **kw):
return (202, {}, None)
# #
# Set/Unset metadata # Set/Unset metadata
# #

View File

@@ -253,8 +253,14 @@ class ShellTest(utils.TestCase):
def test_encryption_type_delete(self): def test_encryption_type_delete(self):
""" """
Test encryption-type-delete shell command. Test encryption-type-delete shell command.
Verify one GET/one DELETE requests are made per command invocation:
- one GET request to retrieve the relevant volume type information
- one DELETE request to delete the encryption type information
""" """
self.skipTest("Not implemented") self.run_command('encryption-type-delete 1')
self.assert_called('DELETE', '/types/1/encryption/provider')
self.assert_called_anytime('GET', '/types/1')
def test_migrate_volume(self): def test_migrate_volume(self):
self.run_command('migrate 1234 fakehost --force-host-copy=True') self.run_command('migrate 1234 fakehost --force-host-copy=True')

View File

@@ -91,5 +91,10 @@ class VolumeEncryptionTypesTest(utils.TestCase):
def test_delete(self): def test_delete(self):
""" """
Unit test for VolumeEncryptionTypesManager.delete Unit test for VolumeEncryptionTypesManager.delete
Verify that one DELETE request is made for encryption type deletion
Verify that encryption type deletion returns None
""" """
self.skipTest("Not implemented") result = cs.volume_encryption_types.delete(1)
cs.assert_called('DELETE', '/types/1/encryption/provider')
self.assertIsNone(result, "delete result must be None")

View File

@@ -1116,6 +1116,17 @@ def do_encryption_type_create(cs, args):
_print_volume_encryption_type_list([result]) _print_volume_encryption_type_list([result])
@utils.arg('volume_type',
metavar='<volume_type>',
type=str,
help="Name or ID of the volume type")
@utils.service_type('volume')
def do_encryption_type_delete(cs, args):
"""Delete the encryption type for a volume type (Admin Only)."""
volume_type = _find_volume_type(cs, args.volume_type)
cs.volume_encryption_types.delete(volume_type)
@utils.arg('volume', metavar='<volume>', help='ID of the volume to migrate') @utils.arg('volume', metavar='<volume>', help='ID of the volume to migrate')
@utils.arg('host', metavar='<host>', help='Destination host') @utils.arg('host', metavar='<host>', help='Destination host')
@utils.arg('--force-host-copy', metavar='<True|False>', @utils.arg('--force-host-copy', metavar='<True|False>',

View File

@@ -93,4 +93,5 @@ class VolumeEncryptionTypeManager(base.ManagerWithFind):
:param volume_type: the volume type whose encryption type information :param volume_type: the volume type whose encryption type information
must be deleted must be deleted
""" """
raise NotImplementedError() return self._delete("/types/%s/encryption/provider" %
base.getid(volume_type))

View File

@@ -1211,6 +1211,17 @@ def do_encryption_type_create(cs, args):
_print_volume_encryption_type_list([result]) _print_volume_encryption_type_list([result])
@utils.arg('volume_type',
metavar='<volume_type>',
type=str,
help="Name or ID of the volume type")
@utils.service_type('volumev2')
def do_encryption_type_delete(cs, args):
"""Delete the encryption type for a volume type (Admin Only)."""
volume_type = _find_volume_type(cs, args.volume_type)
cs.volume_encryption_types.delete(volume_type)
def _print_qos_specs(qos_specs): def _print_qos_specs(qos_specs):
utils.print_dict(qos_specs._info) utils.print_dict(qos_specs._info)

View File

@@ -93,4 +93,5 @@ class VolumeEncryptionTypeManager(base.ManagerWithFind):
:param volume_type: the volume type whose encryption type information :param volume_type: the volume type whose encryption type information
must be deleted must be deleted
""" """
raise NotImplementedError() return self._delete("/types/%s/encryption/provider" %
base.getid(volume_type))