diff --git a/gns3server/db/repositories/templates.py b/gns3server/db/repositories/templates.py index ec8215af8..c141008d0 100644 --- a/gns3server/db/repositories/templates.py +++ b/gns3server/db/repositories/templates.py @@ -16,6 +16,7 @@ # along with this program. If not, see . import os +import logging from uuid import UUID from typing import List, Union, Optional @@ -29,6 +30,8 @@ from .base import BaseRepository import gns3server.db.models as models from gns3server import schemas +log = logging.getLogger(__name__) + TEMPLATE_TYPE_TO_MODEL = { "cloud": models.CloudTemplate, "docker": models.DockerTemplate, @@ -123,8 +126,16 @@ class TemplatesRepository(BaseRepository): where(models.Image.filename == image_name, models.Image.path.endswith(image_path)) else: query = select(models.Image).where(models.Image.filename == image_name) + query = query.order_by(models.Image.image_id) result = await self._db_session.execute(query) - return result.scalars().one_or_none() + images = result.scalars().all() + if len(images) > 1: + log.warning( + f"Multiple DB entries found for image '{image_path}' " + f"({len(images)} rows). This indicates a data integrity issue. " + f"Using the entry with the lowest image_id ({images[0].image_id})." + ) + return images[0] if images else None async def add_image_to_template( self, diff --git a/gns3server/services/templates.py b/gns3server/services/templates.py index 92b78633e..6502b0811 100644 --- a/gns3server/services/templates.py +++ b/gns3server/services/templates.py @@ -267,9 +267,13 @@ class TemplatesService: raise ControllerNotFoundError(f"Template '{template_id}' not found") return template - async def _remove_image(self, template_id: UUID, image_path:str) -> None: + async def _remove_image(self, template_id: UUID, image_path: str) -> None: + if not image_path: + return image = await self._templates_repo.get_image(image_path) + if image is None: + return await self._templates_repo.remove_image_from_template(template_id, image) async def update_template(self, template_id: UUID, template_update: schemas.TemplateUpdate) -> dict: