Skip to content

Commit 9a6b193

Browse files
committed
wip: error handling improvements
1 parent 9759d4e commit 9a6b193

File tree

11 files changed

+212
-176
lines changed

11 files changed

+212
-176
lines changed

docs/site/content/User/SoloCommands.md

Lines changed: 113 additions & 56 deletions
Large diffs are not rendered by default.

solo.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ const context: {logger: SoloLogger} = {logger: undefined};
99
await fnm
1010
.main(process.argv, context)
1111
.then(() => {
12-
context.logger.logAndExitSuccess('Solo CLI completed, via entrypoint');
12+
context.logger.info('Solo CLI completed, via entrypoint');
1313
})
1414
.catch(err => {
15-
context.logger.logAndExitError(err);
15+
context.logger.showUserError(err);
1616
});

src/commands/cluster/configs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export const resetConfigBuilder = async function (argv, ctx, task) {
6060
});
6161

6262
if (!confirmResult) {
63-
this.logger.logAndExitSuccess('Aborted application by user prompt');
63+
this.logger.info('Aborted application by user prompt');
6464
}
6565
}
6666

src/commands/cluster/tasks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ export class ClusterCommandTasks {
489489
});
490490

491491
if (!confirm) {
492-
self.parent.logger.logAndExitSuccess('Aborted application by user prompt');
492+
self.parent.logger.info('Aborted application by user prompt');
493493
}
494494
}
495495
await parent

src/commands/explorer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ export class ExplorerCommand extends BaseCommand {
397397
});
398398

399399
if (!confirmResult) {
400-
this.logger.logAndExitSuccess('Aborted application by user prompt');
400+
this.logger.info('Aborted application by user prompt');
401401
}
402402
}
403403

src/commands/init.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,7 @@ export class InitCommand extends BaseCommand {
100100
},
101101
);
102102

103-
try {
104-
await tasks.run();
105-
} catch (e: Error | any) {
106-
throw new SoloError('Error running init', e);
107-
}
103+
await tasks.run();
108104

109105
return true;
110106
}
@@ -128,7 +124,6 @@ export class InitCommand extends BaseCommand {
128124
if (!r) throw new SoloError('Error running init, expected return value to be true');
129125
})
130126
.catch(err => {
131-
self.logger.showUserError(err);
132127
throw new SoloError('Error running init', err);
133128
});
134129
},

src/commands/mirror_node.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ export class MirrorNodeCommand extends BaseCommand {
701701
});
702702

703703
if (!confirmResult) {
704-
this.logger.logAndExitSuccess('Aborted application by user prompt');
704+
this.logger.info('Aborted application by user prompt');
705705
}
706706
}
707707

src/commands/network.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1123,7 +1123,7 @@ export class NetworkCommand extends BaseCommand {
11231123
});
11241124

11251125
if (!confirmResult) {
1126-
this.logger.logAndExitSuccess('Aborted application by user prompt');
1126+
this.logger.info('Aborted application by user prompt');
11271127
}
11281128
}
11291129

