polyaxon 2.5.3__py3-none-any.whl → 2.6.0.post1__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 (201) 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/_compiler/resolver/agent.py +10 -9
  5. polyaxon/_deploy/schemas/auth.py +3 -3
  6. polyaxon/_deploy/schemas/celery.py +10 -8
  7. polyaxon/_deploy/schemas/deployment.py +148 -115
  8. polyaxon/_deploy/schemas/email.py +8 -8
  9. polyaxon/_deploy/schemas/ingress.py +7 -7
  10. polyaxon/_deploy/schemas/intervals.py +3 -1
  11. polyaxon/_deploy/schemas/operators.py +8 -8
  12. polyaxon/_deploy/schemas/proxy.py +9 -9
  13. polyaxon/_deploy/schemas/rbac.py +1 -1
  14. polyaxon/_deploy/schemas/root_user.py +5 -5
  15. polyaxon/_deploy/schemas/security_context.py +25 -15
  16. polyaxon/_deploy/schemas/service.py +73 -69
  17. polyaxon/_deploy/schemas/ssl.py +3 -3
  18. polyaxon/_deploy/schemas/ui.py +10 -8
  19. polyaxon/_docker/builder/builder.py +4 -1
  20. polyaxon/_docker/converter/base/containers.py +4 -7
  21. polyaxon/_docker/converter/base/env_vars.py +5 -5
  22. polyaxon/_docker/converter/base/mounts.py +2 -2
  23. polyaxon/_docker/docker_types.py +57 -30
  24. polyaxon/_flow/__init__.py +3 -2
  25. polyaxon/_flow/builds/__init__.py +8 -8
  26. polyaxon/_flow/cache/__init__.py +4 -4
  27. polyaxon/_flow/component/base.py +25 -18
  28. polyaxon/_flow/component/component.py +4 -3
  29. polyaxon/_flow/early_stopping/__init__.py +1 -1
  30. polyaxon/_flow/early_stopping/policies.py +12 -10
  31. polyaxon/_flow/environment/__init__.py +42 -24
  32. polyaxon/_flow/hooks/__init__.py +11 -11
  33. polyaxon/_flow/init/__init__.py +41 -25
  34. polyaxon/_flow/io/io.py +59 -47
  35. polyaxon/_flow/joins/__init__.py +5 -5
  36. polyaxon/_flow/matrix/bayes.py +23 -17
  37. polyaxon/_flow/matrix/grid_search.py +16 -7
  38. polyaxon/_flow/matrix/hyperband.py +10 -10
  39. polyaxon/_flow/matrix/hyperopt.py +14 -9
  40. polyaxon/_flow/matrix/iterative.py +14 -8
  41. polyaxon/_flow/matrix/mapping.py +4 -4
  42. polyaxon/_flow/matrix/params.py +138 -77
  43. polyaxon/_flow/matrix/random_search.py +10 -5
  44. polyaxon/_flow/matrix/tuner.py +4 -4
  45. polyaxon/_flow/mounts/artifacts_mounts.py +1 -1
  46. polyaxon/_flow/notifications/__init__.py +1 -1
  47. polyaxon/_flow/operations/base.py +10 -8
  48. polyaxon/_flow/operations/compiled_operation.py +5 -4
  49. polyaxon/_flow/operations/operation.py +30 -22
  50. polyaxon/_flow/optimization/__init__.py +2 -2
  51. polyaxon/_flow/params/params.py +11 -10
  52. polyaxon/_flow/plugins/__init__.py +19 -13
  53. polyaxon/_flow/run/dag.py +12 -9
  54. polyaxon/_flow/run/dask/dask.py +4 -4
  55. polyaxon/_flow/run/dask/replica.py +17 -11
  56. polyaxon/_flow/run/job.py +17 -11
  57. polyaxon/_flow/run/kubeflow/mpi_job.py +10 -5
  58. polyaxon/_flow/run/kubeflow/mx_job.py +25 -9
  59. polyaxon/_flow/run/kubeflow/paddle_job.py +16 -9
  60. polyaxon/_flow/run/kubeflow/pytorch_job.py +24 -17
  61. polyaxon/_flow/run/kubeflow/replica.py +17 -11
  62. polyaxon/_flow/run/kubeflow/scheduling_policy.py +7 -5
  63. polyaxon/_flow/run/kubeflow/tf_job.py +15 -8
  64. polyaxon/_flow/run/kubeflow/xgboost_job.py +9 -4
  65. polyaxon/_flow/run/ray/ray.py +9 -6
  66. polyaxon/_flow/run/ray/replica.py +25 -16
  67. polyaxon/_flow/run/resources.py +14 -13
  68. polyaxon/_flow/run/service.py +4 -4
  69. polyaxon/_flow/schedules/cron.py +4 -4
  70. polyaxon/_flow/schedules/interval.py +4 -4
  71. polyaxon/_flow/templates/__init__.py +3 -3
  72. polyaxon/_flow/termination/__init__.py +3 -3
  73. polyaxon/_fs/watcher.py +26 -27
  74. polyaxon/_k8s/k8s_validation.py +1 -1
  75. polyaxon/_local_process/converter/base/containers.py +4 -7
  76. polyaxon/_local_process/converter/base/env_vars.py +5 -5
  77. polyaxon/_local_process/process_types.py +15 -12
  78. polyaxon/_polyaxonfile/specs/compiled_operation.py +1 -1
  79. polyaxon/_polyaxonfile/specs/libs/validator.py +1 -1
  80. polyaxon/_polyaxonfile/specs/operation.py +1 -1
  81. polyaxon/_runner/agent/sync_agent.py +1 -1
  82. polyaxon/_runner/converter/converter.py +1 -1
  83. polyaxon/_schemas/agent.py +69 -37
  84. polyaxon/_schemas/authentication.py +4 -4
  85. polyaxon/_schemas/base.py +26 -2
  86. polyaxon/_schemas/checks.py +3 -3
  87. polyaxon/_schemas/cli.py +4 -6
  88. polyaxon/_schemas/client.py +20 -18
  89. polyaxon/_schemas/compatibility.py +4 -4
  90. polyaxon/_schemas/container_resources.py +1 -1
  91. polyaxon/_schemas/home.py +3 -3
  92. polyaxon/_schemas/installation.py +8 -8
  93. polyaxon/_schemas/lifecycle.py +21 -21
  94. polyaxon/_schemas/log_handler.py +2 -2
  95. polyaxon/_schemas/services.py +26 -14
  96. polyaxon/_schemas/types/artifacts.py +3 -3
  97. polyaxon/_schemas/types/dockerfile.py +14 -12
  98. polyaxon/_schemas/types/event.py +2 -2
  99. polyaxon/_schemas/types/file.py +3 -3
  100. polyaxon/_schemas/types/git.py +12 -4
  101. polyaxon/_schemas/types/tensorboard.py +14 -8
  102. polyaxon/_schemas/user.py +3 -3
  103. polyaxon/_schemas/version.py +2 -2
  104. polyaxon/_sdk/api/agents_v1_api.py +45 -45
  105. polyaxon/_sdk/api/artifacts_stores_v1_api.py +3 -3
  106. polyaxon/_sdk/api/auth_v1_api.py +13 -13
  107. polyaxon/_sdk/api/connections_v1_api.py +15 -15
  108. polyaxon/_sdk/api/dashboards_v1_api.py +15 -15
  109. polyaxon/_sdk/api/organizations_v1_api.py +77 -77
  110. polyaxon/_sdk/api/presets_v1_api.py +15 -15
  111. polyaxon/_sdk/api/project_dashboards_v1_api.py +17 -17
  112. polyaxon/_sdk/api/project_searches_v1_api.py +17 -17
  113. polyaxon/_sdk/api/projects_v1_api.py +65 -65
  114. polyaxon/_sdk/api/queues_v1_api.py +19 -19
  115. polyaxon/_sdk/api/runs_v1_api.py +127 -127
  116. polyaxon/_sdk/api/searches_v1_api.py +15 -15
  117. polyaxon/_sdk/api/service_accounts_v1_api.py +27 -27
  118. polyaxon/_sdk/api/tags_v1_api.py +17 -17
  119. polyaxon/_sdk/api/teams_v1_api.py +51 -51
  120. polyaxon/_sdk/api/users_v1_api.py +25 -25
  121. polyaxon/_sdk/api/versions_v1_api.py +7 -7
  122. polyaxon/_sdk/schemas/v1_activity.py +8 -8
  123. polyaxon/_sdk/schemas/v1_agent.py +17 -17
  124. polyaxon/_sdk/schemas/v1_agent_state_response.py +4 -4
  125. polyaxon/_sdk/schemas/v1_agent_state_response_agent_state.py +10 -10
  126. polyaxon/_sdk/schemas/v1_agent_status_body_request.py +3 -3
  127. polyaxon/_sdk/schemas/v1_analytics_spec.py +4 -4
  128. polyaxon/_sdk/schemas/v1_artifact_tree.py +3 -3
  129. polyaxon/_sdk/schemas/v1_auth.py +1 -1
  130. polyaxon/_sdk/schemas/v1_cloning.py +3 -3
  131. polyaxon/_sdk/schemas/v1_connection_response.py +9 -9
  132. polyaxon/_sdk/schemas/v1_dashboard.py +9 -9
  133. polyaxon/_sdk/schemas/v1_dashboard_spec.py +5 -5
  134. polyaxon/_sdk/schemas/v1_entities_tags.py +2 -2
  135. polyaxon/_sdk/schemas/v1_entities_transfer.py +2 -2
  136. polyaxon/_sdk/schemas/v1_entity_notification_body.py +7 -7
  137. polyaxon/_sdk/schemas/v1_entity_stage_body_request.py +5 -5
  138. polyaxon/_sdk/schemas/v1_entity_status_body_request.py +5 -5
  139. polyaxon/_sdk/schemas/v1_events_response.py +2 -2
  140. polyaxon/_sdk/schemas/v1_list_activities_response.py +4 -4
  141. polyaxon/_sdk/schemas/v1_list_agents_response.py +4 -4
  142. polyaxon/_sdk/schemas/v1_list_bookmarks_response.py +4 -4
  143. polyaxon/_sdk/schemas/v1_list_connections_response.py +4 -4
  144. polyaxon/_sdk/schemas/v1_list_dashboards_response.py +4 -4
  145. polyaxon/_sdk/schemas/v1_list_organization_members_response.py +4 -4
  146. polyaxon/_sdk/schemas/v1_list_organizations_response.py +4 -4
  147. polyaxon/_sdk/schemas/v1_list_presets_response.py +4 -4
  148. polyaxon/_sdk/schemas/v1_list_project_versions_response.py +4 -4
  149. polyaxon/_sdk/schemas/v1_list_projects_response.py +4 -4
  150. polyaxon/_sdk/schemas/v1_list_queues_response.py +4 -4
  151. polyaxon/_sdk/schemas/v1_list_run_artifacts_response.py +4 -4
  152. polyaxon/_sdk/schemas/v1_list_run_connections_response.py +4 -4
  153. polyaxon/_sdk/schemas/v1_list_run_edges_response.py +4 -4
  154. polyaxon/_sdk/schemas/v1_list_runs_response.py +4 -4
  155. polyaxon/_sdk/schemas/v1_list_searches_response.py +4 -4
  156. polyaxon/_sdk/schemas/v1_list_service_accounts_response.py +4 -4
  157. polyaxon/_sdk/schemas/v1_list_tags_response.py +4 -4
  158. polyaxon/_sdk/schemas/v1_list_team_members_response.py +4 -4
  159. polyaxon/_sdk/schemas/v1_list_teams_response.py +4 -4
  160. polyaxon/_sdk/schemas/v1_list_token_response.py +4 -4
  161. polyaxon/_sdk/schemas/v1_operation_body.py +8 -8
  162. polyaxon/_sdk/schemas/v1_organization.py +16 -16
  163. polyaxon/_sdk/schemas/v1_organization_member.py +6 -6
  164. polyaxon/_sdk/schemas/v1_password_change.py +3 -3
  165. polyaxon/_sdk/schemas/v1_pipeline.py +3 -3
  166. polyaxon/_sdk/schemas/v1_preset.py +11 -11
  167. polyaxon/_sdk/schemas/v1_project.py +17 -17
  168. polyaxon/_sdk/schemas/v1_project_settings.py +11 -11
  169. polyaxon/_sdk/schemas/v1_project_version.py +20 -20
  170. polyaxon/_sdk/schemas/v1_queue.py +12 -12
  171. polyaxon/_sdk/schemas/v1_run.py +38 -38
  172. polyaxon/_sdk/schemas/v1_run_connection.py +3 -3
  173. polyaxon/_sdk/schemas/v1_run_edge.py +5 -5
  174. polyaxon/_sdk/schemas/v1_run_edge_lineage.py +3 -3
  175. polyaxon/_sdk/schemas/v1_run_edges_graph.py +1 -1
  176. polyaxon/_sdk/schemas/v1_run_reference_catalog.py +4 -4
  177. polyaxon/_sdk/schemas/v1_run_settings.py +9 -9
  178. polyaxon/_sdk/schemas/v1_search.py +10 -10
  179. polyaxon/_sdk/schemas/v1_search_spec.py +14 -14
  180. polyaxon/_sdk/schemas/v1_section_spec.py +12 -12
  181. polyaxon/_sdk/schemas/v1_service_account.py +9 -9
  182. polyaxon/_sdk/schemas/v1_settings_catalog.py +4 -4
  183. polyaxon/_sdk/schemas/v1_tag.py +6 -6
  184. polyaxon/_sdk/schemas/v1_team.py +11 -11
  185. polyaxon/_sdk/schemas/v1_team_member.py +6 -6
  186. polyaxon/_sdk/schemas/v1_team_settings.py +2 -2
  187. polyaxon/_sdk/schemas/v1_token.py +10 -10
  188. polyaxon/_sdk/schemas/v1_trial_start.py +6 -6
  189. polyaxon/_sdk/schemas/v1_user.py +6 -6
  190. polyaxon/_sdk/schemas/v1_user_access.py +7 -7
  191. polyaxon/_sdk/schemas/v1_user_email.py +1 -1
  192. polyaxon/_sdk/schemas/v1_user_singup.py +5 -5
  193. polyaxon/_sdk/schemas/v1_uuids.py +1 -1
  194. polyaxon/_utils/test_utils.py +2 -1
  195. polyaxon/pkg.py +1 -1
  196. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/METADATA +10 -10
  197. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/RECORD +201 -201
  198. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/LICENSE +0 -0
  199. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/WHEEL +0 -0
  200. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/entry_points.txt +0 -0
  201. {polyaxon-2.5.3.dist-info → polyaxon-2.6.0.post1.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,13 @@ import os
2
2
 
3
3
  from typing import Dict, List, Optional
4
4
 
5
- from clipped.compact.pydantic import Extra, Field, StrictStr, root_validator, validator
5
+ from clipped.compact.pydantic import (
6
+ Field,
7
+ StrictStr,
8
+ field_validator,
9
+ model_validator,
10
+ validation_before,
11
+ )
6
12
  from clipped.config.schema import skip_partial, to_partial
7
13
  from vents.connections import ConnectionCatalog
8
14
 
@@ -70,16 +76,18 @@ def validate_agent_config(
70
76
  class BaseAgentConfig(ConnectionCatalog, BaseSchemaModel):
71
77
  _REQUIRED_ARTIFACTS_STORE = True
72
78
 
73
- connections: Optional[List[V1Connection]] = Field(alias=ENV_KEYS_AGENT_CONNECTIONS)
79
+ connections: Optional[List[V1Connection]] = Field(
80
+ default=None, alias=ENV_KEYS_AGENT_CONNECTIONS
81
+ )
74
82
  artifacts_store: Optional[V1Connection] = Field(
75
- alias=ENV_KEYS_AGENT_ARTIFACTS_STORE
83
+ default=None, alias=ENV_KEYS_AGENT_ARTIFACTS_STORE
76
84
  )
77
- namespace: Optional[StrictStr] = Field(alias=ENV_KEYS_K8S_NAMESPACE)
85
+ namespace: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_K8S_NAMESPACE)
78
86
 
79
87
  class Config:
80
- extra = Extra.ignore
88
+ extra = "ignore"
81
89
 
82
- @root_validator(pre=True)
90
+ @model_validator(**validation_before)
83
91
  def handle_camel_case_artifacts_store(cls, values):
84
92
  if (
85
93
  not values.get("artifacts_store")
@@ -89,7 +97,7 @@ class BaseAgentConfig(ConnectionCatalog, BaseSchemaModel):
89
97
  values[ENV_KEYS_AGENT_ARTIFACTS_STORE] = values["artifactsStore"]
90
98
  return values
91
99
 
92
- @validator("connections", pre=True)
100
+ @field_validator("connections", **validation_before)
93
101
  def validate_json_list(cls, v):
94
102
  if not isinstance(v, str):
95
103
  return v
@@ -103,7 +111,7 @@ class BaseAgentConfig(ConnectionCatalog, BaseSchemaModel):
103
111
  except PolyaxonSchemaError as e:
104
112
  raise ValueError("Received an invalid connections") from e
105
113
 
106
- @validator("artifacts_store", pre=True)
114
+ @field_validator("artifacts_store", **validation_before)
107
115
  def validate_store_json(cls, v):
108
116
  if not isinstance(v, str):
109
117
  return v
@@ -118,9 +126,10 @@ class BaseAgentConfig(ConnectionCatalog, BaseSchemaModel):
118
126
  "Received an invalid artifacts store `{}`".format(v)
119
127
  ) from e
120
128
 
121
- @validator("artifacts_store")
129
+ @field_validator("artifacts_store")
122
130
  @skip_partial
123
131
  def validate_agent_config(cls, artifacts_store, values):
132
+ values = cls.get_data_from_values(values)
124
133
  try:
125
134
  validate_agent_config(
126
135
  artifacts_store,
@@ -186,38 +195,59 @@ class BaseAgentConfig(ConnectionCatalog, BaseSchemaModel):
186
195
 
187
196
  class AgentConfig(BaseAgentConfig):
188
197
  _IDENTIFIER = "agent"
198
+ _CUSTOM_DUMP_FIELDS = {
199
+ "sidecar",
200
+ "init",
201
+ "notifier",
202
+ "cleaner",
203
+ "default_scheduling",
204
+ }
189
205
 
190
- is_replica: Optional[bool] = Field(alias=ENV_KEYS_AGENT_IS_REPLICA)
191
- watch_cluster: Optional[bool] = Field(alias=ENV_KEYS_WATCH_CLUSTER)
192
- single_namespace: Optional[bool] = Field(alias=ENV_KEYS_SINGLE_NAMESPACE)
206
+ is_replica: Optional[bool] = Field(default=None, alias=ENV_KEYS_AGENT_IS_REPLICA)
207
+ watch_cluster: Optional[bool] = Field(default=None, alias=ENV_KEYS_WATCH_CLUSTER)
208
+ single_namespace: Optional[bool] = Field(
209
+ default=None, alias=ENV_KEYS_SINGLE_NAMESPACE
210
+ )
193
211
  additional_namespaces: Optional[List[StrictStr]] = Field(
194
- alias=ENV_KEYS_ADDITIONAL_NAMESPACES
212
+ default=None, alias=ENV_KEYS_ADDITIONAL_NAMESPACES
213
+ )
214
+ sidecar: Optional[V1PolyaxonSidecarContainer] = Field(
215
+ default=None, alias=ENV_KEYS_AGENT_SIDECAR
216
+ )
217
+ init: Optional[V1PolyaxonInitContainer] = Field(
218
+ default=None, alias=ENV_KEYS_AGENT_INIT
219
+ )
220
+ notifier: Optional[V1PolyaxonNotifier] = Field(
221
+ default=None, alias=ENV_KEYS_AGENT_NOTIFIER
222
+ )
223
+ cleaner: Optional[V1PolyaxonCleaner] = Field(
224
+ default=None, alias=ENV_KEYS_AGENT_CLEANER
195
225
  )
196
- sidecar: Optional[V1PolyaxonSidecarContainer] = Field(alias=ENV_KEYS_AGENT_SIDECAR)
197
- init: Optional[V1PolyaxonInitContainer] = Field(alias=ENV_KEYS_AGENT_INIT)
198
- notifier: Optional[V1PolyaxonNotifier] = Field(alias=ENV_KEYS_AGENT_NOTIFIER)
199
- cleaner: Optional[V1PolyaxonCleaner] = Field(alias=ENV_KEYS_AGENT_CLEANER)
200
226
  use_proxy_env_vars_use_in_ops: Optional[bool] = Field(
201
- alias=ENV_KEYS_AGENT_USE_PROXY_ENV_VARS_IN_OPS
227
+ default=None, alias=ENV_KEYS_AGENT_USE_PROXY_ENV_VARS_IN_OPS
202
228
  )
203
229
  default_scheduling: Optional[V1DefaultScheduling] = Field(
204
- alias=ENV_KEYS_AGENT_DEFAULT_SCHEDULING
230
+ default=None, alias=ENV_KEYS_AGENT_DEFAULT_SCHEDULING
205
231
  )
206
232
  default_image_pull_secrets: Optional[List[StrictStr]] = Field(
207
- alias=ENV_KEYS_AGENT_DEFAULT_IMAGE_PULL_SECRETS
233
+ default=None, alias=ENV_KEYS_AGENT_DEFAULT_IMAGE_PULL_SECRETS
234
+ )
235
+ app_secret_name: Optional[StrictStr] = Field(
236
+ default=None, alias=ENV_KEYS_K8S_APP_SECRET_NAME
208
237
  )
209
- app_secret_name: Optional[StrictStr] = Field(alias=ENV_KEYS_K8S_APP_SECRET_NAME)
210
- agent_secret_name: Optional[StrictStr] = Field(alias=ENV_KEYS_AGENT_SECRET_NAME)
211
- runs_sa: Optional[StrictStr] = Field(alias=ENV_KEYS_AGENT_RUNS_SA)
238
+ agent_secret_name: Optional[StrictStr] = Field(
239
+ default=None, alias=ENV_KEYS_AGENT_SECRET_NAME
240
+ )
241
+ runs_sa: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_AGENT_RUNS_SA)
212
242
  enable_health_checks: Optional[bool] = Field(
213
- alias=ENV_KEYS_AGENT_ENABLE_HEALTH_CHECKS
243
+ default=None, alias=ENV_KEYS_AGENT_ENABLE_HEALTH_CHECKS
214
244
  )
215
245
  # This refresh logic will mitigate several issues with AKS's numerous networking problems
216
246
  executor_refresh_interval: Optional[int] = Field(
217
- alias=ENV_KEYS_AGENT_EXECUTOR_REFRESH_INTERVAL
247
+ default=None, alias=ENV_KEYS_AGENT_EXECUTOR_REFRESH_INTERVAL
218
248
  )
219
249
 
220
- @root_validator(pre=True)
250
+ @model_validator(**validation_before)
221
251
  def handle_camel_case_agent(cls, values):
222
252
  if (
223
253
  not values.get("is_replica")
@@ -307,6 +337,8 @@ class AgentConfig(BaseAgentConfig):
307
337
  ):
308
338
  if not default_scheduling and default_image_pull_secrets:
309
339
  default_scheduling = V1DefaultScheduling()
340
+ if default_scheduling and isinstance(default_scheduling, dict):
341
+ default_scheduling = V1DefaultScheduling.from_dict(default_scheduling)
310
342
  if default_scheduling and not default_scheduling.image_pull_secrets:
311
343
  default_scheduling.image_pull_secrets = default_image_pull_secrets
312
344
  super().__init__(
@@ -315,42 +347,42 @@ class AgentConfig(BaseAgentConfig):
315
347
  **data,
316
348
  )
317
349
 
318
- @validator(
350
+ @field_validator(
319
351
  "artifacts_store",
320
352
  "sidecar",
321
353
  "init",
322
354
  "cleaner",
323
355
  "notifier",
324
356
  "default_scheduling",
325
- pre=True,
357
+ **validation_before,
326
358
  )
327
359
  def validate_json(cls, v, field):
328
360
  if not isinstance(v, str):
329
361
  return v
362
+ key = cls.get_alias_for_field(field)
330
363
  try:
331
364
  return ConfigParser.parse(Dict)(
332
- key=field.name,
365
+ key=key,
333
366
  value=v,
334
367
  is_optional=True,
335
368
  )
336
369
  except PolyaxonSchemaError as e:
337
- raise ValueError(
338
- "Received an invalid {} `{}`".format(field.alias, v)
339
- ) from e
370
+ raise ValueError("Received an invalid {} `{}`".format(key, v)) from e
340
371
 
341
- @validator("additional_namespaces", "default_image_pull_secrets", pre=True)
372
+ @field_validator(
373
+ "additional_namespaces", "default_image_pull_secrets", **validation_before
374
+ )
342
375
  def validate_str_list(cls, v, field):
376
+ key = cls.get_alias_for_field(field)
343
377
  try:
344
378
  return ConfigParser.parse(str)(
345
- key=field.alias,
379
+ key=key,
346
380
  value=v,
347
381
  is_optional=True,
348
382
  is_list=True,
349
383
  )
350
384
  except PolyaxonSchemaError as e:
351
- raise ValueError(
352
- "Received an invalid {} `{}`".format(field.alias, v)
353
- ) from e
385
+ raise ValueError("Received an invalid {} `{}`".format(key, v)) from e
354
386
 
355
387
  def get_executor_refresh_interval(self) -> int:
356
388
  return self.executor_refresh_interval or 60 * 5
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from clipped.compact.pydantic import Extra, Field, StrictStr
3
+ from clipped.compact.pydantic import Field, StrictStr
4
4
 
5
5
  from polyaxon._env_vars.keys import ENV_KEYS_AUTH_TOKEN, ENV_KEYS_AUTH_USERNAME
6
6
  from polyaxon._schemas.base import BaseSchemaModel
@@ -18,11 +18,11 @@ class AccessTokenConfig(BaseSchemaModel):
18
18
 
19
19
  _IDENTIFIER = "token"
20
20
 
21
- username: Optional[StrictStr] = Field(alias=ENV_KEYS_AUTH_USERNAME)
22
- token: Optional[StrictStr] = Field(alias=ENV_KEYS_AUTH_TOKEN)
21
+ username: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_AUTH_USERNAME)
22
+ token: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_AUTH_TOKEN)
23
23
 
