From fcb76a4b0139dcfabc11fa54eccec28757e2d0a1 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Mon, 1 Jun 2026 12:30:03 +0800 Subject: [PATCH 1/3] Apply fix from PR #2315: delete resource from resource table when removing from pool --- gns3server/db/repositories/pools.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gns3server/db/repositories/pools.py b/gns3server/db/repositories/pools.py index 84ce6e47a..61ee13029 100644 --- a/gns3server/db/repositories/pools.py +++ b/gns3server/db/repositories/pools.py @@ -203,6 +203,9 @@ class ResourcePoolsRepository(BaseRepository): resource_pool_db.resources.remove(resource) await self._db_session.commit() await self._db_session.refresh(resource_pool_db) + + await self.delete_resource(resource.resource_id) + return resource_pool_db async def get_pool_resources(self, resource_pool_id: UUID) -> List[models.Resource]: From d2848a600eb42ac689efe6e457bd009711094e9d Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Mon, 1 Jun 2026 12:43:56 +0800 Subject: [PATCH 2/3] Complete fix: delete resource records when deleting resource pool This completes the fix from PR #2315 by ensuring that when a resource pool is deleted, all associated resource records are also deleted from the resources table, preventing orphaned resource records. Changes: - Modified delete_resource_pool() to first delete all resource records in the pool before deleting the pool itself - This complements the existing fix in remove_resource_from_pool() which handles single resource removal --- gns3server/db/repositories/pools.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gns3server/db/repositories/pools.py b/gns3server/db/repositories/pools.py index 61ee13029..b5d81c607 100644 --- a/gns3server/db/repositories/pools.py +++ b/gns3server/db/repositories/pools.py @@ -156,6 +156,14 @@ class ResourcePoolsRepository(BaseRepository): Delete a resource pool. """ + # Get all resources in the pool first + resources = await self.get_pool_resources(resource_pool_id) + + # Delete all resource records + for resource in resources: + await self.delete_resource(resource.resource_id) + + # Now delete the resource pool query = delete(models.ResourcePool).where(models.ResourcePool.resource_pool_id == resource_pool_id) result = await self._db_session.execute(query) await self._db_session.commit() From f3aaa902c6d1366b02e6898f258e3cb98a8c5481 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Mon, 1 Jun 2026 12:46:15 +0800 Subject: [PATCH 3/3] Fix double deletion issue in remove_resource_from_pool Remove duplicate delete_resource call from remove_resource_from_pool since the API layer already handles resource deletion. This prevents conflicts where the API layer tries to delete a resource that was already deleted by the repository layer. The complete fix is now: - remove_resource_from_pool: Only removes resource from pool (API handles deletion) - delete_resource_pool: Deletes all resource records before deleting pool --- gns3server/db/repositories/pools.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gns3server/db/repositories/pools.py b/gns3server/db/repositories/pools.py index b5d81c607..336c29c8d 100644 --- a/gns3server/db/repositories/pools.py +++ b/gns3server/db/repositories/pools.py @@ -212,8 +212,6 @@ class ResourcePoolsRepository(BaseRepository): await self._db_session.commit() await self._db_session.refresh(resource_pool_db) - await self.delete_resource(resource.resource_id) - return resource_pool_db async def get_pool_resources(self, resource_pool_id: UUID) -> List[models.Resource]: