Introduces MV to add volume type ID in volumes details

Introduces microversion (MV) 3.63 to add volume type ID
in the volume details.

This change comes to fix a problem we found in Gnocchi concerning
volumes monitored data. When a volume event is created, Cinder uses
the volume type as the volume type ID. On the other hand, Ceilometer
pollsters are always updating the volume_type value in Gnocchi with the
volume type from volume details API (which uses the volume type name
value).

That situation creates a massive number of resource revisions in
Gnocchi. This MV along with the Dynamic pollster system in Ceilometer
enables operators to overcome the issue.

Closes-Bug: https://bugs.launchpad.net/cinder/+bug/1911660

Change-Id: Icb88faeb00040250a25a5630aeb312a8434ed3c8
Signed-off-by: Rafael Weingärtner <rafael@apache.org>
This commit is contained in:
Rafael Weingärtner 2019-06-21 13:17:52 -03:00
parent d3ffa90baa
commit e9c848f5fd
13 changed files with 81 additions and 15 deletions

View File

@ -3121,6 +3121,13 @@ volume_type_detail:
in: body
required: false
type: string
volume_type_id_363:
description: |
The associated volume type ID for the volume.
in: body
required: true
type: object
min_version: 3.63
volume_type_id_body:
description: |
The UUID of the volume type.
@ -3129,7 +3136,7 @@ volume_type_id_body:
type: string
volume_type_vol:
description: |
The associated volume type for the volume.
The associated volume type name for the volume.
in: body
required: true
type: string

View File

@ -21,8 +21,8 @@
],
"min_version": "3.0",
"status": "CURRENT",
"updated": "2018-07-17T00:00:00Z",
"version": "3.62"
"updated": "2020-11-19T08:56:00Z",
"version": "3.63"
}
]
}

View File

@ -45,8 +45,8 @@
],
"min_version": "3.0",
"status": "CURRENT",
"updated": "2018-07-17T00:00:00Z",
"version": "3.62"
"updated": "2020-11-19T08:56:00Z",
"version": "3.63"
}
]
}

View File

@ -34,7 +34,13 @@
"status": "creating",
"updated_at": null,
"user_id": "c853ca26-e8ea-4797-8a52-ee124a013d0e",
"volume_type": "__DEFAULT__"
"volume_type": "__DEFAULT__",
"volume_type_id": "5fed9d7c-401d-46e2-8e80-f30c70cb7e1d",
"provider_id": null,
"group_id": null,
"service_uuid": null,
"shared_targets": true,
"cluster_name": null
}
]
}

View File

@ -130,6 +130,7 @@ Response Parameters
- created_at: created_at
- volumes: volumes
- volume_type: volume_type_vol
- volume_type_id: volume_type_id_363
- group_id: group_id_optional
- volumes_links: links_vol_optional
- count: count
@ -375,6 +376,7 @@ Response Parameters
- bootable: bootable_response
- created_at: created_at
- volume_type: volume_type_vol
- volume_type_id: volume_type_id_363
- service_uuid: service_uuid
- shared_targets: shared_targets
- cluster_name: cluster_name

View File

@ -165,6 +165,8 @@ VOLUME_CLUSTER_NAME = '3.61'
DEFAULT_TYPE_OVERRIDES = '3.62'
VOLUME_TYPE_ID_IN_VOLUME_DETAIL = '3.63'
def get_mv_header(version):
"""Gets a formatted HTTP microversion header.

View File

@ -142,6 +142,11 @@ REST_API_VERSION_HISTORY = """
* 3.61 - Add ``cluster_name`` attribute to response body of volume details
for admin.
* 3.62 - Default volume type overrides
* 3.63 - Include volume type ID in the volume details JSON response. Before
this microversion (MV), Cinder returns only the volume type name
in the volume details. This MV affects the volume detail list
("GET /v3/{project_id}/volumes/detail") and volume-show
("GET /v3/{project_id}/volumes/{volume_id}") calls.
"""
# The minimum and maximum versions of the API supported
@ -149,9 +154,9 @@ REST_API_VERSION_HISTORY = """
# minimum version of the API supported.
# Explicitly using /v2 endpoints will still work
_MIN_API_VERSION = "3.0"
_MAX_API_VERSION = "3.62"
_MAX_API_VERSION = "3.63"
_LEGACY_API_VERSION2 = "2.0"
UPDATED = "2020-10-14T00:00:00Z"
UPDATED = "2020-11-19T08:56:00Z"
# NOTE(cyeoh): min and max versions declared as functions so we can

