zenml-nightly 0.75.0.dev20250312__py3-none-any.whl → 0.75.0.dev20250314__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 (191) hide show
  1. zenml/VERSION +1 -1
  2. zenml/__init__.py +2 -0
  3. zenml/analytics/context.py +7 -0
  4. zenml/analytics/enums.py +2 -2
  5. zenml/artifacts/utils.py +2 -4
  6. zenml/cli/__init__.py +8 -9
  7. zenml/cli/base.py +2 -2
  8. zenml/cli/code_repository.py +1 -1
  9. zenml/cli/login.py +6 -0
  10. zenml/cli/model.py +7 -15
  11. zenml/cli/pipeline.py +3 -3
  12. zenml/cli/project.py +172 -0
  13. zenml/cli/secret.py +47 -44
  14. zenml/cli/service_accounts.py +0 -1
  15. zenml/cli/service_connectors.py +15 -17
  16. zenml/cli/stack.py +0 -3
  17. zenml/cli/stack_components.py +2 -2
  18. zenml/cli/tag.py +3 -5
  19. zenml/cli/utils.py +25 -23
  20. zenml/client.py +749 -475
  21. zenml/config/global_config.py +48 -37
  22. zenml/config/pipeline_configurations.py +3 -2
  23. zenml/config/pipeline_run_configuration.py +2 -1
  24. zenml/config/secret_reference_mixin.py +1 -1
  25. zenml/constants.py +6 -6
  26. zenml/enums.py +0 -7
  27. zenml/event_hub/event_hub.py +3 -1
  28. zenml/exceptions.py +0 -24
  29. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +5 -3
  30. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -4
  31. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
  32. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -4
  33. zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
  34. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
  35. zenml/integrations/wandb/__init__.py +1 -1
  36. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
  37. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +5 -3
  38. zenml/model/model.py +10 -10
  39. zenml/model_registries/base_model_registry.py +1 -1
  40. zenml/models/__init__.py +45 -28
  41. zenml/models/v2/base/base.py +0 -5
  42. zenml/models/v2/base/filter.py +2 -2
  43. zenml/models/v2/base/scoped.py +135 -156
  44. zenml/models/v2/core/action.py +12 -12
  45. zenml/models/v2/core/api_key.py +1 -1
  46. zenml/models/v2/core/artifact.py +31 -18
  47. zenml/models/v2/core/artifact_version.py +57 -40
  48. zenml/models/v2/core/code_repository.py +12 -12
  49. zenml/models/v2/core/component.py +22 -33
  50. zenml/models/v2/core/device.py +3 -2
  51. zenml/models/v2/core/event_source.py +14 -14
  52. zenml/models/v2/core/flavor.py +19 -47
  53. zenml/models/v2/core/logs.py +1 -2
  54. zenml/models/v2/core/model.py +23 -20
  55. zenml/models/v2/core/model_version.py +51 -42
  56. zenml/models/v2/core/pipeline.py +16 -16
  57. zenml/models/v2/core/pipeline_build.py +14 -14
  58. zenml/models/v2/core/pipeline_deployment.py +12 -14
  59. zenml/models/v2/core/pipeline_run.py +21 -29
  60. zenml/models/v2/core/project.py +203 -0
  61. zenml/models/v2/core/run_metadata.py +2 -2
  62. zenml/models/v2/core/run_template.py +16 -17
  63. zenml/models/v2/core/schedule.py +12 -21
  64. zenml/models/v2/core/secret.py +94 -128
  65. zenml/models/v2/core/server_settings.py +2 -2
  66. zenml/models/v2/core/service.py +57 -26
  67. zenml/models/v2/core/service_connector.py +14 -16
  68. zenml/models/v2/core/stack.py +24 -26
  69. zenml/models/v2/core/step_run.py +16 -28
  70. zenml/models/v2/core/tag.py +41 -15
  71. zenml/models/v2/core/trigger.py +13 -13
  72. zenml/models/v2/core/trigger_execution.py +2 -2
  73. zenml/models/v2/core/user.py +2 -2
  74. zenml/models/v2/misc/statistics.py +45 -0
  75. zenml/models/v2/misc/tag.py +27 -0
  76. zenml/orchestrators/cache_utils.py +7 -7
  77. zenml/orchestrators/input_utils.py +1 -0
  78. zenml/orchestrators/step_launcher.py +1 -2
  79. zenml/orchestrators/step_run_utils.py +2 -4
  80. zenml/orchestrators/step_runner.py +10 -1
  81. zenml/orchestrators/utils.py +4 -4
  82. zenml/pipelines/build_utils.py +2 -4
  83. zenml/pipelines/pipeline_decorator.py +3 -2
  84. zenml/pipelines/pipeline_definition.py +8 -9
  85. zenml/pipelines/run_utils.py +4 -4
  86. zenml/service_connectors/service_connector.py +0 -10
  87. zenml/service_connectors/service_connector_utils.py +0 -2
  88. zenml/stack/authentication_mixin.py +1 -1
  89. zenml/stack/flavor.py +3 -14
  90. zenml/stack/stack.py +0 -1
  91. zenml/stack/stack_component.py +1 -5
  92. zenml/steps/base_step.py +10 -2
  93. zenml/steps/step_context.py +19 -0
  94. zenml/utils/string_utils.py +1 -1
  95. zenml/utils/tag_utils.py +642 -0
  96. zenml/zen_server/cloud_utils.py +21 -0
  97. zenml/zen_server/exceptions.py +0 -6
  98. zenml/zen_server/rbac/endpoint_utils.py +134 -46
  99. zenml/zen_server/rbac/models.py +65 -3
  100. zenml/zen_server/rbac/rbac_interface.py +9 -0
  101. zenml/zen_server/rbac/rbac_sql_zen_store.py +15 -7
  102. zenml/zen_server/rbac/utils.py +155 -30
  103. zenml/zen_server/rbac/zenml_cloud_rbac.py +39 -11
  104. zenml/zen_server/routers/actions_endpoints.py +3 -5
  105. zenml/zen_server/routers/artifact_endpoint.py +0 -5
  106. zenml/zen_server/routers/artifact_version_endpoints.py +15 -9
  107. zenml/zen_server/routers/auth_endpoints.py +22 -7
  108. zenml/zen_server/routers/code_repositories_endpoints.py +54 -3
  109. zenml/zen_server/routers/devices_endpoints.py +0 -4
  110. zenml/zen_server/routers/event_source_endpoints.py +0 -5
  111. zenml/zen_server/routers/flavors_endpoints.py +0 -5
  112. zenml/zen_server/routers/logs_endpoints.py +0 -1
  113. zenml/zen_server/routers/model_versions_endpoints.py +100 -23
  114. zenml/zen_server/routers/models_endpoints.py +50 -69
  115. zenml/zen_server/routers/pipeline_builds_endpoints.py +55 -3
  116. zenml/zen_server/routers/pipeline_deployments_endpoints.py +56 -4
  117. zenml/zen_server/routers/pipelines_endpoints.py +70 -3
  118. zenml/zen_server/routers/plugin_endpoints.py +0 -1
  119. zenml/zen_server/routers/projects_endpoints.py +283 -0
  120. zenml/zen_server/routers/run_metadata_endpoints.py +97 -0
  121. zenml/zen_server/routers/run_templates_endpoints.py +64 -3
  122. zenml/zen_server/routers/runs_endpoints.py +58 -8
  123. zenml/zen_server/routers/schedule_endpoints.py +67 -6
  124. zenml/zen_server/routers/secrets_endpoints.py +38 -4
  125. zenml/zen_server/routers/server_endpoints.py +53 -1
  126. zenml/zen_server/routers/service_accounts_endpoints.py +14 -15
  127. zenml/zen_server/routers/service_connectors_endpoints.py +94 -14
  128. zenml/zen_server/routers/service_endpoints.py +18 -7
  129. zenml/zen_server/routers/stack_components_endpoints.py +66 -7
  130. zenml/zen_server/routers/stacks_endpoints.py +95 -6
  131. zenml/zen_server/routers/steps_endpoints.py +17 -11
  132. zenml/zen_server/routers/tag_resource_endpoints.py +115 -0
  133. zenml/zen_server/routers/tags_endpoints.py +6 -17
  134. zenml/zen_server/routers/triggers_endpoints.py +5 -8
  135. zenml/zen_server/routers/users_endpoints.py +9 -12
  136. zenml/zen_server/template_execution/utils.py +8 -7
  137. zenml/zen_server/utils.py +21 -0
  138. zenml/zen_server/zen_server_api.py +7 -2
  139. zenml/zen_stores/base_zen_store.py +50 -69
  140. zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
  141. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +20 -10
  142. zenml/zen_stores/migrations/versions/1f9d1cd00b90_add_unique_name_constraints.py +231 -0
  143. zenml/zen_stores/migrations/versions/288f4fb6e112_make_tags_user_scoped.py +74 -0
  144. zenml/zen_stores/migrations/versions/2e695a26fe7a_add_user_default_workspace.py +45 -0
  145. zenml/zen_stores/migrations/versions/3b1776345020_remove_workspace_from_globals.py +81 -0
  146. zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +136 -0
  147. zenml/zen_stores/migrations/versions/9e7bf0970266_adding_exclusive_attribute_to_tags.py +47 -0
  148. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +8 -4
  149. zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
  150. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +12 -6
  151. zenml/zen_stores/migrations/versions/f1d723fd723b_add_secret_private_attr.py +61 -0
  152. zenml/zen_stores/migrations/versions/f76a368a25a5_add_stack_description.py +35 -0
  153. zenml/zen_stores/rest_zen_store.py +223 -230
  154. zenml/zen_stores/schemas/__init__.py +2 -2
  155. zenml/zen_stores/schemas/action_schemas.py +15 -8
  156. zenml/zen_stores/schemas/api_key_schemas.py +8 -1
  157. zenml/zen_stores/schemas/artifact_schemas.py +35 -10
  158. zenml/zen_stores/schemas/code_repository_schemas.py +22 -17
  159. zenml/zen_stores/schemas/component_schemas.py +9 -14
  160. zenml/zen_stores/schemas/event_source_schemas.py +15 -8
  161. zenml/zen_stores/schemas/flavor_schemas.py +14 -20
  162. zenml/zen_stores/schemas/model_schemas.py +18 -17
  163. zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
  164. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +10 -8
  165. zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -12
  166. zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
  167. zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +53 -65
  168. zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
  169. zenml/zen_stores/schemas/run_template_schemas.py +17 -13
  170. zenml/zen_stores/schemas/schedule_schema.py +16 -21
  171. zenml/zen_stores/schemas/secret_schemas.py +15 -25
  172. zenml/zen_stores/schemas/service_connector_schemas.py +8 -17
  173. zenml/zen_stores/schemas/service_schemas.py +7 -8
  174. zenml/zen_stores/schemas/stack_schemas.py +12 -15
  175. zenml/zen_stores/schemas/step_run_schemas.py +14 -15
  176. zenml/zen_stores/schemas/tag_schemas.py +30 -2
  177. zenml/zen_stores/schemas/trigger_schemas.py +15 -8
  178. zenml/zen_stores/schemas/user_schemas.py +12 -2
  179. zenml/zen_stores/schemas/utils.py +16 -0
  180. zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
  181. zenml/zen_stores/sql_zen_store.py +2984 -2369
  182. zenml/zen_stores/template_utils.py +1 -1
  183. zenml/zen_stores/zen_store_interface.py +136 -126
  184. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
  185. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +188 -173
  186. zenml/cli/workspace.py +0 -86
  187. zenml/models/v2/core/workspace.py +0 -131
  188. zenml/zen_server/routers/workspaces_endpoints.py +0 -1469
  189. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/LICENSE +0 -0
  190. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
  191. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/entry_points.txt +0 -0
