diff --git a/docker-compose.yml b/docker-compose.yml index 8005877..344f614 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,9 +33,9 @@ services: NLDI_DB_HOST: nldi-db NLDI_DB_PORT: 5432 NLDI_DB_NAME: nldi - NLDI_DB_USERNAME: read_only_user + NLDI_DB_USERNAME: nldi NLDI_DB_PASSWORD: changeMe - pygeoapiUrl: "https://labs.waterdata.usgs.gov/api/nldi/pygeoapi/" + PYGEOAPI_URL: https://labs.waterdata.usgs.gov/api/nldi/pygeoapi/ networks: - nldi diff --git a/docker/default.source.yml b/docker/default.source.yml index 3da6d37..af4a774 100644 --- a/docker/default.source.yml +++ b/docker/default.source.yml @@ -30,7 +30,6 @@ server: url: ${NLDI_URL} pretty_print: false - pygeoapi: true data: host: ${NLDI_DB_HOST} port: ${NLDI_DB_PORT} @@ -38,6 +37,10 @@ server: user: ${NLDI_DB_USERNAME} password: ${NLDI_DB_PASSWORD} +pygeoapi: + enabled: true + gdp_url: ${PYGEOAPI_URL} + logging: level: ERROR # logfile: /tmp/nldi.log diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index a8730eb..6d6e9d9 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -53,31 +53,44 @@ entry_cmd=${1:-run} # Shorthand function error() { - echo "ERROR: $@" - exit -1 + echo "ERROR: $@" + exit -1 } # Workdir cd ${NLDI_HOME} -echo "Trying to generate openapi.yml" -pygeoapi openapi generate ${PYGEOAPI_CONFIG} --output-file ${PYGEOAPI_OPENAPI} -nldi config align-sources ${NLDI_CONFIG} -nldi openapi generate ${NLDI_CONFIG} --output-file ${NLDI_OPENAPI} +case ${entry_cmd} in +# Align source table +align) + nldi config align-sources ${NLDI_CONFIG} + ;; -[[ $? -ne 0 ]] && error "openapi.yml could not be generated ERROR" +# Run NLDI Server +run) + echo "Trying to generate openapi.yml" + pygeoapi openapi generate ${PYGEOAPI_CONFIG} --output-file ${PYGEOAPI_OPENAPI} + nldi openapi generate ${NLDI_CONFIG} --output-file ${NLDI_OPENAPI} -echo "openapi.yml generated continue to nldi" + [[ $? -ne 0 ]] && error "openapi.yml could not be generated ERROR" -# SCRIPT_NAME should not have value '/' -[[ "${SCRIPT_NAME}" = '/' ]] && export SCRIPT_NAME="" && echo "make SCRIPT_NAME empty from /" + echo "openapi.yml generated continue to nldi" -echo "Start gunicorn name=${CONTAINER_NAME} on ${CONTAINER_HOST}:${CONTAINER_PORT} with ${WSGI_WORKERS} workers and SCRIPT_NAME=${SCRIPT_NAME}" -exec gunicorn --workers ${WSGI_WORKERS} \ - --worker-class=${WSGI_WORKER_CLASS} \ - --timeout ${WSGI_WORKER_TIMEOUT} \ - --name=${CONTAINER_NAME} \ - --bind ${CONTAINER_HOST}:${CONTAINER_PORT} \ - nldi.flask_app:APP + # SCRIPT_NAME should not have value '/' + [[ "${SCRIPT_NAME}" = '/' ]] && export SCRIPT_NAME="" && echo "make SCRIPT_NAME empty from /" + + echo "Start gunicorn name=${CONTAINER_NAME} on ${CONTAINER_HOST}:${CONTAINER_PORT} with ${WSGI_WORKERS} workers and SCRIPT_NAME=${SCRIPT_NAME}" + exec gunicorn --workers ${WSGI_WORKERS} \ + --worker-class=${WSGI_WORKER_CLASS} \ + --timeout ${WSGI_WORKER_TIMEOUT} \ + --name=${CONTAINER_NAME} \ + --bind ${CONTAINER_HOST}:${CONTAINER_PORT} \ + nldi.flask_app:APP + ;; + +*) + error "unknown command arg: must be run (default) or align" + ;; +esac echo "END /entrypoint.sh" diff --git a/nldi/api.py b/nldi/api.py index 4e8e362..e69288d 100644 --- a/nldi/api.py +++ b/nldi/api.py @@ -157,9 +157,14 @@ def flowline_lookup(self) -> FlowlineLookup: def pygeoapi_lookup(self) -> PygeoapiLookup: """pygeoapi Lookup Provider""" if self._pygeoapi_lookup is None: + try: + PYGEOAPI_URL = self.config['pygeoapi']['gdp_url'] + except KeyError: + PYGEOAPI_URL = 'https://labs.waterdata.usgs.gov/api/nldi/pygeoapi' # noqa self._pygeoapi_lookup = \ self.load_plugin('PygeoapiLookup', - catchment_lookup=self.catchment_lookup) + catchment_lookup=self.catchment_lookup, + pygeoapi_url=PYGEOAPI_URL) return self._pygeoapi_lookup @pre_process @@ -197,13 +202,16 @@ def landing_page(self, request: Union[APIRequest, Any] }] } - if self.config['server']['pygeoapi'] is True: - content['links'].append({ - 'rel': 'data', - 'type': 'text/html', - 'title': 'pygeoapi for the NLDI', - 'href': f'{self.base_url}/pygeoapi?f=html' - }) + try: + if self.config['pygeoapi']['enabled'] is True: + content['links'].append({ + 'rel': 'data', + 'type': 'text/html', + 'title': 'pygeoapi for the NLDI', + 'href': f'{self.base_url}/pygeoapi?f=html' + }) + except KeyError: + LOGGER.debug('Omitting pygeoapi link') return headers, HTTPStatus.OK, to_json(content, self.pretty_print) diff --git a/nldi/flask_app.py b/nldi/flask_app.py index 825dd15..8208aa0 100644 --- a/nldi/flask_app.py +++ b/nldi/flask_app.py @@ -224,8 +224,11 @@ def get_navigation(source_name=None, identifier=None, nav_mode=None, data_source request, source_name, identifier, nav_mode, data_source)) -if CONFIG['server']['pygeoapi'] is True: - from pygeoapi.flask_app import BLUEPRINT as PYGEOAPI_BLUEPRINT - APP.register_blueprint(PYGEOAPI_BLUEPRINT, url_prefix='/pygeoapi') +try: + if CONFIG['pygeoapi']['enabled'] is True: + from pygeoapi.flask_app import BLUEPRINT as PYGEOAPI_BLUEPRINT + APP.register_blueprint(PYGEOAPI_BLUEPRINT, url_prefix='/pygeoapi') +except KeyError: + LOGGER.info('Not including pygeoapi templates') APP.register_blueprint(BLUEPRINT) diff --git a/nldi/lookup/pygeoapi.py b/nldi/lookup/pygeoapi.py index de35bae..313334e 100644 --- a/nldi/lookup/pygeoapi.py +++ b/nldi/lookup/pygeoapi.py @@ -29,7 +29,6 @@ import json import logging -import os from requests import Session as HTTPSession from shapely import wkt from sqlalchemy import func @@ -42,8 +41,6 @@ LOGGER = logging.getLogger(__name__) -PYGEOAPI_URL = os.getenv( - 'PYGEOAPI_URL', 'https://labs.waterdata.usgs.gov/api/nldi/pygeoapi') DEFAULT_PROPS = { 'identifier': '', 'navigation': '', 'measure': '', 'reachcode': '', 'name': '', 'source': 'provided', @@ -66,6 +63,7 @@ def __init__(self, provider_def): """ LOGGER.debug('Initialising Pygeoapi Lookup.') self.catchment_lookup = provider_def['catchment_lookup'] + self.pygeoapi_url = provider_def['pygeoapi_url'] self.base_url = provider_def['base_url'] self.http = HTTPSession() @@ -90,7 +88,7 @@ def get_hydrolocation(self, coords: str) -> dict: } LOGGER.debug('Making OGC API - Processes request') - url = url_join(PYGEOAPI_URL, 'processes/nldi-flowtrace/execution') + url = url_join(self.pygeoapi_url, 'processes/nldi-flowtrace/execution') response = self._get_response(url, data=data) LOGGER.debug('Getting feature intersection')