View File

@ -479,3 +479,9 @@ Active/Active HA mode.
Add support for set, get, and unset a default volume type for a specific
project. Setting this default overrides the configured default_volume_type
value.
3.63
----
Includes volume type ID in the volume-show and volume-detail-list JSON
responses. Before this microversion, Cinder returns only the volume type name
in the volume details.

View File

@ -75,7 +75,7 @@ class ViewBuilder(common.ViewBuilder):
'updated_at': volume.get('updated_at'),
'name': volume.get('display_name'),
'description': volume.get('display_description'),
'volume_type': self._get_volume_type(volume),
'volume_type': self._get_volume_type(request, volume),
'snapshot_id': volume.get('snapshot_id'),
'source_volid': volume.get('source_volid'),
'metadata': self._get_volume_metadata(volume),
@ -138,8 +138,8 @@ class ViewBuilder(common.ViewBuilder):
"""Retrieve the metadata of the volume object."""
return volume.metadata
def _get_volume_type(self, volume):
"""Retrieve the type the volume object."""
def _get_volume_type(self, request, volume):
"""Retrieve the type of the volume object."""
if volume['volume_type_id'] and volume.get('volume_type'):
return volume['volume_type']['name']
else:

View File

@ -66,6 +66,10 @@ class ViewBuilder(views_v2.ViewBuilder):
volume_ref['volume']['cluster_name'] = volume.get(
'cluster_name', None)
if req_version.matches(mv.VOLUME_TYPE_ID_IN_VOLUME_DETAIL, None):
volume_ref[
'volume']["volume_type_id"] = volume['volume_type'].get('id')
return volume_ref
def _list_view(self, func, request, volumes, volume_count,
@ -96,3 +100,18 @@ class ViewBuilder(views_v2.ViewBuilder):
volumes_dict['count'] = volume_count
return volumes_dict
def _get_volume_type(self, request, volume):
"""Returns the volume type of the volume.
Retrieves the volume type name for microversion 3.63.
Otherwise, it uses the default implementation from super.
"""
req_version = request.api_version_request
if req_version.matches(mv.VOLUME_TYPE_ID_IN_VOLUME_DETAIL):
if volume.get('volume_type'):
return volume['volume_type']['name']
return None
return super(ViewBuilder, self)._get_volume_type(request, volume)

View File

@ -34,7 +34,13 @@
"status": "creating",
"updated_at": null,
"user_id": "%(uuid)s",
"volume_type": "__DEFAULT__"
"volume_type": "%(name)s",
"volume_type_id": "%(uuid)s",
"service_uuid": null,
"provider_id": null,
"group_id": null,
"shared_targets": true,
"cluster_name": null
}
]
}

View File

@ -12,6 +12,7 @@
from oslo_serialization import jsonutils
from cinder.api.microversions import VOLUME_TYPE_ID_IN_VOLUME_DETAIL
from cinder.tests.functional import api_samples_test_base
@ -40,10 +41,15 @@ class VolumesSampleJsonTest(VolumesSampleBase):
self.response = self._create_volume()
def test_volume_list_detail(self):
original_api_version = self.api.api_version
try:
self.api.api_version = VOLUME_TYPE_ID_IN_VOLUME_DETAIL
response = self._do_get('volumes/detail')
self._verify_response('volumes-list-detailed-response',
{}, response, 200)
finally:
self.api.api_version = original_api_version
def test_volume_create(self):

View File

@ -0,0 +1,7 @@
---
features:
- |
Introduces microversion (MV) 3.63, which includes volume type ID in the
volume details JSON response. This MV affects the volume detail list
(``GET /v3/{project_id}/volumes/detail``), and volume-show
(``GET /v3/{project_id}/volumes/{volume_id}``) calls.