From cae5ea83effd0bf8f930b6fdf37cb60f6a4c60ca Mon Sep 17 00:00:00 2001 From: Goutham Pacha Ravi Date: Mon, 6 Apr 2020 08:52:22 -0700 Subject: [PATCH] Delete type access list when deleting types Currently we're in a foobar situation with two database models ShareTypeProjects and ShareGroupTypeProjects where we keep stuff around even when the concerned ShareType or ShareGroupType objects are deleted. So, delete type access rules when types are being deleted. Change-Id: Id135a96f2d1b7306156bab0ddedcb1b838a74f0a Closes-Bug: #1870751 Signed-off-by: Goutham Pacha Ravi (cherry picked from commit 5f80a24ff2a9e68a34e9257a1e533b5dfc8c65da) (cherry picked from commit da38cf6194fe748edc82bcbc51bd7e8127fb15c4) (cherry picked from commit 995b8c3150e00ba514d86f67388bdb43637c8a15) (cherry picked from commit d01708ef7a500929a2f92ea99b2ba14cf789a30f) --- manila/db/sqlalchemy/api.py | 25 ++++++++++++++++--- manila/tests/db/sqlalchemy/test_api.py | 24 ++++++++++++++++-- ...-access-when-deleted-4fcd49ba6e6c40bd.yaml | 8 ++++++ 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/bug-1870751-cleanup-share-type-and-group-type-project-access-when-deleted-4fcd49ba6e6c40bd.yaml diff --git a/manila/db/sqlalchemy/api.py b/manila/db/sqlalchemy/api.py index c954080c4d..adcbabdd2a 100644 --- a/manila/db/sqlalchemy/api.py +++ b/manila/db/sqlalchemy/api.py @@ -3928,10 +3928,22 @@ def share_type_destroy(context, id): 'gtypes': share_group_types_count} LOG.error(msg, msg_args) raise exception.ShareTypeInUse(share_type_id=id) - (model_query(context, models.ShareTypeExtraSpecs, session=session). - filter_by(share_type_id=id).soft_delete()) - (model_query(context, models.ShareTypes, session=session). - filter_by(id=id).soft_delete()) + + model_query( + context, models.ShareTypeExtraSpecs, session=session + ).filter_by( + share_type_id=id + ).soft_delete() + model_query( + context, models.ShareTypeProjects, session=session + ).filter_by( + share_type_id=id, + ).soft_delete() + model_query( + context, models.ShareTypes, session=session + ).filter_by( + id=id + ).soft_delete() # Destroy any quotas, usages and reservations for the share type: quota_destroy_all_by_share_type(context, id) @@ -4792,6 +4804,11 @@ def share_group_type_destroy(context, type_id): ).filter_by( share_group_type_id=type_id, ).soft_delete() + model_query( + context, models.ShareGroupTypeProjects, session=session + ).filter_by( + share_group_type_id=type_id, + ).soft_delete() model_query( context, models.ShareGroupTypes, session=session ).filter_by( diff --git a/manila/tests/db/sqlalchemy/test_api.py b/manila/tests/db/sqlalchemy/test_api.py index 287dff5c69..34c2e2aeeb 100644 --- a/manila/tests/db/sqlalchemy/test_api.py +++ b/manila/tests/db/sqlalchemy/test_api.py @@ -1139,6 +1139,12 @@ class ShareGroupTypeAPITestCase(test.TestCase): name='orange', is_public=False, share_types=[share_type_1['id']], group_specs={'dabo': 'allin', 'cadence': 'count'}, override_defaults=True) + db_api.share_group_type_access_add(self.ctxt, + share_group_type_1['id'], + "2018ndaetfigovnsaslcahfavmrpions") + db_api.share_group_type_access_add(self.ctxt, + share_group_type_1['id'], + "2016ndaetfigovnsaslcahfavmrpions") share_group_type_2 = db_utils.create_share_group_type( name='regalia', share_types=[share_type_2['id']]) if used_by_groups: @@ -1164,6 +1170,9 @@ class ShareGroupTypeAPITestCase(test.TestCase): self.assertDictMatch( {}, db_api.share_group_type_specs_get( self.ctxt, share_group_type_1['id'])) + self.assertRaises(exception.ShareGroupTypeNotFound, + db_api.share_group_type_access_get_all, + self.ctxt, share_group_type_1['id']) self.assertRaises(exception.ShareGroupTypeNotFound, db_api.share_group_type_get, self.ctxt, share_group_type_1['id']) @@ -2979,8 +2988,16 @@ class ShareTypeAPITestCase(test.TestCase): def test_share_type_destroy_in_use(self, used_by_shares, used_by_group_types): share_type_1 = db_utils.create_share_type( - name='orange', extra_specs={'somekey': 'someval'}) - share_type_2 = db_utils.create_share_type(name='regalia') + name='orange', extra_specs={'somekey': 'someval'}, + is_public=False, override_defaults=True) + share_type_2 = db_utils.create_share_type( + name='regalia', override_defaults=True) + db_api.share_type_access_add(self.ctxt, + share_type_1['id'], + "2018ndaetfigovnsaslcahfavmrpions") + db_api.share_type_access_add(self.ctxt, + share_type_1['id'], + "2016ndaetfigovnsaslcahfavmrpions") if used_by_shares: share_1 = db_utils.create_share(share_type_id=share_type_1['id']) db_utils.create_share(share_type_id=share_type_2['id']) @@ -3013,6 +3030,9 @@ class ShareTypeAPITestCase(test.TestCase): self.assertDictMatch( {}, db_api.share_type_extra_specs_get( self.ctxt, share_type_1['id'])) + self.assertRaises(exception.ShareTypeNotFound, + db_api.share_type_access_get_all, + self.ctxt, share_type_1['id']) self.assertRaises(exception.ShareTypeNotFound, db_api.share_type_get, self.ctxt, share_type_1['id']) diff --git a/releasenotes/notes/bug-1870751-cleanup-share-type-and-group-type-project-access-when-deleted-4fcd49ba6e6c40bd.yaml b/releasenotes/notes/bug-1870751-cleanup-share-type-and-group-type-project-access-when-deleted-4fcd49ba6e6c40bd.yaml new file mode 100644 index 0000000000..a4933a5892 --- /dev/null +++ b/releasenotes/notes/bug-1870751-cleanup-share-type-and-group-type-project-access-when-deleted-4fcd49ba6e6c40bd.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Fixed the cleanup for private share types and share group types to include + clearing out the database entries recording project specific access + rules to these types. See + `Launchpad bug 1870751 `_ for more + details.