From a5cd1611eb1348095a64a26e83b533217555daf1 Mon Sep 17 00:00:00 2001
From: Phil Owen <19691521+PhillipsOwen@users.noreply.github.com>
Date: Wed, 23 Oct 2024 16:10:37 -0400
Subject: [PATCH] adding site branding names and functionality
---
src/common/utils.py | 9 ++++
src/server.py | 104 ++++++++++++++++++++++++++++++++++++--------
2 files changed, 94 insertions(+), 19 deletions(-)
diff --git a/src/common/utils.py b/src/common/utils.py
index 0d9dde0..a14213c 100644
--- a/src/common/utils.py
+++ b/src/common/utils.py
@@ -14,6 +14,7 @@
import os
import shutil
+from enum import Enum
class GenUtils:
@@ -49,3 +50,11 @@ def cleanup(file_path: str):
:return:
"""
shutil.rmtree(file_path)
+
+
+class BrandName(str, Enum):
+ """
+ Class enum for k8s job type names
+ """
+ APSVIZ = 'APSViz'
+ noop = 'NOOP'
diff --git a/src/server.py b/src/server.py
index 56ba0fc..c4fe1ba 100644
--- a/src/server.py
+++ b/src/server.py
@@ -26,7 +26,7 @@
from src.common.pg_impl import PGImplementation
from src.common.security import Security
from src.common.bearer import JWTBearer
-from src.common.utils import GenUtils
+from src.common.utils import GenUtils, BrandName
from src.common.geopoints import GeoPoint
# set the app version
@@ -55,7 +55,7 @@
@APP.get('/get_ui_data', status_code=200, response_model=None)
-async def get_terria_map_catalog_data(grid_type: Union[str, None] = Query(default=None), event_type: Union[str, None] = Query(default=None),
+async def get_ui_data(grid_type: Union[str, None] = Query(default=None), event_type: Union[str, None] = Query(default=None),
instance_name: Union[str, None] = Query(default=None), met_class: Union[str, None] = Query(default=None),
storm_name: Union[str, None] = Query(default=None), cycle: Union[str, None] = Query(default=None),
advisory_number: Union[str, None] = Query(default=None), run_date: Union[str, None] = Query(default=None),
@@ -64,7 +64,7 @@ async def get_terria_map_catalog_data(grid_type: Union[str, None] = Query(defaul
limit: Union[int, None] = Query(default=7), use_new_wb: Union[bool, None] = Query(default=False),
use_v3_sp: Union[bool, None] = Query(default=False)) -> json:
"""
- Gets the json formatted terria map UI catalog data.
+ Gets the json formatted map UI catalog data.
Note: Leave filtering params empty if not desired.
grid_type: Filter by the name of the ECFLOW grid
event_type: Filter by the event type
@@ -110,7 +110,7 @@ async def get_terria_map_catalog_data(grid_type: Union[str, None] = Query(defaul
kwargs.update({'use_v3_sp': use_v3_sp})
# try to make the call for records
- ret_val = db_info.get_terria_map_catalog_data(**kwargs)
+ ret_val = db_info.get_map_catalog_data(**kwargs)
# check the return for any detected errors or warnings
if 'Error' in ret_val:
@@ -133,7 +133,7 @@ async def get_terria_map_catalog_data(grid_type: Union[str, None] = Query(defaul
except Exception:
# return a failure message
- ret_val = {'Exception': 'Error detected trying to get the terria map catalog data.'}
+ ret_val = {'Exception': 'Error detected trying to get the map catalog data.'}
# log the exception
logger.exception(ret_val)
@@ -145,10 +145,74 @@ async def get_terria_map_catalog_data(grid_type: Union[str, None] = Query(defaul
return JSONResponse(content=ret_val, status_code=status_code, media_type="application/json")
+@APP.get('/get_ui_instance_name', dependencies=[Depends(JWTBearer(security))], status_code=200, response_model=None)
+async def get_ui_instance_name(site_branding: BrandName, instance_name: Union[str, None] = Query(default=None), reset: Union[bool, None] = Query(default=False),
+ ) -> PlainTextResponse:
+ """
+ Gets the default instance name value
+
Note: Valid instance names are less than 30 characters in length
+
site_branding: The branding of the website.
+
instance_name: The new instance name to be used
+
reset: Flag to remove the instance name from storage
+ """
+ # init the returns
+ ret_val: str = ''
+ status_code: int = 200
+
+ try:
+ # set the default file path
+ file_path: str = os.getenv('INSTANCE_NAME_FILE_PATH', '') + site_branding
+
+ # was the config file path found
+ if file_path is not None:
+ # if this was a reset or a data set request
+ if reset and os.path.exists(file_path):
+ # delete the config file
+ os.remove(file_path)
+
+ # set the instance name if it came in
+ elif instance_name is not None:
+ # if the instance_name too long
+ if len(instance_name) > 30:
+ ret_val = 'Error: Instance name > 30 characters.'
+ else:
+ # open the config file for writing
+ with open(file_path, 'w') as fp:
+ fp.write(instance_name)
+
+ # save the instance name
+ ret_val = instance_name
+
+ elif instance_name is None and os.path.exists(file_path):
+ # open the config file for reading
+ with open(file_path, 'r') as fp:
+ # save the instance name in the file
+ ret_val = fp.read()
+
+ # if we encountered an empty file
+ if ret_val == '':
+ ret_val = "Error: No value found in storage."
+ else:
+ ret_val = "Error: No saved value found."
+ else:
+ logger.error('Error: Instance name file path not set.')
+
+ except Exception as e:
+ # log the issue
+ logger.exception(e)
+
+ # set the error return
+ ret_val = 'Error detected.'
+
+ # return to the caller
+ return PlainTextResponse(content=ret_val, status_code=status_code, media_type="text/plain")
+
+
@APP.get('/get_catalog_workbench', dependencies=[Depends(JWTBearer(security))], status_code=200, response_model=None)
async def get_catalog_workbench(insertion_date: Union[str, None] = Query(default=None), met_class: Union[str, None] = Query(default=None),
- physical_location: Union[str, None] = Query(default=None), ensemble_name: Union[str, None] = Query(default=None),
- project_code: Union[str, None] = Query(default=None), max_age: int = Query(default=1)) -> json:
+ physical_location: Union[str, None] = Query(default=None), instance_name: Union[str, None] = Query(default=None),
+ ensemble_name: Union[str, None] = Query(default=None),project_code: Union[str, None] = Query(default=None),
+ max_age: int = Query(default=1)) -> json:
"""
Gets the latest workbench
Note: Leave filtering params empty if not desired.
@@ -156,6 +220,7 @@ async def get_catalog_workbench(insertion_date: Union[str, None] = Query(default
insertion_date: The timestamp the run props were inserted into the database
met_class: The meteorological class (synoptic or tropical)
physical_location: The site that made the request (RENCI, PSC, etc.)
+
instance_name: Filter by the name of the ECFLOW instance name
ensemble_name: The type of run (gfsforecast, nowcast, ofcl, etc.)
project_code: The requesting project code (ecflow_test_renci, ncf, nopp, test, unc-crc, etc.)
max_age: The maximum age of a tropical run in days.
@@ -167,14 +232,15 @@ async def get_catalog_workbench(insertion_date: Union[str, None] = Query(default
status_code: int = 200
try:
- logger.debug('Input params - insertion_date: %s, met_class: %s, physical_location: %s, ensemble_name: %s, project_code: %s, max_age: %s',
- insertion_date, met_class, physical_location, ensemble_name, project_code, max_age)
+ logger.debug('Input params - insertion_date: %s, met_class: %s, physical_location: %s, instance_name: %s, ensemble_name: %s, project_code: '
+ '%s, max_age: %s',
+ insertion_date, met_class, physical_location, instance_name, ensemble_name, project_code, max_age)
# init the kwargs variable
kwargs: dict = {}
# create the param list
- params: list = ['insertion_date', 'met_class', 'physical_location', 'ensemble_name', 'project_code']
+ params: list = ['insertion_date', 'met_class', 'physical_location', 'instance_name', 'ensemble_name', 'project_code']
# loop through the SP params passed in
for param in params:
@@ -185,7 +251,7 @@ async def get_catalog_workbench(insertion_date: Union[str, None] = Query(default
kwargs.update({'max_age': max_age})
# try to make the call for records
- ret_val = db_info.get_terria_map_workbench_data(**kwargs)
+ ret_val = db_info.get_map_workbench_data(**kwargs)
# check the return
if ret_val == -1:
@@ -200,7 +266,7 @@ async def get_catalog_workbench(insertion_date: Union[str, None] = Query(default
except Exception:
# return a failure message
- ret_val = {'Exception': 'Error detected trying to get the terria map catalog workbench data.'}
+ ret_val = {'Exception': 'Error detected trying to get the map catalog workbench data.'}
# log the exception
logger.exception(ret_val)
@@ -213,7 +279,7 @@ async def get_catalog_workbench(insertion_date: Union[str, None] = Query(default
@APP.get('/get_ui_data_secure', dependencies=[Depends(JWTBearer(security))], status_code=200, response_model=None)
-async def get_terria_map_catalog_data_secure(run_id: Union[str, None] = Query(default=None), grid_type: Union[str, None] = Query(default=None),
+async def get_ui_data_secure(run_id: Union[str, None] = Query(default=None), grid_type: Union[str, None] = Query(default=None),
event_type: Union[str, None] = Query(default=None),
instance_name: Union[str, None] = Query(default=None), met_class: Union[str, None] = Query(default=None),
storm_name: Union[str, None] = Query(default=None), cycle: Union[str, None] = Query(default=None),
@@ -225,7 +291,7 @@ async def get_terria_map_catalog_data_secure(run_id: Union[str, None] = Query(de
use_new_wb: Union[bool, None] = Query(default=False),
use_v3_sp: Union[bool, None] = Query(default=False), ) -> json:
"""
- Gets the json formatted terria map UI catalog data.
+ Gets the json formatted map UI catalog data.
4460-2024020500-gfsforecast
Note: Leave filtering params empty if not desired.
run_id: Filter by the run ID
@@ -280,7 +346,7 @@ async def get_terria_map_catalog_data_secure(run_id: Union[str, None] = Query(de
kwargs.update({'run_id': run_id + '%'})
# try to make the call for records
- ret_val = db_info.get_terria_map_catalog_data(**kwargs)
+ ret_val = db_info.get_map_catalog_data(**kwargs)
# check the return
if ret_val == -1:
@@ -295,7 +361,7 @@ async def get_terria_map_catalog_data_secure(run_id: Union[str, None] = Query(de
except Exception:
# return a failure message
- ret_val = {'Exception': 'Error detected trying to get the terria map catalog data.'}
+ ret_val = {'Exception': 'Error detected trying to get the map catalog data.'}
# log the exception
logger.exception(ret_val)
@@ -308,7 +374,7 @@ async def get_terria_map_catalog_data_secure(run_id: Union[str, None] = Query(de
@APP.get('/get_ui_data_file', status_code=200, response_model=None)
-async def get_terria_map_catalog_data_file(file_name: Union[str, None] = Query(default='apsviz.json'),
+async def get_ui_data_file(file_name: Union[str, None] = Query(default='apsviz.json'),
grid_type: Union[str, None] = Query(default=None), event_type: Union[str, None] = Query(default=None),
instance_name: Union[str, None] = Query(default=None), met_class: Union[str, None] = Query(default=None),
storm_name: Union[str, None] = Query(default=None), cycle: Union[str, None] = Query(default=None),
@@ -319,7 +385,7 @@ async def get_terria_map_catalog_data_file(file_name: Union[str, None] = Query(d
use_new_wb: Union[bool, None] = Query(default=False),
use_v3_sp: Union[bool, None] = Query(default=False), ) -> json:
"""
- Returns the json formatted terria map UI catalog data in a file specified.
+ Returns the json formatted map UI catalog data in a file specified.
Note: Leave filtering params empty if not desired.
file_name: The name of the output file (default is apsviz.json)
grid_type: Filter by the name of the grid
@@ -372,7 +438,7 @@ async def get_terria_map_catalog_data_file(file_name: Union[str, None] = Query(d
try:
# try to make the call for records
- ret_val: dict = db_info.get_terria_map_catalog_data(**kwargs)
+ ret_val: dict = db_info.get_map_catalog_data(**kwargs)
# check the return for any detected errors or warnings
if 'Error' in ret_val: