ob-metaflow-extensions 1.4.13__py2.py3-none-any.whl → 1.4.14rc0__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.

@@ -106,7 +106,6 @@ class AppDeployDecorator(StepDecorator):
106
106
  code_package_key=package_sha,
107
107
  name_prefix=default_name,
108
108
  image=image,
109
- max_entropy=self.MAX_ENTROPY,
110
109
  default_tags=[{k: str(v)} for k, v in default_tags.items()],
111
110
  )
112
111
  current._update_env(
@@ -1,6 +1,6 @@
1
1
  from . import app_cli
2
2
  from . import config
3
- from .deployer import AppDeployer, apps
3
+ from .deployer import AppDeployer, apps, DeployedApp
4
4
  from .config.typed_configs import (
5
5
  ReplicaConfigDict,
6
6
  ResourceConfigDict,
@@ -3,8 +3,8 @@ from .perimeters import PerimeterExtractor
3
3
  from .capsule import CapsuleApi
4
4
  import json
5
5
  from ._state_machine import DEPLOYMENT_READY_CONDITIONS, LogLine
6
- from .app_config import AppConfig, AppConfigError
7
- from .capsule import CapsuleDeployer, list_and_filter_capsules
6
+ from .app_config import AppConfig, AppConfigError, AuthType
7
+ from .capsule import CapsuleDeployer, list_and_filter_capsules, _format_url_string
8
8
  from functools import partial
9
9
  import sys
10
10
  import uuid
@@ -37,6 +37,16 @@ class AppDeployer(TypedCoreConfig):
37
37
  self._app_config = AppConfig(self._config)
38
38
  return self._app_config
39
39
 
40
+ def _set_perimenter_and_api_server(self):
41
+ if self._state["perimeter"] is None:
42
+ perimeter, api_server = PerimeterExtractor.during_metaflow_execution()
43
+ if perimeter is None or api_server is None:
44
+ raise RuntimeError(
45
+ "Perimeter not found in metaflow config or environment variables"
46
+ )
47
+ self._state["perimeter"] = perimeter
48
+ self._state["api_url"] = api_server
49
+
40
50
  # Things that need to be set before deploy
41
51
  @classmethod
42
52
  def _set_state(
@@ -47,7 +57,6 @@ class AppDeployer(TypedCoreConfig):
47
57
  code_package_key: str = None,
48
58
  name_prefix: str = None,
49
59
  image: str = None,
50
- max_entropy: int = 4,
51
60
  default_tags: List[Dict[str, str]] = None,
52
61
  project: str = None,
53
62
  branch: str = None,
@@ -58,15 +67,10 @@ class AppDeployer(TypedCoreConfig):
58
67
  cls._state["code_package_key"] = code_package_key
59
68
  cls._state["name_prefix"] = name_prefix
60
69
  cls._state["image"] = image
61
- cls._state["max_entropy"] = max_entropy
62
70
  cls._state["default_tags"] = default_tags
63
71
  cls._state["project"] = project
64
72
  cls._state["branch"] = branch
65
73
 
66
- assert (
67
- max_entropy > 0
68
- ), "max_entropy must be greater than 0. Since AppDeployer's deploy fn can be called many time inside a step itself."
69
-
70
74
  def deploy(
71
75
  self,
72
76
  readiness_condition=DEPLOYMENT_READY_CONDITIONS.ATLEAST_ONE_RUNNING,
@@ -78,13 +82,7 @@ class AppDeployer(TypedCoreConfig):
78
82
  **kwargs,
79
83
  ) -> "DeployedApp":
80
84
 
81
- # Name setting from top level if none is set in the code
82
- if self._deploy_config._core_config.name is None:
83
- name = self._state[
84
- "name_prefix"
85
- ] # for now the name-prefix cannot be very large.
86
- entropy = uuid.uuid4().hex[: self._state["max_entropy"]]
87
- self._deploy_config._core_config.name = f"{name}-{entropy}"
85
+ self._set_perimenter_and_api_server()
88
86
 
89
87
  if len(self._state["default_tags"]) > 0:
90
88
  self._deploy_config._core_config.tags = (
@@ -174,10 +172,41 @@ class DeployedApp:
174
172
  self._deployed_version = deployed_version
175
173
  self._deployed_at = deployed_at
176
174
 
177
- def _get_capsule_api(self) -> CapsuleApi:
175
+ @classmethod
176
+ def _get_capsule_api(cls) -> CapsuleApi:
178
177
  perimeter, api_server = PerimeterExtractor.during_metaflow_execution()
179
178
  return CapsuleApi(api_server, perimeter)
180
179
 
180
+ @classmethod
181
+ def from_capsule_id(cls, capsule_id: str) -> "DeployedApp":
182
+ capsule_api = cls._get_capsule_api()
183
+ capsule = capsule_api.get(capsule_id)
184
+ capsule_type = (
185
+ capsule.get("spec", {}).get("authConfig", {}).get("authType", None)
186
+ )
187
+ public_url = (
188
+ capsule.get("status", {}).get("accessInfo", {}).get("outOfClusterURL", None)
189
+ )
190
+ name = capsule.get("spec", {}).get(
191
+ "displayName",
192
+ )
193
+ deployed_version = capsule.get(
194
+ "version",
195
+ )
196
+ deployed_at = capsule.get("metadata", {}).get(
197
+ "createdAt",
198
+ )
199
+ if any(i is None for i in [capsule_type, public_url, name]):
200
+ raise ValueError(f"Invalid capsule id: {capsule_id}")
201
+ return cls(
202
+ capsule_id,
203
+ capsule_type,
204
+ _format_url_string(public_url),
205
+ name,
206
+ deployed_version,
207
+ deployed_at,
208
+ )
209
+
181
210
  def logs(self, previous=False) -> Dict[str, List[LogLine]]:
182
211
  """
183
212
  Returns a dictionary of worker_id to logs.
@@ -285,6 +314,15 @@ class DeployedApp:
285
314
  f"deployed_version='{self._deployed_version}')"
286
315
  )
287
316
 
317
+ def auth(self):
318
+ if self.auth_style != AuthType.API:
319
+ raise ValueError(
320
+ "Only API auth style is supported for accessing auth headers"
321
+ )
322
+ from metaflow.metaflow_config import SERVICE_HEADERS
323
+
324
+ return SERVICE_HEADERS
325
+
288
326
 
289
327
  class apps:
290
328
 
@@ -108,4 +108,4 @@ from ..plugins.snowflake import Snowflake
108
108
  from ..plugins.checkpoint_datastores import nebius_checkpoints, coreweave_checkpoints
109
109
  from ..plugins.aws import assume_role
110
110
  from . import ob_internal
111
- from .ob_internal import AppDeployer
111
+ from .ob_internal import AppDeployer, DeployedApp
@@ -1,4 +1,4 @@
1
1
  from ..plugins.kubernetes.pod_killer import PodKiller
2
2
  from ..plugins.fast_bakery.baker import bake_image
3
3
  from ..plugins.apps import core as app_core
4
- from ..plugins.apps.core import AppDeployer
4
+ from ..plugins.apps.core import AppDeployer, DeployedApp
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow-extensions
3
- Version: 1.4.13
3
+ Version: 1.4.14rc0
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -6,12 +6,12 @@ metaflow_extensions/outerbounds/plugins/auth_server.py,sha256=_Q9_2EL0Xy77bCRphk
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
8
8
  metaflow_extensions/outerbounds/plugins/apps/app_cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- metaflow_extensions/outerbounds/plugins/apps/app_deploy_decorator.py,sha256=WWFvyl0EDUbp_UwmWjXBqlLfPEZ-lq98NJ5F5skBDKU,4901
9
+ metaflow_extensions/outerbounds/plugins/apps/app_deploy_decorator.py,sha256=Skk4UjTw3h355JYOnsKr86U4oqpn9qchM1I9uG5MeSA,4859
10
10
  metaflow_extensions/outerbounds/plugins/apps/app_utils.py,sha256=sw9whU17lAzlD2K2kEDNjlk1Ib-2xE2UNhJkmzD8Qv8,8543
11
11
  metaflow_extensions/outerbounds/plugins/apps/consts.py,sha256=iHsyqbUg9k-rgswCs1Jxf5QZIxR1V-peCDRjgr9kdBM,177
12
12
  metaflow_extensions/outerbounds/plugins/apps/deploy_decorator.py,sha256=VkmiMdNYHhNdt-Qm9AVv7aE2LWFsIFEc16YcOYjwF6Q,8568
13
13
  metaflow_extensions/outerbounds/plugins/apps/supervisord_utils.py,sha256=GQoN2gyPClcpR9cLldJmbCfqXnoAHxp8xUnY7vzaYtY,9026
14
- metaflow_extensions/outerbounds/plugins/apps/core/__init__.py,sha256=c6uCgKlgEkTmM9BVdAO-m3vZvUpK2KW_AZZ2236now4,237
14
+ metaflow_extensions/outerbounds/plugins/apps/core/__init__.py,sha256=bfvH1wZpSZq4-Lu25U9MlsZmwqkP8_MH7QLxKwRfXXU,250
15
15
  metaflow_extensions/outerbounds/plugins/apps/core/_state_machine.py,sha256=al907t2C86BPf4V1V03PLTJRJMOc8gdl1CxLLbklnDU,20281
16
16
  metaflow_extensions/outerbounds/plugins/apps/core/app_cli.py,sha256=rD7oimnkEm___K2Ttiwe12B-Xzqi76tk4_HyFQArBQs,42736
17
17
  metaflow_extensions/outerbounds/plugins/apps/core/app_config.py,sha256=PHt-HdNfTHIuhY-eB5vkRMp1RKQNWJ4DKdgZWyYgUuc,4167
@@ -20,7 +20,7 @@ metaflow_extensions/outerbounds/plugins/apps/core/capsule.py,sha256=sIlnmBZYf38S
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=zLZiDpg1OvZQyZmx2Y4j38B6f206eamOS2zH0dZmCcg,9955
22
22
  metaflow_extensions/outerbounds/plugins/apps/core/dependencies.py,sha256=JlWT9f27yzZeJPlqTQk134WDfQgOdyxC5iaw3pLlhqY,4006
23
- metaflow_extensions/outerbounds/plugins/apps/core/deployer.py,sha256=dNKlDu6n8SufEd5NKmsErl1RYhQXuEe_DgtA0mk7awg,9472
23
+ metaflow_extensions/outerbounds/plugins/apps/core/deployer.py,sha256=5WBV-VXaqWymhteLsq13uwWzoTsMc-R1v55Ap_yhypk,10660
24
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
@@ -115,8 +115,8 @@ metaflow_extensions/outerbounds/plugins/vllm/vllm_manager.py,sha256=sp_TX2SrImJG
115
115
  metaflow_extensions/outerbounds/profilers/__init__.py,sha256=wa_jhnCBr82TBxoS0e8b6_6sLyZX0fdHicuGJZNTqKw,29
116
116
  metaflow_extensions/outerbounds/profilers/gpu.py,sha256=3Er8uKQzfm_082uadg4yn_D4Y-iSCgzUfFmguYxZsz4,27485
117
117
  metaflow_extensions/outerbounds/toplevel/__init__.py,sha256=qWUJSv_r5hXJ7jV_On4nEasKIfUCm6_UjkjXWA_A1Ts,90
118
- metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py,sha256=StTRMBHjuxfxe-wQs8ikoAZc4xnhlceY0R4avaJ1Ps8,3823
119
- metaflow_extensions/outerbounds/toplevel/ob_internal.py,sha256=DXCaAtLzlE-bFIiVWEv-iV2JKIWsoSGaUeH4jIQZ9gs,193
118
+ metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py,sha256=mWJkV_uHFJoKYfkcPRBocXBMVF-wW1rf_QqNHLvIH30,3836
119
+ metaflow_extensions/outerbounds/toplevel/ob_internal.py,sha256=jYuv_RV3zerO8oVSDqyW-IDT--xTV4GLPirZ6vOiv80,206
120
120
  metaflow_extensions/outerbounds/toplevel/s3_proxy.py,sha256=zdqG7Z12cGuoYYCi2P4kqC3WsgL3xfdJGIb7ejecHH4,2862
121
121
  metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py,sha256=WUuhz2YQfI4fz7nIcipwwWq781eaoHEk7n4GAn1npDg,63
122
122
  metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py,sha256=BbZiaH3uILlEZ6ntBLKeNyqn3If8nIXZFq_Apd7Dhco,70
@@ -126,7 +126,7 @@ metaflow_extensions/outerbounds/toplevel/plugins/optuna/__init__.py,sha256=6D1wL
126
126
  metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py,sha256=LptpH-ziXHrednMYUjIaosS1SXD3sOtF_9_eRqd8SJw,50
127
127
  metaflow_extensions/outerbounds/toplevel/plugins/torchtune/__init__.py,sha256=uTVkdSk3xZ7hEKYfdlyVteWj5KeDwaM1hU9WT-_YKfI,50
128
128
  metaflow_extensions/outerbounds/toplevel/plugins/vllm/__init__.py,sha256=ekcgD3KVydf-a0xMI60P4uy6ePkSEoFHiGnDq1JM940,45
129
- ob_metaflow_extensions-1.4.13.dist-info/METADATA,sha256=mM06cgYCgGRWwJ_1G1CxQnqNJK3wjPoTvADq9TLQq6s,519
130
- ob_metaflow_extensions-1.4.13.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
131
- ob_metaflow_extensions-1.4.13.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
132
- ob_metaflow_extensions-1.4.13.dist-info/RECORD,,
129
+ ob_metaflow_extensions-1.4.14rc0.dist-info/METADATA,sha256=uK2AjSt-xmcbORtNU9FBkyiNr5aDoB7Mfgr_CQuqRUA,522
130
+ ob_metaflow_extensions-1.4.14rc0.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
131
+ ob_metaflow_extensions-1.4.14rc0.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
132
+ ob_metaflow_extensions-1.4.14rc0.dist-info/RECORD,,