Skip to content

Commit adf1bf4

Browse files
Prompt for cluster start (#95)
- Fixes #92 - Also propagates error message on API failures when executing a python file ## Stop a cluster https://user-images.githubusercontent.com/88345179/189954436-673bc4b4-150b-4279-8005-97af430f0a1b.mov ## Start a stopped cluster https://user-images.githubusercontent.com/88345179/189954448-a6ef20b1-72a3-4081-8ab1-20637d94a1c1.mov ## Prompts when running the jobs https://user-images.githubusercontent.com/88345179/189954497-7315a98b-7258-4a13-b4ee-c5a0c4538eb7.mov ## Starting cluster from prompt shows `Cluster starting...` in debug output https://user-images.githubusercontent.com/88345179/190226346-7dfcc018-4bd8-4239-bc70-6b72287fcd6c.mov ## A job run after waiting for cluster start <img width="1445" alt="Screenshot 2022-09-13 at 18 16 35" src="https://user-images.githubusercontent.com/88345179/189954685-d836ddfc-630d-46b5-be20-1907d1a89387.png">
1 parent bedb6ab commit adf1bf4

21 files changed

+408
-110
lines changed

packages/databricks-sdk-js/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ export * from "./auth/fromConfigFile";
3333
export * from "./auth/configFile";
3434

3535
export * from "./types";
36+
37+
export {ClusterFixture, TokenFixture} from "./test/fixtures";
38+
39+
export {RetryConfigs, default as retry} from "./retries/retries";
40+
export {TimeUnits, default as Time} from "./retries/Time";

packages/databricks-sdk-js/src/services/Cluster.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import chai, {assert} from "chai";
55
import {mock, when, instance, deepEqual, verify, anything} from "ts-mockito";
66
import chaiAsPromised from "chai-as-promised";
77
import Time, {TimeUnits} from "../retries/Time";
8-
import getMockTestCluster from "../test/fixtures/ClusterFixtures";
8+
import {getMockTestCluster} from "../test/fixtures/ClusterFixtures";
99
import {ClusterInfo} from "../apis/clusters";
10-
import TokenFixture from "../test/fixtures/TokenFixture";
10+
import {TokenFixture} from "../test/fixtures/TokenFixtures";
1111
import {RetryConfigs} from "../retries/retries";
1212

1313
chai.use(chaiAsPromised);

packages/databricks-sdk-js/src/services/Cluster.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,10 @@ export class Cluster {
8080
});
8181
}
8282

