Skip to content

Commit

Permalink
fix: handle error so that it is shown in both page and task manager
Browse files Browse the repository at this point in the history
Signed-off-by: lstocchi <[email protected]>
  • Loading branch information
lstocchi committed Aug 20, 2024
1 parent 42399a2 commit f1777b6
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 47 deletions.
3 changes: 2 additions & 1 deletion src/crc-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@ export async function needSetup(): Promise<boolean> {
await execPromise(getCrcCli(), ['setup', '--check-only']);
return false;
} catch (e) {
console.log(e)
return true;
}
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
export async function setUpCrc(logger: extensionApi.Logger, askForPreset = false): Promise<boolean> {
export async function setUpCrc(askForPreset = false): Promise<boolean> {
if (askForPreset) {
const preset = await extensionApi.window.showInformationMessage(
'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).',
Expand Down
22 changes: 10 additions & 12 deletions src/crc-start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const missingPullSecret = 'Failed to ask for pull secret';

export async function startCrc(
provider: extensionApi.Provider,
logger: extensionApi.Logger,
loggerCallback: (data: string) => void,
telemetryLogger: extensionApi.TelemetryLogger,
): Promise<boolean> {
telemetryLogger.logUsage('crc.start', {
Expand All @@ -49,16 +49,15 @@ export async function startCrc(
if (isNeedSetup) {
try {
crcStatus.setSetupRunning(true);
await setUpCrc(logger);
await setUpCrc();
} catch (error) {
logger.error(error);
provider.updateStatus('stopped');
return;
throw error;
} finally {
crcStatus.setSetupRunning(false);
}
}
await crcLogProvider.startSendingLogs(logger);
crcLogProvider.startSendingLogs(loggerCallback);
const result = await commander.start();
if (result.Status === 'Running') {
provider.updateStatus('started');
Expand All @@ -72,26 +71,26 @@ export async function startCrc(
// check that crc missing pull secret
if (err.message.startsWith(missingPullSecret)) {
// ask user to provide pull secret
if (await askAndStorePullSecret(logger)) {
if (await askAndStorePullSecret()) {
// if pull secret provided try to start again
return startCrc(provider, logger, telemetryLogger);
return startCrc(provider, loggerCallback, telemetryLogger);
} else {
throw new Error('Could not start without pullsecret!');
throw new Error(`${productName} start error: VM cannot be started without the pullsecret`);
}
} else if (err.name === 'RequestError' && err.code === 'ECONNRESET') {
// look like crc start normally, but we receive empty response from socket, so 'got' generate an error
provider.updateStatus('started');
return true;
}
}
await extensionApi.window.showErrorMessage(`${productName} start error: ${err}`);
console.error(err);
console.error(err);
provider.updateStatus('stopped');
throw new Error(`${productName} start error: ${err}`);
}
return false;
}

async function askAndStorePullSecret(logger: extensionApi.Logger): Promise<boolean> {
async function askAndStorePullSecret(): Promise<boolean> {
let pullSecret: string;
const authSession: extensionApi.AuthenticationSession | undefined = await extensionApi.authentication.getSession(
'redhat.authentication-provider',
Expand Down Expand Up @@ -147,7 +146,6 @@ async function askAndStorePullSecret(logger: extensionApi.Logger): Promise<boole
return true;
} catch (error) {
console.error(error);
logger.error(error);
}
return false;
}
39 changes: 10 additions & 29 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import * as path from 'node:path';
import * as os from 'node:os';
import * as fs from 'node:fs';
import { commander, isDaemonRunning } from './daemon-commander';
import { defaultPreset, getPresetLabel, isWindows, productName, providerId } from './util';
import { defaultPreset, getLoggerCallback, getPresetLabel, isWindows, productName, providerId } from './util';
import type { CrcVersion } from './crc-cli';
import { getPreset } from './crc-cli';
import { getCrcVersion } from './crc-cli';
Expand Down Expand Up @@ -248,41 +248,17 @@ async function createCrcVm(
logger: extensionApi.Logger,
): Promise<void> {
// we already have an instance
if (crcStatus.status.CrcStatus !== 'No Cluster' && !isNeedSetup()) {
if (crcStatus.status.CrcStatus !== 'No Cluster') {
return;
}

if (isNeedSetup()) {
const initResult = await initializeCrc(provider, extensionContext, telemetryLogger, logger);
if (!initResult) {
throw new Error(`${productName} not initialized.`);
}
}

const hasStarted = await startCrc(provider, logger, telemetryLogger);
const hasStarted = await startCrc(provider, getLoggerCallback(undefined, logger), telemetryLogger);
if (!connectionDisposable && hasStarted) {
addCommands(telemetryLogger);
await presetChanged(provider, extensionContext, telemetryLogger);
}
}

async function initializeCrc(
provider: extensionApi.Provider,
extensionContext: extensionApi.ExtensionContext,
telemetryLogger: extensionApi.TelemetryLogger,
logger: extensionApi.Logger,
): Promise<boolean> {
const hasSetupFinished = await setUpCrc(logger, true);
if (hasSetupFinished) {
await needSetup();
await connectToCrc();
await presetChanged(provider, extensionContext, telemetryLogger);
addCommands(telemetryLogger);
await syncPreferences(provider, extensionContext, telemetryLogger);
}
return hasSetupFinished;
}

function addCommands(telemetryLogger: extensionApi.TelemetryLogger): void {
registerOpenTerminalCommand();
registerOpenConsoleCommand();
Expand Down Expand Up @@ -353,9 +329,14 @@ function registerOpenShiftLocalCluster(
delete: () => {
return handleDelete(provider, extensionContext, telemetryLogger);
},
start: async ctx => {
start: async (ctx, logger) => {
provider.updateStatus('starting');
await startCrc(provider, ctx.log, telemetryLogger);
try {
await startCrc(provider, getLoggerCallback(ctx, logger,), telemetryLogger);
} catch (e) {
logger?.error(e);
throw e;
}
},
stop: () => {
provider.updateStatus('stopping');
Expand Down
2 changes: 1 addition & 1 deletion src/install/crc-install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export class CrcInstall {
provider.updateVersion(newInstalledCrc.version);
let setupResult = false;
if (await needSetup()) {
setupResult = await setUpCrc(logger, true);
setupResult = await setUpCrc(true);
}
installFinishedFn(setupResult, newInstalledCrc);
}
Expand Down
4 changes: 2 additions & 2 deletions src/log-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ export class LogProvider {
private timeout: NodeJS.Timeout;
constructor(private readonly commander: DaemonCommander) {}

async startSendingLogs(logger: Logger): Promise<void> {
async startSendingLogs(loggerCallback: (data: string) => void): Promise<void> {
let lastLogLine = 0;
this.timeout = setInterval(async () => {
try {
const logs = await this.commander.logs();
const logsDiff: string[] = logs.Messages.slice(lastLogLine, logs.Messages.length - 1);
lastLogLine = logs.Messages.length;
logger.log(logsDiff.join('\n'));
loggerCallback(logsDiff.join('\n'));
} catch (e) {
console.log('Logs tick: ' + e);
}
Expand Down
4 changes: 2 additions & 2 deletions src/preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import * as extensionApi from '@podman-desktop/api';
import type { Configuration, Preset } from './types';
import { commander } from './daemon-commander';
import { isEmpty, productName } from './util';
import { getLoggerCallback, isEmpty, productName } from './util';
import { crcStatus } from './crc-status';
import { stopCrc } from './crc-stop';
import { deleteCrc } from './crc-delete';
Expand Down Expand Up @@ -337,7 +337,7 @@ async function handleRecreate(
} else if (result === 'Delete and Restart') {
await stopCrc(telemetryLogger);
await deleteCrc();
await startCrc(provider, defaultLogger, telemetryLogger);
await startCrc(provider, getLoggerCallback(undefined, defaultLogger), telemetryLogger);
return true;
} else if (result === 'Delete') {
await deleteCrc();
Expand Down
10 changes: 10 additions & 0 deletions src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import * as os from 'node:os';
import { spawn } from 'node:child_process';
import * as fs from 'node:fs/promises';
import type { Preset } from './types';
import { LifecycleContext, Logger } from '@podman-desktop/api';

export const productName = 'OpenShift Local';
export const defaultPreset: Preset = 'openshift';
Expand Down Expand Up @@ -113,3 +114,12 @@ export function getPresetLabel(preset: Preset): string {
return defaultPresetLabel;
}
}

export function getLoggerCallback(context?: LifecycleContext, logger?: Logger): (data: string) => void {
return (data: string): void => {
if (data) {
context?.log?.log(data);
logger?.log(data);
}
};
}

0 comments on commit f1777b6

Please sign in to comment.