Add user_id in backup list and show API

Add ``user_id`` to response body of list backup with detail and show
backup detail APIs. In this way, you can get the ``user_id`` in backup
list or show response, make the admin/user easy to manage backup file.

Blueprint: add-user-id-attribute-to-backup-response
Change-Id: I3ffb544ef3ee65276cee8b1e870d524fd0e57085
This commit is contained in:
zhangbailin 2018-11-02 06:22:51 -04:00
parent 4529b193da
commit 03867e3e89
11 changed files with 75 additions and 2 deletions

View File

@ -97,6 +97,7 @@ Response Parameters
- os-backup-project-attr:project_id: os-backup-project-attr:project_id
- count: count
- metadata: metadata_backup
- user_id: user_id_backup
Response Example
----------------
@ -155,6 +156,7 @@ Response Parameters
- snapshot_id: snapshot_id_source_vol
- os-backup-project-attr:project_id: os-backup-project-attr:project_id
- metadata: metadata_backup
- user_id: user_id_backup
Response Example
----------------

View File

@ -2766,6 +2766,13 @@ user_id:
in: body
required: true
type: string
user_id_backup:
description: |
The UUID of the project owner.
in: body
required: true
type: string
min_version: 3.56
user_id_min:
description: |
The UUID of the user.

View File

@ -19,6 +19,7 @@
"name": "backup001",
"object_count": 22,
"os-backup-project-attr:project_id": "2c67a14be9314c5dae2ee6c4ec90cf0b",
"user_id": "515ba0dd59f84f25a6a084a45d8d93b2",
"size": 1,
"updated_at": "2013-04-20T05:30:19.000000",
"data_timestamp": "2013-04-20T05:30:19.000000",

View File

@ -20,6 +20,7 @@
"name": "backup001",
"object_count": 22,
"os-backup-project-attr:project_id": "2c67a14be9314c5dae2ee6c4ec90cf0b",
"user_id": "515ba0dd59f84f25a6a084a45d8d93b2",
"size": 1,
"status": "available",
"updated_at": "2013-04-02T10:35:27.000000",
@ -49,6 +50,7 @@
"name": "backup002",
"object_count": 22,
"os-backup-project-attr:project_id": "2c67a14be9314c5dae2ee6c4ec90cf0b",
"user_id": "515ba0dd59f84f25a6a084a45d8d93b2",
"size": 1,
"status": "available",
"updated_at": "2013-04-02T10:21:48.000000",

View File

@ -151,6 +151,8 @@ ATTACHMENT_CREATE_MODE_ARG = '3.54'
TRANSFER_WITH_SNAPSHOTS = '3.55'
BACKUP_PROJECT_USER_ID = '3.56'
def get_mv_header(version):
"""Gets a formatted HTTP microversion header.

View File

@ -127,6 +127,8 @@ REST_API_VERSION_HISTORY = """
Also, additional parameters will not be allowed.
* 3.54 - Add ``mode`` argument to attachment-create.
* 3.55 - Support transfer volume with snapshots
* 3.56 - Add ``user_id`` attribute to response body of list backup with
detail and show backup detail APIs.
"""
# The minimum and maximum versions of the API supported
@ -134,7 +136,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.55"
_MAX_API_VERSION = "3.56"
_LEGACY_API_VERSION2 = "2.0"
UPDATED = "2018-07-17T00:00:00Z"

View File

@ -441,3 +441,8 @@ Add ``mode`` argument to attachment-create.
3.55 (Maximum in Rocky)
-----------------------
Support ability to transfer snapshots along with their parent volume.
3.56
----
Add ``user_id`` attribute to response body of list backup with detail and show
backup detail APIs.

View File

@ -65,6 +65,11 @@ class BackupsController(backups_v2.BackupsController):
key = "os-backup-project-attr:project_id"
backup[key] = db_backup['project_id']
def _add_backup_user_attribute(self, req, backup):
db_backup = req.get_db_backup(backup['id'])
key = "user_id"
backup[key] = db_backup['user_id']
def show(self, req, id):
"""Return data about the given backup."""
LOG.debug('Show backup with id %s.', id)
@ -79,6 +84,10 @@ class BackupsController(backups_v2.BackupsController):
if req_version.matches(mv.BACKUP_PROJECT):
if context.authorize(policy.BACKUP_ATTRIBUTES_POLICY, fatal=False):
self._add_backup_project_attribute(req, resp_backup['backup'])
if req_version.matches(mv.BACKUP_PROJECT_USER_ID):
if context.authorize(policy.BACKUP_ATTRIBUTES_POLICY, fatal=False):
self._add_backup_user_attribute(req, resp_backup['backup'])
return resp_backup
def detail(self, req):
@ -90,6 +99,11 @@ class BackupsController(backups_v2.BackupsController):
if context.authorize(policy.BACKUP_ATTRIBUTES_POLICY, fatal=False):
for bak in resp_backup['backups']:
self._add_backup_project_attribute(req, bak)
if req_version.matches(mv.BACKUP_PROJECT_USER_ID):
if context.authorize(policy.BACKUP_ATTRIBUTES_POLICY, fatal=False):
for bak in resp_backup['backups']:
self._add_backup_user_attribute(req, bak)
return resp_backup
def _convert_sort_name(self, req_version, sort_keys):

View File

@ -33,6 +33,7 @@ def fake_backup_get(*args, **kwargs):
bak = {
'id': fake.BACKUP_ID,
'project_id': fake.PROJECT_ID,
'user_id': fake.USER_ID,
}
return fake_backup.fake_backup_obj(ctx, **bak)
@ -101,3 +102,30 @@ class BackupProjectAttributeTest(test.TestCase):
bak = self._send_backup_request(
ctx, version=mv.get_prior_version(mv.BACKUP_PROJECT))
self.assertNotIn('os-backup-project-attr:project_id', bak)
@ddt.data(True, False)
def test_get_backup_with_user_id(self, is_admin):
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, is_admin)
bak = self._send_backup_request(ctx,
version=mv.BACKUP_PROJECT_USER_ID)
if is_admin:
self.assertEqual(fake.USER_ID, bak['user_id'])
else:
self.assertNotIn('user_id', bak)
@ddt.data(True, False)
def test_list_detail_backups_with_user_id(self, is_admin):
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, is_admin)
baks = self._send_backup_request(ctx, detail=True,
version=mv.BACKUP_PROJECT_USER_ID)
if is_admin:
self.assertEqual(fake.USER_ID,
baks[0]['user_id'])
else:
self.assertNotIn('user_id', baks[0])
def test_get_backup_user_id_before_microversion_v356(self):
ctx = context.RequestContext(fake.USER_ID, fake.PROJECT_ID, True)
bak = self._send_backup_request(
ctx, version=mv.get_prior_version(mv.BACKUP_PROJECT_USER_ID))
self.assertNotIn('user_id', bak)

View File

@ -34,6 +34,10 @@ def fake_db_backup(**updates):
'service': 'fake_service',
'object_count': 5,
'num_dependent_backups': 0,
'backup_metadata': [
{'key': 'key1', 'value': 'value1'},
{'key': 'key2', 'value': 'value2'}
],
}
for name, field in objects.Backup.fields.items():
@ -54,4 +58,5 @@ def fake_db_backup(**updates):
def fake_backup_obj(context, **updates):
return objects.Backup._from_db_object(context, objects.Backup(),
fake_db_backup(**updates))
fake_db_backup(**updates),
expected_attrs=['metadata'])

View File

@ -0,0 +1,5 @@
---
features:
- |
Add ``user_id`` attribute to response body of list backup with detail
and show backup detail APIs.