From 4fb40398fdf786bb5da6c47df146fa120e42a586 Mon Sep 17 00:00:00 2001 From: Thomas Sundvoll Date: Wed, 13 Mar 2024 14:17:44 +0100 Subject: [PATCH] Refer to blob storage in inspection result message when sending over MQTT Co-authored-by: Mariana R. Santos --- src/isar/storage/blob_storage.py | 16 ++++++++++++---- src/isar/storage/storage_interface.py | 5 +++-- src/isar/storage/uploader.py | 8 ++++---- src/isar/storage/utilities.py | 3 ++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/isar/storage/blob_storage.py b/src/isar/storage/blob_storage.py index a7806a04..153ae104 100644 --- a/src/isar/storage/blob_storage.py +++ b/src/isar/storage/blob_storage.py @@ -1,5 +1,6 @@ import logging from pathlib import Path +from typing import Union from azure.core.exceptions import ResourceExistsError from azure.storage.blob import BlobClient, BlobServiceClient, ContainerClient @@ -7,10 +8,10 @@ from isar.config.keyvault.keyvault_service import Keyvault from isar.config.settings import settings -from robot_interface.models.mission.mission import Mission from isar.storage.storage_interface import StorageException, StorageInterface from isar.storage.utilities import construct_metadata_file, construct_paths from robot_interface.models.inspection.inspection import Inspection +from robot_interface.models.mission.mission import Mission class BlobStorage(StorageInterface): @@ -31,7 +32,7 @@ def __init__( self.logger = logging.getLogger("uploader") - def store(self, inspection: Inspection, mission: Mission) -> str: + def store(self, inspection: Inspection, mission: Mission) -> Union[str, dict]: data_path, metadata_path = construct_paths( inspection=inspection, mission=mission ) @@ -43,7 +44,7 @@ def store(self, inspection: Inspection, mission: Mission) -> str: self._upload_file(path=metadata_path, data=metadata_bytes) return self._upload_file(path=data_path, data=inspection.data) - def _upload_file(self, path: Path, data: bytes) -> str: + def _upload_file(self, path: Path, data: bytes) -> Union[str, dict]: blob_client = self._get_blob_client(path) try: blob_properties = blob_client.upload_blob(data=data) @@ -55,7 +56,14 @@ def _upload_file(self, path: Path, data: bytes) -> str: except Exception as e: self.logger.error("An unexpected error occurred while uploading blob") raise StorageException from e - return blob_properties["etag"] + + absolute_inspection_path = { + "source": "blob", + "blob_storage_account_url": settings.BLOB_STORAGE_ACCOUNT_URL, + "blob_container": settings.BLOB_CONTAINER, + "blob_name": blob_client.blob_name, + } + return absolute_inspection_path def _get_blob_service_client(self) -> BlobServiceClient: try: diff --git a/src/isar/storage/storage_interface.py b/src/isar/storage/storage_interface.py index b841fcb1..d1e8dfcc 100644 --- a/src/isar/storage/storage_interface.py +++ b/src/isar/storage/storage_interface.py @@ -1,12 +1,13 @@ from abc import ABCMeta, abstractmethod +from typing import Union -from robot_interface.models.mission.mission import Mission from robot_interface.models.inspection.inspection import Inspection +from robot_interface.models.mission.mission import Mission class StorageInterface(metaclass=ABCMeta): @abstractmethod - def store(self, inspection: Inspection, mission: Mission) -> str: + def store(self, inspection: Inspection, mission: Mission) -> Union[str, dict]: """ Parameters ---------- diff --git a/src/isar/storage/uploader.py b/src/isar/storage/uploader.py index edee8455..104f37da 100644 --- a/src/isar/storage/uploader.py +++ b/src/isar/storage/uploader.py @@ -3,7 +3,7 @@ from dataclasses import dataclass from datetime import datetime, timedelta from queue import Empty, Queue -from typing import List +from typing import List, Union from injector import inject @@ -100,8 +100,8 @@ def run(self) -> None: except Empty: continue - def _upload(self, upload_item: UploaderQueueItem) -> str: - inspection_path = "" + def _upload(self, upload_item: UploaderQueueItem) -> Union[str, dict]: + inspection_path: Union[str, dict] = "" try: inspection_path = upload_item.storage_handler.store( inspection=upload_item.inspection, mission=upload_item.mission @@ -140,7 +140,7 @@ def _process_upload_queue(self) -> None: ) def _publish_inspection_result( - self, inspection: Inspection, inspection_path: str + self, inspection: Inspection, inspection_path: Union[str, dict] ) -> None: """Publishes the reference of the inspection result to the MQTT Broker along with the analysis type diff --git a/src/isar/storage/utilities.py b/src/isar/storage/utilities.py index 555c2e07..1708d377 100644 --- a/src/isar/storage/utilities.py +++ b/src/isar/storage/utilities.py @@ -79,4 +79,5 @@ def get_filename( def get_foldername(mission: Mission) -> str: - return f"{datetime.utcnow().date()}__{settings.PLANT_SHORT_NAME}__{mission.name}__{mission.id}" + mission_name: str = mission.name.replace(" ", "-") + return f"{datetime.utcnow().date()}__{settings.PLANT_SHORT_NAME}__{mission_name}__{mission.id}"