polyaxon 2.3.3rc0__py3-none-any.whl → 2.4.0__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.
@@ -1851,9 +1851,12 @@ def artifacts(
1851
1851
  default=False,
1852
1852
  help="To set the run to failed if the upload fails.",
1853
1853
  )
1854
+ @click.option(
1855
+ "--agent", "-ag", type=str, help="Optional, uuid reference of an agent to use."
1856
+ )
1854
1857
  @click.pass_context
1855
1858
  @clean_outputs
1856
- def upload(ctx, project, uid, path_from, path_to, sync_failure):
1859
+ def upload(ctx, project, uid, path_from, path_to, sync_failure, agent):
1857
1860
  """Upload runs' artifacts.
1858
1861
 
1859
1862
  Uses /docs/core/cli/#caching
@@ -1884,7 +1887,7 @@ def upload(ctx, project, uid, path_from, path_to, sync_failure):
1884
1887
  )
1885
1888
  if is_file:
1886
1889
  response = client.upload_artifact(
1887
- filepath=path_from, path=path_to, overwrite=True
1890
+ filepath=path_from, path=path_to, overwrite=True, agent=agent
1888
1891
  )
1889
1892
  else:
1890
1893
  response = client.upload_artifacts_dir(
@@ -1892,6 +1895,7 @@ def upload(ctx, project, uid, path_from, path_to, sync_failure):
1892
1895
  path=path_to,
1893
1896
  overwrite=True,
1894
1897
  relative_to=path_from,
1898
+ agent=agent,
1895
1899
  )
1896
1900
  except (
1897
1901
  ApiException,
@@ -2302,9 +2306,31 @@ def pull(
2302
2306
  help="Optional, to ignore the owner/project of the local "
2303
2307
  "run and use the owner/project provided or resolved from the current project.",
2304
2308
  )
2309
+ @click.option(
2310
+ "--reset-uuid",
2311
+ is_flag=True,
2312
+ default=False,
2313
+ help="Optional, to ignore the uuid of the local " "run and generate a new uuid.",
2314
+ )
2315
+ @click.option(
2316
+ "--agent", "-ag", type=str, help="Optional, uuid reference of an agent to use."
2317
+ )
2318
+ @click.option("--name", "-n", type=str, help="Optional, a new name to set for the run.")
2305
2319
  @click.pass_context
2306
2320
  @clean_outputs
2307
- def push(ctx, project, uid, all_runs, no_artifacts, clean, path, reset_project):
2321
+ def push(
2322
+ ctx,
2323
+ project,
2324
+ uid,
2325
+ all_runs,
2326
+ no_artifacts,
2327
+ clean,
2328
+ path,
2329
+ reset_project,
2330
+ reset_uuid,
2331
+ agent,
2332
+ name,
2333
+ ):
2308
2334
  """Push a local run (or all runs) to a remove server.
2309
2335
 
2310
2336
  Uses /docs/core/cli/#caching
@@ -2352,6 +2378,8 @@ def push(ctx, project, uid, all_runs, no_artifacts, clean, path, reset_project):
2352
2378
  path=artifacts_path,
2353
2379
  run_client=client,
2354
2380
  reset_project=reset_project,
2381
+ name=name,
2382
+ reset_uuid=reset_uuid,
2355
2383
  raise_if_not_found=True,
2356
2384
  )
2357
2385
  except Exception as e:
@@ -2368,6 +2396,7 @@ def push(ctx, project, uid, all_runs, no_artifacts, clean, path, reset_project):
2368
2396
  path=artifacts_path,
2369
2397
  upload_artifacts=not no_artifacts,
2370
2398
  clean=clean,
2399
+ agent=agent,
2371
2400
  )
2372
2401
  Printer.success(
2373
2402
  f"Finished pushing offline run {uid} to {client.owner}/{client.project}"
@@ -33,7 +33,7 @@ def agent():
33
33
  help="Number of times to retry the process.",
34
34
  )
35
35
  @coroutine
36
- async def start(kind, max_retries, max_interval):
36
+ async def start(kind, max_interval, max_retries):
37
37
  from polyaxon import settings
38
38
  from polyaxon._env_vars.getters import get_agent_info
39
39
  from polyaxon._runner.kinds import RunnerKind
polyaxon/_client/run.py CHANGED
@@ -21,6 +21,7 @@ from clipped.utils.paths import (
21
21
  get_base_filename,
22
22
  get_dirs_under_path,
23
23
  get_files_in_path_context,
24
+ set_permissions,
24
25
  )