83-
async start(token?: CancellationToken) {
83+
async start(
84+
token?: CancellationToken,
85+
onProgress: (state: ClusterInfoState) => void = (state) => {}
86+
) {
8487
await this.refresh();
8588
if (this.state === "RUNNING") {
8689
return;
@@ -104,6 +107,7 @@ export class Cluster {
104107
}
105108

106109
await this.refresh();
110+
onProgress(this.state);
107111

108112
switch (this.state) {
109113
case "RUNNING":

packages/databricks-sdk-js/src/services/ExecutionContext.integ.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import assert from "assert";
55

66
import {IntegrationTestSetup} from "../test/IntegrationTestSetup";
77
import {mock, when, instance} from "ts-mockito";
8-
import TokenFixture from "../test/fixtures/TokenFixture";
8+
import {TokenFixture} from "../test/fixtures/TokenFixtures";
99

1010
describe(__filename, function () {
1111
let integSetup: IntegrationTestSetup;

packages/databricks-sdk-js/src/test/fixtures/ClusterFixtures.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const testClusterDetails: ClusterInfo = {
99
cluster_name: "testClusterName",
1010
};
1111

12-
export default async function getMockTestCluster() {
12+
export async function getMockTestCluster() {
1313
const mockedClient = mock(ApiClient);
1414
when(
1515
mockedClient.request(

packages/databricks-sdk-js/src/test/fixtures/TokenFixture.ts renamed to packages/databricks-sdk-js/src/test/fixtures/TokenFixtures.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {CancellationToken} from "../../types";
22

3-
export default class TokenFixture implements CancellationToken {
3+
export class TokenFixture implements CancellationToken {
44
get isCancellationRequested() {
55
return false;
66
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * as ClusterFixture from "./ClusterFixtures";
2+
export * as TokenFixture from "./TokenFixtures";

packages/databricks-vscode/package.json

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,15 @@
162162
{
163163
"command": "databricks.quickstart.open",
164164
"title": "Databricks: Open Quickstart"
165+
},
166+
{ "command": "databricks.cluster.start",
167+
"title": "Start Cluster",
168+
"icon": "$(debug-start)"
169+
},
170+
{
171+
"command": "databricks.cluster.stop",
172+
"title": "Stop Cluster",
173+
"icon": "$(debug-stop)"
165174
}
166175
],
167176
"viewsContainers": {
@@ -229,12 +238,12 @@
229238
{
230239
"command": "databricks.connection.attachClusterQuickPick",
231240
"when": "view == configurationView && viewItem == clusterDetached",
232-
"group": "inline@0"
241+
"group": "inline@1"
233242
},
234243
{
235244
"command": "databricks.connection.detachCluster",
236-
"when": "view == configurationView && viewItem == clusterAttached",
237-
"group": "inline@0"
245+
"when": "view == configurationView && viewItem == clusterRunning || view == configurationView && viewItem == clusterStopped || view == configurationView && viewItem == clusterPending",
246+
"group": "inline@1"
238247
},
239248
{
240249
"command": "databricks.connection.attachSyncDestination",
@@ -255,6 +264,16 @@
255264
"command": "databricks.sync.stop",
256265
"when": "view == configurationView && viewItem == syncRunning",
257266
"group": "inline@0"
267+
},
268+
{
269+
"command": "databricks.cluster.stop",
270+
"when": "view == configurationView && viewItem == clusterRunning || view == configurationView && viewItem == clusterPending",
271+
"group": "inline@0"
272+
},
273+
{
274+
"command": "databricks.cluster.start",
275+
"when": "view == configurationView && viewItem == clusterStopped",
276+
"group": "inline@0"
258277
}
259278
],
260279
"editor/title/run": [

packages/databricks-vscode/src/cluster/ClusterCommands.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1+
import {Cluster} from "@databricks/databricks-sdk";
2+
import {TreeItem} from "vscode";
3+
import {ConnectionManager} from "../configuration/ConnectionManager";
14
import {ClusterFilter, ClusterModel} from "./ClusterModel";
25

36
/**
47
* Cluster related commands
58
*/
69
export class ClusterCommands {
7-
constructor(private clusterModel: ClusterModel) {}
10+
constructor(
11+
private clusterModel: ClusterModel,
12+
readonly connectionManager: ConnectionManager
13+
) {}
814

915
/**
1016
* Refresh cluster tree view by reloading them throug the API
@@ -23,4 +29,20 @@ export class ClusterCommands {
2329
this.clusterModel.filter = filter;
2430
};
2531
}
32+
33+
/**
34+
* Command to start a cluster
35+
* @param cluster cluster to be started
36+
*/
37+
async startClusterCommand() {
38+
await this.connectionManager.startCluster();
39+
}
40+
41+
/**
42+
* Command to stop a cluster
43+
* @param cluster cluster to be stopped
44+
*/
45+
async stopClusterCommand() {
46+
await this.connectionManager.stopCluster();
47+
}
2648
}

packages/databricks-vscode/src/cluster/ClusterListDataProvider.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ describe(__filename, () => {
149149
let item = ClusterListDataProvider.clusterNodeToTreeItem(cluster);
150150
assert.deepEqual(item, {
151151
collapsibleState: 1,
152-
contextValue: "clusterStopped",
153152
iconPath: {
154153
color: undefined,
155154
id: "debug-stop",
@@ -166,7 +165,6 @@ describe(__filename, () => {
166165
item = ClusterListDataProvider.clusterNodeToTreeItem(cluster);
167166
assert.deepEqual(item, {
168167
collapsibleState: 1,
169-
contextValue: "clusterRunning",
170168
iconPath: {
171169
color: undefined,
172170
id: "debug-start",

0 commit comments

Comments
 (0)