Pass DATABRICKS_CLI_PATH and resolve the platform-specific CLI binary#1908
Pass DATABRICKS_CLI_PATH and resolve the platform-specific CLI binary#1908rugpanov wants to merge 1 commit into
Conversation
|
On the persisted
Two things I could not confirm from the diff:
If the persisted path can win over the getter here, it might be worth ignoring/normalizing |
c817a7a to
0534870
Compare
|
Good catch. Digging in, project.json turns out to be an outdated way we used to persist config - nothing writes it anymore. But for the small fraction of users who still have one lying around, it's read once during the legacy -> bundle migration (BundleProjectManager → ProjectConfigFile.load → fromJSON), and that's exactly where this can fail. On your questions: nothing rewrites or revalidates the file, so a persisted value is taken as-is. It only falls through when the field is absent, it never checks whether the path still exists. And since the stored path is absolute and points into the versioned extension folder So I did what you suggested and made cli.cliPath the single source of truth: fromJSON now ignores databricksPath (commit 0534870), with a test that feeds a stale extensionless path plus a fresh .exe one and asserts the getter wins. I left fromSdkConfig alone since its databricksCliPath comes live from the user's .databrickscfg - intentional config rather than a stale snapshot - but happy to change that too if you'd prefer. |
*Why*: * On Windows, `databricks bundle` deploys failed with "databricks CLI not found" because the SDK/Terraform provider could not locate the bundled CLI. * The forwarded path was extensionless (`bin/databricks`), but the bundled Windows binary is `databricks.exe`; the Go SDK/Terraform do a literal file lookup and do not auto-append `.exe` the way Windows CreateProcess does. * The legacy project.json persisted the bundled CLI path (`databricksPath`), which `fromJSON` preferred over the freshly resolved one. That snapshot is version-pinned and, on Windows, extensionless, so it overrode the corrected path during legacy-to-bundle migration. *What:* * Forward the resolved CLI path to subprocesses via the DATABRICKS_CLI_PATH env var so they don't fall back to a PATH search. * Make CliWrapper.cliPath return the platform-specific binary name (`databricks.exe` on win32, `databricks` elsewhere). * In AuthProvider.fromJSON, always use the freshly resolved bundled CLI path and ignore the persisted `databricksPath`, since it is an extension-managed, version-pinned value that is stale after any upgrade. *Verification:* * Added unit tests for the platform-specific binary name, for toEnv() exposing DATABRICKS_CLI_PATH, and for fromJSON ignoring a stale persisted databricksPath; suite passes in the VS Code test host (14 relevant tests green). * Built the win32-x64 VSIX and confirmed the bundled extension contains both the env var and the `.exe` path, with `bin/databricks.exe` packaged. Co-authored-by: Isaac
0534870 to
58d02a4
Compare
|
If integration tests don't run automatically, an authorized user can run them manually by following the instructions below: Trigger: Inputs:
Checks will be approved automatically on success. |
|
Superseded by #1910, which runs from an upstream branch so CI (JFrog OIDC) can run — fork PRs don't get OIDC tokens/secrets, so the checks here couldn't execute. Same commit and contents. |
Why
databricks bundledeploys fail withdatabricks CLI not foundbecause the SDK / Terraform provider can't locate the bundled CLI when running in a subprocess.bin/databricks), but the bundled Windows binary isdatabricks.exe. The Go SDK / Terraform provider do a literal file lookup and do not auto-append.exethe way Windows'CreateProcessdoes — so the lookup fails..databricks/project.jsonpersisted the bundled CLI path (databricksPath), andAuthProvider.fromJSONpreferred it over the freshly resolved path. That snapshot is version-pinned (e.g..../databricks.databricks-2.11.0/bin/...) and, on Windows, was stored without.exe, so it overrode the corrected path during legacy→bundle migration.This builds on #1903 (which adds the
DATABRICKS_CLI_PATHenv var) by also making the path it forwards correct on Windows and not letting a stale persisted path win.What
DATABRICKS_CLI_PATHenv var so they don't fall back to aPATHsearch (DatabricksCliAuthProvider.toEnv).CliWrapper.cliPathreturn the platform-specific binary name:databricks.exeonwin32,databrickselsewhere.AuthProvider.fromJSON, always use the freshly resolved bundled CLI path and ignore the persisteddatabricksPath— it's an extension-managed, version-pinned value that is stale after any upgrade. (fromSdkConfigis intentionally left alone, since itsdatabricksCliPathcomes live from the user's.databrickscfg.)Verification
toEnv()exposingDATABRICKS_CLI_PATH, andfromJSONignoring a stale persisteddatabricksPath. Suite passes in the VS Code test host (14 relevant tests green).win32-x64VSIX and confirmed the bundledextension/out/extension.jscontains both the env var and the.exepath, withbin/databricks.exepackaged.This pull request and its description were written by Isaac.