diff --git a/.nextchanges/bundles/depends-on.md b/.nextchanges/bundles/depends-on.md new file mode 100644 index 00000000000..313194213dc --- /dev/null +++ b/.nextchanges/bundles/depends-on.md @@ -0,0 +1 @@ +* Added `lifecycle.depends_on` to order resources without referencing their fields. ([#7120](https://github.com/databricks/cli/pull/7120)) diff --git a/acceptance/bundle/lifecycle/depends-on-validation/databricks.yml b/acceptance/bundle/lifecycle/depends-on-validation/databricks.yml new file mode 100644 index 00000000000..a8a4ab0bc43 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on-validation/databricks.yml @@ -0,0 +1,25 @@ +bundle: + name: test-bundle + +resources: + jobs: + a_job: + name: a_job + lifecycle: + depends_on: + - resource: a_job + - resource: missing + b_job: + name: b_job + lifecycle: + depends_on: + - resource: a.b.c + # lifecycle is a separate type on job_runs. + job_runs: + a_run: + job_id: ${resources.jobs.b_job.id} + lifecycle: + triggers: + - on_bundle_deploy: true + depends_on: + - resource: missing_for_run diff --git a/acceptance/bundle/lifecycle/depends-on-validation/out.test.toml b/acceptance/bundle/lifecycle/depends-on-validation/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on-validation/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/lifecycle/depends-on-validation/output.txt b/acceptance/bundle/lifecycle/depends-on-validation/output.txt new file mode 100644 index 00000000000..cad3d4fc5fe --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on-validation/output.txt @@ -0,0 +1,23 @@ +Error: invalid lifecycle.depends_on: no such resource: missing_for_run + at resources.job_runs.a_run.lifecycle.depends_on[0].resource + in databricks.yml:25:23 + +Error: invalid lifecycle.depends_on: resource "a_job" cannot depend on itself + at resources.jobs.a_job.lifecycle.depends_on[0].resource + in databricks.yml:10:23 + +Error: invalid lifecycle.depends_on: no such resource: missing + at resources.jobs.a_job.lifecycle.depends_on[1].resource + in databricks.yml:11:23 + +Error: invalid lifecycle.depends_on: no such resource: a.b.c + at resources.jobs.b_job.lifecycle.depends_on[0].resource + in databricks.yml:16:23 + +Name: test-bundle +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default + +Found 4 errors diff --git a/acceptance/bundle/lifecycle/depends-on-validation/script b/acceptance/bundle/lifecycle/depends-on-validation/script new file mode 100644 index 00000000000..26b424b480e --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on-validation/script @@ -0,0 +1 @@ +musterr $CLI bundle validate diff --git a/acceptance/bundle/lifecycle/depends-on-validation/test.toml b/acceptance/bundle/lifecycle/depends-on-validation/test.toml new file mode 100644 index 00000000000..8f238a7f609 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on-validation/test.toml @@ -0,0 +1,2 @@ +Cloud = false +Ignore = [".databricks"] diff --git a/acceptance/bundle/lifecycle/depends-on/databricks.yml b/acceptance/bundle/lifecycle/depends-on/databricks.yml new file mode 100644 index 00000000000..64023692455 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on/databricks.yml @@ -0,0 +1,17 @@ +bundle: + name: test-bundle + +resources: + jobs: + # No references between the jobs: the order comes from lifecycle.depends_on only. + a_job: + name: a_job + lifecycle: + depends_on: + - resource: z_job + - resource: pipelines.z_pipeline + z_job: + name: z_job + pipelines: + z_pipeline: + name: z_pipeline diff --git a/acceptance/bundle/lifecycle/depends-on/out.test.toml b/acceptance/bundle/lifecycle/depends-on/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/lifecycle/depends-on/output.txt b/acceptance/bundle/lifecycle/depends-on/output.txt new file mode 100644 index 00000000000..d1ecc73e619 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on/output.txt @@ -0,0 +1,45 @@ + +=== Plan records the edges +>>> [CLI] bundle plan -o json +{ + "resources.jobs.a_job": [ + { + "node": "resources.jobs.z_job", + "label": "depends_on" + }, + { + "node": "resources.pipelines.z_pipeline", + "label": "depends_on" + } + ], + "resources.jobs.z_job": null, + "resources.pipelines.z_pipeline": null +} + +=== Deploy creates dependencies first +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/default/files... +Created jobs.a_job +Created jobs.z_job +Created pipelines.z_pipeline +Files: 1 uploaded, 0 deleted +Resources: 3 created, 0 changed, 0 deleted, 0 unchanged + +>>> print_requests.py //jobs //pipelines +POST /api/2.2/jobs/create a_job + +=== Destroy deletes dependents first +>>> [CLI] bundle destroy --auto-approve +The following resources will be deleted: + delete resources.jobs.a_job + delete resources.jobs.z_job + delete resources.pipelines.z_pipeline + +This action will result in the deletion of the following Lakeflow Spark Declarative Pipelines along with the +Streaming Tables (STs) and Materialized Views (MVs) managed by them. Set 'cascade_on_destroy: false' on a pipeline to retain datasets on pipeline deletion: + delete resources.pipelines.z_pipeline + +All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default + +Destroy: 3 deleted +a_job deleted first diff --git a/acceptance/bundle/lifecycle/depends-on/script b/acceptance/bundle/lifecycle/depends-on/script new file mode 100644 index 00000000000..6859e0b6563 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on/script @@ -0,0 +1,15 @@ +title "Plan records the edges" +trace $CLI bundle plan -o json | jq '.plan | map_values(.depends_on)' + +title "Deploy creates dependencies first" +trace $CLI bundle deploy +# z_job and z_pipeline are unordered relative to each other, so only check that a_job is last. +trace print_requests.py //jobs //pipelines | jq -r '.method + " " + .path + " " + (.body.name // "")' | tail -n 1 + +rm -f out.requests.txt + +title "Destroy deletes dependents first" +a_job_id=$($CLI bundle summary -o json | jq -r .resources.jobs.a_job.id) +trace $CLI bundle destroy --auto-approve +first_deleted=$(print_requests.py //jobs/delete | jq -r .body.job_id | head -n 1) +test "$first_deleted" = "$a_job_id" && echo "a_job deleted first" diff --git a/acceptance/bundle/lifecycle/depends-on/test.toml b/acceptance/bundle/lifecycle/depends-on/test.toml new file mode 100644 index 00000000000..c2c37f10ee1 --- /dev/null +++ b/acceptance/bundle/lifecycle/depends-on/test.toml @@ -0,0 +1,3 @@ +Cloud = false +RecordRequests = true +Ignore = [".databricks"] diff --git a/acceptance/bundle/migrate/auto/depends-on/databricks.yml b/acceptance/bundle/migrate/auto/depends-on/databricks.yml new file mode 100644 index 00000000000..70a62cff499 --- /dev/null +++ b/acceptance/bundle/migrate/auto/depends-on/databricks.yml @@ -0,0 +1,12 @@ +bundle: {name: test-bundle} + +resources: + jobs: + test_job: + name: "Test Auto-Migrate Job" + # Added after the terraform deployment; terraform has no lifecycle.depends_on. + other_job: + name: "Other Job" + lifecycle: + depends_on: + - resource: test_job diff --git a/acceptance/bundle/migrate/auto/depends-on/out.test.toml b/acceptance/bundle/migrate/auto/depends-on/out.test.toml new file mode 100644 index 00000000000..19b5b15d11f --- /dev/null +++ b/acceptance/bundle/migrate/auto/depends-on/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = [""] diff --git a/acceptance/bundle/migrate/auto/depends-on/output.txt b/acceptance/bundle/migrate/auto/depends-on/output.txt new file mode 100644 index 00000000000..bfba175139e --- /dev/null +++ b/acceptance/bundle/migrate/auto/depends-on/output.txt @@ -0,0 +1,27 @@ + +=== Replay a prior terraform deployment +>>> replay_tfstate.py terraform-requests.json terraform.tfstate + +=== Deploy migrates to direct and honors lifecycle.depends_on +>>> [CLI] bundle deploy +Notice: migrating your bundle to direct deployment engine (https://github.com/databricks/cli/issues/6765). +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/default/files... +Migrated 1 resource to direct deployment engine. +Created jobs.other_job +Files: 1 uploaded, 0 deleted +Resources: 1 created, 0 changed, 0 deleted, 1 unchanged + +>>> print_migration_telemetry +direct_migrated_via_default true + +=== The edge is recorded in the plan +>>> [CLI] bundle plan -o json +{ + "resources.jobs.other_job": [ + { + "node": "resources.jobs.test_job", + "label": "depends_on" + } + ], + "resources.jobs.test_job": null +} diff --git a/acceptance/bundle/migrate/auto/depends-on/script b/acceptance/bundle/migrate/auto/depends-on/script new file mode 100644 index 00000000000..ef498b77e14 --- /dev/null +++ b/acceptance/bundle/migrate/auto/depends-on/script @@ -0,0 +1,13 @@ +export DATABRICKS_BUNDLE_ENGINE= + +title "Replay a prior terraform deployment" +trace replay_tfstate.py terraform-requests.json terraform.tfstate +replace_ids.py +rm -f "$OUT_REQUESTS" + +title "Deploy migrates to direct and honors lifecycle.depends_on" +trace $CLI bundle deploy +trace print_migration_telemetry + +title "The edge is recorded in the plan" +trace $CLI bundle plan -o json | jq '.plan | map_values(.depends_on)' diff --git a/acceptance/bundle/migrate/auto/depends-on/terraform-requests.json b/acceptance/bundle/migrate/auto/depends-on/terraform-requests.json new file mode 100644 index 00000000000..6482593b189 --- /dev/null +++ b/acceptance/bundle/migrate/auto/depends-on/terraform-requests.json @@ -0,0 +1,19 @@ +[ + { + "method": "POST", + "path": "/api/2.2/jobs/create", + "body": { + "deployment": { + "kind": "BUNDLE", + "metadata_file_path": "/Workspace/Users/tester@databricks.com/.bundle/test-bundle/default/state/metadata.json" + }, + "edit_mode": "UI_LOCKED", + "format": "MULTI_TASK", + "max_concurrent_runs": 1, + "name": "Test Auto-Migrate Job", + "queue": { + "enabled": true + } + } + } +] diff --git a/acceptance/bundle/migrate/auto/depends-on/terraform.tfstate b/acceptance/bundle/migrate/auto/depends-on/terraform.tfstate new file mode 100644 index 00000000000..c04f332a595 --- /dev/null +++ b/acceptance/bundle/migrate/auto/depends-on/terraform.tfstate @@ -0,0 +1,110 @@ +{ + "version": 4, + "terraform_version": "1.5.5", + "serial": 1, + "lineage": "c39488aa-8f36-06fd-a7cb-3f0c95b4c506", + "outputs": {}, + "resources": [ + { + "mode": "managed", + "type": "databricks_job", + "name": "test_job", + "provider": "provider[\"registry.terraform.io/databricks/databricks\"]", + "instances": [ + { + "schema_version": 2, + "attributes": { + "always_running": false, + "budget_policy_id": null, + "continuous": [], + "control_run_state": false, + "dbt_task": [], + "deployment": [ + { + "deployment_id": "", + "kind": "BUNDLE", + "metadata_file_path": "/Workspace/Users/tester@databricks.com/.bundle/test-bundle/default/state/metadata.json", + "version_id": "" + } + ], + "description": null, + "edit_mode": "UI_LOCKED", + "email_notifications": [ + { + "no_alert_for_skipped_runs": false, + "on_duration_warning_threshold_exceeded": [], + "on_failure": [], + "on_start": [], + "on_streaming_backlog_exceeded": [], + "on_success": [] + } + ], + "environment": [], + "existing_cluster_id": null, + "format": "MULTI_TASK", + "git_source": [], + "health": [], + "id": "8790612527183335000", + "job_cluster": [], + "library": [], + "max_concurrent_runs": 1, + "max_retries": 0, + "min_retry_interval_millis": 0, + "name": "Test Auto-Migrate Job", + "new_cluster": [], + "notebook_task": [], + "notification_settings": [], + "parameter": [], + "parent_path": null, + "performance_target": null, + "pipeline_task": [], + "provider_config": [ + { + "workspace_id": "900800700600" + } + ], + "python_wheel_task": [], + "queue": [ + { + "enabled": true + } + ], + "retry_on_timeout": false, + "run_as": [ + { + "group_name": "", + "service_principal_name": "", + "user_name": "tester@databricks.com" + } + ], + "run_job_task": [], + "schedule": [], + "spark_jar_task": [], + "spark_python_task": [], + "spark_submit_task": [], + "tags": null, + "task": [], + "timeout_seconds": 0, + "timeouts": null, + "trigger": [], + "triggers": [], + "url": "[DATABRICKS_URL]/#job/8790612527183335000", + "usage_policy_id": null, + "webhook_notifications": [ + { + "on_duration_warning_threshold_exceeded": [], + "on_failure": [], + "on_start": [], + "on_streaming_backlog_exceeded": [], + "on_success": [] + } + ] + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJ1cGRhdGUiOjE4MDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjIifQ==" + } + ] + } + ], + "check_results": null +} diff --git a/acceptance/bundle/migrate/command/grants/out.new_state.json b/acceptance/bundle/migrate/command/grants/out.new_state.json index 82b918f76d3..e7e49118ac9 100644 --- a/acceptance/bundle/migrate/command/grants/out.new_state.json +++ b/acceptance/bundle/migrate/command/grants/out.new_state.json @@ -80,7 +80,7 @@ "depends_on": [ { "node": "resources.schemas.my_schema", - "label": "${resources.schemas.my_schema.name}" + "label": "depends_on" } ] }, diff --git a/acceptance/bundle/refschema/out.fields.txt b/acceptance/bundle/refschema/out.fields.txt index 978c468c0ac..feed286118a 100644 --- a/acceptance/bundle/refschema/out.fields.txt +++ b/acceptance/bundle/refschema/out.fields.txt @@ -34,6 +34,9 @@ resources.alerts.*.evaluation.threshold.value.string_value string ALL resources.alerts.*.file_path string INPUT resources.alerts.*.id string ALL resources.alerts.*.lifecycle resources.Lifecycle INPUT +resources.alerts.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.alerts.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.alerts.*.lifecycle.depends_on[*].resource string INPUT resources.alerts.*.lifecycle.prevent_destroy bool INPUT resources.alerts.*.lifecycle_state sql.AlertLifecycleState ALL resources.alerts.*.modified_status string INPUT @@ -155,6 +158,9 @@ resources.apps.*.id string ALL resources.apps.*.lifecycle *dresources.StateLifecycle REMOTE STATE resources.apps.*.lifecycle *resources.LifecycleWithStarted INPUT resources.apps.*.lifecycle resources.Lifecycle INPUT +resources.apps.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.apps.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.apps.*.lifecycle.depends_on[*].resource string INPUT resources.apps.*.lifecycle.prevent_destroy bool INPUT resources.apps.*.lifecycle.started *bool ALL resources.apps.*.modified_status string INPUT @@ -274,6 +280,9 @@ resources.catalogs.*.full_name string REMOTE resources.catalogs.*.id string INPUT resources.catalogs.*.isolation_mode catalog.CatalogIsolationMode REMOTE resources.catalogs.*.lifecycle resources.Lifecycle INPUT +resources.catalogs.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.catalogs.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.catalogs.*.lifecycle.depends_on[*].resource string INPUT resources.catalogs.*.lifecycle.prevent_destroy bool INPUT resources.catalogs.*.managed_encryption_settings *catalog.EncryptionSettings ALL resources.catalogs.*.managed_encryption_settings.azure_encryption_settings *catalog.AzureEncryptionSettings ALL @@ -331,6 +340,9 @@ resources.cluster_policies.*.libraries[*].pypi.repo string ALL resources.cluster_policies.*.libraries[*].requirements string ALL resources.cluster_policies.*.libraries[*].whl string ALL resources.cluster_policies.*.lifecycle resources.Lifecycle INPUT +resources.cluster_policies.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.cluster_policies.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.cluster_policies.*.lifecycle.depends_on[*].resource string INPUT resources.cluster_policies.*.lifecycle.prevent_destroy bool INPUT resources.cluster_policies.*.max_clusters_per_user int64 ALL resources.cluster_policies.*.modified_status string INPUT @@ -488,6 +500,9 @@ resources.clusters.*.libraries[*].whl string ALL resources.clusters.*.lifecycle *dresources.StateLifecycle REMOTE STATE resources.clusters.*.lifecycle *resources.LifecycleWithStarted INPUT resources.clusters.*.lifecycle resources.Lifecycle INPUT +resources.clusters.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.clusters.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.clusters.*.lifecycle.depends_on[*].resource string INPUT resources.clusters.*.lifecycle.prevent_destroy bool INPUT resources.clusters.*.lifecycle.started *bool ALL resources.clusters.*.modified_status string INPUT @@ -654,6 +669,9 @@ resources.dashboards.*.etag string ALL resources.dashboards.*.file_path string INPUT resources.dashboards.*.id string INPUT resources.dashboards.*.lifecycle resources.Lifecycle INPUT +resources.dashboards.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.dashboards.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.dashboards.*.lifecycle.depends_on[*].resource string INPUT resources.dashboards.*.lifecycle.prevent_destroy bool INPUT resources.dashboards.*.lifecycle_state dashboards.LifecycleState ALL resources.dashboards.*.modified_status string INPUT @@ -675,6 +693,9 @@ resources.database_catalogs.*.database_instance_name string ALL resources.database_catalogs.*.database_name string ALL resources.database_catalogs.*.id string INPUT resources.database_catalogs.*.lifecycle resources.Lifecycle INPUT +resources.database_catalogs.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.database_catalogs.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.database_catalogs.*.lifecycle.depends_on[*].resource string INPUT resources.database_catalogs.*.lifecycle.prevent_destroy bool INPUT resources.database_catalogs.*.modified_status string INPUT resources.database_catalogs.*.name string ALL @@ -709,6 +730,9 @@ resources.database_instances.*.enable_pg_native_login bool ALL resources.database_instances.*.enable_readable_secondaries bool ALL resources.database_instances.*.id string INPUT resources.database_instances.*.lifecycle resources.Lifecycle INPUT +resources.database_instances.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.database_instances.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.database_instances.*.lifecycle.depends_on[*].resource string INPUT resources.database_instances.*.lifecycle.prevent_destroy bool INPUT resources.database_instances.*.modified_status string INPUT resources.database_instances.*.name string ALL @@ -740,6 +764,9 @@ resources.experiments.*.experiment_id string REMOTE resources.experiments.*.id string INPUT resources.experiments.*.last_update_time int64 REMOTE resources.experiments.*.lifecycle resources.Lifecycle INPUT +resources.experiments.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.experiments.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.experiments.*.lifecycle.depends_on[*].resource string INPUT resources.experiments.*.lifecycle.prevent_destroy bool INPUT resources.experiments.*.lifecycle_stage string REMOTE resources.experiments.*.modified_status string INPUT @@ -823,6 +850,9 @@ resources.external_locations.*.file_event_queue.provided_sqs.queue_url string AL resources.external_locations.*.id string INPUT resources.external_locations.*.isolation_mode catalog.IsolationMode REMOTE resources.external_locations.*.lifecycle resources.Lifecycle INPUT +resources.external_locations.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.external_locations.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.external_locations.*.lifecycle.depends_on[*].resource string INPUT resources.external_locations.*.lifecycle.prevent_destroy bool INPUT resources.external_locations.*.metastore_id string REMOTE resources.external_locations.*.modified_status string INPUT @@ -928,6 +958,9 @@ resources.features.*.id string INPUT resources.features.*.inputs []string ALL resources.features.*.inputs[*] string ALL resources.features.*.lifecycle resources.Lifecycle INPUT +resources.features.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.features.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.features.*.lifecycle.depends_on[*].resource string INPUT resources.features.*.lifecycle.prevent_destroy bool INPUT resources.features.*.lineage_context *ml.LineageContext ALL resources.features.*.lineage_context.job_context *ml.JobContext ALL @@ -1009,6 +1042,9 @@ resources.genie_spaces.*.etag string ALL resources.genie_spaces.*.file_path string INPUT resources.genie_spaces.*.id string INPUT resources.genie_spaces.*.lifecycle resources.Lifecycle INPUT +resources.genie_spaces.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.genie_spaces.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.genie_spaces.*.lifecycle.depends_on[*].resource string INPUT resources.genie_spaces.*.lifecycle.prevent_destroy bool INPUT resources.genie_spaces.*.modified_status string INPUT resources.genie_spaces.*.parent_path string ALL @@ -1053,6 +1089,9 @@ resources.instance_pools.*.idle_instance_autotermination_minutes int ALL resources.instance_pools.*.instance_pool_id string REMOTE resources.instance_pools.*.instance_pool_name string ALL resources.instance_pools.*.lifecycle resources.Lifecycle INPUT +resources.instance_pools.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.instance_pools.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.instance_pools.*.lifecycle.depends_on[*].resource string INPUT resources.instance_pools.*.lifecycle.prevent_destroy bool INPUT resources.instance_pools.*.max_capacity int ALL resources.instance_pools.*.min_idle_instances int ALL @@ -1114,6 +1153,9 @@ resources.job_runs.*.job_parameters.* string ALL resources.job_runs.*.lifecycle *dresources.JobRunLifecycleState STATE resources.job_runs.*.lifecycle *resources.JobRunLifecycle INPUT resources.job_runs.*.lifecycle resources.Lifecycle INPUT +resources.job_runs.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.job_runs.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.job_runs.*.lifecycle.depends_on[*].resource string INPUT resources.job_runs.*.lifecycle.prevent_destroy bool INPUT resources.job_runs.*.lifecycle.triggers []resources.JobRunTrigger INPUT resources.job_runs.*.lifecycle.triggers[*] resources.JobRunTrigger INPUT @@ -1360,6 +1402,9 @@ resources.jobs.*.job_clusters[*].new_cluster.workload_type.clients.notebooks boo resources.jobs.*.job_clusters[*].serverless_compute_id string ALL resources.jobs.*.job_id int64 REMOTE resources.jobs.*.lifecycle resources.Lifecycle INPUT +resources.jobs.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.jobs.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.jobs.*.lifecycle.depends_on[*].resource string INPUT resources.jobs.*.lifecycle.prevent_destroy bool INPUT resources.jobs.*.max_concurrent_runs int ALL resources.jobs.*.modified_status string INPUT @@ -2360,6 +2405,9 @@ resources.mcp_services.*.config.source_connection.options map[string]string ALL resources.mcp_services.*.config.source_connection.options.* string ALL resources.mcp_services.*.id string INPUT resources.mcp_services.*.lifecycle resources.Lifecycle INPUT +resources.mcp_services.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.mcp_services.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.mcp_services.*.lifecycle.depends_on[*].resource string INPUT resources.mcp_services.*.lifecycle.prevent_destroy bool INPUT resources.mcp_services.*.mcp_service_id string ALL resources.mcp_services.*.modified_status string INPUT @@ -2492,6 +2540,9 @@ resources.model_provider_services.*.config.targets[*].native_api_types []string resources.model_provider_services.*.config.targets[*].native_api_types[*] string ALL resources.model_provider_services.*.id string INPUT resources.model_provider_services.*.lifecycle resources.Lifecycle INPUT +resources.model_provider_services.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.model_provider_services.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.model_provider_services.*.lifecycle.depends_on[*].resource string INPUT resources.model_provider_services.*.lifecycle.prevent_destroy bool INPUT resources.model_provider_services.*.model_provider_service_id string ALL resources.model_provider_services.*.modified_status string INPUT @@ -2557,6 +2608,9 @@ resources.model_services.*.config.routing.fallback.destinations[*].provisioned_t resources.model_services.*.config.routing.fallback.destinations[*].traffic_percentage int ALL resources.model_services.*.id string INPUT resources.model_services.*.lifecycle resources.Lifecycle INPUT +resources.model_services.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.model_services.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.model_services.*.lifecycle.depends_on[*].resource string INPUT resources.model_services.*.lifecycle.prevent_destroy bool INPUT resources.model_services.*.model_service_id string ALL resources.model_services.*.modified_status string INPUT @@ -3031,6 +3085,9 @@ resources.model_serving_endpoints.*.endpoint_details.telemetry_config.telemetry_ resources.model_serving_endpoints.*.endpoint_id string REMOTE resources.model_serving_endpoints.*.id string INPUT resources.model_serving_endpoints.*.lifecycle resources.Lifecycle INPUT +resources.model_serving_endpoints.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.model_serving_endpoints.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.model_serving_endpoints.*.lifecycle.depends_on[*].resource string INPUT resources.model_serving_endpoints.*.lifecycle.prevent_destroy bool INPUT resources.model_serving_endpoints.*.modified_status string INPUT resources.model_serving_endpoints.*.name string ALL @@ -3086,6 +3143,9 @@ resources.models.*.latest_versions[*].tags[*].value string REMOTE resources.models.*.latest_versions[*].user_id string REMOTE resources.models.*.latest_versions[*].version string REMOTE resources.models.*.lifecycle resources.Lifecycle INPUT +resources.models.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.models.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.models.*.lifecycle.depends_on[*].resource string INPUT resources.models.*.lifecycle.prevent_destroy bool INPUT resources.models.*.model_id string REMOTE resources.models.*.modified_status string INPUT @@ -3896,6 +3956,9 @@ resources.pipelines.*.libraries[*].notebook *pipelines.NotebookLibrary ALL resources.pipelines.*.libraries[*].notebook.path string ALL resources.pipelines.*.libraries[*].whl string ALL resources.pipelines.*.lifecycle resources.Lifecycle INPUT +resources.pipelines.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.pipelines.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.pipelines.*.lifecycle.depends_on[*].resource string INPUT resources.pipelines.*.lifecycle.prevent_destroy bool INPUT resources.pipelines.*.modified_status string INPUT resources.pipelines.*.name string ALL @@ -3948,6 +4011,9 @@ resources.postgres_branches.*.expire_time *time.Time ALL resources.postgres_branches.*.id string INPUT resources.postgres_branches.*.is_protected bool ALL resources.postgres_branches.*.lifecycle resources.Lifecycle INPUT +resources.postgres_branches.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_branches.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_branches.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_branches.*.lifecycle.prevent_destroy bool INPUT resources.postgres_branches.*.modified_status string INPUT resources.postgres_branches.*.name string REMOTE @@ -3984,6 +4050,9 @@ resources.postgres_catalogs.*.create_database_if_missing bool ALL resources.postgres_catalogs.*.create_time *time.Time REMOTE resources.postgres_catalogs.*.id string INPUT resources.postgres_catalogs.*.lifecycle resources.Lifecycle INPUT +resources.postgres_catalogs.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_catalogs.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_catalogs.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_catalogs.*.lifecycle.prevent_destroy bool INPUT resources.postgres_catalogs.*.modified_status string INPUT resources.postgres_catalogs.*.name string REMOTE @@ -3999,6 +4068,9 @@ resources.postgres_databases.*.create_time *time.Time REMOTE resources.postgres_databases.*.database_id string ALL resources.postgres_databases.*.id string INPUT resources.postgres_databases.*.lifecycle resources.Lifecycle INPUT +resources.postgres_databases.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_databases.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_databases.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_databases.*.lifecycle.prevent_destroy bool INPUT resources.postgres_databases.*.modified_status string INPUT resources.postgres_databases.*.name string REMOTE @@ -4024,6 +4096,9 @@ resources.postgres_endpoints.*.group.max int ALL resources.postgres_endpoints.*.group.min int ALL resources.postgres_endpoints.*.id string INPUT resources.postgres_endpoints.*.lifecycle resources.Lifecycle INPUT +resources.postgres_endpoints.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_endpoints.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_endpoints.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_endpoints.*.lifecycle.prevent_destroy bool INPUT resources.postgres_endpoints.*.modified_status string INPUT resources.postgres_endpoints.*.name string REMOTE @@ -4088,6 +4163,9 @@ resources.postgres_projects.*.initial_endpoint_spec.group.min int REMOTE resources.postgres_projects.*.initial_endpoint_spec.no_suspension bool REMOTE resources.postgres_projects.*.initial_endpoint_spec.suspend_timeout_duration *duration.Duration REMOTE resources.postgres_projects.*.lifecycle resources.Lifecycle INPUT +resources.postgres_projects.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_projects.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_projects.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_projects.*.lifecycle.prevent_destroy bool INPUT resources.postgres_projects.*.modified_status string INPUT resources.postgres_projects.*.name string REMOTE @@ -4136,6 +4214,9 @@ resources.postgres_roles.*.create_time *time.Time REMOTE resources.postgres_roles.*.id string INPUT resources.postgres_roles.*.identity_type postgres.RoleIdentityType ALL resources.postgres_roles.*.lifecycle resources.Lifecycle INPUT +resources.postgres_roles.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_roles.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_roles.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_roles.*.lifecycle.prevent_destroy bool INPUT resources.postgres_roles.*.membership_roles []postgres.RoleMembershipRole ALL resources.postgres_roles.*.membership_roles[*] postgres.RoleMembershipRole ALL @@ -4161,6 +4242,9 @@ resources.postgres_roles.*.url string INPUT resources.postgres_snapshot_schedules.*.branch string ALL resources.postgres_snapshot_schedules.*.id string INPUT resources.postgres_snapshot_schedules.*.lifecycle resources.Lifecycle INPUT +resources.postgres_snapshot_schedules.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_snapshot_schedules.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_snapshot_schedules.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_snapshot_schedules.*.lifecycle.prevent_destroy bool INPUT resources.postgres_snapshot_schedules.*.modified_status string INPUT resources.postgres_snapshot_schedules.*.name string REMOTE @@ -4189,6 +4273,9 @@ resources.postgres_synced_tables.*.extra_columns[*].compute string ALL resources.postgres_synced_tables.*.extra_columns[*].maintenance postgres.SyncedTableSyncedTableSpecExtraColumnMaintenance ALL resources.postgres_synced_tables.*.id string INPUT resources.postgres_synced_tables.*.lifecycle resources.Lifecycle INPUT +resources.postgres_synced_tables.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.postgres_synced_tables.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.postgres_synced_tables.*.lifecycle.depends_on[*].resource string INPUT resources.postgres_synced_tables.*.lifecycle.prevent_destroy bool INPUT resources.postgres_synced_tables.*.modified_status string INPUT resources.postgres_synced_tables.*.name string REMOTE @@ -4258,6 +4345,9 @@ resources.quality_monitors.*.inference_log.problem_type catalog.MonitorInference resources.quality_monitors.*.inference_log.timestamp_col string ALL resources.quality_monitors.*.latest_monitor_failure_msg string ALL resources.quality_monitors.*.lifecycle resources.Lifecycle INPUT +resources.quality_monitors.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.quality_monitors.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.quality_monitors.*.lifecycle.depends_on[*].resource string INPUT resources.quality_monitors.*.lifecycle.prevent_destroy bool INPUT resources.quality_monitors.*.modified_status string INPUT resources.quality_monitors.*.monitor_version int64 REMOTE @@ -4302,6 +4392,9 @@ resources.registered_models.*.created_by string ALL resources.registered_models.*.full_name string ALL resources.registered_models.*.id string INPUT resources.registered_models.*.lifecycle resources.Lifecycle INPUT +resources.registered_models.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.registered_models.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.registered_models.*.lifecycle.depends_on[*].resource string INPUT resources.registered_models.*.lifecycle.prevent_destroy bool INPUT resources.registered_models.*.metastore_id string ALL resources.registered_models.*.modified_status string INPUT @@ -4333,6 +4426,9 @@ resources.schemas.*.enable_predictive_optimization catalog.EnablePredictiveOptim resources.schemas.*.full_name string REMOTE resources.schemas.*.id string INPUT resources.schemas.*.lifecycle resources.Lifecycle INPUT +resources.schemas.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.schemas.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.schemas.*.lifecycle.depends_on[*].resource string INPUT resources.schemas.*.lifecycle.prevent_destroy bool INPUT resources.schemas.*.metastore_id string REMOTE resources.schemas.*.modified_status string INPUT @@ -4362,6 +4458,9 @@ resources.secret_scopes.*.keyvault_metadata *workspace.AzureKeyVaultSecretScopeM resources.secret_scopes.*.keyvault_metadata.dns_name string INPUT resources.secret_scopes.*.keyvault_metadata.resource_id string INPUT resources.secret_scopes.*.lifecycle resources.Lifecycle INPUT +resources.secret_scopes.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.secret_scopes.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.secret_scopes.*.lifecycle.depends_on[*].resource string INPUT resources.secret_scopes.*.lifecycle.prevent_destroy bool INPUT resources.secret_scopes.*.modified_status string INPUT resources.secret_scopes.*.name string INPUT REMOTE @@ -4383,6 +4482,9 @@ resources.secrets.*.expire_time *time.Time ALL resources.secrets.*.full_name string ALL resources.secrets.*.id string INPUT resources.secrets.*.lifecycle resources.Lifecycle INPUT +resources.secrets.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.secrets.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.secrets.*.lifecycle.depends_on[*].resource string INPUT resources.secrets.*.lifecycle.prevent_destroy bool INPUT resources.secrets.*.metastore_id string ALL resources.secrets.*.modified_status string INPUT @@ -4424,6 +4526,9 @@ resources.sql_warehouses.*.jdbc_url string REMOTE resources.sql_warehouses.*.lifecycle *dresources.StateLifecycle REMOTE STATE resources.sql_warehouses.*.lifecycle *resources.LifecycleWithStarted INPUT resources.sql_warehouses.*.lifecycle resources.Lifecycle INPUT +resources.sql_warehouses.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.sql_warehouses.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.sql_warehouses.*.lifecycle.depends_on[*].resource string INPUT resources.sql_warehouses.*.lifecycle.prevent_destroy bool INPUT resources.sql_warehouses.*.lifecycle.started *bool ALL resources.sql_warehouses.*.max_dbu int ALL @@ -4502,6 +4607,9 @@ resources.synced_database_tables.*.effective_database_instance_name string ALL resources.synced_database_tables.*.effective_logical_database_name string ALL resources.synced_database_tables.*.id string INPUT resources.synced_database_tables.*.lifecycle resources.Lifecycle INPUT +resources.synced_database_tables.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.synced_database_tables.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.synced_database_tables.*.lifecycle.depends_on[*].resource string INPUT resources.synced_database_tables.*.lifecycle.prevent_destroy bool INPUT resources.synced_database_tables.*.logical_database_name string ALL resources.synced_database_tables.*.modified_status string INPUT @@ -4543,6 +4651,9 @@ resources.vector_search_endpoints.*.id string INPUT REMOTE resources.vector_search_endpoints.*.last_updated_timestamp int64 REMOTE resources.vector_search_endpoints.*.last_updated_user string REMOTE resources.vector_search_endpoints.*.lifecycle resources.Lifecycle INPUT +resources.vector_search_endpoints.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.vector_search_endpoints.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.vector_search_endpoints.*.lifecycle.depends_on[*].resource string INPUT resources.vector_search_endpoints.*.lifecycle.prevent_destroy bool INPUT resources.vector_search_endpoints.*.modified_status string INPUT resources.vector_search_endpoints.*.name string ALL @@ -4597,6 +4708,9 @@ resources.vector_search_indexes.*.id string INPUT resources.vector_search_indexes.*.index_subtype vectorsearch.IndexSubtype ALL resources.vector_search_indexes.*.index_type vectorsearch.VectorIndexType ALL resources.vector_search_indexes.*.lifecycle resources.Lifecycle INPUT +resources.vector_search_indexes.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.vector_search_indexes.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.vector_search_indexes.*.lifecycle.depends_on[*].resource string INPUT resources.vector_search_indexes.*.lifecycle.prevent_destroy bool INPUT resources.vector_search_indexes.*.modified_status string INPUT resources.vector_search_indexes.*.name string ALL @@ -4626,6 +4740,9 @@ resources.volumes.*.encryption_details.sse_encryption_details.aws_kms_key_arn st resources.volumes.*.full_name string REMOTE resources.volumes.*.id string INPUT resources.volumes.*.lifecycle resources.Lifecycle INPUT +resources.volumes.*.lifecycle.depends_on []resources.DependsOn INPUT +resources.volumes.*.lifecycle.depends_on[*] resources.DependsOn INPUT +resources.volumes.*.lifecycle.depends_on[*].resource string INPUT resources.volumes.*.lifecycle.prevent_destroy bool INPUT resources.volumes.*.metastore_id string REMOTE resources.volumes.*.modified_status string INPUT diff --git a/acceptance/bundle/resource_deps/computed_volume_path/output.txt b/acceptance/bundle/resource_deps/computed_volume_path/output.txt index 2db063aca34..f214f638f38 100644 --- a/acceptance/bundle/resource_deps/computed_volume_path/output.txt +++ b/acceptance/bundle/resource_deps/computed_volume_path/output.txt @@ -10,16 +10,30 @@ "volumes": { "bar": { "catalog_name": "main", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my" + } + ] + }, "name": "volumebar-[UNIQUE_NAME]", - "schema_name": "${resources.schemas.my.name}", + "schema_name": "myschema-[UNIQUE_NAME]", "volume_path": "/Volumes/main/myschema-[UNIQUE_NAME]/volumebar-[UNIQUE_NAME]", "volume_type": "MANAGED" }, "foo": { "catalog_name": "main", "comment": "/Volumes/main/myschema-[UNIQUE_NAME]/volumebar-[UNIQUE_NAME]", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my" + } + ] + }, "name": "volumefoo-[UNIQUE_NAME]", - "schema_name": "${resources.schemas.my.name}", + "schema_name": "myschema-[UNIQUE_NAME]", "volume_path": "/Volumes/main/myschema-[UNIQUE_NAME]/volumefoo-[UNIQUE_NAME]", "volume_type": "MANAGED" } diff --git a/acceptance/bundle/resource_deps/implicit_deps_model_serving_endpoint/output.txt b/acceptance/bundle/resource_deps/implicit_deps_model_serving_endpoint/output.txt index 42be0762389..ba3c61897a9 100644 --- a/acceptance/bundle/resource_deps/implicit_deps_model_serving_endpoint/output.txt +++ b/acceptance/bundle/resource_deps/implicit_deps_model_serving_endpoint/output.txt @@ -10,17 +10,34 @@ "my_endpoint": { "ai_gateway": { "inference_table_config": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", "enabled": true, - "schema_name": "${resources.schemas.my_schema.name}" + "schema_name": "dev_[USERNAME]_myschema" } }, + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my_schema" + }, + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_my-endpoint" } }, "schemas": { "my_schema": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_myschema" } } diff --git a/acceptance/bundle/resource_deps/implicit_deps_quality_monitor/output.txt b/acceptance/bundle/resource_deps/implicit_deps_quality_monitor/output.txt index c4c40a691f6..c6c0168d4bb 100644 --- a/acceptance/bundle/resource_deps/implicit_deps_quality_monitor/output.txt +++ b/acceptance/bundle/resource_deps/implicit_deps_quality_monitor/output.txt @@ -12,13 +12,30 @@ Warning: required field "assets_dir" is not set }, "quality_monitors": { "my_monitor": { - "output_schema_name": "${resources.catalogs.my_catalog.name}.${resources.schemas.my_schema.name}", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my_schema" + }, + { + "resource": "catalogs.my_catalog" + } + ] + }, + "output_schema_name": "mycatalog.dev_[USERNAME]_myschema", "table_name": "mycatalog.myschema.mytable" } }, "schemas": { "my_schema": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_myschema" } } diff --git a/acceptance/bundle/resource_deps/implicit_deps_registered_model/output.txt b/acceptance/bundle/resource_deps/implicit_deps_registered_model/output.txt index 86d56ae426a..589dac6f22e 100644 --- a/acceptance/bundle/resource_deps/implicit_deps_registered_model/output.txt +++ b/acceptance/bundle/resource_deps/implicit_deps_registered_model/output.txt @@ -8,14 +8,31 @@ }, "registered_models": { "my_model": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my_schema" + }, + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_mymodel", - "schema_name": "${resources.schemas.my_schema.name}" + "schema_name": "dev_[USERNAME]_myschema" } }, "schemas": { "my_schema": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_myschema" } } diff --git a/acceptance/bundle/resource_deps/implicit_deps_vector_search_index/output.txt b/acceptance/bundle/resource_deps/implicit_deps_vector_search_index/output.txt index 3cdf0b65221..2fdef7d41b4 100644 --- a/acceptance/bundle/resource_deps/implicit_deps_vector_search_index/output.txt +++ b/acceptance/bundle/resource_deps/implicit_deps_vector_search_index/output.txt @@ -8,7 +8,14 @@ }, "schemas": { "my_schema": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_myschema" } }, @@ -37,7 +44,17 @@ }, "endpoint_name": "my-endpoint", "index_type": "DIRECT_ACCESS", - "name": "${resources.catalogs.my_catalog.name}.${resources.schemas.my_schema.name}.myindex", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my_schema" + }, + { + "resource": "catalogs.my_catalog" + } + ] + }, + "name": "mycatalog.dev_[USERNAME]_myschema.myindex", "primary_key": "id" } } diff --git a/acceptance/bundle/resource_deps/implicit_deps_volume/output.txt b/acceptance/bundle/resource_deps/implicit_deps_volume/output.txt index 4258182b523..930288ff6ab 100644 --- a/acceptance/bundle/resource_deps/implicit_deps_volume/output.txt +++ b/acceptance/bundle/resource_deps/implicit_deps_volume/output.txt @@ -8,15 +8,32 @@ }, "schemas": { "my_schema": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "dev_[USERNAME]_myschema" } }, "volumes": { "my_volume": { - "catalog_name": "${resources.catalogs.my_catalog.name}", + "catalog_name": "mycatalog", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my_schema" + }, + { + "resource": "catalogs.my_catalog" + } + ] + }, "name": "myvolume", - "schema_name": "${resources.schemas.my_schema.name}", + "schema_name": "dev_[USERNAME]_myschema", "volume_path": "/Volumes/mycatalog/dev_[USERNAME]_myschema/myvolume", "volume_type": "MANAGED" } diff --git a/acceptance/bundle/resource_deps/remote_field_storage_location/output.txt b/acceptance/bundle/resource_deps/remote_field_storage_location/output.txt index 51bd4b30bc5..545a31613e3 100644 --- a/acceptance/bundle/resource_deps/remote_field_storage_location/output.txt +++ b/acceptance/bundle/resource_deps/remote_field_storage_location/output.txt @@ -10,16 +10,30 @@ "volumes": { "bar": { "catalog_name": "main", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my" + } + ] + }, "name": "volumebar-[UNIQUE_NAME]", - "schema_name": "${resources.schemas.my.name}", + "schema_name": "myschema-[UNIQUE_NAME]", "volume_path": "/Volumes/main/myschema-[UNIQUE_NAME]/volumebar-[UNIQUE_NAME]", "volume_type": "MANAGED" }, "foo": { "catalog_name": "main", "comment": "${resources.volumes.bar.storage_location}", + "lifecycle": { + "depends_on": [ + { + "resource": "schemas.my" + } + ] + }, "name": "volumefoo-[UNIQUE_NAME]", - "schema_name": "${resources.schemas.my.name}", + "schema_name": "myschema-[UNIQUE_NAME]", "volume_path": "/Volumes/main/myschema-[UNIQUE_NAME]/volumefoo-[UNIQUE_NAME]", "volume_type": "MANAGED" } diff --git a/acceptance/bundle/resources/grants/registered_models/out.plan1.json b/acceptance/bundle/resources/grants/registered_models/out.plan1.json index 3212aa76ea6..9da4a21b4c0 100644 --- a/acceptance/bundle/resources/grants/registered_models/out.plan1.json +++ b/acceptance/bundle/resources/grants/registered_models/out.plan1.json @@ -6,7 +6,7 @@ "depends_on": [ { "node": "resources.schemas.my_schema", - "label": "${resources.schemas.my_schema.name}" + "label": "depends_on" } ], "action": "create", diff --git a/acceptance/bundle/resources/grants/volumes/out.plan1.json b/acceptance/bundle/resources/grants/volumes/out.plan1.json index 0dffbf2c6bf..8ef8231a616 100644 --- a/acceptance/bundle/resources/grants/volumes/out.plan1.json +++ b/acceptance/bundle/resources/grants/volumes/out.plan1.json @@ -15,7 +15,7 @@ "depends_on": [ { "node": "resources.schemas.grants_schema", - "label": "${resources.schemas.grants_schema.name}" + "label": "depends_on" } ], "action": "create", diff --git a/acceptance/bundle/resources/grants/volumes/out.plan2.json b/acceptance/bundle/resources/grants/volumes/out.plan2.json index 198c6851573..e279f0c0008 100644 --- a/acceptance/bundle/resources/grants/volumes/out.plan2.json +++ b/acceptance/bundle/resources/grants/volumes/out.plan2.json @@ -21,7 +21,7 @@ "depends_on": [ { "node": "resources.schemas.grants_schema", - "label": "${resources.schemas.grants_schema.name}" + "label": "depends_on" } ], "action": "skip", diff --git a/acceptance/bundle/resources/volumes/catalog-var-ref/output.txt b/acceptance/bundle/resources/volumes/catalog-var-ref/output.txt index fc328043bea..547b188380f 100644 --- a/acceptance/bundle/resources/volumes/catalog-var-ref/output.txt +++ b/acceptance/bundle/resources/volumes/catalog-var-ref/output.txt @@ -16,7 +16,7 @@ "depends_on": [ { "node": "resources.catalogs.main_catalog", - "label": "${resources.catalogs.main_catalog.name}" + "label": "depends_on" } ], "action": "create", @@ -31,11 +31,11 @@ "depends_on": [ { "node": "resources.catalogs.main_catalog", - "label": "${resources.catalogs.main_catalog.name}" + "label": "depends_on" }, { "node": "resources.schemas.raw_schema", - "label": "${resources.schemas.raw_schema.name}" + "label": "depends_on" } ], "action": "create", diff --git a/bundle/config/mutator/resourcemutator/apply_presets.go b/bundle/config/mutator/resourcemutator/apply_presets.go index bb84240d7cc..94b7496635a 100644 --- a/bundle/config/mutator/resourcemutator/apply_presets.go +++ b/bundle/config/mutator/resourcemutator/apply_presets.go @@ -9,6 +9,7 @@ import ( "github.com/databricks/cli/bundle" "github.com/databricks/cli/bundle/config" + "github.com/databricks/cli/bundle/config/resources" "github.com/databricks/cli/bundle/metrics" "github.com/databricks/cli/libs/diag" "github.com/databricks/cli/libs/textutil" @@ -200,6 +201,16 @@ func (m *applyPresets) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnos } // Schemas: Prefix + if b.Config.Experimental == nil || !b.Config.Experimental.SkipNamePrefixForSchema { + // Resources that name a bundle schema literally must follow its new name. This + // matches schemas by their name before the prefix is applied below. + mapSchemaRefs(b, func(_ *resources.Lifecycle, catalogName, schemaName string) string { + if _, s := findSchema(b, catalogName, schemaName); s != nil { + return normalizePrefix(prefix) + schemaName + } + return schemaName + }) + } for _, s := range r.Schemas { if b.Config.Experimental != nil && b.Config.Experimental.SkipNamePrefixForSchema { break diff --git a/bundle/config/mutator/resourcemutator/apply_presets_test.go b/bundle/config/mutator/resourcemutator/apply_presets_test.go index c97db137b26..7adf9464ffe 100644 --- a/bundle/config/mutator/resourcemutator/apply_presets_test.go +++ b/bundle/config/mutator/resourcemutator/apply_presets_test.go @@ -7,6 +7,8 @@ import ( "github.com/databricks/cli/bundle/config" "github.com/databricks/cli/bundle/config/resources" "github.com/databricks/databricks-sdk-go/service/catalog" + "github.com/databricks/databricks-sdk-go/service/pipelines" + "github.com/databricks/databricks-sdk-go/service/vectorsearch" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -38,3 +40,63 @@ func TestApplyPresetsSkipsNilQualityMonitors(t *testing.T) { require.NoError(t, diags.Error()) assert.Nil(t, b.Config.Resources.QualityMonitors["monitor"].Schedule) } + +func bundleWithSchemaDependents() *bundle.Bundle { + return &bundle.Bundle{ + Config: config.Root{ + Presets: config.Presets{NamePrefix: "dev_"}, + Resources: config.Resources{ + Schemas: map[string]*resources.Schema{ + "my_schema": {CreateSchema: catalog.CreateSchema{CatalogName: "main", Name: "myschema"}}, + }, + Volumes: map[string]*resources.Volume{ + "my_volume": {CreateVolumeRequestContent: catalog.CreateVolumeRequestContent{CatalogName: "main", SchemaName: "myschema"}}, + "other": {CreateVolumeRequestContent: catalog.CreateVolumeRequestContent{CatalogName: "main", SchemaName: "unrelated"}}, + }, + Pipelines: map[string]*resources.Pipeline{ + "my_pipeline": {CreatePipeline: pipelines.CreatePipeline{Catalog: "main", Target: "myschema"}}, + }, + QualityMonitors: map[string]*resources.QualityMonitor{ + "my_monitor": {CreateMonitor: catalog.CreateMonitor{OutputSchemaName: "main.myschema"}}, + }, + VectorSearchIndexes: map[string]*resources.VectorSearchIndex{ + "my_index": {CreateVectorIndexRequest: vectorsearch.CreateVectorIndexRequest{Name: "main.myschema.myindex"}}, + }, + ModelServices: map[string]*resources.ModelService{ + "my_service": {ModelServiceConfig: resources.ModelServiceConfig{Parent: "schemas/main.myschema"}}, + }, + }, + }, + } +} + +func TestApplyPresetsPrefixesSchemaReferences(t *testing.T) { + b := bundleWithSchemaDependents() + + diags := bundle.Apply(t.Context(), b, ApplyPresets()) + require.NoError(t, diags.Error()) + + prefixed := normalizePrefix("dev_") + "myschema" + r := b.Config.Resources + assert.Equal(t, prefixed, r.Schemas["my_schema"].Name) + assert.Equal(t, prefixed, r.Volumes["my_volume"].SchemaName) + assert.Equal(t, "unrelated", r.Volumes["other"].SchemaName) + assert.Equal(t, prefixed, r.Pipelines["my_pipeline"].Target) + assert.Empty(t, r.Pipelines["my_pipeline"].Schema) + assert.Equal(t, "main."+prefixed, r.QualityMonitors["my_monitor"].OutputSchemaName) + assert.Equal(t, "main."+prefixed+".myindex", r.VectorSearchIndexes["my_index"].Name) + assert.Equal(t, "schemas/main."+prefixed, r.ModelServices["my_service"].Parent) +} + +func TestApplyPresetsSkipNamePrefixForSchemaKeepsReferences(t *testing.T) { + b := bundleWithSchemaDependents() + b.Config.Experimental = &config.Experimental{SkipNamePrefixForSchema: true} + + diags := bundle.Apply(t.Context(), b, ApplyPresets()) + require.NoError(t, diags.Error()) + + r := b.Config.Resources + assert.Equal(t, "myschema", r.Schemas["my_schema"].Name) + assert.Equal(t, "myschema", r.Volumes["my_volume"].SchemaName) + assert.Equal(t, "main.myschema", r.QualityMonitors["my_monitor"].OutputSchemaName) +} diff --git a/bundle/config/mutator/resourcemutator/capture_uc_dependencies.go b/bundle/config/mutator/resourcemutator/capture_uc_dependencies.go index a0e8d05fbde..ecbf06c366d 100644 --- a/bundle/config/mutator/resourcemutator/capture_uc_dependencies.go +++ b/bundle/config/mutator/resourcemutator/capture_uc_dependencies.go @@ -2,29 +2,23 @@ package resourcemutator import ( "context" - "fmt" + "slices" "strings" "github.com/databricks/cli/bundle" "github.com/databricks/cli/bundle/config/resources" "github.com/databricks/cli/libs/diag" - "github.com/databricks/cli/libs/dyn/dynvar" ) type captureUCDependencies struct{} -// If a user defines a UC schema in the bundle, they can refer to it in SDP pipelines, -// UC Volumes, Registered Models, Quality Monitors, Model Serving Endpoints, or Vector Search -// Indexes using the `${resources.schemas..name}` syntax. Using this syntax allows -// TF to capture the deploy time dependency this resource has on the schema and deploy changes -// to the schema before deploying the dependent resource. +// If a user defines a UC schema or catalog in the bundle and refers to it by its literal +// name from another resource (UC Volumes, SDP pipelines, Registered Models, Quality Monitors, +// Model Serving Endpoints, Vector Search Indexes, AI Gateway services, UC schemas), the dependent +// resource must be deployed after the schema or catalog. // -// Similarly, if a user defines a UC catalog in the bundle, they can refer to it in UC schemas, -// UC Volumes, Registered Models, Model Serving Endpoints, or Vector Search Indexes using the -// `${resources.catalogs..name}` syntax. This captures the deploy time -// dependency the resource has on the catalog. -// -// This mutator translates any implicit catalog or schema references to the explicit syntax. +// This mutator captures such implicit dependencies in lifecycle.depends_on. Name prefixes +// applied to schemas by presets are applied to these references by ApplyPresets. func CaptureUCDependencies() bundle.Mutator { return &captureUCDependencies{} } @@ -33,14 +27,6 @@ func (m *captureUCDependencies) Name() string { return "CaptureUCDependencies" } -func schemaNameRef(key string) string { - return fmt.Sprintf("${resources.schemas.%s.name}", key) -} - -func catalogNameRef(key string) string { - return fmt.Sprintf("${resources.catalogs.%s.name}", key) -} - func findSchema(b *bundle.Bundle, catalogName, schemaName string) (string, *resources.Schema) { if catalogName == "" || schemaName == "" { return "", nil @@ -67,32 +53,10 @@ func findCatalog(b *bundle.Bundle, catalogName string) (string, *resources.Catal return "", nil } -// resolveSchema returns the explicit schema reference if the given catalogName -// and schemaName match a schema defined in the bundle. Otherwise returns schemaName -// unchanged. Must be called before resolveCatalog on the same resource since -// findSchema needs the original (unmutated) catalogName. -func resolveSchema(b *bundle.Bundle, catalogName, schemaName string) string { - k, s := findSchema(b, catalogName, schemaName) - if s != nil { - return schemaNameRef(k) - } - return schemaName -} - -// resolveCatalog returns the explicit catalog reference if catalogName matches -// a catalog defined in the bundle. Otherwise returns catalogName unchanged. -func resolveCatalog(b *bundle.Bundle, catalogName string) string { - k, c := findCatalog(b, catalogName) - if c != nil { - return catalogNameRef(k) - } - return catalogName -} - // splitUCName splits a compound UC identifier into exactly n dot-separated -// components, returning false if it has a different number of components. Callers -// skip names containing a ${...} reference beforehand, so this is a plain split: -// a reference would push the component count past n and be rejected here anyway. +// components, returning false if it has a different number of components. A +// ${...} reference has dots too, so it pushes the component count past n and is +// rejected here. func splitUCName(name string, n int) ([]string, bool) { parts := strings.Split(name, ".") if len(parts) != n { @@ -101,157 +65,136 @@ func splitUCName(name string, n int) ([]string, bool) { return parts, true } -// resolveAiGatewayParent rewrites a `schemas/{catalog}.{schema}` parent reference so that -// a catalog or schema defined in the same bundle becomes an explicit deploy-time -// dependency. AI Gateway securables address their parent schema with this -// compound field rather than separate catalog/schema fields. -func resolveAiGatewayParent(b *bundle.Bundle, parent string) string { - rest, ok := strings.CutPrefix(parent, "schemas/") +// schemaRefVisitor is called for every reference from a resource to a UC schema, given by +// the catalog and schema names. It returns the schema name to store back. +type schemaRefVisitor func(lc *resources.Lifecycle, catalogName, schemaName string) string + +// visitCompoundSchemaRef visits the schema part of a "catalog.schema[.suffix]" name that has n components. +func visitCompoundSchemaRef(lc *resources.Lifecycle, name string, n int, visit schemaRefVisitor) string { + parts, ok := splitUCName(name, n) if !ok { - return parent + return name } - parts, ok := splitUCName(rest, 2) + parts[1] = visit(lc, parts[0], parts[1]) + return strings.Join(parts, ".") +} + +// visitAiGatewayParent visits the schema in a `schemas/{catalog}.{schema}` parent. AI Gateway +// securables address their parent schema with this compound field rather than separate +// catalog/schema fields. +func visitAiGatewayParent(lc *resources.Lifecycle, parent string, visit schemaRefVisitor) string { + rest, ok := strings.CutPrefix(parent, "schemas/") if !ok { return parent } - catalogName, schemaName := parts[0], parts[1] - return "schemas/" + resolveCatalog(b, catalogName) + "." + resolveSchema(b, catalogName, schemaName) + return "schemas/" + visitCompoundSchemaRef(lc, rest, 2, visit) } -func (m *captureUCDependencies) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnostics { - // Resolve resources that depend on schemas before resolving schemas themselves. - // The schema resolution below modifies schema.CatalogName, and findSchema - // (used by resolveSchema) matches against the original schema.CatalogName value. - for _, v := range b.Config.Resources.Volumes { - if v == nil { - continue +// mapSchemaRefs calls visit for every reference to a UC schema from the resources +// that can have one, and stores the returned schema name. +func mapSchemaRefs(b *bundle.Bundle, visit schemaRefVisitor) { + r := &b.Config.Resources + + for _, v := range r.Volumes { + if v != nil { + v.SchemaName = visit(&v.Lifecycle, v.CatalogName, v.SchemaName) } - v.SchemaName = resolveSchema(b, v.CatalogName, v.SchemaName) - v.CatalogName = resolveCatalog(b, v.CatalogName) } - for _, s := range b.Config.Resources.Secrets { - if s == nil { - continue + for _, s := range r.Secrets { + if s != nil { + s.SchemaName = visit(&s.Lifecycle, s.CatalogName, s.SchemaName) } - s.SchemaName = resolveSchema(b, s.CatalogName, s.SchemaName) - s.CatalogName = resolveCatalog(b, s.CatalogName) } - for _, rm := range b.Config.Resources.RegisteredModels { - if rm == nil { - continue + for _, rm := range r.RegisteredModels { + if rm != nil { + rm.SchemaName = visit(&rm.Lifecycle, rm.CatalogName, rm.SchemaName) } - rm.SchemaName = resolveSchema(b, rm.CatalogName, rm.SchemaName) - rm.CatalogName = resolveCatalog(b, rm.CatalogName) } - for _, p := range b.Config.Resources.Pipelines { - if p == nil { - continue + for _, p := range r.Pipelines { + if p != nil { + // "schema" and "target" have the same semantics in the SDP API but are mutually + // exclusive i.e. only one can be set at a time. + p.Schema = visit(&p.Lifecycle, p.Catalog, p.Schema) + p.Target = visit(&p.Lifecycle, p.Catalog, p.Target) } - // "schema" and "target" have the same semantics in the SDP API but are mutually - // exclusive i.e. only one can be set at a time. - p.Schema = resolveSchema(b, p.Catalog, p.Schema) - p.Target = resolveSchema(b, p.Catalog, p.Target) - p.Catalog = resolveCatalog(b, p.Catalog) } - for _, qm := range b.Config.Resources.QualityMonitors { - if qm == nil || qm.OutputSchemaName == "" { - continue - } - // A name that already contains a reference is left as is: we only rewrite a - // fully literal name and do not support a mix of references and literals. - if dynvar.ContainsVariableReference(qm.OutputSchemaName) { - continue - } - // OutputSchemaName is a compound "catalog.schema" string. - parts, ok := splitUCName(qm.OutputSchemaName, 2) - if !ok { - continue - } - catalogName, schemaName := parts[0], parts[1] - resolved := resolveCatalog(b, catalogName) + "." + resolveSchema(b, catalogName, schemaName) - if resolved != qm.OutputSchemaName { - qm.OutputSchemaName = resolved + for _, qm := range r.QualityMonitors { + if qm != nil { + // OutputSchemaName is a "catalog.schema" name. + qm.OutputSchemaName = visitCompoundSchemaRef(&qm.Lifecycle, qm.OutputSchemaName, 2, visit) } } - for _, idx := range b.Config.Resources.VectorSearchIndexes { - if idx == nil { - continue - } - // A name that already contains a reference is left as is; a mix of - // references and literals is not supported. - if dynvar.ContainsVariableReference(idx.Name) { - continue + for _, idx := range r.VectorSearchIndexes { + if idx != nil { + // Name is a "catalog.schema.index" name. + idx.Name = visitCompoundSchemaRef(&idx.Lifecycle, idx.Name, 3, visit) } - // Name is a three-part "catalog.schema.index" UC identifier. - parts, ok := splitUCName(idx.Name, 3) - if !ok { - continue - } - catalogName, schemaName := parts[0], parts[1] - idx.Name = resolveCatalog(b, catalogName) + "." + resolveSchema(b, catalogName, schemaName) + "." + parts[2] } - for _, f := range b.Config.Resources.Features { - if f == nil { - continue + for _, f := range r.Features { + if f != nil { + // FullName is a "catalog.schema.feature" name. + f.FullName = visitCompoundSchemaRef(&f.Lifecycle, f.FullName, 3, visit) } - if dynvar.ContainsVariableReference(f.FullName) { - continue - } - parts, ok := splitUCName(f.FullName, 3) - if !ok { - continue - } - catalogName, schemaName := parts[0], parts[1] - f.FullName = resolveCatalog(b, catalogName) + "." + resolveSchema(b, catalogName, schemaName) + "." + parts[2] } - for _, mse := range b.Config.Resources.ModelServingEndpoints { + for _, mse := range r.ModelServingEndpoints { if mse == nil { continue } if mse.AiGateway != nil && mse.AiGateway.InferenceTableConfig != nil { itc := mse.AiGateway.InferenceTableConfig - itc.SchemaName = resolveSchema(b, itc.CatalogName, itc.SchemaName) - itc.CatalogName = resolveCatalog(b, itc.CatalogName) + itc.SchemaName = visit(&mse.Lifecycle, itc.CatalogName, itc.SchemaName) } // AutoCaptureConfig is deprecated but still in use. if mse.Config != nil && mse.Config.AutoCaptureConfig != nil { acc := mse.Config.AutoCaptureConfig - acc.SchemaName = resolveSchema(b, acc.CatalogName, acc.SchemaName) - acc.CatalogName = resolveCatalog(b, acc.CatalogName) + acc.SchemaName = visit(&mse.Lifecycle, acc.CatalogName, acc.SchemaName) } } - for _, ms := range b.Config.Resources.ModelServices { - if ms == nil { - continue - } - // A parent that already contains a reference is left as is; a mix of - // references and literals is not supported. - if dynvar.ContainsVariableReference(ms.Parent) { - continue + for _, ms := range r.ModelServices { + if ms != nil { + ms.Parent = visitAiGatewayParent(&ms.Lifecycle, ms.Parent, visit) } - ms.Parent = resolveAiGatewayParent(b, ms.Parent) } - for _, ms := range b.Config.Resources.McpServices { - if ms == nil { - continue + for _, ms := range r.McpServices { + if ms != nil { + ms.Parent = visitAiGatewayParent(&ms.Lifecycle, ms.Parent, visit) } - ms.Parent = resolveAiGatewayParent(b, ms.Parent) } - for _, mps := range b.Config.Resources.ModelProviderServices { - if mps == nil { - continue + for _, mps := range r.ModelProviderServices { + if mps != nil { + mps.Parent = visitAiGatewayParent(&mps.Lifecycle, mps.Parent, visit) } - mps.Parent = resolveAiGatewayParent(b, mps.Parent) } +} + +func addDependsOn(lc *resources.Lifecycle, node string) { + d := resources.DependsOn{Resource: node} + if !slices.Contains(lc.DependsOn, d) { + lc.DependsOn = append(lc.DependsOn, d) + } +} + +// dependsOnUC adds lifecycle.depends_on entries for the bundle schema and catalog that match +// the given literal names. It returns schemaName unchanged. +func dependsOnUC(b *bundle.Bundle, lc *resources.Lifecycle, catalogName, schemaName string) string { + if k, s := findSchema(b, catalogName, schemaName); s != nil { + addDependsOn(lc, "schemas."+k) + } + if k, c := findCatalog(b, catalogName); c != nil { + addDependsOn(lc, "catalogs."+k) + } + return schemaName +} + +func (m *captureUCDependencies) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnostics { + mapSchemaRefs(b, func(lc *resources.Lifecycle, catalogName, schemaName string) string { + return dependsOnUC(b, lc, catalogName, schemaName) + }) - // Schemas are resolved last because the schema catalog resolution modifies - // schema.CatalogName, and findSchema (used by resolveSchema above) matches - // against the original schema.CatalogName value. for _, s := range b.Config.Resources.Schemas { - if s == nil { - continue + if s != nil { + dependsOnUC(b, &s.Lifecycle, s.CatalogName, "") } - s.CatalogName = resolveCatalog(b, s.CatalogName) } return nil } diff --git a/bundle/config/mutator/resourcemutator/capture_uc_dependencies_test.go b/bundle/config/mutator/resourcemutator/capture_uc_dependencies_test.go index 347f0b72caa..38af0c7fc42 100644 --- a/bundle/config/mutator/resourcemutator/capture_uc_dependencies_test.go +++ b/bundle/config/mutator/resourcemutator/capture_uc_dependencies_test.go @@ -44,56 +44,44 @@ func bundleWithCatalogs() *bundle.Bundle { } } -func TestResolveSchema(t *testing.T) { - b := bundleWithSchemas() - - tests := []struct { - name string - catalogName string - schemaName string - expected string - }{ - {"match_catalog1_foobar", "catalog1", "foobar", "${resources.schemas.schema1.name}"}, - {"match_catalog2_foobar", "catalog2", "foobar", "${resources.schemas.schema2.name}"}, - {"match_catalog1_barfoo", "catalog1", "barfoo", "${resources.schemas.schema3.name}"}, - {"no_match_wrong_catalog", "catalogX", "foobar", "foobar"}, - {"no_match_wrong_schema", "catalog1", "schemaX", "schemaX"}, - {"empty_catalog", "", "foobar", "foobar"}, - {"empty_schema", "catalog1", "", ""}, - {"both_empty", "", "", ""}, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - assert.Equal(t, tc.expected, resolveSchema(b, tc.catalogName, tc.schemaName)) - }) +func dependsOnNodes(lc resources.Lifecycle) []string { + var nodes []string + for _, d := range lc.DependsOn { + nodes = append(nodes, d.Resource) } + return nodes } -func TestResolveCatalog(t *testing.T) { - b := bundleWithCatalogs() +func TestDependsOnUC(t *testing.T) { + b := bundleWithSchemas() + b.Config.Resources.Catalogs = bundleWithCatalogs().Config.Resources.Catalogs tests := []struct { name string catalogName string - expected string + schemaName string + expected []string }{ - {"match_catalog1", "catalog1", "${resources.catalogs.dev_catalog.name}"}, - {"match_catalog2", "catalog2", "${resources.catalogs.prod_catalog.name}"}, - {"no_match", "catalogX", "catalogX"}, - {"empty", "", ""}, + {"schema_and_catalog", "catalog1", "foobar", []string{"schemas.schema1", "catalogs.dev_catalog"}}, + {"other_catalog", "catalog2", "foobar", []string{"schemas.schema2", "catalogs.prod_catalog"}}, + {"catalog_only", "catalog1", "schemaX", []string{"catalogs.dev_catalog"}}, + {"no_match", "catalogX", "foobar", nil}, + {"empty_catalog", "", "foobar", nil}, + {"empty_schema", "catalogX", "", nil}, + {"both_empty", "", "", nil}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - assert.Equal(t, tc.expected, resolveCatalog(b, tc.catalogName)) + var lc resources.Lifecycle + assert.Equal(t, tc.schemaName, dependsOnUC(b, &lc, tc.catalogName, tc.schemaName)) + assert.Equal(t, tc.expected, dependsOnNodes(lc)) }) } } // Test that all resource types are wired correctly by defining a catalog, schema, -// and one of each resource type in a single bundle. Also verifies the ordering fix: -// schemas must be resolved last since their CatalogName gets mutated. +// and one of each resource type in a single bundle. func TestCaptureUCDependencies(t *testing.T) { b := &bundle.Bundle{ Config: config.Root{ @@ -165,50 +153,32 @@ func TestCaptureUCDependencies(t *testing.T) { d := bundle.Apply(t.Context(), b, CaptureUCDependencies()) require.Nil(t, d) - schemaRef := "${resources.schemas.my_schema.name}" - catalogRef := "${resources.catalogs.my_catalog.name}" - - // Schema catalog dependency. - assert.Equal(t, catalogRef, b.Config.Resources.Schemas["my_schema"].CatalogName) - - // Volume. - assert.Equal(t, schemaRef, b.Config.Resources.Volumes["my_volume"].SchemaName) - assert.Equal(t, catalogRef, b.Config.Resources.Volumes["my_volume"].CatalogName) - - // Registered model. - assert.Equal(t, schemaRef, b.Config.Resources.RegisteredModels["my_model"].SchemaName) - assert.Equal(t, catalogRef, b.Config.Resources.RegisteredModels["my_model"].CatalogName) - - // Pipeline. - assert.Equal(t, schemaRef, b.Config.Resources.Pipelines["my_pipeline"].Schema) - assert.Equal(t, catalogRef, b.Config.Resources.Pipelines["my_pipeline"].Catalog) - - // Quality monitor (compound "catalog.schema" field). - assert.Equal(t, catalogRef+"."+schemaRef, b.Config.Resources.QualityMonitors["my_monitor"].OutputSchemaName) - - // Model serving endpoint. - itc := b.Config.Resources.ModelServingEndpoints["my_endpoint"].AiGateway.InferenceTableConfig - assert.Equal(t, schemaRef, itc.SchemaName) - assert.Equal(t, catalogRef, itc.CatalogName) - - // Model service (compound "schemas/{catalog}.{schema}" parent field). - assert.Equal(t, "schemas/"+catalogRef+"."+schemaRef, b.Config.Resources.ModelServices["my_model_service"].Parent) - - // Vector search index (three-part "catalog.schema.index" name). - assert.Equal(t, catalogRef+"."+schemaRef+".myindex", b.Config.Resources.VectorSearchIndexes["my_index"].Name) - - // Feature (three-part "catalog.schema.feature" full name). - assert.Equal(t, catalogRef+"."+schemaRef+".myfeature", b.Config.Resources.Features["my_feature"].FullName) - - // MCP service (same compound parent field). - assert.Equal(t, "schemas/"+catalogRef+"."+schemaRef, b.Config.Resources.McpServices["my_mcp_service"].Parent) - - // Model provider service (same compound parent field). - assert.Equal(t, "schemas/"+catalogRef+"."+schemaRef, b.Config.Resources.ModelProviderServices["my_mps"].Parent) + catalogOnly := []string{"catalogs.my_catalog"} + both := []string{"schemas.my_schema", "catalogs.my_catalog"} + r := b.Config.Resources + + assert.Equal(t, catalogOnly, dependsOnNodes(r.Schemas["my_schema"].Lifecycle)) + assert.Equal(t, both, dependsOnNodes(r.Volumes["my_volume"].Lifecycle)) + assert.Equal(t, both, dependsOnNodes(r.RegisteredModels["my_model"].Lifecycle)) + assert.Equal(t, both, dependsOnNodes(r.Pipelines["my_pipeline"].Lifecycle)) + // Compound "catalog.schema" field. + assert.Equal(t, both, dependsOnNodes(r.QualityMonitors["my_monitor"].Lifecycle)) + assert.Equal(t, both, dependsOnNodes(r.ModelServingEndpoints["my_endpoint"].Lifecycle)) + // Compound "schemas/{catalog}.{schema}" parent field. + assert.Equal(t, both, dependsOnNodes(r.ModelServices["my_model_service"].Lifecycle)) + assert.Equal(t, both, dependsOnNodes(r.McpServices["my_mcp_service"].Lifecycle)) + assert.Equal(t, both, dependsOnNodes(r.ModelProviderServices["my_mps"].Lifecycle)) + // Three-part "catalog.schema.index" name. + assert.Equal(t, both, dependsOnNodes(r.VectorSearchIndexes["my_index"].Lifecycle)) + // Three-part "catalog.schema.feature" full name. + assert.Equal(t, both, dependsOnNodes(r.Features["my_feature"].Lifecycle)) + + // Field values stay literal. + assert.Equal(t, "myschema", r.Volumes["my_volume"].SchemaName) + assert.Equal(t, "mycatalog.myschema.myindex", r.VectorSearchIndexes["my_index"].Name) } -// Pipeline schema and target are mutually exclusive; only the populated field -// should be resolved. +// Pipeline schema and target are mutually exclusive; either one captures the dependency. func TestCaptureUCDependenciesPipelineSchemaTarget(t *testing.T) { b := &bundle.Bundle{ Config: config.Root{ @@ -227,13 +197,8 @@ func TestCaptureUCDependenciesPipelineSchemaTarget(t *testing.T) { d := bundle.Apply(t.Context(), b, CaptureUCDependencies()) require.Nil(t, d) - ref := "${resources.schemas.s.name}" - - assert.Equal(t, ref, b.Config.Resources.Pipelines["with_schema"].Schema) - assert.Empty(t, b.Config.Resources.Pipelines["with_schema"].Target) - - assert.Equal(t, ref, b.Config.Resources.Pipelines["with_target"].Target) - assert.Empty(t, b.Config.Resources.Pipelines["with_target"].Schema) + assert.Equal(t, []string{"schemas.s"}, dependsOnNodes(b.Config.Resources.Pipelines["with_schema"].Lifecycle)) + assert.Equal(t, []string{"schemas.s"}, dependsOnNodes(b.Config.Resources.Pipelines["with_target"].Lifecycle)) } func TestCaptureUCDependenciesQualityMonitorEdgeCases(t *testing.T) { @@ -260,11 +225,12 @@ func TestCaptureUCDependenciesQualityMonitorEdgeCases(t *testing.T) { d := bundle.Apply(t.Context(), b, CaptureUCDependencies()) require.Nil(t, d) - assert.Equal(t, "${resources.catalogs.my_catalog.name}.other", b.Config.Resources.QualityMonitors["catalog_only"].OutputSchemaName) - assert.Equal(t, "other.other", b.Config.Resources.QualityMonitors["no_match"].OutputSchemaName) - assert.Empty(t, b.Config.Resources.QualityMonitors["empty"].OutputSchemaName) - assert.Equal(t, "nodot", b.Config.Resources.QualityMonitors["no_dot"].OutputSchemaName) - assert.Nil(t, b.Config.Resources.QualityMonitors["nil_monitor"]) + qms := b.Config.Resources.QualityMonitors + assert.Equal(t, []string{"catalogs.my_catalog"}, dependsOnNodes(qms["catalog_only"].Lifecycle)) + assert.Empty(t, dependsOnNodes(qms["no_match"].Lifecycle)) + assert.Empty(t, dependsOnNodes(qms["empty"].Lifecycle)) + assert.Empty(t, dependsOnNodes(qms["no_dot"].Lifecycle)) + assert.Nil(t, qms["nil_monitor"]) } func TestCaptureUCDependenciesModelServingEndpointEdgeCases(t *testing.T) { @@ -307,18 +273,10 @@ func TestCaptureUCDependenciesModelServingEndpointEdgeCases(t *testing.T) { d := bundle.Apply(t.Context(), b, CaptureUCDependencies()) require.Nil(t, d) - schemaRef := "${resources.schemas.my_schema.name}" - catalogRef := "${resources.catalogs.my_catalog.name}" - - acc := b.Config.Resources.ModelServingEndpoints["auto_capture"].Config.AutoCaptureConfig - assert.Equal(t, schemaRef, acc.SchemaName) - assert.Equal(t, catalogRef, acc.CatalogName) - - itc := b.Config.Resources.ModelServingEndpoints["no_match"].AiGateway.InferenceTableConfig - assert.Equal(t, "other", itc.CatalogName) - assert.Equal(t, "other", itc.SchemaName) - - assert.Nil(t, b.Config.Resources.ModelServingEndpoints["nil_endpoint"]) + mses := b.Config.Resources.ModelServingEndpoints + assert.Equal(t, []string{"schemas.my_schema", "catalogs.my_catalog"}, dependsOnNodes(mses["auto_capture"].Lifecycle)) + assert.Empty(t, dependsOnNodes(mses["no_match"].Lifecycle)) + assert.Nil(t, mses["nil_endpoint"]) } func TestCaptureUCDependenciesVectorSearchIndexEdgeCases(t *testing.T) { @@ -345,11 +303,12 @@ func TestCaptureUCDependenciesVectorSearchIndexEdgeCases(t *testing.T) { d := bundle.Apply(t.Context(), b, CaptureUCDependencies()) require.Nil(t, d) - assert.Equal(t, "${resources.catalogs.my_catalog.name}.other.myindex", b.Config.Resources.VectorSearchIndexes["catalog_only"].Name) - assert.Equal(t, "other.other.myindex", b.Config.Resources.VectorSearchIndexes["no_match"].Name) - assert.Empty(t, b.Config.Resources.VectorSearchIndexes["empty"].Name) - assert.Equal(t, "mycatalog.myschema", b.Config.Resources.VectorSearchIndexes["two_part"].Name) - assert.Nil(t, b.Config.Resources.VectorSearchIndexes["nil_index"]) + idxs := b.Config.Resources.VectorSearchIndexes + assert.Equal(t, []string{"catalogs.my_catalog"}, dependsOnNodes(idxs["catalog_only"].Lifecycle)) + assert.Empty(t, dependsOnNodes(idxs["no_match"].Lifecycle)) + assert.Empty(t, dependsOnNodes(idxs["empty"].Lifecycle)) + assert.Empty(t, dependsOnNodes(idxs["two_part"].Lifecycle)) + assert.Nil(t, idxs["nil_index"]) } // Nil and empty resources should not panic. @@ -399,9 +358,7 @@ func TestSplitUCName(t *testing.T) { } } -// A vector search index name that already contains a ${resources...} reference is left -// untouched: a mix of references and literals is not supported. Only a fully literal name -// with exactly three components has its catalog and schema captured. +// Only a fully literal three-component vector search index name has its catalog and schema captured. func TestCaptureUCDependenciesVectorSearchIndexReferences(t *testing.T) { newBundle := func(indexName string) *bundle.Bundle { return &bundle.Bundle{ @@ -424,28 +381,12 @@ func TestCaptureUCDependenciesVectorSearchIndexReferences(t *testing.T) { tests := []struct { name string input string - expected string + expected []string }{ - { - "all_literal_captured", - "catalog1.myschema.myindex", - "${resources.catalogs.dev_catalog.name}.${resources.schemas.my_schema.name}.myindex", - }, - { - "catalog_reference_with_literal_schema_unsupported", - "${resources.catalogs.dev_catalog.name}.myschema.myindex", - "${resources.catalogs.dev_catalog.name}.myschema.myindex", - }, - { - "fully_referenced_unchanged", - "${resources.catalogs.dev_catalog.name}.${resources.schemas.my_schema.name}.myindex", - "${resources.catalogs.dev_catalog.name}.${resources.schemas.my_schema.name}.myindex", - }, - { - "more_than_three_components_skipped", - "catalog1.myschema.my.index", - "catalog1.myschema.my.index", - }, + {"all_literal_captured", "catalog1.myschema.myindex", []string{"schemas.my_schema", "catalogs.dev_catalog"}}, + {"catalog_reference_unsupported", "${resources.catalogs.dev_catalog.name}.myschema.myindex", nil}, + {"fully_referenced_skipped", "${resources.catalogs.dev_catalog.name}.${resources.schemas.my_schema.name}.myindex", nil}, + {"more_than_three_components_skipped", "catalog1.myschema.my.index", nil}, } for _, tc := range tests { @@ -453,7 +394,8 @@ func TestCaptureUCDependenciesVectorSearchIndexReferences(t *testing.T) { b := newBundle(tc.input) d := bundle.Apply(t.Context(), b, CaptureUCDependencies()) require.Nil(t, d) - assert.Equal(t, tc.expected, b.Config.Resources.VectorSearchIndexes["idx"].Name) + assert.Equal(t, tc.expected, dependsOnNodes(b.Config.Resources.VectorSearchIndexes["idx"].Lifecycle)) + assert.Equal(t, tc.input, b.Config.Resources.VectorSearchIndexes["idx"].Name) }) } } diff --git a/bundle/config/resources/job_run.go b/bundle/config/resources/job_run.go index ff9a91a8899..dff2e538cb0 100644 --- a/bundle/config/resources/job_run.go +++ b/bundle/config/resources/job_run.go @@ -123,6 +123,15 @@ func (r *JobRun) ResourceDescription() ResourceDescription { } } +// GetLifecycle returns the lifecycle settings. Lifecycle shadows BaseResource.Lifecycle, +// which therefore stays empty. +func (r *JobRun) GetLifecycle() LifecycleConfig { + if r.Lifecycle == nil { + return Lifecycle{} + } + return r.Lifecycle.Lifecycle +} + // GetName returns the in-product name, which is empty: a run has no name. func (r *JobRun) GetName() string { return "" diff --git a/bundle/config/resources/lifecycle.go b/bundle/config/resources/lifecycle.go index b7f0d55ec72..ec93ba5af06 100644 --- a/bundle/config/resources/lifecycle.go +++ b/bundle/config/resources/lifecycle.go @@ -3,6 +3,7 @@ package resources // LifecycleConfig is implemented by Lifecycle and LifecycleWithStarted. type LifecycleConfig interface { HasPreventDestroy() bool + GetDependsOn() []DependsOn } // Lifecycle contains base lifecycle settings supported by all resources. @@ -15,6 +16,15 @@ type Lifecycle struct { // can override prevent_destroy: true in the base). // This field is not serialized to JSON. ForceSendFields []string `json:"-"` + + // Resources that must be deployed before this resource and deleted after it. + DependsOn []DependsOn `json:"depends_on,omitempty"` +} + +// DependsOn is a single lifecycle.depends_on entry. +type DependsOn struct { + // Key of the resource to depend on: "foo" or "jobs.foo". + Resource string `json:"resource"` } // HasPreventDestroy returns true if prevent_destroy is set. @@ -22,6 +32,11 @@ func (l Lifecycle) HasPreventDestroy() bool { return l.PreventDestroy } +// GetDependsOn returns the lifecycle.depends_on entries. +func (l Lifecycle) GetDependsOn() []DependsOn { + return l.DependsOn +} + // LifecycleWithStarted contains lifecycle settings for resources that support lifecycle.started. // It is used by apps, clusters, and sql_warehouses. type LifecycleWithStarted struct { diff --git a/bundle/config/resources/lifecycle_test.go b/bundle/config/resources/lifecycle_test.go new file mode 100644 index 00000000000..b2398d4ac50 --- /dev/null +++ b/bundle/config/resources/lifecycle_test.go @@ -0,0 +1,31 @@ +package resources + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +// Resources that shadow BaseResource.Lifecycle must return their own settings. +func TestGetLifecycleDependsOn(t *testing.T) { + deps := []DependsOn{{Resource: "foo"}} + + tests := []struct { + name string + resource interface{ GetLifecycle() LifecycleConfig } + }{ + {"base", &Job{Lifecycle: Lifecycle{DependsOn: deps}}}, + {"with_started", &App{Lifecycle: &LifecycleWithStarted{DependsOn: deps}}}, + {"job_run", &JobRun{Lifecycle: &JobRunLifecycle{DependsOn: deps}}}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + assert.Equal(t, deps, tc.resource.GetLifecycle().GetDependsOn()) + }) + } +} + +func TestJobRunGetLifecycleNil(t *testing.T) { + assert.Empty(t, (&JobRun{}).GetLifecycle().GetDependsOn()) +} diff --git a/bundle/config/validate/lifecycle_depends_on.go b/bundle/config/validate/lifecycle_depends_on.go new file mode 100644 index 00000000000..6191e381d29 --- /dev/null +++ b/bundle/config/validate/lifecycle_depends_on.go @@ -0,0 +1,61 @@ +package validate + +import ( + "cmp" + "context" + "fmt" + "reflect" + "slices" + + "github.com/databricks/cli/bundle" + "github.com/databricks/cli/libs/diag" + "github.com/databricks/cli/libs/structs/structpath" +) + +type lifecycleDependsOn struct{} + +// LifecycleDependsOn validates that every lifecycle.depends_on entry refers to an existing +// resource other than the one declaring it. +func LifecycleDependsOn() bundle.Mutator { + return &lifecycleDependsOn{} +} + +func (*lifecycleDependsOn) Name() string { + return "validate:lifecycle_depends_on" +} + +func (*lifecycleDependsOn) Apply(_ context.Context, b *bundle.Bundle) diag.Diagnostics { + var diags diag.Diagnostics + + for _, group := range b.Config.Resources.AllResources() { + for key, resource := range group.Resources { + // Python-generated configs can contain null resource entries. + if reflect.ValueOf(resource).IsNil() { + continue + } + + self := group.Description.PluralName + "." + key + for i, dep := range resource.GetLifecycle().GetDependsOn() { + target, targetKey, err := b.Config.Resources.ResolveKey(dep.Resource) + if err == nil && target.ResourceDescription().PluralName+"."+targetKey == self { + err = fmt.Errorf("resource %q cannot depend on itself", dep.Resource) + } + if err != nil { + path := structpath.NewPath(nil, "resources", group.Description.PluralName, key, "lifecycle", "depends_on", i, "resource") + diags = diags.Append(diag.Diagnostic{ + Severity: diag.Error, + Summary: "invalid lifecycle.depends_on: " + err.Error(), + Locations: b.Config.GetLocationsOf(path), + Paths: []*structpath.PathNode{path}, + }) + } + } + } + } + + // Resources are visited in random order. + slices.SortStableFunc(diags, func(a, b diag.Diagnostic) int { + return cmp.Compare(a.Paths[0].String(), b.Paths[0].String()) + }) + return diags +} diff --git a/bundle/direct/bundle_plan.go b/bundle/direct/bundle_plan.go index abf10376039..8f8336beaa5 100644 --- a/bundle/direct/bundle_plan.go +++ b/bundle/direct/bundle_plan.go @@ -11,6 +11,7 @@ import ( "strings" "github.com/databricks/cli/bundle/config" + "github.com/databricks/cli/bundle/config/resources" "github.com/databricks/cli/bundle/deployplan" "github.com/databricks/cli/bundle/direct/dresources" "github.com/databricks/cli/bundle/direct/dstate" @@ -1285,6 +1286,16 @@ func (b *DeploymentBundle) makePlan(ctx context.Context, configRoot *config.Root } } + lifecycleDeps, err := LifecycleDependsOn(configRoot, inputConfig) + if err != nil { + return nil, fmt.Errorf("%s: %w", prefix, err) + } + for _, dep := range lifecycleDeps { + if !slices.Contains(dependsOn, dep) { + dependsOn = append(dependsOn, dep) + } + } + slices.SortFunc(dependsOn, func(a, b deployplan.DependsOnEntry) int { if a.Node != b.Node { return strings.Compare(a.Node, b.Node) @@ -1330,6 +1341,14 @@ func (b *DeploymentBundle) makePlan(ctx context.Context, configRoot *config.Root p.Plan[node] = &e } + // lifecycle.depends_on only orders resources: a target that is not in the plan + // (e.g. skipped as empty) needs no ordering. + for _, entry := range p.Plan { + entry.DependsOn = slices.DeleteFunc(entry.DependsOn, func(dep deployplan.DependsOnEntry) bool { + return dep.Label == lifecycleDependsOnLabel && p.Plan[dep.Node] == nil + }) + } + for n, entry := range existingKeys { if p.Plan[n] != nil { panic("unexpected node " + n) @@ -1429,3 +1448,28 @@ func (b *DeploymentBundle) getAdapterForKey(resourceKey string) (*dresources.Ada return adapter, nil } + +const lifecycleDependsOnLabel = "depends_on" + +// LifecycleDependsOn returns the edges declared in lifecycle.depends_on of a resource, +// given its config as returned by [config.Root.GetResourceConfig]. +func LifecycleDependsOn(configRoot *config.Root, inputConfig any) ([]deployplan.DependsOnEntry, error) { + // Not every node has a lifecycle, e.g. permissions and grants. + resource, ok := inputConfig.(interface { + GetLifecycle() resources.LifecycleConfig + }) + if !ok { + return nil, nil + } + + var result []deployplan.DependsOnEntry + for _, dep := range resource.GetLifecycle().GetDependsOn() { + res, key, err := configRoot.Resources.ResolveKey(dep.Resource) + if err != nil { + return nil, fmt.Errorf("lifecycle.depends_on: %w", err) + } + target := "resources." + res.ResourceDescription().PluralName + "." + key + result = append(result, deployplan.DependsOnEntry{Node: target, Label: lifecycleDependsOnLabel}) + } + return result, nil +} diff --git a/bundle/direct/dresources/type_test.go b/bundle/direct/dresources/type_test.go index bc12c994621..81619e74d03 100644 --- a/bundle/direct/dresources/type_test.go +++ b/bundle/direct/dresources/type_test.go @@ -81,16 +81,20 @@ var knownMissingInStateType = map[string][]string{ }, "apps": { "lifecycle.prevent_destroy", + "lifecycle.depends_on", }, "clusters": { "lifecycle.prevent_destroy", + "lifecycle.depends_on", }, "sql_warehouses": { "lifecycle.prevent_destroy", + "lifecycle.depends_on", }, "job_runs": { // State stores trigger fingerprints, not the config trigger list / prevent_destroy. "lifecycle.prevent_destroy", + "lifecycle.depends_on", "lifecycle.triggers", }, "dashboards": { diff --git a/bundle/internal/schema/annotations.yml b/bundle/internal/schema/annotations.yml index 1a5c4ccbfdd..ecb586d8512 100644 --- a/bundle/internal/schema/annotations.yml +++ b/bundle/internal/schema/annotations.yml @@ -627,6 +627,9 @@ resources: "description": |- Settings that control the deployment lifecycle of the resource, such as preventing it from being destroyed. "$fields": + "depends_on": + "description": |- + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. "prevent_destroy": "description": |- Lifecycle setting to prevent the resource from being destroyed. @@ -1082,6 +1085,9 @@ resources: "description": |- Settings that control the deployment lifecycle of the resource, such as preventing it from being destroyed and when the run re-fires. "$fields": + "depends_on": + "description": |- + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. "prevent_destroy": "description": |- Lifecycle setting to prevent the resource from being destroyed. @@ -1162,6 +1168,13 @@ resources: "description": |- Settings that control the deployment lifecycle of the resource, such as preventing it from being destroyed. "$fields": + "depends_on": + "description": |- + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + "$fields": + "resource": + "description": |- + Key of the resource to depend on, as `foo` or `jobs.foo`. "prevent_destroy": "description": |- Lifecycle setting to prevent the resource from being destroyed. diff --git a/bundle/internal/validation/generated/required_fields.go b/bundle/internal/validation/generated/required_fields.go index f43a07dddce..5e139f34798 100644 --- a/bundle/internal/validation/generated/required_fields.go +++ b/bundle/internal/validation/generated/required_fields.go @@ -15,6 +15,7 @@ var RequiredFields = map[string][]string{ "resources.alerts.*.evaluation": {"comparison_operator", "source"}, "resources.alerts.*.evaluation.source": {"name"}, "resources.alerts.*.evaluation.threshold.column": {"name"}, + "resources.alerts.*.lifecycle.depends_on[*]": {"resource"}, "resources.alerts.*.parameters[*]": {"name"}, "resources.alerts.*.permissions[*]": {"level"}, "resources.alerts.*.schedule": {"quartz_cron_schedule", "timezone_id"}, @@ -25,6 +26,7 @@ var RequiredFields = map[string][]string{ "resources.apps.*.default_git_source.git_repository": {"provider", "url"}, "resources.apps.*.git_repository": {"provider", "url"}, "resources.apps.*.git_source.git_repository": {"provider", "url"}, + "resources.apps.*.lifecycle.depends_on[*]": {"resource"}, "resources.apps.*.pending_deployment.git_source.git_repository": {"provider", "url"}, "resources.apps.*.permissions[*]": {"level"}, "resources.apps.*.resources[*]": {"name"}, @@ -38,13 +40,15 @@ var RequiredFields = map[string][]string{ "resources.apps.*.resources[*].uc_securable": {"permission", "securable_full_name", "securable_type"}, "resources.apps.*.telemetry_export_destinations[*].unity_catalog": {"logs_table", "metrics_table", "traces_table"}, - "resources.catalogs.*": {"name"}, + "resources.catalogs.*": {"name"}, + "resources.catalogs.*.lifecycle.depends_on[*]": {"resource"}, "resources.catalogs.*.managed_encryption_settings.azure_encryption_settings": {"azure_tenant_id"}, - "resources.cluster_policies.*.libraries[*].cran": {"package"}, - "resources.cluster_policies.*.libraries[*].maven": {"coordinates"}, - "resources.cluster_policies.*.libraries[*].pypi": {"package"}, - "resources.cluster_policies.*.permissions[*]": {"level"}, + "resources.cluster_policies.*.libraries[*].cran": {"package"}, + "resources.cluster_policies.*.libraries[*].maven": {"coordinates"}, + "resources.cluster_policies.*.libraries[*].pypi": {"package"}, + "resources.cluster_policies.*.lifecycle.depends_on[*]": {"resource"}, + "resources.cluster_policies.*.permissions[*]": {"level"}, "resources.clusters.*.cluster_log_conf.dbfs": {"destination"}, "resources.clusters.*.cluster_log_conf.s3": {"destination"}, @@ -59,21 +63,27 @@ var RequiredFields = map[string][]string{ "resources.clusters.*.libraries[*].cran": {"package"}, "resources.clusters.*.libraries[*].maven": {"coordinates"}, "resources.clusters.*.libraries[*].pypi": {"package"}, + "resources.clusters.*.lifecycle.depends_on[*]": {"resource"}, "resources.clusters.*.permissions[*]": {"level"}, "resources.clusters.*.workload_type": {"clients"}, - "resources.dashboards.*.permissions[*]": {"level"}, + "resources.dashboards.*.lifecycle.depends_on[*]": {"resource"}, + "resources.dashboards.*.permissions[*]": {"level"}, - "resources.database_catalogs.*": {"database_instance_name", "database_name", "name"}, + "resources.database_catalogs.*": {"database_instance_name", "database_name", "name"}, + "resources.database_catalogs.*.lifecycle.depends_on[*]": {"resource"}, - "resources.database_instances.*": {"name"}, - "resources.database_instances.*.permissions[*]": {"level"}, + "resources.database_instances.*": {"name"}, + "resources.database_instances.*.lifecycle.depends_on[*]": {"resource"}, + "resources.database_instances.*.permissions[*]": {"level"}, "resources.experiments.*": {"name"}, + "resources.experiments.*.lifecycle.depends_on[*]": {"resource"}, "resources.experiments.*.permissions[*]": {"level"}, "resources.experiments.*.trace_location.uc_trace_location": {"catalog", "schema"}, - "resources.external_locations.*": {"credential_name", "name", "url"}, + "resources.external_locations.*": {"credential_name", "name", "url"}, + "resources.external_locations.*.lifecycle.depends_on[*]": {"resource"}, "resources.features.*": {"full_name", "function", "source"}, "resources.features.*.entities[*]": {"name"}, @@ -101,6 +111,7 @@ var RequiredFields = map[string][]string{ "resources.features.*.function.custom_udf": {"function_path"}, "resources.features.*.function.custom_udf.input_bindings[*]": {"column", "parameter"}, "resources.features.*.function.extra_parameters[*]": {"key", "value"}, + "resources.features.*.lifecycle.depends_on[*]": {"resource"}, "resources.features.*.source.delta_table_source": {"full_name"}, "resources.features.*.source.feature_view_source.feature_references[*]": {"feature"}, "resources.features.*.source.kafka_source": {"name"}, @@ -114,13 +125,16 @@ var RequiredFields = map[string][]string{ "resources.features.*.time_window.tumbling": {"window_duration"}, "resources.features.*.timeseries_column": {"name"}, - "resources.genie_spaces.*.permissions[*]": {"level"}, + "resources.genie_spaces.*.lifecycle.depends_on[*]": {"resource"}, + "resources.genie_spaces.*.permissions[*]": {"level"}, - "resources.instance_pools.*": {"instance_pool_name", "node_type_id"}, - "resources.instance_pools.*.permissions[*]": {"level"}, + "resources.instance_pools.*": {"instance_pool_name", "node_type_id"}, + "resources.instance_pools.*.lifecycle.depends_on[*]": {"resource"}, + "resources.instance_pools.*.permissions[*]": {"level"}, - "resources.job_runs.*": {"job_id"}, - "resources.job_runs.*.queue": {"enabled"}, + "resources.job_runs.*": {"job_id"}, + "resources.job_runs.*.lifecycle.depends_on[*]": {"resource"}, + "resources.job_runs.*.queue": {"enabled"}, "resources.jobs.*.continuous.maintenance_window": {"day_of_week", "start_hour", "timezone_id"}, "resources.jobs.*.deployment": {"kind"}, @@ -141,6 +155,7 @@ var RequiredFields = map[string][]string{ "resources.jobs.*.job_clusters[*].new_cluster.init_scripts[*].volumes": {"destination"}, "resources.jobs.*.job_clusters[*].new_cluster.init_scripts[*].workspace": {"destination"}, "resources.jobs.*.job_clusters[*].new_cluster.workload_type": {"clients"}, + "resources.jobs.*.lifecycle.depends_on[*]": {"resource"}, "resources.jobs.*.parameters[*]": {"default", "name"}, "resources.jobs.*.permissions[*]": {"level"}, "resources.jobs.*.queue": {"enabled"}, @@ -259,6 +274,7 @@ var RequiredFields = map[string][]string{ "resources.mcp_services.*": {"parent", "mcp_service_id"}, "resources.mcp_services.*.config.rate_limits[*]": {"key", "renewal_period"}, "resources.mcp_services.*.config.source_connection": {"name"}, + "resources.mcp_services.*.lifecycle.depends_on[*]": {"resource"}, "resources.model_provider_services.*": {"parent", "model_provider_service_id"}, "resources.model_provider_services.*.config.amazon_bedrock.direct.aws_access_key.secret_access_key.secret_reference": {"name"}, @@ -280,6 +296,7 @@ var RequiredFields = map[string][]string{ "resources.model_provider_services.*.config.openai.direct.api_key.secret_reference": {"name"}, "resources.model_provider_services.*.config.rate_limits[*]": {"key", "renewal_period"}, "resources.model_provider_services.*.config.targets[*]": {"model"}, + "resources.model_provider_services.*.lifecycle.depends_on[*]": {"resource"}, "resources.model_services.*": {"parent", "model_service_id"}, "resources.model_services.*.config.inference_table": {"parent"}, @@ -294,6 +311,7 @@ var RequiredFields = map[string][]string{ "resources.model_services.*.config.routing.fallback.destinations[*].external_model_config.target": {"model"}, "resources.model_services.*.config.routing.fallback.destinations[*].pay_per_token_config": {"model"}, "resources.model_services.*.config.routing.fallback.destinations[*].provisioned_throughput_config": {"model_serving_endpoint"}, + "resources.model_services.*.lifecycle.depends_on[*]": {"resource"}, "resources.model_serving_endpoints.*": {"name"}, "resources.model_serving_endpoints.*.ai_gateway.fallback_config": {"enabled"}, @@ -306,12 +324,14 @@ var RequiredFields = map[string][]string{ "resources.model_serving_endpoints.*.config.served_entities[*].external_model.google_cloud_vertex_ai_config": {"project_id", "region"}, "resources.model_serving_endpoints.*.config.served_models[*]": {"model_name", "model_version", "scale_to_zero_enabled"}, "resources.model_serving_endpoints.*.config.traffic_config.routes[*]": {"traffic_percentage"}, + "resources.model_serving_endpoints.*.lifecycle.depends_on[*]": {"resource"}, "resources.model_serving_endpoints.*.permissions[*]": {"level"}, "resources.model_serving_endpoints.*.rate_limits[*]": {"calls", "renewal_period"}, "resources.model_serving_endpoints.*.tags[*]": {"key"}, - "resources.models.*": {"name"}, - "resources.models.*.permissions[*]": {"level"}, + "resources.models.*": {"name"}, + "resources.models.*.lifecycle.depends_on[*]": {"resource"}, + "resources.models.*.permissions[*]": {"level"}, "resources.pipelines.*.clusters[*].autoscale": {"max_workers", "min_workers"}, "resources.pipelines.*.clusters[*].cluster_log_conf.dbfs": {"destination"}, @@ -344,57 +364,77 @@ var RequiredFields = map[string][]string{ "resources.pipelines.*.ingestion_definition.objects[*].table.table_configuration.auto_full_refresh_policy": {"enabled"}, "resources.pipelines.*.ingestion_definition.table_configuration.auto_full_refresh_policy": {"enabled"}, "resources.pipelines.*.libraries[*].maven": {"coordinates"}, + "resources.pipelines.*.lifecycle.depends_on[*]": {"resource"}, "resources.pipelines.*.permissions[*]": {"level"}, "resources.pipelines.*.restart_window": {"start_hour"}, - "resources.postgres_branches.*": {"branch_id", "parent"}, + "resources.postgres_branches.*": {"branch_id", "parent"}, + "resources.postgres_branches.*.lifecycle.depends_on[*]": {"resource"}, - "resources.postgres_catalogs.*": {"postgres_database", "catalog_id"}, + "resources.postgres_catalogs.*": {"postgres_database", "catalog_id"}, + "resources.postgres_catalogs.*.lifecycle.depends_on[*]": {"resource"}, - "resources.postgres_databases.*": {"role", "database_id", "parent"}, + "resources.postgres_databases.*": {"role", "database_id", "parent"}, + "resources.postgres_databases.*.lifecycle.depends_on[*]": {"resource"}, - "resources.postgres_endpoints.*": {"endpoint_type", "endpoint_id", "parent"}, - "resources.postgres_endpoints.*.group": {"max", "min"}, + "resources.postgres_endpoints.*": {"endpoint_type", "endpoint_id", "parent"}, + "resources.postgres_endpoints.*.group": {"max", "min"}, + "resources.postgres_endpoints.*.lifecycle.depends_on[*]": {"resource"}, - "resources.postgres_projects.*": {"project_id"}, - "resources.postgres_projects.*.permissions[*]": {"level"}, + "resources.postgres_projects.*": {"project_id"}, + "resources.postgres_projects.*.lifecycle.depends_on[*]": {"resource"}, + "resources.postgres_projects.*.permissions[*]": {"level"}, - "resources.postgres_roles.*": {"role_id", "parent"}, + "resources.postgres_roles.*": {"role_id", "parent"}, + "resources.postgres_roles.*.lifecycle.depends_on[*]": {"resource"}, "resources.postgres_snapshot_schedules.*": {"branch"}, + "resources.postgres_snapshot_schedules.*.lifecycle.depends_on[*]": {"resource"}, "resources.postgres_snapshot_schedules.*.schedule[*]": {"retention"}, "resources.postgres_snapshot_schedules.*.schedule[*].monthly_schedule": {"day"}, "resources.postgres_snapshot_schedules.*.schedule[*].weekly_schedule": {"day_of_week"}, - "resources.postgres_synced_tables.*": {"synced_table_id"}, - "resources.postgres_synced_tables.*.extra_columns[*]": {"column_name", "column_type"}, - "resources.postgres_synced_tables.*.type_overrides[*]": {"column_name", "pg_type"}, + "resources.postgres_synced_tables.*": {"synced_table_id"}, + "resources.postgres_synced_tables.*.extra_columns[*]": {"column_name", "column_type"}, + "resources.postgres_synced_tables.*.lifecycle.depends_on[*]": {"resource"}, + "resources.postgres_synced_tables.*.type_overrides[*]": {"column_name", "pg_type"}, - "resources.quality_monitors.*": {"assets_dir", "output_schema_name", "table_name"}, - "resources.quality_monitors.*.custom_metrics[*]": {"definition", "input_columns", "name", "output_data_type", "type"}, - "resources.quality_monitors.*.inference_log": {"granularities", "model_id_col", "prediction_col", "problem_type", "timestamp_col"}, - "resources.quality_monitors.*.schedule": {"quartz_cron_expression", "timezone_id"}, - "resources.quality_monitors.*.time_series": {"granularities", "timestamp_col"}, + "resources.quality_monitors.*": {"assets_dir", "output_schema_name", "table_name"}, + "resources.quality_monitors.*.custom_metrics[*]": {"definition", "input_columns", "name", "output_data_type", "type"}, + "resources.quality_monitors.*.inference_log": {"granularities", "model_id_col", "prediction_col", "problem_type", "timestamp_col"}, + "resources.quality_monitors.*.lifecycle.depends_on[*]": {"resource"}, + "resources.quality_monitors.*.schedule": {"quartz_cron_expression", "timezone_id"}, + "resources.quality_monitors.*.time_series": {"granularities", "timestamp_col"}, - "resources.schemas.*": {"catalog_name", "name"}, + "resources.registered_models.*.lifecycle.depends_on[*]": {"resource"}, - "resources.secret_scopes.*": {"name"}, - "resources.secret_scopes.*.keyvault_metadata": {"dns_name", "resource_id"}, - "resources.secret_scopes.*.permissions[*]": {"level"}, + "resources.schemas.*": {"catalog_name", "name"}, + "resources.schemas.*.lifecycle.depends_on[*]": {"resource"}, - "resources.secrets.*": {"catalog_name", "name", "schema_name", "value"}, + "resources.secret_scopes.*": {"name"}, + "resources.secret_scopes.*.keyvault_metadata": {"dns_name", "resource_id"}, + "resources.secret_scopes.*.lifecycle.depends_on[*]": {"resource"}, + "resources.secret_scopes.*.permissions[*]": {"level"}, - "resources.sql_warehouses.*.permissions[*]": {"level"}, + "resources.secrets.*": {"catalog_name", "name", "schema_name", "value"}, + "resources.secrets.*.lifecycle.depends_on[*]": {"resource"}, - "resources.synced_database_tables.*": {"name"}, - "resources.synced_database_tables.*.spec.type_overrides[*]": {"column_name", "pg_type"}, + "resources.sql_warehouses.*.lifecycle.depends_on[*]": {"resource"}, + "resources.sql_warehouses.*.permissions[*]": {"level"}, - "resources.vector_search_endpoints.*": {"endpoint_type", "name"}, - "resources.vector_search_endpoints.*.permissions[*]": {"level"}, + "resources.synced_database_tables.*": {"name"}, + "resources.synced_database_tables.*.lifecycle.depends_on[*]": {"resource"}, + "resources.synced_database_tables.*.spec.type_overrides[*]": {"column_name", "pg_type"}, - "resources.vector_search_indexes.*": {"endpoint_name", "index_type", "name", "primary_key"}, + "resources.vector_search_endpoints.*": {"endpoint_type", "name"}, + "resources.vector_search_endpoints.*.lifecycle.depends_on[*]": {"resource"}, + "resources.vector_search_endpoints.*.permissions[*]": {"level"}, - "resources.volumes.*": {"catalog_name", "name", "schema_name", "volume_type"}, + "resources.vector_search_indexes.*": {"endpoint_name", "index_type", "name", "primary_key"}, + "resources.vector_search_indexes.*.lifecycle.depends_on[*]": {"resource"}, + + "resources.volumes.*": {"catalog_name", "name", "schema_name", "volume_type"}, + "resources.volumes.*.lifecycle.depends_on[*]": {"resource"}, "scripts.*": {"content"}, } diff --git a/bundle/internal/validation/required.go b/bundle/internal/validation/required.go index 045ac32257a..5c0d5fd9aba 100644 --- a/bundle/internal/validation/required.go +++ b/bundle/internal/validation/required.go @@ -78,8 +78,12 @@ func extractRequiredFields(typ reflect.Type) ([]RequiredPatternInfo, error) { return true } + // A struct that shadows an embedded field of the same JSON name (e.g. apps' lifecycle + // over BaseResource's) is walked twice, so the same field can be reported twice. parentPath := path.Parent().String() - fieldsByPattern[parentPath] = append(fieldsByPattern[parentPath], fieldName) + if !slices.Contains(fieldsByPattern[parentPath], fieldName) { + fieldsByPattern[parentPath] = append(fieldsByPattern[parentPath], fieldName) + } return true }) diff --git a/bundle/migrate/build_state.go b/bundle/migrate/build_state.go index 62d68905dc4..be8132fd82d 100644 --- a/bundle/migrate/build_state.go +++ b/bundle/migrate/build_state.go @@ -153,6 +153,15 @@ func BuildStateFromTF( } } } + lifecycleDeps, err := direct.LifecycleDependsOn(configRoot, inputConfig) + if err != nil { + return warningsSeen, fmt.Errorf("%s: %w", node, err) + } + for _, dep := range lifecycleDeps { + if !slices.Contains(dependsOn, dep) { + dependsOn = append(dependsOn, dep) + } + } slices.SortFunc(dependsOn, func(a, b deployplan.DependsOnEntry) int { if a.Node != b.Node { return strings.Compare(a.Node, b.Node) diff --git a/bundle/phases/initialize.go b/bundle/phases/initialize.go index 902a277b018..e58a70eb215 100644 --- a/bundle/phases/initialize.go +++ b/bundle/phases/initialize.go @@ -204,6 +204,10 @@ func Initialize(ctx context.Context, b *bundle.Bundle) { // Reject invalid job_runs.lifecycle.triggers (empty, false, prevent_destroy). mutator.ValidateJobRunTriggers(), + // Reads (dynamic): resources.*.*.lifecycle.depends_on + // Rejects entries that point to a missing or ambiguous resource, or to the resource itself. + validate.LifecycleDependsOn(), + // Reads (dynamic): * (strings) (searches for ${resources.*} references) // Errors when a cross-resource reference points to a Terraform-only field // with no DABs equivalent. diff --git a/bundle/schema/jsonschema.json b/bundle/schema/jsonschema.json index 76a608b5275..036d2f34843 100644 --- a/bundle/schema/jsonschema.json +++ b/bundle/schema/jsonschema.json @@ -954,6 +954,27 @@ } ] }, + "resources.DependsOn": { + "oneOf": [ + { + "type": "object", + "properties": { + "resource": { + "description": "Key of the resource to depend on, as `foo` or `jobs.foo`.", + "$ref": "#/$defs/string" + } + }, + "additionalProperties": false, + "required": [ + "resource" + ] + }, + { + "type": "string", + "pattern": "\\$\\{(var(\\._*\\p{L}+([-_]*[\\p{L}\\p{N}]+)*(\\[[0-9]+\\])*)+)\\}" + } + ] + }, "resources.ExternalLocation": { "oneOf": [ { @@ -1613,6 +1634,10 @@ { "type": "object", "properties": { + "depends_on": { + "description": "Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering.", + "$ref": "#/$defs/slice/github.com/databricks/cli/bundle/config/resources.DependsOn" + }, "prevent_destroy": { "description": "Lifecycle setting to prevent the resource from being destroyed.", "$ref": "#/$defs/bool" @@ -1657,6 +1682,10 @@ { "type": "object", "properties": { + "depends_on": { + "description": "Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering.", + "$ref": "#/$defs/slice/github.com/databricks/cli/bundle/config/resources.DependsOn" + }, "prevent_destroy": { "description": "Lifecycle setting to prevent the resource from being destroyed.", "$ref": "#/$defs/bool" @@ -1675,6 +1704,10 @@ { "type": "object", "properties": { + "depends_on": { + "description": "Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering.", + "$ref": "#/$defs/slice/github.com/databricks/cli/bundle/config/resources.DependsOn" + }, "prevent_destroy": { "description": "Lifecycle setting to prevent the resource from being destroyed.", "$ref": "#/$defs/bool" @@ -20626,6 +20659,20 @@ } ] }, + "resources.DependsOn": { + "oneOf": [ + { + "type": "array", + "items": { + "$ref": "#/$defs/github.com/databricks/cli/bundle/config/resources.DependsOn" + } + }, + { + "type": "string", + "pattern": "\\$\\{(var(\\._*\\p{L}+([-_]*[\\p{L}\\p{N}]+)*(\\[[0-9]+\\])*)+)\\}" + } + ] + }, "resources.InstancePoolPermission": { "oneOf": [ { diff --git a/python/databricks/bundles/alerts/__init__.py b/python/databricks/bundles/alerts/__init__.py index 3d8987ba271..edc2e7294d9 100644 --- a/python/databricks/bundles/alerts/__init__.py +++ b/python/databricks/bundles/alerts/__init__.py @@ -39,6 +39,9 @@ "CronScheduleParam", "CustomTemplateFormat", "CustomTemplateFormatParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -111,6 +114,11 @@ CustomTemplateFormat, CustomTemplateFormatParam, ) +from databricks.bundles.alerts._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.alerts._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/alerts/_models/alert.py b/python/databricks/bundles/alerts/_models/alert.py index 2a66b1d169c..326ddfec556 100644 --- a/python/databricks/bundles/alerts/_models/alert.py +++ b/python/databricks/bundles/alerts/_models/alert.py @@ -23,7 +23,10 @@ CustomTemplateFormat, CustomTemplateFormatParam, ) -from databricks.bundles.alerts._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.alerts._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.alerts._models.permission import Permission, PermissionParam from databricks.bundles.core._resource import Resource from databricks.bundles.core._transform import _transform diff --git a/python/databricks/bundles/alerts/_models/depends_on.py b/python/databricks/bundles/alerts/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/alerts/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/alerts/_models/lifecycle.py b/python/databricks/bundles/alerts/_models/lifecycle.py index 697776a198e..3f8bb9dec50 100644 --- a/python/databricks/bundles/alerts/_models/lifecycle.py +++ b/python/databricks/bundles/alerts/_models/lifecycle.py @@ -1,11 +1,12 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict +from databricks.bundles.alerts._models.depends_on import DependsOn, DependsOnParam from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +16,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +37,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/apps/__init__.py b/python/databricks/bundles/apps/__init__.py index 7b92e6d61bb..944c7424fd5 100644 --- a/python/databricks/bundles/apps/__init__.py +++ b/python/databricks/bundles/apps/__init__.py @@ -72,6 +72,9 @@ "AppResourceUcSecurableUcSecurableTypeParam", "ComputeSize", "ComputeSizeParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "GitRepository", "GitRepositoryDict", "GitRepositoryParam", @@ -210,6 +213,11 @@ AppResourceUcSecurableUcSecurableTypeParam, ) from databricks.bundles.apps._models.compute_size import ComputeSize, ComputeSizeParam +from databricks.bundles.apps._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.apps._models.git_repository import ( GitRepository, GitRepositoryDict, diff --git a/python/databricks/bundles/apps/_models/depends_on.py b/python/databricks/bundles/apps/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/apps/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/apps/_models/lifecycle_with_started.py b/python/databricks/bundles/apps/_models/lifecycle_with_started.py index f9cb9b8d49c..0784bf0e2e7 100644 --- a/python/databricks/bundles/apps/_models/lifecycle_with_started.py +++ b/python/databricks/bundles/apps/_models/lifecycle_with_started.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict +from databricks.bundles.apps._models.depends_on import ( + DependsOn, + DependsOnParam, +) from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class LifecycleWithStarted: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -36,6 +45,11 @@ def as_dict(self) -> "LifecycleWithStartedDict": class LifecycleWithStartedDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/catalogs/__init__.py b/python/databricks/bundles/catalogs/__init__.py index f36750b4816..fced08f1bb2 100644 --- a/python/databricks/bundles/catalogs/__init__.py +++ b/python/databricks/bundles/catalogs/__init__.py @@ -12,6 +12,9 @@ "CatalogGrantPrivilege", "CatalogGrantPrivilegeParam", "CatalogParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EncryptionSettings", "EncryptionSettingsDict", "EncryptionSettingsParam", @@ -36,6 +39,11 @@ CatalogDict, CatalogParam, ) +from databricks.bundles.catalogs._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.catalogs._models.encryption_settings import ( EncryptionSettings, EncryptionSettingsDict, diff --git a/python/databricks/bundles/catalogs/_models/catalog.py b/python/databricks/bundles/catalogs/_models/catalog.py index bdb397b0cb0..1f8f3e95b7a 100644 --- a/python/databricks/bundles/catalogs/_models/catalog.py +++ b/python/databricks/bundles/catalogs/_models/catalog.py @@ -7,7 +7,10 @@ EncryptionSettings, EncryptionSettingsParam, ) -from databricks.bundles.catalogs._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.catalogs._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.catalogs._models.privilege_assignment import ( PrivilegeAssignment, PrivilegeAssignmentParam, diff --git a/python/databricks/bundles/catalogs/_models/depends_on.py b/python/databricks/bundles/catalogs/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/catalogs/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/catalogs/_models/lifecycle.py b/python/databricks/bundles/catalogs/_models/lifecycle.py index 697776a198e..0a9985c5b30 100644 --- a/python/databricks/bundles/catalogs/_models/lifecycle.py +++ b/python/databricks/bundles/catalogs/_models/lifecycle.py @@ -1,11 +1,12 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict +from databricks.bundles.catalogs._models.depends_on import DependsOn, DependsOnParam from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +16,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +37,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/cluster_policies/__init__.py b/python/databricks/bundles/cluster_policies/__init__.py index 531fa17821a..5f5790166f7 100644 --- a/python/databricks/bundles/cluster_policies/__init__.py +++ b/python/databricks/bundles/cluster_policies/__init__.py @@ -9,6 +9,9 @@ "ClusterPolicyPermissionLevel", "ClusterPolicyPermissionLevelParam", "ClusterPolicyPermissionParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Library", "LibraryDict", "LibraryParam", @@ -41,6 +44,11 @@ ClusterPolicyPermissionLevel, ClusterPolicyPermissionLevelParam, ) +from databricks.bundles.cluster_policies._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.cluster_policies._models.library import ( Library, LibraryDict, diff --git a/python/databricks/bundles/cluster_policies/_models/depends_on.py b/python/databricks/bundles/cluster_policies/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/cluster_policies/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/cluster_policies/_models/lifecycle.py b/python/databricks/bundles/cluster_policies/_models/lifecycle.py index 697776a198e..ccec29db600 100644 --- a/python/databricks/bundles/cluster_policies/_models/lifecycle.py +++ b/python/databricks/bundles/cluster_policies/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict +from databricks.bundles.cluster_policies._models.depends_on import ( + DependsOn, + DependsOnParam, +) from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/clusters/__init__.py b/python/databricks/bundles/clusters/__init__.py index 0ccecb208b0..feaa262198f 100644 --- a/python/databricks/bundles/clusters/__init__.py +++ b/python/databricks/bundles/clusters/__init__.py @@ -40,6 +40,9 @@ "DbfsStorageInfoParam", "DependencyMode", "DependencyModeParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "DockerBasicAuth", "DockerBasicAuthDict", "DockerBasicAuthParam", @@ -171,6 +174,11 @@ DependencyMode, DependencyModeParam, ) +from databricks.bundles.clusters._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.clusters._models.docker_basic_auth import ( DockerBasicAuth, DockerBasicAuthDict, diff --git a/python/databricks/bundles/clusters/_models/depends_on.py b/python/databricks/bundles/clusters/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/clusters/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/clusters/_models/lifecycle_with_started.py b/python/databricks/bundles/clusters/_models/lifecycle_with_started.py index f9cb9b8d49c..68aa5088083 100644 --- a/python/databricks/bundles/clusters/_models/lifecycle_with_started.py +++ b/python/databricks/bundles/clusters/_models/lifecycle_with_started.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict +from databricks.bundles.clusters._models.depends_on import ( + DependsOn, + DependsOnParam, +) from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class LifecycleWithStarted: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -36,6 +45,11 @@ def as_dict(self) -> "LifecycleWithStartedDict": class LifecycleWithStartedDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/dashboards/__init__.py b/python/databricks/bundles/dashboards/__init__.py index 126427fcca6..7e383631fb2 100644 --- a/python/databricks/bundles/dashboards/__init__.py +++ b/python/databricks/bundles/dashboards/__init__.py @@ -4,6 +4,9 @@ "Dashboard", "DashboardDict", "DashboardParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -22,6 +25,11 @@ DashboardDict, DashboardParam, ) +from databricks.bundles.dashboards._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.dashboards._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/dashboards/_models/dashboard.py b/python/databricks/bundles/dashboards/_models/dashboard.py index 2a3e5f03364..d7efbdf814f 100644 --- a/python/databricks/bundles/dashboards/_models/dashboard.py +++ b/python/databricks/bundles/dashboards/_models/dashboard.py @@ -7,7 +7,10 @@ from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value from databricks.bundles.core._variable import VariableOrList, VariableOrOptional -from databricks.bundles.dashboards._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.dashboards._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.dashboards._models.lifecycle_state import ( LifecycleState, LifecycleStateParam, diff --git a/python/databricks/bundles/dashboards/_models/depends_on.py b/python/databricks/bundles/dashboards/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/dashboards/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/dashboards/_models/lifecycle.py b/python/databricks/bundles/dashboards/_models/lifecycle.py index 697776a198e..fa61e0279a4 100644 --- a/python/databricks/bundles/dashboards/_models/lifecycle.py +++ b/python/databricks/bundles/dashboards/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.dashboards._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/database_catalogs/__init__.py b/python/databricks/bundles/database_catalogs/__init__.py index fdd1d167302..a02e6710b39 100644 --- a/python/databricks/bundles/database_catalogs/__init__.py +++ b/python/databricks/bundles/database_catalogs/__init__.py @@ -4,6 +4,9 @@ "DatabaseCatalog", "DatabaseCatalogDict", "DatabaseCatalogParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -15,6 +18,11 @@ DatabaseCatalogDict, DatabaseCatalogParam, ) +from databricks.bundles.database_catalogs._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.database_catalogs._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/database_catalogs/_models/depends_on.py b/python/databricks/bundles/database_catalogs/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/database_catalogs/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/database_catalogs/_models/lifecycle.py b/python/databricks/bundles/database_catalogs/_models/lifecycle.py index 697776a198e..098d125a985 100644 --- a/python/databricks/bundles/database_catalogs/_models/lifecycle.py +++ b/python/databricks/bundles/database_catalogs/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.database_catalogs._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/database_instances/__init__.py b/python/databricks/bundles/database_instances/__init__.py index 13674b646a5..f6b05ef2765 100644 --- a/python/databricks/bundles/database_instances/__init__.py +++ b/python/databricks/bundles/database_instances/__init__.py @@ -10,6 +10,9 @@ "DatabaseInstanceRef", "DatabaseInstanceRefDict", "DatabaseInstanceRefParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -36,6 +39,11 @@ DatabaseInstanceRefDict, DatabaseInstanceRefParam, ) +from databricks.bundles.database_instances._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.database_instances._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/database_instances/_models/depends_on.py b/python/databricks/bundles/database_instances/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/database_instances/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/database_instances/_models/lifecycle.py b/python/databricks/bundles/database_instances/_models/lifecycle.py index 697776a198e..2e81c847cc6 100644 --- a/python/databricks/bundles/database_instances/_models/lifecycle.py +++ b/python/databricks/bundles/database_instances/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.database_instances._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/experiments/__init__.py b/python/databricks/bundles/experiments/__init__.py index e1ae26cc521..78726dd8002 100644 --- a/python/databricks/bundles/experiments/__init__.py +++ b/python/databricks/bundles/experiments/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "ExperimentPermissionLevel", "ExperimentPermissionLevelParam", "ExperimentTag", @@ -24,6 +27,11 @@ ] +from databricks.bundles.experiments._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.experiments._models.experiment_permission_level import ( ExperimentPermissionLevel, ExperimentPermissionLevelParam, diff --git a/python/databricks/bundles/experiments/_models/depends_on.py b/python/databricks/bundles/experiments/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/experiments/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/experiments/_models/lifecycle.py b/python/databricks/bundles/experiments/_models/lifecycle.py index 697776a198e..f2b82bf9aa2 100644 --- a/python/databricks/bundles/experiments/_models/lifecycle.py +++ b/python/databricks/bundles/experiments/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.experiments._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/experiments/_models/mlflow_experiment.py b/python/databricks/bundles/experiments/_models/mlflow_experiment.py index 8a9d5368e99..bafe167f2f8 100644 --- a/python/databricks/bundles/experiments/_models/mlflow_experiment.py +++ b/python/databricks/bundles/experiments/_models/mlflow_experiment.py @@ -19,10 +19,7 @@ ExperimentTraceLocation, ExperimentTraceLocationParam, ) -from databricks.bundles.experiments._models.lifecycle import ( - Lifecycle, - LifecycleParam, -) +from databricks.bundles.experiments._models.lifecycle import Lifecycle, LifecycleParam from databricks.bundles.experiments._models.mlflow_experiment_permission import ( MlflowExperimentPermission, MlflowExperimentPermissionParam, diff --git a/python/databricks/bundles/external_locations/__init__.py b/python/databricks/bundles/external_locations/__init__.py index d6aa3bf908c..18f867345b2 100644 --- a/python/databricks/bundles/external_locations/__init__.py +++ b/python/databricks/bundles/external_locations/__init__.py @@ -7,6 +7,9 @@ "AzureQueueStorage", "AzureQueueStorageDict", "AzureQueueStorageParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EncryptionDetails", "EncryptionDetailsDict", "EncryptionDetailsParam", @@ -45,6 +48,11 @@ AzureQueueStorageDict, AzureQueueStorageParam, ) +from databricks.bundles.external_locations._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.external_locations._models.encryption_details import ( EncryptionDetails, EncryptionDetailsDict, diff --git a/python/databricks/bundles/external_locations/_models/depends_on.py b/python/databricks/bundles/external_locations/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/external_locations/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/external_locations/_models/lifecycle.py b/python/databricks/bundles/external_locations/_models/lifecycle.py index 697776a198e..ace07eb75a1 100644 --- a/python/databricks/bundles/external_locations/_models/lifecycle.py +++ b/python/databricks/bundles/external_locations/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.external_locations._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/features/__init__.py b/python/databricks/bundles/features/__init__.py index ecf951b1e12..28b95182245 100644 --- a/python/databricks/bundles/features/__init__.py +++ b/python/databricks/bundles/features/__init__.py @@ -28,6 +28,9 @@ "DeltaTableSource", "DeltaTableSourceDict", "DeltaTableSourceParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EntityColumn", "EntityColumnDict", "EntityColumnParam", @@ -183,6 +186,11 @@ DeltaTableSourceDict, DeltaTableSourceParam, ) +from databricks.bundles.features._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.features._models.entity_column import ( EntityColumn, EntityColumnDict, diff --git a/python/databricks/bundles/features/_models/depends_on.py b/python/databricks/bundles/features/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/features/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/features/_models/feature.py b/python/databricks/bundles/features/_models/feature.py index d00ed799f92..b489a756bcc 100644 --- a/python/databricks/bundles/features/_models/feature.py +++ b/python/databricks/bundles/features/_models/feature.py @@ -23,10 +23,7 @@ Function, FunctionParam, ) -from databricks.bundles.features._models.lifecycle import ( - Lifecycle, - LifecycleParam, -) +from databricks.bundles.features._models.lifecycle import Lifecycle, LifecycleParam from databricks.bundles.features._models.lineage_context import ( LineageContext, LineageContextParam, diff --git a/python/databricks/bundles/features/_models/lifecycle.py b/python/databricks/bundles/features/_models/lifecycle.py index 697776a198e..53c3a4b38b9 100644 --- a/python/databricks/bundles/features/_models/lifecycle.py +++ b/python/databricks/bundles/features/_models/lifecycle.py @@ -1,11 +1,12 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.features._models.depends_on import DependsOn, DependsOnParam if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +16,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +37,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/genie_spaces/__init__.py b/python/databricks/bundles/genie_spaces/__init__.py index a56af37c716..960dd98014d 100644 --- a/python/databricks/bundles/genie_spaces/__init__.py +++ b/python/databricks/bundles/genie_spaces/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "GenieSpace", "GenieSpaceDict", "GenieSpaceParam", @@ -15,6 +18,11 @@ ] +from databricks.bundles.genie_spaces._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.genie_spaces._models.genie_space import ( GenieSpace, GenieSpaceDict, diff --git a/python/databricks/bundles/genie_spaces/_models/depends_on.py b/python/databricks/bundles/genie_spaces/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/genie_spaces/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/genie_spaces/_models/genie_space.py b/python/databricks/bundles/genie_spaces/_models/genie_space.py index bb1ec94c8df..6b7cd0532d4 100644 --- a/python/databricks/bundles/genie_spaces/_models/genie_space.py +++ b/python/databricks/bundles/genie_spaces/_models/genie_space.py @@ -7,7 +7,10 @@ from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value from databricks.bundles.core._variable import VariableOrList, VariableOrOptional -from databricks.bundles.genie_spaces._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.genie_spaces._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.genie_spaces._models.permission import ( Permission, PermissionParam, diff --git a/python/databricks/bundles/genie_spaces/_models/lifecycle.py b/python/databricks/bundles/genie_spaces/_models/lifecycle.py index 697776a198e..8e740937885 100644 --- a/python/databricks/bundles/genie_spaces/_models/lifecycle.py +++ b/python/databricks/bundles/genie_spaces/_models/lifecycle.py @@ -1,11 +1,12 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.genie_spaces._models.depends_on import DependsOn, DependsOnParam if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +16,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +37,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/instance_pools/__init__.py b/python/databricks/bundles/instance_pools/__init__.py index 2c5a0e1c4eb..782be8340a5 100644 --- a/python/databricks/bundles/instance_pools/__init__.py +++ b/python/databricks/bundles/instance_pools/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "DiskSpec", "DiskSpecDict", "DiskSpecParam", @@ -49,6 +52,11 @@ ] +from databricks.bundles.instance_pools._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.instance_pools._models.disk_spec import ( DiskSpec, DiskSpecDict, diff --git a/python/databricks/bundles/instance_pools/_models/depends_on.py b/python/databricks/bundles/instance_pools/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/instance_pools/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/instance_pools/_models/lifecycle.py b/python/databricks/bundles/instance_pools/_models/lifecycle.py index 697776a198e..182c0682172 100644 --- a/python/databricks/bundles/instance_pools/_models/lifecycle.py +++ b/python/databricks/bundles/instance_pools/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.instance_pools._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/job_runs/__init__.py b/python/databricks/bundles/job_runs/__init__.py index 093f2201409..4b83903777d 100644 --- a/python/databricks/bundles/job_runs/__init__.py +++ b/python/databricks/bundles/job_runs/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "JobRun", "JobRunDict", "JobRunLifecycle", @@ -21,6 +24,11 @@ ] +from databricks.bundles.job_runs._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.job_runs._models.job_run import JobRun, JobRunDict, JobRunParam from databricks.bundles.job_runs._models.job_run_lifecycle import ( JobRunLifecycle, diff --git a/python/databricks/bundles/job_runs/_models/depends_on.py b/python/databricks/bundles/job_runs/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/job_runs/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/job_runs/_models/job_run_lifecycle.py b/python/databricks/bundles/job_runs/_models/job_run_lifecycle.py index cb673b0245d..01d44e54ad3 100644 --- a/python/databricks/bundles/job_runs/_models/job_run_lifecycle.py +++ b/python/databricks/bundles/job_runs/_models/job_run_lifecycle.py @@ -6,6 +6,7 @@ from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.job_runs._models.depends_on import DependsOn, DependsOnParam from databricks.bundles.job_runs._models.job_run_trigger import ( JobRunTrigger, JobRunTriggerParam, @@ -19,6 +20,11 @@ class JobRunLifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -40,6 +46,11 @@ def as_dict(self) -> "JobRunLifecycleDict": class JobRunLifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/jobs/__init__.py b/python/databricks/bundles/jobs/__init__.py index 1df8be62977..d264ad85b57 100644 --- a/python/databricks/bundles/jobs/__init__.py +++ b/python/databricks/bundles/jobs/__init__.py @@ -92,6 +92,9 @@ "DbtTaskParam", "DependencyMode", "DependencyModeParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "DeploymentSpec", "DeploymentSpecDict", "DeploymentSpecParam", @@ -505,6 +508,11 @@ DependencyMode, DependencyModeParam, ) +from databricks.bundles.jobs._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.jobs._models.deployment_spec import ( DeploymentSpec, DeploymentSpecDict, diff --git a/python/databricks/bundles/jobs/_models/depends_on.py b/python/databricks/bundles/jobs/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/jobs/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/jobs/_models/lifecycle.py b/python/databricks/bundles/jobs/_models/lifecycle.py index 697776a198e..254663c54d0 100644 --- a/python/databricks/bundles/jobs/_models/lifecycle.py +++ b/python/databricks/bundles/jobs/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.jobs._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/mcp_services/__init__.py b/python/databricks/bundles/mcp_services/__init__.py index a4fe01b5199..981e709bff8 100644 --- a/python/databricks/bundles/mcp_services/__init__.py +++ b/python/databricks/bundles/mcp_services/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -28,6 +31,11 @@ ] +from databricks.bundles.mcp_services._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.mcp_services._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/mcp_services/_models/depends_on.py b/python/databricks/bundles/mcp_services/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/mcp_services/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/mcp_services/_models/lifecycle.py b/python/databricks/bundles/mcp_services/_models/lifecycle.py index 697776a198e..eca16a56d15 100644 --- a/python/databricks/bundles/mcp_services/_models/lifecycle.py +++ b/python/databricks/bundles/mcp_services/_models/lifecycle.py @@ -1,11 +1,12 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.mcp_services._models.depends_on import DependsOn, DependsOnParam if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +16,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +37,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/mcp_services/_models/mcp_service.py b/python/databricks/bundles/mcp_services/_models/mcp_service.py index 1050e5153f4..129935ea097 100644 --- a/python/databricks/bundles/mcp_services/_models/mcp_service.py +++ b/python/databricks/bundles/mcp_services/_models/mcp_service.py @@ -11,10 +11,7 @@ VariableOrList, VariableOrOptional, ) -from databricks.bundles.mcp_services._models.lifecycle import ( - Lifecycle, - LifecycleParam, -) +from databricks.bundles.mcp_services._models.lifecycle import Lifecycle, LifecycleParam from databricks.bundles.mcp_services._models.mcp_service_config import ( McpServiceConfig, McpServiceConfigParam, diff --git a/python/databricks/bundles/model_provider_services/__init__.py b/python/databricks/bundles/model_provider_services/__init__.py index e7b2a5b13f7..57b9bb80463 100644 --- a/python/databricks/bundles/model_provider_services/__init__.py +++ b/python/databricks/bundles/model_provider_services/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "InferenceTableConfig", "InferenceTableConfigDict", "InferenceTableConfigParam", @@ -99,6 +102,11 @@ ] +from databricks.bundles.model_provider_services._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.model_provider_services._models.inference_table_config import ( InferenceTableConfig, InferenceTableConfigDict, diff --git a/python/databricks/bundles/model_provider_services/_models/depends_on.py b/python/databricks/bundles/model_provider_services/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/model_provider_services/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/model_provider_services/_models/lifecycle.py b/python/databricks/bundles/model_provider_services/_models/lifecycle.py index 697776a198e..2837780438d 100644 --- a/python/databricks/bundles/model_provider_services/_models/lifecycle.py +++ b/python/databricks/bundles/model_provider_services/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.model_provider_services._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/model_services/__init__.py b/python/databricks/bundles/model_services/__init__.py index 9e10e6df19c..2e40ce88cb2 100644 --- a/python/databricks/bundles/model_services/__init__.py +++ b/python/databricks/bundles/model_services/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "InferenceTableConfig", "InferenceTableConfigDict", "InferenceTableConfigParam", @@ -51,6 +54,11 @@ ] +from databricks.bundles.model_services._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.model_services._models.inference_table_config import ( InferenceTableConfig, InferenceTableConfigDict, diff --git a/python/databricks/bundles/model_services/_models/depends_on.py b/python/databricks/bundles/model_services/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/model_services/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/model_services/_models/lifecycle.py b/python/databricks/bundles/model_services/_models/lifecycle.py index 697776a198e..fa15d53667c 100644 --- a/python/databricks/bundles/model_services/_models/lifecycle.py +++ b/python/databricks/bundles/model_services/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.model_services._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/model_serving_endpoints/__init__.py b/python/databricks/bundles/model_serving_endpoints/__init__.py index 0137c5e76b9..be47098b53e 100644 --- a/python/databricks/bundles/model_serving_endpoints/__init__.py +++ b/python/databricks/bundles/model_serving_endpoints/__init__.py @@ -57,6 +57,9 @@ "DatabricksModelServingConfig", "DatabricksModelServingConfigDict", "DatabricksModelServingConfigParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EmailNotifications", "EmailNotificationsDict", "EmailNotificationsParam", @@ -227,6 +230,11 @@ DatabricksModelServingConfigDict, DatabricksModelServingConfigParam, ) +from databricks.bundles.model_serving_endpoints._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.model_serving_endpoints._models.email_notifications import ( EmailNotifications, EmailNotificationsDict, diff --git a/python/databricks/bundles/model_serving_endpoints/_models/depends_on.py b/python/databricks/bundles/model_serving_endpoints/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/model_serving_endpoints/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/model_serving_endpoints/_models/lifecycle.py b/python/databricks/bundles/model_serving_endpoints/_models/lifecycle.py index 697776a198e..f6e3412eb9a 100644 --- a/python/databricks/bundles/model_serving_endpoints/_models/lifecycle.py +++ b/python/databricks/bundles/model_serving_endpoints/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.model_serving_endpoints._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/models/__init__.py b/python/databricks/bundles/models/__init__.py index a3469f1689e..fa9922454b7 100644 --- a/python/databricks/bundles/models/__init__.py +++ b/python/databricks/bundles/models/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -18,6 +21,11 @@ ] +from databricks.bundles.models._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.models._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/models/_models/depends_on.py b/python/databricks/bundles/models/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/models/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/models/_models/lifecycle.py b/python/databricks/bundles/models/_models/lifecycle.py index 697776a198e..ed360157ba8 100644 --- a/python/databricks/bundles/models/_models/lifecycle.py +++ b/python/databricks/bundles/models/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.models._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/models/_models/mlflow_model.py b/python/databricks/bundles/models/_models/mlflow_model.py index 390f1155f2c..97c21186983 100644 --- a/python/databricks/bundles/models/_models/mlflow_model.py +++ b/python/databricks/bundles/models/_models/mlflow_model.py @@ -11,7 +11,10 @@ VariableOrList, VariableOrOptional, ) -from databricks.bundles.models._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.models._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.models._models.mlflow_model_permission import ( MlflowModelPermission, MlflowModelPermissionParam, diff --git a/python/databricks/bundles/pipelines/__init__.py b/python/databricks/bundles/pipelines/__init__.py index 2b66e4f795c..394a4977bb9 100644 --- a/python/databricks/bundles/pipelines/__init__.py +++ b/python/databricks/bundles/pipelines/__init__.py @@ -53,6 +53,9 @@ "DbfsStorageInfo", "DbfsStorageInfoDict", "DbfsStorageInfoParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EbsVolumeType", "EbsVolumeTypeParam", "EventLogSpec", @@ -374,6 +377,11 @@ DbfsStorageInfoDict, DbfsStorageInfoParam, ) +from databricks.bundles.pipelines._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.pipelines._models.ebs_volume_type import ( EbsVolumeType, EbsVolumeTypeParam, diff --git a/python/databricks/bundles/pipelines/_models/depends_on.py b/python/databricks/bundles/pipelines/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/pipelines/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/pipelines/_models/lifecycle.py b/python/databricks/bundles/pipelines/_models/lifecycle.py index 697776a198e..6ef8f4fc104 100644 --- a/python/databricks/bundles/pipelines/_models/lifecycle.py +++ b/python/databricks/bundles/pipelines/_models/lifecycle.py @@ -1,11 +1,12 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.pipelines._models.depends_on import DependsOn, DependsOnParam if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +16,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +37,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/pipelines/_models/pipeline.py b/python/databricks/bundles/pipelines/_models/pipeline.py index 5e4b04bb726..070e813ef34 100644 --- a/python/databricks/bundles/pipelines/_models/pipeline.py +++ b/python/databricks/bundles/pipelines/_models/pipeline.py @@ -27,7 +27,10 @@ IngestionPipelineDefinition, IngestionPipelineDefinitionParam, ) -from databricks.bundles.pipelines._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.pipelines._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.pipelines._models.notifications import ( Notifications, NotificationsParam, diff --git a/python/databricks/bundles/quality_monitors/__init__.py b/python/databricks/bundles/quality_monitors/__init__.py index ad0902bfcf6..806df764ade 100644 --- a/python/databricks/bundles/quality_monitors/__init__.py +++ b/python/databricks/bundles/quality_monitors/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -40,6 +43,11 @@ ] +from databricks.bundles.quality_monitors._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.quality_monitors._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/quality_monitors/_models/depends_on.py b/python/databricks/bundles/quality_monitors/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/quality_monitors/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/quality_monitors/_models/lifecycle.py b/python/databricks/bundles/quality_monitors/_models/lifecycle.py index 697776a198e..53ba2aafd3d 100644 --- a/python/databricks/bundles/quality_monitors/_models/lifecycle.py +++ b/python/databricks/bundles/quality_monitors/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.quality_monitors._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/registered_models/__init__.py b/python/databricks/bundles/registered_models/__init__.py index a7ae3ba9ef3..e193f063599 100644 --- a/python/databricks/bundles/registered_models/__init__.py +++ b/python/databricks/bundles/registered_models/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -18,6 +21,11 @@ ] +from databricks.bundles.registered_models._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.registered_models._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/registered_models/_models/depends_on.py b/python/databricks/bundles/registered_models/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/registered_models/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/registered_models/_models/lifecycle.py b/python/databricks/bundles/registered_models/_models/lifecycle.py index 697776a198e..b8642305131 100644 --- a/python/databricks/bundles/registered_models/_models/lifecycle.py +++ b/python/databricks/bundles/registered_models/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.registered_models._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/schemas/__init__.py b/python/databricks/bundles/schemas/__init__.py index e891669012c..60ce398bd97 100644 --- a/python/databricks/bundles/schemas/__init__.py +++ b/python/databricks/bundles/schemas/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -20,6 +23,11 @@ ] +from databricks.bundles.schemas._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.schemas._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/schemas/_models/depends_on.py b/python/databricks/bundles/schemas/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/schemas/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/schemas/_models/lifecycle.py b/python/databricks/bundles/schemas/_models/lifecycle.py index 697776a198e..c8467b44428 100644 --- a/python/databricks/bundles/schemas/_models/lifecycle.py +++ b/python/databricks/bundles/schemas/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.schemas._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/schemas/_models/schema.py b/python/databricks/bundles/schemas/_models/schema.py index 32ff22c8227..eaa1f023cf9 100644 --- a/python/databricks/bundles/schemas/_models/schema.py +++ b/python/databricks/bundles/schemas/_models/schema.py @@ -12,7 +12,10 @@ VariableOrList, VariableOrOptional, ) -from databricks.bundles.schemas._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.schemas._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.schemas._models.privilege_assignment import ( PrivilegeAssignment, PrivilegeAssignmentParam, diff --git a/python/databricks/bundles/secret_scopes/__init__.py b/python/databricks/bundles/secret_scopes/__init__.py index 1f3d9c9555d..d85f347bbba 100644 --- a/python/databricks/bundles/secret_scopes/__init__.py +++ b/python/databricks/bundles/secret_scopes/__init__.py @@ -4,6 +4,9 @@ "AzureKeyVaultSecretScopeMetadata", "AzureKeyVaultSecretScopeMetadataDict", "AzureKeyVaultSecretScopeMetadataParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -25,6 +28,11 @@ AzureKeyVaultSecretScopeMetadataDict, AzureKeyVaultSecretScopeMetadataParam, ) +from databricks.bundles.secret_scopes._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.secret_scopes._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/secret_scopes/_models/depends_on.py b/python/databricks/bundles/secret_scopes/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/secret_scopes/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/secret_scopes/_models/lifecycle.py b/python/databricks/bundles/secret_scopes/_models/lifecycle.py index 697776a198e..7f1b17140e0 100644 --- a/python/databricks/bundles/secret_scopes/_models/lifecycle.py +++ b/python/databricks/bundles/secret_scopes/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.secret_scopes._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/secret_scopes/_models/secret_scope.py b/python/databricks/bundles/secret_scopes/_models/secret_scope.py index 5e436f1d247..022aaafb82d 100644 --- a/python/databricks/bundles/secret_scopes/_models/secret_scope.py +++ b/python/databricks/bundles/secret_scopes/_models/secret_scope.py @@ -15,7 +15,10 @@ AzureKeyVaultSecretScopeMetadata, AzureKeyVaultSecretScopeMetadataParam, ) -from databricks.bundles.secret_scopes._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.secret_scopes._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.secret_scopes._models.scope_backend_type import ( ScopeBackendType, ScopeBackendTypeParam, diff --git a/python/databricks/bundles/secrets/__init__.py b/python/databricks/bundles/secrets/__init__.py index 6bc14c2a19d..138d56de11b 100644 --- a/python/databricks/bundles/secrets/__init__.py +++ b/python/databricks/bundles/secrets/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -15,6 +18,11 @@ ] +from databricks.bundles.secrets._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.secrets._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/secrets/_models/depends_on.py b/python/databricks/bundles/secrets/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/secrets/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/secrets/_models/lifecycle.py b/python/databricks/bundles/secrets/_models/lifecycle.py index 697776a198e..1bd7bc1189a 100644 --- a/python/databricks/bundles/secrets/_models/lifecycle.py +++ b/python/databricks/bundles/secrets/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.secrets._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/secrets/_models/secret.py b/python/databricks/bundles/secrets/_models/secret.py index b0db4c03ada..d6af914a045 100644 --- a/python/databricks/bundles/secrets/_models/secret.py +++ b/python/databricks/bundles/secrets/_models/secret.py @@ -11,7 +11,10 @@ VariableOrList, VariableOrOptional, ) -from databricks.bundles.secrets._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.secrets._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.secrets._models.privilege_assignment import ( PrivilegeAssignment, PrivilegeAssignmentParam, diff --git a/python/databricks/bundles/sql_warehouses/__init__.py b/python/databricks/bundles/sql_warehouses/__init__.py index 4866d2ca86e..3f19eb82205 100644 --- a/python/databricks/bundles/sql_warehouses/__init__.py +++ b/python/databricks/bundles/sql_warehouses/__init__.py @@ -8,6 +8,9 @@ "ChannelParam", "CreateWarehouseRequestWarehouseType", "CreateWarehouseRequestWarehouseTypeParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EndpointTagPair", "EndpointTagPairDict", "EndpointTagPairParam", @@ -43,6 +46,11 @@ CreateWarehouseRequestWarehouseType, CreateWarehouseRequestWarehouseTypeParam, ) +from databricks.bundles.sql_warehouses._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.sql_warehouses._models.endpoint_tag_pair import ( EndpointTagPair, EndpointTagPairDict, diff --git a/python/databricks/bundles/sql_warehouses/_models/depends_on.py b/python/databricks/bundles/sql_warehouses/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/sql_warehouses/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/sql_warehouses/_models/lifecycle_with_started.py b/python/databricks/bundles/sql_warehouses/_models/lifecycle_with_started.py index f9cb9b8d49c..54f0d97ae5a 100644 --- a/python/databricks/bundles/sql_warehouses/_models/lifecycle_with_started.py +++ b/python/databricks/bundles/sql_warehouses/_models/lifecycle_with_started.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.sql_warehouses._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class LifecycleWithStarted: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -36,6 +45,11 @@ def as_dict(self) -> "LifecycleWithStartedDict": class LifecycleWithStartedDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/synced_database_tables/__init__.py b/python/databricks/bundles/synced_database_tables/__init__.py index 0b3a240e460..c626e16396c 100644 --- a/python/databricks/bundles/synced_database_tables/__init__.py +++ b/python/databricks/bundles/synced_database_tables/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -23,6 +26,11 @@ ] +from databricks.bundles.synced_database_tables._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.synced_database_tables._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/synced_database_tables/_models/depends_on.py b/python/databricks/bundles/synced_database_tables/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/synced_database_tables/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/synced_database_tables/_models/lifecycle.py b/python/databricks/bundles/synced_database_tables/_models/lifecycle.py index 697776a198e..6145aa8ac96 100644 --- a/python/databricks/bundles/synced_database_tables/_models/lifecycle.py +++ b/python/databricks/bundles/synced_database_tables/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.synced_database_tables._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/vector_search_endpoints/__init__.py b/python/databricks/bundles/vector_search_endpoints/__init__.py index aabc0081f5d..ad58a72b996 100644 --- a/python/databricks/bundles/vector_search_endpoints/__init__.py +++ b/python/databricks/bundles/vector_search_endpoints/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "EndpointType", "EndpointTypeParam", "Lifecycle", @@ -17,6 +20,11 @@ ] +from databricks.bundles.vector_search_endpoints._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.vector_search_endpoints._models.endpoint_type import ( EndpointType, EndpointTypeParam, diff --git a/python/databricks/bundles/vector_search_endpoints/_models/depends_on.py b/python/databricks/bundles/vector_search_endpoints/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/vector_search_endpoints/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/vector_search_endpoints/_models/lifecycle.py b/python/databricks/bundles/vector_search_endpoints/_models/lifecycle.py index 697776a198e..45f1d1427b3 100644 --- a/python/databricks/bundles/vector_search_endpoints/_models/lifecycle.py +++ b/python/databricks/bundles/vector_search_endpoints/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.vector_search_endpoints._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/vector_search_indexes/__init__.py b/python/databricks/bundles/vector_search_indexes/__init__.py index 8e3c88eb018..8a23b46be42 100644 --- a/python/databricks/bundles/vector_search_indexes/__init__.py +++ b/python/databricks/bundles/vector_search_indexes/__init__.py @@ -4,6 +4,9 @@ "DeltaSyncVectorIndexSpecRequest", "DeltaSyncVectorIndexSpecRequestDict", "DeltaSyncVectorIndexSpecRequestParam", + "DependsOn", + "DependsOnDict", + "DependsOnParam", "DirectAccessVectorIndexSpec", "DirectAccessVectorIndexSpecDict", "DirectAccessVectorIndexSpecParam", @@ -38,6 +41,11 @@ DeltaSyncVectorIndexSpecRequestDict, DeltaSyncVectorIndexSpecRequestParam, ) +from databricks.bundles.vector_search_indexes._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.vector_search_indexes._models.direct_access_vector_index_spec import ( DirectAccessVectorIndexSpec, DirectAccessVectorIndexSpecDict, diff --git a/python/databricks/bundles/vector_search_indexes/_models/depends_on.py b/python/databricks/bundles/vector_search_indexes/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/vector_search_indexes/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/vector_search_indexes/_models/lifecycle.py b/python/databricks/bundles/vector_search_indexes/_models/lifecycle.py index 697776a198e..b03f75d8f6e 100644 --- a/python/databricks/bundles/vector_search_indexes/_models/lifecycle.py +++ b/python/databricks/bundles/vector_search_indexes/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.vector_search_indexes._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/volumes/__init__.py b/python/databricks/bundles/volumes/__init__.py index 97bc1d54bd7..3fdd871e124 100644 --- a/python/databricks/bundles/volumes/__init__.py +++ b/python/databricks/bundles/volumes/__init__.py @@ -1,6 +1,9 @@ # Code generated by pydabs-codegen. DO NOT EDIT. __all__ = [ + "DependsOn", + "DependsOnDict", + "DependsOnParam", "Lifecycle", "LifecycleDict", "LifecycleParam", @@ -22,6 +25,11 @@ ] +from databricks.bundles.volumes._models.depends_on import ( + DependsOn, + DependsOnDict, + DependsOnParam, +) from databricks.bundles.volumes._models.lifecycle import ( Lifecycle, LifecycleDict, diff --git a/python/databricks/bundles/volumes/_models/depends_on.py b/python/databricks/bundles/volumes/_models/depends_on.py new file mode 100644 index 00000000000..92fe3d5ea1e --- /dev/null +++ b/python/databricks/bundles/volumes/_models/depends_on.py @@ -0,0 +1,40 @@ +# Code generated by pydabs-codegen. DO NOT EDIT. + +from dataclasses import dataclass +from typing import TYPE_CHECKING, TypedDict + +from databricks.bundles.core._transform import _transform +from databricks.bundles.core._transform_to_json import _transform_to_json_value +from databricks.bundles.core._variable import VariableOr + +if TYPE_CHECKING: + from typing_extensions import Self + + +@dataclass(kw_only=True) +class DependsOn: + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + @classmethod + def from_dict(cls, value: "DependsOnDict") -> "Self": + return _transform(cls, value) + + def as_dict(self) -> "DependsOnDict": + return _transform_to_json_value(self) # type:ignore + + +class DependsOnDict(TypedDict, total=False): + """""" + + resource: VariableOr[str] + """ + Key of the resource to depend on, as `foo` or `jobs.foo`. + """ + + +DependsOnParam = DependsOnDict | DependsOn diff --git a/python/databricks/bundles/volumes/_models/lifecycle.py b/python/databricks/bundles/volumes/_models/lifecycle.py index 697776a198e..818b3d25108 100644 --- a/python/databricks/bundles/volumes/_models/lifecycle.py +++ b/python/databricks/bundles/volumes/_models/lifecycle.py @@ -1,11 +1,15 @@ # Code generated by pydabs-codegen. DO NOT EDIT. -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import TYPE_CHECKING, TypedDict from databricks.bundles.core._transform import _transform from databricks.bundles.core._transform_to_json import _transform_to_json_value -from databricks.bundles.core._variable import VariableOrOptional +from databricks.bundles.core._variable import VariableOrList, VariableOrOptional +from databricks.bundles.volumes._models.depends_on import ( + DependsOn, + DependsOnParam, +) if TYPE_CHECKING: from typing_extensions import Self @@ -15,6 +19,11 @@ class Lifecycle: """""" + depends_on: VariableOrList[DependsOn] = field(default_factory=list) + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] = None """ Lifecycle setting to prevent the resource from being destroyed. @@ -31,6 +40,11 @@ def as_dict(self) -> "LifecycleDict": class LifecycleDict(TypedDict, total=False): """""" + depends_on: VariableOrList[DependsOnParam] + """ + Resources that must be deployed before this resource and deleted after it. Unlike variable references, this only affects ordering. + """ + prevent_destroy: VariableOrOptional[bool] """ Lifecycle setting to prevent the resource from being destroyed. diff --git a/python/databricks/bundles/volumes/_models/volume.py b/python/databricks/bundles/volumes/_models/volume.py index db248fbba94..fb6f2462d0c 100644 --- a/python/databricks/bundles/volumes/_models/volume.py +++ b/python/databricks/bundles/volumes/_models/volume.py @@ -11,7 +11,10 @@ VariableOrList, VariableOrOptional, ) -from databricks.bundles.volumes._models.lifecycle import Lifecycle, LifecycleParam +from databricks.bundles.volumes._models.lifecycle import ( + Lifecycle, + LifecycleParam, +) from databricks.bundles.volumes._models.privilege_assignment import ( PrivilegeAssignment, PrivilegeAssignmentParam,