Skip to content

Commit d4ecf97

Browse files
committed
fix: call podman CLI API with connection parameter
Fix podman-desktop/podman-desktop#9860. Signed-off-by: Denis Golovin <[email protected]>
1 parent e601b4c commit d4ecf97

File tree

3 files changed

+109
-64
lines changed

3 files changed

+109
-64
lines changed

src/extension.ts

+23-21
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ async function createOrReuseRegistryServiceAccount(): Promise<void> {
133133
);
134134
}
135135

136-
async function createOrReuseActivationKey(machineName: string): Promise<void> {
136+
async function createOrReuseActivationKey(connection: extensionApi.ProviderContainerConnection): Promise<void> {
137137
const currentSession = await signIntoRedHatDeveloperAccount();
138138
const accessTokenJson = parseJwt(currentSession!.accessToken);
139139
const client = new SubscriptionManagerClient({
@@ -155,7 +155,7 @@ async function createOrReuseActivationKey(machineName: string): Promise<void> {
155155
});
156156
}
157157

158-
await runSubscriptionManagerRegister(machineName, 'podman-desktop', accessTokenJson.organization.id);
158+
await runSubscriptionManagerRegister(connection, 'podman-desktop', accessTokenJson.organization.id);
159159
}
160160

161161
async function isSimpleContentAccessEnabled(): Promise<boolean> {
@@ -165,33 +165,35 @@ async function isSimpleContentAccessEnabled(): Promise<boolean> {
165165
TOKEN: currentSession!.accessToken,
166166
});
167167
const response = await client.organization.checkOrgScaCapability();
168-
return response.body && response.body.simpleContentAccess === 'enabled';
168+
return !!response.body && response.body.simpleContentAccess === 'enabled';
169169
}
170170

