diaspora-event-sdk 0.0.4__py3-none-any.whl → 0.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- diaspora_event_sdk/sdk/_environments.py +7 -0
- diaspora_event_sdk/sdk/client.py +1 -3
- diaspora_event_sdk/sdk/login_manager/__init__.py +4 -1
- diaspora_event_sdk/sdk/login_manager/manager.py +1 -1
- diaspora_event_sdk/sdk/login_manager/protocol.py +29 -0
- diaspora_event_sdk/sdk/login_manager/tokenstore.py +100 -0
- diaspora_event_sdk/sdk/utils/__init__.py +0 -0
- diaspora_event_sdk/sdk/utils/uuid_like.py +15 -0
- diaspora_event_sdk/sdk/web_client.py +1 -1
- diaspora_event_sdk/version.py +1 -1
- {diaspora_event_sdk-0.0.4.dist-info → diaspora_event_sdk-0.0.5.dist-info}/METADATA +2 -2
- diaspora_event_sdk-0.0.5.dist-info/RECORD +23 -0
- diaspora_event_sdk-0.0.4.dist-info/RECORD +0 -19
- {diaspora_event_sdk-0.0.4.dist-info → diaspora_event_sdk-0.0.5.dist-info}/LICENSE +0 -0
- {diaspora_event_sdk-0.0.4.dist-info → diaspora_event_sdk-0.0.5.dist-info}/WHEEL +0 -0
- {diaspora_event_sdk-0.0.4.dist-info → diaspora_event_sdk-0.0.5.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
TOKEN_EXCHANGE = "http://3.220.110.101"
|
|
2
5
|
DIASPORA_RESOURCE_SERVER = '2b9d2f5c-fa32-45b5-875b-b24cd343b917'
|
|
3
6
|
MSK_SCRAM_ENDPOINT = "b-1-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9196,b-2-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9196"
|
|
4
7
|
MSK_IAM_ENDPOINT = "b-1-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9198,b-2-public.diaspora.k6i387.c21.kafka.us-east-1.amazonaws.com:9198"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _get_envname():
|
|
11
|
+
return os.getenv("DIASPORA_SDK_ENVIRONMENT", "production")
|
diaspora_event_sdk/sdk/client.py
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
|
|
3
|
-
from diaspora_event_sdk.sdk.login_manager
|
|
4
|
-
from diaspora_event_sdk.sdk.login_manager import requires_login
|
|
5
|
-
from globus_compute_sdk.sdk.login_manager import LoginManagerProtocol
|
|
3
|
+
from diaspora_event_sdk.sdk.login_manager import LoginManager, LoginManagerProtocol, requires_login
|
|
6
4
|
|
|
7
5
|
from ._environments import TOKEN_EXCHANGE, DIASPORA_RESOURCE_SERVER
|
|
8
6
|
|
|
@@ -8,7 +8,7 @@ import typing as t
|
|
|
8
8
|
|
|
9
9
|
import globus_sdk
|
|
10
10
|
from globus_sdk.scopes import AuthScopes, ScopeBuilder
|
|
11
|
-
from
|
|
11
|
+
from diaspora_event_sdk.sdk.login_manager.tokenstore import get_token_storage_adapter
|
|
12
12
|
|
|
13
13
|
from .._environments import DIASPORA_RESOURCE_SERVER
|
|
14
14
|
from ..web_client import WebClient
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
import globus_sdk
|
|
6
|
+
|
|
7
|
+
from ..web_client import WebClient
|
|
8
|
+
|
|
9
|
+
# these were added to stdlib typing in 3.8, so the import must be conditional
|
|
10
|
+
# mypy and other tools expect and document a sys.version_info check
|
|
11
|
+
if sys.version_info >= (3, 8):
|
|
12
|
+
from typing import Protocol, runtime_checkable
|
|
13
|
+
else:
|
|
14
|
+
from typing_extensions import Protocol, runtime_checkable
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@runtime_checkable
|
|
18
|
+
class LoginManagerProtocol(Protocol):
|
|
19
|
+
def ensure_logged_in(self) -> None:
|
|
20
|
+
...
|
|
21
|
+
|
|
22
|
+
def logout(self) -> bool:
|
|
23
|
+
...
|
|
24
|
+
|
|
25
|
+
def get_auth_client(self) -> globus_sdk.AuthClient:
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
def get_web_client(self, *, base_url: str | None = None) -> WebClient:
|
|
29
|
+
...
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import pathlib
|
|
6
|
+
|
|
7
|
+
from globus_sdk.tokenstorage import SQLiteAdapter
|
|
8
|
+
|
|
9
|
+
from .._environments import _get_envname
|
|
10
|
+
from .client_login import get_client_login, is_client_login
|
|
11
|
+
from .globus_auth import internal_auth_client
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _home() -> pathlib.Path:
|
|
15
|
+
# this is a hook point for tests to patch over
|
|
16
|
+
# it just returns `pathlib.Path.home()`
|
|
17
|
+
# replace this with a mock to return some test directory
|
|
18
|
+
return pathlib.Path.home()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def invalidate_old_config() -> None:
|
|
22
|
+
token_file = _home() / ".funcx" / "credentials" / "funcx_sdk_tokens.json"
|
|
23
|
+
|
|
24
|
+
if token_file.exists():
|
|
25
|
+
try:
|
|
26
|
+
auth_client = internal_auth_client()
|
|
27
|
+
with open(token_file) as fp:
|
|
28
|
+
data = json.load(fp)
|
|
29
|
+
for token_data in data.values():
|
|
30
|
+
if "access_token" in token_data:
|
|
31
|
+
auth_client.oauth2_revoke_token(token_data["access_token"])
|
|
32
|
+
if "refresh_token" in token_data:
|
|
33
|
+
auth_client.oauth2_revoke_token(
|
|
34
|
+
token_data["refresh_token"])
|
|
35
|
+
finally:
|
|
36
|
+
os.remove(token_file)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def ensure_compute_dir() -> pathlib.Path:
|
|
40
|
+
legacy_dirname = _home() / ".funcx"
|
|
41
|
+
dirname = _home() / ".globus_compute"
|
|
42
|
+
|
|
43
|
+
user_dir = os.getenv("GLOBUS_COMPUTE_USER_DIR")
|
|
44
|
+
if user_dir:
|
|
45
|
+
dirname = pathlib.Path(user_dir)
|
|
46
|
+
|
|
47
|
+
if dirname.is_dir():
|
|
48
|
+
pass
|
|
49
|
+
elif dirname.is_file():
|
|
50
|
+
raise FileExistsError(
|
|
51
|
+
f"Error creating directory {dirname}, "
|
|
52
|
+
"please remove or rename the conflicting file"
|
|
53
|
+
)
|
|
54
|
+
elif legacy_dirname.is_dir() and not user_dir:
|
|
55
|
+
legacy_dirname.replace(dirname)
|
|
56
|
+
legacy_dirname.symlink_to(dirname, target_is_directory=True)
|
|
57
|
+
else:
|
|
58
|
+
dirname.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
59
|
+
|
|
60
|
+
return dirname
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _get_storage_filename():
|
|
64
|
+
datadir = ensure_compute_dir()
|
|
65
|
+
return os.path.join(datadir, "storage.db")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _resolve_namespace(environment: str | None) -> str:
|
|
69
|
+
"""
|
|
70
|
+
Return the namespace used to save tokens. This will check
|
|
71
|
+
if a client login is being used and return either:
|
|
72
|
+
user/<envname>
|
|
73
|
+
or
|
|
74
|
+
clientprofile/<envname>/<clientid>
|
|
75
|
+
|
|
76
|
+
e.g.
|
|
77
|
+
|
|
78
|
+
user/production
|
|
79
|
+
"""
|
|
80
|
+
env = environment if environment is not None else _get_envname()
|
|
81
|
+
|
|
82
|
+
if is_client_login():
|
|
83
|
+
client_id = get_client_login().client_id
|
|
84
|
+
return f"clientprofile/{env}/{client_id}"
|
|
85
|
+
|
|
86
|
+
return f"user/{env}"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def get_token_storage_adapter(*, environment: str | None = None) -> SQLiteAdapter:
|
|
90
|
+
# when initializing the token storage adapter, check if the storage file exists
|
|
91
|
+
# if it does not, then use this as a flag to clean the old config
|
|
92
|
+
fname = _get_storage_filename()
|
|
93
|
+
if not os.path.exists(fname):
|
|
94
|
+
invalidate_old_config()
|
|
95
|
+
# namespace is equal to the current environment
|
|
96
|
+
return SQLiteAdapter(
|
|
97
|
+
fname,
|
|
98
|
+
namespace=_resolve_namespace(environment),
|
|
99
|
+
connect_params={"check_same_thread": False},
|
|
100
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
import uuid
|
|
5
|
+
|
|
6
|
+
# older pythons don't like aliases using |, even with a __future__ import
|
|
7
|
+
UUID_LIKE_T = t.Union[uuid.UUID, str]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def as_uuid(uuid_like: UUID_LIKE_T) -> uuid.UUID:
|
|
11
|
+
return uuid_like if isinstance(uuid_like, uuid.UUID) else uuid.UUID(uuid_like)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def as_optional_uuid(optional_uuid_like: UUID_LIKE_T | None) -> uuid.UUID | None:
|
|
15
|
+
return as_uuid(optional_uuid_like) if optional_uuid_like else None
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import typing as t
|
|
3
3
|
|
|
4
4
|
import globus_sdk
|
|
5
|
-
from globus_compute_sdk.sdk.utils.uuid_like import UUID_LIKE_T
|
|
6
5
|
from globus_sdk.exc.api import GlobusAPIError
|
|
6
|
+
from diaspora_event_sdk.sdk.utils.uuid_like import UUID_LIKE_T
|
|
7
7
|
|
|
8
8
|
from ._environments import TOKEN_EXCHANGE
|
|
9
9
|
|
diaspora_event_sdk/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.0.
|
|
1
|
+
__version__ = "0.0.5"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: diaspora-event-sdk
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.5
|
|
4
4
|
Summary: SDK of Diaspora Event Fabric: Resilience-enabling services for science from HPC to edge
|
|
5
5
|
Home-page: https://github.com/globus-labs/diaspora-event-sdk
|
|
6
6
|
License: LICENSE
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
License-File: LICENSE
|
|
9
|
-
Requires-Dist: globus-
|
|
9
|
+
Requires-Dist: globus-sdk
|
|
10
10
|
Requires-Dist: kafka-python
|
|
11
11
|
|
|
12
12
|
# Diaspora Event Fabric: Resilience-enabling services for science from HPC to edge
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
diaspora_event_sdk/__init__.py,sha256=qLu5r-LxlQuJRJySWbiDGoaBL1A3STX9v5IrwvN1vtE,477
|
|
2
|
+
diaspora_event_sdk/version.py,sha256=S7u1lbuWmM3A3ajykBialmPoJUK6Jg-WmNqM-9OZFdk,22
|
|
3
|
+
diaspora_event_sdk/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
diaspora_event_sdk/sdk/_environments.py,sha256=X5TekWUUJ_cmgb3jdhK90dDlqj_AmAP5CnXw5ABjh_w,511
|
|
5
|
+
diaspora_event_sdk/sdk/client.py,sha256=s3QrXcPb64oSgOaGGODTH9eV_1IVeZWi1ZDh6-dBIO4,3051
|
|
6
|
+
diaspora_event_sdk/sdk/decorators.py,sha256=Gel8AyhIjbf4-FNintTNcOqvC9hHH_YwbOH257Nfmf0,884
|
|
7
|
+
diaspora_event_sdk/sdk/kafka_client.py,sha256=xy-b7ZfNkgExwa5d65IlUOaAZYAqibyJLQ1v0ruJzV8,1457
|
|
8
|
+
diaspora_event_sdk/sdk/web_client.py,sha256=rHYeEltujO191SksBXAMNrS6C_qasdf0xrFfBEcGhtQ,1349
|
|
9
|
+
diaspora_event_sdk/sdk/login_manager/__init__.py,sha256=yeqVgjeHLMX0WZJu2feJmq-fbeXvSxWghVV81ygfY-w,239
|
|
10
|
+
diaspora_event_sdk/sdk/login_manager/client_login.py,sha256=gvR4PkIqQpIywNieJQ_u11PHUmdLxQ0Ho-QgPSfu8bw,1798
|
|
11
|
+
diaspora_event_sdk/sdk/login_manager/decorators.py,sha256=EFEp71d0oJ7vo2H8W7DJ2gPrDfGzeNXUNxri1C0l8h0,1047
|
|
12
|
+
diaspora_event_sdk/sdk/login_manager/globus_auth.py,sha256=9Hymp0tv91OI5dBMUgh4rGv_5xLVLhFEK7Hu0t8CJFQ,389
|
|
13
|
+
diaspora_event_sdk/sdk/login_manager/login_flow.py,sha256=2TodgsvlEYPoZPQPkp6FHOC9IkSM07pS7MIVGS4MZNE,954
|
|
14
|
+
diaspora_event_sdk/sdk/login_manager/manager.py,sha256=uJHosI7ipqGt5KiL-iv2IGB4bNyZ6jQZQi7g4ka0pts,7052
|
|
15
|
+
diaspora_event_sdk/sdk/login_manager/protocol.py,sha256=RCuo2jy_XkpZvbxnKlDfTKs-L6b9_8_JR-Kq9wHwhoM,710
|
|
16
|
+
diaspora_event_sdk/sdk/login_manager/tokenstore.py,sha256=7jRm01rzsbvniaCfYtDDWE3det_1_b6oQkS-YQ2Qjg4,3037
|
|
17
|
+
diaspora_event_sdk/sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
diaspora_event_sdk/sdk/utils/uuid_like.py,sha256=xbxf0YXpDhdii16lwPLWRN21qFekHrNrqODSToMPtCg,470
|
|
19
|
+
diaspora_event_sdk-0.0.5.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
20
|
+
diaspora_event_sdk-0.0.5.dist-info/METADATA,sha256=c1OJRiA1CgaM_Hmn-SFjHF6Xvbho4MBQhCgUC6pyEW4,2927
|
|
21
|
+
diaspora_event_sdk-0.0.5.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
|
|
22
|
+
diaspora_event_sdk-0.0.5.dist-info/top_level.txt,sha256=_5Wx8F5rc9mpB093wvCXa6CArtWNXwek2T1LnmkS2vE,19
|
|
23
|
+
diaspora_event_sdk-0.0.5.dist-info/RECORD,,
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
diaspora_event_sdk/__init__.py,sha256=qLu5r-LxlQuJRJySWbiDGoaBL1A3STX9v5IrwvN1vtE,477
|
|
2
|
-
diaspora_event_sdk/version.py,sha256=1mptEzQihbdyqqzMgdns_j5ZGK9gz7hR2bsgA_TnjO4,22
|
|
3
|
-
diaspora_event_sdk/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
diaspora_event_sdk/sdk/_environments.py,sha256=4hJIrrdAHOt9qY74jnD5i2UvpBKkKqJ7Ys-bygGrP9k,414
|
|
5
|
-
diaspora_event_sdk/sdk/client.py,sha256=94iWoxHaxibzIEJfZlUOzV7jJwt-AQnbFf2jZ1cwsyA,3155
|
|
6
|
-
diaspora_event_sdk/sdk/decorators.py,sha256=Gel8AyhIjbf4-FNintTNcOqvC9hHH_YwbOH257Nfmf0,884
|
|
7
|
-
diaspora_event_sdk/sdk/kafka_client.py,sha256=xy-b7ZfNkgExwa5d65IlUOaAZYAqibyJLQ1v0ruJzV8,1457
|
|
8
|
-
diaspora_event_sdk/sdk/web_client.py,sha256=AbFJt9ZhG2l15qxxjpGY5DPq2P12THEAw2yjkWfJxvo,1349
|
|
9
|
-
diaspora_event_sdk/sdk/login_manager/__init__.py,sha256=ErCNru31j_sSl_10uTXv8jsa16VW1LbPG-k3zxgAxZo,145
|
|
10
|
-
diaspora_event_sdk/sdk/login_manager/client_login.py,sha256=gvR4PkIqQpIywNieJQ_u11PHUmdLxQ0Ho-QgPSfu8bw,1798
|
|
11
|
-
diaspora_event_sdk/sdk/login_manager/decorators.py,sha256=EFEp71d0oJ7vo2H8W7DJ2gPrDfGzeNXUNxri1C0l8h0,1047
|
|
12
|
-
diaspora_event_sdk/sdk/login_manager/globus_auth.py,sha256=9Hymp0tv91OI5dBMUgh4rGv_5xLVLhFEK7Hu0t8CJFQ,389
|
|
13
|
-
diaspora_event_sdk/sdk/login_manager/login_flow.py,sha256=2TodgsvlEYPoZPQPkp6FHOC9IkSM07pS7MIVGS4MZNE,954
|
|
14
|
-
diaspora_event_sdk/sdk/login_manager/manager.py,sha256=ocrDlu_LITKGWV7kUAiMXdtnfTF9sDelniNc-06yux0,7052
|
|
15
|
-
diaspora_event_sdk-0.0.4.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
16
|
-
diaspora_event_sdk-0.0.4.dist-info/METADATA,sha256=jLeUkQliQbIQP-rCkvjmrbK63z5Mb_ZZ7iIot6l3q1g,2935
|
|
17
|
-
diaspora_event_sdk-0.0.4.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
|
|
18
|
-
diaspora_event_sdk-0.0.4.dist-info/top_level.txt,sha256=_5Wx8F5rc9mpB093wvCXa6CArtWNXwek2T1LnmkS2vE,19
|
|
19
|
-
diaspora_event_sdk-0.0.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|