Added type description for volume type client

This patch added client handling and unit tests for volume type description:

* Added 2 client methods for volume type.
  default: to get the default volume type
  update: to upate an existing volume type to update description

* Added 2 new command-line operations.
  type-update (adminitrator only)
  type-default

* type-list should display description.

* type-create should have an option for entering the description.

The corresponding cinder APIs change volume-type-description:
https://review.openstack.org/#/c/131871/

Implements: blueprint volume-type-description
Change-Id: I2735d7050d90589d19f45e21096577febdcca8bb
This commit is contained in:
Gloria Gu
2014-10-31 11:11:24 -07:00
parent c3b1b1b0c0
commit bc2b8bf1be
5 changed files with 77 additions and 4 deletions

View File

@@ -189,9 +189,11 @@ class Manager(utils.HookableMixin):
def _delete(self, url):
resp, body = self.api.client.delete(url)
def _update(self, url, body, **kwargs):
def _update(self, url, body, response_key=None, **kwargs):
self.run_hooks('modify_body_for_update', body, **kwargs)
resp, body = self.api.client.put(url, body=body)
if response_key:
return self.resource_class(self, body[response_key], loaded=True)
return body

View File

@@ -578,9 +578,13 @@ class FakeHTTPClient(base_client.HTTPClient):
'name': 'test-type-2',
'extra_specs': {}}})
def get_types_default(self, **kw):
return self.get_types_1()
def post_types(self, body, **kw):
return (202, {}, {'volume_type': {'id': 3,
'name': 'test-type-3',
'description': 'test_type-3-desc',
'extra_specs': {}}})
def post_types_1_extra_specs(self, body, **kw):
@@ -593,6 +597,9 @@ class FakeHTTPClient(base_client.HTTPClient):
def delete_types_1(self, **kw):
return (202, {}, None)
def put_types_1(self, **kw):
return self.get_types_1()
#
# VolumeEncryptionTypes
#

View File

@@ -33,6 +33,21 @@ class TypesTest(utils.TestCase):
cs.assert_called('POST', '/types')
self.assertIsInstance(t, volume_types.VolumeType)
def test_update(self):
t = cs.volume_types.update('1', 'test_desc_1')
cs.assert_called('PUT', '/types/1')
self.assertIsInstance(t, volume_types.VolumeType)
def test_get(self):
t = cs.volume_types.get('1')
cs.assert_called('GET', '/types/1')
self.assertIsInstance(t, volume_types.VolumeType)
def test_default(self):
t = cs.volume_types.default()
cs.assert_called('GET', '/types/default')
self.assertIsInstance(t, volume_types.VolumeType)
def test_set_key(self):
t = cs.volume_types.get(1)
t.set_keys({'k': 'v'})

View File

@@ -696,7 +696,7 @@ def do_snapshot_reset_state(cs, args):
def _print_volume_type_list(vtypes):
utils.print_list(vtypes, ['ID', 'Name'])
utils.print_list(vtypes, ['ID', 'Name', 'Description'])
@utils.service_type('volumev2')
@@ -706,6 +706,26 @@ def do_type_list(cs, args):
_print_volume_type_list(vtypes)
@utils.service_type('volumev2')
def do_type_default(cs, args):
"""List the default volume type."""
vtype = cs.volume_types.default()
_print_volume_type_list([vtype])
@utils.arg('id',
metavar='<id>',
help="ID of the volume type.")
@utils.arg('description',
metavar='<description>',
help="Description of the volume type.")
@utils.service_type('volumev2')
def do_type_update(cs, args):
"""Updates volume type description."""
vtype = cs.volume_types.update(args.id, args.description)
_print_volume_type_list([vtype])
@utils.service_type('volumev2')
def do_extra_specs_list(cs, args):
"""Lists current volume types and extra specs."""
@@ -716,10 +736,13 @@ def do_extra_specs_list(cs, args):
@utils.arg('name',
metavar='<name>',
help="Name of new volume type.")
@utils.arg('--description',
metavar='<description>',
help="Description of new volume type.")
@utils.service_type('volumev2')
def do_type_create(cs, args):
"""Creates a volume type."""
vtype = cs.volume_types.create(args.name)
vtype = cs.volume_types.create(args.name, args.description)
_print_volume_type_list([vtype])

View File

@@ -85,6 +85,13 @@ class VolumeTypeManager(base.ManagerWithFind):
"""
return self._get("/types/%s" % base.getid(volume_type), "volume_type")
def default(self):
"""Get the default volume type.
:rtype: :class:`VolumeType`
"""
return self._get("/types/default", "volume_type")
def delete(self, volume_type):
"""Deletes a specific volume_type.
@@ -92,17 +99,36 @@ class VolumeTypeManager(base.ManagerWithFind):
"""
self._delete("/types/%s" % base.getid(volume_type))
def create(self, name):
def create(self, name, description=None):
"""Creates a volume type.
:param name: Descriptive name of the volume type
:param description: Description of the the volume type
:rtype: :class:`VolumeType`
"""
body = {
"volume_type": {
"name": name,
"description": description
}
}
return self._create("/types", body, "volume_type")
def update(self, volume_type, description):
"""Update the description for a volume type.
:param volume_type: The ID of the :class:`VolumeType` to update.
:param description: Description of the the volume type.
:rtype: :class:`VolumeType`
"""
body = {
"volume_type": {
"description": description
}
}
return self._update("/types/%s" % base.getid(volume_type),
body, response_key="volume_type")