Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
37fad5f
acc: show that recreate leaves permissions/grants drifted forever
denik Aug 30, 2026
80996ed
acc: fold permissions into the model invariant config
denik Aug 30, 2026
8512977
Catalog how the direct engine handles every settable resource field
denik Aug 30, 2026
81061de
acc: show that clearing a schema comment never converges
denik Aug 30, 2026
d5f6195
acc: invariant field mutations (superseded by the Go field catalog)
denik Aug 30, 2026
2a92576
Fix field catalog context lifetime and skip the telemetry block
denik Aug 30, 2026
b7aea86
Run every resource type on cloud, and stop cancelling the harness con…
denik Aug 30, 2026
80c8175
Move the field catalog to bundle/direct/tests
denik Aug 30, 2026
5056bd4
Report only findings, and make one case re-runnable
denik Aug 30, 2026
1a61680
Ignore the full field reports
denik Aug 30, 2026
4e0bb0c
Ignore the full field reports
denik Aug 30, 2026
7a81b95
Test slices, maps, and seeded blocks; walk value pairs as one chain
denik Aug 30, 2026
54d9f8f
Cover slices and maps, seed missing structure, split the drift verdicts
denik Aug 30, 2026
ac5452c
Field catalog: give schemas and volumes values a real workspace accepts
denik Aug 30, 2026
8c4f014
structaccess: reach fields of a doubly-embedded struct
denik Aug 30, 2026
2c59963
Field catalog: edit the typed resource instead of the dynamic tree
denik Aug 30, 2026
dae6a48
testserver: reject an empty MLflow model description
denik Aug 30, 2026
e343632
Field catalog: match skip keys as patterns
denik Aug 30, 2026
f24a5e5
testserver: honor include_aliases on a registered-model read
denik Aug 30, 2026
2ac4be0
Field catalog: give experiments values a real workspace accepts
denik Aug 30, 2026
0844310
Field catalog: skip catalog blocks that need cloud setup, fix retenti…
denik Aug 30, 2026
9034259
Field catalog: let a resource type declare itself local-only
denik Aug 30, 2026
fc82241
Field catalog: create the resource path, and template the seeded values
denik Aug 30, 2026
67dda8f
Field catalog: take enum values from the SDK, fix the alerts value li…
denik Aug 30, 2026
c607028
Field catalog: deep-copy container values, release read-only plan con…
denik Aug 30, 2026
0b1d269
Field catalog: verify the starting value actually took, add START_NOT…
denik Aug 31, 2026
32e2bb1
Field catalog: commit the verdict counts, require the golden to exist
denik Aug 31, 2026
c001c7c
Field catalog: report fields with nothing to test, cover empty scalar…
denik Aug 31, 2026
5a9d9b7
Field catalog: drop the documented NOT_IN_STATE verdict
denik Aug 31, 2026
879cfe4
testserver: require Azure Key Vault metadata on a secret scope
denik Aug 31, 2026
a5e6a68
Field catalog: five correctness fixes from the second review round
denik Aug 31, 2026
e94f5fe
testserver: never store aliases on a registered model
denik Aug 31, 2026
24f1a4c
acc: fix the invariant mutation targets
denik Aug 31, 2026
7517534
Field catalog: four fixes from the third review round
denik Aug 31, 2026
c19802f
Field catalog: only the config's own value marks a field as naming th…
denik Aug 31, 2026
b1925a5
Field catalog: three fixes from the fourth review round
denik Aug 31, 2026
e3479a5
Field catalog: align alerts with AWS
denik Aug 31, 2026
4338924
structaccess: resolve embedded fields breadth-first, as encoding/json…
denik Aug 31, 2026
05ac39a
Field catalog: four fixes from the fifth review round
denik Aug 31, 2026
75f5c78
Field catalog: dedupe field paths, shorten labels, model two policy c…
denik Aug 31, 2026
6d79bd9
structaccess: search embedded structs breadth-first across the whole …
denik Aug 31, 2026
cefafa7
Field catalog: resolve the unique suffix at write time, match ignored…
denik Aug 31, 2026
ebbaa16
Field catalog: align cluster policies with AWS
denik Aug 31, 2026
3d4e79a
structaccess: treat a same-depth embed conflict as not found, assign …
denik Aug 31, 2026
430ba96
structaccess: silence vet on the deliberately ambiguous test fixture
denik Aug 31, 2026
c5fc39d
Field catalog: three more attribution fixes from the review
denik Aug 31, 2026
f539021
Field catalog: instance pools are local-only
denik Aug 31, 2026
fbe0673
Field catalog: align model serving endpoints and warehouses with AWS
denik Aug 31, 2026
9697bd3
Field catalog: align dashboards and Genie spaces with AWS
denik Aug 31, 2026
cbfce27
structaccess: do not walk a cyclic embedding twice
denik Aug 31, 2026
5646c21
Field catalog: fix four base configs and three attribution issues
denik Aug 31, 2026
764bcc3
Field catalog: bring the README in line with what the suite does
denik Aug 31, 2026
5d7a1d2
structaccess: notice a diamond embedding as ambiguous
denik Aug 31, 2026
66fc286
Field catalog: recognise the planner's key-value selectors, four attr…
denik Aug 31, 2026
09f1f54
Field catalog: skip the app policy ids, document targeted cloud runs
denik Aug 31, 2026
ef2c519
structaccess: decide ForceSendFields from the value actually stored
denik Aug 31, 2026
c0938f8
Field catalog: three latent fixes from a cross-model review
denik Aug 31, 2026
e110a90
Field catalog: give the pipeline reference fields real reasons
denik Aug 31, 2026
196364e
Field catalog: unit-test the value helpers
denik Aug 31, 2026
6cb21c9
Field catalog: say what an OK from the fake server alone is worth
denik Aug 31, 2026
166bdce
Field catalog: record the known cloud divergences and the workspace l…
denik Aug 31, 2026
1aad2a7
structaccess: ambiguity is a property of the type, not of the value
denik Aug 31, 2026
f71e715
Field catalog: three fixes from the tenth review round
denik Aug 31, 2026
41c89a8
Field catalog: stop testing jobs configurations no user can write
denik Aug 31, 2026
9b4cb69
Field catalog: give the last jobs reference fields reasons
denik Aug 31, 2026
6102255
testserver: a job's parent folder is fixed at create
denik Aug 31, 2026
4178686
Field catalog: create the resource holding the starting value
denik Aug 31, 2026
d5242df
Field catalog: fall back when a resource cannot be created holding th…
denik Aug 31, 2026
963a078
Field catalog: a declared-inert field's suppression is its expected e…
denik Aug 31, 2026
1b6566e
Field catalog: an input_only field's value counts as reached, and say…
denik Aug 31, 2026
258f17d
Field catalog: a write-only field has no remote to reach
denik Aug 31, 2026
e8e369b
Field catalog: drop the redundant field name, explain size labels in …
denik Aug 31, 2026
da79408
Field catalog: do not infer why a deploy was rejected
denik Aug 31, 2026
87988e0
Field catalog: recognise an absent ID field as the API's contract
denik Aug 31, 2026
01c45ed
Field catalog: stop a field's own baseline drift from whitewashing it
denik Aug 31, 2026
3c92943
Field catalog: rename to autotest, add -sample N and the two cloud tasks
denik Aug 31, 2026
2592059
Field catalog: verify a cloud-specific service where it exists
denik Aug 31, 2026
31c447e
Field catalog: unit-test the sampling
denik Aug 31, 2026
1b390f0
Field catalog: document clouds: alongside local_only
denik Aug 31, 2026
84c991e
Field catalog: own the fixtures instead of borrowing the invariant co…
denik Aug 31, 2026
7739e2a
Field catalog: fix two postgres fixtures the fake server was excusing
denik Aug 31, 2026
d696ec3
Field catalog: address review findings
denik Aug 31, 2026
75c9c79
Field catalog: record the plan behind a baseline-drift row
denik Aug 31, 2026
5faa320
Field catalog: two API constraints the fake server was not applying
denik Aug 31, 2026
de9f63c
Field catalog: the two postgres types cannot be confirmed on a real w…
denik Aug 31, 2026
f973da3
Field catalog: keep the error's cause in a row's detail
denik Sep 1, 2026
5d51109
Field catalog: the genie divergence is fixed, not tolerated
denik Sep 1, 2026
b51d91a
Two acceptance fixtures asserted behaviour the API does not have
denik Sep 1, 2026
a82e1e8
Field catalog: three app fields the cloud run says are not testable here
denik Sep 1, 2026
9484e47
Field catalog: a serving endpoint's create does not apply email_notif…
denik Sep 1, 2026
043cadf
Field catalog: three more from the re-review
denik Sep 1, 2026
d605303
Field catalog: a cluster's autotermination has a minimum
denik Sep 1, 2026
d7d1fed
Field catalog: nine job blocks the API validates as a set
denik Sep 1, 2026
646c4a8
Field catalog: an init script's other members are not reachable from …
denik Sep 1, 2026
d2ced65
Field catalog: cover every resource type the engine supports
denik Sep 1, 2026
cd94d03
Field catalog: give an unwieldy value a short alias
denik Sep 1, 2026
fa7429c
Field catalog: say which value could not be created, and actually pas…
denik Sep 1, 2026
d84d8ca
Drop the invariant field-mutation targets, superseded by the Go catalog
denik Sep 1, 2026
9d01a08
Field catalog: attribute the CLI's log output to the test that produc…
denik Sep 1, 2026
f6cfc46
Trim the branch to what the field catalog needs
denik Sep 1, 2026
36ef94f
Move the two promoted acceptance tests out of the branch
denik Sep 1, 2026
da63bda
Restore schemas/drift/managed_properties, deleted by mistake
denik Sep 1, 2026
e13c142
acc: create-scope was sending the wrong field name for the vault meta…
denik Sep 1, 2026
0988974
Merge main into the field catalog branch
denik Sep 1, 2026
1bcfc4a
Merge remote-tracking branch 'origin/main' into denik/extensive-test
denik Sep 1, 2026
824a87c
Merge main again: two more Lakebase mask fixes the catalog had recorded
denik Sep 1, 2026
aecae7d
Field catalog: stop seeding a field the create does not apply
denik Sep 1, 2026
fb145e3
Field catalog: output/ holds only what is committed, logs/ holds the …
denik Sep 1, 2026
6cd0d1e
Field catalog: a secret needs its own schema, and its references are …
denik Sep 1, 2026
5dc6df9
Field catalog: vector search endpoints -- a policy that cannot exist,…
denik Sep 1, 2026
88fdc99
Field catalog: settle a job run on the first poll, and 17x the whole …
denik Sep 1, 2026
1e642b2
Field catalog: a notification list needs real addresses, in the order…
denik Sep 1, 2026
428c5f0
Field catalog: an init script has to exist, and a cluster policy has …
denik Sep 2, 2026
c0d5c6e
Field catalog: no init script path can exist, and an app scope has to…
denik Sep 2, 2026
53c8511
Field catalog: skip the fields a real workspace refuses, each with it…
denik Sep 2, 2026
d1ec16e
Field catalog: the last cloud divergences, each with what the workspa…
denik Sep 2, 2026
19700ab
AUTOTEST_ALL: run the whole field catalog on a PR's integration run
denik Sep 2, 2026
9363d7f
AUTOTEST_ALL: document the marker and verify it end to end
denik Sep 2, 2026
fd009fe
Field catalog: the last four pipelines fields
denik Sep 2, 2026
d8b66af
dresources: give the warehouse CRUD test the fields its create requires
denik Sep 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agents/rules/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ Available on `PATH` during test execution (from `acceptance/bin/`):
- `diff.py DIR1 DIR2` or `diff.py FILE1 FILE2`: recursive diff with test replacements applied.
- `print_state.py [-t TARGET] [--backup]`: print deployment state (terraform or direct).
- `edit_resource.py TYPE ID < script.py`: fetch resource by ID, execute Python on it (resource in `r`), then update it. TYPE is `jobs` or `pipelines`.
- `verify_no_drift.py PLAN.json`: assert every action in a JSON plan is `skip`.
- `gron.py`: flatten JSON into greppable discrete assignments (simpler than `jq` for searching JSON).
- `jq` is also available for JSON processing.

