[ILM] Surface linked hidden indices for policies (#87960)

This commit is contained in:
Alison Goryachev 2021-01-13 14:50:01 -05:00 committed by GitHub
parent febe1f5900
commit d9bd7b4fd6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 3 deletions

View file

@ -43,7 +43,7 @@ async function addLinkedIndices(client: ElasticsearchClient, policiesMap: Polici
const response = await client.ilm.explainLifecycle<{
indices: { [indexName: string]: IndexLifecyclePolicy };
}>({ index: '*' }, options);
}>({ index: '*,.*' }, options); // '*,.*' will include hidden indices
const policyExplanation = response.body;
Object.entries(policyExplanation.indices).forEach(([indexName, { policy }]) => {
if (policy && policiesMap[policy]) {

View file

@ -13,6 +13,8 @@ import { getRandomString } from './random';
export const initElasticsearchHelpers = (es) => {
let indicesCreated = [];
let templatesCreated = [];
let composableTemplatesCreated = [];
let dataStreamsCreated = [];
// Indices
const getIndex = (index) => es.indices.get({ index }).then(({ body }) => body);
@ -30,6 +32,20 @@ export const initElasticsearchHelpers = (es) => {
const deleteAllIndices = () =>
Promise.all(indicesCreated.map(deleteIndex)).then(() => (indicesCreated = []));
// Data streams
const createDataStream = (dataStream = getRandomString(), document) => {
dataStreamsCreated.push(dataStream);
return es.index({ index: dataStream, body: document });
};
const deleteDataStream = (dataStream) => {
dataStreamsCreated = dataStreamsCreated.filter((i) => i !== dataStream);
return es.indices.deleteDataStream({ name: dataStream });
};
const deleteAllDataStreams = () =>
Promise.all(dataStreamsCreated.map(deleteDataStream)).then(() => (dataStreamsCreated = []));
// Index templates
const getIndexTemplates = () => es.indices.getTemplate();
@ -39,6 +55,11 @@ export const initElasticsearchHelpers = (es) => {
return es.indices.putTemplate({ name, body: template }, { create: true });
};
const createComposableIndexTemplate = (name, template) => {
composableTemplatesCreated.push(name);
return es.indices.putIndexTemplate({ name, body: template }, { create: true });
};
const deleteIndexTemplate = (name) => {
templatesCreated = templatesCreated.filter((i) => i !== name);
return es.indices.deleteTemplate({ name }).catch((err) => {
@ -49,22 +70,45 @@ export const initElasticsearchHelpers = (es) => {
});
};
const deleteComposableIndexTemplate = (name) => {
composableTemplatesCreated = composableTemplatesCreated.filter((i) => i !== name);
return es.indices.deleteIndexTemplate({ name }).catch((err) => {
// Silently fail if templates not found
if (err.statusCode !== 404) {
throw err;
}
});
};
const deleteAllTemplates = () =>
Promise.all(templatesCreated.map(deleteIndexTemplate)).then(() => (templatesCreated = []));
const cleanUp = () => Promise.all([deleteAllIndices(), deleteAllTemplates()]);
const deleteAllComposableTemplates = () =>
Promise.all(templatesCreated.map(deleteComposableIndexTemplate)).then(
() => (composableTemplatesCreated = [])
);
const cleanUp = () =>
Promise.all([
deleteAllIndices(),
deleteAllTemplates(),
deleteAllComposableTemplates(),
deleteAllDataStreams(),
]);
const getNodesStats = () => es.nodes.stats().then(({ body }) => body);
return {
getIndex,
createIndex,
createDataStream,
deleteIndex,
deleteAllIndices,
deleteAllTemplates,
getIndexTemplates,
createIndexTemplate,
deleteIndexTemplate,
createComposableIndexTemplate,
getNodesStats,
cleanUp,
};

View file

@ -17,7 +17,12 @@ export default function ({ getService }) {
const es = getService('es');
const { createIndex, cleanUp: cleanUpEsResources } = initElasticsearchHelpers(es);
const {
createIndex,
createComposableIndexTemplate,
createDataStream,
cleanUp: cleanUpEsResources,
} = initElasticsearchHelpers(es);
const {
loadPolicies,
@ -74,6 +79,34 @@ export default function ({ getService }) {
const fetchedPolicy = body.find((p) => p.name === policyName);
expect(fetchedPolicy.linkedIndices).to.eql([indexName]);
});
it('should add hidden indices linked to policies', async () => {
// Create a policy
const policy = getPolicyPayload('hidden-index-link-test-policy');
const { name: policyName } = policy;
await createPolicy(policy);
// Create hidden data stream
await createComposableIndexTemplate('my_template', {
template: {},
index_patterns: ['hidden*'],
data_stream: {
hidden: true,
},
});
const indexName = 'hidden_index';
await createDataStream(indexName, {
'@timestamp': '2020-01-27',
});
await addPolicyToIndex(policyName, indexName);
const { body } = await loadPolicies(true);
const fetchedPolicy = body.find((p) => p.name === policyName);
// The index name is dynamically generated as .ds-<indexName>-XXX so we don't check for exact match
expect(fetchedPolicy.linkedIndices[0]).to.contain(indexName);
});
});
describe('create', () => {