From 81c955dd5da075f8b344c166611d3ed5c47c9787 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Wed, 25 Sep 2024 09:20:21 +0000 Subject: [PATCH 1/3] refactor: define a single method to remove entities from authz --- components/renku_data_services/authz/authz.py | 112 ++++++++++-------- .../authz/test_authorization.py | 4 +- 2 files changed, 65 insertions(+), 51 deletions(-) diff --git a/components/renku_data_services/authz/authz.py b/components/renku_data_services/authz/authz.py index 38386204c..ce7d0cf87 100644 --- a/components/renku_data_services/authz/authz.py +++ b/components/renku_data_services/authz/authz.py @@ -473,7 +473,7 @@ async def _get_authz_change( authz_change = db_repo.authz._add_project(result) case AuthzOperation.delete, ResourceType.project if isinstance(result, Project): user = _extract_user_from_args(*func_args, **func_kwargs) - authz_change = await db_repo.authz._remove_project(user, result) + authz_change = await db_repo.authz._remove_entity(user, result) case AuthzOperation.delete, ResourceType.project if result is None: # NOTE: This means that the project does not exist in the first place so nothing was deleted pass @@ -489,7 +489,7 @@ async def _get_authz_change( authz_change = db_repo.authz._add_group(result) case AuthzOperation.delete, ResourceType.group if isinstance(result, Group): user = _extract_user_from_args(*func_args, **func_kwargs) - authz_change = await db_repo.authz._remove_group(user, result) + authz_change = await db_repo.authz._remove_entity(user, result) case AuthzOperation.delete, ResourceType.group if result is None: # NOTE: This means that the group does not exist in the first place so nothing was deleted pass @@ -569,6 +569,65 @@ async def decorated_function( return decorator + async def _remove_entity( + self, user: base_models.APIUser, resource: UserInfo | Group | Namespace | Project + ) -> _AuthzChange: + resource_type: ResourceType + match resource: + case _ if isinstance(resource, UserInfo): + resource_type = ResourceType.user + case _ if isinstance(resource, Group): + resource_type = ResourceType.group + case _ if isinstance(resource, Namespace) and resource.kind == NamespaceKind.user: + resource_type = ResourceType.user_namespace + case _ if isinstance(resource, Namespace): + raise errors.ProgrammingError( + message=f"Cannot handle deletetion of namespace {resource.id} of kind {resource.kind.value}." + ) + case _ if isinstance(resource, Project): + resource_type = ResourceType.project + case _: + raise errors.ProgrammingError(message="Cannot handle deletion of unknown resource.") + resource_id = str(resource.id) + + @_is_allowed_on_resource(Scope.DELETE, resource_type) + async def _remove_entity_wrapped( + authz: Authz, + user: base_models.APIUser, + resource: UserInfo | Group | Namespace | Project, + *, + zed_token: ZedToken | None = None, + ) -> _AuthzChange: + consistency = Consistency(at_least_as_fresh=zed_token) if zed_token else Consistency(fully_consistent=True) + rels: list[Relationship] = [] + # Get relations where the entity is the resource + rel_filter = RelationshipFilter(resource_type=resource_type.value, optional_resource_id=resource_id) + responses: AsyncIterable[ReadRelationshipsResponse] = authz.client.ReadRelationships( + ReadRelationshipsRequest(consistency=consistency, relationship_filter=rel_filter) + ) + async for response in responses: + rels.append(response.relationship) + # Get relations where the entity is the subject + rel_filter = RelationshipFilter( + optional_subject_filter=SubjectFilter(subject_type=resource_type, optional_subject_id=resource_id) + ) + responses: AsyncIterable[ReadRelationshipsResponse] = authz.client.ReadRelationships( + ReadRelationshipsRequest(consistency=consistency, relationship_filter=rel_filter) + ) + async for response in responses: + rels.append(response.relationship) + apply = WriteRelationshipsRequest( + updates=[ + RelationshipUpdate(operation=RelationshipUpdate.OPERATION_DELETE, relationship=i) for i in rels + ] + ) + undo = WriteRelationshipsRequest( + updates=[RelationshipUpdate(operation=RelationshipUpdate.OPERATION_TOUCH, relationship=i) for i in rels] + ) + return _AuthzChange(apply=apply, undo=undo) + + return await _remove_entity_wrapped(self, user, resource) + def _add_project(self, project: Project) -> _AuthzChange: """Create the new project and associated resources and relations in the DB.""" creator = SubjectReference(object=_AuthzConverter.user(project.created_by)) @@ -618,27 +677,6 @@ def _add_project(self, project: Project) -> _AuthzChange: ) return _AuthzChange(apply=apply, undo=undo) - @_is_allowed_on_resource(Scope.DELETE, ResourceType.project) - async def _remove_project( - self, user: base_models.APIUser, project: Project, *, zed_token: ZedToken | None = None - ) -> _AuthzChange: - """Remove the relationships associated with the project.""" - consistency = Consistency(at_least_as_fresh=zed_token) if zed_token else Consistency(fully_consistent=True) - rel_filter = RelationshipFilter(resource_type=ResourceType.project.value, optional_resource_id=str(project.id)) - responses: AsyncIterable[ReadRelationshipsResponse] = self.client.ReadRelationships( - ReadRelationshipsRequest(consistency=consistency, relationship_filter=rel_filter) - ) - rels: list[Relationship] = [] - async for response in responses: - rels.append(response.relationship) - apply = WriteRelationshipsRequest( - updates=[RelationshipUpdate(operation=RelationshipUpdate.OPERATION_DELETE, relationship=i) for i in rels] - ) - undo = WriteRelationshipsRequest( - updates=[RelationshipUpdate(operation=RelationshipUpdate.OPERATION_TOUCH, relationship=i) for i in rels] - ) - return _AuthzChange(apply=apply, undo=undo) - # NOTE changing visibility is the same access level as removal @_is_allowed_on_resource(Scope.DELETE, ResourceType.project) async def _update_project_visibility( @@ -1025,7 +1063,7 @@ def _add_admin(self, user_id: str) -> _AuthzChange: return _AuthzChange(apply=apply, undo=undo) async def _remove_admin(self, user_id: str) -> _AuthzChange: - """Add a deployment-wide administrator in the authorization database.""" + """Remove a deployment-wide administrator from the authorization database.""" existing_admin_ids = await self._get_admin_user_ids() rel = Relationship( resource=_AuthzConverter.platform(), @@ -1086,31 +1124,6 @@ def _add_group(self, group: Group) -> _AuthzChange: ) return _AuthzChange(apply=apply, undo=undo) - @_is_allowed_on_resource(Scope.DELETE, ResourceType.group) - async def _remove_group( - self, user: base_models.APIUser, group: Group, *, zed_token: ZedToken | None = None - ) -> _AuthzChange: - """Remove the group from the authorization database.""" - if not group.id: - raise errors.ProgrammingError( - message="Cannot remove a group in the authorization database if the group has no ID" - ) - consistency = Consistency(at_least_as_fresh=zed_token) if zed_token else Consistency(fully_consistent=True) - rel_filter = RelationshipFilter(resource_type=ResourceType.group.value, optional_resource_id=str(group.id)) - responses = self.client.ReadRelationships( - ReadRelationshipsRequest(consistency=consistency, relationship_filter=rel_filter) - ) - rels: list[Relationship] = [] - async for response in responses: - rels.append(response.relationship) - apply = WriteRelationshipsRequest( - updates=[RelationshipUpdate(operation=RelationshipUpdate.OPERATION_DELETE, relationship=i) for i in rels] - ) - undo = WriteRelationshipsRequest( - updates=[RelationshipUpdate(operation=RelationshipUpdate.OPERATION_TOUCH, relationship=i) for i in rels] - ) - return _AuthzChange(apply=apply, undo=undo) - @_is_allowed(Scope.CHANGE_MEMBERSHIP) async def upsert_group_members( self, @@ -1341,6 +1354,7 @@ def _add_user_namespace(self, namespace: Namespace) -> _AuthzChange: ) return _AuthzChange(apply=apply, undo=undo) + # TODO: remove this method and replace it with _remove_entity() async def _remove_user_namespace(self, user_id: str, zed_token: ZedToken | None = None) -> _AuthzChange: """Remove the user namespace from the authorization database.""" consistency = Consistency(at_least_as_fresh=zed_token) if zed_token else Consistency(fully_consistent=True) diff --git a/test/components/renku_data_services/authz/test_authorization.py b/test/components/renku_data_services/authz/test_authorization.py index 830129be4..24ed07e8e 100644 --- a/test/components/renku_data_services/authz/test_authorization.py +++ b/test/components/renku_data_services/authz/test_authorization.py @@ -76,7 +76,7 @@ async def test_adding_deleting_project(app_config: Config, bootstrap_admins, pub assert not await authz.has_permission(anon_user, ResourceType.project, project_id, Scope.DELETE) assert not await authz.has_permission(regular_user2, ResourceType.project, project_id, Scope.WRITE) assert not await authz.has_permission(regular_user2, ResourceType.project, project_id, Scope.DELETE) - authz_changes = await authz._remove_project(project_owner, project) + authz_changes = await authz._remove_entity(project_owner, project) await authz.client.WriteRelationships(authz_changes.apply) assert not await authz.has_permission(admin_user, ResourceType.project, project_id, Scope.READ) assert not await authz.has_permission(admin_user, ResourceType.project, project_id, Scope.WRITE) @@ -291,7 +291,7 @@ async def test_listing_projects_with_access(app_config: Config, bootstrap_admins == 0 ) # Test project deletion - changes = await authz._remove_project(project_owner, private_project1) + changes = await authz._remove_entity(project_owner, private_project1) await authz.client.WriteRelationships(changes.apply) assert private_project_id1_str not in set( await authz.resources_with_permission(admin_user, project_owner.id, ResourceType.project, Scope.READ) From a3f4ee7ecd03f02e7588bd4a611f4da7cc778c66 Mon Sep 17 00:00:00 2001 From: Tasko Olevski Date: Wed, 25 Sep 2024 11:55:32 +0200 Subject: [PATCH 2/3] chore: fix polylith error in tests --- projects/secrets_storage/poetry.lock | 60 +++++++++++++++++-------- projects/secrets_storage/pyproject.toml | 1 + 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/projects/secrets_storage/poetry.lock b/projects/secrets_storage/poetry.lock index b383540bd..985b29227 100644 --- a/projects/secrets_storage/poetry.lock +++ b/projects/secrets_storage/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiofile" @@ -689,6 +689,28 @@ files = [ [package.dependencies] python-dateutil = ">=2.4" +[[package]] +name = "fakeredis" +version = "2.24.1" +description = "Python implementation of redis API, can be used for testing purposes." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "fakeredis-2.24.1-py3-none-any.whl", hash = "sha256:09d3049a29910f80c0ef5789c31bef3dbb9727bd43a67ee8598217f4efd12f35"}, + {file = "fakeredis-2.24.1.tar.gz", hash = "sha256:4a52ab0edad53543ac5e3a41d761f91012613ed583344da54ae6473e05b0f6d0"}, +] + +[package.dependencies] +redis = ">=4" +sortedcontainers = ">=2,<3" + +[package.extras] +bf = ["pyprobables (>=0.6,<0.7)"] +cf = ["pyprobables (>=0.6,<0.7)"] +json = ["jsonpath-ng (>=1.6,<2.0)"] +lua = ["lupa (>=2.1,<3.0)"] +probabilistic = ["pyprobables (>=0.6,<0.7)"] + [[package]] name = "fastavro" version = "1.9.4" @@ -1846,7 +1868,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1854,16 +1875,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1880,7 +1893,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1888,7 +1900,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2003,24 +2014,24 @@ python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, @@ -2028,7 +2039,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, @@ -2036,7 +2047,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, @@ -2044,7 +2055,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, @@ -2209,6 +2220,17 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + [[package]] name = "sqlalchemy" version = "2.0.35" @@ -2661,4 +2683,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "9e5f5ec62eee96154f9285a33e0e3f649a9240ef30c217f94ec17031ced5a390" +content-hash = "5545a1968f16a0f7b7be44a3866c91bfb3bb8536c8b2b79a7d60b5cc270b9cfc" diff --git a/projects/secrets_storage/pyproject.toml b/projects/secrets_storage/pyproject.toml index 38fe9a260..3f442de7c 100644 --- a/projects/secrets_storage/pyproject.toml +++ b/projects/secrets_storage/pyproject.toml @@ -66,6 +66,7 @@ aiofile = "^3.8.8" [tool.poetry.group.dev.dependencies] pyavro-gen = "^0.3.3" avro-preprocessor = "^0.3.0" +fakeredis = "^2.24.1" [build-system] requires = ["poetry-core>=1.0.0"] From 03e70ab0687adcbe57e8a74818a9d4d5712a0b89 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Wed, 25 Sep 2024 12:59:13 +0000 Subject: [PATCH 3/3] update error message --- components/renku_data_services/authz/authz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/renku_data_services/authz/authz.py b/components/renku_data_services/authz/authz.py index ce7d0cf87..cd8f982e9 100644 --- a/components/renku_data_services/authz/authz.py +++ b/components/renku_data_services/authz/authz.py @@ -582,7 +582,7 @@ async def _remove_entity( resource_type = ResourceType.user_namespace case _ if isinstance(resource, Namespace): raise errors.ProgrammingError( - message=f"Cannot handle deletetion of namespace {resource.id} of kind {resource.kind.value}." + message=f"Cannot handle deletetion of namespace {resource.slug} of kind {resource.kind.value}." ) case _ if isinstance(resource, Project): resource_type = ResourceType.project