Expand Down
35 changes: 32 additions & 3 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ vars:
# .github/workflows/check.yml and python/Taskfile.yml.
RUFF: uvx ruff@0.15.17
TEST_PACKAGES: ./acceptance/internal ./libs/... ./internal/... ./cmd/... ./bundle/... ./experimental/ssh/... .
# Field-support catalog. Covered by TEST_PACKAGES for local/CI runs via ./bundle/...,
# but named separately because the cloud tasks below list their packages explicitly.
FIELDS_PACKAGE: ./bundle/direct/autotest
ACCEPTANCE_TEST_FILTER: ""
# Single brace-expansion glob covering every //go:embed target in the repo,
# computed by grepping `//go:embed` directives. Evaluated lazily by Task so
Expand Down Expand Up @@ -590,6 +593,31 @@ tasks:
cmds:
- "go test ./acceptance -run '^TestAccept$' -update -timeout=${LOCAL_TIMEOUT:-60m}"

test-update-fields:
desc: Update the resource field-support catalog (local)
cmds:
- "go test {{.FIELDS_PACKAGE}} -run '^TestFields$' -update -timeout=${LOCAL_TIMEOUT:-60m}"

# The catalog runs against the fake server as part of `./task test`, and needs no entry of its
# own for that. These two are the real-workspace runs: they need CLOUD_ENV and credentials, and
# hold the same committed reports as the local run, so a divergence is the fake server or the
# engine differing from the backend.
autotest-cloud:
desc: Run the resource field-support catalog against a real workspace (every field; nightly)
cmds:
# -sample 0 says every field: without it a cloud run samples unless the commit title carries
# AUTOTEST_ALL, which is what keeps a PR's integration run affordable.
- "go test {{.FIELDS_PACKAGE}} -run '^TestFields$' -count=1 -sample 0 -timeout=${CLOUD_TIMEOUT:-300m}"

autotest-cloud-pr:
desc: Run a two-field sample of the field-support catalog against a real workspace (PRs)
cmds:
# Which fields are sampled comes from HEAD, so each commit covers different ground. This
# checks that every resource type still deploys and that the sampled fields' findings read
# as recorded; a change between two passing verdicts only shows in the full run above.
- "go test {{.FIELDS_PACKAGE}} -run '^TestFields$' -count=1 -sample 2 -timeout=${CLOUD_TIMEOUT:-90m}"


test-update-templates:
desc: Update acceptance test template output
sources: *ACC_SOURCES_UPDATE
Expand All @@ -601,6 +629,7 @@ tasks:
desc: Update all acceptance test outputs
cmds:
- task: test-update
- task: test-update-fields

# Follows upstream HEAD, so its result changes over time: keep it out of
# `generate-check`, which requires byte-for-byte reproducible output.
Expand Down Expand Up @@ -755,7 +784,7 @@ tasks:
--format github-actions \
--rerun-fails \
--jsonfile output.json \
--packages "./acceptance ./integration/..." \
--packages "./acceptance ./integration/... {{.FIELDS_PACKAGE}}" \
-- -parallel 4 -timeout=12h

integration-short:
Expand All @@ -769,7 +798,7 @@ tasks:
--format github-actions \
--rerun-fails \
--jsonfile output.json \
--packages "./acceptance ./integration/..." \
--packages "./acceptance ./integration/... {{.FIELDS_PACKAGE}}" \
-- -parallel 4 -timeout=12h -short

