Skip to content

Commit

Permalink
Handle API key NotFound error when registering routes. (#4967)
Browse files Browse the repository at this point in the history
This exception previously caused  ./run_server.sh -e biomedical to fail:

**Before**
```
(.env) [~/datcom-website]:$ ./run_server.sh -e biomedical
Starting localhost with FLASK_ENV='biomedical' on port='8080'
Not in Google network:  <urlopen error [Errno 8] nodename nor servname provided, or not known>
Traceback (most recent call last):
  File "/Users/calinc/datcom-website/web_app.py", line 22, in <module>
    app = create_app()
          ^^^^^^^^^^^^
  File "/Users/calinc/datcom-website/server/__init__.py", line 344, in create_app
    register_routes_experiments(app, cfg)
  File "/Users/calinc/datcom-website/server/__init__.py", line 184, in register_routes_experiments
    app.config['GEMINI_API_KEY'] = _get_api_key(['GEMINI_API_KEY'],
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/calinc/datcom-website/server/__init__.py", line 71, in _get_api_key
    secret_response = secret_client.access_secret_version(name=secret_name)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/cloud/secretmanager_v1/services/secret_manager_service/client.py", line 1767, in access_secret_version
    response = rpc(
               ^^^^
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/gapic_v1/method.py", line 131, in __call__
    return wrapped_func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/retry/retry_unary.py", line 293, in retry_wrapped_func
    return retry_target(
           ^^^^^^^^^^^^^
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/retry/retry_unary.py", line 153, in retry_target
    _retry_error_helper(
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/retry/retry_base.py", line 212, in _retry_error_helper
    raise final_exc from source_exc
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/retry/retry_unary.py", line 144, in retry_target
    result = target()
             ^^^^^^^^
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/timeout.py", line 120, in func_with_timeout
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/calinc/datcom-website/.env/lib/python3.12/site-packages/google/api_core/grpc_helpers.py", line 78, in error_remapped_callable
    raise exceptions.from_grpc_error(exc) from exc
google.api_core.exceptions.NotFound: 404 Secret [projects/886336214270/secrets/gemini-api-key] not found or has no versions. [detail: "[ORIGINAL ERROR] generic::not_found: Secret [projects/886336214270/secrets/gemini-api-key] not found or has no versions. [google.rpc.error_details_ext] { message: \"Secret [projects/886336214270/secrets/gemini-api-key] not found or has no versions.\" }"
```

**After**
```
(.env) [~/datcom-website]:$ ./run_server.sh -e biomedical
Starting localhost with FLASK_ENV='biomedical' on port='8080'
Not in Google network:  <urlopen error [Errno 8] nodename nor servname provided, or not known>
[17:35:51][WARNING ][__init__.py:185] DataGemma routes not registered due to missing API key 
[17:35:54][INFO    ][util.py:585] https://autopush.api.datacommons.org/version is up running 
[17:35:54][INFO    ][web_app.py:27] Run web server in local mode 
 * Serving Flask app 'server.__init__'
 * Debug mode: on
```
  • Loading branch information
clincoln8 authored Feb 20, 2025
1 parent d1f9d67 commit 6219574
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions server/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from flask import request
from flask_babel import Babel
import flask_cors
from google.api_core.exceptions import NotFound
from google.cloud import secretmanager
import google.cloud.logging

Expand Down Expand Up @@ -54,7 +55,7 @@ def _get_api_key(env_keys=[], gcp_project='', gcp_path=''):
gcp_path: The path to getting the api key from GCP secrets
Returns:
API key if it exists
API key if it exists, otherwise an empty string.
TODO: use this method everywhere else in this file
"""
Expand All @@ -65,11 +66,14 @@ def _get_api_key(env_keys=[], gcp_project='', gcp_path=''):

# Try to get the key from secrets
if gcp_project and gcp_path:
secret_client = secretmanager.SecretManagerServiceClient()
secret_name = secret_client.secret_version_path(gcp_project, gcp_path,
'latest')
secret_response = secret_client.access_secret_version(name=secret_name)
return secret_response.payload.data.decode('UTF-8').replace('\n', '')
try:
secret_client = secretmanager.SecretManagerServiceClient()
secret_name = secret_client.secret_version_path(gcp_project, gcp_path,
'latest')
secret_response = secret_client.access_secret_version(name=secret_name)
return secret_response.payload.data.decode('UTF-8').replace('\n', '')
except NotFound:
return ''

# If key is not found, return an empty string
return ''
Expand Down Expand Up @@ -170,12 +174,6 @@ def register_routes_sustainability(app):


def register_routes_datagemma(app, cfg):
# Install blueprint for DataGemma page
from server.routes.dev_datagemma import api as dev_datagemma_api
app.register_blueprint(dev_datagemma_api.bp)
from server.routes.dev_datagemma import html as dev_datagemma_html
app.register_blueprint(dev_datagemma_html.bp)

# Set the gemini api key
app.config['GEMINI_API_KEY'] = _get_api_key(['GEMINI_API_KEY'],
cfg.SECRET_PROJECT,
Expand All @@ -184,6 +182,15 @@ def register_routes_datagemma(app, cfg):
app.config['DC_NL_API_KEY'] = _get_api_key(['DC_NL_API_KEY'],
cfg.SECRET_PROJECT,
'dc-nl-api-key')
if not app.config['GEMINI_API_KEY'] or not app.config['DC_NL_API_KEY']:
app.logger.warning('DataGemma routes not registered due to missing API key')
return

# Install blueprint for DataGemma page
from server.routes.dev_datagemma import api as dev_datagemma_api
app.register_blueprint(dev_datagemma_api.bp)
from server.routes.dev_datagemma import html as dev_datagemma_html
app.register_blueprint(dev_datagemma_html.bp)


def register_routes_common(app):
Expand Down

0 comments on commit 6219574

Please sign in to comment.