Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ describe('createConcreteWriteIndex', () => {
aliases: {
'.alerts-test.alerts-default': {
is_write_index: true,
is_hidden: true,
},
},
});
Expand Down Expand Up @@ -326,6 +327,7 @@ describe('createConcreteWriteIndex', () => {
aliases: {
'.alerts-test.alerts-default': {
is_write_index: true,
is_hidden: true,
},
},
});
Expand Down Expand Up @@ -401,6 +403,7 @@ describe('createConcreteWriteIndex', () => {
aliases: {
'.alerts-test.alerts-default': {
is_write_index: true,
is_hidden: true,
},
},
});
Expand Down Expand Up @@ -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',
Expand All @@ -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.'
);
});

Expand All @@ -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."`
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -17,6 +20,7 @@ export interface ConcreteIndexInfo {
index: string;
alias: string;
isWriteIndex: boolean;
isHidden: boolean;
}

interface UpdateIndexMappingsAndSettingsOpts {
Expand Down Expand Up @@ -202,41 +206,73 @@ export async function findOrSetConcreteWriteIndex(
): Promise<ConcreteIndexInfo> {
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}.`);
}
}

Expand Down
Loading