Skip to content

Commit 7135466

Browse files
committed
feat: register RHEL VM at startup
1 parent 40e80b9 commit 7135466

File tree

6 files changed

+262
-17
lines changed

6 files changed

+262
-17
lines changed

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@
4545
"description": "Image Path",
4646
"when": "rhel-vms.localImage"
4747
},
48+
"rhel-vms.factory.machine.register": {
49+
"type": "boolean",
50+
"scope": "VmProviderConnectionFactory",
51+
"default": true,
52+
"description": "Register machine via subscription-manager"
53+
},
4854
"rhel-vms.factory.machine.cpus": {
4955
"type": "number",
5056
"format": "cpu",
@@ -102,7 +108,7 @@
102108
"test:e2e": "cd tests/playwright && npm run test:e2e"
103109
},
104110
"dependencies": {
105-
"@crc-org/macadam.js": "0.0.1-202505091308-41f281b",
111+
"@crc-org/macadam.js": "0.0.1-202506241253-f373979",
106112
"@podman-desktop/api": "1.19.2",
107113
"compare-versions": "^6.1.1",
108114
"openapi-fetch": "^0.14.0",

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/extension.spec.ts

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { resolve } from 'node:path';
2020
import * as macadamJSPackage from '@crc-org/macadam.js';
2121
import * as extensionApi from '@podman-desktop/api';
2222
import { vol } from 'memfs';
23-
import { assert, beforeEach, describe, expect, test, vi } from 'vitest';
23+
import { afterEach, assert, beforeEach, describe, expect, test, vi } from 'vitest';
2424

2525
import * as authentication from './authentication';
2626
import { ImageCache } from './cache';
@@ -48,6 +48,7 @@ vi.mock('@crc-org/macadam.js', async () => {
4848
Macadam.prototype.startVm = vi.fn();
4949
Macadam.prototype.stopVm = vi.fn();
5050
Macadam.prototype.removeVm = vi.fn();
51+
Macadam.prototype.executeCommand = vi.fn();
5152
return { Macadam };
5253
});
5354
vi.mock('./macadam-machine-stream.js', async () => {
@@ -137,6 +138,7 @@ describe('activate', () => {
137138
);
138139
await create({
139140
'rhel-vms.factory.machine.image': 'RHEL 10',
141+
'rhel-vms.factory.machine.register': false,
140142
});
141143
expect(utils.pullImageFromRedHatRegistry).toHaveBeenCalled();
142144
});
@@ -148,6 +150,7 @@ describe('activate', () => {
148150
await create({
149151
'rhel-vms.factory.machine.image': 'RHEL 10',
150152
'rhel-vms.factory.machine.force-download': true,
153+
'rhel-vms.factory.machine.register': false,
151154
});
152155
vol.fromJSON({
153156
'/path/to/storage/images/rhel10': '',
@@ -165,6 +168,7 @@ describe('activate', () => {
165168
});
166169
await create({
167170
'rhel-vms.factory.machine.image': 'RHEL 10',
171+
'rhel-vms.factory.machine.register': false,
168172
});
169173
expect(utils.pullImageFromRedHatRegistry).not.toHaveBeenCalled();
170174
});
@@ -176,6 +180,7 @@ describe('activate', () => {
176180
await create({
177181
'rhel-vms.factory.machine.name': 'name1',
178182
'rhel-vms.factory.machine.image': 'RHEL 10',
183+
'rhel-vms.factory.machine.register': false,
179184
});
180185
expect(macadamJSPackage.Macadam.prototype.createVm).toHaveBeenCalledWith({
181186
containerProvider: 'applehv',
@@ -191,6 +196,7 @@ describe('activate', () => {
191196
'rhel-vms.factory.machine.image': 'local image on disk',
192197
'rhel-vms.factory.machine.name': 'name1',
193198
'rhel-vms.factory.machine.image-path': resolve('/', 'path', 'to', 'provided', 'image'),
199+
'rhel-vms.factory.machine.register': false,
194200
});
195201
expect(macadamJSPackage.Macadam.prototype.createVm).toHaveBeenCalledWith({
196202
containerProvider: 'applehv',
@@ -221,6 +227,7 @@ describe('activate', () => {
221227
);
222228
await create({
223229
'rhel-vms.factory.machine.image': 'RHEL 10',
230+
'rhel-vms.factory.machine.register': false,
224231
});
225232
expect(utils.pullImageFromRedHatRegistry).toHaveBeenCalled();
226233
});
@@ -234,6 +241,7 @@ describe('activate', () => {
234241
});
235242
await create({
236243
'rhel-vms.factory.machine.image': 'RHEL 10',
244+
'rhel-vms.factory.machine.register': false,
237245
});
238246
expect(utils.pullImageFromRedHatRegistry).not.toHaveBeenCalled();
239247
});
@@ -245,6 +253,7 @@ describe('activate', () => {
245253
await create({
246254
'rhel-vms.factory.machine.name': 'name1',
247255
'rhel-vms.factory.machine.image': 'RHEL 10',
256+
'rhel-vms.factory.machine.register': false,
248257
});
249258
expect(macadamJSPackage.Macadam.prototype.createVm).toHaveBeenCalledWith({
250259
containerProvider: 'wsl',
@@ -260,6 +269,7 @@ describe('activate', () => {
260269
'rhel-vms.factory.machine.image': 'local image on disk',
261270
'rhel-vms.factory.machine.name': 'name1',
262271
'rhel-vms.factory.machine.image-path': resolve('/', 'path', 'to', 'provided', 'image'),
272+
'rhel-vms.factory.machine.register': false,
263273
});
264274
expect(macadamJSPackage.Macadam.prototype.createVm).toHaveBeenCalledWith({
265275
containerProvider: 'wsl',
@@ -288,6 +298,7 @@ describe('activate', () => {
288298
await expect(
289299
create({
290300
'rhel-vms.factory.machine.image': 'RHEL 10',
301+
'rhel-vms.factory.machine.register': false,
291302
}),
292303
).rejects.toThrowError('provider hyperv is not supported');
293304
});
@@ -304,6 +315,7 @@ describe('activate', () => {
304315
await expect(
305316
create({
306317
'rhel-vms.factory.machine.image': 'RHEL 10',
318+
'rhel-vms.factory.machine.register': false,
307319
}),
308320
).rejects.toThrowError('an init error');
309321
});
@@ -517,3 +529,104 @@ bla bla
517529
});
518530
});
519531
});
532+
533+
describe('register', () => {
534+
let create: (
535+
params: {
536+
[key: string]: unknown;
537+
},
538+
logger?: extensionApi.Logger,
539+
token?: extensionApi.CancellationToken,
540+
) => Promise<void>;
541+
542+
const extensionContext: extensionApi.ExtensionContext = {
543+
subscriptions: {
544+
push: vi.fn(),
545+
},
546+
storagePath: resolve('/', 'path', 'to', 'storage'),
547+
} as unknown as extensionApi.ExtensionContext;
548+
549+
const provider: extensionApi.Provider = {
550+
setVmProviderConnectionFactory: vi.fn(),
551+
registerVmProviderConnection: vi.fn(),
552+
updateStatus: vi.fn(),
553+
} as unknown as extensionApi.Provider;
554+
555+
const authClient: SubscriptionManagerClientV1 = {
556+
images: {
557+
downloadImageUsingSha: vi.fn(),
558+
},
559+
} as unknown as SubscriptionManagerClientV1;
560+
561+
beforeEach(async () => {
562+
vi.useFakeTimers();
563+
vi.mocked(extensionApi.provider.createProvider).mockReturnValue(provider);
564+
565+
vi.mocked(extensionApi.env).isMac = true;
566+
vi.mocked(extensionApi.env).isWindows = false;
567+
vi.mocked(authentication.initAuthentication).mockResolvedValue(authClient);
568+
569+
await activate(extensionContext);
570+
expect(provider.setVmProviderConnectionFactory).toHaveBeenCalledOnce();
571+
const call = vi.mocked(provider.setVmProviderConnectionFactory).mock.calls[0];
572+
assert(!!call[0].create);
573+
create = call[0].create;
574+
});
575+
576+
afterEach(() => {
577+
vi.useRealTimers();
578+
});
579+
580+
test('register is true and machine is started and registered', async () => {
581+
const authClient: SubscriptionManagerClientV1 = {
582+
getOrganizationId: vi.fn().mockReturnValue('123456'),
583+
} as unknown as SubscriptionManagerClientV1;
584+
vi.mocked(authentication.initAuthentication).mockResolvedValue(authClient);
585+
vi.mocked(macadamJSPackage.Macadam.prototype.listVms).mockResolvedValue([
586+
{
587+
Name: 'name1',
588+
Image: '/path/to/image1',
589+
CPUs: 1,
590+
Memory: '1GB',
591+
DiskSize: '1GB',
592+
Running: true,
593+
Starting: true,
594+
Port: 80,
595+
RemoteUsername: 'user',
596+
IdentityPath: '/path/to/id1',
597+
VMType: 'applehv',
598+
},
599+
]);
600+
vi.mocked(macadamJSPackage.Macadam.prototype.executeCommand).mockResolvedValue({
601+
stdout: 'done',
602+
} as extensionApi.RunResult);
603+
const createPromise = create({
604+
'rhel-vms.factory.machine.name': 'name1',
605+
'rhel-vms.factory.machine.image': 'RHEL 10',
606+
'rhel-vms.factory.machine.register': true,
607+
});
608+
vi.mocked(macadamJSPackage.Macadam.prototype.listVms).mockResolvedValue([
609+
{
610+
Name: 'name1',
611+
Image: '/path/to/image1',
612+
CPUs: 1,
613+
Memory: '1GB',
614+
DiskSize: '1GB',
615+
Running: true,
616+
Starting: false,
617+
Port: 80,
618+
RemoteUsername: 'user',
619+
IdentityPath: '/path/to/id1',
620+
VMType: 'applehv',
621+
},
622+
]);
623+
vi.advanceTimersToNextTimer();
624+
await createPromise;
625+
expect(macadamJSPackage.Macadam.prototype.executeCommand).toHaveBeenCalledWith({
626+
name: 'name1',
627+
command: 'sudo',
628+
args: ['subscription-manager', 'register', '--force', '--activationkey', 'podman-desktop', '--org', '123456'],
629+
runOptions: { },
630+
});
631+
});
632+
});

0 commit comments

Comments
 (0)