ob-metaflow-extensions 1.4.4__py2.py3-none-any.whl → 1.4.6__py2.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.

Potentially problematic release.


This version of ob-metaflow-extensions might be problematic. Click here for more details.

@@ -361,4 +361,4 @@ SECRETS_PROVIDERS_DESC = [
361
361
  ("outerbounds", ".secrets.secrets.OuterboundsSecretsProvider"),
362
362
  ]
363
363
  # Adding an override here so the library can be imported at the metaflow.plugins level
364
- __mf_promote_submodules__ = ["snowflake", "ollama", "torchtune"]
364
+ __mf_promote_submodules__ = ["snowflake", "ollama", "torchtune", "optuna"]
@@ -484,6 +484,9 @@ def deploy(
484
484
  dependencies.get("conda", None) is None,
485
485
  ]
486
486
  ):
487
+ python_version = dependencies.get(
488
+ "python"
489
+ ) # python gets a default value so it's always set.
487
490
  # The user has not set any dependencies, so we can sniff the packaging directory
488
491
  # for a dependencies file.
489
492
  requirements_file = os.path.join(
@@ -492,14 +495,22 @@ def deploy(
492
495
  pyproject_toml = os.path.join(packaging_directory, "pyproject.toml")
493
496
  if os.path.exists(pyproject_toml):
494
497
  app_config.set_state(
495
- "dependencies", {"from_pyproject_toml": pyproject_toml}
498
+ "dependencies",
499
+ {
500
+ "from_pyproject_toml": pyproject_toml,
501
+ "python": python_version,
502
+ },
496
503
  )
497
504
  logger(
498
505
  "📦 Using dependencies from pyproject.toml: %s" % pyproject_toml
499
506
  )
500
507
  elif os.path.exists(requirements_file):
501
508
  app_config.set_state(
502
- "dependencies", {"from_requirements_file": requirements_file}
509
+ "dependencies",
510
+ {
511
+ "from_requirements_file": requirements_file,
512
+ "python": python_version,
513
+ },
503
514
  )
504
515
  logger(
505
516
  "📦 Using dependencies from requirements.txt: %s"
@@ -446,6 +446,34 @@ class CapsuleApi:
446
446
  message="Capsule JSON decode failed",
447
447
  )
448
448
 
449
+ def get_by_name(self, name: str, most_recent_only: bool = True):
450
+ _url = os.path.join(self._base_url, f"?displayName={name}")
451
+ response = self._wrapped_api_caller(
452
+ requests.get,
453
+ _url,
454
+ retryable_status_codes=[409], # todo : verify me
455
+ conn_error_retries=3,
456
+ )
457
+ try:
458
+ if most_recent_only:
459
+ result = response.json()
460
+ candidates = result["capsules"]
461
+ if not candidates:
462
+ return None
463
+ return sorted(
464
+ candidates, key=lambda x: x["metadata"]["createdAt"], reverse=True
465
+ )[0]
466
+ else:
467
+ return response.json()
468
+ except json.JSONDecodeError as e:
469
+ raise CapsuleApiException(
470
+ _url,
471
+ "get",
472
+ response.status_code,
473
+ response.text,
474
+ message="Capsule JSON decode failed",
475
+ )
476
+
449
477
  def list(self):
450
478
  response = self._wrapped_api_caller(
451
479
  requests.get,
@@ -793,9 +821,11 @@ class CapsuleDeployer:
793
821
  "💊 %s deployment status: %s "
794
822
  % (
795
823
  self.capsule_type.title(),
796
- "in progress"
797
- if state_machine.update_in_progress
798
- else "completed",
824
+ (
825
+ "in progress"
826
+ if state_machine.update_in_progress
827
+ else "completed"
828
+ ),
799
829
  )
800
830
  )
801
831
  _further_readiness_check_failed = False
@@ -480,7 +480,7 @@ class DependencyConfig(metaclass=ConfigMeta):
480
480
  help="The Python version to use for the app.",
481
481
  ),
482
482
  field_type=str,
483
- behavior=FieldBehavior.NOT_ALLOWED,
483
+ behavior=FieldBehavior.UNION,
484
484
  example="3.10",
485
485
  )
