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
@@ -32,6 +32,7 @@ from zenml.enums import AuthScheme
32
32
  from zenml.exceptions import IllegalOperationError
33
33
  from zenml.models import (
34
34
  ComponentFilter,
35
+ ProjectFilter,
35
36
  ServerActivationRequest,
36
37
  ServerLoadInfo,
37
38
  ServerModel,
@@ -40,7 +41,6 @@ from zenml.models import (
40
41
  ServerStatistics,
41
42
  StackFilter,
42
43
  UserResponse,
43
- WorkspaceFilter,
44
44
  )
45
45
  from zenml.zen_server.auth import AuthContext, authorize
46
46
  from zenml.zen_server.exceptions import error_response
@@ -267,10 +267,10 @@ def get_server_statistics(
267
267
  ),
268
268
  )
269
269
 
270
- workspace_filter = WorkspaceFilter()
271
- workspace_filter.configure_rbac(
270
+ project_filter = ProjectFilter()
271
+ project_filter.configure_rbac(
272
272
  authenticated_user_id=user_id,
273
- id=get_allowed_resource_ids(resource_type=ResourceType.WORKSPACE),
273
+ id=get_allowed_resource_ids(resource_type=ResourceType.PROJECT),
274
274
  )
275
275
 
276
276
  stack_filter = StackFilter()
@@ -284,5 +284,5 @@ def get_server_statistics(
284
284
  components=zen_store().count_stack_components(
285
285
  filter_model=component_filter
286
286
  ),
287
- workspaces=zen_store().count_workspaces(filter_model=workspace_filter),
287
+ projects=zen_store().count_projects(filter_model=project_filter),
288
288
  )
@@ -59,9 +59,7 @@ from zenml.zen_server.rbac.utils import (
59
59
  verify_permission,
60
60
  verify_permission_for_model,
61
61
  )
62
- from zenml.zen_server.routers.workspaces_endpoints import (
63
- router as workspace_router,
64
- )
62
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
65
63
  from zenml.zen_server.utils import (
66
64
  handle_exceptions,
67
65
  make_dependable,
@@ -88,7 +86,7 @@ types_router = APIRouter(
88
86
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
89
87
  # and can be removed after the migration
90
88
  @workspace_router.post(
91
- "/{workspace_name_or_id}" + SERVICE_CONNECTORS,
89
+ "/{project_name_or_id}" + SERVICE_CONNECTORS,
92
90
  responses={401: error_response, 409: error_response, 422: error_response},
93
91
  deprecated=True,
94
92
  tags=["service_connectors"],
@@ -96,14 +94,14 @@ types_router = APIRouter(
96
94
  @handle_exceptions
97
95
  def create_service_connector(
98
96
  connector: ServiceConnectorRequest,
99
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
97
+ project_name_or_id: Optional[Union[str, UUID]] = None,
100
98
  _: AuthContext = Security(authorize),
101
99
  ) -> ServiceConnectorResponse:
102
100
  """Creates a service connector.
103
101
 
104
102
  Args:
105
103
  connector: Service connector to register.
106
- workspace_name_or_id: Optional name or ID of the workspace.
104
+ project_name_or_id: Optional name or ID of the project.
107
105
 
108
106
  Returns:
109
107
  The created service connector.
@@ -121,7 +119,7 @@ def create_service_connector(
121
119
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
122
120
  # and can be removed after the migration
123
121
  @workspace_router.get(
124
- "/{workspace_name_or_id}" + SERVICE_CONNECTORS,
122
+ "/{project_name_or_id}" + SERVICE_CONNECTORS,
125
123
  responses={401: error_response, 404: error_response, 422: error_response},
126
124
  deprecated=True,
127
125
  tags=["service_connectors"],
@@ -131,17 +129,17 @@ def list_service_connectors(
131
129
  connector_filter_model: ServiceConnectorFilter = Depends(
132
130
  make_dependable(ServiceConnectorFilter)
133
131
  ),
134
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
132
+ project_name_or_id: Optional[Union[str, UUID]] = None,
135
133
  expand_secrets: bool = True,
136
134
  hydrate: bool = False,
137
135
  _: AuthContext = Security(authorize),
138
136
  ) -> Page[ServiceConnectorResponse]:
139
- """Get a list of all service connectors, optionally filtered by workspace.
137
+ """Get a list of all service connectors.
140
138
 
141
139
  Args:
142
140
  connector_filter_model: Filter model used for pagination, sorting,
143
141
  filtering
144
- workspace_name_or_id: Optional name or ID of the workspace to filter by.
142
+ project_name_or_id: Optional name or ID of the project to filter by.
145
143
  expand_secrets: Whether to expand secrets or not.
146
144
  hydrate: Flag deciding whether to hydrate the output model(s)
147
145
  by including metadata fields in the response.
@@ -318,7 +316,7 @@ def validate_and_verify_service_connector_config(
318
316
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
319
317
  # and can be removed after the migration
320
318
  @workspace_router.get(
321
- "/{workspace_name_or_id}" + SERVICE_CONNECTOR_RESOURCES,
319
+ "/{project_name_or_id}" + SERVICE_CONNECTOR_RESOURCES,
322
320
  responses={401: error_response, 404: error_response, 422: error_response},
323
321
  deprecated=True,
324
322
  tags=["service_connectors"],
@@ -328,7 +326,7 @@ def list_service_connector_resources(
328
326
  filter_model: ServiceConnectorFilter = Depends(
329
327
  make_dependable(ServiceConnectorFilter)
330
328
  ),
331
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
329
+ project_name_or_id: Optional[Union[str, UUID]] = None,
332
330
  auth_context: AuthContext = Security(authorize),
333
331
  ) -> List[ServiceConnectorResourcesModel]:
334
332
  """List resources that can be accessed by service connectors.
@@ -336,7 +334,7 @@ def list_service_connector_resources(
336
334
  Args:
337
335
  filter_model: The filter model to use when fetching service
338
336
  connectors.
339
- workspace_name_or_id: Optional name or ID of the workspace.
337
+ project_name_or_id: Optional name or ID of the project.
340
338
  auth_context: Authentication context.
341
339
 
342
340
  Returns:
@@ -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}" + SERVICES,
60
+ "/{project_name_or_id}" + SERVICES,
63
61
  responses={401: error_response, 409: error_response, 422: error_response},
64
62
  deprecated=True,
65
63
  tags=["services"],
@@ -67,21 +65,21 @@ router = APIRouter(
67
65
  @handle_exceptions
68
66
  def create_service(
69
67
  service: ServiceRequest,
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
  ) -> ServiceResponse:
73
71
  """Creates a new service.
74
72
 
75
73
  Args:
76
74
  service: The service 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 service.
81
79
  """
82
- if workspace_name_or_id:
83
- workspace = zen_store().get_workspace(workspace_name_or_id)
84
- service.workspace = workspace.id
80
+ if project_name_or_id:
81
+ project = zen_store().get_project(project_name_or_id)
82
+ service.project = project.id
85
83
 
86
84
  return verify_permissions_and_create_entity(
87
85
  request_model=service,
@@ -38,9 +38,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
38
38
  )
39
39
  from zenml.zen_server.rbac.models import Action, ResourceType
40
40
  from zenml.zen_server.rbac.utils import verify_permission_for_model
41
- from zenml.zen_server.routers.workspaces_endpoints import (
42
- router as workspace_router,
43
- )
41
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
44
42
  from zenml.zen_server.utils import (
45
43
  handle_exceptions,
46
44
  make_dependable,
@@ -67,7 +65,7 @@ types_router = APIRouter(
67
65
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
68
66
  # and can be removed after the migration
69
67
  @workspace_router.post(
70
- "/{workspace_name_or_id}" + STACK_COMPONENTS,
68
+ "/{project_name_or_id}" + STACK_COMPONENTS,
71
69
  responses={401: error_response, 409: error_response, 422: error_response},
72
70
  deprecated=True,
73
71
  tags=["stack_components"],
@@ -75,14 +73,14 @@ types_router = APIRouter(
75
73
  @handle_exceptions
76
74
  def create_stack_component(
77
75
  component: ComponentRequest,
78
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
76
+ project_name_or_id: Optional[Union[str, UUID]] = None,
79
77
  _: AuthContext = Security(authorize),
80
78
  ) -> ComponentResponse:
81
- """Creates a stack component, optionally in a specific workspace.
79
+ """Creates a stack component.
82
80
 
83
81
  Args:
84
82
  component: Stack component to register.
85
- workspace_name_or_id: Optional name or ID of the workspace.
83
+ project_name_or_id: Optional name or ID of the project.
86
84
 
87
85
  Returns:
88
86
  The created stack component.
@@ -117,7 +115,7 @@ def create_stack_component(
117
115
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
118
116
  # and can be removed after the migration
119
117
  @workspace_router.get(
120
- "/{workspace_name_or_id}" + STACK_COMPONENTS,
118
+ "/{project_name_or_id}" + STACK_COMPONENTS,
121
119
  responses={401: error_response, 404: error_response, 422: error_response},
122
120
  deprecated=True,
123
121
  tags=["stack_components"],
@@ -127,16 +125,16 @@ def list_stack_components(
127
125
  component_filter_model: ComponentFilter = Depends(
128
126
  make_dependable(ComponentFilter)
129
127
  ),
130
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
128
+ project_name_or_id: Optional[Union[str, UUID]] = None,
131
129
  hydrate: bool = False,
132
130
  _: AuthContext = Security(authorize),
133
131
  ) -> Page[ComponentResponse]:
134
- """Get a list of all stack components, optionally filtered by workspace.
132
+ """Get a list of all stack components.
135
133
 
136
134
  Args:
137
135
  component_filter_model: Filter model used for pagination, sorting,
138
136
  filtering.
139
- workspace_name_or_id: Optional name or ID of the workspace to filter by.
137
+ project_name_or_id: Optional name or ID of the project to filter by.
140
138
  hydrate: Flag deciding whether to hydrate the output model(s)
141
139
  by including metadata fields in the response.
142
140
 
@@ -40,9 +40,7 @@ from zenml.zen_server.rbac.utils import (
40
40
  verify_permission,
41
41
  verify_permission_for_model,
42
42
  )
43
- from zenml.zen_server.routers.workspaces_endpoints import (
44
- router as workspace_router,
45
- )
43
+ from zenml.zen_server.routers.projects_endpoints import workspace_router
46
44
  from zenml.zen_server.utils import (
47
45
  handle_exceptions,
48
46
  make_dependable,
@@ -63,7 +61,7 @@ router = APIRouter(
63
61
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
64
62
  # and can be removed after the migration
65
63
  @workspace_router.post(
66
- "/{workspace_name_or_id}" + STACKS,
64
+ "/{project_name_or_id}" + STACKS,
67
65
  responses={401: error_response, 409: error_response, 422: error_response},
68
66
  deprecated=True,
69
67
  tags=["stacks"],
@@ -71,14 +69,14 @@ router = APIRouter(
71
69
  @handle_exceptions
72
70
  def create_stack(
73
71
  stack: StackRequest,
74
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
72
+ project_name_or_id: Optional[Union[str, UUID]] = None,
75
73
  auth_context: AuthContext = Security(authorize),
76
74
  ) -> StackResponse:
77
- """Creates a stack, optionally in a specific workspace.
75
+ """Creates a stack.
78
76
 
79
77
  Args:
80
78
  stack: Stack to register.
81
- workspace_name_or_id: Optional name or ID of the workspace.
79
+ project_name_or_id: Optional name or ID of the project.
82
80
  auth_context: Authentication context.
83
81
 
84
82
  Returns:
@@ -133,22 +131,22 @@ def create_stack(
133
131
  # TODO: the workspace scoped endpoint is only kept for dashboard compatibility
134
132
  # and can be removed after the migration
135
133
  @workspace_router.get(
136
- "/{workspace_name_or_id}" + STACKS,
134
+ "/{project_name_or_id}" + STACKS,
137
135
  responses={401: error_response, 404: error_response, 422: error_response},
138
136
  deprecated=True,
139
137
  tags=["stacks"],
140
138
  )
141
139
  @handle_exceptions
142
140
  def list_stacks(
143
- workspace_name_or_id: Optional[Union[str, UUID]] = None,
141
+ project_name_or_id: Optional[Union[str, UUID]] = None,
144
142
  stack_filter_model: StackFilter = Depends(make_dependable(StackFilter)),
145
143
  hydrate: bool = False,
146
144
  _: AuthContext = Security(authorize),
147
145
  ) -> Page[StackResponse]:
148
- """Returns all stacks, optionally filtered by workspace.
146
+ """Returns all stacks.
149
147
 
150
148
  Args:
151
- workspace_name_or_id: Optional name or ID of the workspace to filter by.
149
+ project_name_or_id: Optional name or ID of the project to filter by.
152
150
  stack_filter_model: Filter model used for pagination, sorting,
153
151
  filtering.
154
152
  hydrate: Flag deciding whether to hydrate the output model(s)
@@ -50,7 +50,7 @@ from zenml.zen_server.rbac.utils import (
50
50
  from zenml.zen_server.utils import (
51
51
  handle_exceptions,
52
52
  make_dependable,
53
- set_filter_workspace_scope,
53
+ set_filter_project_scope,
54
54
  zen_store,
55
55
  )
56
56
 
@@ -85,14 +85,14 @@ def list_run_steps(
85
85
  Returns:
86
86
  The run steps according to query filters.
87
87
  """
88
- # A workspace scoped request must always be scoped to a specific
89
- # workspace. This is required for the RBAC check to work.
90
- set_filter_workspace_scope(step_run_filter_model)
91
- assert isinstance(step_run_filter_model.workspace, UUID)
88
+ # A project scoped request must always be scoped to a specific
89
+ # project. This is required for the RBAC check to work.
90
+ set_filter_project_scope(step_run_filter_model)
91
+ assert isinstance(step_run_filter_model.project, UUID)
92
92
 
93
93
  allowed_pipeline_run_ids = get_allowed_resource_ids(
94
94
  resource_type=ResourceType.PIPELINE_RUN,
95
- workspace_id=step_run_filter_model.workspace,
95
+ project_id=step_run_filter_model.project,
96
96
  )
97
97
  step_run_filter_model.configure_rbac(
98
98
  authenticated_user_id=auth_context.user.id,
@@ -33,12 +33,12 @@ 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,
39
40
  UserResponse,
40
41
  UserUpdate,
41
- WorkspaceScopedResponse,
42
42
  )
43
43
  from zenml.zen_server.auth import (
44
44
  AuthContext,
@@ -47,9 +47,6 @@ from zenml.zen_server.auth import (
47
47
  )
48
48
  from zenml.zen_server.exceptions import error_response
49
49
  from zenml.zen_server.rate_limit import RequestLimiter
50
- from zenml.zen_server.rbac.endpoint_utils import (
51
- verify_permissions_and_get_entity,
52
- )
53
50
  from zenml.zen_server.rbac.models import Action, Resource, ResourceType
54
51
  from zenml.zen_server.rbac.utils import (
55
52
  dehydrate_page,
@@ -757,12 +754,12 @@ if server_config().rbac_enabled:
757
754
  "not exist."
758
755
  )
759
756
 
760
- workspace_id = None
761
- if isinstance(model, WorkspaceScopedResponse):
762
- workspace_id = model.workspace.id
757
+ project_id = None
758
+ if isinstance(model, ProjectScopedResponse):
759
+ project_id = model.project.id
763
760
 
764
761
  resource = Resource(
765
- type=resource_type, id=resource_id, workspace_id=workspace_id
762
+ type=resource_type, id=resource_id, project_id=project_id
766
763
  )
767
764
 
768
765
  verify_permission_for_model(model=model, action=Action.SHARE)
@@ -776,38 +773,3 @@ if server_config().rbac_enabled:
776
773
  resource=resource,
777
774
  actions=[Action(action) for action in actions],
778
775
  )
779
-
780
-
781
- @current_user_router.put(
782
- "/default-workspace",
783
- responses={
784
- 401: error_response,
785
- 404: error_response,
786
- 422: error_response,
787
- },
788
- )
789
- @handle_exceptions
790
- def update_user_default_workspace(
791
- workspace_name_or_id: Union[str, UUID],
792
- auth_context: AuthContext = Security(authorize),
793
- ) -> UserResponse:
794
- """Updates the default workspace of the current user.
795
-
796
- Args:
797
- workspace_name_or_id: Name or ID of the workspace.
798
- auth_context: Authentication context.
799
-
800
- Returns:
801
- The updated user.
802
- """
803
- workspace = verify_permissions_and_get_entity(
804
- id=workspace_name_or_id,
805
- get_method=zen_store().get_workspace,
806
- )
807
-
808
- user = zen_store().update_user(
809
- user_id=auth_context.user.id,
810
- user_update=UserUpdate(default_workspace_id=workspace.id),
811
- )
812
-
813
- return dehydrate_response_model(user)
@@ -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,
@@ -407,7 +407,7 @@ def deployment_request_from_template(
407
407
  assert deployment.stack
408
408
  assert deployment.build
409
409
  deployment_request = PipelineDeploymentRequest(
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,7 +463,7 @@ def get_pipeline_run_analytics_metadata(
463
463
  }
464
464
 
465
465
  return {
466
- "workspace_id": deployment.workspace.id,
466
+ "project_id": deployment.project.id,
467
467
  "store_type": "rest", # This method is called from within a REST endpoint
468
468
  **stack_metadata,
469
469
  "total_steps": len(deployment.step_configurations),
zenml/zen_server/utils.py CHANGED
@@ -46,7 +46,7 @@ from zenml.constants import (
46
46
  from zenml.enums import StoreType
47
47
  from zenml.exceptions import IllegalOperationError, OAuthError
48
48
  from zenml.logger import get_logger
49
- from zenml.models.v2.base.scoped import WorkspaceScopedFilter
49
+ from zenml.models.v2.base.scoped import ProjectScopedFilter
50
50
  from zenml.plugins.plugin_flavor_registry import PluginFlavorRegistry
51
51
  from zenml.zen_server.cache import MemoryCache
52
52
  from zenml.zen_server.deploy.deployment import (
@@ -640,19 +640,19 @@ def get_zenml_headers() -> Dict[str, str]:
640
640
  return headers
641
641
 
642
642
 
643
- def set_filter_workspace_scope(
644
- filter_model: WorkspaceScopedFilter,
645
- workspace_name_or_id: Optional[Union[UUID, str]] = None,
643
+ def set_filter_project_scope(
644
+ filter_model: ProjectScopedFilter,
645
+ project_name_or_id: Optional[Union[UUID, str]] = None,
646
646
  ) -> None:
647
- """Set the workspace scope of the filter model.
647
+ """Set the project scope of the filter model.
648
648
 
649
649
  Args:
650
650
  filter_model: The filter model to set the scope for.
651
- workspace_name_or_id: The workspace to set the scope for. If not
652
- provided, the workspace scope is determined from the request
653
- workspace filter or the default workspace, in that order.
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
654
  """
655
- zen_store().set_filter_workspace_id(
655
+ zen_store().set_filter_project_id(
656
656
  filter_model=filter_model,
657
- workspace_name_or_id=workspace_name_or_id,
657
+ project_name_or_id=project_name_or_id,
658
658
  )
@@ -73,6 +73,7 @@ from zenml.zen_server.routers import (
73
73
  pipeline_deployments_endpoints,
74
74
  pipelines_endpoints,
75
75
  plugin_endpoints,
76
+ projects_endpoints,
76
77
  run_metadata_endpoints,
77
78
  run_templates_endpoints,
78
79
  runs_endpoints,
@@ -91,7 +92,6 @@ from zenml.zen_server.routers import (
91
92
  triggers_endpoints,
92
93
  users_endpoints,
93
94
  webhook_endpoints,
94
- workspaces_endpoints,
95
95
  )
96
96
  from zenml.zen_server.secure_headers import (
97
97
  initialize_secure_headers,
@@ -495,7 +495,8 @@ app.include_router(triggers_endpoints.router)
495
495
  app.include_router(users_endpoints.router)
496
496
  app.include_router(users_endpoints.current_user_router)
497
497
  app.include_router(webhook_endpoints.router)
498
- app.include_router(workspaces_endpoints.router)
498
+ app.include_router(projects_endpoints.workspace_router)
499
+ app.include_router(projects_endpoints.router)
499
500
 
500
501
  # When the auth scheme is set to EXTERNAL, users cannot be managed via the
501
502
  # API.