25
26
  from clipped.utils.query_params import (
26
27
  get_logs_params,
@@ -64,6 +65,7 @@ from polyaxon._sdk.schemas.v1_operation_body import V1OperationBody
64
65
  from polyaxon._sdk.schemas.v1_project_version import V1ProjectVersion
65
66
  from polyaxon._sdk.schemas.v1_run import V1Run
66
67
  from polyaxon._sdk.schemas.v1_run_settings import V1RunSettings
68
+ from polyaxon._sdk.schemas.v1_settings_catalog import V1SettingsCatalog
67
69
  from polyaxon._utils.fqn_utils import (
68
70
  get_entity_full_name,
69
71
  split_owner_team_space,
@@ -225,6 +227,18 @@ class RunClient(ClientMixin):
225
227
  return client.config.no_op
226
228
  return settings.CLIENT_CONFIG.no_op
227
229
 
230
+ def _reset_agent(self, agent: Optional[str] = None):
231
+ if agent:
232
+ agent = self.client.agents_v1.get_agent(self.owner, agent)
233
+ self.settings.agent = V1SettingsCatalog(
234
+ uuid=agent.uuid,
235
+ name=agent.name,
236
+ version=agent.version,
237
+ url=agent.hostname,
238
+ )
239
+ self.settings.namespace = agent.namespace
240
+ self.settings.artifacts_store = None
241
+
228
242
  def _use_agent_host(self):
229
243
  if self.settings.agent and self.settings.agent.url:
230
244
  self.reset_client(
@@ -1502,6 +1516,7 @@ class RunClient(ClientMixin):
1502
1516
  untar: bool = False,
1503
1517
  overwrite: bool = True,
1504
1518
  show_progress: bool = True,
1519
+ agent: Optional[str] = None,
1505
1520
  ):
1506
1521
  """Uploads a single artifact to the run's artifacts store path.
1507
1522
 
@@ -1512,12 +1527,16 @@ class RunClient(ClientMixin):
1512
1527
  it should be decompressed on the artifacts store.
1513
1528
  overwrite: bool, optional, if the file uploaded should overwrite any previous content.
1514
1529
  show_progress: bool, to show a progress bar.
1530
+ agent: str, optional, uuid reference of an agent to use.
1515
1531
 
1516
1532
  Returns:
1517
1533
  str
1518
1534
  """
1519
1535
  if not self.settings:
1520
1536
  self.refresh_data()
1537
+ if agent:
1538
+ self._reset_agent(agent)
1539
+
1521
1540
  self._use_agent_host()
1522
1541
 
1523
1542
  params = get_streams_params(connection=self.artifacts_store)
@@ -1548,6 +1567,7 @@ class RunClient(ClientMixin):
1548
1567
  path: str = "",
1549
1568
  overwrite: bool = True,
1550
1569
  relative_to: Optional[str] = None,
1570
+ agent: Optional[str] = None,
1551
1571
  ):
1552
1572
  """Uploads a full directory to the run's artifacts store path.
1553
1573
 
@@ -1560,7 +1580,7 @@ class RunClient(ClientMixin):
1560
1580
  overwrite: bool, optional, if the file uploaded should overwrite any previous content.
1561
1581
  relative_to: str, optional, if the path uploaded is not the current dir,
1562
1582
  and you want to cancel the relative path.
1563
-
1583
+ agent: str, optional, uuid reference of an agent to use.
1564
1584
  Returns:
1565
1585
  str.
1566
1586
  """
@@ -1580,6 +1600,7 @@ class RunClient(ClientMixin):
1580
1600
  path=path or "",
1581
1601
  overwrite=overwrite,
1582
1602
  relative_to=relative_to,
1603
+ agent=agent,
1583
1604
  )
1584
1605
 
1585
1606
  @client_handler(check_no_op=True, check_offline=True)
@@ -1589,6 +1610,7 @@ class RunClient(ClientMixin):
1589
1610
  path: str = "",
1590
1611
  overwrite: bool = True,
1591
1612
  relative_to: Optional[str] = None,
1613
+ agent: Optional[str] = None,
1592
1614
  ):
1593
1615
  """Uploads multiple artifacts to the run's artifacts store path.
1594
1616
 
@@ -1598,7 +1620,7 @@ class RunClient(ClientMixin):
1598
1620
  overwrite: bool, optional, if the file uploaded should overwrite any previous content.
1599
1621
  relative_to: str, optional, if the path uploaded is not the current dir,
1600
1622
  and you want to cancel the relative path.
1601
-
1623
+ agent: str, optional, uuid reference of an agent to use.
1602
1624
  Returns:
1603
1625
  str.
1604
1626
  """
@@ -1608,6 +1630,9 @@ class RunClient(ClientMixin):
1608
1630
 
1609
1631
  if not self.settings:
1610
1632
  self.refresh_data()
1633
+ if agent:
1634
+ self._reset_agent(agent)
1635
+
1611
1636
  self._use_agent_host()
1612
1637
 
1613
1638
  params = get_streams_params(connection=self.artifacts_store)
@@ -2872,6 +2897,7 @@ class RunClient(ClientMixin):
2872
2897
  config_file.write(
2873
2898
  orjson_dumps(self.client.sanitize_for_serialization(self.run_data))
2874
2899
  )
2900
+ set_permissions(run_path)
2875
2901
 
2876
2902
  if not self._artifacts_lineage:
2877
2903
  logger.debug("Persist offline run call did not find any lineage data. ")
@@ -2887,6 +2913,7 @@ class RunClient(ClientMixin):
2887
2913
  ]
2888
2914
  )
2889
2915
  )
2916
+ set_permissions(lineages_path)
2890
2917
 
2891
2918
  @classmethod
2892
2919
  @client_handler(check_no_op=True)
@@ -2895,6 +2922,8 @@ class RunClient(ClientMixin):
2895
2922
  path: str,
2896
2923
  run_client: Optional[Union["RunClient", "Run"]] = None,
2897
2924
  reset_project: bool = False,
2925
+ reset_uuid: bool = False,
2926
+ name: Optional[str] = None,
2898
2927
  raise_if_not_found: bool = False,
2899
2928
  ) -> Optional[Union["RunClient", "Run"]]:
2900
2929
  """Loads an offline run from a local path.
@@ -2911,6 +2940,8 @@ class RunClient(ClientMixin):
2911
2940
  from the local run.
2912
2941
  raise_if_not_found: bool, optional, a flag to raise an error if the local path does not
2913
2942
  contain a persisted run.
2943
+ reset_uuid: bool, optional, a flag to reset the run's uuid.
2944
+ name: str, optional, a name to set for the run.
2914
2945
  """
2915
2946
  run_path = "{}/{}".format(path, ctx_paths.CONTEXT_LOCAL_RUN)
2916
2947
  if not os.path.isfile(run_path):
@@ -2925,6 +2956,10 @@ class RunClient(ClientMixin):
2925
2956
  run_config = V1Run(**orjson_loads(config_str))
2926
2957
  owner = run_config.owner
2927
2958
  project = run_config.project
2959
+ if reset_uuid:
2960
+ run_config.uuid = uuid.uuid4().hex
2961
+ if name:
2962
+ run_config.name = name
2928
2963
  if run_client:
2929
2964
  if reset_project or not owner:
2930
2965
  owner = run_client.owner
@@ -2983,6 +3018,7 @@ class RunClient(ClientMixin):
2983
3018
  path: str,
2984
3019
  upload_artifacts: bool = True,
2985
3020
  clean: bool = False,
3021
+ agent: Optional[str] = None,
2986
3022
  ):
2987
3023
  """Syncs an offline run to Polyaxon's API and artifacts store.
2988
3024
 
@@ -2991,6 +3027,7 @@ class RunClient(ClientMixin):
2991
3027
  path: str, root path where the run's metadata & artifacts are stored.
2992
3028
  upload_artifacts: bool, optional, flag to trigger artifacts upload.
2993
3029
  clean: bool, optional, flag to clean local path after pushing the run.
3030
+ agent: str, optional, uuid reference of an agent to use.
2994
3031
  """
