Add project_id in group list and show API
Add ``project_id`` to response body of list groups with detail and show group detail APIs. Depends-On: I190cc67a001ffce2a533480e6e39e26cd3f981df Change-Id: I3bc34a30b02f8a1ec2c5fecbcde6bd369c8e4a76 Implements: blueprint add-project-id-to-group-response
This commit is contained in:
parent
45f967ef9a
commit
b079d1a022
@ -165,6 +165,7 @@ Response Parameters
|
||||
- name: group_name
|
||||
- volumes: volume_ids
|
||||
- replication_status: group_replication_status
|
||||
- project_id: project_id_group
|
||||
|
||||
Response Example
|
||||
----------------
|
||||
@ -316,6 +317,7 @@ Response Parameters
|
||||
- id: group_id_path
|
||||
- name: name
|
||||
- volumes: volume_ids
|
||||
- project_id: project_id_group
|
||||
|
||||
Response Example
|
||||
----------------
|
||||
|
@ -2148,6 +2148,13 @@ project_id:
|
||||
in: body
|
||||
required: true
|
||||
type: string
|
||||
project_id_group:
|
||||
description: |
|
||||
The UUID of the volume group project.
|
||||
in: body
|
||||
required: true
|
||||
type: string
|
||||
min_version: 3.58
|
||||
project_id_host:
|
||||
description: |
|
||||
The Project ID which the host resource belongs to.
|
||||
|
@ -12,6 +12,7 @@
|
||||
],
|
||||
"volumes": ["a2cdf1ad-5497-4e57-bd7d-f573768f3d03"],
|
||||
"group_snapshot_id": null,
|
||||
"source_group_id": null
|
||||
"source_group_id": null,
|
||||
"project_id": "7ccf4863071f44aeb8f141f65780c51b"
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,8 @@
|
||||
"4e9e6d23-eed0-426d-b90a-28f87a94b6fe",
|
||||
"a3d55d15-eeb1-4816-ada9-bf82decc09b3"
|
||||
],
|
||||
"volumes": ["a2cdf1ad-5497-4e57-bd7d-f573768f3d03"]
|
||||
"volumes": ["a2cdf1ad-5497-4e57-bd7d-f573768f3d03"],
|
||||
"project_id": "7ccf4863071f44aeb8f141f65780c51b"
|
||||
},
|
||||
{
|
||||
"id": "aed36625-a6d7-4681-ba59-c7ba3d18c148",
|
||||
@ -25,7 +26,8 @@
|
||||
"volume_types": [
|
||||
"c4daaf47-c530-4901-b28e-f5f0a359c4e6"
|
||||
],
|
||||
"volumes": ["a2cdf1ad-5497-4e57-bd7d-f573768f3d03"]
|
||||
"volumes": ["a2cdf1ad-5497-4e57-bd7d-f573768f3d03"],
|
||||
"project_id": "7ccf4863071f44aeb8f141f65780c51b"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -22,7 +22,7 @@
|
||||
"min_version": "3.0",
|
||||
"status": "CURRENT",
|
||||
"updated": "2018-07-17T00:00:00Z",
|
||||
"version": "3.57"
|
||||
"version": "3.58"
|
||||
}
|
||||
]
|
||||
}
|
@ -46,7 +46,7 @@
|
||||
"min_version": "3.0",
|
||||
"status": "CURRENT",
|
||||
"updated": "2018-07-17T00:00:00Z",
|
||||
"version": "3.57"
|
||||
"version": "3.58"
|
||||
}
|
||||
]
|
||||
}
|
@ -155,6 +155,8 @@ BACKUP_PROJECT_USER_ID = '3.56'
|
||||
|
||||
TRANSFER_WITH_HISTORY = '3.57'
|
||||
|
||||
GROUP_PROJECT_ID = '3.58'
|
||||
|
||||
|
||||
def get_mv_header(version):
|
||||
"""Gets a formatted HTTP microversion header.
|
||||
|
@ -131,6 +131,8 @@ REST_API_VERSION_HISTORY = """
|
||||
detail and show backup detail APIs.
|
||||
* 3.57 - Add 'source_project_id', 'destination_project_id', 'accepted' to
|
||||
transfer.
|
||||
* 3.58 - Add ``project_id`` attribute to response body of list groups with
|
||||
detail and show group detail APIs.
|
||||
"""
|
||||
|
||||
# The minimum and maximum versions of the API supported
|
||||
@ -138,7 +140,7 @@ 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.57"
|
||||
_MAX_API_VERSION = "3.58"
|
||||
_LEGACY_API_VERSION2 = "2.0"
|
||||
UPDATED = "2018-07-17T00:00:00Z"
|
||||
|
||||
|
@ -452,3 +452,8 @@ backup detail APIs.
|
||||
Expanded volume transfer record details by adding ``source_project_id``,
|
||||
``destination_project_id`` and ``accepted`` fields to ``transfer`` table and
|
||||
related api (create/show/list detail transfer APIs) responses.
|
||||
|
||||
3.58
|
||||
----
|
||||
Add ``project_id`` attribute to response body of list groups with detail and show
|
||||
group detail APIs.
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
from cinder.api import common
|
||||
from cinder.api import microversions as mv
|
||||
from cinder.policies import groups as policy
|
||||
from cinder import utils
|
||||
|
||||
|
||||
@ -46,6 +47,7 @@ class ViewBuilder(common.ViewBuilder):
|
||||
|
||||
def detail(self, request, group):
|
||||
"""Detailed view of a single group."""
|
||||
context = request.environ['cinder.context']
|
||||
group_ref = {
|
||||
'group': {
|
||||
'id': group.id,
|
||||
@ -78,6 +80,10 @@ class ViewBuilder(common.ViewBuilder):
|
||||
if req_version.matches(mv.GROUP_REPLICATION, None):
|
||||
group_ref['group']['replication_status'] = group.replication_status
|
||||
|
||||
if req_version.matches(mv.GROUP_PROJECT_ID, None):
|
||||
if context.authorize(policy.GROUP_ATTRIBUTES_POLICY, fatal=False):
|
||||
group_ref['group']['project_id'] = group.project_id
|
||||
|
||||
return group_ref
|
||||
|
||||
def _list_view(self, func, request, groups):
|
||||
|
@ -21,6 +21,7 @@ CREATE_POLICY = 'group:create'
|
||||
UPDATE_POLICY = 'group:update'
|
||||
GET_POLICY = 'group:get'
|
||||
GET_ALL_POLICY = 'group:get_all'
|
||||
GROUP_ATTRIBUTES_POLICY = 'group:group_project_attribute'
|
||||
|
||||
|
||||
groups_policies = [
|
||||
@ -68,6 +69,20 @@ groups_policies = [
|
||||
'path': '/groups/{group_id}'
|
||||
}
|
||||
]),
|
||||
policy.DocumentedRuleDefault(
|
||||
name=GROUP_ATTRIBUTES_POLICY,
|
||||
check_str=base.RULE_ADMIN_API,
|
||||
description="List groups or show group with project attributes.",
|
||||
operations=[
|
||||
{
|
||||
'method': 'GET',
|
||||
'path': '/groups/{group_id}'
|
||||
},
|
||||
{
|
||||
'method': 'GET',
|
||||
'path': '/groups/detail'
|
||||
}
|
||||
]),
|
||||
]
|
||||
|
||||
|
||||
|
@ -1419,3 +1419,55 @@ class GroupsAPITestCase(test.TestCase):
|
||||
self.assertIn('replication_targets', response)
|
||||
self.assertEqual('lvm_backend_1',
|
||||
response['replication_targets'][0]['backend_id'])
|
||||
|
||||
def test_show_group_with_project_id(self):
|
||||
# If the microversion >= 3.58 and "is_admin=True", "project_id" should
|
||||
# be contained in the response body.
|
||||
req = fakes.HTTPRequest.blank('/v3/%s/groups/%s' %
|
||||
(fake.PROJECT_ID, self.group1.id),
|
||||
version=mv.GROUP_PROJECT_ID,
|
||||
use_admin_context=True)
|
||||
res_dict = self.controller.show(req, self.group1.id)
|
||||
self.assertEqual(1, len(res_dict))
|
||||
self.assertEqual(fake.PROJECT_ID,
|
||||
res_dict['group']['project_id'])
|
||||
|
||||
# If the microversion < 3.58, "project_id" should not be
|
||||
# contained in the response body.
|
||||
req = fakes.HTTPRequest.blank(
|
||||
'/v3/%s/groups/%s' %
|
||||
(fake.PROJECT_ID, self.group1.id),
|
||||
version=mv.get_prior_version(mv.GROUP_PROJECT_ID),
|
||||
use_admin_context=True)
|
||||
res_dict = self.controller.show(req, self.group1.id)
|
||||
self.assertEqual(1, len(res_dict))
|
||||
self.assertIsNone(res_dict['group'].get('project_id', None))
|
||||
|
||||
def test_list_groups_with_project_id(self):
|
||||
self.group1.group_type_id = fake.GROUP_TYPE_ID
|
||||
self.group1.save()
|
||||
|
||||
self.group2.group_type_id = fake.GROUP_TYPE2_ID
|
||||
self.group2.save()
|
||||
|
||||
req = fakes.HTTPRequest.blank(('/v3/%s/groups/detail'
|
||||
% self.ctxt.project_id),
|
||||
version=mv.GROUP_PROJECT_ID,
|
||||
use_admin_context=True)
|
||||
res_dict = self.controller.detail(req)
|
||||
|
||||
self.assertEqual(1, len(res_dict))
|
||||
self.assertEqual(self.group1.project_id,
|
||||
res_dict['groups'][0]['project_id'])
|
||||
self.assertEqual(self.group2.project_id,
|
||||
res_dict['groups'][1]['project_id'])
|
||||
|
||||
def test_show_group_without_project_id(self):
|
||||
# If the microversion >= 3.58 and "is_admin=False", "project_id" should
|
||||
# not be contained in the response body.
|
||||
req = fakes.HTTPRequest.blank('/v3/%s/groups/%s' %
|
||||
(fake.PROJECT_ID, self.group3.id),
|
||||
version=mv.GROUP_PROJECT_ID)
|
||||
res_dict = self.controller.show(req, self.group1.id)
|
||||
self.assertEqual(1, len(res_dict))
|
||||
self.assertNotIn('project_id', res_dict['group'])
|
||||
|
@ -0,0 +1,5 @@
|
||||
---
|
||||
features:
|
||||
- |
|
||||
Added ``project_id`` attribute to response body of list groups with detail
|
||||
and show group detail APIs.
|
Loading…
Reference in New Issue
Block a user