diff --git a/x-pack/plugins/ingest_manager/server/errors.ts b/x-pack/plugins/ingest_manager/server/errors.ts index 1e2ad8d850a82be..6024ff85ee93321 100644 --- a/x-pack/plugins/ingest_manager/server/errors.ts +++ b/x-pack/plugins/ingest_manager/server/errors.ts @@ -14,6 +14,26 @@ import { } from 'src/core/server'; import { appContextService } from './services'; +interface ESClientError { + statusCode: number; + message: string; + body: string; + path: string; + query: string | undefined; + response: string; +} + +const isESClientError = (error: any): error is ESClientError => { + return ( + 'statusCode' in error && + 'message' in error && + 'body' in error && + 'path' in error && + 'query' in error && + 'response' in error + ); +}; + export class IngestManagerError extends Error { constructor(message?: string) { super(message); @@ -21,7 +41,7 @@ export class IngestManagerError extends Error { } } -export const getHTTPResponseCode = (error: IngestManagerError): number => { +export const getHTTPResponseCode = (error: any): number => { switch (true) { case error instanceof RegistryConnectionError: return 502; // Bad Gateway @@ -51,6 +71,15 @@ export interface IngestErrorHandlerParams { export const defaultIngestErrorHandler: IngestErrorHandler = async ({ error, response }) => { const logger = appContextService.getLogger(); + if (isESClientError(error)) { + logger.error(error); + const message = `HTTP ${error.statusCode} response from ES at ${error.path}: ${error.message}`; + return response.customError({ + statusCode: error.statusCode, + body: { message }, + }); + } + if (error instanceof IngestManagerError) { logger.error(error.message); return response.customError({ @@ -65,6 +94,7 @@ export const defaultIngestErrorHandler: IngestErrorHandler = async ({ error, res body: { message: error.output.payload.message }, }); } + logger.error(error); return response.customError({ statusCode: 500, diff --git a/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts index 0f99b880b3141f4..7613f684d015b6f 100644 --- a/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts @@ -32,7 +32,7 @@ import { getLimitedPackages, getInstallationObject, } from '../../services/epm/packages'; -import { IngestManagerError, getHTTPResponseCode, defaultIngestErrorHandler } from '../../errors'; +import { IngestManagerError, defaultIngestErrorHandler } from '../../errors'; import { splitPkgKey } from '../../services/epm/registry'; export const getCategoriesHandler: RequestHandler< @@ -155,14 +155,10 @@ export const installPackageHandler: RequestHandler< }; return response.ok({ body }); } catch (e) { + const defaultResult = await defaultIngestErrorHandler({ error: e, response }); if (e instanceof IngestManagerError) { - logger.error(e); - return response.customError({ - statusCode: getHTTPResponseCode(e), - body: { message: e.message }, - }); + return defaultResult; } - // if there is an unknown server error, uninstall any package assets try { const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); @@ -173,11 +169,7 @@ export const installPackageHandler: RequestHandler< } catch (error) { logger.error(`could not remove failed installation ${error}`); } - logger.error(e); - return response.customError({ - statusCode: 500, - body: { message: e.message }, - }); + return defaultResult; } }; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts index 44e4eddfbbe6a71..1ec0898ad7dd06e 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts @@ -156,7 +156,10 @@ async function installPipeline({ body: pipeline.contentForInstallation, }; if (pipeline.extension === 'yml') { - callClusterParams.headers = { ['Content-Type']: 'application/yaml' }; + callClusterParams.headers = { + 'Content-Type': 'application/yaml', + Accept: 'application/json', + }; } // This uses the catch-all endpoint 'transport.request' because we have to explicitly diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts index e49dbe8f0b5d4ed..96680cafbd21182 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts @@ -146,11 +146,12 @@ export async function installPackage({ } const installIndexPatternPromise = installIndexPatterns(savedObjectsClient, pkgName, pkgVersion); const kibanaAssets = await getKibanaAssets(paths); - if (installedPkg) + if (installedPkg) { await deleteKibanaSavedObjectsAssets( savedObjectsClient, installedPkg.attributes.installed_kibana ); + } // save new kibana refs before installing the assets const installedKibanaAssetsRefs = await saveKibanaAssetsRefs( savedObjectsClient, 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 83d0a64260afb13..0a2e062f8b25f17 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 @@ -53,8 +53,12 @@ export async function getResponse(url: string): Promise { }); return response; } catch (error) { - // throw same error type whether isSystemError (after max retry attempts) or something else - throw new RegistryConnectionError(error); + // isSystemError here means we didn't succeed after max retries + if (isSystemError(error)) { + throw new RegistryConnectionError(error); + } else { + throw error; + } } }