import json from datetime import UTC, datetime from pathlib import PurePosixPath from pydantic import BaseModel, ConfigDict, ValidationError from src.atmos.models import AtmosValidationResult from src.config import APPLICATION_NAME from src.connectors.ows import ows from src.worker import NonEmptyStr VALIDATION_COMPLETE = "validation_complete" VALIDATION_WARNING = "validation_warning" VALIDATION_ERROR = "validation_error" class OwsAssetsError(Exception): pass class OwsAssetsNotFound(OwsAssetsError): pass class _StereoReference(BaseModel): # ows-assets owns this response shape; ignore unknown fields so it can add # them without forcing a lockstep deploy here. model_config = ConfigDict(frozen=True, extra="ignore") bucket: NonEmptyStr key: NonEmptyStr def get_stereo_for_asset(asset_key: str) -> tuple[str, str]: asset_upload_filename = PurePosixPath(asset_key).name response = ows().get( service_name="ows-assets", path=f"/internal/assets/{asset_upload_filename}/stereo", ) if response.status_code == 404: raise OwsAssetsNotFound( f"ows-assets returned 404 for stereo lookup of asset_key={asset_key!r}: {response.text}" ) if response.status_code != 200: raise OwsAssetsError( f"ows-assets returned {response.status_code} for stereo lookup of asset_key={asset_key!r}: {response.text}" ) try: stereo = _StereoReference.model_validate(response.json()) except ValidationError as exc: raise OwsAssetsError( f"ows-assets stereo response malformed for asset_key={asset_key!r}: {response.text}" ) from exc return stereo.bucket, stereo.key def post_validation_result(asset_key: str, atmos_validation_result: AtmosValidationResult) -> None: if atmos_validation_result.errors: status = VALIDATION_ERROR elif atmos_validation_result.warnings: status = VALIDATION_WARNING else: status = VALIDATION_COMPLETE metadata = atmos_validation_result.metadata description = json.dumps( { "metadata": metadata.model_dump(mode="json") if metadata else None, "errors": atmos_validation_result.errors, "warnings": atmos_validation_result.warnings, } ) response = ows().post( service_name="ows-assets", path="/v2/asset/status", json={ "filename": PurePosixPath(asset_key).name, "status": status, "message": { "function": APPLICATION_NAME, "status": status, "description": description, }, "timestamp": datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%S.%fZ"), }, ) if response.status_code == 404: raise OwsAssetsNotFound( f"ows-assets returned 404 for /v2/asset/status of asset_key={asset_key!r}: {response.text}" ) if response.status_code != 200: raise OwsAssetsError( f"ows-assets returned {response.status_code} for /v2/asset/status of " f"asset_key={asset_key!r}: {response.text}" )