zenml-nightly 0.75.0.dev20250313__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 (123) hide show
  1. zenml/VERSION +1 -1
  2. zenml/analytics/context.py +4 -4
  3. zenml/analytics/enums.py +2 -2
  4. zenml/artifacts/utils.py +2 -2
  5. zenml/cli/__init__.py +8 -9
  6. zenml/cli/base.py +2 -2
  7. zenml/cli/code_repository.py +1 -1
  8. zenml/cli/pipeline.py +3 -3
  9. zenml/cli/project.py +172 -0
  10. zenml/cli/service_accounts.py +0 -1
  11. zenml/cli/service_connectors.py +15 -16
  12. zenml/cli/stack.py +0 -2
  13. zenml/cli/stack_components.py +2 -2
  14. zenml/cli/utils.py +3 -3
  15. zenml/client.py +347 -340
  16. zenml/config/global_config.py +41 -43
  17. zenml/constants.py +5 -3
  18. zenml/event_hub/event_hub.py +1 -1
  19. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
  20. zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
  21. zenml/integrations/wandb/__init__.py +1 -1
  22. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
  23. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +2 -0
  24. zenml/model/model.py +2 -2
  25. zenml/model_registries/base_model_registry.py +1 -1
  26. zenml/models/__init__.py +29 -29
  27. zenml/models/v2/base/filter.py +1 -1
  28. zenml/models/v2/base/scoped.py +49 -53
  29. zenml/models/v2/core/action.py +12 -12
  30. zenml/models/v2/core/artifact.py +15 -15
  31. zenml/models/v2/core/artifact_version.py +15 -15
  32. zenml/models/v2/core/code_repository.py +12 -12
  33. zenml/models/v2/core/event_source.py +12 -12
  34. zenml/models/v2/core/model.py +17 -17
  35. zenml/models/v2/core/model_version.py +15 -15
  36. zenml/models/v2/core/pipeline.py +15 -15
  37. zenml/models/v2/core/pipeline_build.py +14 -14
  38. zenml/models/v2/core/pipeline_deployment.py +12 -14
  39. zenml/models/v2/core/pipeline_run.py +16 -16
  40. zenml/models/v2/core/project.py +203 -0
  41. zenml/models/v2/core/run_metadata.py +2 -2
  42. zenml/models/v2/core/run_template.py +15 -15
  43. zenml/models/v2/core/schedule.py +12 -12
  44. zenml/models/v2/core/secret.py +1 -1
  45. zenml/models/v2/core/service.py +14 -14
  46. zenml/models/v2/core/step_run.py +13 -13
  47. zenml/models/v2/core/trigger.py +13 -13
  48. zenml/models/v2/core/trigger_execution.py +2 -2
  49. zenml/models/v2/core/user.py +0 -17
  50. zenml/models/v2/misc/statistics.py +4 -4
  51. zenml/orchestrators/cache_utils.py +7 -7
  52. zenml/orchestrators/input_utils.py +1 -1
  53. zenml/orchestrators/step_launcher.py +1 -1
  54. zenml/orchestrators/step_run_utils.py +2 -2
  55. zenml/orchestrators/utils.py +4 -4
  56. zenml/pipelines/build_utils.py +2 -2
  57. zenml/pipelines/pipeline_definition.py +5 -5
  58. zenml/pipelines/run_utils.py +1 -1
  59. zenml/service_connectors/service_connector.py +0 -3
  60. zenml/service_connectors/service_connector_utils.py +0 -1
  61. zenml/stack/stack.py +0 -1
  62. zenml/steps/base_step.py +10 -2
  63. zenml/zen_server/rbac/endpoint_utils.py +17 -17
  64. zenml/zen_server/rbac/models.py +20 -20
  65. zenml/zen_server/rbac/rbac_sql_zen_store.py +3 -3
  66. zenml/zen_server/rbac/utils.py +23 -25
  67. zenml/zen_server/rbac/zenml_cloud_rbac.py +12 -16
  68. zenml/zen_server/routers/artifact_version_endpoints.py +10 -10
  69. zenml/zen_server/routers/auth_endpoints.py +6 -6
  70. zenml/zen_server/routers/code_repositories_endpoints.py +12 -14
  71. zenml/zen_server/routers/model_versions_endpoints.py +13 -15
  72. zenml/zen_server/routers/models_endpoints.py +7 -9
  73. zenml/zen_server/routers/pipeline_builds_endpoints.py +14 -16
  74. zenml/zen_server/routers/pipeline_deployments_endpoints.py +13 -15
  75. zenml/zen_server/routers/pipelines_endpoints.py +16 -18
  76. zenml/zen_server/routers/{workspaces_endpoints.py → projects_endpoints.py} +111 -68
  77. zenml/zen_server/routers/run_metadata_endpoints.py +7 -9
  78. zenml/zen_server/routers/run_templates_endpoints.py +15 -17
  79. zenml/zen_server/routers/runs_endpoints.py +12 -14
  80. zenml/zen_server/routers/schedule_endpoints.py +12 -14
  81. zenml/zen_server/routers/secrets_endpoints.py +1 -3
  82. zenml/zen_server/routers/server_endpoints.py +5 -5
  83. zenml/zen_server/routers/service_connectors_endpoints.py +11 -13
  84. zenml/zen_server/routers/service_endpoints.py +7 -9
  85. zenml/zen_server/routers/stack_components_endpoints.py +9 -11
  86. zenml/zen_server/routers/stacks_endpoints.py +9 -11
  87. zenml/zen_server/routers/steps_endpoints.py +6 -6
  88. zenml/zen_server/routers/users_endpoints.py +5 -43
  89. zenml/zen_server/template_execution/utils.py +4 -4
  90. zenml/zen_server/utils.py +10 -10
  91. zenml/zen_server/zen_server_api.py +3 -2
  92. zenml/zen_stores/base_zen_store.py +35 -39
  93. zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
  94. zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +3 -3
  95. zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
  96. zenml/zen_stores/rest_zen_store.py +54 -62
  97. zenml/zen_stores/schemas/__init__.py +2 -2
  98. zenml/zen_stores/schemas/action_schemas.py +9 -9
  99. zenml/zen_stores/schemas/artifact_schemas.py +15 -17
  100. zenml/zen_stores/schemas/code_repository_schemas.py +16 -18
  101. zenml/zen_stores/schemas/event_source_schemas.py +9 -9
  102. zenml/zen_stores/schemas/model_schemas.py +15 -17
  103. zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
  104. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  105. zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -9
  106. zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
  107. zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +47 -41
  108. zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
  109. zenml/zen_stores/schemas/run_template_schemas.py +9 -9
  110. zenml/zen_stores/schemas/schedule_schema.py +9 -9
  111. zenml/zen_stores/schemas/service_schemas.py +7 -7
  112. zenml/zen_stores/schemas/step_run_schemas.py +7 -7
  113. zenml/zen_stores/schemas/trigger_schemas.py +9 -9
  114. zenml/zen_stores/schemas/user_schemas.py +0 -12
  115. zenml/zen_stores/sql_zen_store.py +258 -268
  116. zenml/zen_stores/zen_store_interface.py +56 -70
  117. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
  118. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +121 -119
  119. zenml/cli/workspace.py +0 -160
  120. zenml/models/v2/core/workspace.py +0 -131
  121. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/LICENSE +0 -0
  122. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
  123. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/entry_points.txt +0 -0
