Skip to content

Commit f1777b6

Browse files
committed
fix: handle error so that it is shown in both page and task manager
Signed-off-by: lstocchi <[email protected]>
1 parent 42399a2 commit f1777b6

File tree

7 files changed

+37
-47
lines changed

7 files changed

+37
-47
lines changed

src/crc-setup.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ export async function needSetup(): Promise<boolean> {
2525
await execPromise(getCrcCli(), ['setup', '--check-only']);
2626
return false;
2727
} catch (e) {
28+
console.log(e)
2829
return true;
2930
}
3031
}
3132

3233
// eslint-disable-next-line @typescript-eslint/no-unused-vars
33-
export async function setUpCrc(logger: extensionApi.Logger, askForPreset = false): Promise<boolean> {
34+
export async function setUpCrc(askForPreset = false): Promise<boolean> {
3435
if (askForPreset) {
3536
const preset = await extensionApi.window.showInformationMessage(
3637
'Which preset bundle would you like to use with OpenShift Local. MicroShift, provides a lightweight and optimized environment with a limited set of services. OpenShift, provides a single node OpenShift cluster with a fuller set of services, including a web console (requires more resources).',

src/crc-start.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const missingPullSecret = 'Failed to ask for pull secret';
3737

3838
export async function startCrc(
3939
provider: extensionApi.Provider,
40-
logger: extensionApi.Logger,
40+
loggerCallback: (data: string) => void,
4141
telemetryLogger: extensionApi.TelemetryLogger,
4242
): Promise<boolean> {
4343
telemetryLogger.logUsage('crc.start', {
@@ -49,16 +49,15 @@ export async function startCrc(
4949
if (isNeedSetup) {
5050
try {
5151
crcStatus.setSetupRunning(true);
52-
await setUpCrc(logger);
52+
await setUpCrc();
5353
} catch (error) {
54-
logger.error(error);
5554
provider.updateStatus('stopped');
56-
return;
55+
throw error;
5756
} finally {
5857
crcStatus.setSetupRunning(false);
5958
}
6059
}
61-
await crcLogProvider.startSendingLogs(logger);
60+
crcLogProvider.startSendingLogs(loggerCallback);
6261
const result = await commander.start();
6362
if (result.Status === 'Running') {
6463
provider.updateStatus('started');
@@ -72,26 +71,26 @@ export async function startCrc(
7271
// check that crc missing pull secret
7372
if (err.message.startsWith(missingPullSecret)) {
7473
// ask user to provide pull secret
75-
if (await askAndStorePullSecret(logger)) {
74+
if (await askAndStorePullSecret()) {
7675
// if pull secret provided try to start again
77-
return startCrc(provider, logger, telemetryLogger);
76+
return startCrc(provider, loggerCallback, telemetryLogger);
7877
} else {
79-
throw new Error('Could not start without pullsecret!');
78+
throw new Error(`${productName} start error: VM cannot be started without the pullsecret`);
8079
}
8180
} else if (err.name === 'RequestError' && err.code === 'ECONNRESET') {
8281
// look like crc start normally, but we receive empty response from socket, so 'got' generate an error
8382
provider.updateStatus('started');
8483
return true;
8584
}
8685
}
87-
await extensionApi.window.showErrorMessage(`${productName} start error: ${err}`);
88-
console.error(err);
86+
console.error(err);
8987
provider.updateStatus('stopped');
88+
throw new Error(`${productName} start error: ${err}`);
9089
}
9190
return false;
9291
}
9392

94-
async function askAndStorePullSecret(logger: extensionApi.Logger): Promise<boolean> {
93+
async function askAndStorePullSecret(): Promise<boolean> {
9594
let pullSecret: string;
9695
const authSession: extensionApi.AuthenticationSession | undefined = await extensionApi.authentication.getSession(
9796
'redhat.authentication-provider',
@@ -147,7 +146,6 @@ async function askAndStorePullSecret(logger: extensionApi.Logger): Promise<boole
147146
return true;
148147
} catch (error) {
149148
console.error(error);
150-
logger.error(error);
151149
}
152150
return false;
153151
}

src/extension.ts

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import * as path from 'node:path';
2121
import * as os from 'node:os';
2222
import * as fs from 'node:fs';
2323
import { commander, isDaemonRunning } from './daemon-commander';
24-
import { defaultPreset, getPresetLabel, isWindows, productName, providerId } from './util';
24+
import { defaultPreset, getLoggerCallback, getPresetLabel, isWindows, productName, providerId } from './util';
2525
import type { CrcVersion } from './crc-cli';
2626
import { getPreset } from './crc-cli';
2727
import { getCrcVersion } from './crc-cli';
@@ -248,41 +248,17 @@ async function createCrcVm(
248248
logger: extensionApi.Logger,
249249
): Promise<void> {
250250
// we already have an instance
251-
if (crcStatus.status.CrcStatus !== 'No Cluster' && !isNeedSetup()) {
251+
if (crcStatus.status.CrcStatus !== 'No Cluster') {
252252
return;
253253
}
254254

255-
if (isNeedSetup()) {
256-
const initResult = await initializeCrc(provider, extensionContext, telemetryLogger, logger);
257-
if (!initResult) {
258-
throw new Error(`${productName} not initialized.`);
259-
}
260-
}
261-
262-
const hasStarted = await startCrc(provider, logger, telemetryLogger);
255+
const hasStarted = await startCrc(provider, getLoggerCallback(undefined, logger), telemetryLogger);
263256
if (!connectionDisposable && hasStarted) {
264257
addCommands(telemetryLogger);
265258
await presetChanged(provider, extensionContext, telemetryLogger);
266259
}
267260
}
268261

269-
async function initializeCrc(
270-
provider: extensionApi.Provider,
271-
extensionContext: extensionApi.ExtensionContext,
272-
telemetryLogger: extensionApi.TelemetryLogger,
273-
logger: extensionApi.Logger,
274-
): Promise<boolean> {
275-
const hasSetupFinished = await setUpCrc(logger, true);
276-
if (hasSetupFinished) {
277-
await needSetup();
278-
await connectToCrc();
279-
await presetChanged(provider, extensionContext, telemetryLogger);
280-
addCommands(telemetryLogger);
281-
await syncPreferences(provider, extensionContext, telemetryLogger);
282-
}
283-
return hasSetupFinished;
284-
}
285-
286262
function addCommands(telemetryLogger: extensionApi.TelemetryLogger): void {
287263
registerOpenTerminalCommand();
288264
registerOpenConsoleCommand();
@@ -353,9 +329,14 @@ function registerOpenShiftLocalCluster(
353329
delete: () => {
354330
return handleDelete(provider, extensionContext, telemetryLogger);
355331
},
356-
start: async ctx => {
332+
start: async (ctx, logger) => {
357333
provider.updateStatus('starting');
358-
await startCrc(provider, ctx.log, telemetryLogger);
334+
try {
335+
await startCrc(provider, getLoggerCallback(ctx, logger,), telemetryLogger);
336+
} catch (e) {
337+
logger?.error(e);
338+
throw e;
339+
}
359340
},
360341
stop: () => {
361342
provider.updateStatus('stopping');

src/install/crc-install.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ export class CrcInstall {
136136
provider.updateVersion(newInstalledCrc.version);
137137
let setupResult = false;
138138
if (await needSetup()) {
139-
setupResult = await setUpCrc(logger, true);
139+
setupResult = await setUpCrc(true);
140140
}
141141
installFinishedFn(setupResult, newInstalledCrc);
142142
}

src/log-provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ export class LogProvider {
2424
private timeout: NodeJS.Timeout;
2525
constructor(private readonly commander: DaemonCommander) {}
2626

27-
async startSendingLogs(logger: Logger): Promise<void> {
27+
async startSendingLogs(loggerCallback: (data: string) => void): Promise<void> {
2828
let lastLogLine = 0;
2929
this.timeout = setInterval(async () => {
3030
try {
3131
const logs = await this.commander.logs();
3232
const logsDiff: string[] = logs.Messages.slice(lastLogLine, logs.Messages.length - 1);
3333
lastLogLine = logs.Messages.length;
34-
logger.log(logsDiff.join('\n'));
34+
loggerCallback(logsDiff.join('\n'));
3535
} catch (e) {
3636
console.log('Logs tick: ' + e);
3737
}

src/preferences.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import * as extensionApi from '@podman-desktop/api';
2020
import type { Configuration, Preset } from './types';
2121
import { commander } from './daemon-commander';
22-
import { isEmpty, productName } from './util';
22+
import { getLoggerCallback, isEmpty, productName } from './util';
2323
import { crcStatus } from './crc-status';
2424
import { stopCrc } from './crc-stop';
2525
import { deleteCrc } from './crc-delete';
@@ -337,7 +337,7 @@ async function handleRecreate(
337337
} else if (result === 'Delete and Restart') {
338338
await stopCrc(telemetryLogger);
339339
await deleteCrc();
340-
await startCrc(provider, defaultLogger, telemetryLogger);
340+
await startCrc(provider, getLoggerCallback(undefined, defaultLogger), telemetryLogger);
341341
return true;
342342
} else if (result === 'Delete') {
343343
await deleteCrc();

src/util.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import * as os from 'node:os';
2020
import { spawn } from 'node:child_process';
2121
import * as fs from 'node:fs/promises';
2222
import type { Preset } from './types';
23+
import { LifecycleContext, Logger } from '@podman-desktop/api';
2324

2425
export const productName = 'OpenShift Local';
2526
export const defaultPreset: Preset = 'openshift';
@@ -113,3 +114,12 @@ export function getPresetLabel(preset: Preset): string {
113114
return defaultPresetLabel;
114115
}
115116
}
117+
118+
export function getLoggerCallback(context?: LifecycleContext, logger?: Logger): (data: string) => void {
119+
return (data: string): void => {
120+
if (data) {
121+
context?.log?.log(data);
122+
logger?.log(data);
123+
}
124+
};
125+
}

0 commit comments

Comments
 (0)