24
24
  class Config:
25
- extra = Extra.ignore
25
+ extra = "ignore"
26
26
 
27
27
 
28
28
  class V1Credentials(BaseSchemaModel):
polyaxon/_schemas/base.py CHANGED
@@ -1,4 +1,6 @@
1
+ from clipped.compact.pydantic import PYDANTIC_VERSION
1
2
  from clipped.config.schema import BaseSchemaModel as _BaseSchemaModel
3
+ from clipped.config.schema import RootModel as _RootModel
2
4
 
3
5
  from polyaxon import pkg
4
6
  from polyaxon._config.spec import ConfigSpec
@@ -11,5 +13,27 @@ class BaseSchemaModel(_BaseSchemaModel):
11
13
  _CONFIG_SPEC = ConfigSpec
12
14
 
13
15
 
14
- NAME_REGEX = r"^[-a-zA-Z0-9_]+\Z"
15
- FULLY_QUALIFIED_NAME_REGEX = r"^[-a-zA-Z0-9_]+(:[-a-zA-Z0-9_.]+)?\Z"
16
+ class RootModel(_RootModel):
17
+ _VERSION = pkg.SCHEMA_VERSION
18
+ _SCHEMA_EXCEPTION = PolyaxonSchemaError
19
+ _CONFIG_SPEC = ConfigSpec
20
+
21
+ @property
22
+ def _root(self):
23
+ return self.__root__ if hasattr(self, "__root__") else self.root
24
+
25
+ def set_root(self, value):
26
+ if hasattr(self, "__root__"):
27
+ self.__root__ = value
28
+ else:
29
+ self.root = value
30
+ return self
31
+
32
+ def get_root(self):
33
+ return self._root
34
+
35
+ @classmethod
36
+ def make(cls, value):
37
+ if PYDANTIC_VERSION.startswith("2."):
38
+ return cls(root=value)
39
+ return cls(__root__=value)
@@ -1,7 +1,7 @@
1
1
  import os