@@ -58,22 +58,20 @@ def _convert_from_cloud_resource(cloud_resource: str) -> Resource:
58
58
  Returns:
59
59
  The converted resource.
60
60
  """
61
- scope, workspace_resource_type_and_id = cloud_resource.split(
62
- ":", maxsplit=1
63
- )
61
+ scope, project_resource_type_and_id = cloud_resource.split(":", maxsplit=1)
64
62
 
65
63
  if scope != f"{SERVER_ID}@{SERVER_SCOPE_IDENTIFIER}":
66
64
  raise ValueError("Invalid scope for server resource.")
67
65
 
68
- workspace_id: Optional[str] = None
69
- if ":" in workspace_resource_type_and_id:
66
+ project_id: Optional[str] = None
67
+ if ":" in project_resource_type_and_id:
70
68
  (
71
- workspace_id,
69
+ project_id,
72
70
  resource_type_and_id,
73
- ) = workspace_resource_type_and_id.split(":", maxsplit=1)
71
+ ) = project_resource_type_and_id.split(":", maxsplit=1)
74
72
  else:
75
- workspace_id = None
76
- resource_type_and_id = workspace_resource_type_and_id
73
+ project_id = None
74
+ resource_type_and_id = project_resource_type_and_id
77
75
 
78
76
  resource_id: Optional[str] = None
79
77
  if "/" in resource_type_and_id:
@@ -81,15 +79,13 @@ def _convert_from_cloud_resource(cloud_resource: str) -> Resource:
81
79
  else:
82
80
  resource_type = resource_type_and_id
83
81
 
84
- if resource_type == ResourceType.WORKSPACE and workspace_id is not None:
85
- # TODO: For now, we duplicate the workspace ID in the string
86
- # representation when describing a workspace instance, because
82
+ if resource_type == ResourceType.PROJECT and project_id is not None:
83
+ # TODO: For now, we duplicate the project ID in the string
84
+ # representation when describing a project instance, because
87
85
  # this is what is expected by the RBAC implementation.
88
- workspace_id = None
86
+ project_id = None
89
87
 
90
- return Resource(
91
- type=resource_type, id=resource_id, workspace_id=workspace_id
92
- )
88
+ return Resource(type=resource_type, id=resource_id, project_id=project_id)
93
89
 
94
90
 
95
91
  class ZenMLCloudRBAC(RBACInterface):
@@ -46,7 +46,7 @@ from zenml.zen_server.rbac.utils import (
46
46
  from zenml.zen_server.utils import (
47
47
  handle_exceptions,
48
48
  make_dependable,
49
- set_filter_workspace_scope,
49
+ set_filter_project_scope,
50
50
  zen_store,
51
51
  )
52
52
 
@@ -81,14 +81,14 @@ def list_artifact_versions(
81
81
  Returns:
82
82
  The artifact versions according to query filters.
83
83
  """
