From 9a241f32eab7e31d423fae821a7c99409a71c6de Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Wed, 27 May 2020 08:14:42 +0200 Subject: [PATCH] [Ingest Manager] Improve server-side error handling (#67278) * Use IngestManagerError instead of Boom errors. * Extend Error and simplify. * Add registry url to error messages. Co-authored-by: Elastic Machine --- .../plugins/ingest_manager/server/errors.ts | 29 +++++++++++++++++++ .../server/routes/setup/handlers.ts | 8 +++++ .../server/services/epm/registry/requests.ts | 12 ++++++-- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/server/errors.ts diff --git a/x-pack/plugins/ingest_manager/server/errors.ts b/x-pack/plugins/ingest_manager/server/errors.ts new file mode 100644 index 00000000000000..193a65fd8df7ff --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/errors.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export class IngestManagerError extends Error { + public type: IngestManagerErrorType; + public message: string; + + constructor(type: IngestManagerErrorType, message: string) { + super(message); + this.type = type; + this.message = message; + } +} + +export const getHTTPResponseCode = (error: IngestManagerError): number => { + switch (error.type) { + case IngestManagerErrorType.RegistryError: + return 502; // Bad Gateway + default: + return 400; // Bad Request + } +}; + +export enum IngestManagerErrorType { + RegistryError, +} diff --git a/x-pack/plugins/ingest_manager/server/routes/setup/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/setup/handlers.ts index 8bc80c69ce9b2d..4a0054b2471314 100644 --- a/x-pack/plugins/ingest_manager/server/routes/setup/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/setup/handlers.ts @@ -9,6 +9,7 @@ import { outputService, appContextService } from '../../services'; import { GetFleetStatusResponse } from '../../../common'; import { setupIngestManager, setupFleet } from '../../services/setup'; import { PostFleetSetupRequestSchema } from '../../types'; +import { IngestManagerError, getHTTPResponseCode } from '../../errors'; export const getFleetStatusHandler: RequestHandler = async (context, request, response) => { const soClient = context.core.savedObjects.client; @@ -81,6 +82,13 @@ export const ingestManagerSetupHandler: RequestHandler = async (context, request body: { isInitialized: true }, }); } catch (e) { + if (e instanceof IngestManagerError) { + logger.error(e.message); + return response.customError({ + statusCode: getHTTPResponseCode(e), + body: { message: e.message }, + }); + } if (e.isBoom) { logger.error(e.output.payload.message); return response.customError({ diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/requests.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/requests.ts index 93e475cbc5956b..6d039345e31c35 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/requests.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/requests.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import Boom from 'boom'; import fetch, { Response } from 'node-fetch'; import { streamToString } from './streams'; +import { IngestManagerError, IngestManagerErrorType } from '../../../errors'; export async function getResponse(url: string): Promise { try { @@ -14,10 +14,16 @@ export async function getResponse(url: string): Promise { if (response.ok) { return response; } else { - throw new Boom(response.statusText, { statusCode: response.status }); + throw new IngestManagerError( + IngestManagerErrorType.RegistryError, + `Error connecting to package registry at ${url}: ${response.statusText}` + ); } } catch (e) { - throw new Boom(`Error connecting to package registry: ${e.message}`, { statusCode: 502 }); + throw new IngestManagerError( + IngestManagerErrorType.RegistryError, + `Error connecting to package registry at ${url}: ${e.message}` + ); } }