Fix re-adding deleted members to an image in v1

If you replace the membership list of an image with some members
that were previously deleted, we fail to re-add those deleted
members.

This seems to be a consequence of a previous commit
d6800e143d which failed to update
the deleted records.

Closes-Bug: 1527143

Change-Id: Ic3ca9b56712a99652e65cb0a4e3f1e0ba15b8593
This commit is contained in:
Sabari Kumar Murugesan 2015-12-17 00:25:38 -08:00 committed by Stuart McLaren
parent 515203eac7
commit 700b7ef26d
5 changed files with 49 additions and 10 deletions

View File

@ -128,7 +128,8 @@ def _image_property_format(image_id, name, value):
}
def _image_member_format(image_id, tenant_id, can_share, status='pending'):
def _image_member_format(image_id, tenant_id, can_share, status='pending',
deleted=False):
dt = timeutils.utcnow()
return {
'id': str(uuid.uuid4()),
@ -138,6 +139,7 @@ def _image_member_format(image_id, tenant_id, can_share, status='pending'):
'status': status,
'created_at': dt,
'updated_at': dt,
'deleted': deleted,
}
@ -503,7 +505,8 @@ def image_member_create(context, values):
member = _image_member_format(values['image_id'],
values['member'],
values.get('can_share', False),
values.get('status', 'pending'))
values.get('status', 'pending'),
values.get('deleted', False))
global DATA
DATA['members'].append(member)
return copy.deepcopy(member)

View File

@ -1056,7 +1056,8 @@ def _image_member_format(member_ref):
'can_share': member_ref['can_share'],
'status': member_ref['status'],
'created_at': member_ref['created_at'],
'updated_at': member_ref['updated_at']
'updated_at': member_ref['updated_at'],
'deleted': member_ref['deleted']
}

View File

@ -176,7 +176,8 @@ class Controller(object):
# memberships to modify. Let's start by walking through all
# the existing image memberships...
existing_members = self.db_api.image_member_find(req.context,
image_id=image['id'])
image_id=image['id'],
include_deleted=True)
for member in existing_members:
if member['id'] in existing:
# Just update the membership in place
@ -185,8 +186,9 @@ class Controller(object):
member['id'],
update)
else:
# Outdated one; needs to be deleted
self.db_api.image_member_delete(req.context, member['id'])
if not member['deleted']:
# Outdated one; needs to be deleted
self.db_api.image_member_delete(req.context, member['id'])
# Now add the non-existent ones
for memb in add:

View File

@ -1173,6 +1173,7 @@ class DriverTests(object):
'image_id': UUID1,
'can_share': False,
'status': 'pending',
'deleted': False,
}
self.assertEqual(expected, actual)
@ -1192,7 +1193,8 @@ class DriverTests(object):
expected = {'member': TENANT1,
'image_id': UUID1,
'status': 'pending',
'can_share': False}
'can_share': False,
'deleted': False}
self.assertEqual(expected, member)
member = self.db_api.image_member_update(self.context,
@ -1206,7 +1208,8 @@ class DriverTests(object):
expected = {'member': TENANT1,
'image_id': UUID1,
'status': 'pending',
'can_share': True}
'can_share': True,
'deleted': False}
self.assertEqual(expected, member)
members = self.db_api.image_member_find(self.context,
@ -1233,7 +1236,8 @@ class DriverTests(object):
expected = {'member': TENANT1,
'image_id': UUID1,
'status': 'pending',
'can_share': False}
'can_share': False,
'deleted': False}
self.assertEqual(expected, member)
member = self.db_api.image_member_update(self.context,
@ -1247,7 +1251,8 @@ class DriverTests(object):
expected = {'member': TENANT1,
'image_id': UUID1,
'status': 'accepted',
'can_share': False}
'can_share': False,
'deleted': False}
self.assertEqual(expected, member)
members = self.db_api.image_member_find(self.context,

View File

@ -1640,6 +1640,34 @@ class TestRegistryAPI(base.IsolatedUnitTest, test_utils.RegistryAPIMixIn):
method='PUT', body=body,
content_type='json')
def test_update_all_image_existing_deleted_members(self):
"""
Test update existing image members
"""
UUID8 = _gen_uuid()
extra_fixture = self.get_fixture(id=UUID8, size=19, protected=False,
owner='test user')
db_api.image_create(self.context, extra_fixture)
# Add a new member to an image
req = webob.Request.blank('/images/%s/members/test1' % UUID8)
req.method = 'PUT'
req.get_response(self.api)
# Delete the existing member
self.get_api_response_ext(204, method='DELETE',
url='/images/%s/members/test1' % UUID8)
# Re-add the deleted member by replacing membership list
fixture = [dict(member_id='test1', can_share=False)]
body = jsonutils.dump_as_bytes(dict(memberships=fixture))
self.get_api_response_ext(204, url='/images/%s/members' % UUID8,
method='PUT', body=body,
content_type='json')
memb_list = db_api.image_member_find(self.context, image_id=UUID8)
self.assertEqual(1, len(memb_list))
def test_add_member(self):
"""
Tests adding image members raises right exception