84
- # A workspace scoped request must always be scoped to a specific
85
- # workspace. This is required for the RBAC check to work.
86
- set_filter_workspace_scope(artifact_version_filter_model)
87
- assert isinstance(artifact_version_filter_model.workspace, UUID)
84
+ # A project scoped request must always be scoped to a specific
85
+ # project. This is required for the RBAC check to work.
86
+ set_filter_project_scope(artifact_version_filter_model)
87
+ assert isinstance(artifact_version_filter_model.project, UUID)
88
88
 
89
89
  allowed_artifact_ids = get_allowed_resource_ids(
90
90
  resource_type=ResourceType.ARTIFACT,
91
- workspace_id=artifact_version_filter_model.workspace,
91
+ project_id=artifact_version_filter_model.project,
92
92
  )
93
93
  artifact_version_filter_model.configure_rbac(
94
94
  authenticated_user_id=auth_context.user.id,
@@ -228,24 +228,24 @@ def delete_artifact_version(
228
228
  )
229
229
  @handle_exceptions
230
230
  def prune_artifact_versions(
231
- workspace_name_or_id: Union[str, UUID],
231
+ project_name_or_id: Union[str, UUID],
232
232
  only_versions: bool = True,
233
233
  _: AuthContext = Security(authorize),
234
234
  ) -> None:
235
235
  """Prunes unused artifact versions and their artifacts.
236
236
 
237
237
  Args:
238
- workspace_name_or_id: The workspace name or ID to prune artifact
238
+ project_name_or_id: The project name or ID to prune artifact
239
239
  versions for.
240
240
  only_versions: Only delete artifact versions, keeping artifacts
241
241
  """
242
- workspace_id = zen_store().get_workspace(workspace_name_or_id).id
242
+ project_id = zen_store().get_project(project_name_or_id).id
243
243
 
244
244
  verify_permissions_and_prune_entities(
245
245
  resource_type=ResourceType.ARTIFACT_VERSION,
246
246
  prune_method=zen_store().prune_artifact_versions,
247
247
  only_versions=only_versions,
248
- workspace_id=workspace_id,
248
+ project_id=project_id,
249
249
  )
250
250
 
251
251
 
@@ -582,7 +582,7 @@ def api_token(
582
582
  f"step run {token.step_run_id}."
583
583
  )
584
584
 
585
- workspace_id: Optional[UUID] = None
585
+ project_id: Optional[UUID] = None
586
586
 
587
587
  if schedule_id:
588
588
  # The schedule must exist
@@ -593,7 +593,7 @@ def api_token(
593
593
  f"Schedule {schedule_id} does not exist and API tokens cannot "
594
594
  "be generated for non-existent schedules for security reasons."
595
595
  )
596
- workspace_id = schedule.workspace.id
596
+ project_id = schedule.project.id
597
597
 
598
598
  if not schedule.active:
599
599
  raise ValueError(
@@ -614,7 +614,7 @@ def api_token(
614
614
 
615
615
  verify_permission_for_model(model=pipeline_run, action=Action.READ)
616
616
 
617
- workspace_id = pipeline_run.workspace.id
617
+ project_id = pipeline_run.project.id
618
618
 
619
619
  if pipeline_run.status.is_finished:
620
620
  raise ValueError(
@@ -633,7 +633,7 @@ def api_token(
633
633
  "be generated for non-existent step runs for security reasons."
634
634
  )
635
635
 
636
- workspace_id = step_run.workspace.id
636
+ project_id = step_run.project.id
637
637
 
638
638
  if step_run.status.is_finished:
639
639
  raise ValueError(
@@ -642,11 +642,11 @@ def api_token(
642
642
  "for security reasons."
643
643
  )
644
644
 
645
- assert workspace_id is not None
645
+ assert project_id is not None
646
646
  verify_permission(
647
647
  resource_type=ResourceType.PIPELINE_RUN,
648
648
  action=Action.CREATE,
649
- workspace_id=workspace_id,
649
+ project_id=project_id,
650
650
  )
651
651
 
652
652
  return generate_access_token(
@@ -36,9 +36,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
36
36
  verify_permissions_and_update_entity,
37
37
  )
38
38
  from zenml.zen_server.rbac.models import ResourceType
39
- from zenml.zen_server.routers.workspaces_endpoints import (
40
- router as workspace_router,
41
- )
39
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
42
40
  from zenml.zen_server.utils import (
43
41
  handle_exceptions,
44
42
  make_dependable,
@@ -59,7 +57,7 @@ router = APIRouter(
59
57
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
60
58
  # and can be removed after the migration
61
59
  @workspace_router.post(
62
- "/{workspace_name_or_id}" + CODE_REPOSITORIES,
60
+ "/{project_name_or_id}" + CODE_REPOSITORIES,
63
61
  responses={401: error_response, 409: error_response, 422: error_response},
64
62
  deprecated=True,
65
63
  tags=["code_repositories"],
@@ -67,21 +65,21 @@ router = APIRouter(
67
65
  @handle_exceptions
68
66
  def create_code_repository(
69
67
  code_repository: CodeRepositoryRequest,
70
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
68
+ project_name_or_id: Optional[Union[str, UUID]] = None,
71
69
  _: AuthContext = Security(authorize),
72
70
  ) -> CodeRepositoryResponse:
73
71
  """Creates a code repository.
74
72
 
75
73
  Args:
76
74
  code_repository: Code repository to create.
77
- workspace_name_or_id: Optional name or ID of the workspace.
75
+ project_name_or_id: Optional name or ID of the project.
78
76
 
79
77
  Returns:
80
78
  The created code repository.
81
79
  """
82
- if workspace_name_or_id:
83
- workspace = zen_store().get_workspace(workspace_name_or_id)
84
- code_repository.workspace = workspace.id
80
+ if project_name_or_id:
81
+ project = zen_store().get_project(project_name_or_id)
82
+ code_repository.project = project.id
85
83
 
86
84
  return verify_permissions_and_create_entity(
87
85
  request_model=code_repository,
@@ -96,7 +94,7 @@ def create_code_repository(
96
94
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
97
95
  # and can be removed after the migration
98
96
  @workspace_router.get(
99
- "/{workspace_name_or_id}" + CODE_REPOSITORIES,
97
+ "/{project_name_or_id}" + CODE_REPOSITORIES,
100
98
  responses={401: error_response, 404: error_response, 422: error_response},
101
99
  deprecated=True,
102
100
  tags=["code_repositories"],
@@ -106,7 +104,7 @@ def list_code_repositories(
106
104
  filter_model: CodeRepositoryFilter = Depends(
107
105
  make_dependable(CodeRepositoryFilter)
108
106
  ),
109
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
107
+ project_name_or_id: Optional[Union[str, UUID]] = None,
110
108
  hydrate: bool = False,
111
109
  _: AuthContext = Security(authorize),
112
110
  ) -> Page[CodeRepositoryResponse]:
@@ -115,15 +113,15 @@ def list_code_repositories(
115
113
  Args:
116
114
  filter_model: Filter model used for pagination, sorting,
117
115
  filtering.
118
- workspace_name_or_id: Optional name or ID of the workspace.
116
+ project_name_or_id: Optional name or ID of the project.
119
117
  hydrate: Flag deciding whether to hydrate the output model(s)
120
118
  by including metadata fields in the response.
121
119
 
122
120
  Returns:
123
121
  Page of code repository objects.
124
122
  """
125
- if workspace_name_or_id:
126
- filter_model.workspace = workspace_name_or_id
123
+ if project_name_or_id:
124
+ filter_model.project = project_name_or_id
127
125
 
128
126
  return verify_permissions_and_list_entities(
129
127
  filter_model=filter_model,
@@ -56,13 +56,11 @@ from zenml.zen_server.rbac.utils import (
56
56
  from zenml.zen_server.routers.models_endpoints import (
57
57
  router as model_router,
58
58
  )
59
- from zenml.zen_server.routers.workspaces_endpoints import (
60
- router as workspace_router,
61
- )
59
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
62
60
  from zenml.zen_server.utils import (
63
61
  handle_exceptions,
64
62
  make_dependable,
65
- set_filter_workspace_scope,
63
+ set_filter_project_scope,
66
64
  zen_store,
67
65
  )
68
66
 
@@ -85,7 +83,7 @@ router = APIRouter(
85
83
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
86
84
  # and can be removed after the migration
87
85
  @workspace_router.post(
88
- "/{workspace_name_or_id}" + MODELS + "/{model_id}" + MODEL_VERSIONS,
86
+ "/{project_name_or_id}" + MODELS + "/{model_id}" + MODEL_VERSIONS,
89
87
  responses={401: error_response, 409: error_response, 422: error_response},
90
88
  deprecated=True,
91
89
  tags=["model_versions"],
@@ -94,7 +92,7 @@ router = APIRouter(
94
92
  def create_model_version(
95
93
  model_version: ModelVersionRequest,
96
94
  model_id: Optional[UUID] = None,
97
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
95
+ project_name_or_id: Optional[Union[str, UUID]] = None,
98
96
  _: AuthContext = Security(authorize),
99
97
  ) -> ModelVersionResponse:
100
98
  """Creates a model version.
@@ -102,14 +100,14 @@ def create_model_version(
102
100
  Args:
103
101
  model_version: Model version to create.
104
102
  model_id: Optional ID of the model.
105
- workspace_name_or_id: Optional name or ID of the workspace.
103
+ project_name_or_id: Optional name or ID of the project.
106
104
 
107
105
  Returns:
108
106
  The created model version.
109
107
  """
110
- if workspace_name_or_id:
111
- workspace = zen_store().get_workspace(workspace_name_or_id)
112
- model_version.workspace = workspace.id
108
+ if project_name_or_id:
109
+ project = zen_store().get_project(project_name_or_id)
110
+ model_version.project = project.id
113
111
 
114
112
  if model_id:
115
113
  model_version.model = model_id
@@ -159,14 +157,14 @@ def list_model_versions(
159
157
  if not model_version_filter_model.model:
160
158
  raise ValueError("Model missing from the filter")
161
159
 
162
- # A workspace scoped request must always be scoped to a specific
163
- # workspace. This is required for the RBAC check to work.
164
- set_filter_workspace_scope(model_version_filter_model)
165
- assert isinstance(model_version_filter_model.workspace, UUID)
160
+ # A project scoped request must always be scoped to a specific
161
+ # project. This is required for the RBAC check to work.
162
+ set_filter_project_scope(model_version_filter_model)
163
+ assert isinstance(model_version_filter_model.project, UUID)
166
164
 
167
165
  model = zen_store().get_model_by_name_or_id(
168
166
  model_version_filter_model.model,
169
- workspace=model_version_filter_model.workspace,
167
+ project=model_version_filter_model.project,
170
168
  )
171
169
 
172
170
  # Check read permissions on the model
@@ -41,9 +41,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
41
41
  verify_permissions_and_update_entity,
42
42
  )
43
43
  from zenml.zen_server.rbac.models import ResourceType
44
- from zenml.zen_server.routers.workspaces_endpoints import (
45
- router as workspace_router,
46
- )
44
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
47
45
  from zenml.zen_server.utils import (
48
46
  handle_exceptions,
49
47
  make_dependable,
@@ -69,7 +67,7 @@ router = APIRouter(
69
67
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
70
68
  # and can be removed after the migration
71
69
  @workspace_router.post(
72
- "/{workspace_name_or_id}" + MODELS,
70
+ "/{project_name_or_id}" + MODELS,
73
71
  responses={401: error_response, 409: error_response, 422: error_response},
74
72
  deprecated=True,
75
73
  tags=["models"],
@@ -77,21 +75,21 @@ router = APIRouter(
77
75
  @handle_exceptions
78
76
  def create_model(
79
77
  model: ModelRequest,
80
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
78
+ project_name_or_id: Optional[Union[str, UUID]] = None,
81
79
  _: AuthContext = Security(authorize),
82
80
  ) -> ModelResponse:
83
81
  """Creates a model.
84
82
 
85
83
  Args:
86
84
  model: Model to create.
87
- workspace_name_or_id: Optional name or ID of the workspace.
85
+ project_name_or_id: Optional name or ID of the project.
88
86
 
89
87
  Returns:
90
88
  The created model.
91
89
  """
92
- if workspace_name_or_id:
93
- workspace = zen_store().get_workspace(workspace_name_or_id)
94
- model.workspace = workspace.id
90
+ if project_name_or_id:
91
+ project = zen_store().get_project(project_name_or_id)
92
+ model.project = project.id
95
93
 
96
94
  return verify_permissions_and_create_entity(
97
95
  request_model=model,
@@ -34,9 +34,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
34
34
  verify_permissions_and_list_entities,
35
35
  )
36
36
  from zenml.zen_server.rbac.models import ResourceType
37
- from zenml.zen_server.routers.workspaces_endpoints import (
38
- router as workspace_router,
39
- )
37
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
40
38
  from zenml.zen_server.utils import (
41
39
  handle_exceptions,
42
40
  make_dependable,
@@ -57,7 +55,7 @@ router = APIRouter(
57
55
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
58
56
  # and can be removed after the migration
59
57
  @workspace_router.post(
60
- "/{workspace_name_or_id}" + PIPELINE_BUILDS,
58
+ "/{project_name_or_id}" + PIPELINE_BUILDS,
61
59
  responses={401: error_response, 409: error_response, 422: error_response},
62
60
  deprecated=True,
63
61
  tags=["builds"],
@@ -65,21 +63,21 @@ router = APIRouter(
65
63
  @handle_exceptions
66
64
  def create_build(
67
65
  build: PipelineBuildRequest,
68
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
66
+ project_name_or_id: Optional[Union[str, UUID]] = None,
69
67
  _: AuthContext = Security(authorize),
70
68
  ) -> PipelineBuildResponse:
71
- """Creates a build, optionally in a specific workspace.
69
+ """Creates a build, optionally in a specific project.
72
70
 
73
71
  Args:
74
72
  build: Build to create.
75
- workspace_name_or_id: Optional name or ID of the workspace.
73
+ project_name_or_id: Optional name or ID of the project.
76
74
 
77
75
  Returns:
78
76
  The created build.
79
77
  """
80
- if workspace_name_or_id:
81
- workspace = zen_store().get_workspace(workspace_name_or_id)
82
- build.workspace = workspace.id
78
+ if project_name_or_id:
79
+ project = zen_store().get_project(project_name_or_id)
80
+ build.project = project.id
83
81
 
84
82
  return verify_permissions_and_create_entity(
85
83
  request_model=build,
@@ -94,7 +92,7 @@ def create_build(
94
92
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
95
93
  # and can be removed after the migration
96
94
  @workspace_router.get(
97
- "/{workspace_name_or_id}" + PIPELINE_BUILDS,
95
+ "/{project_name_or_id}" + PIPELINE_BUILDS,
98
96
  responses={401: error_response, 404: error_response, 422: error_response},
99
97
  deprecated=True,
100
98
  tags=["builds"],
@@ -104,24 +102,24 @@ def list_builds(
104
102
  build_filter_model: PipelineBuildFilter = Depends(
105
103
  make_dependable(PipelineBuildFilter)
106
104
  ),
107
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
105
+ project_name_or_id: Optional[Union[str, UUID]] = None,
108
106
  hydrate: bool = False,
109
107
  _: AuthContext = Security(authorize),
110
108
  ) -> Page[PipelineBuildResponse]:
111
- """Gets a list of builds, optionally filtered by workspace.
109
+ """Gets a list of builds.
112
110
 
113
111
  Args:
114
112
  build_filter_model: Filter model used for pagination, sorting,
115
113
  filtering.
116
- workspace_name_or_id: Optional name or ID of the workspace to filter by.
114
+ project_name_or_id: Optional name or ID of the project to filter by.
117
115
  hydrate: Flag deciding whether to hydrate the output model(s)
118
116
  by including metadata fields in the response.
119
117
 
120
118
  Returns:
121
119
  List of build objects matching the filter criteria.
122
120
  """
123
- if workspace_name_or_id:
124
- build_filter_model.workspace = workspace_name_or_id
121
+ if project_name_or_id:
122
+ build_filter_model.project = project_name_or_id
125
123
 
126
124
  return verify_permissions_and_list_entities(
127
125
  filter_model=build_filter_model,
@@ -34,9 +34,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
34
34
  verify_permissions_and_list_entities,
35
35
  )
36
36
  from zenml.zen_server.rbac.models import ResourceType
37
- from zenml.zen_server.routers.workspaces_endpoints import (
38
- router as workspace_router,
39
- )
37
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
40
38
  from zenml.zen_server.utils import (
41
39
  handle_exceptions,
42
40
  make_dependable,
@@ -59,7 +57,7 @@ router = APIRouter(
59
57
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
60
58
  # and can be removed after the migration
61
59
  @workspace_router.post(
62
- "/{workspace_name_or_id}" + PIPELINE_DEPLOYMENTS,
60
+ "/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
63
61
  responses={401: error_response, 409: error_response, 422: error_response},
64
62
  deprecated=True,
65
63
  tags=["deployments"],
@@ -67,21 +65,21 @@ router = APIRouter(
67
65
  @handle_exceptions
68
66
  def create_deployment(
69
67
  deployment: PipelineDeploymentRequest,
70
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
68
+ project_name_or_id: Optional[Union[str, UUID]] = None,
71
69
  _: AuthContext = Security(authorize),
72
70
  ) -> PipelineDeploymentResponse:
73
71
  """Creates a deployment.
74
72
 
75
73
  Args:
76
74
  deployment: Deployment to create.
77
- workspace_name_or_id: Optional name or ID of the workspace.
75
+ project_name_or_id: Optional name or ID of the project.
78
76
 
79
77
  Returns:
80
78
  The created deployment.
81
79
  """
82
- if workspace_name_or_id:
83
- workspace = zen_store().get_workspace(workspace_name_or_id)
84
- deployment.workspace = workspace.id
80
+ if project_name_or_id:
81
+ project = zen_store().get_project(project_name_or_id)
82
+ deployment.project = project.id
85
83
 
86
84
  return verify_permissions_and_create_entity(
87
85
  request_model=deployment,
@@ -96,7 +94,7 @@ def create_deployment(
96
94
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
97
95
  # and can be removed after the migration
98
96
  @workspace_router.get(
99
- "/{workspace_name_or_id}" + PIPELINE_DEPLOYMENTS,
97
+ "/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
100
98
  responses={401: error_response, 404: error_response, 422: error_response},
101
99
  deprecated=True,
102
100
  tags=["deployments"],
@@ -106,24 +104,24 @@ def list_deployments(
106
104
  deployment_filter_model: PipelineDeploymentFilter = Depends(
107
105
  make_dependable(PipelineDeploymentFilter)
108
106
  ),
109
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
107
+ project_name_or_id: Optional[Union[str, UUID]] = None,
110
108
  hydrate: bool = False,
111
109
  _: AuthContext = Security(authorize),
112
110
  ) -> Page[PipelineDeploymentResponse]:
113
- """Gets a list of deployments, optionally filtered by workspace.
111
+ """Gets a list of deployments.
114
112
 
115
113
  Args:
116
114
  deployment_filter_model: Filter model used for pagination, sorting,
117
115
  filtering.
118
- workspace_name_or_id: Optional name or ID of the workspace to filter by.
116
+ project_name_or_id: Optional name or ID of the project to filter by.
119
117
  hydrate: Flag deciding whether to hydrate the output model(s)
120
118
  by including metadata fields in the response.
121
119
 
122
120
  Returns:
123
121
  List of deployment objects matching the filter criteria.
124
122
  """
125
- if workspace_name_or_id:
126
- deployment_filter_model.workspace = workspace_name_or_id
123
+ if project_name_or_id:
124
+ deployment_filter_model.project = project_name_or_id
127
125
 
128
126
  return verify_permissions_and_list_entities(
129
127
  filter_model=deployment_filter_model,
@@ -46,9 +46,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
46
46
  verify_permissions_and_update_entity,
47
47
  )
48
48
  from zenml.zen_server.rbac.models import ResourceType
49
- from zenml.zen_server.routers.workspaces_endpoints import (
50
- router as workspace_router,
51
- )
49
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
52
50
  from zenml.zen_server.utils import (
53
51
  handle_exceptions,
54
52
  make_dependable,
@@ -70,7 +68,7 @@ router = APIRouter(
70
68
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
71
69
  # and can be removed after the migration
72
70
  @workspace_router.post(
73
- "/{workspace_name_or_id}" + PIPELINES,
71
+ "/{project_name_or_id}" + PIPELINES,
74
72
  responses={401: error_response, 409: error_response, 422: error_response},
75
73
  deprecated=True,
76
74
  tags=["pipelines"],
@@ -78,26 +76,26 @@ router = APIRouter(
78
76
  @handle_exceptions
79
77
  def create_pipeline(
80
78
  pipeline: PipelineRequest,
81
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
79
+ project_name_or_id: Optional[Union[str, UUID]] = None,
82
80
  _: AuthContext = Security(authorize),
83
81
  ) -> PipelineResponse:
84
- """Creates a pipeline, optionally in a specific workspace.
82
+ """Creates a pipeline.
85
83
 
86
84
  Args:
87
85
  pipeline: Pipeline to create.
88
- workspace_name_or_id: Optional name or ID of the workspace.
86
+ project_name_or_id: Optional name or ID of the project.
89
87
 
90
88
  Returns:
91
89
  The created pipeline.
92
90
  """
93
- if workspace_name_or_id:
94
- workspace = zen_store().get_workspace(workspace_name_or_id)
95
- pipeline.workspace = workspace.id
91
+ if project_name_or_id:
92
+ project = zen_store().get_project(project_name_or_id)
93
+ pipeline.project = project.id
96
94
 
97
95
  # We limit pipeline namespaces, not pipeline versions
98
96
  skip_entitlements = (
99
97
  zen_store().count_pipelines(
100
- PipelineFilter(name=pipeline.name, workspace=pipeline.workspace)
98
+ PipelineFilter(name=pipeline.name, project=pipeline.project)
101
99
  )
102
100
  > 0
103
101
  )
@@ -116,7 +114,7 @@ def create_pipeline(
116
114
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
117
115
  # and can be removed after the migration
118
116
  @workspace_router.get(
119
- "/{workspace_name_or_id}" + PIPELINES,
117
+ "/{project_name_or_id}" + PIPELINES,
120
118
  responses={401: error_response, 404: error_response, 422: error_response},
121
119
  deprecated=True,
122
120
  tags=["pipelines"],
@@ -126,24 +124,24 @@ def list_pipelines(
126
124
  pipeline_filter_model: PipelineFilter = Depends(
127
125
  make_dependable(PipelineFilter)
128
126
  ),
129
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
127
+ project_name_or_id: Optional[Union[str, UUID]] = None,
130
128
  hydrate: bool = False,
131
129
  _: AuthContext = Security(authorize),
132
130
  ) -> Page[PipelineResponse]:
133
- """Gets a list of pipelines, optionally filtered by workspace.
131
+ """Gets a list of pipelines.
134
132
 
135
133
  Args:
136
134
  pipeline_filter_model: Filter model used for pagination, sorting,
137
135
  filtering.
138
- workspace_name_or_id: Optional name or ID of the workspace to filter by.
136
+ project_name_or_id: Optional name or ID of the project to filter by.
139
137
  hydrate: Flag deciding whether to hydrate the output model(s)
140
138
  by including metadata fields in the response.
141
139
 
142
140
  Returns:
143
141
  List of pipeline objects matching the filter criteria.
144
142
  """
145
- if workspace_name_or_id:
146
- pipeline_filter_model.workspace = workspace_name_or_id
143
+ if project_name_or_id:
144
+ pipeline_filter_model.project = project_name_or_id
147
145
 
148
146
  return verify_permissions_and_list_entities(
149
147
  filter_model=pipeline_filter_model,
@@ -228,7 +226,7 @@ def delete_pipeline(
228
226
  should_decrement = (
229
227
  ResourceType.PIPELINE in server_config().reportable_resources
230
228
  and zen_store().count_pipelines(
231
- PipelineFilter(name=pipeline.name, workspace=pipeline.workspace.id)
229
+ PipelineFilter(name=pipeline.name, project=pipeline.project.id)
232
230
  )
233
231
  == 0
234
232
  )