This is an automated email from the ASF dual-hosted git repository.
nchung pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-nexus.git
The following commit(s) were added to refs/heads/master by this push:
new 22b10f6 Add second NCAR provider (#208)
22b10f6 is described below
commit 22b10f661f02e4b8329e3973234b83b188133d8c
Author: Stepheny Perez <[email protected]>
AuthorDate: Fri Oct 14 15:45:40 2022 -0700
Add second NCAR provider (#208)
* Updated changelog
* Added second NCAR provider that uses JPL Insitu API
---
CHANGELOG.md | 1 +
analysis/webservice/algorithms/doms/config.py | 57 +++++++++++++++++++++++----
analysis/webservice/algorithms/doms/insitu.py | 5 ++-
3 files changed, 53 insertions(+), 10 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f7462f..e023343 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@ and this project adheres to [Semantic
Versioning](https://semver.org/spec/v2.0.0
- SDAP-400: Added NCAR insitu api to matchup
- SDAP-405: Added SPURS AWS insitu api to matchup and new platform values to
OpenAPI matchup spec
- RabbitMQ monitor script used in Docker quickstart guide
+- Added new option for NCAR so either NCAR or JPL Insitu API can be specified
### Changed
- SDAP-390: Changed `/doms` to `/cdms` and `doms_reader.py` to `cdms_reader.py`
- domslist endpoint points to AWS insitu instead of doms insitu
diff --git a/analysis/webservice/algorithms/doms/config.py
b/analysis/webservice/algorithms/doms/config.py
index e01f45e..3213960 100644
--- a/analysis/webservice/algorithms/doms/config.py
+++ b/analysis/webservice/algorithms/doms/config.py
@@ -22,6 +22,17 @@ INSITU_PROVIDER_MAP = [
'endpoint':
'https://cdms.ucar.edu/insitu/1.0/query_data_doms_custom_pagination',
'projects': [
{
+ 'short_name': 'ICOADS_NCAR',
+ 'name': 'ICOADS Release 3.0',
+ 'platforms': ['0', '16', '17', '30', '41', '42']
+ }
+ ]
+ },
+ {
+ 'name': 'NCAR',
+ 'projects': [
+ {
+ 'short_name': 'ICOADS_JPL',
'name': 'ICOADS Release 3.0',
'platforms': ['0', '16', '17', '30', '41', '42']
}
@@ -159,12 +170,19 @@ except KeyError:
pass
-def getEndpoint(provider_name=None):
- if provider_name is None:
+def getEndpoint(provider_name=None, project_name=None):
+ if provider_name is None or project_name is None:
return INSITU_API_ENDPOINT
- provider = next((provider for provider in INSITU_PROVIDER_MAP
- if provider['name'] == provider_name), None)
+ provider = next((
+ provider for provider in INSITU_PROVIDER_MAP
+ for project in provider['projects']
+ if provider['name'] == provider_name
+ and (
+ project['name'] == project_name
+ or project.get('short_name') == project_name
+ )
+ ), None)
if 'endpoint' in provider:
return provider['endpoint']
@@ -194,8 +212,12 @@ def validate_insitu_params(provider_name, project_name,
platform_name):
if provider is None:
return False
- project = next((project for project in provider['projects']
- if project_name == project['name']), None)
+ project = next((
+ project for project in provider['projects']
+ if project_name == project['name']
+ or project_name == project.get('short_name')
+ ), None)
+
if project is None:
return False
@@ -204,8 +226,11 @@ def validate_insitu_params(provider_name, project_name,
platform_name):
def get_provider_name(project_name):
- provider = next((provider for provider in INSITU_PROVIDER_MAP
- if project_name in map(lambda project: project['name'],
provider['projects'])), None)
+ provider = next((
+ provider for provider in INSITU_PROVIDER_MAP
+ if project_name in map(lambda project: project['name'],
provider['projects'])
+ or project_name in map(lambda project: project.get('short_name'),
provider['projects'])
+ ), None)
if provider is not None:
return provider['name']
@@ -217,3 +242,19 @@ def get_provider_name(project_name):
if provider is not None:
return provider['name']
+
+def get_project_name(project_name):
+ """
+ Get project name, given either project name or short name.
+ """
+ project = next((
+ project for provider in INSITU_PROVIDER_MAP
+ for project in provider['projects']
+ if project.get('short_name') == project_name or project['name'] ==
project_name
+ ), None)
+
+ if project is not None:
+ return project['name']
+
+ # If not found, return input project name. DOMS insitu node will need this
+ return project_name
\ No newline at end of file
diff --git a/analysis/webservice/algorithms/doms/insitu.py
b/analysis/webservice/algorithms/doms/insitu.py
index 30d4dbd..f7875f1 100644
--- a/analysis/webservice/algorithms/doms/insitu.py
+++ b/analysis/webservice/algorithms/doms/insitu.py
@@ -38,6 +38,7 @@ def query_insitu(dataset, variable, start_time, end_time,
bbox, platform, depth_
pass
provider = insitu_endpoints.get_provider_name(dataset)
+ project = insitu_endpoints.get_project_name(dataset)
params = {
'itemsPerPage': items_per_page,
@@ -47,7 +48,7 @@ def query_insitu(dataset, variable, start_time, end_time,
bbox, platform, depth_
'minDepth': depth_min,
'maxDepth': depth_max,
'provider': provider,
- 'project': dataset,
+ 'project': project,
'platform': platform,
}
@@ -57,7 +58,7 @@ def query_insitu(dataset, variable, start_time, end_time,
bbox, platform, depth_
insitu_response = {}
# Page through all insitu results
- next_page_url = insitu_endpoints.getEndpoint(provider)
+ next_page_url = insitu_endpoints.getEndpoint(provider, dataset)
while next_page_url is not None and next_page_url != 'NA':
if session is not None:
response = session.get(next_page_url, params=params)