@@ -13,39 +13,35 @@
13
13
  # permissions and limitations under the License.
14
14
  """Endpoint definitions for models."""
15
15
 
16
- from typing import Union
16
+ from typing import Optional, Union
17
17
  from uuid import UUID
18
18
 
19
19
  from fastapi import APIRouter, Depends, Security
20
20
 
21
21
  from zenml.constants import (
22
22
  API,
23
- MODEL_VERSIONS,
24
23
  MODELS,
25
24
  VERSION_1,
26
25
  )
27
26
  from zenml.models import (
28
27
  ModelFilter,
28
+ ModelRequest,
29
29
  ModelResponse,
30
30
  ModelUpdate,
31
- ModelVersionFilter,
32
- ModelVersionResponse,
33
31
  Page,
34
32
  )
35
33
  from zenml.zen_server.auth import AuthContext, authorize
36
34
  from zenml.zen_server.exceptions import error_response
37
35
  from zenml.zen_server.feature_gate.endpoint_utils import report_decrement
38
36
  from zenml.zen_server.rbac.endpoint_utils import (
37
+ verify_permissions_and_create_entity,
39
38
  verify_permissions_and_delete_entity,
40
39
  verify_permissions_and_get_entity,
41
40
  verify_permissions_and_list_entities,
42
41
  verify_permissions_and_update_entity,
43
42
  )