2995
3032
  # We ensure that the is_offline is False
2996
3033
  is_offline = self._is_offline
@@ -3023,6 +3060,7 @@ class RunClient(ClientMixin):
3023
3060
  path="/",
3024
3061
  overwrite=True,
3025
3062
  relative_to=path,
3063
+ agent=agent,
3026
3064
  )
3027
3065
  logger.info(f"Offline artifacts for run {self.run_data.uuid} uploaded")
3028
3066
 
@@ -61,6 +61,7 @@ def resolve_globals_contexts(
61
61
  cloning_kind: V1CloningKind = None,
62
62
  original_uuid: Optional[str] = None,
63
63
  is_independent: bool = True,
64
+ username: Optional[str] = None,
64
65
  ) -> Dict:
65
66
  resolved_contexts = {
66
67
  ctx_sections.GLOBALS: {
@@ -70,6 +71,7 @@ def resolve_globals_contexts(
70
71
  owner_name, project_name
71
72
  ),
72
73
  ctx_keys.PROJECT_UUID: project_uuid,
74
+ ctx_keys.USERNAME: username,
73
75
  ctx_keys.RUN_INFO: get_run_instance(owner_name, project_name, run_uuid),
74
76
  ctx_keys.NAME: run_name,
75
77
  ctx_keys.UUID: run_uuid,
@@ -138,6 +140,7 @@ def resolve_contexts(
138
140
  cloning_kind: V1CloningKind = None,
139
141
  original_uuid: Optional[str] = None,
140
142
  is_independent: bool = True,
143
+ username: Optional[str] = None,
141
144
  ) -> Dict:
142
145
  run_kind = compiled_operation.get_run_kind()
143
146
  if run_kind not in CONTEXTS_MANAGERS:
@@ -168,6 +171,7 @@ def resolve_contexts(
168
171
  cloning_kind=cloning_kind,
169
172
  original_uuid=original_uuid,
170
173
  is_independent=is_independent,
174
+ username=username,
171
175
  )
172
176
 
173
177
  return CONTEXTS_MANAGERS[run_kind].resolve(
@@ -46,12 +46,14 @@ class BaseResolver:
46
46
  cloning_kind: V1CloningKind = None,
47
47
  original_uuid: Optional[str] = None,
48
48
  is_independent: bool = True,
49
+ username: Optional[str] = None,
49
50
  ):
50
51
  if not compiled_operation:
51
52
  raise PolyaxonCompilerError("A run spec is required for resolution.")
52
53
  self.run = run
53
54
  self.compiled_operation = compiled_operation
54
55
  self.owner_name = owner_name
56
+ self.username = username
55
57
  self.project_name = project_name
56
58
  self.project_uuid = project_uuid
57
59
  self.project_uuid = project_uuid or project_name
@@ -105,6 +107,7 @@ class BaseResolver:
105
107
  owner_name=self.owner_name,
106
108
  project_name=self.project_name,
107
109
  project_uuid=self.project_uuid,
110
+ username=self.username,
108
111
  run_uuid=self.run_uuid,
109
112
  run_name=self.run_name,
110
113
  run_path=self.run_path,
@@ -232,6 +235,7 @@ class BaseResolver:
232
235
  cloning_kind=self.cloning_kind,
233
236
  original_uuid=self.original_uuid,
234
237
  is_independent=self.is_independent,
238
+ username=self.username,
235
239
  )
236
240
 
237
241
  def _apply_runtime_contexts(self):
@@ -2,6 +2,7 @@ OWNER_NAME = "owner_name"
2
2
  PROJECT_NAME = "project_name"
3
3
  PROJECT_UUID = "project_uuid"
4
4
  PROJECT_UNIQUE_NAME = "project_unique_name"
5
+ USERNAME = "username"
5
6
  CONTEXT_PATH = "context_path"
6
7
  ARTIFACTS_PATH = "artifacts_path"
7
8
  ITERATION = "iteration"
@@ -5,7 +5,7 @@ from polyaxon._env_vars.keys import ENV_KEYS_LOG_LEVEL, ENV_KEYS_SECRET_KEY
5
5
 
6
6
 
7
7
  class ComposeOperator(CmdOperator):
8
- CMD = "docker-compose"
8
+ CMD = "docker compose"
9
9
 
10
10
  @classmethod
11
11
  def params(cls, args):
@@ -662,14 +662,16 @@ class V1Operation(BaseOp, TemplateMixinConfig):
662
662
  for k, v in contexts.items():
663
663
  params[k] = V1Param(value=v, context_only=True)
664
664
 
665
- return cls.construct(
666
- run_patch=run_patch,
667
- hub_ref=hook.hub_ref,
668
- presets=hook.presets,
669
- queue=hook.queue,
670
- namespace=hook.namespace,
671
- params=params,
672
- )
665
+ content = {"run_patch": run_patch, "params": params}
666
+ if hook.hub_ref:
667
+ content["hub_ref"] = hook.hub_ref
668
+ if hook.presets:
669
+ content["presets"] = hook.presets
670
+ if hook.queue:
671
+ content["queue"] = hook.queue
672
+ if hook.namespace:
673
+ content["namespace"] = hook.namespace
674
+ return cls.construct(**content)
673
675
 
674
676
  @classmethod
675
677
  def from_build(cls, build: V1Build, contexts: Optional[Dict] = None):
@@ -685,17 +687,23 @@ class V1Operation(BaseOp, TemplateMixinConfig):
685
687
  if not destination.connection or build.connection:
686
688
  destination.connection = build.connection
687
689
  params["destination"] = destination
688
-
689
- return cls.construct(
690
- run_patch=build.run_patch,
691
- patch_strategy=build.patch_strategy,
692
- hub_ref=build.hub_ref,
693
- presets=build.presets,
694
- queue=build.queue,
695
- namespace=build.namespace,
696
- cache=build.cache,
697
- params=params,
698
- )
690
+ content = {
691
+ "run_patch": build.run_patch,
692
+ "patch_strategy": build.patch_strategy,
693
+ "params": params,
694
+ }
695
+ if build.hub_ref:
696
+ content["hub_ref"] = build.hub_ref
697
+ if build.presets:
698
+ content["presets"] = build.presets
699
+ if build.queue:
700
+ content["queue"] = build.queue
701
+ if build.namespace:
702
+ content["namespace"] = build.namespace
703
+ if build.cache:
704
+ content["cache"] = build.cache
705
+
706
+ return cls.construct(**content)
699
707
 
700
708
 
701
709
  PartialV1Operation = to_partial(V1Operation)
@@ -66,7 +66,7 @@ async def query_k8s_operation_logs(
66
66
  new_time = now()
67
67
  params = {}
68
68
  if last_time:
69
- since_seconds = (new_time - last_time).total_seconds() - 1
69
+ since_seconds = (new_time - last_time).total_seconds()
70
70
  params["since_seconds"] = int(since_seconds)
71
71
  if stream:
72
72
  params["tail_lines"] = V1Logs._CHUNK_SIZE
@@ -83,6 +83,11 @@ async def query_k8s_operation_logs(
83
83
  **params,
84
84
  )
85
85
 
86
+ if logs and last_time:
87
+ # make sure to filter logs larger than last_time
88
+ logs = [log for log in logs if log.timestamp > last_time]
89
+ if logs and logs[-1].timestamp:
90
+ new_time = logs[-1].timestamp
86
91
  return logs, new_time
87
92
 
88
93
 
@@ -96,7 +101,7 @@ async def collect_agent_service_logs(
96
101
  k8s_manager=k8s_manager,
97
102
  pod=pod,
98
103
  container_name=container.name,
99
- tail_lines=V1Logs._CHUNK_SIZE * 3,
104
+ tail_lines=V1Logs._CHUNK_SIZE,
100
105
  )
101
106
 
102
107
 
@@ -109,16 +114,19 @@ async def query_k8s_pod_logs(
109
114
  new_time = now()
110
115
  params = {}
111
116
  if last_time:
112
- since_seconds = (new_time - last_time).total_seconds() - 1
117
+ since_seconds = (new_time - last_time).total_seconds()
113
118
  params["since_seconds"] = int(since_seconds)
114
119
  if stream:
115
120
  params["tail_lines"] = V1Logs._CHUNK_SIZE
116
121
 
117
122
  logs = await handle_pod_logs(k8s_manager=k8s_manager, pod=pod, **params)
118
123
 
119
- if logs:
120
- last_time = logs[-1].timestamp
121
- return logs, last_time
124
+ if logs and last_time:
125
+ # make sure to filter logs larger than last_time
126
+ logs = [log for log in logs if log.timestamp > last_time]
127
+ if logs and logs[-1].timestamp:
128
+ new_time = logs[-1].timestamp
129
+ return logs, new_time
122
130
 
123
131
 
124
132
  async def get_op_pods_and_services(
@@ -16,7 +16,7 @@ from polyaxon._fs.watcher import FSWatcher
16
16
  from polyaxon._k8s.manager.async_manager import AsyncK8sManager
17
17
  from polyaxon._sidecar.container.intervals import get_sync_interval
18
18
  from polyaxon._sidecar.container.monitors import sync_artifacts, sync_logs, sync_spec
19
- from polyaxon._sidecar.ignore import CONTAINER_IGNORE_FOLDERS
19
+ from polyaxon._sidecar.ignore import IGNORE_FOLDERS
20
20
  from polyaxon.client import RunClient
21
21
  from polyaxon.exceptions import PolyaxonClientException, PolyaxonContainerException
22
22
  from polyaxon.logger import logger
@@ -34,6 +34,9 @@ async def start_sidecar(
34
34
  sync_interval = get_sync_interval(
35
35
  interval=sync_interval, sleep_interval=sleep_interval
36
36
  )
37
+ fs_refresh_interval = get_sync_interval(
38
+ interval=60 * 60 * 2, sleep_interval=sleep_interval
39
+ )
37
40
  try:
38
41
  pod_id = os.environ[ENV_KEYS_K8S_POD_ID]
39
42
  except KeyError as e:
@@ -61,6 +64,7 @@ async def start_sidecar(
61
64
  retry = 0
62
65
  is_running = True
63
66
  counter = 0
67
+ fs_refresh_counter = 0
64
68
  state = {
65
69
  "last_artifacts_check": None,
66
70
  "last_logs_check": None,
@@ -74,23 +78,21 @@ async def start_sidecar(
74
78
  run_kind=pod.metadata.annotations.get("operation.polyaxon.com/kind"),
75
79
  )
76
80
  if monitor_logs:
77
- await sync_logs(
81
+ state["last_logs_check"] = await sync_logs(
78
82
  run_uuid=run_uuid,
79
83
  k8s_manager=k8s_manager,
80
84
  pod=pod,
81
- last_time=None,
82
- stream=True,
83
- is_running=is_running,
85
+ last_time=state["last_logs_check"],
86
+ stream=False,
84
87
  )
85
88
  if monitor_outputs:
86
- last_check = state["last_artifacts_check"]
87
89
  try:
88
90
  await sync_artifacts(
89
91
  fs=fs,
90
92
  fw=fw,
91
93
  store_path=connection.store_path,
92
94
  run_uuid=run_uuid,
93
- exclude=CONTAINER_IGNORE_FOLDERS,
95
+ exclude=IGNORE_FOLDERS,
94
96
  )
95
97
  except Exception as e:
96
98
  logger.debug(
@@ -98,13 +100,13 @@ async def start_sidecar(
98
100
  )
99
101
  try:
100
102
  client.sync_events_summaries(
101
- last_check=last_check,
103
+ last_check=state["last_artifacts_check"],
102
104
  events_path=ctx_paths.CONTEXT_MOUNT_RUN_EVENTS_FORMAT.format(
103
105
  run_uuid
104
106
  ),
105
107
  )
106
108
  client.sync_system_events_summaries(
107
- last_check=last_check,
109
+ last_check=state["last_artifacts_check"],
108
110
  events_path=ctx_paths.CONTEXT_MOUNT_RUN_SYSTEM_RESOURCES_EVENTS_FORMAT.format(
109
111
  run_uuid
110
112
  ),
@@ -136,7 +138,14 @@ async def start_sidecar(
136
138
  retry = 0
137
139
 
138
140
  counter += 1
139
- if counter == sync_interval:
141
+ fs_refresh_counter += 1
142
+
143
+ if fs_refresh_counter >= fs_refresh_interval:
144
+ fs_refresh_counter = 0
145
+ await close_fs(fs)
146
+ fs = await get_async_fs_from_connection(connection=connection)
147
+
148
+ if counter >= sync_interval:
140
149
  counter = 0
141
150
  try:
142
151
  await monitor()
@@ -4,7 +4,7 @@ from typing import Optional
4
4
 
5
5
  import aiofiles
6
6
 
7
- from clipped.utils.paths import check_or_create_path, delete_path
7
+ from clipped.utils.paths import check_or_create_path
8
8
  from kubernetes_asyncio.client.models import V1Pod
9
9
 
10
10
  from polyaxon._contexts import paths as ctx_paths
@@ -19,26 +19,23 @@ async def sync_logs(
19
19
  pod: V1Pod,
20
20
  last_time: Optional[datetime.datetime],
21
21
  stream: bool = False,
22
- is_running: bool = True,
23
- ):
22
+ ) -> Optional[datetime.datetime]:
24
23
  path_from = ctx_paths.CONTEXT_MOUNT_ARTIFACTS_FORMAT.format(run_uuid)
25
- path_from = "{}/.tmpplxlogs".format(path_from)
24
+ path_from = "{}/plxlogs".format(path_from)
26
25
 
27
- if not is_running:
28
- delete_path(path_from)
29
- return
30
-
31
- logs, _ = await query_k8s_pod_logs(
26
+ logs, last_time = await query_k8s_pod_logs(
32
27
  k8s_manager=k8s_manager,
33
28
  pod=pod,
34
29
  last_time=last_time,
35
30
  stream=stream,
36
31
  )
37
32
  if not logs:
38
- return
33
+ return last_time
39
34
 
40
- path_from = "{}/{}".format(path_from, pod.metadata.name)
35
+ path_from = "{}/{}.jsonl".format(path_from, pod.metadata.name)
41
36
  check_or_create_path(path_from, is_dir=False)
42
- async with aiofiles.open(path_from, "w") as filepath:
37
+ async with aiofiles.open(path_from, "a") as filepath:
43
38
  _logs = V1Logs.construct(logs=logs)
44
- await filepath.write(_logs.to_json())
39
+ await filepath.write(_logs.get_jsonl_events())
40
+
41
+ return last_time
@@ -1,2 +1 @@
1
1
  IGNORE_FOLDERS = [".git"]
2
- CONTAINER_IGNORE_FOLDERS = IGNORE_FOLDERS + ["plxlogs"]
polyaxon/pkg.py CHANGED
@@ -1,5 +1,5 @@
1
1
  NAME = "polyaxon"
2
- VERSION = "2.3.3-rc0"
2
+ VERSION = "2.4.0"
3
3
  SCHEMA_VERSION = 1.1
4
4
  DESC = "Command Line Interface (CLI) and client to interact with Polyaxon API."
5
5
  URL = "https://github.com/polyaxon/polyaxon"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: polyaxon
3
- Version: 2.3.3rc0
3
+ Version: 2.4.0
4
4
  Summary: Command Line Interface (CLI) and client to interact with Polyaxon API.
5
5
  Home-page: https://github.com/polyaxon/polyaxon
6
6
  Author: Polyaxon, Inc.
@@ -34,7 +34,7 @@ Requires-Python: >=3.8
34
34
  Description-Content-Type: text/markdown
35
35
  License-File: LICENSE
36
36
  Requires-Dist: click<9.0.0,>=7.1.1
37
- Requires-Dist: clipped==0.7.*
37
+ Requires-Dist: clipped==0.8.*
38
38
  Requires-Dist: vents==0.4.*
39
39
  Requires-Dist: Jinja2<3.1.5,>=2.10.3
40
40
  Requires-Dist: kubernetes>=10.0.1
@@ -93,7 +93,7 @@ Requires-Dist: anyio; extra == "sidecar"
93
93
  [![Slack](https://img.shields.io/badge/Slack-1.5k%20members-blue.svg?style=flat&logo=slack&longCache=true)](https://polyaxon.com/slack/)
94
94
 
95
95
  [![Docs](https://img.shields.io/badge/docs-stable-brightgreen.svg?style=flat&longCache=true)](https://polyaxon.com/docs/)
96
- [![Release](https://img.shields.io/badge/release-v2.3.3-brightgreen.svg?longCache=true)](https://polyaxon.com/docs/releases/2-1/)
96
+ [![Release](https://img.shields.io/badge/release-v2.4.0-brightgreen.svg?longCache=true)](https://polyaxon.com/docs/releases/2-1/)
97
97
  [![GitHub](https://img.shields.io/badge/issue_tracker-github-blue?style=flat&logo=github&longCache=true)](https://github.com/polyaxon/polyaxon/issues)
98
98
  [![GitHub](https://img.shields.io/badge/roadmap-github-blue?style=flat&logo=github&longCache=true)](https://github.com/orgs/polyaxon/projects/5)
99
99
 
@@ -9,7 +9,7 @@ polyaxon/exceptions.py,sha256=ujvG9p1Pn2KHYbHqB3-faadW46dEuULUQXNtfkd2zk8,10236
9
9
  polyaxon/fs.py,sha256=RS8XmVrrfXfIJXN6cTCCRRYwesCLHVVfC01Vi56lecs,246
10
10
  polyaxon/k8s.py,sha256=nI5oPCSlqU4aaeVShM6SlYS9eqYiYUL4GDXIZ4bnq-I,1051
11
11
  polyaxon/logger.py,sha256=gdZQms37Pe5G2j-Ear5jbSAJeGgX6fnvg7oE8_9MSlc,2309
12
- polyaxon/pkg.py,sha256=3n6yWPn92bZSS2lHz1AY_RukX81j89GnvpAh5uCyBBI,266
12
+ polyaxon/pkg.py,sha256=zQKd316ycIkfgrmJTWrxpKm5hZyFE96u5m4uP0M4Sj8,262
13
13
  polyaxon/polyaxonfile.py,sha256=xHmHT_cHomfuAQm82Jhnp71YNN5mQ-Lod7EbonjY4b4,429
14
14
  polyaxon/schemas.py,sha256=-CykY3emoAUCs_zRNbjwkuMkqbaEDjfKsZC86rI8154,5870
15
15
  polyaxon/settings.py,sha256=Pxx1-T2oeJ5XmvGFN0YgnVzum_9FyTPaQtl68aQvYc4,4116
@@ -33,7 +33,7 @@ polyaxon/_cli/dashboard.py,sha256=zRrOJMfowM7YQnYXhz_guKsTi-jkoCuVl_g0UTJ37qE,16
33
33
  polyaxon/_cli/errors.py,sha256=BYs7-I0CLLNYma-I0eJXB1EHs8ZTs_nWGRKGJz6CzTI,1031
34
34
  polyaxon/_cli/init.py,sha256=lZhkIbaHGv4FdMypdmXhYXRrH5GpM-qcDEks4IsmKIM,7714
35
35
  polyaxon/_cli/models.py,sha256=71oxGrIe4nQORnnfAiNi6T7A0DBnEe3V6whBABBGL3c,18066
36
- polyaxon/_cli/operations.py,sha256=iQTVHkVvUxFCRlaKBLP0xVxuxcb9KJHgTrtNe4Rf8LM,75624
36
+ polyaxon/_cli/operations.py,sha256=tYqqnTkgDWS_3bVqz_WVbDYSdKxr5qPNFnIw0AwvBW0,76291
37
37
  polyaxon/_cli/options.py,sha256=-jeMZsdfg0JOV_QzVDf1hAhqK55NI0dkC_x4MZZWty8,1927
38
38
  polyaxon/_cli/port_forward.py,sha256=Lshpcrv7-4tXcriHmppiFW_3QZ7ZosDtUbJDIvdddSA,2733
39
39
  polyaxon/_cli/project_versions.py,sha256=fbgE3tRShrgH8TAA6ETj78J38HG2-BcVoAWbxYS9d5s,20507
@@ -43,7 +43,7 @@ polyaxon/_cli/session.py,sha256=5Plolpxwkv3wiup0pRYBpBPD64dvb4GzeRPz_nuIGRo,6033
43
43
  polyaxon/_cli/utils.py,sha256=jRD1npuD89-0SxtzAx5SE3i4Lvhi8vnfYkmyOMbDxEY,1319
44
44
  polyaxon/_cli/version.py,sha256=bC0T8S6Momr7EvHGV9Swn868x9ZHD7oL8ahQv57yInk,4536
45
45
  polyaxon/_cli/services/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
46
- polyaxon/_cli/services/agent.py,sha256=wAGWFKpi-Xkt2_Sk8Z5amUgxgsfjHfDclMGoLf267CU,2080
46
+ polyaxon/_cli/services/agent.py,sha256=jIq7F92TI0r4Cr0XoYmsXiPmZ3ZDYpk3weBA21sZiPQ,2080
47
47
  polyaxon/_cli/services/clean_artifacts.py,sha256=CHN7dh7p5Hx5HJV4j_xAMrnNOvQAJfxSwrx6YVj_UD0,3549
48
48
  polyaxon/_cli/services/docker.py,sha256=G6jIYSABEzXYfrBEOTke2TDwTMZfJU-QdIRAL0JvXnU,7867
49
49
  polyaxon/_cli/services/initializer.py,sha256=eBVfCsn32vqtrmJe8lcfHfjUgPtzLM8eLk6rx-cxCnc,9735
@@ -57,7 +57,7 @@ polyaxon/_client/impersonate.py,sha256=4jRoJoX8nkwvVc3zAYqVqPoysNT1kZoPRbwyTpyHG
57
57
  polyaxon/_client/init.py,sha256=QECGjzuBTFaagndubzd9U1COpc5NGe-E0aVkSRetcIs,418
58
58
  polyaxon/_client/mixin.py,sha256=-tPm8RBej0UeG9HAKH3qN2fPX8PBtuXAHY1OpwLIDu4,1017
59
59
  polyaxon/_client/project.py,sha256=-vHLae0fMYqOjMscRm0I25Ixj-hS6o9i6XQm5PIxyiA,65520
60
- polyaxon/_client/run.py,sha256=EyuuEL7-oabgv_AlX0osKT8flY-3eLMGOINgBk93xX4,118810
60
+ polyaxon/_client/run.py,sha256=Zj0sXR2c_80fqxm-jOq4IudgtjFiQ6MoWkKb1pfpr8o,120362
61
61
  polyaxon/_client/store.py,sha256=-Y33ypkijGQnhHTQ_vCTqLlpk0wRqoaP-ntJhdUtv7E,11311
62
62
  polyaxon/_client/decorators/__init__.py,sha256=e5CBijciLP-Ic-YkaL4tFhUdr--uod_TexvxAJamGZQ,186
63
63
  polyaxon/_client/decorators/client_call_handler.py,sha256=dgdidWsL9e8AgJmOfxz4urkI3bBgX64whWI1WHeAJDU,4587
@@ -77,7 +77,7 @@ polyaxon/_client/workers/queue_worker.py,sha256=-hZa8bJeXb407B8VrPpJWdSkipFlj92F
77
77
  polyaxon/_compiler/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
78
78
  polyaxon/_compiler/contexts/__init__.py,sha256=qSmtu6aGcXZa6EVQOzzavVOd-FcBY2WNsUye3-gYry8,105
79
79
  polyaxon/_compiler/contexts/base.py,sha256=4EVQQlLgxvFORZ27ouBhwcJKhl3vMGXyOVP9HLZ0MLs,2366
80
- polyaxon/_compiler/contexts/contexts.py,sha256=tJy8eL9UrUhjisJ3MdYNmMVERSK_m_fKfgPTQgC-0y4,6535
80
+ polyaxon/_compiler/contexts/contexts.py,sha256=9nQ3c6fVqUKDZaPL_gkNC54QE0lEF2nEJsVxvbfzhuU,6675
81
81
  polyaxon/_compiler/contexts/dask_job.py,sha256=GxhLcZtCDWSDfc45UenmKsJ6Fhr0f_GeneaAzLHtncg,1265
82
82
  polyaxon/_compiler/contexts/job.py,sha256=1lkjfMO2eHndmmtxC551K6n6RE5XasqkWBfwNpYy_MA,759
83
83
  polyaxon/_compiler/contexts/ray_job.py,sha256=6CFFuX63HhyU0z--GoE3Tv2vENBB1QKGCwuFmEwC2PY,1292
@@ -96,7 +96,7 @@ polyaxon/_compiler/lineage/io_collector.py,sha256=4uD6Yc-m1tWcCb2trrBe8N-PQz8jAx
96
96
  polyaxon/_compiler/resolver/__init__.py,sha256=A-0nZiZgysAMRyOcJ5TZN4P_lWC0nqamNSqCld-kPg4,193
97
97
  polyaxon/_compiler/resolver/agent.py,sha256=R-IqlQh6HStgbQADzY8wVqmmXxMqKSUUvbLGzr0PSPI,6745
98
98
  polyaxon/_compiler/resolver/resolver.py,sha256=FmOLexETCd2h7X94DcmkYBTeeOksPoCNMN1ypZpeoUk,2724
99
- polyaxon/_compiler/resolver/runtime.py,sha256=capVFBrN6yQxKOLn7lz2nNjnpBfpVGGXZWvKIBNuRKI,9713
99
+ polyaxon/_compiler/resolver/runtime.py,sha256=_-58S7bFg_7pOT0ogBHPYWEoFddjVxDQ8q2YitEkPyw,9858
100
100
  polyaxon/_config/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
101
101
  polyaxon/_config/manager.py,sha256=rHSRfhYTVp_kwjwf2bSt-bqU_EB4DpD5mxzH6iTT4ZE,443
102
102
  polyaxon/_config/parser.py,sha256=9z7AO12HOGzhO9OeoQPOSWEcVtuTGFujLyYq4MNAaio,399
@@ -113,7 +113,7 @@ polyaxon/_containers/names.py,sha256=IAO-YLcvsK3RBsOfKXIKDkVNtbDOZyIdr8Hh8N136lc
113
113
  polyaxon/_containers/pull_policy.py,sha256=LnEVhXBRCyPhH61Zs-V2ClUvpskeeRQccGon7WujnqM,131
114
114
  polyaxon/_containers/statuses.py,sha256=Ac-AqBEStg0R_lFUF6l7dL7Pxnn1qgywLWJio9JLN0w,103
115
115
  polyaxon/_contexts/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
116
- polyaxon/_contexts/keys.py,sha256=7NnqmYFmOhiD_ovep_sJKl2ZcH7OfByhtiIvTirDfX8,709
116
+ polyaxon/_contexts/keys.py,sha256=rh4SHjL5xfTBzbGiyeIZr_Rs69LvRsKBhVDggyySv7k,731
117
117
  polyaxon/_contexts/params.py,sha256=eqxmgMEQR2flL0WiziOHPo314S7vqFBrig3s9hMK_vM,293
118
118
  polyaxon/_contexts/paths.py,sha256=VenEQwumkRPSDYchrNPU0PsBLkOHy1CLFOQKCv3oCyE,3644
119
119
  polyaxon/_contexts/refs.py,sha256=qtxG6QgawTpH9Ckaq-RK6UcB0ZyDBy8YqRieugOmnF0,3426
@@ -122,7 +122,7 @@ polyaxon/_deploy/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,
122
122
  polyaxon/_deploy/reader.py,sha256=fYv1aXvaWulqy-mr0jbgnhAIa9oAXzDA3KQVOy3_kCo,220
123
123
  polyaxon/_deploy/operators/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
124
124
  polyaxon/_deploy/operators/cmd_operator.py,sha256=lXDwLKuayiajzd0PVxxxoLb5qbf9OhYWb4iGm_D9IxU,1746
125
- polyaxon/_deploy/operators/compose.py,sha256=CmXAk27rqdCAzkEwsz9Tfrg_Va9BhXAUQTfwltO9sNc,6426
125
+ polyaxon/_deploy/operators/compose.py,sha256=WBBB8auRFTqqymzWDdyVAUwd3x9whpY9OKfofx8dNXU,6426
126
126
  polyaxon/_deploy/operators/conda.py,sha256=x5PzfziR1rr68lBffqzQuObdqzlKEwpCI7aFWE42LTE,575
127
127
  polyaxon/_deploy/operators/docker.py,sha256=aaaEU3eMqYbcq4YTMf9khgcDyfbNvv3fiaEkbauFglw,1115
128
128
  polyaxon/_deploy/operators/helm.py,sha256=e3aa7Ogdbv0O5wi7dwvwnLXaW776WJzFrVTlqhLZ3gI,779
@@ -216,7 +216,7 @@ polyaxon/_flow/notifications/__init__.py,sha256=S8GtjElJzzCGlxSL6Yi_h3CrvE4SKnnl
216
216
  polyaxon/_flow/operations/__init__.py,sha256=j77iDOi_01VURVhA116wf5kkTftcH2wmo1LkeiwI6zg,137
217
217
  polyaxon/_flow/operations/base.py,sha256=AAnah-5pwKCabZEDbcUJHOc0yQqPlVE6Bj_NfcZXmZU,2299
218
218
  polyaxon/_flow/operations/compiled_operation.py,sha256=S4BFiAH3Bj3ddEzfRNcB-JCoP1yvB6F4V_gf8tG-xAk,4569
219
- polyaxon/_flow/operations/operation.py,sha256=BG7dFvJh57WuUpS1PTFSCGaE6YLj4dvIoA5V2vJ3aTU,23717
219
+ polyaxon/_flow/operations/operation.py,sha256=kfol-tyLTgaGPiCxOdA7eXY3h3v6B_CUBq8zN-oPFIk,24093
220
220
  polyaxon/_flow/optimization/__init__.py,sha256=zgba5ZXbXmChLq7PUnuxCXjvGVBnP9OO08xErSWjTkE,866
221
221
  polyaxon/_flow/optimization/enums.py,sha256=Uc2bP8cyvuf7lDmNqsk9bweB8Rr2QChXyKtaxgnRLpY,1135
222
222
  polyaxon/_flow/params/__init__.py,sha256=G_dCHuJZjRAkI83vDLykZE5_xeUjjEKaDL9QWVxCZ6E,60
@@ -343,7 +343,7 @@ polyaxon/_k8s/executor/async_executor.py,sha256=5JShP9O0Jv2Czgyab8BkAVxjuPLD5FWV
343
343
  polyaxon/_k8s/executor/base.py,sha256=5qD21gfBlAq9KabgMYkExHejs61LtFAUAcnAqsmj3k0,4004
344
344
  polyaxon/_k8s/executor/executor.py,sha256=Qub57Q86SdmBv73CuyFJxydFOIyL0CZKp4B_7aSyLsU,321
345
345
  polyaxon/_k8s/logging/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
346
- polyaxon/_k8s/logging/async_monitor.py,sha256=Av4L-nMOeytqsswY2xB9kZF7FKgk83Jhn8cC1OMQVuk,7194
346
+ polyaxon/_k8s/logging/async_monitor.py,sha256=NK49bB-vytSU2_JlicZudKpiGzkNpVexVGevcJESAXo,7577
347
347
  polyaxon/_k8s/logging/monitor.py,sha256=4-NLN4_y0QVsReNJr8Ekv8kh0XNRRTKiiHopWs4wtMc,3426
348
348
  polyaxon/_k8s/manager/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
349
349
  polyaxon/_k8s/manager/async_manager.py,sha256=REeGSH-rP0WvpCQvwE-6ZfELfpVCJBsDkTe1QzPLy3o,9474
@@ -561,13 +561,13 @@ polyaxon/_services/auth.py,sha256=Hkt-aet0kjCN7cfVqTKHgCpEjn-6s8HrHyYfH20w-3k,22
561
561
  polyaxon/_services/headers.py,sha256=SAQHSFuIBtt28Ro-tlMhN1T1Qw9WQdF3S6XH08LuygM,535
562
562
  polyaxon/_services/values.py,sha256=Uyj-kB5omSm3SbwpjqeuboSSOK5dyovoh-RszHPdiQ8,2347
563
563
  polyaxon/_sidecar/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
564
- polyaxon/_sidecar/ignore.py,sha256=-TkUcBAJWA8P3Blh4cYbnKvom-6yqURhU1QSomMnq_c,82
564
+ polyaxon/_sidecar/ignore.py,sha256=VSMo0kaTD7K2zTyVJ1u84mZyR_07YdICptbKsxHKo9c,26
565
565
  polyaxon/_sidecar/processor.py,sha256=XIIxl_9W2wme0xOq-4lBnZeThJrGj0dlaC4_mhSKgVI,3235
566
- polyaxon/_sidecar/container/__init__.py,sha256=12HJciqE_QbK5PbvTkEhLNWuQplSpMPGzJK5MZXcq8g,5272
566
+ polyaxon/_sidecar/container/__init__.py,sha256=EHzOtJQvqshuNEMwWEABL0CbR86GOahX8708vCXrV4o,5611
567
567
  polyaxon/_sidecar/container/intervals.py,sha256=-tckK4E_Ur0feVsLBhUPUu6brx-JaU6RDFQBW-TAo6I,304
568
568
  polyaxon/_sidecar/container/monitors/__init__.py,sha256=x12AMMGTi4cK_LaDvEK0gd3jZ3R57iPnp5ICehCwOl8,202
569
569
  polyaxon/_sidecar/container/monitors/artifacts.py,sha256=BlXMOiKJFhHcRpJ9T7izh-GtcXoKfulZmzfq7aBgdOY,2746
570
- polyaxon/_sidecar/container/monitors/logs.py,sha256=B-Dw35oDidm54jOWNAfvVby3zGmgvpIZJR3rkf3remc,1227
570
+ polyaxon/_sidecar/container/monitors/logs.py,sha256=xionA2GZCfcbtBVYpzTBLnkfWlFsG1wT1y1Y9LPc0Ik,1197
571
571
  polyaxon/_sidecar/container/monitors/spec.py,sha256=1JCkz0gH8j6C9WNlG6c4_0PiwfghFXc7bv3VeE13Mhw,836
572
572
  polyaxon/_utils/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
573
573
  polyaxon/_utils/cache.py,sha256=hsnADZUnnYKQ2jrzuQjg3z9_4YGznL-pof9wH-cObR8,1717
@@ -611,9 +611,9 @@ polyaxon/tuners/hyperopt.py,sha256=zd6MblMGkooqLGDFJVo5kClqYnBoMwGj-opqqj8FDzQ,7
611
611
  polyaxon/tuners/mapping.py,sha256=pOdHCiwEufTk-QT7pNyjBjAEWNTM-lMC17WNTCk7C24,69
612
612
  polyaxon/tuners/random_search.py,sha256=6VEekM3N9h6E1lbpVTTUGKFPJlGMY2u-GkG615_nQcI,80
613
613
  polyaxon_sdk/__init__.py,sha256=HWvFdGWESyVG3f26K_szewiG-McMOHFkXKTfZcBlHsM,92
614
- polyaxon-2.3.3rc0.dist-info/LICENSE,sha256=86kroZbQUDsmSWOomB7dpceG65UXiVSPob4581tStBc,11349
615
- polyaxon-2.3.3rc0.dist-info/METADATA,sha256=gaOsBiWMRXCGAqf-Rc0FNEIFsUylXHfuDLNh3uM8lRE,11660
616
- polyaxon-2.3.3rc0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
617
- polyaxon-2.3.3rc0.dist-info/entry_points.txt,sha256=aFbUMjkg9vzRBVAFhqvR1m92yG8Cov7UAF0zViGfoQw,70
618
- polyaxon-2.3.3rc0.dist-info/top_level.txt,sha256=I_2e_Vv8rdcqWcMMdZocbrHiKPNGqoSMBqIObrw00Rg,22
619
- polyaxon-2.3.3rc0.dist-info/RECORD,,
614
+ polyaxon-2.4.0.dist-info/LICENSE,sha256=86kroZbQUDsmSWOomB7dpceG65UXiVSPob4581tStBc,11349
615
+ polyaxon-2.4.0.dist-info/METADATA,sha256=cbVkotBGTIpRB2ZLYBr4jFC9gzavsTyPxZI_CQgBhOk,11657
616
+ polyaxon-2.4.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
617
+ polyaxon-2.4.0.dist-info/entry_points.txt,sha256=aFbUMjkg9vzRBVAFhqvR1m92yG8Cov7UAF0zViGfoQw,70
618
+ polyaxon-2.4.0.dist-info/top_level.txt,sha256=I_2e_Vv8rdcqWcMMdZocbrHiKPNGqoSMBqIObrw00Rg,22
619
+ polyaxon-2.4.0.dist-info/RECORD,,