diff --git a/packages/databricks-vscode/src/extension.ts b/packages/databricks-vscode/src/extension.ts index eb608b78e..8d3327ad5 100644 --- a/packages/databricks-vscode/src/extension.ts +++ b/packages/databricks-vscode/src/extension.ts @@ -579,7 +579,10 @@ export async function activate( // Run/debug group const databricksDebugConfigurationProvider = - new DatabricksDebugConfigurationProvider(context); + new DatabricksDebugConfigurationProvider( + context, + databricksEnvFileManager + ); const runCommands = new RunCommands( connectionManager, @@ -606,6 +609,10 @@ export async function activate( "python", databricksDebugConfigurationProvider ), + debug.registerDebugConfigurationProvider( + "debugpy", + databricksDebugConfigurationProvider + ), telemetry.registerCommand( "databricks.run.dbconnect.debug", runCommands.debugFileUsingDbconnect, diff --git a/packages/databricks-vscode/src/run/DatabricksDebugConfigurationProvider.ts b/packages/databricks-vscode/src/run/DatabricksDebugConfigurationProvider.ts index ca210a846..76b2adc5f 100644 --- a/packages/databricks-vscode/src/run/DatabricksDebugConfigurationProvider.ts +++ b/packages/databricks-vscode/src/run/DatabricksDebugConfigurationProvider.ts @@ -5,6 +5,7 @@ import { ExtensionContext, } from "vscode"; import path from "node:path"; +import {DatabricksEnvFileManager} from "../file-managers/DatabricksEnvFileManager"; export interface DatabricksPythonDebugConfiguration extends DebugConfiguration { databricks?: boolean; @@ -14,27 +15,50 @@ export interface DatabricksPythonDebugConfiguration extends DebugConfiguration { console?: "integratedTerminal" | "externalTerminal" | "internalConsole"; } +function isTest(debugConfiguration: DebugConfiguration) { + return ( + debugConfiguration.env?.RUN_TEST_IDS_PORT !== undefined || + debugConfiguration.request === "test" || + debugConfiguration.name === "Debug Unit Test" + ); +} export class DatabricksDebugConfigurationProvider implements DebugConfigurationProvider { - constructor(private readonly context: ExtensionContext) {} + constructor( + private readonly context: ExtensionContext, + private readonly databricksEnvFileManager: DatabricksEnvFileManager + ) {} + async resolveDebugConfigurationWithSubstitutedVariables( folder: WorkspaceFolder | undefined, debugConfiguration: DebugConfiguration ) { - if (debugConfiguration.databricks !== true) { + if ( + debugConfiguration.databricks !== true && + !isTest(debugConfiguration) + ) { return debugConfiguration; } - const userProgram = debugConfiguration.program; - debugConfiguration.program = this.context.asAbsolutePath( - path.join("resources", "python", "dbconnect-bootstrap.py") - ); + // Only add the bootstrap script if we are running explicit databricks debug + // configs. Other sources of configs such as tests, should not have the bootstrap + if (debugConfiguration.databricks) { + const userProgram = debugConfiguration.program; + debugConfiguration.program = this.context.asAbsolutePath( + path.join("resources", "python", "dbconnect-bootstrap.py") + ); + debugConfiguration.args = [ + userProgram, + ...(debugConfiguration.args ?? []), + ]; + } - debugConfiguration.args = [ - userProgram, - ...(debugConfiguration.args ?? []), - ]; + // Explicitly set our env vars even though bootstrap loads them. + debugConfiguration.env = { + ...(await this.databricksEnvFileManager.getEnv()), + ...(debugConfiguration.env ?? {}), + }; return debugConfiguration; }