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
@@ -58,7 +58,6 @@ router = APIRouter(
58
58
 
59
59
  @router.get(
60
60
  "",
61
- response_model=Page[TriggerResponse],
62
61
  responses={401: error_response, 404: error_response, 422: error_response},
63
62
  )
64
63
  @handle_exceptions
@@ -90,7 +89,6 @@ def list_triggers(
90
89
 
91
90
  @router.get(
92
91
  "/{trigger_id}",
93
- response_model=TriggerResponse,
94
92
  responses={401: error_response, 404: error_response, 422: error_response},
95
93
  )
96
94
  @handle_exceptions
@@ -116,7 +114,6 @@ def get_trigger(
116
114
 
117
115
  @router.post(
118
116
  "",
119
- response_model=TriggerResponse,
120
117
  responses={401: error_response, 409: error_response, 422: error_response},
121
118
  )
122
119
  @handle_exceptions
@@ -162,14 +159,12 @@ def create_trigger(
162
159
 
163
160
  return verify_permissions_and_create_entity(
164
161
  request_model=trigger,
165
- resource_type=ResourceType.TRIGGER,
166
162
  create_method=zen_store().create_trigger,
167
163
  )
168
164
 
169
165
 
170
166
  @router.put(
171
167
  "/{trigger_id}",
172
- response_model=TriggerResponse,
173
168
  responses={401: error_response, 404: error_response, 422: error_response},
174
169
  )
175
170
  @handle_exceptions
@@ -245,9 +240,11 @@ def delete_trigger(
245
240
  Args:
246
241
  trigger_id: Name of the trigger.
247
242
  """
248
- trigger = zen_store().get_trigger(trigger_id=trigger_id)
249
- verify_permission_for_model(trigger, action=Action.DELETE)
250
- zen_store().delete_trigger(trigger_id=trigger_id)
243
+ verify_permissions_and_delete_entity(
244
+ id=trigger_id,
245
+ get_method=zen_store().get_trigger,
246
+ delete_method=zen_store().delete_trigger,
247
+ )
251
248
 
252
249
 
253
250
  executions_router = APIRouter(
@@ -33,6 +33,7 @@ from zenml.exceptions import AuthorizationException, IllegalOperationError
33
33
  from zenml.logger import get_logger
34
34
  from zenml.models import (
35
35
  Page,
36
+ ProjectScopedResponse,
36
37
  UserAuthModel,
37
38
  UserFilter,
38
39
  UserRequest,
@@ -87,7 +88,6 @@ current_user_router = APIRouter(
87
88
 
88
89
  @router.get(
89
90
  "",
90
- response_model=Page[UserResponse],
91
91
  responses={401: error_response, 404: error_response, 422: error_response},
92
92
  )
93
93
  @handle_exceptions
@@ -133,7 +133,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
133
133
 
134
134
  @router.post(
135
135
  "",
136
- response_model=UserResponse,
137
136
  responses={
138
137
  401: error_response,
139
138
  409: error_response,
@@ -174,7 +173,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
174
173
 
175
174
  # new_user = verify_permissions_and_create_entity(
176
175
  # request_model=user,
177
- # resource_type=ResourceType.USER,
178
176
  # create_method=zen_store().create_user,
179
177
  # )
180
178
  new_user = zen_store().create_user(user)
@@ -188,7 +186,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
188
186
 
189
187
  @router.get(
190
188
  "/{user_name_or_id}",
191
- response_model=UserResponse,
192
189
  responses={401: error_response, 404: error_response, 422: error_response},
193
190
  )
194
191
  @handle_exceptions
@@ -233,7 +230,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
233
230
 
234
231
  @router.put(
235
232
  "/{user_name_or_id}",
236
- response_model=UserResponse,
237
233
  responses={
238
234
  401: error_response,
239
235
  404: error_response,
@@ -403,7 +399,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
403
399
 
404
400
  @activation_router.put(
405
401
  "/{user_name_or_id}" + ACTIVATE,
406
- response_model=UserResponse,
407
402
  responses={
408
403
  401: error_response,
409
404
  404: error_response,
@@ -464,7 +459,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
464
459
 
465
460
  @router.put(
466
461
  "/{user_name_or_id}" + DEACTIVATE,
467
- response_model=UserResponse,
468
462
  responses={
469
463
  401: error_response,
470
464
  404: error_response,
@@ -555,7 +549,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
555
549
 
556
550
  @router.put(
557
551
  "/{user_name_or_id}" + EMAIL_ANALYTICS,
558
- response_model=UserResponse,
559
552
  responses={
560
553
  401: error_response,
561
554
  404: error_response,
@@ -608,7 +601,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
608
601
 
609
602
  @current_user_router.get(
610
603
  "/current-user",
611
- response_model=UserResponse,
612
604
  responses={401: error_response, 404: error_response, 422: error_response},
613
605
  )
614
606
  @handle_exceptions
@@ -632,7 +624,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
632
624
 
633
625
  @current_user_router.put(
634
626
  "/current-user",
635
- response_model=UserResponse,
636
627
  responses={
637
628
  401: error_response,
638
629
  404: error_response,
@@ -752,8 +743,6 @@ if server_config().rbac_enabled:
752
743
  )
753
744
 
754
745
  resource_type = ResourceType(resource_type)
755
- resource = Resource(type=resource_type, id=resource_id)
756
-
757
746
  schema_class = get_schema_for_resource_type(resource_type)
758
747
  model = zen_store().get_entity_by_id(
759
748
  entity_id=resource_id, schema_class=schema_class
@@ -765,6 +754,14 @@ if server_config().rbac_enabled:
765
754
  "not exist."
766
755
  )
767
756
 
757
+ project_id = None
758
+ if isinstance(model, ProjectScopedResponse):
759
+ project_id = model.project.id
760
+
761
+ resource = Resource(
762
+ type=resource_type, id=resource_id, project_id=project_id
763
+ )
764
+
768
765
  verify_permission_for_model(model=model, action=Action.SHARE)
769
766
  for action in actions:
770
767
  # Make sure users aren't able to share permissions they don't have
@@ -18,8 +18,8 @@ from zenml.config.pipeline_run_configuration import (
18
18
  )
19
19
  from zenml.config.step_configurations import Step, StepConfiguration
20
20
  from zenml.constants import (
21
+ ENV_ZENML_ACTIVE_PROJECT_ID,
21
22
  ENV_ZENML_ACTIVE_STACK_ID,
22
- ENV_ZENML_ACTIVE_WORKSPACE_ID,
23
23
  )
24
24
  from zenml.enums import ExecutionStatus, StackComponentType, StoreType
25
25
  from zenml.logger import get_logger
@@ -134,7 +134,7 @@ def run_template(
134
134
  ).access_token
135
135
 
136
136
  environment = {
137
- ENV_ZENML_ACTIVE_WORKSPACE_ID: str(new_deployment.workspace.id),
137
+ ENV_ZENML_ACTIVE_PROJECT_ID: str(new_deployment.project.id),
138
138
  ENV_ZENML_ACTIVE_STACK_ID: str(stack.id),
139
139
  "ZENML_VERSION": zenml_version,
140
140
  "ZENML_STORE_URL": server_url,
@@ -149,9 +149,10 @@ def run_template(
149
149
  )
150
150
 
151
151
  def _task() -> None:
152
- pypi_requirements, apt_packages = (
153
- requirements_utils.get_requirements_for_stack(stack=stack)
154
- )
152
+ (
153
+ pypi_requirements,
154
+ apt_packages,
155
+ ) = requirements_utils.get_requirements_for_stack(stack=stack)
155
156
 
156
157
  if build.python_version:
157
158
  version_info = version.parse(build.python_version)
@@ -406,8 +407,7 @@ def deployment_request_from_template(
406
407
  assert deployment.stack
407
408
  assert deployment.build
408
409
  deployment_request = PipelineDeploymentRequest(
409
- user=user_id,
410
- workspace=deployment.workspace.id,
410
+ project=deployment.project.id,
411
411
  run_name_template=config.run_name
412
412
  or get_default_run_name(pipeline_name=pipeline_configuration.name),
413
413
  pipeline_configuration=pipeline_configuration,
@@ -463,6 +463,7 @@ def get_pipeline_run_analytics_metadata(
463
463
  }
464
464
 
465
465
  return {
466
+ "project_id": deployment.project.id,
466
467
  "store_type": "rest", # This method is called from within a REST endpoint
467
468
  **stack_metadata,
468
469
  "total_steps": len(deployment.step_configurations),
zenml/zen_server/utils.py CHANGED
@@ -26,9 +26,11 @@ from typing import (
26
26
  Tuple,
27
27
  Type,
28
28
  TypeVar,
29
+ Union,
29
30
  cast,
30
31
  )
31
32
  from urllib.parse import urlparse
33
+ from uuid import UUID
32
34
 
33
35
  from pydantic import BaseModel, ValidationError
34
36
 
@@ -44,6 +46,7 @@ from zenml.constants import (
44
46
  from zenml.enums import StoreType
45
47
  from zenml.exceptions import IllegalOperationError, OAuthError
46
48
  from zenml.logger import get_logger
49
+ from zenml.models.v2.base.scoped import ProjectScopedFilter
47
50
  from zenml.plugins.plugin_flavor_registry import PluginFlavorRegistry
48
51
  from zenml.zen_server.cache import MemoryCache
49
52
  from zenml.zen_server.deploy.deployment import (
@@ -635,3 +638,21 @@ def get_zenml_headers() -> Dict[str, str]:
635
638
  headers["zenml-server-url"] = config.server_url
636
639
 
637
640
  return headers
641
+
642
+
643
+ def set_filter_project_scope(
644
+ filter_model: ProjectScopedFilter,
645
+ project_name_or_id: Optional[Union[UUID, str]] = None,
646
+ ) -> None:
647
+ """Set the project scope of the filter model.
648
+
649
+ Args:
650
+ filter_model: The filter model to set the scope for.
651
+ project_name_or_id: The project to set the scope for. If not
652
+ provided, the project scope is determined from the request
653
+ project filter or the default project, in that order.
654
+ """
655
+ zen_store().set_filter_project_id(
656
+ filter_model=filter_model,
657
+ project_name_or_id=project_name_or_id,
658
+ )
@@ -73,6 +73,8 @@ from zenml.zen_server.routers import (
73
73
  pipeline_deployments_endpoints,
74
74
  pipelines_endpoints,
75
75
  plugin_endpoints,
76
+ projects_endpoints,
77
+ run_metadata_endpoints,
76
78
  run_templates_endpoints,
77
79
  runs_endpoints,
78
80
  schedule_endpoints,
@@ -85,11 +87,11 @@ from zenml.zen_server.routers import (
85
87
  stack_deployment_endpoints,
86
88
  stacks_endpoints,
87
89
  steps_endpoints,
90
+ tag_resource_endpoints,
88
91
  tags_endpoints,
89
92
  triggers_endpoints,
90
93
  users_endpoints,
91
94
  webhook_endpoints,
92
- workspaces_endpoints,
93
95
  )
94
96
  from zenml.zen_server.secure_headers import (
95
97
  initialize_secure_headers,
@@ -472,6 +474,7 @@ app.include_router(pipelines_endpoints.router)
472
474
  app.include_router(pipeline_builds_endpoints.router)
473
475
  app.include_router(pipeline_deployments_endpoints.router)
474
476
  app.include_router(runs_endpoints.router)
477
+ app.include_router(run_metadata_endpoints.router)
475
478
  app.include_router(run_templates_endpoints.router)
476
479
  app.include_router(schedule_endpoints.router)
477
480
  app.include_router(secrets_endpoints.router)
@@ -487,11 +490,13 @@ app.include_router(stack_components_endpoints.router)
487
490
  app.include_router(stack_components_endpoints.types_router)
488
491
  app.include_router(steps_endpoints.router)
489
492
  app.include_router(tags_endpoints.router)
493
+ app.include_router(tag_resource_endpoints.router)
490
494
  app.include_router(triggers_endpoints.router)
491
495
  app.include_router(users_endpoints.router)
492
496
  app.include_router(users_endpoints.current_user_router)
493
497
  app.include_router(webhook_endpoints.router)
494
- app.include_router(workspaces_endpoints.router)
498
+ app.include_router(projects_endpoints.workspace_router)
499
+ app.include_router(projects_endpoints.router)
495
500
 
496
501
  # When the auth scheme is set to EXTERNAL, users cannot be managed via the
497
502
  # API.
@@ -33,9 +33,9 @@ from zenml.config.global_config import GlobalConfiguration
33
33
  from zenml.config.server_config import ServerConfiguration
34
34
  from zenml.config.store_config import StoreConfiguration
35
35
  from zenml.constants import (
36
+ DEFAULT_PROJECT_NAME,
36
37
  DEFAULT_STACK_AND_COMPONENT_NAME,
37
- DEFAULT_WORKSPACE_NAME,
38
- ENV_ZENML_DEFAULT_WORKSPACE_NAME,
38
+ ENV_ZENML_DEFAULT_PROJECT_NAME,
39
39
  ENV_ZENML_SERVER,
40
40
  IS_DEBUG_ENV,
41
41
  )
@@ -46,6 +46,7 @@ from zenml.enums import (
46
46
  from zenml.exceptions import IllegalOperationError
47
47
  from zenml.logger import get_logger
48
48
  from zenml.models import (
49
+ ProjectResponse,
49
50
  ServerDatabaseType,
50
51
  ServerDeploymentType,
51
52
  ServerModel,
@@ -53,7 +54,6 @@ from zenml.models import (
53
54
  StackResponse,
54
55
  UserFilter,
55
56
  UserResponse,
56
- WorkspaceResponse,
57
57
  )
58
58
  from zenml.utils.pydantic_utils import before_validator_handler
59
59
  from zenml.zen_stores.zen_store_interface import ZenStoreInterface
@@ -292,51 +292,55 @@ class BaseZenStore(
292
292
 
293
293
  def validate_active_config(
294
294
  self,
295
- active_workspace_name_or_id: Optional[Union[str, UUID]] = None,
295
+ active_project_name_or_id: Optional[Union[str, UUID]] = None,
296
296
  active_stack_id: Optional[UUID] = None,
297
297
  config_name: str = "",
298
- ) -> Tuple[WorkspaceResponse, StackResponse]:
298
+ ) -> Tuple[Optional[ProjectResponse], StackResponse]:
299
299
  """Validate the active configuration.
300
300
 
301
- Call this method to validate the supplied active workspace and active
301
+ Call this method to validate the supplied active project and active
302
302
  stack values.
303
303
 
304
- This method is guaranteed to return valid workspace ID and stack ID
305
- values. If the supplied workspace and stack are not set or are not valid
306
- (e.g. they do not exist or are not accessible), the default workspace and
307
- default workspace stack will be returned in their stead.
304
+ This method returns a valid project and stack values. If the
305
+ supplied project and stack are not set or are not valid (e.g. they
306
+ do not exist or are not accessible), the default project and default
307
+ stack will be returned in their stead.
308
308
 
309
309
  Args:
310
- active_workspace_name_or_id: The name or ID of the active workspace.
310
+ active_project_name_or_id: The name or ID of the active project.
311
311
  active_stack_id: The ID of the active stack.
312
312
  config_name: The name of the configuration to validate (used in the
313
313
  displayed logs/messages).
314
314
 
315
315
  Returns:
316
- A tuple containing the active workspace and active stack.
316
+ A tuple containing the active project and active stack.
317
317
  """
318
- active_workspace: WorkspaceResponse
318
+ active_project: Optional[ProjectResponse] = None
319
319
 
320
- if active_workspace_name_or_id:
320
+ if active_project_name_or_id:
321
321
  try:
322
- active_workspace = self.get_workspace(
323
- active_workspace_name_or_id
322
+ active_project = self.get_project(active_project_name_or_id)
323
+ except (KeyError, IllegalOperationError):
324
+ active_project_name_or_id = None
325
+ logger.warning(
326
+ f"The current {config_name} active project is no longer "
327
+ f"available."
324
328
  )
325
- except KeyError:
326
- active_workspace = self._get_default_workspace()
327
329
 
330
+ if active_project is None:
331
+ try:
332
+ active_project = self._get_default_project()
333
+ except (KeyError, IllegalOperationError):
328
334
  logger.warning(
329
- f"The current {config_name} active workspace is no longer "
330
- f"available. Resetting the active workspace to "
331
- f"'{active_workspace.name}'."
335
+ "An active project is not set. Please set the active "
336
+ "project by running `zenml project set "
337
+ "<project-name>`."
338
+ )
339
+ else:
340
+ logger.info(
341
+ f"Setting the {config_name} active project "
342
+ f"to '{active_project.name}'."
332
343
  )
333
- else:
334
- active_workspace = self._get_default_workspace()
335
-
336
- logger.info(
337
- f"Setting the {config_name} active workspace "
338
- f"to '{active_workspace.name}'."
339
- )
340
344
 
341
345
  active_stack: StackResponse
342
346
 
@@ -351,30 +355,16 @@ class BaseZenStore(
351
355
  "Resetting the active stack to default.",
352
356
  config_name,
353
357
  )
354
- active_stack = self._get_default_stack(
355
- workspace_id=active_workspace.id
356
- )
357
- else:
358
- if active_stack.workspace.id != active_workspace.id:
359
- logger.warning(
360
- "The current %s active stack is not part of the active "
361
- "workspace. Resetting the active stack to default.",
362
- config_name,
363
- )
364
- active_stack = self._get_default_stack(
365
- workspace_id=active_workspace.id
366
- )
358
+ active_stack = self._get_default_stack()
367
359
 
368
360
  else:
369
361
  logger.warning(
370
362
  "Setting the %s active stack to default.",
371
363
  config_name,
372
364
  )
373
- active_stack = self._get_default_stack(
374
- workspace_id=active_workspace.id
375
- )
365
+ active_stack = self._get_default_stack()
376
366
 
377
- return active_workspace, active_stack
367
+ return active_project, active_stack
378
368
 
379
369
  def get_store_info(self) -> ServerModel:
380
370
  """Get information about the store.
@@ -432,59 +422,50 @@ class BaseZenStore(
432
422
  return self.get_store_info().is_local()
433
423
 
434
424
  # -----------------------------
435
- # Default workspaces and stacks
425
+ # Default projects and stacks
436
426
  # -----------------------------
437
427
 
438
428
  @property
439
- def _default_workspace_name(self) -> str:
440
- """Get the default workspace name.
429
+ def _default_project_name(self) -> str:
430
+ """Get the default project name.
441
431
 
442
432
  Returns:
443
- The default workspace name.
433
+ The default project name.
444
434
  """
445
- return os.getenv(
446
- ENV_ZENML_DEFAULT_WORKSPACE_NAME, DEFAULT_WORKSPACE_NAME
447
- )
435
+ return os.getenv(ENV_ZENML_DEFAULT_PROJECT_NAME, DEFAULT_PROJECT_NAME)
448
436
 
449
- def _get_default_workspace(self) -> WorkspaceResponse:
450
- """Get the default workspace.
437
+ def _get_default_project(self) -> ProjectResponse:
438
+ """Get the default project.
451
439
 
452
440
  Raises:
453
- KeyError: If the default workspace doesn't exist.
441
+ KeyError: If the default project doesn't exist.
454
442
 
455
443
  Returns:
456
- The default workspace.
444
+ The default project.
457
445
  """
458
446
  try:
459
- return self.get_workspace(self._default_workspace_name)
447
+ return self.get_project(self._default_project_name)
460
448
  except KeyError:
461
- raise KeyError("Unable to find default workspace.")
449
+ raise KeyError("Unable to find default project.")
462
450
 
463
451
  def _get_default_stack(
464
452
  self,
465
- workspace_id: UUID,
466
453
  ) -> StackResponse:
467
- """Get the default stack for a user in a workspace.
468
-
469
- Args:
470
- workspace_id: ID of the workspace.
454
+ """Get the default stack.
471
455
 
472
456
  Returns:
473
- The default stack in the workspace.
457
+ The default stack.
474
458
 
475
459
  Raises:
476
- KeyError: if the workspace or default stack doesn't exist.
460
+ KeyError: if the default stack doesn't exist.
477
461
  """
478
462
  default_stacks = self.list_stacks(
479
463
  StackFilter(
480
- workspace_id=workspace_id,
481
464
  name=DEFAULT_STACK_AND_COMPONENT_NAME,
482
465
  )
483
466
  )
484
467
  if default_stacks.total == 0:
485
- raise KeyError(
486
- f"No default stack found in workspace {workspace_id}."
487
- )
468
+ raise KeyError("No default stack found.")
488
469
  return default_stacks.items[0]
489
470
 
490
471
  def get_external_user(self, user_id: UUID) -> UserResponse: