Skip to content

Mask a Lakebase map field as a whole, not per entry - #6441

Merged
denik merged 4 commits into
mainfrom
denik/update-mask-index
Sep 1, 2026
Merged

denik merged 4 commits into
mainfrom
denik/update-mask-index

Conversation

@denik

@denik denik commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Stacked on #6440 — review that one first.

A bundle that changes one key of postgres_endpoints.settings.pg_settings cannot deploy:

Unknown field path in update_mask: 'spec.settings.pg_settings['statement_timeout']'

The plan diffs maps entry by entry, so the change path carries the map key and the mask repeated it verbatim. A map or repeated field is addressable only as a whole. Probed against a real endpoint on 2026-08-31: spec.settings and spec.settings.pg_settings are both accepted, the indexed form is not.

So drop everything from the first subscript on, and dedupe — two changed entries of one map collapse onto the same path. Terraform is unaffected; it masks the whole spec.

Two tests, both local and cloud:

  • update_pg_settings — edit a key. Fails without this change.
  • add_settings — add the whole block, which leaves one change path and masks the message itself. That path was missing from the fake's allowed list, so a case the real API accepts was failing locally.

This pull request and its description were written by Isaac.

@denik

denik commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Regression Test Report

Tested commit: bcab355 Shorten the changelog entry and link the PR

test branch main (0a8aae1) latest
TestAccept/bundle/resources/postgres_endpoints/add_settings/DATABRICKS_BUNDLE_ENGINE=direct ✅ ✅ ➖
TestAccept/bundle/resources/postgres_endpoints/add_settings/DATABRICKS_BUNDLE_ENGINE=terraform ✅ ✅ ➖
TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=direct ✅ ❌ ➖
TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=terraform ✅ ✅ ➖
TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=direct ✅ ❌ ➖
TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=terraform ✅ ✅ ➖
TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct ✅ ❌ ➖
TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=terraform ✅ ✅ ➖
TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=direct ✅ | main (0a8aae1) ❌ | latest ➖

main (0a8aae1):

=== RUN   TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT  TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=direct
    acceptance_test.go:1147: Missing output file: out.requests.direct.json
    acceptance_test.go:1176: Diff:
        --- bundle/resources/postgres_endpoints/update_pg_settings/output.txt
        +++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleresourcespostgres_endpointsupdate_pg_setting1588570395/001/output.txt
        @@ -20,15 +20,14 @@
         
         >>> [CLI] bundle deploy
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle-[UNIQUE_NAME]/default/files...
        -Updated postgres_endpoints.my_endpoint
        -Files: 0 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 2 unchanged
        +Error: cannot update resources.postgres_endpoints.my_endpoint: updating id=projects/test-pg-proj-[UNIQUE_NAME]/branches/main/endpoints/my-endpoint: Unknown field path in update_mask: 'spec.settings.pg_settings['statement_timeout']' (400 INVALID_PARAMETER_VALUE)
         
        ->>> print_requests.py --del-body project_id,branch_id,endpoint_id --sort //postgres ^//workspace-files/ ^//workspace/ ^//telemetry-ext ^//operations/
        +Endpoint: PATCH [DATABRICKS_URL]/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]/branches/main/endpoints/my-endpoint?update_mask=spec.settings%2Cspec.settings.pg_settings%5B%27statement_timeout%27%5D
        +HTTP Status: 400 Bad Request
        +API error_code: INVALID_PARAMETER_VALUE
        +API message: Unknown field path in update_mask: 'spec.settings.pg_settings['statement_timeout']'
         
        -=== Plan again: the change must leave no drift behind
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 3 unchanged
        +Files: 0 uploaded, 0 deleted
         
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
        @@ -47,3 +44,5 @@
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bundle-[UNIQUE_NAME]/default
         
         Destroy: 3 deleted
        +
        +Exit code: 1
        
--- FAIL: TestAccept/bundle/resources/postgres_endpoints/update_pg_settings/DATABRICKS_BUNDLE_ENGINE=direct (0.28s)
TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=direct ✅ | main (0a8aae1) ❌ | latest ➖

main (0a8aae1):

=== RUN   TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT  TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=direct
    acceptance_test.go:1147: Missing output file: out.requests.direct.json
    acceptance_test.go:1176: Diff:
        --- bundle/resources/postgres_projects/update_default_endpoint_autoscaling/output.txt
        +++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleresourcespostgres_projectsupdate_default_end1049189003/001/output.txt
        @@ -16,23 +16,15 @@
         
         >>> [CLI] bundle deploy
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle-[UNIQUE_NAME]/default/files...
        -Updated postgres_projects.my_project
        -Files: 0 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged
        +Error: cannot update resources.postgres_projects.my_project: updating id=projects/test-pg-proj-[UNIQUE_NAME]: Field 'spec.default_endpoint_settings.suspension' is in update_mask but not provided in request (400 INVALID_PARAMETER_VALUE)
         
        ->>> print_requests.py --del-body project_id --sort //postgres ^//workspace-files/ ^//workspace/ ^//telemetry-ext ^//operations/
        +Endpoint: PATCH [DATABRICKS_URL]/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]?update_mask=spec.default_endpoint_settings%2Cspec.default_endpoint_settings.autoscaling_limit_max_cu
        +HTTP Status: 400 Bad Request
        +API error_code: INVALID_PARAMETER_VALUE
        +API message: Field 'spec.default_endpoint_settings.suspension' is in update_mask but not provided in request
         
        ->>> [CLI] postgres get-project projects/test-pg-proj-[UNIQUE_NAME]
        -{
        -  "autoscaling_limit_max_cu": 8,
        -  "autoscaling_limit_min_cu": 0.5,
        -  "suspend_timeout_duration": "86400s"
        -}
        +Files: 0 uploaded, 0 deleted
         
        -=== Plan again: the change must leave no drift behind
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
           delete resources.postgres_projects.my_project
        @@ -44,3 +33,5 @@
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bundle-[UNIQUE_NAME]/default
         
         Destroy: 1 deleted
        +
        +Exit code: 1
        
--- FAIL: TestAccept/bundle/resources/postgres_projects/update_default_endpoint_autoscaling/DATABRICKS_BUNDLE_ENGINE=direct (0.24s)
TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct ✅ | main (0a8aae1) ❌ | latest ➖

main (0a8aae1):

=== RUN   TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT  TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct
    acceptance_test.go:1176: 
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/update-mask-index/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/update-mask-index/acceptance/acceptance_test.go:1176
        	            				/Users/denis.bilenko/work/cli-trees/update-mask-index/acceptance/acceptance_test.go:1011
        	            				/Users/denis.bilenko/work/cli-trees/update-mask-index/acceptance/acceptance_test.go:586
        	Error:      	Not equal: 
        	            	expected: "Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/update-postgres-project-default-suspend-[UNIQUE_NAME]/default/files...\nError: cannot update resources.postgres_projects.my_project: updating id=projects/test-pg-proj-[UNIQUE_NAME]: Unknown field path in update_mask: 'spec.default_endpoint_settings.suspend_timeout_duration' (400 INVALID_PARAMETER_VALUE)\n\nEndpoint: PATCH [DATABRICKS_URL]/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]?update_mask=spec.default_endpoint_settings.suspend_timeout_duration\nHTTP Status: 400 Bad Request\nAPI error_code: INVALID_PARAMETER_VALUE\nAPI message: Unknown field path in update_mask: 'spec.default_endpoint_settings.suspend_timeout_duration'\n\nFiles: 0 uploaded, 0 deleted\n\nExit code: 1\n"
        	            	actual  : "Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/update-postgres-project-default-suspend-[UNIQUE_NAME]/default/files...\nError: cannot update resources.postgres_projects.my_project: updating id=projects/test-pg-proj-[UNIQUE_NAME]: Unknown field path in update_mask: 'spec.default_endpoint_settings.suspend_timeout_duration' (400 INVALID_PARAMETER_VALUE)\n\nEndpoint: PATCH [DATABRICKS_URL]/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]?update_mask=spec.default_endpoint_settings%2Cspec.default_endpoint_settings.suspend_timeout_duration\nHTTP Status: 400 Bad Request\nAPI error_code: INVALID_PARAMETER_VALUE\nAPI message: Unknown field path in update_mask: 'spec.default_endpoint_settings.suspend_timeout_duration'\n\nFiles: 0 uploaded, 0 deleted\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -3,3 +3,3 @@
        	            	 
        	            	-Endpoint: PATCH [DATABRICKS_URL]/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]?update_mask=spec.default_endpoint_settings.suspend_timeout_duration
        	            	+Endpoint: PATCH [DATABRICKS_URL]/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]?update_mask=spec.default_endpoint_settings%2Cspec.default_endpoint_settings.suspend_timeout_duration
        	            	 HTTP Status: 400 Bad Request
        	Test:       	TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct
        	Messages:   	bundle/resources/postgres_projects/update_default_endpoint_suspend/out.deploy.direct.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleresourcespostgres_projectsupdate_default_end3832990226/001/out.deploy.direct.txt
    acceptance_test.go:1176: 
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/update-mask-index/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/update-mask-index/acceptance/acceptance_test.go:1176
        	            				/Users/denis.bilenko/work/cli-trees/update-mask-index/acceptance/acceptance_test.go:1011
        	            				/Users/denis.bilenko/work/cli-trees/update-mask-index/acceptance/acceptance_test.go:586
        	Error:      	Not equal: 
        	            	expected: "{\n  \"method\": \"PATCH\",\n  \"path\": \"/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]\",\n  \"q\": {\n    \"update_mask\": \"spec.default_endpoint_settings.suspend_timeout_duration\"\n  },\n  \"body\": {\n    \"spec\": {\n      \"default_endpoint_settings\": {\n        \"autoscaling_limit_max_cu\": 4,\n        \"autoscaling_limit_min_cu\": 0.5,\n        \"suspend_timeout_duration\": \"600s\"\n      },\n      \"display_name\": \"Test Project for Default Endpoint Suspend Update\",\n      \"pg_version\": 16\n    }\n  }\n}\n"
        	            	actual  : "{\n  \"method\": \"PATCH\",\n  \"path\": \"/api/2.0/postgres/projects/test-pg-proj-[UNIQUE_NAME]\",\n  \"q\": {\n    \"update_mask\": \"spec.default_endpoint_settings,spec.default_endpoint_settings.suspend_timeout_duration\"\n  },\n  \"body\": {\n    \"spec\": {\n      \"default_endpoint_settings\": {\n        \"autoscaling_limit_max_cu\": 4,\n        \"autoscaling_limit_min_cu\": 0.5,\n        \"suspend_timeout_duration\": \"600s\"\n      },\n      \"display_name\": \"Test Project for Default Endpoint Suspend Update\",\n      \"pg_version\": 16\n    }\n  }\n}\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -4,3 +4,3 @@
        	            	   "q": {
        	            	-    "update_mask": "spec.default_endpoint_settings.suspend_timeout_duration"
        	            	+    "update_mask": "spec.default_endpoint_settings,spec.default_endpoint_settings.suspend_timeout_duration"
        	            	   },
        	Test:       	TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct
        	Messages:   	bundle/resources/postgres_projects/update_default_endpoint_suspend/out.requests.direct.json vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleresourcespostgres_projectsupdate_default_end3832990226/001/out.requests.direct.json
--- FAIL: TestAccept/bundle/resources/postgres_projects/update_default_endpoint_suspend/DATABRICKS_BUNDLE_ENGINE=direct (0.34s)

@denik
denik requested a review from pietern September 1, 2026 08:47
Comment thread .nextchanges/bundles/postgres-map-update-mask.md Outdated
@denik
denik force-pushed the denik/update-mask-index branch from bcab355 to e4fba84 Compare September 1, 2026 09:39
@denik
denik force-pushed the denik/update-mask-leaf-only branch from 76bec58 to 964c675 Compare September 1, 2026 09:49
@denik
denik force-pushed the denik/update-mask-index branch from e4fba84 to ebac25f Compare September 1, 2026 09:50
Base automatically changed from denik/update-mask-leaf-only to main September 1, 2026 10:32
The plan diffs maps entry by entry, so changing one pg_settings key produced the
change path settings.pg_settings['statement_timeout'], and the mask repeated it
verbatim. A map or repeated field is addressable only as a whole: the API answers
the indexed form with "Unknown field path in update_mask" (probed against a real
workspace on 2026-08-31, where spec.settings and spec.settings.pg_settings are both
accepted). Drop everything from the first subscript on, and dedupe, since two changed
entries of one map collapse onto the same path.

update_pg_settings covers the edit. add_settings covers adding the block, which masks
the message itself; that path was missing from the fake's allowed list, so a case the
real API accepts failed locally.

