Skip to content

Commit

Permalink
Update Dapr CLI/runtime version validation (microsoft#183)
Browse files Browse the repository at this point in the history
* Refactor installation managment.

* Switch to welcome views for installation issues.

* Implement install Dapr command.

* Enforce initialized Dapr on task invocation.

* Consolidate button handling and CLI testing.

* Rework logic a bit.

* Updates per PR feedback.
  • Loading branch information
philliphoff authored Jul 12, 2021
1 parent 6aea135 commit 6494b97
Show file tree
Hide file tree
Showing 12 changed files with 11,445 additions and 146 deletions.
11,193 changes: 11,170 additions & 23 deletions package-lock.json

Large diffs are not rendered by default.

33 changes: 30 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
"ui"
],
"engines": {
"vscode": "^1.54.0"
"dapr-cli": ">=1.0",
"dapr-runtime": ">=1.0",
"vscode": "^1.57.0"
},
"categories": [
"Debuggers",
Expand All @@ -32,6 +34,7 @@
"onCommand:vscode-dapr.applications.publish-all-message",
"onCommand:vscode-dapr.applications.publish-message",
"onCommand:vscode-dapr.help.getStarted",
"onCommand:vscode-dapr.help.installDapr",
"onCommand:vscode-dapr.help.readDocumentation",
"onCommand:vscode-dapr.help.reportIssue",
"onCommand:vscode-dapr.help.reviewIssues",
Expand Down Expand Up @@ -74,6 +77,11 @@
"title": "%vscode-dapr.help.getStarted.title%",
"category": "Dapr"
},
{
"command": "vscode-dapr.help.installDapr",
"title": "%vscode-dapr.help.installDapr.title%",
"category": "Dapr"
},
{
"command": "vscode-dapr.help.readDocumentation",
"title": "%vscode-dapr.help.readDocumentation.title%",
Expand Down Expand Up @@ -421,7 +429,24 @@
"icon": "assets/images/dapr.svg"
}
]
}
},
"viewsWelcome": [
{
"view": "vscode-dapr.views.applications",
"contents": "%vscode-dapr.views.applications.contents.notInitialized%",
"when": "vscode-dapr.views.applications.state == 'notInitialized'"
},
{
"view": "vscode-dapr.views.applications",
"contents": "%vscode-dapr.views.applications.contents.notInstalled%",
"when": "vscode-dapr.views.applications.state == 'notInstalled'"
},
{
"view": "vscode-dapr.views.applications",
"contents": "%vscode-dapr.views.applications.contents.notRunning%",
"when": "vscode-dapr.views.applications.state == 'notRunning'"
}
]
},
"scripts": {
"clean": "gulp clean",
Expand All @@ -443,8 +468,9 @@
"@types/mocha": "^8.2.2",
"@types/node": "^12.20.1",
"@types/ps-list": "^6.2.1",
"@types/semver": "^7.3.6",
"@types/terser-webpack-plugin": "^5.0.2",
"@types/vscode": "^1.54.0",
"@types/vscode": "^1.57.0",
"@types/webpack": "^4.41.26",
"@typescript-eslint/eslint-plugin": "^4.19.0",
"@typescript-eslint/parser": "^4.19.0",
Expand All @@ -471,6 +497,7 @@
"fs-extra": "^9.1.0",
"handlebars": "^4.7.7",
"ps-list": "^7.2.0",
"semver": "^5.7.1",
"vscode-azureextensionui": "^0.40.0",
"vscode-nls": "^5.0.0"
}
Expand Down
5 changes: 5 additions & 0 deletions package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,16 @@

"vscode-dapr.help.readDocumentation.title": "Read Documentation",
"vscode-dapr.help.getStarted.title": "Get Started",
"vscode-dapr.help.installDapr.title": "Install Dapr",
"vscode-dapr.help.reportIssue.title": "Report Issue",
"vscode-dapr.help.reviewIssues.title": "Review Issues",
"vscode-dapr.tasks.scaffoldDaprComponents.title": "Scaffold Dapr Components",
"vscode-dapr.tasks.scaffoldDaprTasks.title": "Scaffold Dapr Tasks",

"vscode-dapr.views.applications.name": "Applications",
"vscode-dapr.views.applications.contents.notInitialized": "A compatible version of the Dapr runtime has not been found. You may need to install a more recent version.\n[Install Latest Dapr](command:vscode-dapr.help.installDapr)",
"vscode-dapr.views.applications.contents.notInstalled": "A compatible version of the Dapr CLI has not been found. You may need to install a more recent version.\n[Install Latest Dapr](command:vscode-dapr.help.installDapr)",
"vscode-dapr.views.applications.contents.notRunning": "No Dapr applications are running.",
"vscode-dapr.views.help.name": "Help and Feedback",

"vscode-dapr.view-containers.dapr-explorer.title": "Dapr",
Expand Down
12 changes: 12 additions & 0 deletions src/commands/help/installDapr.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { UserInput } from '../../services/userInput';

export function installDapr(ui: UserInput): Thenable<boolean> {
return ui.openExternal('https://aka.ms/vscode-dapr-install-dapr');
}

const createInstallDaprCommand = (ui: UserInput) => (): Thenable<boolean> => installDapr(ui);

export default createInstallDaprCommand;
19 changes: 16 additions & 3 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ import LocalScaffolder from './scaffolding/scaffolder';
import NodeEnvironmentProvider from './services/environmentProvider';
import createScaffoldDaprComponentsCommand from './commands/scaffoldDaprComponents';
import VsCodeSettingsProvider from './services/settingsProvider';
import LocalDaprCliClient from './services/daprCliClient';
import createInstallDaprCommand from './commands/help/installDapr';

interface ExtensionPackage {
engines: { [key: string]: string };
}

export function activate(context: vscode.ExtensionContext): Promise<void> {
function registerDisposable<T extends vscode.Disposable>(disposable: T): T {
Expand Down Expand Up @@ -66,21 +72,28 @@ export function activate(context: vscode.ExtensionContext): Promise<void> {
telemetryProvider.registerContextCommandWithTelemetry('vscode-dapr.applications.publish-message', createPublishMessageCommand(daprApplicationProvider, daprClient, ext.outputChannel, ui, context.workspaceState));
telemetryProvider.registerContextCommandWithTelemetry('vscode-dapr.help.readDocumentation', createReadDocumentationCommand(ui));
telemetryProvider.registerContextCommandWithTelemetry('vscode-dapr.help.getStarted', createGetStartedCommand(ui));
telemetryProvider.registerContextCommandWithTelemetry('vscode-dapr.help.installDapr', createInstallDaprCommand(ui));
telemetryProvider.registerContextCommandWithTelemetry('vscode-dapr.help.reportIssue', createReportIssueCommand(ui));
telemetryProvider.registerContextCommandWithTelemetry('vscode-dapr.help.reviewIssues', createReviewIssuesCommand(ui));
telemetryProvider.registerCommandWithTelemetry('vscode-dapr.tasks.scaffoldDaprComponents', createScaffoldDaprComponentsCommand(scaffolder, templateScaffolder));
telemetryProvider.registerCommandWithTelemetry('vscode-dapr.tasks.scaffoldDaprTasks', createScaffoldDaprTasksCommand(scaffolder, templateScaffolder, ui));

const settingsProvider = new VsCodeSettingsProvider();
const extensionPackage = <ExtensionPackage>context.extension.packageJSON;
const daprInstallationManager = new LocalDaprInstallationManager(
extensionPackage.engines['dapr-cli'],
extensionPackage.engines['dapr-runtime'],
new LocalDaprCliClient(() => settingsProvider.daprPath),
ui);

registerDisposable(vscode.tasks.registerTaskProvider('dapr', new DaprCommandTaskProvider(() => settingsProvider.daprPath, telemetryProvider)));
registerDisposable(vscode.tasks.registerTaskProvider('daprd', new DaprdCommandTaskProvider(() => settingsProvider.daprdPath, new NodeEnvironmentProvider(), telemetryProvider)));
registerDisposable(vscode.tasks.registerTaskProvider('dapr', new DaprCommandTaskProvider(daprInstallationManager, () => settingsProvider.daprPath, telemetryProvider)));
registerDisposable(vscode.tasks.registerTaskProvider('daprd', new DaprdCommandTaskProvider(daprInstallationManager, () => settingsProvider.daprdPath, new NodeEnvironmentProvider(), telemetryProvider)));
registerDisposable(vscode.tasks.registerTaskProvider('daprd-down', new DaprdDownTaskProvider(daprApplicationProvider, telemetryProvider)));

registerDisposable(
vscode.window.registerTreeDataProvider(
'vscode-dapr.views.applications',
registerDisposable(new DaprApplicationTreeDataProvider(daprApplicationProvider, new LocalDaprInstallationManager(), daprClient))));
registerDisposable(new DaprApplicationTreeDataProvider(daprApplicationProvider, daprClient, daprInstallationManager, ui))));

registerDisposable(
vscode.window.registerTreeDataProvider(
Expand Down
47 changes: 47 additions & 0 deletions src/services/daprCliClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import CommandLineBuilder from "../util/commandLineBuilder";
import { Process } from "../util/process";
import * as nls from 'vscode-nls';
import { getLocalizationPathForFile } from '../util/localization';

const localize = nls.loadMessageBundle(getLocalizationPathForFile(__filename));

export interface DaprVersion {
cli: string | undefined;
runtime: string | undefined;
}

export interface DaprCliClient {
version(): Promise<DaprVersion>;
}

export default class LocalDaprCliClient implements DaprCliClient {
constructor(private readonly daprPathProvider: () => string) {
}

async version(): Promise<DaprVersion> {
const daprPath = this.daprPathProvider();
const command =
CommandLineBuilder
.create(daprPath, '--version')
.build();

const result = await Process.exec(command);

if (result.code !== 0) {
throw new Error(localize('services.daprCliClient.versionFailed', 'Retrieving the dapr CLI version failed: {0}', result.stderr));
}

const cliMatch = /^CLI version: (?<version>.+)$/gm.exec(result.stdout);
const runtimeMatch = /^Runtime version: (?<version>.+)$/gm.exec(result.stdout);

return {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
cli: cliMatch ? cliMatch.groups!['version'] : undefined,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
runtime: runtimeMatch ? runtimeMatch.groups!['version'] : undefined
}
}
}
Loading

0 comments on commit 6494b97

Please sign in to comment.