2
2
 
3
3
  from datetime import datetime, timedelta
4
- from typing import Optional
4
+ from typing import ClassVar, Optional
5
5
 
6
6
  from clipped.utils.tz import now
7
7
 
@@ -11,9 +11,9 @@ from polyaxon._schemas.base import BaseSchemaModel
11
11
 
12
12
  class ChecksConfig(BaseSchemaModel):
13
13
  _IDENTIFIER = "checks"
14
- _INTERVAL = 30 * 60
14
+ _INTERVAL: ClassVar[int] = 30 * 60
15
15
 
16
- last_check: Optional[datetime]
16
+ last_check: Optional[datetime] = None
17
17
 
18
18
  def __init__(
19
19
  self,
polyaxon/_schemas/cli.py CHANGED
@@ -11,13 +11,11 @@ from polyaxon._schemas.log_handler import V1LogHandler
11
11
 
12
12
  class CliConfig(ChecksConfig):
13
13
  _IDENTIFIER = "cli"
14
- _DIST = "dist"
15
- _INTERVAL = 30 * 60
16
14
 
17
- current_version: Optional[StrictStr]
18
- installation: Optional[V1Installation]
19
- compatibility: Optional[V1Compatibility]
20
- log_handler: Optional[V1LogHandler]
15
+ current_version: Optional[StrictStr] = None
16
+ installation: Optional[V1Installation] = None
17
+ compatibility: Optional[V1Compatibility] = None
18
+ log_handler: Optional[V1LogHandler] = None
21
19
 
22
20
  @property
23
21
  def min_version(self) -> Optional[str]:
@@ -4,7 +4,7 @@ from typing import Dict, Optional, Union
4
4
 
5
5
  import urllib3
6
6
 
7
- from clipped.compact.pydantic import Extra, Field, StrictStr
7
+ from clipped.compact.pydantic import Field, StrictStr
8
8
  from clipped.utils.http import clean_host
9
9
 
10
10
  from polyaxon._contexts import paths as ctx_paths
@@ -55,10 +55,10 @@ class ClientConfig(BaseSchemaModel):
55
55
  _PAGE_SIZE = 20
56
56
  _BASE_URL = "{}/api/{}"
57
57
 
58
- host: Optional[StrictStr] = Field(alias=ENV_KEYS_HOST)
58
+ host: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_HOST)
59
59
  version: Optional[StrictStr] = Field(default="v1", alias=ENV_KEYS_API_VERSION)