Co-authored-by: Isaac
Co-authored-by: Isaac
@denik
denik force-pushed the denik/update-mask-index branch from ebac25f to dedcaa0 Compare September 1, 2026 10:34
@denik
denik enabled auto-merge September 1, 2026 10:41
@denik
denik added this pull request to the merge queue Sep 1, 2026
Merged via the queue into main with commit 12b01d6 Sep 1, 2026
27 checks passed
@denik
denik deleted the denik/update-mask-index branch September 1, 2026 11:12
github-merge-queue Bot pushed a commit that referenced this pull request Sep 1, 2026
Stacked on #6441 (which is stacked on #6440) — review those first.

Four changes a bundle can express could not be deployed at all:

| resource | field |
|---|---|
| `postgres_branches` | `expire_time`, `ttl` |
| `postgres_endpoints` | `suspend_timeout_duration` |
| `postgres_projects` |
`default_endpoint_settings.suspend_timeout_duration` |

`expire_time` / `ttl` / `no_expiry` are one oneof and
`suspend_timeout_duration` / `no_suspension` another, and the API
accepts them in `update_mask` only under the group name — masking the
field itself is answered with `Unknown field path in update_mask`. All
four now apply and their tests drop `Badness`.

The group names are in neither the OpenAPI spec nor the SDK doc
comments, so each map is hand-written from what the backend accepts,
probed on 2026-08-31. Two members of one group collapse onto a single
mask entry.

`remove_suspend_timeout` still fails, and the mask is no longer why: the
API requires a masked field to be populated in the body, so a removal
has nothing to send. An absent value and an explicit `null` are both
rejected; the supported way to express it is `no_suspension: true`. That
test keeps a `Badness` saying so.

This pull request and its description were written by Isaac.
denik added a commit that referenced this pull request Sep 1, 2026
Three files moved under the branch. One needed a real decision:

structaccess/get.go -- main replaced .Interface().([]string) with reflect.TypeAssert in code this
branch had already deleted, so the branch's version stands and main's form is applied to the three
sites the branch still has. Consistent with the same change elsewhere in libs/structs.

Rebasing was the wrong shape here: the conflict lands in a function the branch rewrites several times
over, so it recurs commit by commit with no intermediate state worth resolving.

One golden moves, in the branch's favour. #6441 masks a Lakebase map field as a whole rather than per
entry, which is exactly the bug the catalog had recorded: four postgres_projects custom_tags rows go
from BASE_ERROR to OK.

Co-authored-by: Isaac
deco-sdk-tagging Bot added a commit that referenced this pull request Sep 3, 2026
## Release v1.15.0

