Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: remove podman CLI impl copy and use podman ext API #182

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@
"test:e2e:setup": "xvfb-maybe --auto-servernum --server-args='-screen 0 1280x960x24' --",
"test:e2e": "cross-env E2E_TESTS=true npm run test:e2e:setup vitest run tests/src/ --pool=threads --poolOptions.threads.singleThread --poolOptions.threads.isolate --no-file-parallelism"
},
"dependencies": {
"@podman-desktop/api": "^1.11.1",
"dependencies":
"@podman-desktop/api": "^1.12.0",
"@podman-desktop/podman-extension-api" : "^1.12.0",
"@redhat-developer/rhcra-client": "^0.0.1",
"@redhat-developer/rhsm-client": "^0.0.4",
"axios": "^1.7.2",
Expand Down Expand Up @@ -84,5 +85,8 @@
"vitest": "^2.0.2",
"xvfb-maybe": "^0.2.1",
"zip-local": "^0.3.5"
}
},
"extensionDependencies": [
"podman-desktop.podman"
]
}
75 changes: 21 additions & 54 deletions src/podman-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,10 @@
*
* SPDX-License-Identifier: Apache-2.0
***********************************************************************/
import type { RunError, RunResult } from '@podman-desktop/api';
import { configuration, process as podmanProcess, provider } from '@podman-desktop/api';

import { RunError, RunResult, extensions } from '@podman-desktop/api';
import { provider } from '@podman-desktop/api';
import type { PodmanExtensionApi } from '@podman-desktop/podman-extension-api';
import { ExtensionTelemetryLogger } from './telemetry';
import { isMac, isWindows } from './util';

const macosExtraPath = '/usr/local/bin:/opt/homebrew/bin:/opt/local/bin:/opt/podman/bin';

export const PODMAN_COMMANDS = {
SM_VERSION: (machineName: string): string[] => `machine ssh ${machineName} sudo subscription-manager`.split(' '),
Expand All @@ -45,51 +42,21 @@ export const PODMAN_COMMANDS = {
],
};

export function getInstallationPath(): string | undefined {
const env = process.env;
if (isWindows()) {
return `c:\\Program Files\\RedHat\\Podman;${env.PATH}`;
} else if (isMac()) {
if (!env.PATH) {
return macosExtraPath;
} else {
return env.PATH.concat(':').concat(macosExtraPath);
}
} else {
return env.PATH;
}
}

export function getPodmanCli(): string {
// If we have a custom binary path regardless if we are running Windows or not
const customBinaryPath = getCustomBinaryPath();
if (customBinaryPath) {
return customBinaryPath;
}

if (isWindows()) {
return 'podman.exe';
}
return 'podman';
}

// Get the Podman binary path from configuration podman.binary.path
// return string or undefined
export function getCustomBinaryPath(): string | undefined {
return configuration.getConfiguration('podman').get('binary.path');
}

export interface InstalledPodman {
version: string;
}
const podmanApiDummy = {
exec: () => {
throw Error('Podman extension API is not available.');
},
};
const podmanExports = extensions.getExtension<PodmanExtensionApi>('podman-desktop.podman')?.exports;
const podmanApi = podmanExports ? podmanExports : podmanApiDummy;

type ErrorHandler<T> = (commandName: string, error: unknown) => T;
type TelemetryErrorHandler<T> = (commandName: string, telemetryEventName: string, error: unknown) => T;

async function runCommand(commandName: string, command: string[], errorHandler: ErrorHandler<number>): Promise<number> {
try {
console.log(`Executing: ${getPodmanCli()} ${command.join(' ')}`);
return await podmanProcess.exec(getPodmanCli(), command).then(() => 0);
console.log(`Executing podman command: ${command.join(' ')}`);
return await podmanApi.exec(command).then(() => 0);
} catch (err) {
return errorHandler(commandName, err);
}
Expand All @@ -100,10 +67,10 @@ async function runCommandAndSendTelemetry(
telemetryEventName: string,
command: string[],
errorHandler: TelemetryErrorHandler<void>,
): Promise<RunResult> {
): Promise<RunResult | undefined> {
try {
console.log(`Executing: ${getPodmanCli()} ${command.join(' ')}`);
return await podmanProcess.exec(getPodmanCli(), command);
console.log(`Executing podman command: ${command.join(' ')}`);
return await podmanApi.exec(command);
} catch (err) {
errorHandler(commandName, telemetryEventName, err);
}
Expand All @@ -126,7 +93,7 @@ export async function runSubscriptionManager(machineName: string): Promise<numbe
return runCommand('Subscription manager execution', PODMAN_COMMANDS.SM_VERSION(machineName), errToExitCodeHandler);
}

export async function runRpmInstallSubscriptionManager(machineName: string): Promise<RunResult> {
export async function runRpmInstallSubscriptionManager(machineName: string): Promise<RunResult | undefined> {
return runCommandAndSendTelemetry(
'Subscription manager installation',
'subscriptionManagerInstallationError',
Expand All @@ -147,7 +114,7 @@ export async function runSubscriptionManagerRegister(
machineName: string,
activationKeyName: string,
orgId: string,
): Promise<RunResult> {
): Promise<RunResult | undefined> {
return runCommandAndSendTelemetry(
'Subscription manager registration',
'subscriptionManagerRegisterError',
Expand All @@ -156,7 +123,7 @@ export async function runSubscriptionManagerRegister(
);
}

export async function runSubscriptionManagerUnregister(machineName: string): Promise<RunResult> {
export async function runSubscriptionManagerUnregister(machineName: string): Promise<RunResult | undefined> {
return runCommandAndSendTelemetry(
'Subscription manager unregister',
'subscriptionManagerUnregisterError',
Expand All @@ -165,7 +132,7 @@ export async function runSubscriptionManagerUnregister(machineName: string): Pro
);
}

export async function runCreateFactsFile(machineName: string, jsonText: string): Promise<RunResult> {
export async function runCreateFactsFile(machineName: string, jsonText: string): Promise<RunResult | undefined> {
return runCommandAndSendTelemetry(
'Writing /etc/rhsm/facts/podman-desktop-redhat-account-ext.facts',
'subscriptionManagerCreateFactsFileError',
Expand All @@ -174,7 +141,7 @@ export async function runCreateFactsFile(machineName: string, jsonText: string):
);
}

export async function runStopPodmanMachine(machineName: string): Promise<RunResult> {
export async function runStopPodmanMachine(machineName: string): Promise<RunResult | undefined> {
return runCommandAndSendTelemetry(
'Podman machine stop',
'stopPodmanMachineError',
Expand All @@ -183,7 +150,7 @@ export async function runStopPodmanMachine(machineName: string): Promise<RunResu
);
}

export async function runStartPodmanMachine(machineName): Promise<RunResult> {
export async function runStartPodmanMachine(machineName: string): Promise<RunResult | undefined> {
return runCommandAndSendTelemetry(
'Podman machine start',
'startPodmanMachineError',
Expand Down
Loading