ob-metaflow-extensions 1.1.42__tar.gz → 1.1.42rc0__tar.gz
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.
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/PKG-INFO +1 -1
- ob-metaflow-extensions-1.1.42rc0/metaflow_extensions/outerbounds/__init__.py +5 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/config/__init__.py +0 -2
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/plugins/__init__.py +0 -79
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/plugins/auth_server.py +1 -6
- ob-metaflow-extensions-1.1.42rc0/metaflow_extensions/outerbounds/plugins/perimeters.py +27 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/ob_metaflow_extensions.egg-info/PKG-INFO +1 -1
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/ob_metaflow_extensions.egg-info/SOURCES.txt +1 -1
- ob-metaflow-extensions-1.1.42rc0/ob_metaflow_extensions.egg-info/requires.txt +3 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/setup.py +2 -2
- ob-metaflow-extensions-1.1.42/metaflow_extensions/outerbounds/__init__.py +0 -0
- ob-metaflow-extensions-1.1.42/metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py +0 -1
- ob-metaflow-extensions-1.1.42/ob_metaflow_extensions.egg-info/requires.txt +0 -3
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/README.md +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/plugins/kubernetes/__init__.py +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/plugins/kubernetes/kubernetes_client.py +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/toplevel/__init__.py +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/ob_metaflow_extensions.egg-info/dependency_links.txt +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/ob_metaflow_extensions.egg-info/top_level.txt +0 -0
- {ob-metaflow-extensions-1.1.42 → ob-metaflow-extensions-1.1.42rc0}/setup.cfg +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import json
|
|
3
2
|
import tempfile
|
|
4
3
|
from contextlib import contextmanager
|
|
5
4
|
|
|
@@ -162,81 +161,3 @@ class ObpAzureAuthProvider(object):
|
|
|
162
161
|
|
|
163
162
|
|
|
164
163
|
AZURE_CLIENT_PROVIDERS_DESC = [("obp", ".ObpAzureAuthProvider")]
|
|
165
|
-
|
|
166
|
-
import threading
|
|
167
|
-
import time
|
|
168
|
-
|
|
169
|
-
_gcp_client_cache = dict()
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def _get_cache_key():
|
|
173
|
-
return os.getpid(), threading.get_ident()
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
class ObpGcpAuthProvider(object):
|
|
177
|
-
name = "obp"
|
|
178
|
-
|
|
179
|
-
@staticmethod
|
|
180
|
-
def get_gs_storage_client(*args, **kwargs):
|
|
181
|
-
|
|
182
|
-
import sys
|
|
183
|
-
from metaflow_extensions.outerbounds.plugins.auth_server import get_token
|
|
184
|
-
|
|
185
|
-
cache_key = _get_cache_key()
|
|
186
|
-
if _gcp_client_cache.get(cache_key):
|
|
187
|
-
# Don't cache the client for more than 5 minutes as it may have
|
|
188
|
-
# expired.
|
|
189
|
-
if _gcp_client_cache[cache_key]._created_at < time.time() - 300:
|
|
190
|
-
del _gcp_client_cache[cache_key]
|
|
191
|
-
else:
|
|
192
|
-
return _gcp_client_cache[cache_key]
|
|
193
|
-
|
|
194
|
-
from hashlib import sha256
|
|
195
|
-
from metaflow.util import get_username
|
|
196
|
-
|
|
197
|
-
user = get_username()
|
|
198
|
-
|
|
199
|
-
token_info = get_token("/generate/gcp")
|
|
200
|
-
token_file = "/tmp/obp_token." + sha256(user.encode("utf-8")).hexdigest()[:16]
|
|
201
|
-
credentials_file = (
|
|
202
|
-
"/tmp/obp_credentials." + sha256(user.encode("utf-8")).hexdigest()[:16]
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
with tempfile.NamedTemporaryFile("w", delete=False) as f:
|
|
206
|
-
f.write(token_info["token"])
|
|
207
|
-
tmp_token_file = f.name
|
|
208
|
-
os.rename(tmp_token_file, token_file)
|
|
209
|
-
|
|
210
|
-
credentials_json = {
|
|
211
|
-
"type": "external_account",
|
|
212
|
-
"audience": f"//iam.googleapis.com/projects/{token_info['gcpProjectNumber']}/locations/global/workloadIdentityPools/{token_info['gcpWorkloadIdentityPool']}/providers/{token_info['gcpWorkloadIdentityPoolProvider']}",
|
|
213
|
-
"subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
|
|
214
|
-
"token_url": "https://sts.googleapis.com/v1/token",
|
|
215
|
-
"service_account_impersonation_url": f"https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{token_info['gcpServiceAccountEmail']}:generateAccessToken",
|
|
216
|
-
"credential_source": {
|
|
217
|
-
"file": token_file,
|
|
218
|
-
"format": {"type": "text"},
|
|
219
|
-
},
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
with tempfile.NamedTemporaryFile("w", delete=False) as f:
|
|
223
|
-
f.write(json.dumps(credentials_json))
|
|
224
|
-
tmp_credentials_file = f.name
|
|
225
|
-
os.rename(tmp_credentials_file, credentials_file)
|
|
226
|
-
|
|
227
|
-
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credentials_file
|
|
228
|
-
from google.cloud import storage
|
|
229
|
-
|
|
230
|
-
storage_client = storage.Client(project=token_info["gcpProjectId"])
|
|
231
|
-
storage_client._created_at = time.time()
|
|
232
|
-
_gcp_client_cache[cache_key] = storage_client
|
|
233
|
-
return storage_client
|
|
234
|
-
|
|
235
|
-
@staticmethod
|
|
236
|
-
def get_credentials(scopes, *args, **kwargs):
|
|
237
|
-
import google.auth
|
|
238
|
-
|
|
239
|
-
return google.auth.default(scopes=scopes)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
GCP_CLIENT_PROVIDERS_DESC = [("obp", ".ObpGcpAuthProvider")]
|
|
@@ -25,7 +25,7 @@ def read_mf_config():
|
|
|
25
25
|
return config
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def
|
|
28
|
+
def get_token(url_path):
|
|
29
29
|
from metaflow.metaflow_config import (
|
|
30
30
|
SERVICE_HEADERS,
|
|
31
31
|
from_conf,
|
|
@@ -44,11 +44,6 @@ def get_token_url_and_headers(url_path):
|
|
|
44
44
|
assert url_path.startswith("/")
|
|
45
45
|
url = "https://" + authServer + url_path
|
|
46
46
|
headers = SERVICE_HEADERS
|
|
47
|
-
return url, headers
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def get_token(url_path):
|
|
51
|
-
url, headers = get_token_url_and_headers(url_path)
|
|
52
47
|
try:
|
|
53
48
|
r = requests.get(url, headers=headers)
|
|
54
49
|
r.raise_for_status()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import fcntl
|
|
3
|
+
from os import path
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def override_metaflow_profile_with_perimeter():
|
|
8
|
+
# If OBP_CONFIG_DIR is set, use that, otherwise use METAFLOW_HOME
|
|
9
|
+
# If neither are set, use ~/.metaflowconfig
|
|
10
|
+
obp_config_dir = path.expanduser(
|
|
11
|
+
os.environ.get(
|
|
12
|
+
"OBP_CONFIG_DIR", os.environ.get("METAFLOW_HOME", "~/.metaflowconfig")
|
|
13
|
+
)
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
file_path = os.path.join(obp_config_dir, "ob_config.json")
|
|
17
|
+
|
|
18
|
+
if os.path.exists(file_path):
|
|
19
|
+
# Acquire a shared read lock on the file
|
|
20
|
+
fd = os.open(file_path, os.O_RDONLY)
|
|
21
|
+
fcntl.flock(fd, fcntl.LOCK_SH)
|
|
22
|
+
|
|
23
|
+
with open(file_path, "r") as f:
|
|
24
|
+
ob_config = json.loads(f.read())
|
|
25
|
+
|
|
26
|
+
if "OB_CURRENT_PERIMETER" in ob_config:
|
|
27
|
+
os.environ["METAFLOW_PROFILE"] = ob_config["OB_CURRENT_PERIMETER"]
|
|
@@ -4,12 +4,12 @@ metaflow_extensions/outerbounds/__init__.py
|
|
|
4
4
|
metaflow_extensions/outerbounds/config/__init__.py
|
|
5
5
|
metaflow_extensions/outerbounds/plugins/__init__.py
|
|
6
6
|
metaflow_extensions/outerbounds/plugins/auth_server.py
|
|
7
|
+
metaflow_extensions/outerbounds/plugins/perimeters.py
|
|
7
8
|
metaflow_extensions/outerbounds/plugins/kubernetes/__init__.py
|
|
8
9
|
metaflow_extensions/outerbounds/plugins/kubernetes/kubernetes_client.py
|
|
9
10
|
metaflow_extensions/outerbounds/toplevel/__init__.py
|
|
10
11
|
metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py
|
|
11
12
|
metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py
|
|
12
|
-
metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py
|
|
13
13
|
metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py
|
|
14
14
|
ob_metaflow_extensions.egg-info/PKG-INFO
|
|
15
15
|
ob_metaflow_extensions.egg-info/SOURCES.txt
|
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_namespace_packages
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
version = "1.1.
|
|
5
|
+
version = "1.1.42rc0"
|
|
6
6
|
this_directory = Path(__file__).parent
|
|
7
7
|
long_description = (this_directory / "README.md").read_text()
|
|
8
8
|
|
|
@@ -15,5 +15,5 @@ setup(
|
|
|
15
15
|
packages=find_namespace_packages(include=["metaflow_extensions.*"]),
|
|
16
16
|
long_description=long_description,
|
|
17
17
|
long_description_content_type="text/markdown",
|
|
18
|
-
install_requires=["boto3", "kubernetes", "ob-metaflow == 2.11.0.
|
|
18
|
+
install_requires=["boto3", "kubernetes", "ob-metaflow == 2.11.0.3"],
|
|
19
19
|
)
|
|
File without changes
|
ob-metaflow-extensions-1.1.42/metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__mf_promote_submodules__ = ["plugins.gcp.gs_storage_client_factory"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|