From 59a104c487a6819fe2dc537efbdd57caec3fcaa2 Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Sat, 14 Sep 2024 22:16:02 -0700 Subject: [PATCH 1/7] fix: add api package Signed-off-by: Denis Golovin --- extensions/podman/packages/api/package.json | 23 ++++++++++ .../api/src/podman-extension-api.d.ts | 23 ++++++++++ extensions/podman/packages/api/tsconfig.json | 12 +++++ extensions/podman/packages/api/vite.config.js | 46 +++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 extensions/podman/packages/api/package.json create mode 100644 extensions/podman/packages/api/src/podman-extension-api.d.ts create mode 100644 extensions/podman/packages/api/tsconfig.json create mode 100644 extensions/podman/packages/api/vite.config.js diff --git a/extensions/podman/packages/api/package.json b/extensions/podman/packages/api/package.json new file mode 100644 index 0000000000000..50c14525b3b60 --- /dev/null +++ b/extensions/podman/packages/api/package.json @@ -0,0 +1,23 @@ +{ + "name": "@podman-desktop/podman-extension-api", + "version": "0.0.1", + "description": "API for Podman Desktop Podman extension", + "publishConfig": { + "access": "public" + }, + "license": "Apache-2.0", + "types": "./src/podman-extension-api.d.ts", + "files": [ + "src" + ], + "scripts": { + "prepare": "", + "clean": "rimraf lib *.tsbuildinfo", + "build": "", + "watch": "", + "publish:next": "yarn publish --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version 0.0.1-\"$(date +%s)\"" + }, + "dependencies": { + "@podman-desktop/api": "^1.12.0" + } +} diff --git a/extensions/podman/packages/api/src/podman-extension-api.d.ts b/extensions/podman/packages/api/src/podman-extension-api.d.ts new file mode 100644 index 0000000000000..977c81bee147e --- /dev/null +++ b/extensions/podman/packages/api/src/podman-extension-api.d.ts @@ -0,0 +1,23 @@ +/********************************************************************** + * Copyright (C) 2024 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type { RunOptions, RunResult } from '@podman-desktop/api'; + +export interface PodmanExtensionApi { + exec(args: string[], options?: RunOptions): Promise; +} diff --git a/extensions/podman/packages/api/tsconfig.json b/extensions/podman/packages/api/tsconfig.json new file mode 100644 index 0000000000000..d45add641fe54 --- /dev/null +++ b/extensions/podman/packages/api/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "node16", + "baseUrl": ".", + "types": [], + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*.d.ts"] +} diff --git a/extensions/podman/packages/api/vite.config.js b/extensions/podman/packages/api/vite.config.js new file mode 100644 index 0000000000000..a4712358d0940 --- /dev/null +++ b/extensions/podman/packages/api/vite.config.js @@ -0,0 +1,46 @@ +/********************************************************************** + * Copyright (C) 2024 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ +/* eslint-env node */ +import { join } from 'path'; +import { defineConfig } from 'vite'; + +const PACKAGE_ROOT = __dirname; + +// https://vitejs.dev/config/ +export default defineConfig({ + mode: process.env.MODE, + root: PACKAGE_ROOT, + resolve: { + alias: { + '/@/': join(PACKAGE_ROOT, 'src') + '/', + }, + }, + base: '', + server: { + fs: { + strict: true, + }, + }, + build: { + sourcemap: true, + outDir: 'dist', + assetsDir: '.', + emptyOutDir: true, + reportCompressedSize: false, + }, +}); From 51b9ed2f2a6b8a116ed3d77feef761e02bf198de Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Sun, 15 Sep 2024 20:01:59 -0700 Subject: [PATCH 2/7] feat: use podman extension api package in podman extension Signed-off-by: Denis Golovin --- extensions/podman/packages/api/package.json | 2 +- extensions/podman/packages/api/tsconfig.json | 2 +- extensions/podman/packages/extension/src/extension.ts | 11 ++++++++++- extensions/podman/packages/extension/vite.config.js | 7 ++++++- pnpm-lock.yaml | 6 ++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/extensions/podman/packages/api/package.json b/extensions/podman/packages/api/package.json index 50c14525b3b60..dd04528a2cdfc 100644 --- a/extensions/podman/packages/api/package.json +++ b/extensions/podman/packages/api/package.json @@ -18,6 +18,6 @@ "publish:next": "yarn publish --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version 0.0.1-\"$(date +%s)\"" }, "dependencies": { - "@podman-desktop/api": "^1.12.0" + "@podman-desktop/api": "workspace:*" } } diff --git a/extensions/podman/packages/api/tsconfig.json b/extensions/podman/packages/api/tsconfig.json index d45add641fe54..c36a79e4d1992 100644 --- a/extensions/podman/packages/api/tsconfig.json +++ b/extensions/podman/packages/api/tsconfig.json @@ -3,7 +3,7 @@ "target": "esnext", "module": "node16", "baseUrl": ".", - "types": [], + "types": ["node"], "strict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true diff --git a/extensions/podman/packages/extension/src/extension.ts b/extensions/podman/packages/extension/src/extension.ts index 4e0f16b1b5711..97054f94f909b 100644 --- a/extensions/podman/packages/extension/src/extension.ts +++ b/extensions/podman/packages/extension/src/extension.ts @@ -26,6 +26,7 @@ import type { ContainerEngineInfo, RunError } from '@podman-desktop/api'; import * as extensionApi from '@podman-desktop/api'; import { compareVersions } from 'compare-versions'; +import type { PodmanExtensionApi } from '../../api/src/podman-extension-api'; import { getSocketCompatibility } from './compatibility-mode'; import { getDetectionChecks } from './detection-checks'; import { KrunkitHelper } from './krunkit-helper'; @@ -1246,7 +1247,11 @@ export function registerOnboardingRemoveUnsupportedMachinesCommand(): extensionA }); } -export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { +async function exec(args: string[], options?: extensionApi.RunOptions): Promise { + return execPodman(args, 'podman', options); +} + +export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { initExtensionContext(extensionContext); initTelemetryLogger(); @@ -1658,6 +1663,10 @@ export async function activate(extensionContext: extensionApi.ExtensionContext): const podmanRemoteConnections = new PodmanRemoteConnections(extensionContext, provider); podmanRemoteConnections.start(); + + return { + exec, + }; } export async function calcPodmanMachineSetting(podmanConfiguration: PodmanConfiguration): Promise { diff --git a/extensions/podman/packages/extension/vite.config.js b/extensions/podman/packages/extension/vite.config.js index d24970ba182bf..ac3dffa7e6d71 100644 --- a/extensions/podman/packages/extension/vite.config.js +++ b/extensions/podman/packages/extension/vite.config.js @@ -45,7 +45,12 @@ const config = { formats: ['cjs'], }, rollupOptions: { - external: ['@podman-desktop/api', 'ssh2', ...builtinModules.flatMap(p => [p, `node:${p}`])], + external: [ + '@podman-desktop/api', + 'ssh2', + '@podman-desktop/podman-extension-api', + ...builtinModules.flatMap(p => [p, `node:${p}`]), + ], output: { entryFileNames: '[name].cjs', }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccbe71311ef44..c7ca978bbfe97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -439,6 +439,12 @@ importers: specifier: ^2.0.5 version: 2.0.5(@types/node@20.16.5)(jsdom@25.0.0)(terser@5.31.6) + extensions/podman/packages/api: + dependencies: + '@podman-desktop/api': + specifier: workspace:* + version: link:../../../../packages/extension-api + extensions/podman/packages/extension: dependencies: '@ltd/j-toml': From 849e64a9518bd502946e0877e4f5d17a5d97b05a Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Mon, 16 Sep 2024 18:14:59 -0700 Subject: [PATCH 3/7] fix: add unit test for activation function Signed-off-by: Denis Golovin --- .../packages/extension/src/extension.spec.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/extensions/podman/packages/extension/src/extension.spec.ts b/extensions/podman/packages/extension/src/extension.spec.ts index 318efa052968e..75cec02f834b3 100644 --- a/extensions/podman/packages/extension/src/extension.spec.ts +++ b/extensions/podman/packages/extension/src/extension.spec.ts @@ -37,6 +37,7 @@ import * as extension from './extension'; import type { InstalledPodman } from './podman-cli'; import * as podmanCli from './podman-cli'; import { PodmanConfiguration } from './podman-configuration'; +import type { UpdateCheck } from './podman-install'; import { PodmanInstall } from './podman-install'; import { getAssetsFolder, isLinux, isMac, isWindows, LIBKRUN_LABEL, LoggerDelegator, VMTYPE } from './util'; @@ -181,9 +182,24 @@ vi.mock('@podman-desktop/api', async () => { provider: { onDidRegisterContainerConnection: vi.fn(), onDidUnregisterContainerConnection: vi.fn(), + createProvider: (): extensionApi.Provider => + ({ + updateWarnings: vi.fn(), + onDidUpdateVersion: vi.fn(), + registerAutostart: vi.fn(), + }) as unknown as extensionApi.Provider, + }, + registry: { + registerRegistryProvider: vi.fn(), + onDidRegisterRegistry: vi.fn(), + onDidUnregisterRegistry: vi.fn(), + onDidUpdateRegistry: vi.fn(), }, proxy: { isEnabled: (): boolean => false, + onDidUpdateProxy: vi.fn(), + onDidStateChange: vi.fn(), + getProxySettings: vi.fn(), }, window: { showErrorMessage: vi.fn(), @@ -2285,3 +2301,21 @@ test('if a machine stopped is successfully reporting an error in telemetry', asy expect(spyExecPromise).toBeCalledWith(podmanCli.getPodmanCli(), ['machine', 'stop', 'name'], expect.anything()); }); + +test('activate function returns an api implementation', async () => { + vi.spyOn(PodmanInstall.prototype, 'checkForUpdate').mockResolvedValue({ + hasUpdate: false, + } as unknown as UpdateCheck); + const contextMock = { + subscriptions: [], + secrets: { + delete: vi.fn(), + get: vi.fn(), + onDidChange: vi.fn(), + store: vi.fn(), + }, + } as unknown as extensionApi.ExtensionContext; + const api = await extension.activate(contextMock); + expect(api).toBeDefined(); + expect(typeof api.exec).toBe('function'); +}); From 7729deeefc026a4f7a38010219ecfb99a44713c2 Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Tue, 17 Sep 2024 21:08:43 -0700 Subject: [PATCH 4/7] fix: review requested changes Signed-off-by: Denis Golovin --- extensions/podman/packages/api/package.json | 2 +- .../podman/packages/api/src/podman-extension-api.d.ts | 4 ++-- extensions/podman/packages/api/tsconfig.json | 1 + extensions/podman/packages/api/vite.config.js | 5 ----- extensions/podman/packages/extension/src/extension.ts | 8 ++++++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extensions/podman/packages/api/package.json b/extensions/podman/packages/api/package.json index dd04528a2cdfc..191730f113f76 100644 --- a/extensions/podman/packages/api/package.json +++ b/extensions/podman/packages/api/package.json @@ -15,7 +15,7 @@ "clean": "rimraf lib *.tsbuildinfo", "build": "", "watch": "", - "publish:next": "yarn publish --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version 0.0.1-\"$(date +%s)\"" + "publish:next": "pnpm publish --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version 0.0.1-\"$(date +%s)\"" }, "dependencies": { "@podman-desktop/api": "workspace:*" diff --git a/extensions/podman/packages/api/src/podman-extension-api.d.ts b/extensions/podman/packages/api/src/podman-extension-api.d.ts index 977c81bee147e..d43109a827345 100644 --- a/extensions/podman/packages/api/src/podman-extension-api.d.ts +++ b/extensions/podman/packages/api/src/podman-extension-api.d.ts @@ -16,8 +16,8 @@ * SPDX-License-Identifier: Apache-2.0 ***********************************************************************/ -import type { RunOptions, RunResult } from '@podman-desktop/api'; +import type { ProviderContainerConnection, RunOptions, RunResult } from '@podman-desktop/api'; export interface PodmanExtensionApi { - exec(args: string[], options?: RunOptions): Promise; + exec(args: string[], connection?: ProviderContainerConnection, options?: RunOptions): Promise; } diff --git a/extensions/podman/packages/api/tsconfig.json b/extensions/podman/packages/api/tsconfig.json index c36a79e4d1992..a4dba5465050c 100644 --- a/extensions/podman/packages/api/tsconfig.json +++ b/extensions/podman/packages/api/tsconfig.json @@ -1,4 +1,5 @@ { + "extends": "@tsconfig/strictest/tsconfig.json", "compilerOptions": { "target": "esnext", "module": "node16", diff --git a/extensions/podman/packages/api/vite.config.js b/extensions/podman/packages/api/vite.config.js index a4712358d0940..f81f937ac871d 100644 --- a/extensions/podman/packages/api/vite.config.js +++ b/extensions/podman/packages/api/vite.config.js @@ -25,11 +25,6 @@ const PACKAGE_ROOT = __dirname; export default defineConfig({ mode: process.env.MODE, root: PACKAGE_ROOT, - resolve: { - alias: { - '/@/': join(PACKAGE_ROOT, 'src') + '/', - }, - }, base: '', server: { fs: { diff --git a/extensions/podman/packages/extension/src/extension.ts b/extensions/podman/packages/extension/src/extension.ts index 97054f94f909b..bfe1c09155e23 100644 --- a/extensions/podman/packages/extension/src/extension.ts +++ b/extensions/podman/packages/extension/src/extension.ts @@ -1247,8 +1247,12 @@ export function registerOnboardingRemoveUnsupportedMachinesCommand(): extensionA }); } -async function exec(args: string[], options?: extensionApi.RunOptions): Promise { - return execPodman(args, 'podman', options); +async function exec( + args: string[], + connection?: extensionApi.ProviderContainerConnection, + options?: extensionApi.RunOptions, +): Promise { + return execPodman(args, connection?.connection.vmTypeDisplayName, options); } export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { From 271cf3b540693187e77f7d1f509a388ca68e3645 Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Thu, 19 Sep 2024 17:44:38 -0700 Subject: [PATCH 5/7] Update extensions/podman/packages/api/src/podman-extension-api.d.ts Co-authored-by: axel7083 <42176370+axel7083@users.noreply.github.com> Signed-off-by: Denis Golovin --- extensions/podman/packages/api/src/podman-extension-api.d.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/podman/packages/api/src/podman-extension-api.d.ts b/extensions/podman/packages/api/src/podman-extension-api.d.ts index d43109a827345..297ca1a975061 100644 --- a/extensions/podman/packages/api/src/podman-extension-api.d.ts +++ b/extensions/podman/packages/api/src/podman-extension-api.d.ts @@ -17,7 +17,10 @@ ***********************************************************************/ import type { ProviderContainerConnection, RunOptions, RunResult } from '@podman-desktop/api'; +export interface PodmanRunOptions extends RunOptions { + connection?: ProviderContainerConnection; +} export interface PodmanExtensionApi { - exec(args: string[], connection?: ProviderContainerConnection, options?: RunOptions): Promise; + exec(args: string[], options?: PodmanRunOptions): Promise; } From 52090e27a3a4f83fcf616069da962ea55fbedfe7 Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Thu, 19 Sep 2024 18:15:15 -0700 Subject: [PATCH 6/7] fix: switch to use PodmanRunOptions in Podman Extesion API Signed-off-by: Denis Golovin --- .../podman/packages/api/src/podman-extension-api.d.ts | 1 + extensions/podman/packages/extension/src/extension.ts | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/extensions/podman/packages/api/src/podman-extension-api.d.ts b/extensions/podman/packages/api/src/podman-extension-api.d.ts index 297ca1a975061..7e3acb95c1f7e 100644 --- a/extensions/podman/packages/api/src/podman-extension-api.d.ts +++ b/extensions/podman/packages/api/src/podman-extension-api.d.ts @@ -17,6 +17,7 @@ ***********************************************************************/ import type { ProviderContainerConnection, RunOptions, RunResult } from '@podman-desktop/api'; + export interface PodmanRunOptions extends RunOptions { connection?: ProviderContainerConnection; } diff --git a/extensions/podman/packages/extension/src/extension.ts b/extensions/podman/packages/extension/src/extension.ts index bfe1c09155e23..772c596454214 100644 --- a/extensions/podman/packages/extension/src/extension.ts +++ b/extensions/podman/packages/extension/src/extension.ts @@ -1247,12 +1247,8 @@ export function registerOnboardingRemoveUnsupportedMachinesCommand(): extensionA }); } -async function exec( - args: string[], - connection?: extensionApi.ProviderContainerConnection, - options?: extensionApi.RunOptions, -): Promise { - return execPodman(args, connection?.connection.vmTypeDisplayName, options); +async function exec(args: string[], options?: PodmanRunOptions): Promise { + return execPodman(args, options?.connection?.connection.vmTypeDisplayName, options); } export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { From 31f1bb5017144a2bc93bb256aff8e6bdb6efefd2 Mon Sep 17 00:00:00 2001 From: Denis Golovin Date: Thu, 19 Sep 2024 18:27:53 -0700 Subject: [PATCH 7/7] fix: typecheck error Signed-off-by: Denis Golovin --- extensions/podman/packages/extension/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/podman/packages/extension/src/extension.ts b/extensions/podman/packages/extension/src/extension.ts index 772c596454214..1f91ce010fd34 100644 --- a/extensions/podman/packages/extension/src/extension.ts +++ b/extensions/podman/packages/extension/src/extension.ts @@ -26,7 +26,7 @@ import type { ContainerEngineInfo, RunError } from '@podman-desktop/api'; import * as extensionApi from '@podman-desktop/api'; import { compareVersions } from 'compare-versions'; -import type { PodmanExtensionApi } from '../../api/src/podman-extension-api'; +import type { PodmanExtensionApi, PodmanRunOptions } from '../../api/src/podman-extension-api'; import { getSocketCompatibility } from './compatibility-mode'; import { getDetectionChecks } from './detection-checks'; import { KrunkitHelper } from './krunkit-helper';