integration-short-skiplocal:
Expand All @@ -783,7 +812,7 @@ tasks:
--format github-actions \
--rerun-fails \
--jsonfile output.json \
--packages "./acceptance ./integration/..." \
--packages "./acceptance ./integration/... {{.FIELDS_PACKAGE}}" \
-- -parallel 4 -timeout=2h -short

dbr-integration:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
Plan: update resources.pipelines.foo

Changes detected:
~ catalog: null -> "main"
~ channel: null -> "CURRENT"
~ deployment: null -> {"kind":"BUNDLE","metadata_file_path":"/Workspace/Users/[USERNAME]/.bundle/test-pipeline-recreate/default/state/metadata.json"}
~ edition: null -> "ADVANCED"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ Terraform will perform the following actions:

# databricks_pipeline.foo will be updated in-place
~ resource "databricks_pipeline" "foo" {
+ catalog = "main"
+ channel = "CURRENT"
+ edition = "ADVANCED"
id = "[NEW_PIPELINE_ID]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
}
}
],
"name": "test-pipeline",
"storage": "dbfs:/pipelines/[NEW_PIPELINE_ID]"
"name": "test-pipeline"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"name": "lakeflow-pipeline",
"catalog": "main",
"libraries": [
{
"glob": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1 @@
{
"on_update_success": [
"user1@example.com"
]
}
null
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,6 @@
"creation_timestamp": [UNIX_TIME_MILLIS][0],
"creator": "[USERNAME]",
"description": "",
"email_notifications": {
"on_update_success": [
"user1@example.com"
]
},
"id": "[UUID]",
"last_updated_timestamp": [UNIX_TIME_MILLIS][0],
"name": "[ENDPOINT_ID]",
Expand Down Expand Up @@ -100,11 +95,6 @@
]
}
},
"email_notifications": {
"on_update_success": [
"user1@example.com"
]
},
"name": "[ENDPOINT_ID]"
},
"changes": {
Expand All @@ -126,11 +116,23 @@
"reason": "empty",
"remote": ""
},
"email_notifications": {
"action": "update",
"old": {
"on_update_success": [
"user1@example.com"
]
},
"new": {
"on_update_success": [
"user2@example.com"
]
}
},
"email_notifications.on_update_success[0]": {
"action": "update",
"old": "user1@example.com",
"new": "user2@example.com",
"remote": "user1@example.com"
"new": "user2@example.com"
},
"route_optimized": {
"action": "skip",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ Files: 5 uploaded, 0 deleted
Resources: 1 created, 0 changed, 0 deleted, 0 unchanged

>>> [CLI] serving-endpoints get [ENDPOINT_ID]
{
"on_update_success": [
"user1@example.com"
]
}
null

>>> update_file.py databricks.yml user1@example.com user2@example.com

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ resources:
models:
mymodel:
name: test-model
description: initial # TO_REMOVE
description: initial
permissions:
- level: CAN_READ
user_name: viewer@example.com
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Resources: 2 created, 0 changed, 0 deleted, 0 unchanged
}
}