60
60
  debug: Optional[bool] = Field(default=False, alias=ENV_KEYS_DEBUG)
61
- log_level: Optional[StrictStr] = Field(alias=ENV_KEYS_LOG_LEVEL)
61
+ log_level: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_LOG_LEVEL)
62
62
  authentication_type: Optional[StrictStr] = Field(
63
63
  default=AuthenticationTypes.TOKEN, alias=ENV_KEYS_AUTHENTICATION_TYPE
64
64
  )
@@ -70,40 +70,42 @@ class ClientConfig(BaseSchemaModel):
70
70
  tracking_timeout: Optional[float] = Field(
71
71
  default=1, alias=ENV_KEYS_TRACKING_TIMEOUT
72
72
  )
73
- timezone: Optional[StrictStr] = Field(alias=ENV_KEYS_TIME_ZONE)
73
+ timezone: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_TIME_ZONE)
74
74
  watch_interval: Optional[int] = Field(default=5, alias=ENV_KEYS_WATCH_INTERVAL)
75
75
  interval: Optional[float] = Field(default=5, alias=ENV_KEYS_INTERVAL)
76
- verify_ssl: Optional[bool] = Field(alias=ENV_KEYS_VERIFY_SSL)
77
- ssl_ca_cert: Optional[StrictStr] = Field(alias=ENV_KEYS_SSL_CA_CERT)
78
- cert_file: Optional[StrictStr] = Field(alias=ENV_KEYS_CERT_FILE)
79
- key_file: Optional[StrictStr] = Field(alias=ENV_KEYS_KEY_FILE)
80
- assert_hostname: Optional[bool] = Field(alias=ENV_KEYS_ASSERT_HOSTNAME)
76
+ verify_ssl: Optional[bool] = Field(default=None, alias=ENV_KEYS_VERIFY_SSL)
77
+ ssl_ca_cert: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_SSL_CA_CERT)
78
+ cert_file: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_CERT_FILE)
79
+ key_file: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_KEY_FILE)
80
+ assert_hostname: Optional[bool] = Field(
81
+ default=None, alias=ENV_KEYS_ASSERT_HOSTNAME
82
+ )
81
83
  connection_pool_maxsize: Optional[int] = Field(
82
- alias=ENV_KEYS_CONNECTION_POOL_MAXSIZE
84
+ default=None, alias=ENV_KEYS_CONNECTION_POOL_MAXSIZE
83
85
  )
84
86
  archives_root: Optional[StrictStr] = Field(
85
87
  default=ctx_paths.CONTEXT_ARCHIVES_ROOT, alias=ENV_KEYS_ARCHIVES_ROOT
86
88
  )
87
89
  header: Optional[Union[StrictStr, PolyaxonServiceHeaders]] = Field(
88
- alias=ENV_KEYS_HEADER
90
+ default=None, alias=ENV_KEYS_HEADER
89
91
  )
90
92
  header_service: Optional[Union[StrictStr, PolyaxonServices]] = Field(
91
- alias=ENV_KEYS_HEADER_SERVICE
93
+ default=None, alias=ENV_KEYS_HEADER_SERVICE
92
94
  )
93
- namespace: Optional[StrictStr] = Field(alias=ENV_KEYS_K8S_NAMESPACE)
95
+ namespace: Optional[StrictStr] = Field(default=None, alias=ENV_KEYS_K8S_NAMESPACE)
94
96
  no_api: Optional[bool] = Field(default=False, alias=ENV_KEYS_NO_API)
95
97
  disable_errors_reporting: Optional[bool] = Field(
96
98
  default=False, alias=ENV_KEYS_DISABLE_ERRORS_REPORTING
97
99
  )
98
100
  compatibility_check_interval: Optional[int] = Field(
99
- alias=ENV_KEYS_INTERVALS_COMPATIBILITY_CHECK
101
+ default=None, alias=ENV_KEYS_INTERVALS_COMPATIBILITY_CHECK
100
102
  )
101
- retries: Optional[int] = Field(alias=ENV_KEYS_RETRIES)
102
- token: Optional[StrictStr]
103
- client_header: Optional[Dict]
103
+ retries: Optional[int] = Field(default=None, alias=ENV_KEYS_RETRIES)
104
+ token: Optional[StrictStr] = None
105
+ client_header: Optional[Dict] = None
104
106
 
105
107
  class Config:
106
- extra = Extra.ignore
108
+ extra = "ignore"
107
109
 
108
110
  def __init__(
109
111
  self,
@@ -5,7 +5,7 @@ from polyaxon._schemas.version import V1Version
5
5
 
6
6
 
7
7
  class V1Compatibility(BaseSchemaModel):
8
- cli: Optional[V1Version]
9
- platform: Optional[V1Version]
10
- agent: Optional[V1Version]
11
- ui: Optional[V1Version]
8
+ cli: Optional[V1Version] = None
9
+ platform: Optional[V1Version] = None
10
+ agent: Optional[V1Version] = None
11
+ ui: Optional[V1Version] = None
@@ -25,7 +25,7 @@ class ContainerGPUResourcesConfig(BaseSchemaModel):
25
25
  memory_used: StrictIntOrFloat
26
26
  memory_total: StrictIntOrFloat
27
27
  memory_utilization: StrictIntOrFloat
28
- processes: Optional[List[Dict]]
28
+ processes: Optional[List[Dict]] = None
29
29
 
30
30
 
31
31
  class ContainerResourcesConfig(BaseSchemaModel):
polyaxon/_schemas/home.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from clipped.compact.pydantic import Extra, Field, StrictStr
3
+ from clipped.compact.pydantic import Field, StrictStr
4
4
 
5
5
  from polyaxon._env_vars.keys import ENV_KEYS_HOME
6
6
  from polyaxon._schemas.base import BaseSchemaModel
@@ -17,7 +17,7 @@ class HomeConfig(BaseSchemaModel):
17
17
 
18
18
  _IDENTIFIER = "home"
19
19
 
20
- path: Optional[StrictStr] = Field(alias=ENV_KEYS_HOME)
20
+ path: Optional[StrictStr] = Field(alias=ENV_KEYS_HOME, default=None)
21
21
 
22
22
  class Config:
23
- extra = Extra.ignore
23
+ extra = "ignore"
@@ -5,15 +5,15 @@ from clipped.config.schema import BaseAllowSchemaModel
5
5
 
6
6
 
7
7
  class V1Installation(BaseAllowSchemaModel):
8
- key: Optional[StrictStr]
9
- version: Optional[StrictStr]
10
- dist: Optional[StrictStr]
11
- host: Optional[StrictStr]
12
- hmac: Optional[StrictStr]
13
- mode: Optional[StrictStr]
14
- org: Optional[bool]
8
+ key: Optional[StrictStr] = None
9
+ version: Optional[StrictStr] = None
10
+ dist: Optional[StrictStr] = None
11
+ host: Optional[StrictStr] = None
12
+ hmac: Optional[StrictStr] = None
13
+ mode: Optional[StrictStr] = None
14
+ org: Optional[bool] = None
15
+ auth: Optional[List[StrictStr]] = None
15
16
  single_url: Optional[bool] = Field(alias="singleUrl", default=None)
16
17
  default_streams_url: Optional[StrictStr] = Field(
17
18
  alias="defaultStreamsUrl", default=None
18
19
  )
19
- auth: Optional[List[StrictStr]]
@@ -332,36 +332,36 @@ class BaseCondition(BaseAllowSchemaModel):
332
332
 
333
333
 
334
334
  class V1StatusCondition(BaseCondition):
335
- type: Optional[V1Statuses]
336
- status: Optional[Union[bool, str]]
337
- reason: Optional[StrictStr]
338
- message: Optional[StrictStr]
339
- last_update_time: Optional[datetime.datetime]
340
- last_transition_time: Optional[datetime.datetime]
341
- meta_info: Optional[Dict[str, Any]]
335
+ type: Optional[V1Statuses] = None
336
+ status: Optional[Union[bool, str]] = None
337
+ reason: Optional[StrictStr] = None
338
+ message: Optional[StrictStr] = None
339
+ last_update_time: Optional[datetime.datetime] = None
340
+ last_transition_time: Optional[datetime.datetime] = None
341
+ meta_info: Optional[Dict[str, Any]] = None
342
342
 
343
343
 
344
344
  class V1Status(BaseSchemaModel):
345
- uuid: Optional[StrictStr]
346
- status: Optional[V1Statuses]
347
- status_conditions: Optional[List[V1StatusCondition]]
348
- meta_info: Optional[Dict[str, Any]]
345
+ uuid: Optional[StrictStr] = None
346
+ status: Optional[V1Statuses] = None
347
+ status_conditions: Optional[List[V1StatusCondition]] = None
348
+ meta_info: Optional[Dict[str, Any]] = None
349
349
 
350
350
 
351
351
  class V1StageCondition(BaseCondition):
352
- type: Optional[V1Stages]
353
- status: Optional[Union[bool, str]]
354
- reason: Optional[StrictStr]
355
- message: Optional[StrictStr]
356
- last_update_time: Optional[datetime.datetime]
357
- last_transition_time: Optional[datetime.datetime]
358
- meta_info: Optional[Dict[str, Any]]
352
+ type: Optional[V1Stages] = None
353
+ status: Optional[Union[bool, str]] = None
354
+ reason: Optional[StrictStr] = None
355
+ message: Optional[StrictStr] = None
356
+ last_update_time: Optional[datetime.datetime] = None
357
+ last_transition_time: Optional[datetime.datetime] = None
358
+ meta_info: Optional[Dict[str, Any]] = None
359
359
 
360
360
 
361
361
  class V1Stage(BaseSchemaModel):
362
- uuid: Optional[StrictStr]
363
- stage: Optional[V1Stages]
364
- stage_conditions: Optional[List[V1StageCondition]]
362
+ uuid: Optional[StrictStr] = None
363
+ stage: Optional[V1Stages] = None
364
+ stage_conditions: Optional[List[V1StageCondition]] = None
365
365
 
366
366
 
367
367
  class V1ProjectVersionKind(str, PEnum):
@@ -9,8 +9,8 @@ from clipped.config.schema import BaseAllowSchemaModel
9
9
  class V1LogHandler(BaseAllowSchemaModel):
10
10
  _IDENTIFIER = "log_handler"
11
11
 
12
- dsn: Optional[StrictStr]
13
- environment: Optional[StrictStr]
12
+ dsn: Optional[StrictStr] = None
13
+ environment: Optional[StrictStr] = None
14
14
 
15
15
  @property
16
16
  def decoded_dsn(self):
@@ -1,6 +1,12 @@
1
1
  from typing import Dict, List, Optional, Union
2
2
 
3
- from clipped.compact.pydantic import Field, StrictStr, validator
3
+ from clipped.compact.pydantic import (
4
+ Field,
5
+ StrictStr,
6
+ field_validator,
7
+ validation_always,
8
+ validation_before,
9
+ )
4
10
 
5
11
  from polyaxon._containers.pull_policy import PullPolicy
6
12
  from polyaxon._k8s import k8s_schemas, k8s_validation
@@ -14,25 +20,31 @@ class BaseServiceConfig(BaseSchemaModel):
14
20
  "tolerations",
15
21
  }
16
22
 
17
- image: Optional[StrictStr]
18
- image_tag: Optional[StrictStr] = Field(alias="imageTag")
19
- image_pull_policy: Optional[PullPolicy] = Field(alias="imagePullPolicy")
20
- resources: Optional[Union[k8s_schemas.V1ResourceRequirements, Dict]]
21
- node_selector: Optional[Dict[StrictStr, StrictStr]] = Field(alias="nodeSelector")
22
- affinity: Optional[Union[k8s_schemas.V1Affinity, Dict]]
23
- tolerations: Optional[List[Union[k8s_schemas.V1Toleration, Dict]]]
24
- image_pull_secrets: Optional[List[StrictStr]] = Field(alias="imagePullSecrets")
25
- hpa: Optional[Dict]
26
-
27
- @validator("resources", always=True, pre=True)
23
+ image: Optional[StrictStr] = None
24
+ image_tag: Optional[StrictStr] = Field(default=None, alias="imageTag")
25
+ image_pull_policy: Optional[PullPolicy] = Field(
26
+ default=None, alias="imagePullPolicy"
27
+ )
28
+ resources: Optional[Union[k8s_schemas.V1ResourceRequirements, Dict]] = None
29
+ node_selector: Optional[Dict[StrictStr, StrictStr]] = Field(
30
+ default=None, alias="nodeSelector"
31
+ )
32
+ affinity: Optional[Union[k8s_schemas.V1Affinity, Dict]] = None
33
+ tolerations: Optional[List[Union[k8s_schemas.V1Toleration, Dict]]] = None
34
+ image_pull_secrets: Optional[List[StrictStr]] = Field(
35
+ default=None, alias="imagePullSecrets"
36
+ )
37
+ hpa: Optional[Dict] = None
38
+
39
+ @field_validator("resources", **validation_always, **validation_before)
28
40
  def validate_resources(cls, v):
