diff --git a/acceptance/bundle/migrate/test.toml b/acceptance/bundle/migrate/test.toml index ec69d990564..bc9174120a7 100644 --- a/acceptance/bundle/migrate/test.toml +++ b/acceptance/bundle/migrate/test.toml @@ -16,5 +16,10 @@ EnvMatrix.DMS = [""] # workspace list prints each state file's object id, minted per run. [[Repls]] -Old = '(?m)^\d+(\s+FILE)' -New = '[OBJECT_ID]${1}' +Old = '(?m)^\d+ +FILE\b' +New = '[OBJECT_ID] FILE' + +# The ID column width depends on ID length, not migration behavior. +[[Repls]] +Old = '(?m)^ID +Type Language Path$' +New = 'ID Type Language Path' diff --git a/acceptance/test.toml b/acceptance/test.toml index 9c16370c07b..3d08fc3d74b 100644 --- a/acceptance/test.toml +++ b/acceptance/test.toml @@ -81,3 +81,9 @@ New = 'json.plan_version = [PLAN_VERSION];' # The lineage hash (libs/shortid) is not masked: fixture lineages hash to stable values, and # tests with a freshly minted lineage register its hash with read_lineage.py. + +# Workspace TreeIDs can be short (for example, in LITE). Match the deployment path +# rather than arbitrary numbers so version numbers and counts stay visible. +[[Repls]] +Old = '\bdeployments/[0-9]+\b' +New = 'deployments/[DEPLOYMENT_ID]' diff --git a/libs/testserver/alerts.go b/libs/testserver/alerts.go index 572dfe68e0e..48612ad539d 100644 --- a/libs/testserver/alerts.go +++ b/libs/testserver/alerts.go @@ -143,7 +143,7 @@ func (s *FakeWorkspace) writeAlertFile(alert sql.AlertV2) error { Info: workspace.ObjectInfo{ ObjectType: "FILE", Path: filePath, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, Data: data, } diff --git a/libs/testserver/bundledeployments.go b/libs/testserver/bundledeployments.go index b4019b75d0a..86aef24d83c 100644 --- a/libs/testserver/bundledeployments.go +++ b/libs/testserver/bundledeployments.go @@ -74,7 +74,7 @@ func (s *FakeWorkspace) CreateDeployment(req Request) Response { if resp, ok := s.requireParentDirectory(nodePath); !ok { return resp } - objectID := nextID() + objectID := nextTreenodeID() s.files[nodePath] = FileEntry{ Info: workspace.ObjectInfo{ // The service registers its own node type, which get-status reports back; diff --git a/libs/testserver/fake_workspace.go b/libs/testserver/fake_workspace.go index 38181c2d1f0..d55e336e88a 100644 --- a/libs/testserver/fake_workspace.go +++ b/libs/testserver/fake_workspace.go @@ -16,6 +16,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "time" "github.com/databricks/databricks-sdk-go/service/compute" @@ -99,8 +100,15 @@ var ( idMutex sync.Mutex lastNowNano int64 lastNowMilli int64 + workspaceID atomic.Int64 ) +// nextTreenodeID starts above common version numbers and counts, which scripts +// can otherwise mask when registering literal ID replacements. +func nextTreenodeID() int64 { + return 1000 + workspaceID.Add(1) +} + // IDs are prefixed with 7 and padded to avoid matching regex 1[78]\d{14} func nextID() int64 { // offset enough so that it does not match UNIX_TIME_NANO regex @@ -444,22 +452,22 @@ func NewFakeWorkspace(url, token string) *FakeWorkspace { "/Workspace": { ObjectType: "DIRECTORY", Path: "/Workspace", - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, "/Users": { ObjectType: "DIRECTORY", Path: "/Users", - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, "/Users/" + TestUser.UserName: { ObjectType: "DIRECTORY", Path: "/Users/" + TestUser.UserName, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, "/Users/" + TestUserSP.UserName: { ObjectType: "DIRECTORY", Path: "/Users/" + TestUserSP.UserName, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, // The user home also exists under the /Workspace alias on real // workspaces, so model it here too. Imports require the parent @@ -467,17 +475,17 @@ func NewFakeWorkspace(url, token string) *FakeWorkspace { "/Workspace/Users": { ObjectType: "DIRECTORY", Path: "/Workspace/Users", - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, "/Workspace/Users/" + TestUser.UserName: { ObjectType: "DIRECTORY", Path: "/Workspace/Users/" + TestUser.UserName, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, "/Workspace/Users/" + TestUserSP.UserName: { ObjectType: "DIRECTORY", Path: "/Workspace/Users/" + TestUserSP.UserName, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, }, files: make(map[string]FileEntry), @@ -824,7 +832,7 @@ func (s *FakeWorkspace) WorkspaceMkdirs(request workspace.Mkdirs) { s.directories[dir] = workspace.ObjectInfo{ ObjectType: "DIRECTORY", Path: dir, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), } } } @@ -1049,7 +1057,7 @@ func (s *FakeWorkspace) importFile(filePath string, body []byte, overwrite, dete ObjectType: "NOTEBOOK", Path: workspacePath, Language: lang, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, Data: body, } @@ -1061,7 +1069,7 @@ func (s *FakeWorkspace) importFile(filePath string, body []byte, overwrite, dete Info: workspace.ObjectInfo{ ObjectType: "FILE", Path: workspacePath, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, Data: body, } @@ -1119,7 +1127,7 @@ func (s *FakeWorkspace) WorkspaceImportNotebook(filePath string, body []byte, la ObjectType: "NOTEBOOK", Path: filePath, Language: language, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), }, Data: body, } diff --git a/libs/testserver/handlers.go b/libs/testserver/handlers.go index a2d0be14760..04455a6be76 100644 --- a/libs/testserver/handlers.go +++ b/libs/testserver/handlers.go @@ -405,7 +405,7 @@ func AddDefaultHandlers(server *Server) { req.Workspace.directories[dir] = workspace.ObjectInfo{ ObjectType: "DIRECTORY", Path: dir, - ObjectId: nextID(), + ObjectId: nextTreenodeID(), } } } diff --git a/libs/testserver/repos.go b/libs/testserver/repos.go index 9e3f3d5bd18..30c090b5b41 100644 --- a/libs/testserver/repos.go +++ b/libs/testserver/repos.go @@ -26,7 +26,7 @@ func (s *FakeWorkspace) ReposCreate(req Request) Response { } } - repoId := nextID() + repoId := nextTreenodeID() id := strconv.FormatInt(repoId, 10) repoInfo := workspace.RepoInfo{