From aa5268abe5bd176fb26a03debf5941d46adac613 Mon Sep 17 00:00:00 2001 From: Anton Nekipelov <226657+anton-107@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:36:19 +0200 Subject: [PATCH 1/6] create an acceptance test for provisioning a pipeline with a duplicate name --- .../allow-duplicate-names/databricks.yml.tmpl | 11 ++++++++ .../allow-duplicate-names/out.test.toml | 5 ++++ .../pipeline/allow-duplicate-names/output.txt | 25 +++++++++++++++++++ .../allow-duplicate-names/pipeline.json.tmpl | 11 ++++++++ .../pipeline/allow-duplicate-names/script | 16 ++++++++++++ .../pipeline/allow-duplicate-names/test.toml | 3 +++ 6 files changed, 71 insertions(+) create mode 100644 acceptance/bundle/deploy/pipeline/allow-duplicate-names/databricks.yml.tmpl create mode 100644 acceptance/bundle/deploy/pipeline/allow-duplicate-names/out.test.toml create mode 100644 acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt create mode 100644 acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl create mode 100644 acceptance/bundle/deploy/pipeline/allow-duplicate-names/script create mode 100644 acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/databricks.yml.tmpl b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/databricks.yml.tmpl new file mode 100644 index 0000000000..bdab53c9b5 --- /dev/null +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/databricks.yml.tmpl @@ -0,0 +1,11 @@ +bundle: + name: acc-bundle-deploy-pipeline-duplicate-names-$UNIQUE_NAME + +resources: + pipelines: + pipeline_one: + name: test-pipeline-same-name-$UNIQUE_NAME + allow_duplicate_names: true + libraries: + - file: + path: "./foo.py" diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/out.test.toml b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/out.test.toml new file mode 100644 index 0000000000..58ed268930 --- /dev/null +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/out.test.toml @@ -0,0 +1,5 @@ +Local = true +Cloud = true + +[EnvMatrix] + DATABRICKS_CLI_DEPLOYMENT = ["terraform", "direct-exp"] diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt new file mode 100644 index 0000000000..58c2cecb8f --- /dev/null +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt @@ -0,0 +1,25 @@ + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/acc-bundle-deploy-pipeline-duplicate-names-[UNIQUE_NAME]/default/files... +Deploying resources... +Error: terraform apply: exit status 1 + +Error: cannot create pipeline: The pipeline name 'test-pipeline-same-name-[UNIQUE_NAME]' is already used by another pipeline. This check can be skipped by setting `allow_duplicate_names = true` in the request. + + with databricks_pipeline.pipeline_one, + on bundle.tf.json line 30, in resource.databricks_pipeline.pipeline_one: + 30: } + + + +Updating deployment state... + +>>> [CLI] bundle destroy --auto-approve +All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/acc-bundle-deploy-pipeline-duplicate-names-[UNIQUE_NAME]/default + +Deleting files... +Destroy complete! + +>>> [CLI] pipelines delete [UUID] + +Exit code: 1 diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl new file mode 100644 index 0000000000..46064239c1 --- /dev/null +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl @@ -0,0 +1,11 @@ +{ + "name": "test-pipeline-same-name-$UNIQUE_NAME", + "allow_duplicate_names": true, + "libraries": [ + { + "file": { + "path": "/some-script.py" + } + } + ] +} diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script new file mode 100644 index 0000000000..cd79721b99 --- /dev/null +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script @@ -0,0 +1,16 @@ +envsubst < databricks.yml.tmpl > databricks.yml +envsubst < pipeline.json.tmpl > pipeline.json +touch foo.py + +cleanup() { + trace $CLI bundle destroy --auto-approve + trace $CLI pipelines delete ${PIPELINE_ID} +} +trap cleanup EXIT + +# Create a pre-existing pipeline: +PIPELINE_ID=$($CLI pipelines create --json @pipeline.json | jq -r .pipeline_id) +export PIPELINE_ID + +# Deploy the bundle that has a pipeline with the same name: +trace $CLI bundle deploy diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml new file mode 100644 index 0000000000..aa50dfffda --- /dev/null +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml @@ -0,0 +1,3 @@ +Badness = "allow_duplicate_names field does not allow to create a pipeline with a duplicate name" +Cloud = true +Ignore = ["foo.py","pipeline.json"] From 5f6c2cca94ce628f771ac71657a35f91f66e779b Mon Sep 17 00:00:00 2001 From: Anton Nekipelov <226657+anton-107@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:50:44 +0200 Subject: [PATCH 2/6] do not drop `allow_duplicate_names` field from the pipeline resource --- NEXT_CHANGELOG.md | 1 + .../pipeline/allow-duplicate-names/output.txt | 16 ++++------------ .../allow-duplicate-names/pipeline.json.tmpl | 1 - .../pipeline/allow-duplicate-names/test.toml | 1 - .../deploy/terraform/tfdyn/convert_pipeline.go | 2 +- bundle/internal/schema/main.go | 1 - 6 files changed, 6 insertions(+), 16 deletions(-) diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 7ff5519eb9..7cd636e33d 100644 --- a/NEXT_CHANGELOG.md +++ b/NEXT_CHANGELOG.md @@ -9,5 +9,6 @@ ### CLI ### Bundles +- Fixed an issue where `allow_duplicate_names` field on the pipeline definition was ignored by the bundle ([#3274](https://github.com/databricks/cli/pull/3274)) ### API Changes diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt index 58c2cecb8f..38225ca896 100644 --- a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt @@ -2,24 +2,16 @@ >>> [CLI] bundle deploy Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/acc-bundle-deploy-pipeline-duplicate-names-[UNIQUE_NAME]/default/files... Deploying resources... -Error: terraform apply: exit status 1 - -Error: cannot create pipeline: The pipeline name 'test-pipeline-same-name-[UNIQUE_NAME]' is already used by another pipeline. This check can be skipped by setting `allow_duplicate_names = true` in the request. - - with databricks_pipeline.pipeline_one, - on bundle.tf.json line 30, in resource.databricks_pipeline.pipeline_one: - 30: } - - - Updating deployment state... +Deployment complete! >>> [CLI] bundle destroy --auto-approve +The following resources will be deleted: + delete pipeline pipeline_one + All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/acc-bundle-deploy-pipeline-duplicate-names-[UNIQUE_NAME]/default Deleting files... Destroy complete! >>> [CLI] pipelines delete [UUID] - -Exit code: 1 diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl index 46064239c1..f7d584ed0e 100644 --- a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/pipeline.json.tmpl @@ -1,6 +1,5 @@ { "name": "test-pipeline-same-name-$UNIQUE_NAME", - "allow_duplicate_names": true, "libraries": [ { "file": { diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml index aa50dfffda..7546d9dc7e 100644 --- a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml @@ -1,3 +1,2 @@ -Badness = "allow_duplicate_names field does not allow to create a pipeline with a duplicate name" Cloud = true Ignore = ["foo.py","pipeline.json"] diff --git a/bundle/deploy/terraform/tfdyn/convert_pipeline.go b/bundle/deploy/terraform/tfdyn/convert_pipeline.go index 53a9868649..d2df60fa28 100644 --- a/bundle/deploy/terraform/tfdyn/convert_pipeline.go +++ b/bundle/deploy/terraform/tfdyn/convert_pipeline.go @@ -21,7 +21,7 @@ func convertPipelineResource(ctx context.Context, vin dyn.Value) (dyn.Value, err return dyn.InvalidValue, err } - vout, err = dyn.DropKeys(vout, []string{"allow_duplicate_names", "dry_run"}) + vout, err = dyn.DropKeys(vout, []string{"dry_run"}) if err != nil { return dyn.InvalidValue, err } diff --git a/bundle/internal/schema/main.go b/bundle/internal/schema/main.go index d78f57b8a1..1f3c0c03ca 100644 --- a/bundle/internal/schema/main.go +++ b/bundle/internal/schema/main.go @@ -115,7 +115,6 @@ func removePipelineFields(typ reflect.Type, s jsonschema.Schema) jsonschema.Sche // Even though DABs supports this field, TF provider does not. Thus, we // should not expose it to the user. delete(s.Properties, "dry_run") - delete(s.Properties, "allow_duplicate_names") // These fields are only meant to be set by the DABs client (ie the CLI) // and thus should not be exposed to the user. These are used to annotate From 1aef527193824014ea2a1928f52651b565877ce2 Mon Sep 17 00:00:00 2001 From: Anton Nekipelov <226657+anton-107@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:56:46 +0200 Subject: [PATCH 3/6] fix unit test --- bundle/deploy/terraform/tfdyn/convert_pipeline_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/bundle/deploy/terraform/tfdyn/convert_pipeline_test.go b/bundle/deploy/terraform/tfdyn/convert_pipeline_test.go index 45eb0b902e..ed6bd70a08 100644 --- a/bundle/deploy/terraform/tfdyn/convert_pipeline_test.go +++ b/bundle/deploy/terraform/tfdyn/convert_pipeline_test.go @@ -116,6 +116,7 @@ func TestConvertPipeline(t *testing.T) { }, }, }, + "allow_duplicate_names": true, "cluster": []any{ map[string]any{ "label": "default", From db0175a71ffe6586347863e9d04212cad6396937 Mon Sep 17 00:00:00 2001 From: Anton Nekipelov <226657+anton-107@users.noreply.github.com> Date: Fri, 18 Jul 2025 14:01:26 +0200 Subject: [PATCH 4/6] make schema --- bundle/schema/jsonschema.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bundle/schema/jsonschema.json b/bundle/schema/jsonschema.json index 4ebfbe4b6b..592ffccbfd 100644 --- a/bundle/schema/jsonschema.json +++ b/bundle/schema/jsonschema.json @@ -990,6 +990,10 @@ { "type": "object", "properties": { + "allow_duplicate_names": { + "description": "If false, deployment will fail if name conflicts with that of another pipeline.", + "$ref": "#/$defs/bool" + }, "budget_policy_id": { "description": "Budget policy of this pipeline.", "$ref": "#/$defs/string", From 920530246a47cc43101178ece1d689bc43e1a7d4 Mon Sep 17 00:00:00 2001 From: Anton Nekipelov <226657+anton-107@users.noreply.github.com> Date: Fri, 18 Jul 2025 14:06:12 +0200 Subject: [PATCH 5/6] make codegen --- .../databricks/bundles/pipelines/_models/pipeline.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/experimental/python/databricks/bundles/pipelines/_models/pipeline.py b/experimental/python/databricks/bundles/pipelines/_models/pipeline.py index a700046063..6ca71f4dae 100644 --- a/experimental/python/databricks/bundles/pipelines/_models/pipeline.py +++ b/experimental/python/databricks/bundles/pipelines/_models/pipeline.py @@ -59,6 +59,11 @@ class Pipeline(Resource): """""" + allow_duplicate_names: VariableOrOptional[bool] = None + """ + If false, deployment will fail if name conflicts with that of another pipeline. + """ + budget_policy_id: VariableOrOptional[str] = None """ :meta private: [EXPERIMENTAL] @@ -212,6 +217,11 @@ def as_dict(self) -> "PipelineDict": class PipelineDict(TypedDict, total=False): """""" + allow_duplicate_names: VariableOrOptional[bool] + """ + If false, deployment will fail if name conflicts with that of another pipeline. + """ + budget_policy_id: VariableOrOptional[str] """ :meta private: [EXPERIMENTAL] From 645f2bb786a87b2d62e7668bf4f4e4436daedf8a Mon Sep 17 00:00:00 2001 From: Anton Nekipelov <226657+anton-107@users.noreply.github.com> Date: Fri, 18 Jul 2025 14:42:33 +0200 Subject: [PATCH 6/6] capture create-pipeline requests in the acceptance test --- .../pipeline/allow-duplicate-names/output.txt | 37 +++++++++++++++++++ .../pipeline/allow-duplicate-names/script | 6 +++ .../pipeline/allow-duplicate-names/test.toml | 1 + 3 files changed, 44 insertions(+) diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt index 38225ca896..4e3ff9f204 100644 --- a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/output.txt @@ -5,6 +5,43 @@ Deploying resources... Updating deployment state... Deployment complete! +>>> print_requests +{ + "body": { + "libraries": [ + { + "file": { + "path": "/some-script.py" + } + } + ], + "name": "test-pipeline-same-name-[UNIQUE_NAME]" + }, + "method": "POST", + "path": "/api/2.0/pipelines" +} +{ + "body": { + "allow_duplicate_names": true, + "channel": "CURRENT", + "deployment": { + "kind": "BUNDLE", + "metadata_file_path": "/Workspace/Users/[USERNAME]/.bundle/acc-bundle-deploy-pipeline-duplicate-names-[UNIQUE_NAME]/default/state/metadata.json" + }, + "edition": "ADVANCED", + "libraries": [ + { + "file": { + "path": "/Workspace/Users/[USERNAME]/.bundle/acc-bundle-deploy-pipeline-duplicate-names-[UNIQUE_NAME]/default/files/foo.py" + } + } + ], + "name": "test-pipeline-same-name-[UNIQUE_NAME]" + }, + "method": "POST", + "path": "/api/2.0/pipelines" +} + >>> [CLI] bundle destroy --auto-approve The following resources will be deleted: delete pipeline pipeline_one diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script index cd79721b99..6db327deec 100644 --- a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/script @@ -5,6 +5,7 @@ touch foo.py cleanup() { trace $CLI bundle destroy --auto-approve trace $CLI pipelines delete ${PIPELINE_ID} + rm out.requests.txt } trap cleanup EXIT @@ -14,3 +15,8 @@ export PIPELINE_ID # Deploy the bundle that has a pipeline with the same name: trace $CLI bundle deploy + +print_requests() { + jq --sort-keys 'select(.method != "GET" and (.path | contains("/pipelines")))' < out.requests.txt +} +trace print_requests diff --git a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml index 7546d9dc7e..c8db125e67 100644 --- a/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml +++ b/acceptance/bundle/deploy/pipeline/allow-duplicate-names/test.toml @@ -1,2 +1,3 @@ Cloud = true Ignore = ["foo.py","pipeline.json"] +RecordRequests = true