zenml-nightly 0.75.0.dev20250313__py3-none-any.whl → 0.75.0.dev20250315__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 (145) 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/login.py +21 -18
  9. zenml/cli/pipeline.py +3 -3
  10. zenml/cli/project.py +172 -0
  11. zenml/cli/server.py +5 -5
  12. zenml/cli/service_accounts.py +0 -1
  13. zenml/cli/service_connectors.py +15 -16
  14. zenml/cli/stack.py +0 -2
  15. zenml/cli/stack_components.py +2 -2
  16. zenml/cli/utils.py +3 -3
  17. zenml/client.py +352 -341
  18. zenml/config/global_config.py +41 -43
  19. zenml/config/server_config.py +9 -9
  20. zenml/constants.py +5 -3
  21. zenml/event_hub/event_hub.py +1 -1
  22. zenml/integrations/gcp/__init__.py +1 -0
  23. zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +5 -0
  24. zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +5 -28
  25. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +125 -78
  26. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
  27. zenml/integrations/gcp/vertex_custom_job_parameters.py +50 -0
  28. zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
  29. zenml/integrations/wandb/__init__.py +1 -1
  30. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
  31. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +2 -0
  32. zenml/login/credentials.py +26 -27
  33. zenml/login/credentials_store.py +5 -5
  34. zenml/login/pro/client.py +9 -9
  35. zenml/login/pro/utils.py +8 -8
  36. zenml/login/pro/{tenant → workspace}/__init__.py +1 -1
  37. zenml/login/pro/{tenant → workspace}/client.py +25 -25
  38. zenml/login/pro/{tenant → workspace}/models.py +27 -28
  39. zenml/model/model.py +2 -2
  40. zenml/model_registries/base_model_registry.py +1 -1
  41. zenml/models/__init__.py +29 -29
  42. zenml/models/v2/base/filter.py +1 -1
  43. zenml/models/v2/base/scoped.py +49 -53
  44. zenml/models/v2/core/action.py +12 -12
  45. zenml/models/v2/core/artifact.py +15 -15
  46. zenml/models/v2/core/artifact_version.py +15 -15
  47. zenml/models/v2/core/code_repository.py +12 -12
  48. zenml/models/v2/core/event_source.py +12 -12
  49. zenml/models/v2/core/model.py +26 -18
  50. zenml/models/v2/core/model_version.py +15 -15
  51. zenml/models/v2/core/pipeline.py +15 -15
  52. zenml/models/v2/core/pipeline_build.py +14 -14
  53. zenml/models/v2/core/pipeline_deployment.py +12 -14
  54. zenml/models/v2/core/pipeline_run.py +16 -16
  55. zenml/models/v2/core/project.py +203 -0
  56. zenml/models/v2/core/run_metadata.py +2 -2
  57. zenml/models/v2/core/run_template.py +15 -15
  58. zenml/models/v2/core/schedule.py +12 -12
  59. zenml/models/v2/core/secret.py +1 -1
  60. zenml/models/v2/core/service.py +14 -14
  61. zenml/models/v2/core/step_run.py +13 -13
  62. zenml/models/v2/core/tag.py +96 -3
  63. zenml/models/v2/core/trigger.py +13 -13
  64. zenml/models/v2/core/trigger_execution.py +2 -2
  65. zenml/models/v2/core/user.py +0 -17
  66. zenml/models/v2/misc/server_models.py +6 -6
  67. zenml/models/v2/misc/statistics.py +4 -4
  68. zenml/orchestrators/cache_utils.py +7 -7
  69. zenml/orchestrators/input_utils.py +1 -1
  70. zenml/orchestrators/step_launcher.py +1 -1
  71. zenml/orchestrators/step_run_utils.py +3 -3
  72. zenml/orchestrators/utils.py +4 -4
  73. zenml/pipelines/build_utils.py +2 -2
  74. zenml/pipelines/pipeline_definition.py +5 -5
  75. zenml/pipelines/run_utils.py +1 -1
  76. zenml/service_connectors/service_connector.py +0 -3
  77. zenml/service_connectors/service_connector_utils.py +0 -1
  78. zenml/stack/stack.py +0 -1
  79. zenml/steps/base_step.py +10 -2
  80. zenml/utils/dashboard_utils.py +1 -1
  81. zenml/utils/tag_utils.py +0 -12
  82. zenml/zen_server/cloud_utils.py +3 -3
  83. zenml/zen_server/feature_gate/endpoint_utils.py +1 -1
  84. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
  85. zenml/zen_server/rbac/endpoint_utils.py +17 -17
  86. zenml/zen_server/rbac/models.py +47 -22
  87. zenml/zen_server/rbac/rbac_sql_zen_store.py +3 -3
  88. zenml/zen_server/rbac/utils.py +23 -25
  89. zenml/zen_server/rbac/zenml_cloud_rbac.py +7 -74
  90. zenml/zen_server/routers/artifact_version_endpoints.py +10 -10
  91. zenml/zen_server/routers/auth_endpoints.py +6 -6
  92. zenml/zen_server/routers/code_repositories_endpoints.py +12 -14
  93. zenml/zen_server/routers/model_versions_endpoints.py +13 -15
  94. zenml/zen_server/routers/models_endpoints.py +7 -9
  95. zenml/zen_server/routers/pipeline_builds_endpoints.py +14 -16
  96. zenml/zen_server/routers/pipeline_deployments_endpoints.py +13 -15
  97. zenml/zen_server/routers/pipelines_endpoints.py +16 -18
  98. zenml/zen_server/routers/{workspaces_endpoints.py → projects_endpoints.py} +111 -68
  99. zenml/zen_server/routers/run_metadata_endpoints.py +7 -9
  100. zenml/zen_server/routers/run_templates_endpoints.py +15 -17
  101. zenml/zen_server/routers/runs_endpoints.py +12 -14
  102. zenml/zen_server/routers/schedule_endpoints.py +12 -14
  103. zenml/zen_server/routers/secrets_endpoints.py +1 -3
  104. zenml/zen_server/routers/server_endpoints.py +7 -7
  105. zenml/zen_server/routers/service_connectors_endpoints.py +11 -13
  106. zenml/zen_server/routers/service_endpoints.py +7 -9
  107. zenml/zen_server/routers/stack_components_endpoints.py +9 -11
  108. zenml/zen_server/routers/stacks_endpoints.py +9 -11
  109. zenml/zen_server/routers/steps_endpoints.py +6 -6
  110. zenml/zen_server/routers/users_endpoints.py +5 -43
  111. zenml/zen_server/template_execution/utils.py +4 -4
  112. zenml/zen_server/utils.py +10 -10
  113. zenml/zen_server/zen_server_api.py +6 -5
  114. zenml/zen_stores/base_zen_store.py +38 -42
  115. zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
  116. zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +3 -3
  117. zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
  118. zenml/zen_stores/rest_zen_store.py +55 -63
  119. zenml/zen_stores/schemas/__init__.py +2 -2
  120. zenml/zen_stores/schemas/action_schemas.py +9 -9
  121. zenml/zen_stores/schemas/artifact_schemas.py +15 -17
  122. zenml/zen_stores/schemas/code_repository_schemas.py +16 -18
  123. zenml/zen_stores/schemas/event_source_schemas.py +9 -9
  124. zenml/zen_stores/schemas/model_schemas.py +15 -17
  125. zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
  126. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  127. zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -9
  128. zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
  129. zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +47 -41
  130. zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
  131. zenml/zen_stores/schemas/run_template_schemas.py +9 -9
  132. zenml/zen_stores/schemas/schedule_schema.py +9 -9
  133. zenml/zen_stores/schemas/service_schemas.py +7 -7
  134. zenml/zen_stores/schemas/step_run_schemas.py +7 -7
  135. zenml/zen_stores/schemas/trigger_schemas.py +9 -9
  136. zenml/zen_stores/schemas/user_schemas.py +0 -12
  137. zenml/zen_stores/sql_zen_store.py +318 -275
  138. zenml/zen_stores/zen_store_interface.py +56 -70
  139. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/METADATA +1 -1
  140. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/RECORD +143 -140
  141. zenml/cli/workspace.py +0 -160
  142. zenml/models/v2/core/workspace.py +0 -131
  143. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/LICENSE +0 -0
  144. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/WHEEL +0 -0
  145. {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,768 @@
1
+ """rename workspace to project [12eff0206201].
2
+
3
+ Revision ID: 12eff0206201
4
+ Revises: cbc6acd71f92
5
+ Create Date: 2025-03-12 22:34:29.670973
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ import sqlmodel
11
+ from alembic import op
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "12eff0206201"
15
+ down_revision = "cbc6acd71f92"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ """Upgrade database schema and/or data, creating a new revision."""
22
+ # Create the new project table first
23
+ op.create_table(
24
+ "project",
25
+ sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False),
26
+ sa.Column("created", sa.DateTime(), nullable=False),
27
+ sa.Column("updated", sa.DateTime(), nullable=False),
28
+ sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
29
+ sa.Column(
30
+ "display_name", sqlmodel.sql.sqltypes.AutoString(), nullable=False
31
+ ),
32
+ sa.Column(
33
+ "description", sqlmodel.sql.sqltypes.AutoString(), nullable=False
34
+ ),
35
+ sa.PrimaryKeyConstraint("id"),
36
+ sa.UniqueConstraint("name", name="unique_project_name"),
37
+ )
38
+
39
+ # Copy data from workspace to project
40
+ op.execute(
41
+ """
42
+ INSERT INTO `project` (id, created, updated, name, display_name, description)
43
+ SELECT id, created, updated, name, display_name, description
44
+ FROM `workspace`
45
+ """
46
+ )
47
+
48
+ # For each table that needs migration, we'll:
49
+ # 1. Add new column as nullable
50
+ # 2. Copy data
51
+ # 3. Make column non-nullable and add constraints
52
+
53
+ # Example for one table (repeat pattern for others)
54
+ with op.batch_alter_table("action", schema=None) as batch_op:
55
+ # Phase 1: Add new column as nullable
56
+ batch_op.add_column(
57
+ sa.Column(
58
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
59
+ )
60
+ )
61
+
62
+ # Phase 2: Copy data
63
+ op.execute(
64
+ """
65
+ UPDATE `action`
66
+ SET project_id = workspace_id
67
+ """
68
+ )
69
+
70
+ # Phase 3: Add constraints and drop old column
71
+ with op.batch_alter_table("action", schema=None) as batch_op:
72
+ batch_op.alter_column(
73
+ "project_id",
74
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
75
+ nullable=False,
76
+ )
77
+ batch_op.drop_constraint(
78
+ "unique_action_name_in_workspace", type_="unique"
79
+ )
80
+ batch_op.create_unique_constraint(
81
+ "unique_action_name_in_project", ["name", "project_id"]
82
+ )
83
+ batch_op.drop_constraint(
84
+ "fk_action_workspace_id_workspace", type_="foreignkey"
85
+ )
86
+ batch_op.create_foreign_key(
87
+ "fk_action_project_id_project",
88
+ "project",
89
+ ["project_id"],
90
+ ["id"],
91
+ ondelete="CASCADE",
92
+ )
93
+ batch_op.drop_column("workspace_id")
94
+
95
+ with op.batch_alter_table("artifact", schema=None) as batch_op:
96
+ # Phase 1: Add new column as nullable
97
+ batch_op.add_column(
98
+ sa.Column(
99
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
100
+ )
101
+ )
102
+
103
+ # Phase 2: Copy data
104
+ op.execute(
105
+ """
106
+ UPDATE `artifact`
107
+ SET project_id = workspace_id
108
+ """
109
+ )
110
+
111
+ # Phase 3: Add constraints and drop old column
112
+ with op.batch_alter_table("artifact", schema=None) as batch_op:
113
+ batch_op.alter_column(
114
+ "project_id",
115
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
116
+ nullable=False,
117
+ )
118
+ batch_op.drop_constraint(
119
+ "unique_artifact_name_in_workspace", type_="unique"
120
+ )
121
+ batch_op.create_unique_constraint(
122
+ "unique_artifact_name_in_project", ["name", "project_id"]
123
+ )
124
+ batch_op.drop_constraint(
125
+ "fk_artifact_workspace_id_workspace", type_="foreignkey"
126
+ )
127
+ batch_op.create_foreign_key(
128
+ "fk_artifact_project_id_project",
129
+ "project",
130
+ ["project_id"],
131
+ ["id"],
132
+ ondelete="CASCADE",
133
+ )
134
+ batch_op.drop_column("workspace_id")
135
+
136
+ with op.batch_alter_table("artifact_version", schema=None) as batch_op:
137
+ # Phase 1: Add new column as nullable
138
+ batch_op.add_column(
139
+ sa.Column(
140
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
141
+ )
142
+ )
143
+
144
+ # Phase 2: Copy data
145
+ op.execute(
146
+ """
147
+ UPDATE `artifact_version`
148
+ SET project_id = workspace_id
149
+ """
150
+ )
151
+
152
+ # Phase 3: Add constraints and drop old column
153
+ with op.batch_alter_table("artifact_version", schema=None) as batch_op:
154
+ batch_op.alter_column(
155
+ "project_id",
156
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
157
+ nullable=False,
158
+ )
159
+ batch_op.drop_constraint(
160
+ "fk_artifact_version_workspace_id_workspace", type_="foreignkey"
161
+ )
162
+ batch_op.create_foreign_key(
163
+ "fk_artifact_version_project_id_project",
164
+ "project",
165
+ ["project_id"],
166
+ ["id"],
167
+ ondelete="CASCADE",
168
+ )
169
+ batch_op.drop_column("workspace_id")
170
+
171
+ with op.batch_alter_table("code_reference", schema=None) as batch_op:
172
+ # Phase 1: Add new column as nullable
173
+ batch_op.add_column(
174
+ sa.Column(
175
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
176
+ )
177
+ )
178
+
179
+ # Phase 2: Copy data
180
+ op.execute(
181
+ """
182
+ UPDATE `code_reference`
183
+ SET project_id = workspace_id
184
+ """
185
+ )
186
+
187
+ # Phase 3: Add constraints and drop old column
188
+ with op.batch_alter_table("code_reference", schema=None) as batch_op:
189
+ batch_op.alter_column(
190
+ "project_id",
191
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
192
+ nullable=False,
193
+ )
194
+ batch_op.drop_constraint(
195
+ "fk_code_reference_workspace_id_workspace", type_="foreignkey"
196
+ )
197
+ batch_op.create_foreign_key(
198
+ "fk_code_reference_project_id_project",
199
+ "project",
200
+ ["project_id"],
201
+ ["id"],
202
+ ondelete="CASCADE",
203
+ )
204
+ batch_op.drop_column("workspace_id")
205
+
206
+ with op.batch_alter_table("code_repository", schema=None) as batch_op:
207
+ # Phase 1: Add new column as nullable
208
+ batch_op.add_column(
209
+ sa.Column(
210
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
211
+ )
212
+ )
213
+
214
+ # Phase 2: Copy data
215
+ op.execute(
216
+ """
217
+ UPDATE `code_repository`
218
+ SET project_id = workspace_id
219
+ """
220
+ )
221
+
222
+ # Phase 3: Add constraints and drop old column
223
+ with op.batch_alter_table("code_repository", schema=None) as batch_op:
224
+ batch_op.alter_column(
225
+ "project_id",
226
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
227
+ nullable=False,
228
+ )
229
+ batch_op.drop_constraint(
230
+ "unique_code_repository_name_in_workspace", type_="unique"
231
+ )
232
+ batch_op.create_unique_constraint(
233
+ "unique_code_repository_name_in_project", ["name", "project_id"]
234
+ )
235
+ batch_op.drop_constraint(
236
+ "fk_code_repository_workspace_id_workspace", type_="foreignkey"
237
+ )
238
+ batch_op.create_foreign_key(
239
+ "fk_code_repository_project_id_project",
240
+ "project",
241
+ ["project_id"],
242
+ ["id"],
243
+ ondelete="CASCADE",
244
+ )
245
+ batch_op.drop_column("workspace_id")
246
+
247
+ with op.batch_alter_table("event_source", schema=None) as batch_op:
248
+ # Phase 1: Add new column as nullable
249
+ batch_op.add_column(
250
+ sa.Column(
251
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
252
+ )
253
+ )
254
+
255
+ # Phase 2: Copy data
256
+ op.execute(
257
+ """
258
+ UPDATE `event_source`
259
+ SET project_id = workspace_id
260
+ """
261
+ )
262
+
263
+ # Phase 3: Add constraints and drop old column
264
+ with op.batch_alter_table("event_source", schema=None) as batch_op:
265
+ batch_op.alter_column(
266
+ "project_id",
267
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
268
+ nullable=False,
269
+ )
270
+ batch_op.drop_constraint(
271
+ "unique_event_source_name_in_workspace", type_="unique"
272
+ )
273
+ batch_op.create_unique_constraint(
274
+ "unique_event_source_name_in_project", ["name", "project_id"]
275
+ )
276
+ batch_op.drop_constraint(
277
+ "fk_event_source_workspace_id_workspace", type_="foreignkey"
278
+ )
279
+ batch_op.create_foreign_key(
280
+ "fk_event_source_project_id_project",
281
+ "project",
282
+ ["project_id"],
283
+ ["id"],
284
+ ondelete="CASCADE",
285
+ )
286
+ batch_op.drop_column("workspace_id")
287
+
288
+ with op.batch_alter_table("model", schema=None) as batch_op:
289
+ # Phase 1: Add new column as nullable
290
+ batch_op.add_column(
291
+ sa.Column(
292
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
293
+ )
294
+ )
295
+
296
+ # Phase 2: Copy data
297
+ op.execute(
298
+ """
299
+ UPDATE `model`
300
+ SET project_id = workspace_id
301
+ """
302
+ )
303
+
304
+ # Phase 3: Add constraints and drop old column
305
+ with op.batch_alter_table("model", schema=None) as batch_op:
306
+ batch_op.alter_column(
307
+ "project_id",
308
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
309
+ nullable=False,
310
+ )
311
+ batch_op.drop_constraint(
312
+ "unique_model_name_in_workspace", type_="unique"
313
+ )
314
+ batch_op.create_unique_constraint(
315
+ "unique_model_name_in_project", ["name", "project_id"]
316
+ )
317
+ batch_op.drop_constraint(
318
+ "fk_model_workspace_id_workspace", type_="foreignkey"
319
+ )
320
+ batch_op.create_foreign_key(
321
+ "fk_model_project_id_project",
322
+ "project",
323
+ ["project_id"],
324
+ ["id"],
325
+ ondelete="CASCADE",
326
+ )
327
+ batch_op.drop_column("workspace_id")
328
+
329
+ with op.batch_alter_table("model_version", schema=None) as batch_op:
330
+ # Phase 1: Add new column as nullable
331
+ batch_op.add_column(
332
+ sa.Column(
333
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
334
+ )
335
+ )
336
+
337
+ # Phase 2: Copy data
338
+ op.execute(
339
+ """
340
+ UPDATE `model_version`
341
+ SET project_id = workspace_id
342
+ """
343
+ )
344
+
345
+ # Phase 3: Add constraints and drop old column
346
+ with op.batch_alter_table("model_version", schema=None) as batch_op:
347
+ batch_op.alter_column(
348
+ "project_id",
349
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
350
+ nullable=False,
351
+ )
352
+ batch_op.drop_constraint(
353
+ "fk_model_version_workspace_id_workspace", type_="foreignkey"
354
+ )
355
+ batch_op.create_foreign_key(
356
+ "fk_model_version_project_id_project",
357
+ "project",
358
+ ["project_id"],
359
+ ["id"],
360
+ ondelete="CASCADE",
361
+ )
362
+ batch_op.drop_column("workspace_id")
363
+
364
+ with op.batch_alter_table("pipeline", schema=None) as batch_op:
365
+ # Phase 1: Add new column as nullable
366
+ batch_op.add_column(
367
+ sa.Column(
368
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
369
+ )
370
+ )
371
+
372
+ # Phase 2: Copy data
373
+ op.execute(
374
+ """
375
+ UPDATE `pipeline`
376
+ SET project_id = workspace_id
377
+ """
378
+ )
379
+
380
+ # Phase 3: Add constraints and drop old column
381
+ with op.batch_alter_table("pipeline", schema=None) as batch_op:
382
+ batch_op.alter_column(
383
+ "project_id",
384
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
385
+ nullable=False,
386
+ )
387
+ batch_op.drop_constraint(
388
+ "unique_pipeline_name_in_workspace", type_="unique"
389
+ )
390
+ batch_op.create_unique_constraint(
391
+ "unique_pipeline_name_in_project", ["name", "project_id"]
392
+ )
393
+ batch_op.drop_constraint(
394
+ "fk_pipeline_workspace_id_workspace", type_="foreignkey"
395
+ )
396
+ batch_op.create_foreign_key(
397
+ "fk_pipeline_project_id_project",
398
+ "project",
399
+ ["project_id"],
400
+ ["id"],
401
+ ondelete="CASCADE",
402
+ )
403
+ batch_op.drop_column("workspace_id")
404
+
405
+ # pipeline_build table
406
+ with op.batch_alter_table("pipeline_build", schema=None) as batch_op:
407
+ # Phase 1: Add new column as nullable
408
+ batch_op.add_column(
409
+ sa.Column(
410
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
411
+ )
412
+ )
413
+
414
+ # Phase 2: Copy data
415
+ op.execute(
416
+ """
417
+ UPDATE `pipeline_build`
418
+ SET project_id = workspace_id
419
+ """
420
+ )
421
+
422
+ # Phase 3: Add constraints and drop old column
423
+ with op.batch_alter_table("pipeline_build", schema=None) as batch_op:
424
+ batch_op.alter_column(
425
+ "project_id",
426
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
427
+ nullable=False,
428
+ )
429
+ batch_op.drop_constraint(
430
+ "fk_pipeline_build_workspace_id_workspace", type_="foreignkey"
431
+ )
432
+ batch_op.create_foreign_key(
433
+ "fk_pipeline_build_project_id_project",
434
+ "project",
435
+ ["project_id"],
436
+ ["id"],
437
+ ondelete="CASCADE",
438
+ )
439
+ batch_op.drop_column("workspace_id")
440
+
441
+ # pipeline_deployment table
442
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
443
+ # Phase 1: Add new column as nullable
444
+ batch_op.add_column(
445
+ sa.Column(
446
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
447
+ )
448
+ )
449
+
450
+ # Phase 2: Copy data
451
+ op.execute(
452
+ """
453
+ UPDATE `pipeline_deployment`
454
+ SET project_id = workspace_id
455
+ """
456
+ )
457
+
458
+ # Phase 3: Add constraints and drop old column
459
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
460
+ batch_op.alter_column(
461
+ "project_id",
462
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
463
+ nullable=False,
464
+ )
465
+ batch_op.drop_constraint(
466
+ "fk_pipeline_deployment_workspace_id_workspace", type_="foreignkey"
467
+ )
468
+ batch_op.create_foreign_key(
469
+ "fk_pipeline_deployment_project_id_project",
470
+ "project",
471
+ ["project_id"],
472
+ ["id"],
473
+ ondelete="CASCADE",
474
+ )
475
+ batch_op.drop_column("workspace_id")
476
+
477
+ # pipeline_run table
478
+ with op.batch_alter_table("pipeline_run", schema=None) as batch_op:
479
+ # Phase 1: Add new column as nullable
480
+ batch_op.add_column(
481
+ sa.Column(
482
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
483
+ )
484
+ )
485
+
486
+ # Phase 2: Copy data
487
+ op.execute(
488
+ """
489
+ UPDATE `pipeline_run`
490
+ SET project_id = workspace_id
491
+ """
492
+ )
493
+
494
+ # Phase 3: Add constraints and drop old column
495
+ with op.batch_alter_table("pipeline_run", schema=None) as batch_op:
496
+ batch_op.alter_column(
497
+ "project_id",
498
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
499
+ nullable=False,
500
+ )
501
+ batch_op.drop_constraint(
502
+ "unique_run_name_in_workspace", type_="unique"
503
+ )
504
+ batch_op.create_unique_constraint(
505
+ "unique_run_name_in_project", ["name", "project_id"]
506
+ )
507
+ batch_op.drop_constraint(
508
+ "fk_pipeline_run_workspace_id_workspace", type_="foreignkey"
509
+ )
510
+ batch_op.create_foreign_key(
511
+ "fk_pipeline_run_project_id_project",
512
+ "project",
513
+ ["project_id"],
514
+ ["id"],
515
+ ondelete="CASCADE",
516
+ )
517
+ batch_op.drop_column("workspace_id")
518
+
519
+ # run_metadata table
520
+ with op.batch_alter_table("run_metadata", schema=None) as batch_op:
521
+ # Phase 1: Add new column as nullable
522
+ batch_op.add_column(
523
+ sa.Column(
524
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
525
+ )
526
+ )
527
+
528
+ # Phase 2: Copy data
529
+ op.execute(
530
+ """
531
+ UPDATE `run_metadata`
532
+ SET project_id = workspace_id
533
+ """
534
+ )
535
+
536
+ # Phase 3: Add constraints and drop old column
537
+ with op.batch_alter_table("run_metadata", schema=None) as batch_op:
538
+ batch_op.alter_column(
539
+ "project_id",
540
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
541
+ nullable=False,
542
+ )
543
+ batch_op.drop_constraint(
544
+ "fk_run_metadata_workspace_id_workspace", type_="foreignkey"
545
+ )
546
+ batch_op.create_foreign_key(
547
+ "fk_run_metadata_project_id_project",
548
+ "project",
549
+ ["project_id"],
550
+ ["id"],
551
+ ondelete="CASCADE",
552
+ )
553
+ batch_op.drop_column("workspace_id")
554
+
555
+ # run_template table
556
+ with op.batch_alter_table("run_template", schema=None) as batch_op:
557
+ # Phase 1: Add new column as nullable
558
+ batch_op.add_column(
559
+ sa.Column(
560
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
561
+ )
562
+ )
563
+
564
+ # Phase 2: Copy data
565
+ op.execute(
566
+ """
567
+ UPDATE `run_template`
568
+ SET project_id = workspace_id
569
+ """
570
+ )
571
+
572
+ # Phase 3: Add constraints and drop old column
573
+ with op.batch_alter_table("run_template", schema=None) as batch_op:
574
+ batch_op.alter_column(
575
+ "project_id",
576
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
577
+ nullable=False,
578
+ )
579
+ batch_op.drop_constraint(
580
+ "unique_template_name_in_workspace", type_="unique"
581
+ )
582
+ batch_op.create_unique_constraint(
583
+ "unique_template_name_in_project", ["name", "project_id"]
584
+ )
585
+ batch_op.drop_constraint(
586
+ "fk_run_template_workspace_id_workspace", type_="foreignkey"
587
+ )
588
+ batch_op.create_foreign_key(
589
+ "fk_run_template_project_id_project",
590
+ "project",
591
+ ["project_id"],
592
+ ["id"],
593
+ ondelete="CASCADE",
594
+ )
595
+ batch_op.drop_column("workspace_id")
596
+
597
+ # schedule table
598
+ with op.batch_alter_table("schedule", schema=None) as batch_op:
599
+ # Phase 1: Add new column as nullable
600
+ batch_op.add_column(
601
+ sa.Column(
602
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
603
+ )
604
+ )
605
+
606
+ # Phase 2: Copy data
607
+ op.execute(
608
+ """
609
+ UPDATE `schedule`
610
+ SET project_id = workspace_id
611
+ """
612
+ )
613
+
614
+ # Phase 3: Add constraints and drop old column
615
+ with op.batch_alter_table("schedule", schema=None) as batch_op:
616
+ batch_op.alter_column(
617
+ "project_id",
618
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
619
+ nullable=False,
620
+ )
621
+ batch_op.drop_constraint(
622
+ "unique_schedule_name_in_workspace", type_="unique"
623
+ )
624
+ batch_op.create_unique_constraint(
625
+ "unique_schedule_name_in_project", ["name", "project_id"]
626
+ )
627
+ batch_op.drop_constraint(
628
+ "fk_schedule_workspace_id_workspace", type_="foreignkey"
629
+ )
630
+ batch_op.create_foreign_key(
631
+ "fk_schedule_project_id_project",
632
+ "project",
633
+ ["project_id"],
634
+ ["id"],
635
+ ondelete="CASCADE",
636
+ )
637
+ batch_op.drop_column("workspace_id")
638
+
639
+ # service table
640
+ with op.batch_alter_table("service", schema=None) as batch_op:
641
+ # Phase 1: Add new column as nullable
642
+ batch_op.add_column(
643
+ sa.Column(
644
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
645
+ )
646
+ )
647
+
648
+ # Phase 2: Copy data
649
+ op.execute(
650
+ """
651
+ UPDATE `service`
652
+ SET project_id = workspace_id
653
+ """
654
+ )
655
+
656
+ # Phase 3: Add constraints and drop old column
657
+ with op.batch_alter_table("service", schema=None) as batch_op:
658
+ batch_op.alter_column(
659
+ "project_id",
660
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
661
+ nullable=False,
662
+ )
663
+ batch_op.drop_constraint(
664
+ "fk_service_workspace_id_workspace", type_="foreignkey"
665
+ )
666
+ batch_op.create_foreign_key(
667
+ "fk_service_project_id_project",
668
+ "project",
669
+ ["project_id"],
670
+ ["id"],
671
+ ondelete="CASCADE",
672
+ )
673
+ batch_op.drop_column("workspace_id")
674
+
675
+ # step_run table
676
+ with op.batch_alter_table("step_run", schema=None) as batch_op:
677
+ # Phase 1: Add new column as nullable
678
+ batch_op.add_column(
679
+ sa.Column(
680
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
681
+ )
682
+ )
683
+
684
+ # Phase 2: Copy data
685
+ op.execute(
686
+ """
687
+ UPDATE `step_run`
688
+ SET project_id = workspace_id
689
+ """
690
+ )
691
+
692
+ # Phase 3: Add constraints and drop old column
693
+ with op.batch_alter_table("step_run", schema=None) as batch_op:
694
+ batch_op.alter_column(
695
+ "project_id",
696
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
697
+ nullable=False,
698
+ )
699
+ batch_op.drop_constraint(
700
+ "fk_step_run_workspace_id_workspace", type_="foreignkey"
701
+ )
702
+ batch_op.create_foreign_key(
703
+ "fk_step_run_project_id_project",
704
+ "project",
705
+ ["project_id"],
706
+ ["id"],
707
+ ondelete="CASCADE",
708
+ )
709
+ batch_op.drop_column("workspace_id")
710
+
711
+ # trigger table
712
+ with op.batch_alter_table("trigger", schema=None) as batch_op:
713
+ # Phase 1: Add new column as nullable
714
+ batch_op.add_column(
715
+ sa.Column(
716
+ "project_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
717
+ )
718
+ )
719
+
720
+ # Phase 2: Copy data
721
+ op.execute(
722
+ """
723
+ UPDATE `trigger`
724
+ SET project_id = workspace_id
725
+ """
726
+ )
727
+
728
+ # Phase 3: Add constraints and drop old column
729
+ with op.batch_alter_table("trigger", schema=None) as batch_op:
730
+ batch_op.alter_column(
731
+ "project_id",
732
+ existing_type=sqlmodel.sql.sqltypes.GUID(),
733
+ nullable=False,
734
+ )
735
+ batch_op.drop_constraint(
736
+ "unique_trigger_name_in_workspace", type_="unique"
737
+ )
738
+ batch_op.create_unique_constraint(
739
+ "unique_trigger_name_in_project", ["name", "project_id"]
740
+ )
741
+ batch_op.drop_constraint(
742
+ "fk_trigger_workspace_id_workspace", type_="foreignkey"
743
+ )
744
+ batch_op.create_foreign_key(
745
+ "fk_trigger_project_id_project",
746
+ "project",
747
+ ["project_id"],
748
+ ["id"],
749
+ ondelete="CASCADE",
750
+ )
751
+ batch_op.drop_column("workspace_id")
752
+
753
+ with op.batch_alter_table("user", schema=None) as batch_op:
754
+ batch_op.drop_constraint(
755
+ "fk_user_default_workspace_id_workspace", type_="foreignkey"
756
+ )
757
+ batch_op.drop_column("default_workspace_id")
758
+
759
+ op.drop_table("workspace")
760
+
761
+
762
+ def downgrade() -> None:
763
+ """Downgrade database schema and/or data back to the previous revision.
764
+
765
+ Raises:
766
+ NotImplementedError: Downgrade is not implemented
767
+ """
768
+ raise NotImplementedError("Downgrade is not implemented")