44
43
  from zenml.zen_server.rbac.models import ResourceType
45
- from zenml.zen_server.rbac.utils import (
46
- dehydrate_page,
47
- get_allowed_resource_ids,
48
- )
44
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
49
45
  from zenml.zen_server.utils import (
50
46
  handle_exceptions,
51
47
  make_dependable,
@@ -64,9 +60,45 @@ router = APIRouter(
64
60
  )
65
61
 
66
62
 
63
+ @router.post(
64
+ "",
65
+ responses={401: error_response, 409: error_response, 422: error_response},
66
+ )
67
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
68
+ # and can be removed after the migration
69
+ @workspace_router.post(
70
+ "/{project_name_or_id}" + MODELS,
71
+ responses={401: error_response, 409: error_response, 422: error_response},
72
+ deprecated=True,
73
+ tags=["models"],
74
+ )
75
+ @handle_exceptions
76
+ def create_model(
77
+ model: ModelRequest,
78
+ project_name_or_id: Optional[Union[str, UUID]] = None,
79
+ _: AuthContext = Security(authorize),
80
+ ) -> ModelResponse:
81
+ """Creates a model.
82
+
83
+ Args:
84
+ model: Model to create.
85
+ project_name_or_id: Optional name or ID of the project.
86
+
87
+ Returns:
88
+ The created model.
89
+ """
90
+ if project_name_or_id:
91
+ project = zen_store().get_project(project_name_or_id)
92
+ model.project = project.id
93
+
94
+ return verify_permissions_and_create_entity(
95
+ request_model=model,
96
+ create_method=zen_store().create_model,
97
+ )
98
+
99
+
67
100
  @router.get(
68
101
  "",
69
- response_model=Page[ModelResponse],
70
102
  responses={401: error_response, 404: error_response, 422: error_response},
71
103
  )
72
104
  @handle_exceptions
@@ -95,20 +127,19 @@ def list_models(
95
127
 
96
128
 
97
129
  @router.get(
98
- "/{model_name_or_id}",
99
- response_model=ModelResponse,
130
+ "/{model_id}",
100
131
  responses={401: error_response, 404: error_response, 422: error_response},
101
132
  )
102
133
  @handle_exceptions
103
134
  def get_model(
104
- model_name_or_id: Union[str, UUID],
135
+ model_id: UUID,
105
136
  hydrate: bool = True,
106
137
  _: AuthContext = Security(authorize),
107
138
  ) -> ModelResponse:
108
139
  """Get a model by name or ID.
109
140
 
110
141
  Args:
111
- model_name_or_id: The name or ID of the model to get.
142
+ model_id: The ID of the model to get.
112
143
  hydrate: Flag deciding whether to hydrate the output model(s)
113
144
  by including metadata fields in the response.
114
145
 
@@ -116,13 +147,12 @@ def get_model(
116
147
  The model with the given name or ID.
117
148
  """
118
149
  return verify_permissions_and_get_entity(
119
- id=model_name_or_id, get_method=zen_store().get_model, hydrate=hydrate
150
+ id=model_id, get_method=zen_store().get_model, hydrate=hydrate
120
151
  )
121
152
 
122
153
 
123
154
  @router.put(
124
155
  "/{model_id}",
125
- response_model=ModelResponse,
126
156
  responses={401: error_response, 404: error_response, 422: error_response},
127
157
  )
128
158
  @handle_exceptions
@@ -149,21 +179,21 @@ def update_model(
149
179
 
150
180
 
151
181
  @router.delete(
152
- "/{model_name_or_id}",
182
+ "/{model_id}",
153
183
  responses={401: error_response, 404: error_response, 422: error_response},
154
184
  )
155
185
  @handle_exceptions
156
186
  def delete_model(
157
- model_name_or_id: Union[str, UUID],
187
+ model_id: UUID,
158
188
  _: AuthContext = Security(authorize),
159
189
  ) -> None:
160
- """Delete a model by name or ID.
190
+ """Delete a model by ID.
161
191
 
162
192
  Args:
163
- model_name_or_id: The name or ID of the model to delete.
193
+ model_id: The ID of the model to delete.
164
194
  """
165
195
  model = verify_permissions_and_delete_entity(
166
- id=model_name_or_id,
196
+ id=model_id,
167
197
  get_method=zen_store().get_model,
168
198
  delete_method=zen_store().delete_model,
169
199
  )
@@ -171,52 +201,3 @@ def delete_model(
171
201
  if server_config().feature_gate_enabled:
172
202
  if ResourceType.MODEL in server_config().reportable_resources:
173
203
  report_decrement(ResourceType.MODEL, resource_id=model.id)
174
-
175
-
176
- #################
177
- # Model Versions
178
- #################
179
-
180
-
181
- @router.get(
182
- "/{model_name_or_id}" + MODEL_VERSIONS,
183
- response_model=Page[ModelVersionResponse],
184
- responses={401: error_response, 404: error_response, 422: error_response},
185
- )
186
- @handle_exceptions
187
- def list_model_versions(
188
- model_name_or_id: Union[str, UUID],
189
- model_version_filter_model: ModelVersionFilter = Depends(
190
- make_dependable(ModelVersionFilter)
191
- ),
192
- hydrate: bool = False,
193
- auth_context: AuthContext = Security(authorize),
194
- ) -> Page[ModelVersionResponse]:
195
- """Get model versions according to query filters.
196
-
197
- This endpoint serves the purpose of allowing scoped filtering by model_id.
198
-
199
- Args:
200
- model_name_or_id: The name or ID of the model to list in.
201
- model_version_filter_model: Filter model used for pagination, sorting,
202
- filtering.
203
- hydrate: Flag deciding whether to hydrate the output model(s)
204
- by including metadata fields in the response.
205
- auth_context: The authentication context.
206
-
207
- Returns:
208
- The model versions according to query filters.
209
- """
210
- allowed_model_ids = get_allowed_resource_ids(
211
- resource_type=ResourceType.MODEL
212
- )
213
- model_version_filter_model.configure_rbac(
214
- authenticated_user_id=auth_context.user.id, model_id=allowed_model_ids
215
- )
216
-
217
- model_versions = zen_store().list_model_versions(
218
- model_name_or_id=model_name_or_id,
219
- model_version_filter_model=model_version_filter_model,
220
- hydrate=hydrate,
221
- )
222
- return dehydrate_page(model_versions)
@@ -13,6 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Endpoint definitions for builds."""
15
15
 
16
+ from typing import Optional, Union
16
17
  from uuid import UUID
17
18
 
18
19
  from fastapi import APIRouter, Depends, Security
@@ -21,16 +22,19 @@ from zenml.constants import API, PIPELINE_BUILDS, VERSION_1
21
22
  from zenml.models import (
22
23
  Page,
23
24
  PipelineBuildFilter,
25
+ PipelineBuildRequest,
24
26
  PipelineBuildResponse,
25
27
  )
26
28
  from zenml.zen_server.auth import AuthContext, authorize
27
29
  from zenml.zen_server.exceptions import error_response
28
30
  from zenml.zen_server.rbac.endpoint_utils import (
31
+ verify_permissions_and_create_entity,
29
32
  verify_permissions_and_delete_entity,
30
33
  verify_permissions_and_get_entity,
31
34
  verify_permissions_and_list_entities,
32
35
  )
33
36
  from zenml.zen_server.rbac.models import ResourceType
37
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
34
38
  from zenml.zen_server.utils import (
35
39
  handle_exceptions,
36
40
  make_dependable,
@@ -44,16 +48,61 @@ router = APIRouter(
44
48
  )
45
49
 
46
50
 
51
+ @router.post(
52
+ "",
53
+ responses={401: error_response, 409: error_response, 422: error_response},
54
+ )
55
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
56
+ # and can be removed after the migration
57
+ @workspace_router.post(
58
+ "/{project_name_or_id}" + PIPELINE_BUILDS,
59
+ responses={401: error_response, 409: error_response, 422: error_response},
60
+ deprecated=True,
61
+ tags=["builds"],
62
+ )
63
+ @handle_exceptions
64
+ def create_build(
65
+ build: PipelineBuildRequest,
66
+ project_name_or_id: Optional[Union[str, UUID]] = None,
67
+ _: AuthContext = Security(authorize),
68
+ ) -> PipelineBuildResponse:
69
+ """Creates a build, optionally in a specific project.
70
+
71
+ Args:
72
+ build: Build to create.
73
+ project_name_or_id: Optional name or ID of the project.
74
+
75
+ Returns:
76
+ The created build.
77
+ """
78
+ if project_name_or_id:
79
+ project = zen_store().get_project(project_name_or_id)
80
+ build.project = project.id
81
+
82
+ return verify_permissions_and_create_entity(
83
+ request_model=build,
84
+ create_method=zen_store().create_build,
85
+ )
86
+
87
+
47
88
  @router.get(
48
89
  "",
49
- response_model=Page[PipelineBuildResponse],
50
90
  responses={401: error_response, 404: error_response, 422: error_response},
51
91
  )
92
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
93
+ # and can be removed after the migration
94
+ @workspace_router.get(
95
+ "/{project_name_or_id}" + PIPELINE_BUILDS,
96
+ responses={401: error_response, 404: error_response, 422: error_response},
97
+ deprecated=True,
98
+ tags=["builds"],
99
+ )
52
100
  @handle_exceptions
53
101
  def list_builds(
54
102
  build_filter_model: PipelineBuildFilter = Depends(
55
103
  make_dependable(PipelineBuildFilter)
56
104
  ),
105
+ project_name_or_id: Optional[Union[str, UUID]] = None,
57
106
  hydrate: bool = False,
58
107
  _: AuthContext = Security(authorize),
59
108
  ) -> Page[PipelineBuildResponse]:
@@ -62,12 +111,16 @@ def list_builds(
62
111
  Args:
63
112
  build_filter_model: Filter model used for pagination, sorting,
64
113
  filtering.
114
+ project_name_or_id: Optional name or ID of the project to filter by.
65
115
  hydrate: Flag deciding whether to hydrate the output model(s)
66
116
  by including metadata fields in the response.
67
117
 
68
118
  Returns:
69
- List of build objects.
119
+ List of build objects matching the filter criteria.
70
120
  """
121
+ if project_name_or_id:
122
+ build_filter_model.project = project_name_or_id
123
+
71
124
  return verify_permissions_and_list_entities(
72
125
  filter_model=build_filter_model,
73
126
  resource_type=ResourceType.PIPELINE_BUILD,
@@ -78,7 +131,6 @@ def list_builds(
78
131
 
79
132
  @router.get(
80
133
  "/{build_id}",
81
- response_model=PipelineBuildResponse,
82
134
  responses={401: error_response, 404: error_response, 422: error_response},
83
135
  )
84
136
  @handle_exceptions
@@ -13,6 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Endpoint definitions for deployments."""
15
15
 
16
+ from typing import Optional, Union
16
17
  from uuid import UUID
17
18
 
18
19
  from fastapi import APIRouter, Depends, Security
@@ -21,16 +22,19 @@ from zenml.constants import API, PIPELINE_DEPLOYMENTS, VERSION_1
21
22
  from zenml.models import (
22
23
  Page,
23
24
  PipelineDeploymentFilter,
25
+ PipelineDeploymentRequest,
24
26
  PipelineDeploymentResponse,
25
27
  )
26
28
  from zenml.zen_server.auth import AuthContext, authorize
27
29
  from zenml.zen_server.exceptions import error_response
28
30
  from zenml.zen_server.rbac.endpoint_utils import (
31
+ verify_permissions_and_create_entity,
29
32
  verify_permissions_and_delete_entity,
30
33
  verify_permissions_and_get_entity,
31
34
  verify_permissions_and_list_entities,
32
35
  )
33
36
  from zenml.zen_server.rbac.models import ResourceType
37
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
34
38
  from zenml.zen_server.utils import (
35
39
  handle_exceptions,
36
40
  make_dependable,
@@ -46,30 +50,79 @@ router = APIRouter(
46
50
  )
47
51
 
48
52
 
53
+ @router.post(
54
+ "",
55
+ responses={401: error_response, 409: error_response, 422: error_response},
56
+ )
57
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
58
+ # and can be removed after the migration
59
+ @workspace_router.post(
60
+ "/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
61
+ responses={401: error_response, 409: error_response, 422: error_response},
62
+ deprecated=True,
63
+ tags=["deployments"],
64
+ )
65
+ @handle_exceptions
66
+ def create_deployment(
67
+ deployment: PipelineDeploymentRequest,
68
+ project_name_or_id: Optional[Union[str, UUID]] = None,
69
+ _: AuthContext = Security(authorize),
70
+ ) -> PipelineDeploymentResponse:
71
+ """Creates a deployment.
72
+
73
+ Args:
74
+ deployment: Deployment to create.
75
+ project_name_or_id: Optional name or ID of the project.
76
+
77
+ Returns:
78
+ The created deployment.
79
+ """
80
+ if project_name_or_id:
81
+ project = zen_store().get_project(project_name_or_id)
82
+ deployment.project = project.id
83
+
84
+ return verify_permissions_and_create_entity(
85
+ request_model=deployment,
86
+ create_method=zen_store().create_deployment,
87
+ )
88
+
89
+
49
90
  @router.get(
50
91
  "",
51
- response_model=Page[PipelineDeploymentResponse],
52
92
  responses={401: error_response, 404: error_response, 422: error_response},
53
93
  )
94
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
95
+ # and can be removed after the migration
96
+ @workspace_router.get(
97
+ "/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
98
+ responses={401: error_response, 404: error_response, 422: error_response},
99
+ deprecated=True,
100
+ tags=["deployments"],
101
+ )
54
102
  @handle_exceptions
55
103
  def list_deployments(
56
104
  deployment_filter_model: PipelineDeploymentFilter = Depends(
57
105
  make_dependable(PipelineDeploymentFilter)
58
106
  ),
107
+ project_name_or_id: Optional[Union[str, UUID]] = None,
59
108
  hydrate: bool = False,
60
109
  _: AuthContext = Security(authorize),
61
110
  ) -> Page[PipelineDeploymentResponse]:
62
- """Gets a list of deployment.
111
+ """Gets a list of deployments.
63
112
 
64
113
  Args:
65
114
  deployment_filter_model: Filter model used for pagination, sorting,
66
115
  filtering.
116
+ project_name_or_id: Optional name or ID of the project to filter by.
67
117
  hydrate: Flag deciding whether to hydrate the output model(s)
68
118
  by including metadata fields in the response.
69
119
 
70
120
  Returns:
71
- List of deployment objects.
121
+ List of deployment objects matching the filter criteria.
72
122
  """
123
+ if project_name_or_id:
124
+ deployment_filter_model.project = project_name_or_id
125
+
73
126
  return verify_permissions_and_list_entities(
74
127
  filter_model=deployment_filter_model,
75
128
  resource_type=ResourceType.PIPELINE_DEPLOYMENT,
@@ -80,7 +133,6 @@ def list_deployments(
80
133
 
81
134
  @router.get(
82
135
  "/{deployment_id}",
83
- response_model=PipelineDeploymentResponse,
84
136
  responses={401: error_response, 404: error_response, 422: error_response},
85
137
  )
86
138
  @handle_exceptions
@@ -13,6 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Endpoint definitions for pipelines."""
15
15
 
16
+ from typing import Optional, Union
16
17
  from uuid import UUID
17
18
 
18
19
  from fastapi import APIRouter, Depends, Security
@@ -26,6 +27,7 @@ from zenml.constants import (
26
27
  from zenml.models import (
27
28
  Page,
28
29
  PipelineFilter,
30
+ PipelineRequest,
29
31
  PipelineResponse,
30
32
  PipelineRunFilter,
31
33
  PipelineRunResponse,
@@ -33,14 +35,18 @@ from zenml.models import (
33
35
  )
34
36
  from zenml.zen_server.auth import AuthContext, authorize
35
37
  from zenml.zen_server.exceptions import error_response
36
- from zenml.zen_server.feature_gate.endpoint_utils import report_decrement
38
+ from zenml.zen_server.feature_gate.endpoint_utils import (
39
+ report_decrement,
40
+ )
37
41
  from zenml.zen_server.rbac.endpoint_utils import (
42
+ verify_permissions_and_create_entity,
38
43
  verify_permissions_and_delete_entity,
39
44
  verify_permissions_and_get_entity,
40
45
  verify_permissions_and_list_entities,
41
46
  verify_permissions_and_update_entity,
42
47
  )
43
48
  from zenml.zen_server.rbac.models import ResourceType
49
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
44
50
  from zenml.zen_server.utils import (
45
51
  handle_exceptions,
46
52
  make_dependable,
@@ -55,15 +61,70 @@ router = APIRouter(
55
61
  )
56
62
 
57
63
 
64
+ @router.post(
65
+ "",
66
+ responses={401: error_response, 409: error_response, 422: error_response},
67
+ )
68
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
69
+ # and can be removed after the migration
70
+ @workspace_router.post(
71
+ "/{project_name_or_id}" + PIPELINES,
72
+ responses={401: error_response, 409: error_response, 422: error_response},
73
+ deprecated=True,
74
+ tags=["pipelines"],
75
+ )
76
+ @handle_exceptions
77
+ def create_pipeline(
78
+ pipeline: PipelineRequest,
79
+ project_name_or_id: Optional[Union[str, UUID]] = None,
80
+ _: AuthContext = Security(authorize),
81
+ ) -> PipelineResponse:
82
+ """Creates a pipeline.
83
+
84
+ Args:
85
+ pipeline: Pipeline to create.
86
+ project_name_or_id: Optional name or ID of the project.
87
+
88
+ Returns:
89
+ The created pipeline.
90
+ """
91
+ if project_name_or_id:
92
+ project = zen_store().get_project(project_name_or_id)
93
+ pipeline.project = project.id
94
+
95
+ # We limit pipeline namespaces, not pipeline versions
96
+ skip_entitlements = (
97
+ zen_store().count_pipelines(
98
+ PipelineFilter(name=pipeline.name, project=pipeline.project)
99
+ )
100
+ > 0
101
+ )
102
+
103
+ return verify_permissions_and_create_entity(
104
+ request_model=pipeline,
105
+ create_method=zen_store().create_pipeline,
106
+ skip_entitlements=skip_entitlements,
107
+ )
108
+
109
+
58
110
  @router.get(
59
111
  "",
60
112
  responses={401: error_response, 404: error_response, 422: error_response},
61
113
  )
114
+ # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
115
+ # and can be removed after the migration
116
+ @workspace_router.get(
117
+ "/{project_name_or_id}" + PIPELINES,
118
+ responses={401: error_response, 404: error_response, 422: error_response},
119
+ deprecated=True,
120
+ tags=["pipelines"],
121
+ )
62
122
  @handle_exceptions
63
123
  def list_pipelines(
64
124
  pipeline_filter_model: PipelineFilter = Depends(
65
125
  make_dependable(PipelineFilter)
66
126
  ),
127
+ project_name_or_id: Optional[Union[str, UUID]] = None,
67
128
  hydrate: bool = False,
68
129
  _: AuthContext = Security(authorize),
69
130
  ) -> Page[PipelineResponse]:
@@ -72,12 +133,16 @@ def list_pipelines(
72
133
  Args:
73
134
  pipeline_filter_model: Filter model used for pagination, sorting,
74
135
  filtering.
136
+ project_name_or_id: Optional name or ID of the project to filter by.
75
137
  hydrate: Flag deciding whether to hydrate the output model(s)
76
138
  by including metadata fields in the response.
77
139
 
78
140
  Returns:
79
- List of pipeline objects.
141
+ List of pipeline objects matching the filter criteria.
80
142
  """
143
+ if project_name_or_id:
144
+ pipeline_filter_model.project = project_name_or_id
145
+
81
146
  return verify_permissions_and_list_entities(
82
147
  filter_model=pipeline_filter_model,
83
148
  resource_type=ResourceType.PIPELINE,
@@ -160,7 +225,9 @@ def delete_pipeline(
160
225
 
161
226
  should_decrement = (
162
227
  ResourceType.PIPELINE in server_config().reportable_resources
163
- and zen_store().count_pipelines(PipelineFilter(name=pipeline.name))
228
+ and zen_store().count_pipelines(
229
+ PipelineFilter(name=pipeline.name, project=pipeline.project.id)
230
+ )
164
231
  == 0
165
232
  )
166
233
  if should_decrement:
@@ -81,7 +81,6 @@ def list_flavors(
81
81
 
82
82
  @plugin_router.get(
83
83
  "/{name}",
84
- response_model=BasePluginFlavorResponse,
85
84
  responses={401: error_response, 404: error_response, 422: error_response},
86
85
  )
87
86
  @handle_exceptions