171-
async function isSubscriptionManagerInstalled(machineName: string): Promise<boolean> {
172-
const exitCode = await runSubscriptionManager(machineName);
171+
async function isSubscriptionManagerInstalled(connection: extensionApi.ProviderContainerConnection): Promise<boolean> {
172+
const exitCode = await runSubscriptionManager(connection);
173173
return exitCode === 0;
174174
}
175175

176-
async function installSubscriptionManger(machineName: string): Promise<extensionApi.RunResult> {
176+
async function installSubscriptionManger(
177+
connection: extensionApi.ProviderContainerConnection,
178+
): Promise<extensionApi.RunResult | undefined> {
177179
try {
178-
return await runRpmInstallSubscriptionManager(machineName);
180+
return await runRpmInstallSubscriptionManager(connection);
179181
} catch (err) {
180182
console.error(`Subscription manager installation failed. ${String(err)}`);
181183
TelemetryLogger.logError('subscriptionManagerInstallationError', { error: String(err) });
182184
throw err;
183185
}
184186
}
185187

186-
async function isPodmanVmSubscriptionActivated(machineName: string): Promise<boolean> {
187-
const exitCode = await runSubscriptionManagerActivationStatus(machineName);
188+
async function isPodmanVmSubscriptionActivated(connection: extensionApi.ProviderContainerConnection): Promise<boolean> {
189+
const exitCode = await runSubscriptionManagerActivationStatus(connection);
188190
return exitCode === 0;
189191
}
190192

191193
async function removeSession(sessionId: string): Promise<void> {
192-
const machineName = getRunningPodmanMachineName();
193-
if (machineName) {
194-
runSubscriptionManagerUnregister(machineName).catch(console.error); // ignore error in case vm subscription activation failed on login
194+
const connection = getRunningPodmanMachineName();
195+
if (connection) {
196+
runSubscriptionManagerUnregister(connection).catch(console.error); // ignore error in case vm subscription activation failed on login
195197
}
196198
removeRegistry(); // never fails, even if registry does not exist
197199
const service = await getAuthenticationService();
@@ -253,8 +255,8 @@ async function configureRegistryAndActivateSubscription(): Promise<void> {
253255
title: 'Activating Red Hat Subscription',
254256
},
255257
async () => {
256-
const podmanRunningMachineName = getRunningPodmanMachineName();
257-
if (!podmanRunningMachineName) {
258+
const runningConnection = getRunningPodmanMachineName();
259+
if (!runningConnection) {
258260
if (isLinux()) {
259261
await extensionApi.window.showInformationMessage(
260262
'Signing into a Red Hat account requires a running Podman machine, and is currently not supported on a Linux host. Please start a Podman machine and try again.',
@@ -278,17 +280,17 @@ async function configureRegistryAndActivateSubscription(): Promise<void> {
278280
}
279281
throw new Error('SCA is not enabled and message closed');
280282
}
281-
if (!(await isSubscriptionManagerInstalled(podmanRunningMachineName))) {
282-
await installSubscriptionManger(podmanRunningMachineName);
283-
await runStopPodmanMachine(podmanRunningMachineName);
284-
await runStartPodmanMachine(podmanRunningMachineName);
283+
if (!(await isSubscriptionManagerInstalled(runningConnection))) {
284+
await installSubscriptionManger(runningConnection);
285+
await runStopPodmanMachine(runningConnection);
286+
await runStartPodmanMachine(runningConnection);
285287
}
286-
if (!(await isPodmanVmSubscriptionActivated(podmanRunningMachineName))) {
288+
if (!(await isPodmanVmSubscriptionActivated(runningConnection))) {
287289
const facts = {
288290
supported_architectures: 'aarch64,x86_64',
289291
};
290-
await runCreateFactsFile(podmanRunningMachineName, JSON.stringify(facts, undefined, 2));
291-
await createOrReuseActivationKey(podmanRunningMachineName);
292+
await runCreateFactsFile(runningConnection, JSON.stringify(facts, undefined, 2));
293+
await createOrReuseActivationKey(runningConnection);
292294
}
293295
}
294296
},

src/podman-cli.spec.ts

+31-20
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/* eslint-disable @typescript-eslint/no-explicit-any */
1919
/* eslint-disable @typescript-eslint/explicit-function-return-type */
2020

21-
import type { Extension } from '@podman-desktop/api';
21+
import type { Extension, ProviderContainerConnection } from '@podman-desktop/api';
2222
import { extensions } from '@podman-desktop/api';
2323
import type { PodmanExtensionApi } from '@podman-desktop/podman-extension-api';
2424
import { beforeEach, expect, test, vi } from 'vitest';
@@ -59,9 +59,18 @@ beforeEach(() => {
5959
);
6060
});
6161

62+
const connectionName = 'machine1';
63+
64+
const connection = {
65+
connection: {
66+
name: connectionName,
67+
},
68+
providerId: 'id1',
69+
} as ProviderContainerConnection;
70+
6271
test('runSubscriptionManager returns 0 when it is installed', async () => {
6372
execMock.mockResolvedValue(runResult);
64-
const result = await runSubscriptionManager('machine1');
73+
const result = await runSubscriptionManager(connection);
6574
expect(result).toBe(0);
6675
});
6776

@@ -72,15 +81,15 @@ test('runSubscriptionManager returns 1 when it is not installed', async () => {
7281
stderr: 'stderr output',
7382
toString: () => 'error message',
7483
});
75-
const result = await runSubscriptionManager('machine1');
84+
const result = await runSubscriptionManager(connection);
7685
expect(result).toBe(1);
7786
});
7887

7988
test('runRpmInstallSubscription manager returns 0 when successful', async () => {
8089
execMock.mockResolvedValue(runResult);
81-
const result = await runRpmInstallSubscriptionManager('machine1');
90+
const result = await runRpmInstallSubscriptionManager(connection);
8291
expect(result).toBe(runResult);
83-
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.rpmInstallSm('machine1'));
92+
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.rpmInstallSm(connectionName), { connection });
8493
});
8594

8695
test('runRpmInstallSubscription manager returns none 0 error code when failed and send telemetry', async () => {
@@ -90,7 +99,7 @@ test('runRpmInstallSubscription manager returns none 0 error code when failed an
9099
});
91100
const consoleError = vi.spyOn(console, 'error');
92101
let error: unknown;
93-
await runRpmInstallSubscriptionManager('machine1').catch((err: unknown) => {
102+
await runRpmInstallSubscriptionManager(connection).catch((err: unknown) => {
94103
error = err;
95104
});
96105
expect(String(error)).toBe(String(runError));
@@ -105,7 +114,7 @@ test('runRpmInstallSubscription manager returns none 0 error code when failed an
105114

106115
test('runSubscriptionManagerActivationStatus returns 0 when it has subscription activated', async () => {
107116
execMock.mockResolvedValue(runResult);
108-
const result = await runSubscriptionManagerActivationStatus('machine1');
117+
const result = await runSubscriptionManagerActivationStatus(connection);
109118
expect(result).toBe(0);
110119
});
111120

@@ -116,15 +125,17 @@ test('runSubscriptionManagerActivationStatus returns 1 when it has no active sub
116125
stderr: 'stderr output',
117126
toString: () => 'error message',
118127
});
119-
const result = await runSubscriptionManagerActivationStatus('machine1');
128+
const result = await runSubscriptionManagerActivationStatus(connection);
120129
expect(result).toBe(1);
121130
});
122131

123132
test('runSubscriptionManagerRegister returns 0 when successful', async () => {
124133
execMock.mockResolvedValue(runResult);
125-
const result = await runSubscriptionManagerRegister('machine1', 'activation-key-name', 'orgId');
134+
const result = await runSubscriptionManagerRegister(connection, 'activation-key-name', 'orgId');
126135
expect(result).toBe(runResult);
127-
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.smActivateSubs('machine1', 'activation-key-name', 'orgId'));
136+
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.smActivateSubs('machine1', 'activation-key-name', 'orgId'), {
137+
connection,
138+
});
128139
});
129140

130141
test('runSubscriptionManagerRegister manager returns none 0 error code when failed and send telemetry', async () => {
@@ -134,7 +145,7 @@ test('runSubscriptionManagerRegister manager returns none 0 error code when fail
134145
});
135146
const consoleError = vi.spyOn(console, 'error');
136147
let error: unknown;
137-
await runSubscriptionManagerRegister('machine1', 'activation-key-name', 'orgId').catch((err: unknown) => {
148+
await runSubscriptionManagerRegister(connection, 'activation-key-name', 'orgId').catch((err: unknown) => {
138149
error = err;
139150
});
140151
expect(String(error)).toBe(String(runError));
@@ -149,9 +160,9 @@ test('runSubscriptionManagerRegister manager returns none 0 error code when fail
149160

150161
test('runCreateFactsFile returns 0 when successful', async () => {
151162
execMock.mockResolvedValue(runResult);
152-
const result = await runCreateFactsFile('machine1', '{"field":"value"}');
163+
const result = await runCreateFactsFile(connection, '{"field":"value"}');
153164
expect(result).toBe(runResult);
154-
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.createFactFile('machine1', '{"field":"value"}'));
165+
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.createFactFile(connectionName, '{"field":"value"}'), { connection });
155166
});
156167

157168
test('runCreateFactsFile manager returns none 0 error code when failed and send telemetry', async () => {
@@ -161,7 +172,7 @@ test('runCreateFactsFile manager returns none 0 error code when failed and send
161172
});
162173
const consoleError = vi.spyOn(console, 'error');
163174
let error: unknown;
164-
await runCreateFactsFile('machine1', '{"field":"value"}').catch((err: unknown) => {
175+
await runCreateFactsFile(connection, '{"field":"value"}').catch((err: unknown) => {
165176
error = err;
166177
});
167178
expect(String(error)).toBe(String(runError));
@@ -176,9 +187,9 @@ test('runCreateFactsFile manager returns none 0 error code when failed and send
176187

177188
test('runStopPodmanMachine returns 0 when successful', async () => {
178189
execMock.mockResolvedValue(runResult);
179-
const result = await runStopPodmanMachine('machine1');
190+
const result = await runStopPodmanMachine(connection);
180191
expect(result).toBe(runResult);
181-
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.machineStop('machine1'));
192+
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.machineStop(connectionName), { connection });
182193
});
183194

184195
test('runStopPodmanMachine manager returns none 0 error code when failed and send telemetry', async () => {
@@ -187,7 +198,7 @@ test('runStopPodmanMachine manager returns none 0 error code when failed and sen
187198
const consoleError = vi.spyOn(console, 'error');
188199

189200
let error: unknown;
190-
await runStopPodmanMachine('machine1').catch((err: unknown) => {
201+
await runStopPodmanMachine(connection).catch((err: unknown) => {
191202
error = err;
192203
});
193204
expect(String(error)).toBe(String(runError));
@@ -202,9 +213,9 @@ test('runStopPodmanMachine manager returns none 0 error code when failed and sen
202213

203214
test('runStartPodmanMachine returns 0 when successful', async () => {
204215
execMock.mockResolvedValue(runResult);
205-
const result = await runStartPodmanMachine('machine1');
216+
const result = await runStartPodmanMachine(connection);
206217
expect(result).toBe(runResult);
207-
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.machineStart('machine1'));
218+
expect(execMock).toBeCalledWith(PODMAN_COMMANDS.machineStart(connectionName), { connection });
208219
});
209220

210221
test('runStartPodmanMachine manager returns none 0 error code when failed and send telemetry', async () => {
@@ -214,7 +225,7 @@ test('runStartPodmanMachine manager returns none 0 error code when failed and se
214225
});
215226
const consoleError = vi.spyOn(console, 'error');
216227
let error: unknown;
217-
await runStartPodmanMachine('machine1').catch((err: unknown) => {
228+
await runStartPodmanMachine(connection).catch((err: unknown) => {
218229
error = err;
219230
});
220231
expect(String(error)).toBe(String(runError));

0 commit comments

Comments
 (0)