diff --git a/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts b/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts index 1facfc0b661f4..37ede987a5552 100644 --- a/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts +++ b/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.test.ts @@ -102,6 +102,7 @@ describe('createConcreteWriteIndex', () => { aliases: { '.alerts-test.alerts-default': { is_write_index: true, + is_hidden: true, }, }, }); @@ -326,6 +327,7 @@ describe('createConcreteWriteIndex', () => { aliases: { '.alerts-test.alerts-default': { is_write_index: true, + is_hidden: true, }, }, }); @@ -401,6 +403,7 @@ describe('createConcreteWriteIndex', () => { aliases: { '.alerts-test.alerts-default': { is_write_index: true, + is_hidden: true, }, }, }); @@ -1142,31 +1145,199 @@ describe('setConcreteWriteIndex', () => { index: '.internal.alerts-test.alerts-default-000003', alias: '.alerts-test.alerts-default', isWriteIndex: false, + isHidden: true, + }, + { + index: '.internal.alerts-test.alerts-default-000004', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: true, + }, + { + index: '.internal.alerts-test.alerts-default-000001', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: true, + }, + { + index: '.internal.alerts-test.alerts-default-000002', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: true, + }, + ], + alias: '.alerts-test.alerts-default', + }); + + expect(logger.debug).toHaveBeenCalledWith( + 'Attempting to set index: .internal.alerts-test.alerts-default-000004 as the write index for alias: .alerts-test.alerts-default.' + ); + expect(clusterClient.indices.updateAliases).toHaveBeenCalledWith({ + actions: [ + { + remove: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000004', + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000004', + is_write_index: true, + is_hidden: true, + }, + }, + ], + }); + expect(logger.info).toHaveBeenCalledWith( + 'Successfully updated index aliases for alias: .alerts-test.alerts-default.' + ); + }); + + it(`should call updateAliases to set the index aliases to hidden`, async () => { + await findOrSetConcreteWriteIndex({ + logger, + esClient: clusterClient, + concreteIndices: [ + { + index: '.internal.alerts-test.alerts-default-000003', + alias: '.alerts-test.alerts-default', + isWriteIndex: true, + isHidden: false, + }, + { + index: '.internal.alerts-test.alerts-default-000004', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: true, + }, + { + index: '.internal.alerts-test.alerts-default-000001', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: false, + }, + { + index: '.internal.alerts-test.alerts-default-000002', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: true, + }, + ], + alias: '.alerts-test.alerts-default', + }); + + expect(logger.debug).toHaveBeenCalledWith( + 'Attempting to set index aliases as hidden for alias: .alerts-test.alerts-default.' + ); + expect(clusterClient.indices.updateAliases).toHaveBeenCalledWith({ + actions: [ + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000001', + is_hidden: true, + is_write_index: false, + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000002', + is_hidden: true, + is_write_index: false, + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000003', + is_hidden: true, + is_write_index: true, + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000004', + is_hidden: true, + is_write_index: false, + }, + }, + ], + }); + expect(logger.info).toHaveBeenCalledWith( + 'Successfully updated index aliases for alias: .alerts-test.alerts-default.' + ); + }); + + it(`should call updateAliases to set the index aliases to hidden and the concrete write index`, async () => { + await findOrSetConcreteWriteIndex({ + logger, + esClient: clusterClient, + concreteIndices: [ + { + index: '.internal.alerts-test.alerts-default-000003', + alias: '.alerts-test.alerts-default', + isWriteIndex: false, + isHidden: false, }, { index: '.internal.alerts-test.alerts-default-000004', alias: '.alerts-test.alerts-default', isWriteIndex: false, + isHidden: true, }, { index: '.internal.alerts-test.alerts-default-000001', alias: '.alerts-test.alerts-default', isWriteIndex: false, + isHidden: false, }, { index: '.internal.alerts-test.alerts-default-000002', alias: '.alerts-test.alerts-default', isWriteIndex: false, + isHidden: true, }, ], alias: '.alerts-test.alerts-default', }); + expect(logger.debug).toHaveBeenCalledWith( + 'Attempting to set index aliases as hidden for alias: .alerts-test.alerts-default.' + ); expect(logger.debug).toHaveBeenCalledWith( 'Attempting to set index: .internal.alerts-test.alerts-default-000004 as the write index for alias: .alerts-test.alerts-default.' ); + expect(clusterClient.indices.updateAliases).toHaveBeenCalledWith({ actions: [ + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000001', + is_hidden: true, + is_write_index: false, + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000002', + is_hidden: true, + is_write_index: false, + }, + }, + { + add: { + alias: '.alerts-test.alerts-default', + index: '.internal.alerts-test.alerts-default-000003', + is_hidden: true, + is_write_index: false, + }, + }, { remove: { alias: '.alerts-test.alerts-default', @@ -1177,13 +1348,14 @@ describe('setConcreteWriteIndex', () => { add: { alias: '.alerts-test.alerts-default', index: '.internal.alerts-test.alerts-default-000004', + is_hidden: true, is_write_index: true, }, }, ], }); expect(logger.info).toHaveBeenCalledWith( - 'Successfully set index: .internal.alerts-test.alerts-default-000004 as the write index for alias: .alerts-test.alerts-default.' + 'Successfully updated index aliases for alias: .alerts-test.alerts-default.' ); }); @@ -1200,12 +1372,13 @@ describe('setConcreteWriteIndex', () => { index: '.internal.alerts-test.alerts-default-000001', alias: '.alerts-test.alerts-default', isWriteIndex: false, + isHidden: true, }, ], alias: '.alerts-test.alerts-default', }) ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Failed to set index: .internal.alerts-test.alerts-default-000001 as the write index for alias: .alerts-test.alerts-default."` + `"Failed to update index aliases for alias: .alerts-test.alerts-default."` ); }); }); diff --git a/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.ts b/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.ts index 480f973a6ac3a..47abf698118b6 100644 --- a/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.ts +++ b/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/create_concrete_write_index.ts @@ -5,7 +5,10 @@ * 2.0. */ -import type { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/types'; +import type { + MappingTypeMapping, + IndicesUpdateAliasesAction, +} from '@elastic/elasticsearch/lib/api/types'; import type { Logger, ElasticsearchClient } from '@kbn/core/server'; import { sortBy } from 'lodash'; import type { IIndexPatternString } from '../resource_installer_utils'; @@ -17,6 +20,7 @@ export interface ConcreteIndexInfo { index: string; alias: string; isWriteIndex: boolean; + isHidden: boolean; } interface UpdateIndexMappingsAndSettingsOpts { @@ -202,41 +206,73 @@ export async function findOrSetConcreteWriteIndex( ): Promise { const { logger, esClient, concreteIndices, alias } = opts; const concreteWriteIndex = concreteIndices.find((index) => index.isWriteIndex); - if (concreteWriteIndex) { + const isHidden = concreteIndices.every((index) => index.isHidden); + + if (isHidden && concreteWriteIndex) { return concreteWriteIndex; - } else { - logger.debug(`Indices for alias ${alias} exist but none are set as the write index`); } + + const actions: IndicesUpdateAliasesAction[] = []; const lastIndex = concreteIndices.length - 1; - const concreteIndex = sortBy(concreteIndices, ['index'])[lastIndex]; - logger.debug( - `Attempting to set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` - ); + const sortedConcreteIndices = sortBy(concreteIndices, ['index']); + const concreteIndex = sortedConcreteIndices[lastIndex]; + + if (!isHidden) { + logger.debug(`Indices for alias ${alias} exist but some are not set as hidden`); + for (let i = 0; i < lastIndex; i++) { + const index = sortedConcreteIndices[i]; + actions.push({ + add: { + index: index.index, + alias: index.alias, + is_write_index: index.isWriteIndex, + is_hidden: true, + }, + }); + } + logger.debug(`Attempting to set index aliases as hidden for alias: ${alias}.`); + } + + if (!concreteWriteIndex) { + logger.debug(`Indices for alias ${alias} exist but none are set as the write index`); + actions.push( + { remove: { index: concreteIndex.index, alias: concreteIndex.alias } }, + { + add: { + index: concreteIndex.index, + alias: concreteIndex.alias, + is_write_index: true, + is_hidden: true, + }, + } + ); + logger.debug( + `Attempting to set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` + ); + } else if (!isHidden) { + actions.push({ + add: { + index: concreteIndex.index, + alias: concreteIndex.alias, + is_write_index: concreteIndex.isWriteIndex, + is_hidden: true, + }, + }); + } + try { await retryTransientEsErrors( () => esClient.indices.updateAliases({ - actions: [ - { remove: { index: concreteIndex.index, alias: concreteIndex.alias } }, - { - add: { - index: concreteIndex.index, - alias: concreteIndex.alias, - is_write_index: true, - }, - }, - ], + actions, }), { logger } ); - logger.info( - `Successfully set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` - ); - return concreteIndex; + + logger.info(`Successfully updated index aliases for alias: ${alias}.`); + return !concreteWriteIndex ? concreteIndex : concreteWriteIndex; } catch (error) { - throw new Error( - `Failed to set index: ${concreteIndex.index} as the write index for alias: ${concreteIndex.alias}.` - ); + throw new Error(`Failed to update index aliases for alias: ${alias}.`); } } diff --git a/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/data_stream_adapter.ts b/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/data_stream_adapter.ts index 366d9439e51f5..ea4eb9d889d34 100644 --- a/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/data_stream_adapter.ts +++ b/x-pack/platform/plugins/shared/alerting/server/alerts_service/lib/data_stream_adapter.ts @@ -124,6 +124,7 @@ async function createDataStream(opts: CreateConcreteWriteIndexOpts): Promise