"""OWS Assets API client.""" import httpx from owsclient import OwsClient from src import config from src.config import logger from constants import general from constants import errors from src import lambda_exceptions from datetime import datetime from datetime import timezone client = OwsClient( config.ENVIRONMENT, config.APPLICATION_NAME, retries=config.OWS_RETRIES, timeout=httpx.Timeout(config.OWS_TIMEOUT) ) def post_asset_status(filename, status, description, message): """Call ows-asset post asset status handler. Args: filename (str): Unique filename with extension. status (str): Status. description (str): Description. message (dict): Status message. """ try: data = { 'filename': filename, 'status': status, 'description': description, 'message': message, 'timestamp': datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%fZ') } response = client.post( service_name=config.OWS_ASSETS_SERVICE_NAME, path=config.POST_ASSET_STATUS_PATH, json=data ) if response.status_code == 404: # This happens when an asset has been replaced by a new one while it is still being processed. # The replaced asset has been marked as deleted, so we get a 404 when trying to update status for it. pass elif response.status_code != 200: error_text = 'Failed to post to ows-assets from {source}. Status: {status}; text: {text}'.format( source=config.APPLICATION_NAME, status=response.status_code, text=response.text) raise Exception(error_text) except Exception as e: logger.exception(str(e)) raise def get_asset_upload_type(filename): """ Get asset upload type by look up via filename in ows-assets. Args: filename (str): Asset's filename Returns: str: Asset upload type """ response = client.get( service_name=config.OWS_ASSETS_SERVICE_NAME, path=config.GET_ASSET_PATH, headers={'Orchard-User-Id': 'oa:179'}, params={'filename': filename, 'state': 'raw'} ) if response.status_code == 404: error_text = errors.GET_ASSET_NOT_FOUND_MESSAGE.format( source=general.LAMBDA_NAME, status=response.status_code, text=response.text) raise lambda_exceptions.AssetNotFoundException(error_text) elif response.status_code != 200: error_text = errors.GET_ASSET_UPLOAD_TYPE_ERROR_MESSAGE.format( source=general.LAMBDA_NAME, status=response.status_code, text=response.text) raise lambda_exceptions.AssetUploadTypeRetrievalException(error_text) return response.json()['asset_upload_type']