src/commands/relay.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,12 @@ export class RelayCommand extends BaseCommand {
211211

212212
const tasks = new Listr<Context>(
213213
[
214+
// {
215+
// title: 'Throw',
216+
// task: async (ctx, task) => {
217+
// throw new SoloError('test throw');
218+
// },
219+
// },
214220
{
215221
title: 'Initialize',
216222
task: async (ctx, task) => {
@@ -472,7 +478,6 @@ export class RelayCommand extends BaseCommand {
472478
if (!r) throw new SoloError('Error deploying relay, expected return value to be true');
473479
})
474480
.catch(err => {
475-
self.logger.showUserError(err);
476481
throw new SoloError(`Error deploying relay: ${err.message}`, err);
477482
});
478483
},

src/core/logging.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -156,25 +156,6 @@ export class SoloLogger {
156156
this.showUser(chalk.green('-------------------------------------------------------------------------------'));
157157
console.log(JSON.stringify(obj, null, ' '));
158158
}
159-
160-
logAndExitSuccess(msg: string, ...args: any) {
161-
this.winstonLogger.log('info', msg, args, () => {
162-
queueMicrotask(() => {
163-
// eslint-disable-next-line n/no-process-exit
164-
process.exit(0);
165-
});
166-
});
167-
}
168-
169-
logAndExitError(error: Error) {
170-
this.showUserError(error);
171-
this.winstonLogger.log('error', '', error, () => {
172-
queueMicrotask(() => {
173-
// eslint-disable-next-line n/no-process-exit
174-
process.exit(1);
175-
});
176-
});
177-
}
178159
}
179160

180161
export function NewLogger(level = 'debug', devMode = false) {

src/index.ts

Lines changed: 85 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -46,99 +46,97 @@ export async function main(argv: string[], context?: {logger: SoloLogger}) {
4646

4747
const logger = container.resolve<SoloLogger>(InjectTokens.SoloLogger);
4848

49-
try {
50-
if (context) {
51-
// save the logger so that solo.ts can use it to properly flush the logs and exit
52-
context.logger = logger;
53-
}
54-
process.on('unhandledRejection', (reason, promise) => {
55-
logger.logAndExitError(
56-
new SoloError(`Unhandled Rejection at: ${JSON.stringify(promise)}, reason: ${JSON.stringify(reason)}`),
57-
);
58-
});
59-
process.on('uncaughtException', (err, origin) => {
60-
logger.logAndExitError(new SoloError(`Uncaught Exception: ${err}, origin: ${origin}`));
61-
});
49+
if (context) {
50+
// save the logger so that solo.ts can use it to properly flush the logs and exit
51+
context.logger = logger;
52+
}
53+
process.on('unhandledRejection', (reason, promise) => {
54+
logger.showUserError(
55+
new SoloError(`Unhandled Rejection at: ${JSON.stringify(promise)}, reason: ${JSON.stringify(reason)}`),
56+
);
57+
});
58+
process.on('uncaughtException', (err, origin) => {
59+
logger.showUserError(new SoloError(`Uncaught Exception: ${err}, origin: ${origin}`));
60+
});
6261

63-
logger.debug('Initializing Solo CLI');
64-
constants.LISTR_DEFAULT_RENDERER_OPTION.logger = new ListrLogger({processOutput: new CustomProcessOutput(logger)});
65-
if (argv.length >= 3 && ['-version', '--version', '-v', '--v'].includes(argv[2])) {
66-
logger.showUser(
67-
chalk.cyan('\n******************************* Solo *********************************************'),
68-
);
69-
logger.showUser(chalk.cyan('Version\t\t\t:'), chalk.yellow(helpers.getSoloVersion()));
70-
logger.showUser(chalk.cyan('**********************************************************************************'));
71-
logger.logAndExitSuccess('displayed version information, exiting');
72-
}
62+
logger.debug('Initializing Solo CLI');
63+
constants.LISTR_DEFAULT_RENDERER_OPTION.logger = new ListrLogger({processOutput: new CustomProcessOutput(logger)});
64+
if (argv.length >= 3 && ['-version', '--version', '-v', '--v'].includes(argv[2])) {
65+
logger.showUser(chalk.cyan('\n******************************* Solo *********************************************'));
66+
logger.showUser(chalk.cyan('Version\t\t\t:'), chalk.yellow(helpers.getSoloVersion()));
67+
logger.showUser(chalk.cyan('**********************************************************************************'));
68+
logger.info('displayed version information, exiting');
69+
}
7370

74-
// prepare dependency manger registry
75-
const downloader: PackageDownloader = container.resolve(InjectTokens.PackageDownloader);
76-
const depManager: DependencyManager = container.resolve(InjectTokens.DependencyManager);
77-
const helm: Helm = container.resolve(InjectTokens.Helm);
78-
const chartManager: ChartManager = container.resolve(InjectTokens.ChartManager);
79-
const configManager: ConfigManager = container.resolve(InjectTokens.ConfigManager);
80-
const k8Factory: K8Factory = container.resolve(InjectTokens.K8Factory);
81-
const accountManager: AccountManager = container.resolve(InjectTokens.AccountManager);
82-
const platformInstaller: PlatformInstaller = container.resolve(InjectTokens.PlatformInstaller);
83-
const keyManager: KeyManager = container.resolve(InjectTokens.KeyManager);
84-
const profileManager: ProfileManager = container.resolve(InjectTokens.ProfileManager);
85-
const leaseManager: LeaseManager = container.resolve(InjectTokens.LeaseManager);
86-
const certificateManager: CertificateManager = container.resolve(InjectTokens.CertificateManager);
87-
const localConfig: LocalConfig = container.resolve(InjectTokens.LocalConfig);
88-
const remoteConfigManager: RemoteConfigManager = container.resolve(InjectTokens.RemoteConfigManager);
71+
// prepare dependency manger registry
72+
const downloader: PackageDownloader = container.resolve(InjectTokens.PackageDownloader);
73+
const depManager: DependencyManager = container.resolve(InjectTokens.DependencyManager);
74+
const helm: Helm = container.resolve(InjectTokens.Helm);
75+
const chartManager: ChartManager = container.resolve(InjectTokens.ChartManager);
76+
const configManager: ConfigManager = container.resolve(InjectTokens.ConfigManager);
77+
const k8Factory: K8Factory = container.resolve(InjectTokens.K8Factory);
78+
const accountManager: AccountManager = container.resolve(InjectTokens.AccountManager);
79+
const platformInstaller: PlatformInstaller = container.resolve(InjectTokens.PlatformInstaller);
80+
const keyManager: KeyManager = container.resolve(InjectTokens.KeyManager);
81+
const profileManager: ProfileManager = container.resolve(InjectTokens.ProfileManager);
82+
const leaseManager: LeaseManager = container.resolve(InjectTokens.LeaseManager);
83+
const certificateManager: CertificateManager = container.resolve(InjectTokens.CertificateManager);
84+
const localConfig: LocalConfig = container.resolve(InjectTokens.LocalConfig);
85+
const remoteConfigManager: RemoteConfigManager = container.resolve(InjectTokens.RemoteConfigManager);
8986

90-
const opts: Opts = {
91-
logger,
92-
helm,
93-
k8Factory,
94-
downloader,
95-
platformInstaller,
96-
chartManager,
97-
configManager,
98-
depManager,
99-
keyManager,
100-
accountManager,
101-
profileManager,
102-
leaseManager,
103-
remoteConfigManager,
104-
certificateManager,
105-
localConfig,
106-
};
87+
const opts: Opts = {
88+
logger,
89+
helm,
90+
k8Factory,
91+
downloader,
92+
platformInstaller,
93+
chartManager,
94+
configManager,
95+
depManager,
96+
keyManager,
97+
accountManager,
98+
profileManager,
99+
leaseManager,
100+
remoteConfigManager,
101+
certificateManager,
102+
localConfig,
103+
};
107104

108-
logger.debug('Initializing middlewares');
109-
const middlewares = new Middlewares(opts);
105+
logger.debug('Initializing middlewares');
106+
const middlewares = new Middlewares(opts);
110107

111-
logger.debug('Initializing commands');
112-
const rootCmd = yargs(hideBin(argv))
113-
.scriptName('')
114-
.usage('Usage:\n solo <command> [options]')
115-
.alias('h', 'help')
116-
.alias('v', 'version')
117-
// @ts-expect-error - TS2769: No overload matches this call.
118-
.command(commands.Initialize(opts))
119-
.strict()
120-
.demand(1, 'Select a command')
108+
logger.debug('Initializing commands');
109+
const rootCmd = yargs(hideBin(argv))
110+
.scriptName('')
111+
.usage('Usage:\n solo <command> [options]')
112+
.alias('h', 'help')
113+
.alias('v', 'version')
114+
// @ts-expect-error - TS2769: No overload matches this call.
115+
.command(commands.Initialize(opts))
116+
.strict()
117+
.demand(1, 'Select a command')
121118

122-
.middleware(
123-
// @ts-expect-error - TS2322: To assign middlewares
124-
[middlewares.processArgumentsAndDisplayHeader(), middlewares.loadRemoteConfig()],
125-
false, // applyBeforeValidate is false as otherwise middleware is called twice
126-
);
119+
.middleware(
120+
// @ts-expect-error - TS2322: To assign middlewares
121+
[middlewares.processArgumentsAndDisplayHeader(), middlewares.loadRemoteConfig()],
122+
false, // applyBeforeValidate is false as otherwise middleware is called twice
123+
);
127124

128-
rootCmd.fail((msg, err) => {
129-
logger.logAndExitError(
130-
new SoloError(`Error running Solo CLI, failure occurred: ${msg ? msg : ''} ${err.message}`, err),
131-
);
132-
});
125+
rootCmd.fail((msg, error) => {
126+
if (msg) {
127+
if (msg.includes('Unknown argument')) {
128+
logger.showUser(msg);
129+
rootCmd.showHelp();
130+
} else {
131+
logger.showUserError(new SoloError(`Error running Solo CLI, failure occurred: ${msg ? msg : ''}`));
132+
}
133+
rootCmd.exit(0, error);
134+
}
135+
});
133136

134-
logger.debug('Setting up flags');
135-
// set root level flags
136-
flags.setCommandFlags(rootCmd, ...[flags.devMode, flags.forcePortForward]);
137-
logger.debug('Parsing root command (executing the commands)');
138-
return rootCmd.parse();
139-
} catch (e) {
140-
logger.logAndExitError(new SoloError(`Error running Solo CLI: ${e.message}`, e));
141-
// technically unreachable, but helps TS understand that we're exiting
142-
throw e;
143-
}
137+
logger.debug('Setting up flags');
138+
// set root level flags
139+
flags.setCommandFlags(rootCmd, ...[flags.devMode, flags.forcePortForward]);
140+
logger.debug('Parsing root command (executing the commands)');
141+
return rootCmd.parse();
144142
}

0 commit comments

Comments
 (0)