update mocha-vscode to better work with different SUV backends introduced in mocha-suv@9407922

This commit is contained in:
Michael Becker 2025-03-25 10:57:10 -04:00
parent d38212fbb3
commit 431fa59a71
5 changed files with 176 additions and 17 deletions

View File

@ -13,6 +13,11 @@
"main": "./out/extension.js", "main": "./out/extension.js",
"contributes": { "contributes": {
"commands": [ "commands": [
{
"command": "mocha.suvmanager.set_selected_item",
"title": "",
"category": "Mocha"
},
{ {
"command": "mocha.suvmanager.suv_manager", "command": "mocha.suvmanager.suv_manager",
"title": "Manage SUVs", "title": "Manage SUVs",
@ -24,9 +29,19 @@
"shortTitle": "Show in Web", "shortTitle": "Show in Web",
"category": "Mocha" "category": "Mocha"
}, },
{
"command": "mocha.suvmanager.suv_copy_id",
"title": "Copy SUV ID",
"category": "Mocha"
},
{ {
"command": "mocha.suvmanager.suv_up", "command": "mocha.suvmanager.suv_up",
"title": "Launch SUV", "title": "Start SUV",
"category": "Mocha"
},
{
"command": "mocha.suvmanager.suv_down",
"title": "Stop SUV",
"category": "Mocha" "category": "Mocha"
}, },
{ {
@ -38,6 +53,12 @@
"dark": "icons/commands/add-connection-dark.svg" "dark": "icons/commands/add-connection-dark.svg"
} }
}, },
{
"command": "mocha.suvmanager.suv_refresh",
"title": "Refresh SUV List",
"category": "Mocha",
"icon": "$(refresh)"
},
{ {
"command": "mocha.add_documentation_comment", "command": "mocha.add_documentation_comment",
"title": "Add Documentation Comment", "title": "Add Documentation Comment",
@ -150,17 +171,32 @@
"command": "mocha.suvmanager.suv_new", "command": "mocha.suvmanager.suv_new",
"when": "view == mocha.suvManager", "when": "view == mocha.suvManager",
"group": "navigation@1" "group": "navigation@1"
},
{
"command": "mocha.suvmanager.suv_refresh",
"when": "view == mocha.suvManager",
"group": "navigation@1"
} }
], ],
"view/item/context": [ "view/item/context": [
{ {
"command": "mocha.suvmanager.suv_show", "command": "mocha.suvmanager.suv_show",
"group": "YourGroup@1", "group": "0_view@1",
"when": "view == mocha.suvManager" "when": "view == mocha.suvManager"
}, },
{ {
"command": "mocha.suvmanager.suv_up", "command": "mocha.suvmanager.suv_up",
"group": "YourGroup@2", "group": "1_control@1",
"when": "view == mocha.suvManager"
},
{
"command": "mocha.suvmanager.suv_down",
"group": "1_control@1",
"when": "view == mocha.suvManager"
},
{
"command": "mocha.suvmanager.suv_copy_id",
"group": "2_copy",
"when": "view == mocha.suvManager" "when": "view == mocha.suvManager"
} }
] ]

View File

@ -2,13 +2,15 @@
// Import the module and reference it with the alias vscode in your code below // Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { SuvManagerTreeDataProvider } from './SuvManagerTreeDataProvider';
import { GenericTreeDataProvider } from './tdp/GenericTreeDataProvider'; import { GenericTreeDataProvider } from './tdp/GenericTreeDataProvider';
import { GenericTreeDataItem } from './tdp/GenericTreeDataItem'; import { GenericTreeDataItem } from './tdp/GenericTreeDataItem';
import { ModuleExplorerTreeDataProvider } from './ModuleExplorerTreeDataProvider'; import { ModuleExplorerTreeDataProvider } from './ModuleExplorerTreeDataProvider';
import { userInfo } from 'os'; import { userInfo } from 'os';
import { Machine } from './Machine'; import { Machine } from './Machine';
import { SuvManagerTreeDecorationProvider } from './suvManager/SuvManagerTreeDecorationProvider';
import { SuvManagerTreeDataProvider } from './suvManager/SuvManagerTreeDataProvider';
import * as path from 'path'; import * as path from 'path';
import https from 'node:https'; import https from 'node:https';
@ -16,7 +18,10 @@ import https from 'node:https';
const cp = require('child_process'); const cp = require('child_process');
let dpModuleExplorer = new ModuleExplorerTreeDataProvider(); let dpModuleExplorer = new ModuleExplorerTreeDataProvider();
let treeSuvManager : vscode.TreeView<Machine> | undefined = undefined; let treeSuvManager: vscode.TreeView<Machine> | undefined = undefined;
// register the decoration provider
vscode.window.registerFileDecorationProvider(new SuvManagerTreeDecorationProvider());
export function mkotsuri(suvId : string, tenantName : string, command : string, serviceName : string = "zq", version : string = "v1") : vscode.Uri export function mkotsuri(suvId : string, tenantName : string, command : string, serviceName : string = "zq", version : string = "v1") : vscode.Uri
{ {
@ -131,6 +136,7 @@ export function activate(context: vscode.ExtensionContext) {
treeSuvManager.badge = { "value": 1, "tooltip": "1 SUV(s) running" }; treeSuvManager.badge = { "value": 1, "tooltip": "1 SUV(s) running" };
let treeModuleExplorer = vscode.window.createTreeView("mocha.moduleExplorer", { "canSelectMany": true, "showCollapseAll": true, "treeDataProvider": dpModuleExplorer }); let treeModuleExplorer = vscode.window.createTreeView("mocha.moduleExplorer", { "canSelectMany": true, "showCollapseAll": true, "treeDataProvider": dpModuleExplorer });
// dpModuleExplorer.treeview = treeModuleExplorer; // dpModuleExplorer.treeview = treeModuleExplorer;
// treeModuleExplorer.badge = { "value": 1, "tooltip": "1 SUV(s) running" }; // treeModuleExplorer.badge = { "value": 1, "tooltip": "1 SUV(s) running" };
@ -141,8 +147,16 @@ export function activate(context: vscode.ExtensionContext) {
// This line of code will only be executed once when your extension is activated // This line of code will only be executed once when your extension is activated
console.log('Congratulations, your extension "suvmanager" is now active!'); console.log('Congratulations, your extension "suvmanager" is now active!');
vscode.commands.registerCommand("mocha.suvmanager.set_selected_item", (item:vscode.TreeItem) => {
cp.exec('mocha suv status -f csv ' + item.label, (err: string, stdout: string, stderr: string) => {
let listSuvs = new Array<Machine>();
let list = stdout.trim().split('\n');
console.log(list[0]);
});
});
let cmd_zq_import_function_signature = vscode.commands.registerCommand("mocha.zq_import_function_signature", () => { let cmd_zq_import_function_signature = vscode.commands.registerCommand("mocha.zq_import_function_signature", () => {
/* /*s
const rootCas = require('ssl-root-cas').create(); const rootCas = require('ssl-root-cas').create();
rootCas.addFile(path.resolve(__dirname,'localhost.crt')); rootCas.addFile(path.resolve(__dirname,'localhost.crt'));
https.globalAgent.options.ca = rootCas; https.globalAgent.options.ca = rootCas;
@ -235,17 +249,25 @@ export function activate(context: vscode.ExtensionContext) {
}); });
context.subscriptions.push(cmd_suv_manager); context.subscriptions.push(cmd_suv_manager);
let cmd_suv_refresh = vscode.commands.registerCommand('mocha.suvmanager.suv_refresh', () => {
vscode.window.showInformationMessage('Add code here to display SUV Manager panel!');
});
context.subscriptions.push(cmd_suv_refresh);
let cmd_suv_show = vscode.commands.registerCommand('mocha.suvmanager.suv_show', (...args) => { let cmd_suv_show = vscode.commands.registerCommand('mocha.suvmanager.suv_show', (...args) => {
if (args.length === 0) { if (args.length === 0) {
cp.exec('mocha suv list', (err: string, stdout: string, stderr: string) => { cp.exec('mocha suv status -f csv', (err: string, stdout: string, stderr: string) => {
vscode.window.showInformationMessage(stdout); vscode.window.showInformationMessage(stdout);
let list = stdout.split(' '); let list = stdout.split('\n');
let list2 = new Array<string>(); let list2 = new Array<string>();
list.forEach((element) => { list.forEach((element) => {
list2.push(element.trim()); let list3 = element.trim().split(',');
if (list3[2] === 'running') {
list2.push(list3[0].trim());
}
}); });
var w = vscode.window.showQuickPick(list2, { "title": "Open SUV in Web Browser", "placeHolder": "Choose an SUV to open" }).then((value) => { var w = vscode.window.showQuickPick(list2, { "title": "Launch SUV", "placeHolder": "Pick an SUV to launch (e.g. i-012345678)" }).then((value) => {
if (value !== undefined) { if (value !== undefined) {
openWebBrowser(vscode.Uri.parse("https://" + value + ".privatesuv.com")); openWebBrowser(vscode.Uri.parse("https://" + value + ".privatesuv.com"));
} }
@ -262,14 +284,16 @@ export function activate(context: vscode.ExtensionContext) {
let cmd_suv_up = vscode.commands.registerCommand('mocha.suvmanager.suv_up', (...args) => { let cmd_suv_up = vscode.commands.registerCommand('mocha.suvmanager.suv_up', (...args) => {
if (args.length === 0) { if (args.length === 0) {
cp.exec('mocha suv list', (err: string, stdout: string, stderr: string) => { cp.exec('mocha suv list', (err: string, stdout: string, stderr: string) => {
vscode.window.showInformationMessage(stdout); vscode.window.showInformationMessage(stdout);
let list = stdout.split(' '); let list = stdout.split('\n');
let list2 = new Array<string>(); let list2 = new Array<string>();
list.forEach((element) => { list.forEach((element) => {
list2.push(element.trim()); list2.push(element.trim());
}); });
var w = vscode.window.showQuickPick(list2, { "title": "Launch SUV", "placeHolder": "Pick an SUV to launch (e.g. i-012345678)" }).then((value) => { var w = vscode.window.showQuickPick(list2, { "title": "Open SUV in Web Browser", "placeHolder": "Choose an SUV to open" }).then((value) => {
if (value !== undefined) { if (value !== undefined) {
launchSuv(value); launchSuv(value);
} }

View File

@ -0,0 +1,30 @@
// Copyright (C) 2025 Michael Becker <alcexhim@gmail.com>
//
// This file is part of mocha-vscode.
//
// mocha-vscode is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// mocha-vscode is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with mocha-vscode. If not, see <https://www.gnu.org/licenses/>.
import * as vscode from 'vscode';
export class SuvManagerTreeDataItem extends vscode.TreeItem {
constructor(label : string) {
super(label);
// this is important, otherwise provideFileDecoration will not be called
this.resourceUri = vscode.Uri.parse('x-suv-manager://machines/' + label);
this.iconPath = "$(database)";
this.command = { "command": "mocha.suvmanager.set_selected_item", "title": "Set Selected Item", "arguments": [this] };
}
}

View File

@ -2,7 +2,8 @@ import * as vscode from 'vscode';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import { Machine } from './Machine'; import { Machine } from '../Machine';
import { SuvManagerTreeDataItem } from './SuvManagerTreeDataItem';
const cp = require('child_process'); const cp = require('child_process');
@ -30,7 +31,7 @@ export class SuvManagerTreeDataProvider implements vscode.TreeDataProvider<Machi
getTreeItem(element: Machine): vscode.TreeItem { getTreeItem(element: Machine): vscode.TreeItem {
return new vscode.TreeItem(element.name); return new SuvManagerTreeDataItem(element.name);
} }
getChildren(element?: Machine): Thenable<Machine[]> { getChildren(element?: Machine): Thenable<Machine[]> {
@ -42,7 +43,7 @@ export class SuvManagerTreeDataProvider implements vscode.TreeDataProvider<Machi
else{ else{
return new Promise((resolve, reject) => return new Promise((resolve, reject) =>
{ {
cp.exec('mocha suv list', (err: string, stdout: string, stderr: string) => cp.exec('mocha suv status -f csv', (err: string, stdout: string, stderr: string) =>
{ {
let listSuvs = new Array<Machine>(); let listSuvs = new Array<Machine>();
let list = stdout.split('\n'); let list = stdout.split('\n');
@ -60,13 +61,15 @@ export class SuvManagerTreeDataProvider implements vscode.TreeDataProvider<Machi
list.forEach( (element) => list.forEach( (element) =>
{ {
if (element == "") if (element === "")
{ {
return; return;
} }
let fields = element.trim().split(',');
let m1 = new Machine(); let m1 = new Machine();
m1.name = element.trim(); m1.name = fields[0].trim();
ct ++; ct ++;
listSuvs.push(m1); listSuvs.push(m1);

View File

@ -0,0 +1,66 @@
// Copyright (C) 2025 Michael Becker <alcexhim@gmail.com>
//
// This file is part of mocha-vscode.
//
// mocha-vscode is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// mocha-vscode is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with mocha-vscode. If not, see <https://www.gnu.org/licenses/>.
// define the decoration provider
import * as vscode from 'vscode';
const cp = require('child_process');
export class SuvManagerTreeDecorationProvider implements vscode.FileDecorationProvider {
provideFileDecoration(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<vscode.FileDecoration> {
let activeSuv = '';
// https://code.visualstudio.com/api/references/theme-color#lists-and-trees
if (uri.scheme === 'x-suv-manager') {
let p = uri.path.substring(1);
return new Promise((resolve, reject) => {
cp.exec('mocha suv status -f csv ' + p, (err: string, stdout: string, stderr: string) => {
let list = stdout;
let details = list.split(',');
let suvId: string = details[0].trim();
let status : string = details[2].trim();
let cc = new vscode.ThemeColor('disabledForeground');
if (status === "stopped") {
}
else if (status === "running") {
if (activeSuv === suvId) {
cc = new vscode.ThemeColor('gitDecoration.untrackedResourceForeground');
}
else {
cc = new vscode.ThemeColor('foreground');
}
}
resolve({
// color: new vscode.ThemeColor('list.warningForeground'),
color: cc,
// badge: "1"
tooltip: details[1] + ", " + details[2],
badge: details[1][0].toUpperCase()
});
});
});
}
return undefined;
}
}