29
41
  return k8s_validation.validate_k8s_resource_requirements(v)
30
42
 
31
- @validator("affinity", always=True, pre=True)
43
+ @field_validator("affinity", **validation_always, **validation_before)
32
44
  def validate_affinity(cls, v):
33
45
  return k8s_validation.validate_k8s_affinity(v)
34
46
 
35
- @validator("tolerations", always=True, pre=True)
47
+ @field_validator("tolerations", **validation_always, **validation_before)
36
48
  def validate_tolerations(cls, v):
37
49
  if not v:
38
50
  return v
@@ -154,6 +154,6 @@ class V1ArtifactsType(BaseTypeConfig):
154
154
 
155
155
  _IDENTIFIER = "artifacts"
156
156
 
157
- files: Optional[Union[List[Union[str, List[str]]], RefField]]
158
- dirs: Optional[Union[List[Union[str, List[str]]], RefField]]
159
- workers: Optional[Union[StrictInt, RefField]]
157
+ files: Optional[Union[List[Union[str, List[str]]], RefField]] = None
158
+ dirs: Optional[Union[List[Union[str, List[str]]], RefField]] = None
159
+ workers: Optional[Union[StrictInt, RefField]] = None
@@ -1,6 +1,6 @@
1
1
  from typing import Any, Dict, List, Optional, Tuple, Union
2
2
 
3
- from clipped.compact.pydantic import Field, StrictStr, validator
3
+ from clipped.compact.pydantic import Field, StrictStr, field_validator
4
4
  from clipped.config.schema import skip_partial
5
5
  from clipped.types.docker_image import validate_image
6
6
  from clipped.types.ref_or_obj import RefField
@@ -179,31 +179,33 @@ class V1DockerfileType(BaseTypeConfig):
179
179
  _IDENTIFIER = "dockerfile"
180
180
 
181
181
  image: StrictStr
182
- env: Optional[Union[Dict[StrictStr, Any], RefField]]
183
- path: Optional[Union[List[StrictStr], RefField]]
182
+ env: Optional[
183
+ Union[Dict[str, Any], List[Union[Tuple[str, str], List[str]]], RefField]
184
+ ] = None
185
+ path: Optional[Union[List[StrictStr], RefField]] = None
184
186
  copy_: Optional[
185
187
  Union[
186
188
  List[Union[StrictStr, List[StrictStr], Tuple[StrictStr, StrictStr]]],
187
189
  RefField,
188
190
  ]
189
- ] = Field(alias="copy")
191
+ ] = Field(alias="copy", default=None)
190
192
  post_run_copy: Optional[
191
193
  Union[
192
194
  List[Union[StrictStr, List[StrictStr], Tuple[StrictStr, StrictStr]]],
193
195
  RefField,
194
196
  ]
195
- ] = Field(alias="postRunCopy")
196
- run: Optional[Union[List[StrictStr], RefField]]
197
- lang_env: Optional[StrictStr] = Field(alias="langEnv")
198
- uid: Optional[Union[int, RefField]]
199
- gid: Optional[Union[int, RefField]]
200
- username: Optional[StrictStr]
197
+ ] = Field(alias="postRunCopy", default=None)
198
+ run: Optional[Union[List[StrictStr], RefField]] = None
199
+ lang_env: Optional[StrictStr] = Field(alias="langEnv", default=None)
200
+ uid: Optional[Union[int, RefField]] = None
201
+ gid: Optional[Union[int, RefField]] = None
202
+ username: Optional[StrictStr] = None
201
203
  filename: Optional[StrictStr] = Field(default=POLYAXON_DOCKERFILE_NAME)
202
204
  workdir: Optional[StrictStr] = Field(default=POLYAXON_DOCKER_WORKDIR)
203
- workdir_path: Optional[StrictStr] = Field(alias="workdirPath")
205
+ workdir_path: Optional[StrictStr] = Field(alias="workdirPath", default=None)
204
206
  shell: Optional[StrictStr] = Field(default=POLYAXON_DOCKER_SHELL)
205
207
 
206
- @validator("image")
208
+ @field_validator("image")
207
209
  @skip_partial
208
210
  def check_image(cls, image):
209
211
  validate_image(image)
@@ -8,5 +8,5 @@ from polyaxon._schemas.types.base import BaseTypeConfig
8
8
  class V1EventType(BaseTypeConfig):
9
9
  _IDENTIFIER = "event"
10
10
 
11
- name: Optional[StrictStr]
12
- kind: Optional[StrictStr]
11
+ name: Optional[StrictStr] = None
12
+ kind: Optional[StrictStr] = None