From ef1dcfa52e13e437ce668ad571d368526a0cdf77 Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Thu, 5 Jan 2023 15:57:36 +1100 Subject: [PATCH 1/2] add kill and stop queue --- extension/package.json | 32 +++++++++++++- extension/package.nls.json | 2 + extension/src/cli/dvc/constants.ts | 4 +- extension/src/cli/dvc/executor.test.ts | 42 +++++++++++++++++++ extension/src/cli/dvc/executor.ts | 10 +++++ extension/src/commands/external.ts | 2 + .../src/experiments/commands/register.ts | 10 +++++ extension/src/telemetry/constants.ts | 2 + .../test/suite/experiments/workspace.test.ts | 37 +++++++++++++++- 9 files changed, 136 insertions(+), 5 deletions(-) diff --git a/extension/package.json b/extension/package.json index 6d6db48594..9270702a32 100644 --- a/extension/package.json +++ b/extension/package.json @@ -216,6 +216,11 @@ "command": "dvc.init", "category": "DVC" }, + { + "title": "%command.killExperimentsQueue%", + "command": "dvc.killExperimentsQueue", + "category": "DVC" + }, { "title": "%command.moveTargets%", "command": "dvc.moveTargets", @@ -341,6 +346,11 @@ "category": "DVC", "icon": "$(run-all)" }, + { + "title": "%command.stopExperimentsQueue%", + "command": "dvc.stopExperimentsQueue", + "category": "DVC" + }, { "title": "%command.resetAndRunCheckpointExperiment%", "command": "dvc.resetAndRunCheckpointExperiment", @@ -685,6 +695,10 @@ "command": "dvc.init", "when": "dvc.commands.available && !dvc.cli.incompatible && !dvc.project.available && !dvc.scm.command.running" }, + { + "command": "dvc.killExperimentsQueue", + "when": "dvc.commands.available && dvc.project.available" + }, { "command": "dvc.moveTargets", "when": "false" @@ -775,7 +789,11 @@ }, { "command": "dvc.startExperimentsQueue", - "when": "dvc.commands.available && dvc.project.available && !dvc.experiment.running" + "when": "dvc.commands.available && dvc.project.available" + }, + { + "command": "dvc.stopExperimentsQueue", + "when": "dvc.commands.available && dvc.project.available" }, { "command": "dvc.selectForCompare", @@ -1257,9 +1275,19 @@ }, { "command": "dvc.startExperimentsQueue", - "when": "view == dvc.views.experimentsTree && !dvc.experiment.running", + "when": "view == dvc.views.experimentsTree", "group": "3_queue@2" }, + { + "command": "dvc.stopExperimentsQueue", + "when": "view == dvc.views.experimentsTree", + "group": "3_queue@3" + }, + { + "command": "dvc.killExperimentsQueue", + "when": "view == dvc.views.experimentsTree", + "group": "3_queue@4" + }, { "command": "dvc.addExperimentsTableSort", "when": "view == dvc.views.experimentsSortByTree", diff --git a/extension/package.nls.json b/extension/package.nls.json index 7a750a2a80..24bb274d12 100644 --- a/extension/package.nls.json +++ b/extension/package.nls.json @@ -24,6 +24,7 @@ "command.gitStageAll": "Stage All Git Tracked", "command.gitUnstageAll": "Unstage All Git Tracked", "command.init": "Initialize a DVC Project", + "command.killExperimentsQueue": "Kill the Experiments Queue", "command.openToTheSide": "Open to the Side", "command.moveTargets": "Add Data", "command.pull": "Pull", @@ -45,6 +46,7 @@ "command.runExperiment": "Run Experiment", "command.resumeCheckpointExperiment": "Resume Experiment", "command.startExperimentsQueue": "Start the Experiments Queue", + "command.stopExperimentsQueue": "Stop the Experiments Queue", "command.resetAndRunCheckpointExperiment": "Run Experiment", "command.selectForCompare": "Select for Compare", "command.selectFocusedProjects": "Select Project(s) to Focus (set dvc.focusedProjects)", diff --git a/extension/src/cli/dvc/constants.ts b/extension/src/cli/dvc/constants.ts index 355bec9fa4..59095d4303 100644 --- a/extension/src/cli/dvc/constants.ts +++ b/extension/src/cli/dvc/constants.ts @@ -62,7 +62,9 @@ export enum ExperimentSubCommand { } export enum QueueSubCommand { - START = 'start' + KILL = 'kill', + START = 'start', + STOP = 'stop' } export enum ExperimentFlag { diff --git a/extension/src/cli/dvc/executor.test.ts b/extension/src/cli/dvc/executor.test.ts index 303f3f417d..a371e9e605 100644 --- a/extension/src/cli/dvc/executor.test.ts +++ b/extension/src/cli/dvc/executor.test.ts @@ -563,6 +563,27 @@ describe('CliExecutor', () => { }) }) + describe('queueKill', () => { + it("should call createProcess with the correct parameters to kill the experiment's queue", async () => { + const cwd = __dirname + + const stdout = 'Queue workers will stop after running tasks finish.' + + mockedCreateProcess.mockReturnValueOnce(getMockedProcess(stdout)) + + const output = await dvcExecutor.queueKill(cwd) + + expect(output).toStrictEqual(stdout) + + expect(mockedCreateProcess).toHaveBeenCalledWith({ + args: ['queue', 'kill'], + cwd, + env: mockedEnv, + executable: 'dvc' + }) + }) + }) + describe('queueStart', () => { it("should call createProcess with the correct parameters to start the experiment's queue", async () => { const cwd = __dirname @@ -585,6 +606,27 @@ describe('CliExecutor', () => { }) }) + describe('queueStop', () => { + it("should call createProcess with the correct parameters to stop the experiment's queue", async () => { + const cwd = __dirname + + const stdout = 'Queue workers will stop after running tasks finish.' + + mockedCreateProcess.mockReturnValueOnce(getMockedProcess(stdout)) + + const output = await dvcExecutor.queueStop(cwd) + + expect(output).toStrictEqual(stdout) + + expect(mockedCreateProcess).toHaveBeenCalledWith({ + args: ['queue', 'stop'], + cwd, + env: mockedEnv, + executable: 'dvc' + }) + }) + }) + describe('remove', () => { it('should call createProcess with the correct parameters to remove a .dvc file', async () => { const cwd = __dirname diff --git a/extension/src/cli/dvc/executor.ts b/extension/src/cli/dvc/executor.ts index 4ba1c4b1df..c81f2b7c13 100644 --- a/extension/src/cli/dvc/executor.ts +++ b/extension/src/cli/dvc/executor.ts @@ -26,7 +26,9 @@ export const autoRegisteredCommands = { MOVE: 'move', PULL: 'pull', PUSH: 'push', + QUEUE_KILL: 'queueKill', QUEUE_START: 'queueStart', + QUEUE_STOP: 'queueStop', REMOVE: 'remove' } as const @@ -128,6 +130,10 @@ export class DvcExecutor extends DvcCli { return this.blockAndExecuteProcess(cwd, Command.PUSH, ...args) } + public queueKill(cwd: string) { + return this.executeDvcProcess(cwd, Command.QUEUE, QueueSubCommand.KILL) + } + public queueStart(cwd: string, jobs: string) { return this.executeDvcProcess( cwd, @@ -138,6 +144,10 @@ export class DvcExecutor extends DvcCli { ) } + public queueStop(cwd: string) { + return this.executeDvcProcess(cwd, Command.QUEUE, QueueSubCommand.STOP) + } + public remove(cwd: string, ...args: Args) { return this.blockAndExecuteProcess(cwd, Command.REMOVE, ...args) } diff --git a/extension/src/commands/external.ts b/extension/src/commands/external.ts index 4069bde666..72efc5d5a5 100644 --- a/extension/src/commands/external.ts +++ b/extension/src/commands/external.ts @@ -11,7 +11,9 @@ export enum RegisteredCliCommands { EXPERIMENT_SHARE_AS_BRANCH = 'dvc.shareExperimentAsBranch', EXPERIMENT_SHARE_AS_COMMIT = 'dvc.shareExperimentAsCommit', QUEUE_EXPERIMENT = 'dvc.queueExperiment', + QUEUE_KILL = 'dvc.killExperimentsQueue', QUEUE_START = 'dvc.startExperimentsQueue', + QUEUE_STOP = 'dvc.stopExperimentsQueue', EXPERIMENT_VIEW_APPLY = 'dvc.views.experiments.applyExperiment', EXPERIMENT_VIEW_BRANCH = 'dvc.views.experiments.branchExperiment', diff --git a/extension/src/experiments/commands/register.ts b/extension/src/experiments/commands/register.ts index ea53589583..67243a8289 100644 --- a/extension/src/experiments/commands/register.ts +++ b/extension/src/experiments/commands/register.ts @@ -27,6 +27,16 @@ const registerExperimentCwdCommands = ( ) ) + internalCommands.registerExternalCliCommand( + RegisteredCliCommands.QUEUE_KILL, + () => experiments.getCwdThenReport(AvailableCommands.QUEUE_KILL) + ) + + internalCommands.registerExternalCliCommand( + RegisteredCliCommands.QUEUE_STOP, + () => experiments.getCwdThenReport(AvailableCommands.QUEUE_STOP) + ) + internalCommands.registerExternalCliCommand( RegisteredCliCommands.MODIFY_EXPERIMENT_PARAMS_AND_QUEUE, () => diff --git a/extension/src/telemetry/constants.ts b/extension/src/telemetry/constants.ts index 94ac61b3fb..4f9d9d6615 100644 --- a/extension/src/telemetry/constants.ts +++ b/extension/src/telemetry/constants.ts @@ -154,7 +154,9 @@ export interface IEventNamePropertyMapping { [EventName.EXPERIMENT_VIEW_SHARE_AS_BRANCH]: undefined [EventName.EXPERIMENT_VIEW_SHARE_AS_COMMIT]: undefined [EventName.QUEUE_EXPERIMENT]: undefined + [EventName.QUEUE_KILL]: undefined [EventName.QUEUE_START]: undefined + [EventName.QUEUE_STOP]: undefined [EventName.EXPERIMENT_VIEW_QUEUE]: undefined [EventName.EXPERIMENT_VIEW_RESUME]: undefined diff --git a/extension/src/test/suite/experiments/workspace.test.ts b/extension/src/test/suite/experiments/workspace.test.ts index 857edeea3d..35a40db9f5 100644 --- a/extension/src/test/suite/experiments/workspace.test.ts +++ b/extension/src/test/suite/experiments/workspace.test.ts @@ -437,8 +437,23 @@ suite('Workspace Experiments Test Suite', () => { }) }) + describe('dvc.killExperimentsQueue', () => { + it('should be able to kill the experiments queue', async () => { + const mockQueueKill = stub(DvcExecutor.prototype, 'queueKill').resolves( + undefined + ) + + stubWorkspaceExperimentsGetters(dvcDemoPath) + + await commands.executeCommand(RegisteredCliCommands.QUEUE_KILL) + + expect(mockQueueKill).to.be.calledOnce + expect(mockQueueKill).to.be.calledWithExactly(dvcDemoPath) + }) + }) + describe('dvc.startExperimentsQueue', () => { - it('should be able to execute all experiments in the run queue', async () => { + it('should be able to start the experiments queue with the selected number of workers', async () => { const mockQueueStart = stub(DvcExecutor.prototype, 'queueStart').resolves( undefined ) @@ -454,11 +469,29 @@ suite('Workspace Experiments Test Suite', () => { await commands.executeCommand(RegisteredCliCommands.QUEUE_START) expect(mockQueueStart).to.be.calledOnce - expect(mockQueueStart).to.be.calledWith(dvcDemoPath, dDosNumberOfJobs) + expect(mockQueueStart).to.be.calledWithExactly( + dvcDemoPath, + dDosNumberOfJobs + ) expect(mockInputBox) }) }) + describe('dvc.stopExperimentsQueue', () => { + it('should be able to stop the experiments queue', async () => { + const mockQueueStop = stub(DvcExecutor.prototype, 'queueStop').resolves( + undefined + ) + + stubWorkspaceExperimentsGetters(dvcDemoPath) + + await commands.executeCommand(RegisteredCliCommands.QUEUE_STOP) + + expect(mockQueueStop).to.be.calledOnce + expect(mockQueueStop).to.be.calledWithExactly(dvcDemoPath) + }) + }) + describe('dvc.applyExperiment', () => { it('should ask the user to pick an experiment and then apply that experiment to the workspace', async () => { const selectedExperiment = 'test-branch' From b18e2ee038b140986d51e9d95948f2533cbc2ad1 Mon Sep 17 00:00:00 2001 From: Matt Seddon Date: Fri, 6 Jan 2023 14:52:56 +1100 Subject: [PATCH 2/2] remove kill as it has a different function --- extension/package.json | 14 ------------- extension/package.nls.json | 1 - extension/src/cli/dvc/constants.ts | 1 - extension/src/cli/dvc/executor.test.ts | 21 ------------------- extension/src/cli/dvc/executor.ts | 5 ----- extension/src/commands/external.ts | 1 - .../src/experiments/commands/register.ts | 5 ----- extension/src/telemetry/constants.ts | 1 - .../test/suite/experiments/workspace.test.ts | 15 ------------- 9 files changed, 64 deletions(-) diff --git a/extension/package.json b/extension/package.json index 9270702a32..9c469334ad 100644 --- a/extension/package.json +++ b/extension/package.json @@ -216,11 +216,6 @@ "command": "dvc.init", "category": "DVC" }, - { - "title": "%command.killExperimentsQueue%", - "command": "dvc.killExperimentsQueue", - "category": "DVC" - }, { "title": "%command.moveTargets%", "command": "dvc.moveTargets", @@ -695,10 +690,6 @@ "command": "dvc.init", "when": "dvc.commands.available && !dvc.cli.incompatible && !dvc.project.available && !dvc.scm.command.running" }, - { - "command": "dvc.killExperimentsQueue", - "when": "dvc.commands.available && dvc.project.available" - }, { "command": "dvc.moveTargets", "when": "false" @@ -1283,11 +1274,6 @@ "when": "view == dvc.views.experimentsTree", "group": "3_queue@3" }, - { - "command": "dvc.killExperimentsQueue", - "when": "view == dvc.views.experimentsTree", - "group": "3_queue@4" - }, { "command": "dvc.addExperimentsTableSort", "when": "view == dvc.views.experimentsSortByTree", diff --git a/extension/package.nls.json b/extension/package.nls.json index 24bb274d12..5398696baf 100644 --- a/extension/package.nls.json +++ b/extension/package.nls.json @@ -24,7 +24,6 @@ "command.gitStageAll": "Stage All Git Tracked", "command.gitUnstageAll": "Unstage All Git Tracked", "command.init": "Initialize a DVC Project", - "command.killExperimentsQueue": "Kill the Experiments Queue", "command.openToTheSide": "Open to the Side", "command.moveTargets": "Add Data", "command.pull": "Pull", diff --git a/extension/src/cli/dvc/constants.ts b/extension/src/cli/dvc/constants.ts index 59095d4303..193076c775 100644 --- a/extension/src/cli/dvc/constants.ts +++ b/extension/src/cli/dvc/constants.ts @@ -62,7 +62,6 @@ export enum ExperimentSubCommand { } export enum QueueSubCommand { - KILL = 'kill', START = 'start', STOP = 'stop' } diff --git a/extension/src/cli/dvc/executor.test.ts b/extension/src/cli/dvc/executor.test.ts index a371e9e605..0994bfc4c1 100644 --- a/extension/src/cli/dvc/executor.test.ts +++ b/extension/src/cli/dvc/executor.test.ts @@ -563,27 +563,6 @@ describe('CliExecutor', () => { }) }) - describe('queueKill', () => { - it("should call createProcess with the correct parameters to kill the experiment's queue", async () => { - const cwd = __dirname - - const stdout = 'Queue workers will stop after running tasks finish.' - - mockedCreateProcess.mockReturnValueOnce(getMockedProcess(stdout)) - - const output = await dvcExecutor.queueKill(cwd) - - expect(output).toStrictEqual(stdout) - - expect(mockedCreateProcess).toHaveBeenCalledWith({ - args: ['queue', 'kill'], - cwd, - env: mockedEnv, - executable: 'dvc' - }) - }) - }) - describe('queueStart', () => { it("should call createProcess with the correct parameters to start the experiment's queue", async () => { const cwd = __dirname diff --git a/extension/src/cli/dvc/executor.ts b/extension/src/cli/dvc/executor.ts index c81f2b7c13..cfec926f7d 100644 --- a/extension/src/cli/dvc/executor.ts +++ b/extension/src/cli/dvc/executor.ts @@ -26,7 +26,6 @@ export const autoRegisteredCommands = { MOVE: 'move', PULL: 'pull', PUSH: 'push', - QUEUE_KILL: 'queueKill', QUEUE_START: 'queueStart', QUEUE_STOP: 'queueStop', REMOVE: 'remove' @@ -130,10 +129,6 @@ export class DvcExecutor extends DvcCli { return this.blockAndExecuteProcess(cwd, Command.PUSH, ...args) } - public queueKill(cwd: string) { - return this.executeDvcProcess(cwd, Command.QUEUE, QueueSubCommand.KILL) - } - public queueStart(cwd: string, jobs: string) { return this.executeDvcProcess( cwd, diff --git a/extension/src/commands/external.ts b/extension/src/commands/external.ts index 72efc5d5a5..f5142a6593 100644 --- a/extension/src/commands/external.ts +++ b/extension/src/commands/external.ts @@ -11,7 +11,6 @@ export enum RegisteredCliCommands { EXPERIMENT_SHARE_AS_BRANCH = 'dvc.shareExperimentAsBranch', EXPERIMENT_SHARE_AS_COMMIT = 'dvc.shareExperimentAsCommit', QUEUE_EXPERIMENT = 'dvc.queueExperiment', - QUEUE_KILL = 'dvc.killExperimentsQueue', QUEUE_START = 'dvc.startExperimentsQueue', QUEUE_STOP = 'dvc.stopExperimentsQueue', diff --git a/extension/src/experiments/commands/register.ts b/extension/src/experiments/commands/register.ts index 67243a8289..70114e57db 100644 --- a/extension/src/experiments/commands/register.ts +++ b/extension/src/experiments/commands/register.ts @@ -27,11 +27,6 @@ const registerExperimentCwdCommands = ( ) ) - internalCommands.registerExternalCliCommand( - RegisteredCliCommands.QUEUE_KILL, - () => experiments.getCwdThenReport(AvailableCommands.QUEUE_KILL) - ) - internalCommands.registerExternalCliCommand( RegisteredCliCommands.QUEUE_STOP, () => experiments.getCwdThenReport(AvailableCommands.QUEUE_STOP) diff --git a/extension/src/telemetry/constants.ts b/extension/src/telemetry/constants.ts index 4f9d9d6615..7da09f3b25 100644 --- a/extension/src/telemetry/constants.ts +++ b/extension/src/telemetry/constants.ts @@ -154,7 +154,6 @@ export interface IEventNamePropertyMapping { [EventName.EXPERIMENT_VIEW_SHARE_AS_BRANCH]: undefined [EventName.EXPERIMENT_VIEW_SHARE_AS_COMMIT]: undefined [EventName.QUEUE_EXPERIMENT]: undefined - [EventName.QUEUE_KILL]: undefined [EventName.QUEUE_START]: undefined [EventName.QUEUE_STOP]: undefined diff --git a/extension/src/test/suite/experiments/workspace.test.ts b/extension/src/test/suite/experiments/workspace.test.ts index 35a40db9f5..f05f61819f 100644 --- a/extension/src/test/suite/experiments/workspace.test.ts +++ b/extension/src/test/suite/experiments/workspace.test.ts @@ -437,21 +437,6 @@ suite('Workspace Experiments Test Suite', () => { }) }) - describe('dvc.killExperimentsQueue', () => { - it('should be able to kill the experiments queue', async () => { - const mockQueueKill = stub(DvcExecutor.prototype, 'queueKill').resolves( - undefined - ) - - stubWorkspaceExperimentsGetters(dvcDemoPath) - - await commands.executeCommand(RegisteredCliCommands.QUEUE_KILL) - - expect(mockQueueKill).to.be.calledOnce - expect(mockQueueKill).to.be.calledWithExactly(dvcDemoPath) - }) - }) - describe('dvc.startExperimentsQueue', () => { it('should be able to start the experiments queue with the selected number of workers', async () => { const mockQueueStart = stub(DvcExecutor.prototype, 'queueStart').resolves(