486
486
  pypi = ConfigField(
@@ -40,7 +40,7 @@ class PerimeterExtractor:
40
40
  return perimeter, api_server # type: ignore
41
41
 
42
42
  @classmethod
43
- def during_metaflow_execution(cls) -> str:
43
+ def during_metaflow_execution(cls) -> Union[Tuple[str, str], Tuple[None, None]]:
44
44
  from metaflow.metaflow_config_funcs import init_config
45
45
 
46
46
  clean_url = (
@@ -0,0 +1,48 @@
1
+ import os
2
+ import json
3
+
4
+ __mf_promote_submodules__ = ["plugins.optuna"]
5
+
6
+
7
+ def auth():
8
+ from metaflow.metaflow_config_funcs import init_config
9
+
10
+ conf = init_config()
11
+ if conf:
12
+ headers = {"x-api-key": conf["METAFLOW_SERVICE_AUTH_KEY"]}
13
+ else:
14
+ headers = json.loads(os.environ["METAFLOW_SERVICE_HEADERS"])
15
+ return headers
16
+
17
+
18
+ def get_deployment_db_access_endpoint(name: str):
19
+ from ..apps.core.perimeters import PerimeterExtractor
20
+ from ..apps.core.capsule import CapsuleApi
21
+
22
+ perimeter, cap_url = PerimeterExtractor.during_metaflow_execution()
23
+ deployment = CapsuleApi(cap_url, perimeter).get_by_name(name)
24
+ if not deployment:
25
+ raise Exception(f"No app deployment found with name `{name}`")
26
+
27
+ if (
28
+ "status" in deployment
29
+ and "accessInfo" in deployment["status"]
30
+ and "extraAccessUrls" in deployment["status"]["accessInfo"]
31
+ ):
32
+ for extra_url in deployment["status"]["accessInfo"]["extraAccessUrls"]:
33
+ if extra_url["name"] == "in_cluster_db_access":
34
+ db_url = extra_url["url"].replace("http://", "")
35
+ return db_url
36
+
37
+ raise Exception(f"No db access endpoint found for deployment `{name}`")
38
+
39
+
40
+ def get_db_url(app_name: str):
41
+ """
42
+ Example usage:
43
+ >>> from metaflow.plugins.optuna import get_db_url
44
+ >>> s = optuna.create_study(..., storage=get_db_url("optuna-dashboard"))
45
+ """
46
+ mf_token = auth()["x-api-key"]
47
+ app_url = get_deployment_db_access_endpoint(app_name)
48
+ return f"postgresql://userspace_default:{mf_token}@{app_url}/userspace_default?sslmode=disable"
@@ -0,0 +1 @@
1
+ __mf_promote_submodules__ = ["plugins.optuna"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow-extensions
3
- Version: 1.4.4
3
+ Version: 1.4.6
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -1,7 +1,7 @@
1
1
  metaflow_extensions/outerbounds/__init__.py,sha256=Gb8u06s9ClQsA_vzxmkCzuMnigPy7kKcDnLfb7eB-64,514
2
2
  metaflow_extensions/outerbounds/remote_config.py,sha256=NIKiq-hrThOll7RLw2JfSN7K5Wz0QtjtRb5AVlHZ1vA,4787
3
3
  metaflow_extensions/outerbounds/config/__init__.py,sha256=JsQGRuGFz28fQWjUvxUgR8EKBLGRdLUIk_buPLJplJY,1225
4
- metaflow_extensions/outerbounds/plugins/__init__.py,sha256=ISFPm4cn8IvfZnM6Q4LqDalycr02v6gMsCPo9mRNSwk,14028
4
+ metaflow_extensions/outerbounds/plugins/__init__.py,sha256=nrsobix6XPIn5Uyg6yTSOtNwr6yaV2-gGbU83hjnbIM,14038
5
5
  metaflow_extensions/outerbounds/plugins/auth_server.py,sha256=_Q9_2EL0Xy77bCRphkwT1aSu8gQXRDOH-Z-RxTUO8N4,2202
6
6
  metaflow_extensions/outerbounds/plugins/perimeters.py,sha256=QXh3SFP7GQbS-RAIxUOPbhPzQ7KDFVxZkTdKqFKgXjI,2697
7
7
  metaflow_extensions/outerbounds/plugins/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -13,15 +13,15 @@ metaflow_extensions/outerbounds/plugins/apps/deploy_decorator.py,sha256=VkmiMdNY
13
13
  metaflow_extensions/outerbounds/plugins/apps/supervisord_utils.py,sha256=GQoN2gyPClcpR9cLldJmbCfqXnoAHxp8xUnY7vzaYtY,9026
14
14
  metaflow_extensions/outerbounds/plugins/apps/core/__init__.py,sha256=c6uCgKlgEkTmM9BVdAO-m3vZvUpK2KW_AZZ2236now4,237
15
15
  metaflow_extensions/outerbounds/plugins/apps/core/_state_machine.py,sha256=al907t2C86BPf4V1V03PLTJRJMOc8gdl1CxLLbklnDU,20281
16
- metaflow_extensions/outerbounds/plugins/apps/core/app_cli.py,sha256=V0Ki_VwjVIyIa2sgXPC7miOPLYWLrsHvzMpTfQypU2U,42169
16
+ metaflow_extensions/outerbounds/plugins/apps/core/app_cli.py,sha256=s1dZb4iyG5OVmieHO-yDcB3Qzx6OsdOowXFWFT-UjhU,42586
17
17
  metaflow_extensions/outerbounds/plugins/apps/core/app_config.py,sha256=PHt-HdNfTHIuhY-eB5vkRMp1RKQNWJ4DKdgZWyYgUuc,4167
18
18
  metaflow_extensions/outerbounds/plugins/apps/core/artifacts.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- metaflow_extensions/outerbounds/plugins/apps/core/capsule.py,sha256=VpCmq8R13GNex6aTJnOCswkLnc8acgsQQ9Da6KBh2sQ,34732
19
+ metaflow_extensions/outerbounds/plugins/apps/core/capsule.py,sha256=KSHznoyWTrDyuOIUyn-iB2IMFt8uwXgoAjOe1TFdZSA,35790
20
20
  metaflow_extensions/outerbounds/plugins/apps/core/click_importer.py,sha256=kgoPQmK_-8PSSTc3QMSaynCLQ5VWTkKFOC69FPURyXA,998
21
21
  metaflow_extensions/outerbounds/plugins/apps/core/config_schema.yaml,sha256=POxm1S9lZB6tO_g9w9gbvna133H5iGYvpVHe247gISY,9697
22
22
  metaflow_extensions/outerbounds/plugins/apps/core/dependencies.py,sha256=JlWT9f27yzZeJPlqTQk134WDfQgOdyxC5iaw3pLlhqY,4006
23
23
  metaflow_extensions/outerbounds/plugins/apps/core/deployer.py,sha256=dNKlDu6n8SufEd5NKmsErl1RYhQXuEe_DgtA0mk7awg,9472
24
- metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py,sha256=jeFGAUnFQkBFiOMp_Ls7Ofb80Qogh509suam5sMucYU,3030
24
+ metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py,sha256=ETlqTkHDvVaWusrbNncFf7pcGJarj0r-5qodC4gZWQM,3068
25
25
  metaflow_extensions/outerbounds/plugins/apps/core/secrets.py,sha256=sgDiAmpSC8Y5xjlaOEp79F6m0S3x4RONf_vJ5PUAfu8,6127
26
26
  metaflow_extensions/outerbounds/plugins/apps/core/utils.py,sha256=2M2zU8DhbAlJee8P0xKXINAku81PcUylS3sVCSb0TUs,7896
27
27
  metaflow_extensions/outerbounds/plugins/apps/core/validations.py,sha256=Inr9AJDe-L3PMMMxcJPH1zulh9_SynqITb2BzGseLh4,471
@@ -37,7 +37,7 @@ metaflow_extensions/outerbounds/plugins/apps/core/config/config_utils.py,sha256=
37
37
  metaflow_extensions/outerbounds/plugins/apps/core/config/schema_export.py,sha256=vfmoSXGRocXryOQOGHbh-zIboEP3ty0BVucOza6uzXU,9614
38
38
  metaflow_extensions/outerbounds/plugins/apps/core/config/typed_configs.py,sha256=euoS1Ap4yvHC20Aaj5YQWMgxixkxujVeiJ7C4DcAFhQ,4590
39
39
  metaflow_extensions/outerbounds/plugins/apps/core/config/typed_init_generator.py,sha256=KiJ1eiwtBR5eWdBzWqvO6KlqJ2qzjJvl3w4c1uJ3g0Y,13419
40
- metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py,sha256=bO-g_6mv7xciVcDf4Jn-qioPUUvg9Y3fMM5fcraN2Sk,37018
40
+ metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py,sha256=6PJ18hDggbQAXiugyfyrCbJHo6B7w-SvCJ8y58H4gr4,37012
41
41
  metaflow_extensions/outerbounds/plugins/apps/core/experimental/__init__.py,sha256=rd4qGTkHndKYfJmoAKZWiY0KK4j5BK6RBrtle-it1Mg,2746
42
42
  metaflow_extensions/outerbounds/plugins/aws/__init__.py,sha256=VBGdjNKeFLXGZuqh4jVk8cFtO1AWof73a6k_cnbAOYA,145
43
43
  metaflow_extensions/outerbounds/plugins/aws/assume_role.py,sha256=mBewNlnSYsR2rFXFkX-DUH6ku01h2yOcMcLHoCL7eyI,161
@@ -83,6 +83,7 @@ metaflow_extensions/outerbounds/plugins/ollama/constants.py,sha256=hxkTpWEJp1pKH
83
83
  metaflow_extensions/outerbounds/plugins/ollama/exceptions.py,sha256=8Ss296_MGZl1wXAoDNwpH-hsPe6iYLe90Ji1pczNocU,668
84
84
  metaflow_extensions/outerbounds/plugins/ollama/ollama.py,sha256=C-6Hz8OxsJiB14AAxmunq3P4k7DrmVHsSOxE0xsP-nY,79780
85
85
  metaflow_extensions/outerbounds/plugins/ollama/status_card.py,sha256=F5e4McDl28lhtjeUyInkl03bqjr1lgLxWoau8Q9xwBE,10994
86
+ metaflow_extensions/outerbounds/plugins/optuna/__init__.py,sha256=iFNDFNtWOfqwXi8bhMoItM8it-bATETbx8PGK66UbHI,1615
86
87
  metaflow_extensions/outerbounds/plugins/profilers/deco_injector.py,sha256=oI_C3c64XBm7n88FILqHwn-Nnc5DeT_68I67lM9rXaI,2434
87
88
  metaflow_extensions/outerbounds/plugins/profilers/gpu_profile_decorator.py,sha256=gDHQ2sMIp4NuZSzUspbSd8RGdFAoO5mgZAyFcZ2a51Y,2619
88
89
  metaflow_extensions/outerbounds/plugins/profilers/simple_card_decorator.py,sha256=4W9tLGCmkFx-4XYLa1xF6qMiaWOBYYFx_RclZDKej30,3259
@@ -121,10 +122,11 @@ metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py,sha256=WUuhz2
121
122
  metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py,sha256=BbZiaH3uILlEZ6ntBLKeNyqn3If8nIXZFq_Apd7Dhco,70
122
123
  metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py,sha256=5zG8gShSj8m7rgF4xgWBZFuY3GDP5n1T0ktjRpGJLHA,69
123
124
  metaflow_extensions/outerbounds/toplevel/plugins/ollama/__init__.py,sha256=GRSz2zwqkvlmFS6bcfYD_CX6CMko9DHQokMaH1iBshA,47
125
+ metaflow_extensions/outerbounds/toplevel/plugins/optuna/__init__.py,sha256=6D1wLVSHvwEC_ed1r3VcvNGqOhKgyBt22AoDjVTkiFY,47
124
126
  metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py,sha256=LptpH-ziXHrednMYUjIaosS1SXD3sOtF_9_eRqd8SJw,50
125
127
  metaflow_extensions/outerbounds/toplevel/plugins/torchtune/__init__.py,sha256=uTVkdSk3xZ7hEKYfdlyVteWj5KeDwaM1hU9WT-_YKfI,50
126
128
  metaflow_extensions/outerbounds/toplevel/plugins/vllm/__init__.py,sha256=ekcgD3KVydf-a0xMI60P4uy6ePkSEoFHiGnDq1JM940,45
127
- ob_metaflow_extensions-1.4.4.dist-info/METADATA,sha256=Lk6opjSJs4j420BoN-qr7LTmFO5_C13xCEn_9hAVshs,518
128
- ob_metaflow_extensions-1.4.4.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
129
- ob_metaflow_extensions-1.4.4.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
130
- ob_metaflow_extensions-1.4.4.dist-info/RECORD,,
129
+ ob_metaflow_extensions-1.4.6.dist-info/METADATA,sha256=HcVyxOTG9dydSRROmREicHInzfrCuUBQA9zegRczptg,518
130
+ ob_metaflow_extensions-1.4.6.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
131
+ ob_metaflow_extensions-1.4.6.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
132
+ ob_metaflow_extensions-1.4.6.dist-info/RECORD,,