=== Remove manager permission and description, deploy from planUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/default/files...
=== Remove manager permission, change description, deploy from planUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/default/files...
Updated models.mymodel
Updated models.mymodel.permissions
Files: 4 uploaded, 0 deleted
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@ trace $CLI bundle deploy
register_model_id
trace print_requests.py //permissions/registered-models

title "Remove manager permission and description, deploy from plan"
title "Remove manager permission, change description, deploy from plan"
grep -v TO_REMOVE databricks.yml > updated.yml && mv updated.yml databricks.yml
# Changed rather than removed: MLflow rejects an empty description, so clearing the field
# fails the update. See libs/testserver/models.go.
update_file.py databricks.yml "description: initial" "description: changed"
$CLI bundle plan -o json > tmp.plan.json
$CLI bundle deploy $(readplanarg tmp.plan.json)
register_model_id
Expand Down
8 changes: 3 additions & 5 deletions acceptance/cmd/workspace/create-scope/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,16 @@ Error: expected JSON object, received sequence
>>> [CLI] secrets create-scope --scope-backend-type AZURE_KEYVAULT --json {
"scope": "xxxxxxxx-xxx",
"scope_backend_type": "AZURE_KEYVAULT",
"keyvault_metadata": {
"backend_azure_keyvault": {
"dns_name": "test",
"resource_id": "123456"
}
}
Warning: unknown field: keyvault_metadata
in (inline):4:4


>>> [CLI] secrets delete-scope xxxxxxxx-xxx

>>> [CLI] secrets create-scope --scope-backend-type AZURE_KEYVAULT --json {
>>> musterr [CLI] secrets create-scope --scope-backend-type AZURE_KEYVAULT --json {
"scope": "xxxxxxxx-xxx",
"scope_backend_type": "AZURE_KEYVAULT"
}
Error: Scope with Azure KeyVault must have AzureKeyVaultSecretScopeMetadata defined!
6 changes: 4 additions & 2 deletions acceptance/cmd/workspace/create-scope/script
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@ trace musterr $CLI secrets create-scope --scope-backend-type AZURE_KEYVAULT --js
trace $CLI secrets create-scope --scope-backend-type AZURE_KEYVAULT --json '{
"scope": "xxxxxxxx-xxx",
"scope_backend_type": "AZURE_KEYVAULT",
"keyvault_metadata": {
"backend_azure_keyvault": {
"dns_name": "test",
"resource_id": "123456"
}
}'

trace $CLI secrets delete-scope xxxxxxxx-xxx

trace $CLI secrets create-scope --scope-backend-type AZURE_KEYVAULT --json '{
# The API requires the metadata that names the vault: "Scope with Azure KeyVault must have
# AzureKeyVaultSecretScopeMetadata defined!"
trace musterr $CLI secrets create-scope --scope-backend-type AZURE_KEYVAULT --json '{
"scope": "xxxxxxxx-xxx",
"scope_backend_type": "AZURE_KEYVAULT"
}'
3 changes: 3 additions & 0 deletions bundle/direct/autotest/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# What a run produces for reading rather than for review: the full report, its cloud counterpart,
# and the previous copy of each. output/ holds the committed goldens and nothing else.
logs/
Loading