### CLI

 * When `uv python install` fails, `databricks environments setup-local` now falls back to a compatible Python interpreter already installed on the machine. ([#6457](#6457))
 * Allow `databricks environments setup-local` to update `pyproject.toml` files containing TOML multi-line strings. ([#6445](#6445))

### Bundles

 * Before committing the automatic terraform→direct migration, run a deployment plan against the converted state; if the plan fails the migration is abandoned. ([#6486](#6486))
 * The `dbt-sql` bundle template now uses Databricks Runtime 16.4 LTS (up from 15.4 LTS) for classic (non-serverless) compute. ([#6418](#6418))
 * Fixed the direct engine silently ignoring edits to duration and timestamp fields, such as a Lakebase endpoint's `suspend_timeout_duration`. Such a change planned `0 to change` and was never applied. ([#6377](#6377))
 * Fixed `$${...}` not escaping a literal `${...}` on the direct engine, which failed with an `invalid dependency` error. ([#6484](#6484), [#6489](#6489))
 * direct: Fix deploying an update to `postgres_projects.default_endpoint_settings`. ([#6440](#6440))
 * direct: Fix deploying an update to `postgres_endpoints.settings.pg_settings`. ([#6441](#6441))
 * direct: Fix deploying an update to `expire_time`, `ttl` or `suspend_timeout_duration` on Lakebase resources. ([#6443](#6443))
 * Added PyDABs (Python) support for catalogs: `Resources.add_catalog` and the `catalog_mutator` decorator. ([#6408](#6408))
 * Bundle templates now use serverless [environment version 5](https://docs.databricks.com/aws/en/release-notes/serverless/environment-version/five), which offers better performance, and `databricks-connect` 16.4. ([#6378](#6378))
 * Fixed a job with a `table_update` trigger never converging on the direct engine. ([#6442](#6442))

### Dependency Updates

 * Bump Go toolchain to 1.26.8. ([#6476](#6476))
deco-sdk-tagging Bot added a commit that referenced this pull request Sep 3, 2026
## Release v1.15.0

### CLI

 * When `uv python install` fails, `databricks environments setup-local` now falls back to a compatible Python interpreter already installed on the machine. ([#6457](#6457))
 * Allow `databricks environments setup-local` to update `pyproject.toml` files containing TOML multi-line strings. ([#6445](#6445))

### Bundles

 * Before committing the automatic terraform→direct migration, run a deployment plan against the converted state; if the plan fails the migration is abandoned. ([#6486](#6486))
 * The `dbt-sql` bundle template now uses Databricks Runtime 16.4 LTS (up from 15.4 LTS) for classic (non-serverless) compute. ([#6418](#6418))
 * Fixed the direct engine silently ignoring edits to duration and timestamp fields, such as a Lakebase endpoint's `suspend_timeout_duration`. Such a change planned `0 to change` and was never applied. ([#6377](#6377))
 * Fixed `$${...}` not escaping a literal `${...}` on the direct engine, which failed with an `invalid dependency` error. ([#6484](#6484), [#6489](#6489))
 * Remove forward_user_access_token from update_mask for Apps because it's not supported. Fixes regression in 1.14.1. ([#6510](#6510))
 * direct: Fix deploying an update to `postgres_projects.default_endpoint_settings`. ([#6440](#6440))
 * direct: Fix deploying an update to `postgres_endpoints.settings.pg_settings`. ([#6441](#6441))
 * direct: Fix deploying an update to `expire_time`, `ttl` or `suspend_timeout_duration` on Lakebase resources. ([#6443](#6443))
 * Added PyDABs (Python) support for catalogs: `Resources.add_catalog` and the `catalog_mutator` decorator. ([#6408](#6408))
 * Bundle templates now use serverless [environment version 5](https://docs.databricks.com/aws/en/release-notes/serverless/environment-version/five), which offers better performance, and `databricks-connect` 16.4. ([#6378](#6378))
 * Fixed a job with a `table_update` trigger never converging on the direct engine. ([#6442](#6442))

### Dependency Updates

 * Bump Go toolchain to 1.26.8. ([#6476](#6476))
janniklasrose pushed a commit that referenced this pull request Sep 15, 2026
Stacked on #6440 — review that one first.

A bundle that changes one key of
`postgres_endpoints.settings.pg_settings` cannot deploy:

```
Unknown field path in update_mask: 'spec.settings.pg_settings['statement_timeout']'
```

The plan diffs maps entry by entry, so the change path carries the map
key and the mask repeated it verbatim. A map or repeated field is
addressable only as a whole. Probed against a real endpoint on
2026-08-31: `spec.settings` and `spec.settings.pg_settings` are both
accepted, the indexed form is not.

So drop everything from the first subscript on, and dedupe — two changed
entries of one map collapse onto the same path. Terraform is unaffected;
it masks the whole spec.

Two tests, both local and cloud:

- `update_pg_settings` — edit a key. Fails without this change.
- `add_settings` — add the whole block, which leaves one change path and
masks the message itself. That path was missing from the fake's allowed
list, so a case the real API accepts was failing locally.

This pull request and its description were written by Isaac.
janniklasrose pushed a commit that referenced this pull request Sep 15, 2026
Stacked on #6441 (which is stacked on #6440) — review those first.

Four changes a bundle can express could not be deployed at all:

| resource | field |
|---|---|
| `postgres_branches` | `expire_time`, `ttl` |
| `postgres_endpoints` | `suspend_timeout_duration` |
| `postgres_projects` |
`default_endpoint_settings.suspend_timeout_duration` |

`expire_time` / `ttl` / `no_expiry` are one oneof and
`suspend_timeout_duration` / `no_suspension` another, and the API
accepts them in `update_mask` only under the group name — masking the
field itself is answered with `Unknown field path in update_mask`. All
four now apply and their tests drop `Badness`.

The group names are in neither the OpenAPI spec nor the SDK doc
comments, so each map is hand-written from what the backend accepts,
probed on 2026-08-31. Two members of one group collapse onto a single
mask entry.

`remove_suspend_timeout` still fails, and the mask is no longer why: the
API requires a masked field to be populated in the body, so a removal
has nothing to send. An absent value and an explicit `null` are both
rejected; the supported way to express it is `no_suspension: true`. That
test keeps a `Badness` saying so.

This pull request and its description were written by Isaac.
janniklasrose pushed a commit that referenced this pull request Sep 15, 2026
## Release v1.15.0

### CLI

 * When `uv python install` fails, `databricks environments setup-local` now falls back to a compatible Python interpreter already installed on the machine. ([#6457](#6457))
 * Allow `databricks environments setup-local` to update `pyproject.toml` files containing TOML multi-line strings. ([#6445](#6445))

### Bundles

 * Before committing the automatic terraform→direct migration, run a deployment plan against the converted state; if the plan fails the migration is abandoned. ([#6486](#6486))
 * The `dbt-sql` bundle template now uses Databricks Runtime 16.4 LTS (up from 15.4 LTS) for classic (non-serverless) compute. ([#6418](#6418))
 * Fixed the direct engine silently ignoring edits to duration and timestamp fields, such as a Lakebase endpoint's `suspend_timeout_duration`. Such a change planned `0 to change` and was never applied. ([#6377](#6377))
 * Fixed `$${...}` not escaping a literal `${...}` on the direct engine, which failed with an `invalid dependency` error. ([#6484](#6484), [#6489](#6489))
 * direct: Fix deploying an update to `postgres_projects.default_endpoint_settings`. ([#6440](#6440))
 * direct: Fix deploying an update to `postgres_endpoints.settings.pg_settings`. ([#6441](#6441))
 * direct: Fix deploying an update to `expire_time`, `ttl` or `suspend_timeout_duration` on Lakebase resources. ([#6443](#6443))
 * Added PyDABs (Python) support for catalogs: `Resources.add_catalog` and the `catalog_mutator` decorator. ([#6408](#6408))
 * Bundle templates now use serverless [environment version 5](https://docs.databricks.com/aws/en/release-notes/serverless/environment-version/five), which offers better performance, and `databricks-connect` 16.4. ([#6378](#6378))
 * Fixed a job with a `table_update` trigger never converging on the direct engine. ([#6442](#6442))

### Dependency Updates

 * Bump Go toolchain to 1.26.8. ([#6476](#6476))
janniklasrose pushed a commit that referenced this pull request Sep 15, 2026
## Release v1.15.0

### CLI

 * When `uv python install` fails, `databricks environments setup-local` now falls back to a compatible Python interpreter already installed on the machine. ([#6457](#6457))
 * Allow `databricks environments setup-local` to update `pyproject.toml` files containing TOML multi-line strings. ([#6445](#6445))

### Bundles

 * Before committing the automatic terraform→direct migration, run a deployment plan against the converted state; if the plan fails the migration is abandoned. ([#6486](#6486))
 * The `dbt-sql` bundle template now uses Databricks Runtime 16.4 LTS (up from 15.4 LTS) for classic (non-serverless) compute. ([#6418](#6418))
 * Fixed the direct engine silently ignoring edits to duration and timestamp fields, such as a Lakebase endpoint's `suspend_timeout_duration`. Such a change planned `0 to change` and was never applied. ([#6377](#6377))
 * Fixed `$${...}` not escaping a literal `${...}` on the direct engine, which failed with an `invalid dependency` error. ([#6484](#6484), [#6489](#6489))
 * Remove forward_user_access_token from update_mask for Apps because it's not supported. Fixes regression in 1.14.1. ([#6510](#6510))
 * direct: Fix deploying an update to `postgres_projects.default_endpoint_settings`. ([#6440](#6440))
 * direct: Fix deploying an update to `postgres_endpoints.settings.pg_settings`. ([#6441](#6441))
 * direct: Fix deploying an update to `expire_time`, `ttl` or `suspend_timeout_duration` on Lakebase resources. ([#6443](#6443))
 * Added PyDABs (Python) support for catalogs: `Resources.add_catalog` and the `catalog_mutator` decorator. ([#6408](#6408))
 * Bundle templates now use serverless [environment version 5](https://docs.databricks.com/aws/en/release-notes/serverless/environment-version/five), which offers better performance, and `databricks-connect` 16.4. ([#6378](#6378))
 * Fixed a job with a `table_update` trigger never converging on the direct engine. ([#6442](#6442))

### Dependency Updates

 * Bump Go toolchain to 1.26.8. ([#6476](#6476))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants