Skip to content
Snippets Groups Projects
Commit 0d68fd3b authored by Klaas Kliffen's avatar Klaas Kliffen :satellite:
Browse files

Add JH API method for requesting tokens

parent 61bb8edf
No related branches found
No related tags found
1 merge request!8SDC-307 Cern dlaas notebook
import base64 import base64
import getpass import getpass
import json import json
import logging
import time import time
import urllib.parse import urllib.parse
from os import getenv from os import getenv
...@@ -10,10 +11,13 @@ from warnings import warn ...@@ -10,10 +11,13 @@ from warnings import warn
import pandas as pd import pandas as pd
import requests import requests
logger = logging.getLogger(__name__)
class shopping_client: class shopping_client:
endpoint = "esap-api/accounts/user-profiles/" endpoint = "esap-api/accounts/user-profiles/"
audience = "rucio" # Audience used by ESAP, might be configurable later
def __init__( def __init__(
self, self,
...@@ -41,7 +45,10 @@ class shopping_client: ...@@ -41,7 +45,10 @@ class shopping_client:
self.basket = None self.basket = None
def get_basket( def get_basket(
self, convert_to_pandas: bool = False, reload: bool = False, filter_archives: bool = False self,
convert_to_pandas: bool = False,
reload: bool = False,
filter_archives: bool = False,
) -> Union[list, pd.DataFrame, None]: ) -> Union[list, pd.DataFrame, None]:
"""Retrieve the shopping basket for a user. """Retrieve the shopping basket for a user.
Prompts for access token if one was not supplied to constructor. Prompts for access token if one was not supplied to constructor.
...@@ -117,12 +124,14 @@ class shopping_client: ...@@ -117,12 +124,14 @@ class shopping_client:
item_data = json.loads(item["item_data"]) item_data = json.loads(item["item_data"])
for connector in self.connectors: for connector in self.connectors:
if "archive" in item_data and item_data["archive"] == connector.archive: if (
"archive" in item_data
and item_data["archive"] == connector.archive
):
filtered_items.append(item) filtered_items.append(item)
return filtered_items return filtered_items
def _basket_to_pandas(self): def _basket_to_pandas(self):
if len(self.connectors): if len(self.connectors):
converted_basket = { converted_basket = {
...@@ -146,12 +155,31 @@ class shopping_client: ...@@ -146,12 +155,31 @@ class shopping_client:
return self.basket return self.basket
def _get_token(self): def _get_token(self):
# Try to get token from Rucio OIDC file (when running in CERN DLaaS notebook)
# Generic JH token method using authstate
jh_api_uri = getenv("JUPYTERHUB_API_URL")
jh_api_token = getenv("JUPYTERHUB_API_TOKEN")
# Fallback to older rucio file
token_fn = getenv("RUCIO_OIDC_FILE_NAME") token_fn = getenv("RUCIO_OIDC_FILE_NAME")
if token_fn is not None:
try:
if all((jh_api_token, jh_api_uri)):
res = requests.get(
f"{jh_api_uri}/user",
headers={"Authorization": f"token {jh_api_token}"},
)
self.token = res.json()["auth_state"]["exchanged_tokens"][self.audience]
except KeyError:
logger.warning("JupyterHub without Authstate enabled")
# Try to get token from Rucio OIDC file (when running in CERN DLaaS notebook)
if self.token is None and token_fn is not None:
with open(token_fn) as token_file: with open(token_fn) as token_file:
self.token = token_file.readline() self.token = token_file.readline()
else:
elif self.token is None:
self.token = getpass.getpass("Enter your ESAP access token:") self.token = getpass.getpass("Enter your ESAP access token:")
if self.token is None: if self.token is None:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment