"git@developer.sourcefind.cn:modelzoo/resnet50_tensorflow.git" did not exist on "7004ce3b7b9bb200167c1f744bbc5dacb2f4774f"
Unverified Commit 3fc4a62d authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

symphony/client: rework Token class so it can parse, store, load directly

This helps using this class elsewhere too for tokens coming from the
API.
parent cec467ae
...@@ -24,6 +24,7 @@ import json ...@@ -24,6 +24,7 @@ import json
import aiohttp import aiohttp
import time import time
import os import os
from typing import Self
from .settings import client_settings from .settings import client_settings
...@@ -52,20 +53,26 @@ class Token: ...@@ -52,20 +53,26 @@ class Token:
def is_refresh_valid(self) -> bool: def is_refresh_valid(self) -> bool:
return self.refresh_valid_until > int(time.time()) return self.refresh_valid_until > int(time.time())
def store_token(self, filename: str) -> None:
with open(filename, "w") as fh:
json.dump(self.toJSON(), fh)
class TokenClient: @staticmethod
def load_token(filename: str) -> Self | None:
def __init__( if os.path.isfile(filename):
self, with open(filename) as fh:
device_auth_url: str = client_settings().auth_dev_url, json_token = json.load(fh)
token_url: str = client_settings().auth_token_url, return Token(
client_id: str = client_settings().auth_client_id, access_token=json_token["access_token"],
): refresh_token=json_token["refresh_token"],
self._device_auth_url: str = device_auth_url session_state=json_token["session_state"],
self._token_url: str = token_url access_valid_until=int(json_token["access_valid_until"]),
self._client_id: str = client_id refresh_valid_until=int(json_token["refresh_valid_until"]),
)
return None
def _create_token_from_resp(self, json_obj) -> Token: @staticmethod
def parse_from_resp(json_obj) -> Self:
access_valid_until = int(time.time()) - 10 + int(json_obj["expires_in"]) access_valid_until = int(time.time()) - 10 + int(json_obj["expires_in"])
refresh_valid_until = ( refresh_valid_until = (
int(time.time()) - 10 + int(json_obj["refresh_expires_in"]) int(time.time()) - 10 + int(json_obj["refresh_expires_in"])
...@@ -79,6 +86,20 @@ class TokenClient: ...@@ -79,6 +86,20 @@ class TokenClient:
refresh_valid_until=refresh_valid_until, refresh_valid_until=refresh_valid_until,
) )
class TokenClient:
def __init__(
self,
device_auth_url: str = client_settings().auth_dev_url,
token_url: str = client_settings().auth_token_url,
client_id: str = client_settings().auth_client_id,
):
self._device_auth_url: str = device_auth_url
self._token_url: str = token_url
self._client_id: str = client_id
async def retrieve_token(self) -> Token: async def retrieve_token(self) -> Token:
token = None token = None
...@@ -133,7 +154,7 @@ class TokenClient: ...@@ -133,7 +154,7 @@ class TokenClient:
f"error retrievening retrieving token: {json_resp}" f"error retrievening retrieving token: {json_resp}"
) )
elif "error" not in json_resp: elif "error" not in json_resp:
token = self._create_token_from_resp(json_obj=json_resp) token = Token.parse_from_resp(json_obj=json_resp)
break break
assert token assert token
...@@ -163,7 +184,7 @@ class TokenClient: ...@@ -163,7 +184,7 @@ class TokenClient:
if "error" in json_resp: if "error" in json_resp:
raise Exception(f"error refreshing token: {json_resp}") raise Exception(f"error refreshing token: {json_resp}")
token = self._create_token_from_resp(json_obj=json_resp) token = Token.parse_from_resp(json_obj=json_resp)
assert token assert token
return token return token
...@@ -188,7 +209,7 @@ class TokenClient: ...@@ -188,7 +209,7 @@ class TokenClient:
else: else:
resp.raise_for_status() resp.raise_for_status()
json_resp = await resp.json() json_resp = await resp.json()
token = self._create_token_from_resp(json_obj=json_resp) token = Token.parse_from_resp(json_obj=json_resp)
assert token assert token
return token return token
...@@ -198,29 +219,9 @@ class TokenProvider: ...@@ -198,29 +219,9 @@ class TokenProvider:
def __init__(self) -> None: def __init__(self) -> None:
self._toke_filepath: str = "auth.json" self._toke_filepath: str = "auth.json"
self._token: Token | None = self._load_token() self._token: Token | None = Token.load_token(self._toke_filepath)
self._toke_client = TokenClient() self._toke_client = TokenClient()
def _load_token(self) -> Token | None:
if os.path.isfile(self._toke_filepath):
with open(self._toke_filepath) as fh:
json_token = json.load(fh)
return Token(
access_token=json_token["access_token"],
refresh_token=json_token["refresh_token"],
session_state=json_token["session_state"],
access_valid_until=int(json_token["access_valid_until"]),
refresh_valid_until=int(json_token["refresh_valid_until"]),
)
return None
def _store_token(self) -> None:
if self._token is None:
return
with open(self._toke_filepath, "w") as fh:
json.dump(self._token.toJSON(), fh)
def _access_valid(self) -> bool: def _access_valid(self) -> bool:
return self._token and self._token.is_access_valid() return self._token and self._token.is_access_valid()
...@@ -238,7 +239,7 @@ class TokenProvider: ...@@ -238,7 +239,7 @@ class TokenProvider:
self._token = await self._toke_client.retrieve_token() self._token = await self._toke_client.retrieve_token()
assert self._token assert self._token
self._store_token() self._token.store_token(self._toke_filepath)
async def access_token(self) -> str: async def access_token(self) -> str:
await self._refresh_token() await self._refresh_token()
...@@ -248,4 +249,4 @@ class TokenProvider: ...@@ -248,4 +249,4 @@ class TokenProvider:
async def resource_token(self, ticket): async def resource_token(self, ticket):
await self._refresh_token() await self._refresh_token()
self._token = await self._toke_client.resource_token(self._token, ticket) self._token = await self._toke_client.resource_token(self._token, ticket)
self._store_token() self._token.store_token(self._toke_filepath)
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment