polyaxon 2.4.0rc1__py3-none-any.whl → 2.6.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.
Files changed (218) hide show
  1. polyaxon/_auxiliaries/default_scheduling.py +17 -7
  2. polyaxon/_auxiliaries/init.py +14 -6
  3. polyaxon/_auxiliaries/sidecar.py +10 -8
  4. polyaxon/_cli/dashboard.py +2 -5
  5. polyaxon/_cli/run.py +14 -0
  6. polyaxon/_cli/version.py +4 -1
  7. polyaxon/_compiler/contexts/contexts.py +4 -0
  8. polyaxon/_compiler/resolver/agent.py +10 -9
  9. polyaxon/_compiler/resolver/runtime.py +4 -0
  10. polyaxon/_constants/metadata.py +1 -0
  11. polyaxon/_contexts/keys.py +1 -0
  12. polyaxon/_deploy/schemas/auth.py +3 -3
  13. polyaxon/_deploy/schemas/celery.py +10 -8
  14. polyaxon/_deploy/schemas/deployment.py +148 -116
  15. polyaxon/_deploy/schemas/email.py +8 -8
  16. polyaxon/_deploy/schemas/ingress.py +7 -7
  17. polyaxon/_deploy/schemas/intervals.py +3 -1
  18. polyaxon/_deploy/schemas/operators.py +8 -8
  19. polyaxon/_deploy/schemas/proxy.py +9 -9
  20. polyaxon/_deploy/schemas/rbac.py +1 -1
  21. polyaxon/_deploy/schemas/root_user.py +5 -5
  22. polyaxon/_deploy/schemas/security_context.py +25 -15
  23. polyaxon/_deploy/schemas/service.py +73 -69
  24. polyaxon/_deploy/schemas/ssl.py +3 -3
  25. polyaxon/_deploy/schemas/ui.py +10 -6
  26. polyaxon/_docker/builder/builder.py +4 -1
  27. polyaxon/_docker/converter/base/containers.py +4 -7
  28. polyaxon/_docker/converter/base/env_vars.py +5 -5
  29. polyaxon/_docker/converter/base/mounts.py +2 -2
  30. polyaxon/_docker/docker_types.py +57 -30
  31. polyaxon/_env_vars/keys.py +2 -0
  32. polyaxon/_flow/__init__.py +3 -2
  33. polyaxon/_flow/builds/__init__.py +8 -8
  34. polyaxon/_flow/cache/__init__.py +4 -4
  35. polyaxon/_flow/component/base.py +25 -18
  36. polyaxon/_flow/component/component.py +4 -3
  37. polyaxon/_flow/early_stopping/__init__.py +1 -1
  38. polyaxon/_flow/early_stopping/policies.py +12 -10
  39. polyaxon/_flow/environment/__init__.py +42 -24
  40. polyaxon/_flow/events/__init__.py +1 -1
  41. polyaxon/_flow/hooks/__init__.py +11 -11
  42. polyaxon/_flow/init/__init__.py +41 -25
  43. polyaxon/_flow/io/io.py +57 -47
  44. polyaxon/_flow/joins/__init__.py +5 -5
  45. polyaxon/_flow/matrix/bayes.py +23 -17
  46. polyaxon/_flow/matrix/grid_search.py +16 -7
  47. polyaxon/_flow/matrix/hyperband.py +10 -10
  48. polyaxon/_flow/matrix/hyperopt.py +14 -9
  49. polyaxon/_flow/matrix/iterative.py +14 -8
  50. polyaxon/_flow/matrix/mapping.py +4 -4
  51. polyaxon/_flow/matrix/params.py +138 -77
  52. polyaxon/_flow/matrix/random_search.py +10 -5
  53. polyaxon/_flow/matrix/tuner.py +4 -4
  54. polyaxon/_flow/mounts/artifacts_mounts.py +1 -1
  55. polyaxon/_flow/notifications/__init__.py +1 -1
  56. polyaxon/_flow/operations/base.py +10 -8
  57. polyaxon/_flow/operations/compiled_operation.py +5 -4
  58. polyaxon/_flow/operations/operation.py +30 -22
  59. polyaxon/_flow/optimization/__init__.py +2 -2
  60. polyaxon/_flow/params/params.py +10 -9
  61. polyaxon/_flow/plugins/__init__.py +19 -13
  62. polyaxon/_flow/run/dag.py +12 -9
  63. polyaxon/_flow/run/dask/dask.py +4 -4
  64. polyaxon/_flow/run/dask/replica.py +17 -11
  65. polyaxon/_flow/run/job.py +17 -11
  66. polyaxon/_flow/run/kubeflow/mpi_job.py +10 -5
  67. polyaxon/_flow/run/kubeflow/mx_job.py +25 -9
  68. polyaxon/_flow/run/kubeflow/paddle_job.py +16 -9
  69. polyaxon/_flow/run/kubeflow/pytorch_job.py +24 -17
  70. polyaxon/_flow/run/kubeflow/replica.py +17 -11
  71. polyaxon/_flow/run/kubeflow/scheduling_policy.py +7 -5
  72. polyaxon/_flow/run/kubeflow/tf_job.py +15 -8
  73. polyaxon/_flow/run/kubeflow/xgboost_job.py +9 -4
  74. polyaxon/_flow/run/ray/ray.py +9 -6
  75. polyaxon/_flow/run/ray/replica.py +25 -16
  76. polyaxon/_flow/run/resources.py +14 -13
  77. polyaxon/_flow/run/service.py +4 -4
  78. polyaxon/_flow/schedules/cron.py +4 -4
  79. polyaxon/_flow/schedules/interval.py +4 -4
  80. polyaxon/_flow/templates/__init__.py +3 -3
  81. polyaxon/_flow/termination/__init__.py +3 -3
  82. polyaxon/_fs/async_manager.py +1 -1
  83. polyaxon/_fs/watcher.py +26 -27
  84. polyaxon/_k8s/k8s_validation.py +1 -1
  85. polyaxon/_k8s/logging/async_monitor.py +18 -3
  86. polyaxon/_local_process/converter/base/containers.py +4 -7
  87. polyaxon/_local_process/converter/base/env_vars.py +5 -5
  88. polyaxon/_local_process/process_types.py +15 -12
  89. polyaxon/_polyaxonfile/specs/compiled_operation.py +1 -1
  90. polyaxon/_polyaxonfile/specs/libs/parser.py +1 -1
  91. polyaxon/_polyaxonfile/specs/libs/validator.py +1 -1
  92. polyaxon/_polyaxonfile/specs/operation.py +1 -1
  93. polyaxon/_polyaxonfile/specs/sections.py +8 -0
  94. polyaxon/_runner/agent/async_agent.py +9 -6
  95. polyaxon/_runner/agent/base_agent.py +8 -5
  96. polyaxon/_runner/agent/sync_agent.py +8 -5
  97. polyaxon/_runner/converter/converter.py +12 -4
  98. polyaxon/_schemas/agent.py +69 -37
  99. polyaxon/_schemas/authentication.py +4 -4
  100. polyaxon/_schemas/base.py +26 -2
  101. polyaxon/_schemas/checks.py +3 -3
  102. polyaxon/_schemas/cli.py +4 -6
  103. polyaxon/_schemas/client.py +20 -18
  104. polyaxon/_schemas/compatibility.py +4 -4
  105. polyaxon/_schemas/container_resources.py +1 -1
  106. polyaxon/_schemas/home.py +3 -3
  107. polyaxon/_schemas/installation.py +13 -9
  108. polyaxon/_schemas/lifecycle.py +23 -23
  109. polyaxon/_schemas/log_handler.py +2 -2
  110. polyaxon/_schemas/services.py +26 -14
  111. polyaxon/_schemas/types/artifacts.py +3 -3
  112. polyaxon/_schemas/types/dockerfile.py +14 -12
  113. polyaxon/_schemas/types/event.py +2 -2
  114. polyaxon/_schemas/types/file.py +3 -3
  115. polyaxon/_schemas/types/git.py +12 -4
  116. polyaxon/_schemas/types/tensorboard.py +14 -8
  117. polyaxon/_schemas/user.py +3 -3
  118. polyaxon/_schemas/version.py +2 -2
  119. polyaxon/_sdk/api/agents_v1_api.py +45 -45
  120. polyaxon/_sdk/api/artifacts_stores_v1_api.py +3 -3
  121. polyaxon/_sdk/api/auth_v1_api.py +13 -13
  122. polyaxon/_sdk/api/connections_v1_api.py +15 -15
  123. polyaxon/_sdk/api/dashboards_v1_api.py +15 -15
  124. polyaxon/_sdk/api/organizations_v1_api.py +77 -77
  125. polyaxon/_sdk/api/presets_v1_api.py +15 -15
  126. polyaxon/_sdk/api/project_dashboards_v1_api.py +17 -17
  127. polyaxon/_sdk/api/project_searches_v1_api.py +17 -17
  128. polyaxon/_sdk/api/projects_v1_api.py +65 -65
  129. polyaxon/_sdk/api/queues_v1_api.py +19 -19
  130. polyaxon/_sdk/api/runs_v1_api.py +127 -127
  131. polyaxon/_sdk/api/searches_v1_api.py +15 -15
  132. polyaxon/_sdk/api/service_accounts_v1_api.py +27 -27
  133. polyaxon/_sdk/api/tags_v1_api.py +17 -17
  134. polyaxon/_sdk/api/teams_v1_api.py +51 -51
  135. polyaxon/_sdk/api/users_v1_api.py +25 -25
  136. polyaxon/_sdk/api/versions_v1_api.py +7 -7
  137. polyaxon/_sdk/schemas/v1_activity.py +8 -8
  138. polyaxon/_sdk/schemas/v1_agent.py +17 -16
  139. polyaxon/_sdk/schemas/v1_agent_state_response.py +4 -4
  140. polyaxon/_sdk/schemas/v1_agent_state_response_agent_state.py +10 -10
  141. polyaxon/_sdk/schemas/v1_agent_status_body_request.py +3 -3
  142. polyaxon/_sdk/schemas/v1_analytics_spec.py +4 -4
  143. polyaxon/_sdk/schemas/v1_artifact_tree.py +3 -3
  144. polyaxon/_sdk/schemas/v1_auth.py +1 -1
  145. polyaxon/_sdk/schemas/v1_cloning.py +3 -3
  146. polyaxon/_sdk/schemas/v1_connection_response.py +9 -9
  147. polyaxon/_sdk/schemas/v1_dashboard.py +9 -9
  148. polyaxon/_sdk/schemas/v1_dashboard_spec.py +5 -5
  149. polyaxon/_sdk/schemas/v1_entities_tags.py +2 -2
  150. polyaxon/_sdk/schemas/v1_entities_transfer.py +2 -2
  151. polyaxon/_sdk/schemas/v1_entity_notification_body.py +7 -7
  152. polyaxon/_sdk/schemas/v1_entity_stage_body_request.py +5 -5
  153. polyaxon/_sdk/schemas/v1_entity_status_body_request.py +5 -5
  154. polyaxon/_sdk/schemas/v1_events_response.py +2 -2
  155. polyaxon/_sdk/schemas/v1_list_activities_response.py +4 -4
  156. polyaxon/_sdk/schemas/v1_list_agents_response.py +4 -4
  157. polyaxon/_sdk/schemas/v1_list_bookmarks_response.py +4 -4
  158. polyaxon/_sdk/schemas/v1_list_connections_response.py +4 -4
  159. polyaxon/_sdk/schemas/v1_list_dashboards_response.py +4 -4
  160. polyaxon/_sdk/schemas/v1_list_organization_members_response.py +4 -4
  161. polyaxon/_sdk/schemas/v1_list_organizations_response.py +4 -4
  162. polyaxon/_sdk/schemas/v1_list_presets_response.py +4 -4
  163. polyaxon/_sdk/schemas/v1_list_project_versions_response.py +4 -4
  164. polyaxon/_sdk/schemas/v1_list_projects_response.py +4 -4
  165. polyaxon/_sdk/schemas/v1_list_queues_response.py +4 -4
  166. polyaxon/_sdk/schemas/v1_list_run_artifacts_response.py +4 -4
  167. polyaxon/_sdk/schemas/v1_list_run_connections_response.py +4 -4
  168. polyaxon/_sdk/schemas/v1_list_run_edges_response.py +4 -4
  169. polyaxon/_sdk/schemas/v1_list_runs_response.py +4 -4
  170. polyaxon/_sdk/schemas/v1_list_searches_response.py +4 -4
  171. polyaxon/_sdk/schemas/v1_list_service_accounts_response.py +4 -4
  172. polyaxon/_sdk/schemas/v1_list_tags_response.py +4 -4
  173. polyaxon/_sdk/schemas/v1_list_team_members_response.py +4 -4
  174. polyaxon/_sdk/schemas/v1_list_teams_response.py +4 -4
  175. polyaxon/_sdk/schemas/v1_list_token_response.py +4 -4
  176. polyaxon/_sdk/schemas/v1_operation_body.py +8 -8
  177. polyaxon/_sdk/schemas/v1_organization.py +16 -16
  178. polyaxon/_sdk/schemas/v1_organization_member.py +6 -6
  179. polyaxon/_sdk/schemas/v1_password_change.py +3 -3
  180. polyaxon/_sdk/schemas/v1_pipeline.py +3 -3
  181. polyaxon/_sdk/schemas/v1_preset.py +11 -12
  182. polyaxon/_sdk/schemas/v1_project.py +17 -17
  183. polyaxon/_sdk/schemas/v1_project_settings.py +11 -11
  184. polyaxon/_sdk/schemas/v1_project_version.py +20 -20
  185. polyaxon/_sdk/schemas/v1_queue.py +12 -12
  186. polyaxon/_sdk/schemas/v1_run.py +38 -38
  187. polyaxon/_sdk/schemas/v1_run_connection.py +3 -3
  188. polyaxon/_sdk/schemas/v1_run_edge.py +5 -5
  189. polyaxon/_sdk/schemas/v1_run_edge_lineage.py +3 -3
  190. polyaxon/_sdk/schemas/v1_run_edges_graph.py +1 -1
  191. polyaxon/_sdk/schemas/v1_run_reference_catalog.py +4 -4
  192. polyaxon/_sdk/schemas/v1_run_settings.py +9 -9
  193. polyaxon/_sdk/schemas/v1_search.py +10 -10
  194. polyaxon/_sdk/schemas/v1_search_spec.py +14 -14
  195. polyaxon/_sdk/schemas/v1_section_spec.py +12 -12
  196. polyaxon/_sdk/schemas/v1_service_account.py +9 -9
  197. polyaxon/_sdk/schemas/v1_settings_catalog.py +4 -4
  198. polyaxon/_sdk/schemas/v1_tag.py +6 -6
  199. polyaxon/_sdk/schemas/v1_team.py +11 -11
  200. polyaxon/_sdk/schemas/v1_team_member.py +6 -6
  201. polyaxon/_sdk/schemas/v1_team_settings.py +2 -2
  202. polyaxon/_sdk/schemas/v1_token.py +10 -10
  203. polyaxon/_sdk/schemas/v1_trial_start.py +6 -6
  204. polyaxon/_sdk/schemas/v1_user.py +6 -6
  205. polyaxon/_sdk/schemas/v1_user_access.py +7 -7
  206. polyaxon/_sdk/schemas/v1_user_email.py +1 -1
  207. polyaxon/_sdk/schemas/v1_user_singup.py +5 -5
  208. polyaxon/_sdk/schemas/v1_uuids.py +1 -1
  209. polyaxon/_sidecar/container/__init__.py +13 -8
  210. polyaxon/_utils/cli_constants.py +2 -0
  211. polyaxon/_utils/test_utils.py +2 -1
  212. polyaxon/pkg.py +1 -1
  213. {polyaxon-2.4.0rc1.dist-info → polyaxon-2.6.0.dist-info}/METADATA +13 -13
  214. {polyaxon-2.4.0rc1.dist-info → polyaxon-2.6.0.dist-info}/RECORD +218 -218
  215. {polyaxon-2.4.0rc1.dist-info → polyaxon-2.6.0.dist-info}/WHEEL +1 -1
  216. {polyaxon-2.4.0rc1.dist-info → polyaxon-2.6.0.dist-info}/LICENSE +0 -0
  217. {polyaxon-2.4.0rc1.dist-info → polyaxon-2.6.0.dist-info}/entry_points.txt +0 -0
  218. {polyaxon-2.4.0rc1.dist-info → polyaxon-2.6.0.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,14 @@ from copy import copy
2
2
  from typing import Dict, Optional
3
3
  from typing_extensions import Literal
4
4
 
5
- from clipped.compact.pydantic import Field, StrictStr, root_validator, validator
5
+ from clipped.compact.pydantic import (
6
+ Field,
7
+ StrictStr,
8
+ field_validator,
9
+ model_validator,
10
+ validation_after,
11
+ validation_before,
12
+ )
6
13
  from clipped.config.patch_strategy import PatchStrategy
7
14
  from clipped.config.schema import skip_partial, to_partial
8
15
 
@@ -508,40 +515,41 @@ class V1Operation(BaseOp, TemplateMixinConfig):
508
515
  "run_patch",
509
516
  "patch_strategy",
510
517
  ]
518
+ _CUSTOM_DUMP_FIELDS = {"component"}
511
519
 
512
520
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
513
- params: Optional[Dict[StrictStr, V1Param]]
514
- hub_ref: Optional[StrictStr] = Field(alias="hubRef")
515
- dag_ref: Optional[StrictStr] = Field(alias="dagRef")
516
- url_ref: Optional[StrictStr] = Field(alias="urlRef")
517
- path_ref: Optional[StrictStr] = Field(alias="pathRef")
518
- component: Optional[V1Component]
519
- patch_strategy: Optional[PatchStrategy] = Field(alias="patchStrategy")
520
- is_preset: Optional[bool] = Field(alias="isPreset")
521
- run_patch: Optional[Dict] = Field(alias="runPatch")
522
- template: Optional[V1Template]
523
-
524
- @root_validator
521
+ params: Optional[Dict[StrictStr, V1Param]] = None
522
+ hub_ref: Optional[StrictStr] = Field(alias="hubRef", default=None)
523
+ dag_ref: Optional[StrictStr] = Field(alias="dagRef", default=None)
524
+ url_ref: Optional[StrictStr] = Field(alias="urlRef", default=None)
525
+ path_ref: Optional[StrictStr] = Field(alias="pathRef", default=None)
526
+ component: Optional[V1Component] = None
527
+ patch_strategy: Optional[PatchStrategy] = Field(alias="patchStrategy", default=None)
528
+ is_preset: Optional[bool] = Field(alias="isPreset", default=None)
529
+ run_patch: Optional[Dict] = Field(alias="runPatch", default=None)
530
+ template: Optional[V1Template] = None
531
+
532
+ @model_validator(**validation_after)
525
533
  @skip_partial
526
534
  def validate_reference(cls, values):
527
535
  if not values:
528
536
  return values
529
- if values.get("is_preset"):
537
+ if cls.get_value_for_key("is_preset", values):
530
538
  return values
531
539
  count = 0
532
- hub_ref = values.get("hub_ref")
540
+ hub_ref = cls.get_value_for_key("hub_ref", values)
533
541
  if hub_ref:
534
542
  count += 1
535
- dag_ref = values.get("dag_ref")
543
+ dag_ref = cls.get_value_for_key("dag_ref", values)
536
544
  if dag_ref:
537
545
  count += 1
538
- url_ref = values.get("url_ref")
546
+ url_ref = cls.get_value_for_key("url_ref", values)
539
547
  if url_ref:
540
548
  count += 1
541
- path_ref = values.get("path_ref")
549
+ path_ref = cls.get_value_for_key("path_ref", values)
542
550
  if path_ref:
543
551
  count += 1
544
- component = values.get("component")
552
+ component = cls.get_value_for_key("component", values)
545
553
  if component and count == 0:
546
554
  count += 1
547
555
 
@@ -552,11 +560,11 @@ class V1Operation(BaseOp, TemplateMixinConfig):
552
560
  )
553
561
  return values
554
562
 
555
- @validator("run_patch")
563
+ @field_validator("run_patch")
556
564
  @skip_partial
557
565
  def validate_run_patch(cls, run_patch, values):
558
- component = values.get("component")
559
- if values.get("is_preset"):
566
+ component = cls.get_value_for_key("component", values)
567
+ if cls.get_value_for_key("is_preset", values):
560
568
  return run_patch
561
569
  if not component or not run_patch:
562
570
  return run_patch
@@ -10,7 +10,7 @@ class V1OptimizationMetric(BaseSchemaModel):
10
10
  _IDENTIFIER = "optimization_metric"
11
11
 
12
12
  name: StrictStr
13
- optimization: Optional[V1Optimization]
13
+ optimization: Optional[V1Optimization] = None
14
14
 
15
15
  def get_for_sort(self):
16
16
  if self.optimization == V1Optimization.MINIMIZE:
@@ -22,7 +22,7 @@ class V1OptimizationResource(BaseSchemaModel):
22
22
  _IDENTIFIER = "optimization_resource"
23
23
 
24
24
  name: StrictStr
25
- type: Optional[V1ResourceType]
25
+ type: Optional[V1ResourceType] = None
26
26
 
27
27
  def cast_value(self, value):
28
28
  if V1ResourceType.is_int(self.type):
@@ -2,7 +2,7 @@ from collections import namedtuple
2
2
  from collections.abc import Mapping
3
3
  from typing import Any, Dict, Optional
4
4
 
5
- from clipped.compact.pydantic import Field, StrictStr, validator
5
+ from clipped.compact.pydantic import Field, StrictStr, field_validator
6
6
  from clipped.config.schema import skip_partial
7
7
  from clipped.utils.lists import to_list
8
8
  from clipped.utils.strings import to_string
@@ -18,7 +18,7 @@ from polyaxon.exceptions import PolyaxonValidationError
18
18
 
19
19
  def validate_param_value(value, ref):
20
20
  if ref and not isinstance(value, str):
21
- raise TypeError(
21
+ raise ValueError(
22
22
  "Value must be of type string when a ref is provided, received `{}` instead.".format(
23
23
  value
24
24
  )
@@ -387,16 +387,17 @@ class V1Param(BaseSchemaModel, ctx_refs.RefMixin, ParamValueMixin):
387
387
  _IDENTIFIER = "param"
388
388
 
389
389
  value: Any
390
- ref: Optional[StrictStr]
391
- context_only: Optional[bool] = Field(alias="contextOnly")
392
- connection: Optional[StrictStr]
393
- to_init: Optional[bool] = Field(alias="toInit")
394
- to_env: Optional[StrictStr] = Field(alias="toEnv")
390
+ ref: Optional[StrictStr] = None
391
+ context_only: Optional[bool] = Field(alias="contextOnly", default=False)
392
+ connection: Optional[StrictStr] = None
393
+ to_init: Optional[bool] = Field(alias="toInit", default=None)
394
+ to_env: Optional[StrictStr] = Field(alias="toEnv", default=None)
395
395
 
396
- @validator("ref")
396
+ @field_validator("ref")
397
397
  @skip_partial
398
398
  def check_ref(cls, ref, values):
399
- validate_param_value(value=values.get("value"), ref=ref)
399
+ values = cls.get_data_from_values(values)
400
+ validate_param_value(value=cls.get_value_for_key("value", values), ref=ref)
400
401
  return ref
401
402
 
402
403
 
@@ -259,19 +259,25 @@ class V1Plugins(BaseSchemaModel):
259
259
 
260
260
  _IDENTIFIER = "plugins"
261
261
 
262
- auth: Optional[BoolOrRef]
263
- docker: Optional[BoolOrRef]
264
- shm: Optional[BoolOrRef]
265
- mount_artifacts_store: Optional[BoolOrRef] = Field(alias="mountArtifactsStore")
266
- collect_artifacts: Optional[BoolOrRef] = Field(alias="collectArtifacts")
267
- collect_logs: Optional[BoolOrRef] = Field(alias="collectLogs")
268
- collect_resources: Optional[BoolOrRef] = Field(alias="collectResources")
269
- sync_statuses: Optional[BoolOrRef] = Field(alias="syncStatuses")
270
- auto_resume: Optional[BoolOrRef] = Field(alias="autoResume")
271
- log_level: Optional[StrictStr] = Field(alias="logLevel")
272
- external_host: Optional[BoolOrRef] = Field(alias="externalHost")
273
- sidecar: Optional[Union[V1PolyaxonSidecarContainer, RefField]]
274
- notifications: Optional[Union[List[V1Notification], RefField]]
262
+ auth: Optional[BoolOrRef] = None
263
+ docker: Optional[BoolOrRef] = None
264
+ shm: Optional[BoolOrRef] = None
265
+ mount_artifacts_store: Optional[BoolOrRef] = Field(
266
+ alias="mountArtifactsStore", default=None
267
+ )
268
+ collect_artifacts: Optional[BoolOrRef] = Field(
269
+ alias="collectArtifacts", default=None
270
+ )
271
+ collect_logs: Optional[BoolOrRef] = Field(alias="collectLogs", default=None)
272
+ collect_resources: Optional[BoolOrRef] = Field(
273
+ alias="collectResources", default=None
274
+ )
275
+ sync_statuses: Optional[BoolOrRef] = Field(alias="syncStatuses", default=None)
276
+ auto_resume: Optional[BoolOrRef] = Field(alias="autoResume", default=None)
277
+ log_level: Optional[StrictStr] = Field(alias="logLevel", default=None)
278
+ external_host: Optional[BoolOrRef] = Field(alias="externalHost", default=None)
279
+ sidecar: Optional[Union[V1PolyaxonSidecarContainer, RefField]] = None
280
+ notifications: Optional[Union[List[V1Notification], RefField]] = None
275
281
 
276
282
  @classmethod
277
283
  def get_or_create(
polyaxon/_flow/run/dag.py CHANGED
@@ -7,7 +7,9 @@ from clipped.compact.pydantic import (
7
7
  PositiveInt,
8
8
  PrivateAttr,
9
9
  StrictStr,
10
- validator,
10
+ field_validator,
11
+ validation_always,
12
+ validation_before,
11
13
  )
12
14
  from clipped.types.ref_or_obj import RefField
13
15
 
@@ -300,16 +302,17 @@ class V1Dag(BaseRun):
300
302
 
301
303
  _IDENTIFIER = V1RunKind.DAG
302
304
  _SWAGGER_FIELDS = ["volumes"]
305
+ _CUSTOM_DUMP_FIELDS = {"operations", "components", "environment"}
303
306
 
304
307
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
305
- operations: Optional[Union[List[V1Operation], RefField]]
306
- components: Optional[Union[List[V1Component], RefField]]
307
- environment: Optional[Union[V1Environment, RefField]]
308
- connections: Optional[Union[List[StrictStr], RefField]]
309
- volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
310
- concurrency: Optional[Union[PositiveInt, RefField]]
308
+ operations: Optional[Union[List[V1Operation], RefField]] = None
309
+ components: Optional[Union[List[V1Component], RefField]] = None
310
+ environment: Optional[Union[V1Environment, RefField]] = None
311
+ connections: Optional[Union[List[StrictStr], RefField]] = None
312
+ volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
313
+ concurrency: Optional[Union[PositiveInt, RefField]] = None
311
314
  early_stopping: Optional[Union[List[V1EarlyStopping], RefField]] = Field(
312
- alias="earlyStopping"
315
+ alias="earlyStopping", default=None
313
316
  )
314
317
 
315
318
  _dag: Dict[str, "DagOpSpec"] = PrivateAttr()
@@ -317,7 +320,7 @@ class V1Dag(BaseRun):
317
320
  _op_component_mapping: Dict[str, str] = PrivateAttr()
318
321
  _context: Dict[str, Any] = PrivateAttr()
319
322
 
320
- @validator("volumes", always=True, pre=True)
323
+ @field_validator("volumes", **validation_always, **validation_before)
321
324
  def validate_volumes(cls, v):
322
325
  if not v:
323
326
  return v
@@ -124,12 +124,12 @@ class V1DaskJob(BaseRun, DestinationImageMixin):
124
124
  """
125
125
 
126
126
  _IDENTIFIER = V1RunKind.DASKJOB
127
- _SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
127
+ _CUSTOM_DUMP_FIELDS = {"job", "worker", "scheduler"}
128
128
 
129
129
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
130
- job: Optional[Union[V1DaskReplica, RefField]]
131
- worker: Optional[Union[V1DaskReplica, RefField]]
132
- scheduler: Optional[Union[V1DaskReplica, RefField]]
130
+ job: Optional[Union[V1DaskReplica, RefField]] = None
131
+ worker: Optional[Union[V1DaskReplica, RefField]] = None
132
+ scheduler: Optional[Union[V1DaskReplica, RefField]] = None
133
133
 
134
134
  def apply_image_destination(self, image: str):
135
135
  if self.job:
@@ -1,6 +1,11 @@
1
1
  from typing import List, Optional, Union
2
2
 
3
- from clipped.compact.pydantic import StrictStr, validator
3
+ from clipped.compact.pydantic import (
4
+ StrictStr,
5
+ field_validator,
6
+ validation_always,
7
+ validation_before,
8
+ )
4
9
  from clipped.types.ref_or_obj import IntOrRef, RefField
5
10
 
6
11
  from polyaxon._flow.environment import V1Environment
@@ -174,28 +179,29 @@ class V1DaskReplica(BaseSchemaModel):
174
179
 
175
180
  _IDENTIFIER = "replica"
176
181
  _SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
182
+ _CUSTOM_DUMP_FIELDS = {"environment"}
177
183
 
178
- replicas: Optional[IntOrRef]
179
- environment: Optional[Union[V1Environment, RefField]]
180
- connections: Optional[Union[List[StrictStr], RefField]]
181
- volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
182
- init: Optional[Union[List[V1Init], RefField]]
183
- sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]]
184
- container: Optional[Union[k8s_schemas.V1Container, RefField]]
184
+ replicas: Optional[IntOrRef] = None
185
+ environment: Optional[Union[V1Environment, RefField]] = None
186
+ connections: Optional[Union[List[StrictStr], RefField]] = None
187
+ volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
188
+ init: Optional[Union[List[V1Init], RefField]] = None
189
+ sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]] = None
190
+ container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
185
191
 
186
- @validator("volumes", always=True, pre=True)
192
+ @field_validator("volumes", **validation_always, **validation_before)
187
193
  def validate_volumes(cls, v):
188
194
  if not v:
189
195
  return v
190
196
  return [k8s_validation.validate_k8s_volume(vi) for vi in v]
191
197
 
192
- @validator("sidecars", always=True, pre=True)
198
+ @field_validator("sidecars", **validation_always, **validation_before)
193
199
  def validate_helper_containers(cls, v):
194
200
  if not v:
195
201
  return v
196
202
  return [k8s_validation.validate_k8s_container(vi) for vi in v]
197
203
 
198
- @validator("container", always=True, pre=True)
204
+ @field_validator("container", **validation_always, **validation_before)
199
205
  def validate_container(cls, v):
200
206
  return k8s_validation.validate_k8s_container(v)
201
207
 
polyaxon/_flow/run/job.py CHANGED
@@ -1,7 +1,12 @@
1
1
  from typing import List, Optional, Union
2
2
  from typing_extensions import Literal
3
3
 
4
- from clipped.compact.pydantic import StrictStr, validator
4
+ from clipped.compact.pydantic import (
5
+ StrictStr,
6
+ field_validator,
7
+ validation_always,
8
+ validation_before,
9
+ )
5
10
  from clipped.types.ref_or_obj import RefField
6
11
 
7
12
  from polyaxon._flow.environment import V1Environment
@@ -213,28 +218,29 @@ class V1Job(BaseRun, DestinationImageMixin):
213
218
 
214
219
  _IDENTIFIER = V1RunKind.JOB
215
220
  _SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
221
+ _CUSTOM_DUMP_FIELDS = {"environment", "init"}
216
222
 
217
223
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
218
- environment: Optional[Union[V1Environment, RefField]]
219
- connections: Optional[Union[List[StrictStr], RefField]]
220
- volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
221
- init: Optional[Union[List[V1Init], RefField]]
222
- sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]]
223
- container: Optional[Union[k8s_schemas.V1Container, RefField]]
224
-
225
- @validator("volumes", always=True, pre=True)
224
+ environment: Optional[Union[V1Environment, RefField]] = None
225
+ connections: Optional[Union[List[StrictStr], RefField]] = None
226
+ volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
227
+ init: Optional[Union[List[V1Init], RefField]] = None
228
+ sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]] = None
229
+ container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
230
+
231
+ @field_validator("volumes", **validation_always, **validation_before)
226
232
  def validate_volumes(cls, v):
227
233
  if not v:
228
234
  return v
229
235
  return [k8s_validation.validate_k8s_volume(vi) for vi in v]
230
236
 
231
- @validator("sidecars", always=True, pre=True)
237
+ @field_validator("sidecars", **validation_always, **validation_before)
232
238
  def validate_helper_containers(cls, v):
233
239
  if not v:
234
240
  return v
235
241
  return [k8s_validation.validate_k8s_container(vi) for vi in v]
236
242
 
237
- @validator("container", always=True, pre=True)
243
+ @field_validator("container", **validation_always, **validation_before)
238
244
  def validate_container(cls, v):
239
245
  return k8s_validation.validate_k8s_container(v)
240
246
 
@@ -133,13 +133,18 @@ class V1MPIJob(BaseRun, DestinationImageMixin):
133
133
  """
134
134
 
135
135
  _IDENTIFIER = V1RunKind.MPIJOB
136
+ _CUSTOM_DUMP_FIELDS = {"launcher", "worker"}
136
137
 
137
138
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
138
- clean_pod_policy: Optional[V1CleanPodPolicy] = Field(alias="cleanPodPolicy")
139
- scheduling_policy: Optional[V1SchedulingPolicy] = Field(alias="schedulingPolicy")
140
- slots_per_worker: Optional[IntOrRef] = Field(alias="slotsPerWorker")
141
- launcher: Optional[Union[V1KFReplica, RefField]]
142
- worker: Optional[Union[V1KFReplica, RefField]]
139
+ clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
140
+ alias="cleanPodPolicy", default=None
141
+ )
142
+ scheduling_policy: Optional[V1SchedulingPolicy] = Field(
143
+ alias="schedulingPolicy", default=None
144
+ )
145
+ slots_per_worker: Optional[IntOrRef] = Field(alias="slotsPerWorker", default=None)
146
+ launcher: Optional[Union[V1KFReplica, RefField]] = None
147
+ worker: Optional[Union[V1KFReplica, RefField]] = None
143
148
 
144
149
  def apply_image_destination(self, image: str):
145
150
  if self.launcher:
@@ -202,17 +202,33 @@ class V1MXJob(BaseRun, DestinationImageMixin):
202
202
  """
203
203
 
204
204
  _IDENTIFIER = V1RunKind.MXJOB
205
+ _CUSTOM_DUMP_FIELDS = {
206
+ "scheduler",
207
+ "server",
208
+ "worker",
209
+ "tuner",
210
+ "tunerTracker",
211
+ "tunerServer",
212
+ }
205
213
 
206
214
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
207
- clean_pod_policy: Optional[V1CleanPodPolicy] = Field(alias="cleanPodPolicy")
208
- scheduling_policy: Optional[V1SchedulingPolicy] = Field(alias="schedulingPolicy")
209
- mode: Optional[MXJobMode]
210
- scheduler: Optional[Union[V1KFReplica, RefField]]
211
- server: Optional[Union[V1KFReplica, RefField]]
212
- worker: Optional[Union[V1KFReplica, RefField]]
213
- tuner: Optional[Union[V1KFReplica, RefField]]
214
- tuner_tracker: Optional[Union[V1KFReplica, RefField]] = Field(alias="tunerTracker")
215
- tuner_server: Optional[Union[V1KFReplica, RefField]] = Field(alias="tunerServer")
215
+ clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
216
+ alias="cleanPodPolicy", default=None
217
+ )
218
+ scheduling_policy: Optional[V1SchedulingPolicy] = Field(
219
+ alias="schedulingPolicy", default=None
220
+ )
221
+ mode: Optional[MXJobMode] = None
222
+ scheduler: Optional[Union[V1KFReplica, RefField]] = None
223
+ server: Optional[Union[V1KFReplica, RefField]] = None
224
+ worker: Optional[Union[V1KFReplica, RefField]] = None
225
+ tuner: Optional[Union[V1KFReplica, RefField]] = None
226
+ tuner_tracker: Optional[Union[V1KFReplica, RefField]] = Field(
227
+ alias="tunerTracker", default=None
228
+ )
229
+ tuner_server: Optional[Union[V1KFReplica, RefField]] = Field(
230
+ alias="tunerServer", default=None
231
+ )
216
232
 
217
233
  def apply_image_destination(self, image: str):
218
234
  if self.scheduler:
@@ -27,10 +27,10 @@ class V1PaddleElasticPolicy(BaseSchemaModel):
27
27
 
28
28
  _IDENTIFIER = "elasticPolicy"
29
29
 
30
- min_replicas: Optional[IntOrRef] = Field(alias="minReplicas")
31
- max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas")
32
- max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts")
33
- metrics: Optional[List[Dict]] = Field(alias="Metrics")
30
+ min_replicas: Optional[IntOrRef] = Field(alias="minReplicas", default=None)
31
+ max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas", default=None)
32
+ max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts", default=None)
33
+ metrics: Optional[List[Dict]] = Field(alias="Metrics", default=None)
34
34
 
35
35
 
36
36
  class V1PaddleJob(BaseRun, DestinationImageMixin):
@@ -151,13 +151,20 @@ class V1PaddleJob(BaseRun, DestinationImageMixin):
151
151
  """
152
152
 
153
153
  _IDENTIFIER = V1RunKind.PADDLEJOB
154
+ _CUSTOM_DUMP_FIELDS = {"master", "worker"}
154
155
 
155
156
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
156
- clean_pod_policy: Optional[V1CleanPodPolicy] = Field(alias="cleanPodPolicy")
157
- scheduling_policy: Optional[V1SchedulingPolicy] = Field(alias="schedulingPolicy")
158
- elastic_policy: Optional[V1PaddleElasticPolicy] = Field(alias="elasticPolicy")
159
- master: Optional[Union[V1KFReplica, RefField]]
160
- worker: Optional[Union[V1KFReplica, RefField]]
157
+ clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
158
+ alias="cleanPodPolicy", default=None
159
+ )
160
+ scheduling_policy: Optional[V1SchedulingPolicy] = Field(
161
+ alias="schedulingPolicy", default=None
162
+ )
163
+ elastic_policy: Optional[V1PaddleElasticPolicy] = Field(
164
+ alias="elasticPolicy", default=None
165
+ )
166
+ master: Optional[Union[V1KFReplica, RefField]] = None
167
+ worker: Optional[Union[V1KFReplica, RefField]] = None
161
168
 
162
169
  def apply_image_destination(self, image: str):
163
170
  if self.master:
@@ -34,17 +34,17 @@ class V1PytorchElasticPolicy(BaseSchemaModel):
34
34
 
35
35
  _IDENTIFIER = "elasticPolicy"
36
36
 
37
- min_replicas: Optional[IntOrRef] = Field(alias="minReplicas")
38
- max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas")
39
- rdvz_backend: Optional[StrictStr] = Field(alias="rdvzBackend")
40
- rdvz_port: Optional[IntOrRef] = Field(alias="rdvzPort")
41
- rdvz_host: Optional[StrictStr] = Field(alias="rdvzHost")
42
- rdvz_id: Optional[StrictStr] = Field(alias="rdvzId")
43
- rdvz_conf: Optional[List[Dict]] = Field(alias="rdvzConf")
44
- standalone: Optional[BoolOrRef]
45
- n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode")
46
- max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts")
47
- metrics: Optional[List[Dict]] = Field(alias="Metrics")
37
+ min_replicas: Optional[IntOrRef] = Field(alias="minReplicas", default=None)
38
+ max_replicas: Optional[IntOrRef] = Field(alias="maxReplicas", default=None)
39
+ rdvz_backend: Optional[StrictStr] = Field(alias="rdvzBackend", default=None)
40
+ rdvz_port: Optional[IntOrRef] = Field(alias="rdvzPort", default=None)
41
+ rdvz_host: Optional[StrictStr] = Field(alias="rdvzHost", default=None)
42
+ rdvz_id: Optional[StrictStr] = Field(alias="rdvzId", default=None)
43
+ rdvz_conf: Optional[List[Dict]] = Field(alias="rdvzConf", default=None)
44
+ standalone: Optional[BoolOrRef] = None
45
+ n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode", default=None)
46
+ max_restarts: Optional[IntOrRef] = Field(alias="maxRestarts", default=None)
47
+ metrics: Optional[List[Dict]] = Field(alias="Metrics", default=None)
48
48
 
49
49
 
50
50
  class V1PytorchJob(BaseRun, DestinationImageMixin):
@@ -163,14 +163,21 @@ class V1PytorchJob(BaseRun, DestinationImageMixin):
163
163
  """
164
164
 
165
165
  _IDENTIFIER = V1RunKind.PYTORCHJOB
166
+ _CUSTOM_DUMP_FIELDS = {"master", "worker"}
166
167
 
167
168
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
168
- clean_pod_policy: Optional[V1CleanPodPolicy] = Field(alias="cleanPodPolicy")
169
- scheduling_policy: Optional[V1SchedulingPolicy] = Field(alias="schedulingPolicy")
170
- elastic_policy: Optional[V1PytorchElasticPolicy] = Field(alias="elasticPolicy")
171
- n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode")
172
- master: Optional[Union[V1KFReplica, RefField]]
173
- worker: Optional[Union[V1KFReplica, RefField]]
169
+ clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
170
+ alias="cleanPodPolicy", default=None
171
+ )
172
+ scheduling_policy: Optional[V1SchedulingPolicy] = Field(
173
+ alias="schedulingPolicy", default=None
174
+ )
175
+ elastic_policy: Optional[V1PytorchElasticPolicy] = Field(
176
+ alias="elasticPolicy", default=None
177
+ )
178
+ n_proc_per_node: Optional[IntOrRef] = Field(alias="nProcPerNode", default=None)
179
+ master: Optional[Union[V1KFReplica, RefField]] = None
180
+ worker: Optional[Union[V1KFReplica, RefField]] = None
174
181
 
175
182
  def apply_image_destination(self, image: str):
176
183
  if self.master:
@@ -1,6 +1,11 @@
1
1
  from typing import List, Optional, Union
2
2
 
3
- from clipped.compact.pydantic import StrictStr, validator
3
+ from clipped.compact.pydantic import (
4
+ StrictStr,
5
+ field_validator,
6
+ validation_always,
7
+ validation_before,
8
+ )
4
9
  from clipped.types.ref_or_obj import IntOrRef, RefField
5
10
 
6
11
  from polyaxon._flow.environment import V1Environment
@@ -202,28 +207,29 @@ class V1KFReplica(BaseSchemaModel):
202
207
 
203
208
  _IDENTIFIER = "replica"
204
209
  _SWAGGER_FIELDS = ["volumes", "sidecars", "container"]
210
+ _CUSTOM_DUMP_FIELDS = {"environment"}
205
211
 
206
- replicas: Optional[IntOrRef]
207
- environment: Optional[Union[V1Environment, RefField]]
208
- connections: Optional[Union[List[StrictStr], RefField]]
209
- volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]]
210
- init: Optional[Union[List[V1Init], RefField]]
211
- sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]]
212
- container: Optional[Union[k8s_schemas.V1Container, RefField]]
212
+ replicas: Optional[IntOrRef] = None
213
+ environment: Optional[Union[V1Environment, RefField]] = None
214
+ connections: Optional[Union[List[StrictStr], RefField]] = None
215
+ volumes: Optional[Union[List[k8s_schemas.V1Volume], RefField]] = None
216
+ init: Optional[Union[List[V1Init], RefField]] = None
217
+ sidecars: Optional[Union[List[k8s_schemas.V1Container], RefField]] = None
218
+ container: Optional[Union[k8s_schemas.V1Container, RefField]] = None
213
219
 
214
- @validator("volumes", always=True, pre=True)
220
+ @field_validator("volumes", **validation_always, **validation_before)
215
221
  def validate_volumes(cls, v):
216
222
  if not v:
217
223
  return v
218
224
  return [k8s_validation.validate_k8s_volume(vi) for vi in v]
219
225
 
220
- @validator("sidecars", always=True, pre=True)
226
+ @field_validator("sidecars", **validation_always, **validation_before)
221
227
  def validate_helper_containers(cls, v):
222
228
  if not v:
223
229
  return v
224
230
  return [k8s_validation.validate_k8s_container(vi) for vi in v]
225
231
 
226
- @validator("container", always=True, pre=True)
232
+ @field_validator("container", **validation_always, **validation_before)
227
233
  def validate_container(cls, v):
228
234
  return k8s_validation.validate_k8s_container(v)
229
235
 
@@ -19,8 +19,10 @@ class V1SchedulingPolicy(BaseSchemaModel):
19
19
 
20
20
  _IDENTIFIER = "schedulingPolicy"
21
21
 
22
- min_available: Optional[IntOrRef] = Field(alias="minAvailable")
23
- queue: Optional[StrictStr]
24
- min_resources: Optional[IntOrRef] = Field(alias="minResources")
25
- priority_class: Optional[StrictStr] = Field(alias="priorityClass")
26
- schedule_timeout_seconds: Optional[IntOrRef] = Field(alias="scheduleTimeoutSeconds")
22
+ min_available: Optional[IntOrRef] = Field(alias="minAvailable", default=None)
23
+ queue: Optional[StrictStr] = Field(default=None)
24
+ min_resources: Optional[IntOrRef] = Field(alias="minResources", default=None)
25
+ priority_class: Optional[StrictStr] = Field(alias="priorityClass", default=None)
26
+ schedule_timeout_seconds: Optional[IntOrRef] = Field(
27
+ alias="scheduleTimeoutSeconds", default=None
28
+ )
@@ -169,16 +169,23 @@ class V1TFJob(BaseRun, DestinationImageMixin):
169
169
  """
170
170
 
171
171
  _IDENTIFIER = V1RunKind.TFJOB
172
+ _CUSTOM_DUMP_FIELDS = {"chief", "ps", "worker", "evaluator"}
172
173
 
173
174
  kind: Literal[_IDENTIFIER] = _IDENTIFIER
174
- clean_pod_policy: Optional[V1CleanPodPolicy] = Field(alias="cleanPodPolicy")
175
- scheduling_policy: Optional[V1SchedulingPolicy] = Field(alias="schedulingPolicy")
176
- enable_dynamic_worker: Optional[bool] = Field(alias="enableDynamicWorker")
177
- success_policy: Optional[str] = Field(alias="successPolicy")
178
- chief: Optional[Union[V1KFReplica, RefField]]
179
- ps: Optional[Union[V1KFReplica, RefField]]
180
- worker: Optional[Union[V1KFReplica, RefField]]
181
- evaluator: Optional[Union[V1KFReplica, RefField]]
175
+ clean_pod_policy: Optional[V1CleanPodPolicy] = Field(
176
+ alias="cleanPodPolicy", default=None
177
+ )
178
+ scheduling_policy: Optional[V1SchedulingPolicy] = Field(
179
+ alias="schedulingPolicy", default=None
180
+ )
181
+ enable_dynamic_worker: Optional[bool] = Field(
182
+ alias="enableDynamicWorker", default=None
183
+ )
184
+ success_policy: Optional[str] = Field(alias="successPolicy", default=None)
185
+ chief: Optional[Union[V1KFReplica, RefField]] = None
186
+ ps: Optional[Union[V1KFReplica, RefField]] = None
187
+ worker: Optional[Union[V1KFReplica, RefField]] = None
188
+ evaluator: Optional[Union[V1KFReplica, RefField]] = None
182
189
 
183
190
  def apply_image_destination(self, image: str):
184
191
  if self.chief: