Properly invalidate cache for get_*_by_name methods
Use the original name for invalidating the cache on the get_project_by_name and get_domain_by_name when performing update operations on the name attributes. Change-Id: If58a3b0a47501096f9fa9eb9cd7a6057f7b29298 Closes-Bug: #1311142
This commit is contained in:
parent
e08b62a4eb
commit
cef4fbc997
|
@ -91,6 +91,7 @@ class Manager(manager.Manager):
|
||||||
|
|
||||||
@notifications.updated(_PROJECT)
|
@notifications.updated(_PROJECT)
|
||||||
def update_project(self, tenant_id, tenant):
|
def update_project(self, tenant_id, tenant):
|
||||||
|
original_tenant = self.driver.get_project(tenant_id)
|
||||||
tenant = tenant.copy()
|
tenant = tenant.copy()
|
||||||
if 'enabled' in tenant:
|
if 'enabled' in tenant:
|
||||||
tenant['enabled'] = clean.project_enabled(tenant['enabled'])
|
tenant['enabled'] = clean.project_enabled(tenant['enabled'])
|
||||||
|
@ -98,8 +99,8 @@ class Manager(manager.Manager):
|
||||||
self._disable_project(tenant_id)
|
self._disable_project(tenant_id)
|
||||||
ret = self.driver.update_project(tenant_id, tenant)
|
ret = self.driver.update_project(tenant_id, tenant)
|
||||||
self.get_project.invalidate(self, tenant_id)
|
self.get_project.invalidate(self, tenant_id)
|
||||||
self.get_project_by_name.invalidate(self, ret['name'],
|
self.get_project_by_name.invalidate(self, original_tenant['name'],
|
||||||
ret['domain_id'])
|
original_tenant['domain_id'])
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@notifications.deleted(_PROJECT)
|
@notifications.deleted(_PROJECT)
|
||||||
|
@ -320,6 +321,7 @@ class Manager(manager.Manager):
|
||||||
|
|
||||||
@notifications.updated('domain')
|
@notifications.updated('domain')
|
||||||
def update_domain(self, domain_id, domain):
|
def update_domain(self, domain_id, domain):
|
||||||
|
original_domain = self.driver.get_domain(domain_id)
|
||||||
if 'enabled' in domain:
|
if 'enabled' in domain:
|
||||||
domain['enabled'] = clean.domain_enabled(domain['enabled'])
|
domain['enabled'] = clean.domain_enabled(domain['enabled'])
|
||||||
ret = self.driver.update_domain(domain_id, domain)
|
ret = self.driver.update_domain(domain_id, domain)
|
||||||
|
@ -328,7 +330,7 @@ class Manager(manager.Manager):
|
||||||
if not domain.get('enabled', True):
|
if not domain.get('enabled', True):
|
||||||
self._disable_domain(domain_id)
|
self._disable_domain(domain_id)
|
||||||
self.get_domain.invalidate(self, domain_id)
|
self.get_domain.invalidate(self, domain_id)
|
||||||
self.get_domain_by_name.invalidate(self, ret['name'])
|
self.get_domain_by_name.invalidate(self, original_domain['name'])
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@notifications.deleted('domain')
|
@notifications.deleted('domain')
|
||||||
|
|
|
@ -2755,6 +2755,20 @@ class IdentityTests(object):
|
||||||
user_projects = self.assignment_api.list_projects_for_user(user1['id'])
|
user_projects = self.assignment_api.list_projects_for_user(user1['id'])
|
||||||
self.assertEqual(len(user_projects), 3)
|
self.assertEqual(len(user_projects), 3)
|
||||||
|
|
||||||
|
@tests.skip_if_cache_disabled('assignment')
|
||||||
|
def test_domain_rename_invalidates_get_domain_by_name_cache(self):
|
||||||
|
domain = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
||||||
|
'enabled': True}
|
||||||
|
domain_id = domain['id']
|
||||||
|
domain_name = domain['name']
|
||||||
|
self.assignment_api.create_domain(domain_id, domain)
|
||||||
|
domain_ref = self.assignment_api.get_domain(domain_id)
|
||||||
|
domain_ref['name'] = uuid.uuid4().hex
|
||||||
|
self.assignment_api.update_domain(domain_id, domain_ref)
|
||||||
|
self.assertRaises(exception.DomainNotFound,
|
||||||
|
self.assignment_api.get_domain_by_name,
|
||||||
|
domain_name)
|
||||||
|
|
||||||
@tests.skip_if_cache_disabled('assignment')
|
@tests.skip_if_cache_disabled('assignment')
|
||||||
def test_cache_layer_domain_crud(self):
|
def test_cache_layer_domain_crud(self):
|
||||||
domain = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
domain = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
||||||
|
@ -2810,6 +2824,25 @@ class IdentityTests(object):
|
||||||
self.assignment_api.get_domain,
|
self.assignment_api.get_domain,
|
||||||
domain_id)
|
domain_id)
|
||||||
|
|
||||||
|
@tests.skip_if_cache_disabled('assignment')
|
||||||
|
def test_project_rename_invalidates_get_project_by_name_cache(self):
|
||||||
|
domain = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
||||||
|
'enabled': True}
|
||||||
|
project = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
||||||
|
'domain_id': domain['id']}
|
||||||
|
project_id = project['id']
|
||||||
|
project_name = project['name']
|
||||||
|
self.assignment_api.create_domain(domain['id'], domain)
|
||||||
|
# Create a project
|
||||||
|
self.assignment_api.create_project(project_id, project)
|
||||||
|
self.assignment_api.get_project(project_id)
|
||||||
|
project['name'] = uuid.uuid4().hex
|
||||||
|
self.assignment_api.update_project(project_id, project)
|
||||||
|
self.assertRaises(exception.ProjectNotFound,
|
||||||
|
self.assignment_api.get_project_by_name,
|
||||||
|
project_name,
|
||||||
|
domain['id'])
|
||||||
|
|
||||||
@tests.skip_if_cache_disabled('assignment')
|
@tests.skip_if_cache_disabled('assignment')
|
||||||
def test_cache_layer_project_crud(self):
|
def test_cache_layer_project_crud(self):
|
||||||
domain = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
domain = {'id': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
|
||||||
|
|
|
@ -1144,6 +1144,18 @@ class LDAPIdentity(BaseLDAPIdentity, tests.TestCase):
|
||||||
# just skip this time.
|
# just skip this time.
|
||||||
self.skipTest('Domains are read-only against LDAP')
|
self.skipTest('Domains are read-only against LDAP')
|
||||||
|
|
||||||
|
def test_domain_rename_invalidates_get_domain_by_name_cache(self):
|
||||||
|
parent = super(LDAPIdentity, self)
|
||||||
|
self.assertRaises(
|
||||||
|
exception.Forbidden,
|
||||||
|
parent.test_domain_rename_invalidates_get_domain_by_name_cache)
|
||||||
|
|
||||||
|
def test_project_rename_invalidates_get_project_by_name_cache(self):
|
||||||
|
parent = super(LDAPIdentity, self)
|
||||||
|
self.assertRaises(
|
||||||
|
exception.Forbidden,
|
||||||
|
parent.test_project_rename_invalidates_get_project_by_name_cache)
|
||||||
|
|
||||||
def test_project_crud(self):
|
def test_project_crud(self):
|
||||||
# NOTE(topol): LDAP implementation does not currently support the
|
# NOTE(topol): LDAP implementation does not currently support the
|
||||||
# updating of a project name so this method override
|
# updating of a project name so this method override
|
||||||
|
|
Loading…
Reference in New Issue