Skip to content

Commit f8984ec

Browse files
authored
[Index Management] Branch data streams api tests lifecycle validation (elastic#241105)
Fixes elastic#187372 ## Summary The Data Stream serverless tests were failing in MKI for Security because Security MKI enforces a default project-level retention. This PR splits the ds test into three files: one for common tests, one for serverless tests (`skipMKI`) and one for MKI (`['skipSvlWorkplaceAI', 'skipSvlOblt', 'skipSvlSearch', 'skipSvlSec']`). In MKI, the tests assert is different if the project is Security or not. Testes locally in MKI Security and Observability. Flaky tes runner: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/9657
1 parent 221078a commit f8984ec

File tree

4 files changed

+375
-105
lines changed

4 files changed

+375
-105
lines changed

x-pack/platform/test/serverless/api_integration/test_suites/index_management/datastreams.ts renamed to x-pack/platform/test/serverless/api_integration/test_suites/index_management/datastreams/ds_common.ts

Lines changed: 4 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77

88
import expect from '@kbn/expect';
99

10-
import type { DataStream } from '@kbn/index-management-plugin/common';
11-
import type { FtrProviderContext } from '../../ftr_provider_context';
12-
import type { InternalRequestHeader, RoleCredentials } from '../../../shared/services';
10+
import type { FtrProviderContext } from '../../../ftr_provider_context';
11+
import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services';
1312

1413
const API_BASE_PATH = '/api/index_management';
1514

@@ -23,121 +22,21 @@ export default function ({ getService }: FtrProviderContext) {
2322
const supertest = getService('supertest');
2423
const es = getService('es');
2524

26-
describe('Data streams', function () {
27-
// see details: https://github.com/elastic/kibana/issues/187372
28-
this.tags(['failsOnMKI']);
25+
describe('Data streams common', function () {
2926
before(async () => {
3027
roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin');
3128
internalReqHeader = svlCommonApi.getInternalRequestHeader();
3229
});
3330
after(async () => {
3431
await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc);
3532
});
33+
3634
describe('Get', () => {
3735
const testDataStreamName = 'test-data-stream';
3836

3937
before(async () => await svlDatastreamsHelpers.createDataStream(testDataStreamName));
4038
after(async () => await svlDatastreamsHelpers.deleteDataStream(testDataStreamName));
4139

42-
it('returns an array of data streams', async () => {
43-
const { body: dataStreams, status } = await supertestWithoutAuth
44-
.get(`${API_BASE_PATH}/data_streams`)
45-
.set(internalReqHeader)
46-
.set(roleAuthc.apiKeyHeader);
47-
48-
svlCommonApi.assertResponseStatusCode(200, status, dataStreams);
49-
50-
expect(dataStreams).to.be.an('array');
51-
52-
// returned array can contain automatically created data streams
53-
const testDataStream = dataStreams.find(
54-
(dataStream: DataStream) => dataStream.name === testDataStreamName
55-
);
56-
57-
expect(testDataStream).to.be.ok();
58-
59-
// ES determines these values so we'll just echo them back.
60-
const { name: indexName, uuid } = testDataStream!.indices[0];
61-
62-
expect(testDataStream).to.eql({
63-
name: testDataStreamName,
64-
lifecycle: {
65-
enabled: true,
66-
},
67-
privileges: {
68-
delete_index: true,
69-
manage_data_stream_lifecycle: true,
70-
read_failure_store: true,
71-
},
72-
timeStampField: { name: '@timestamp' },
73-
indices: [
74-
{
75-
name: indexName,
76-
uuid,
77-
preferILM: true,
78-
managedBy: 'Data stream lifecycle',
79-
},
80-
],
81-
nextGenerationManagedBy: 'Data stream lifecycle',
82-
generation: 1,
83-
health: 'green',
84-
indexTemplateName: testDataStreamName,
85-
hidden: false,
86-
failureStoreEnabled: false,
87-
indexMode: 'standard',
88-
failureStoreRetention: {
89-
defaultRetentionPeriod: '30d',
90-
},
91-
});
92-
});
93-
94-
it('returns a single data stream by ID', async () => {
95-
const { body: dataStream, status } = await supertestWithoutAuth
96-
.get(`${API_BASE_PATH}/data_streams/${testDataStreamName}`)
97-
.set(internalReqHeader)
98-
.set(roleAuthc.apiKeyHeader);
99-
100-
svlCommonApi.assertResponseStatusCode(200, status, dataStream);
101-
102-
// ES determines these values so we'll just echo them back.
103-
const { name: indexName, uuid } = dataStream.indices[0];
104-
const { storageSize, storageSizeBytes, ...dataStreamWithoutStorageSize } = dataStream;
105-
106-
expect(dataStreamWithoutStorageSize).to.eql({
107-
name: testDataStreamName,
108-
privileges: {
109-
delete_index: true,
110-
manage_data_stream_lifecycle: true,
111-
read_failure_store: true,
112-
},
113-
timeStampField: { name: '@timestamp' },
114-
indices: [
115-
{
116-
name: indexName,
117-
managedBy: 'Data stream lifecycle',
118-
preferILM: true,
119-
uuid,
120-
},
121-
],
122-
generation: 1,
123-
health: 'green',
124-
indexTemplateName: testDataStreamName,
125-
nextGenerationManagedBy: 'Data stream lifecycle',
126-
hidden: false,
127-
lifecycle: {
128-
enabled: true,
129-
},
130-
meteringDocsCount: 0,
131-
meteringStorageSize: '0b',
132-
meteringStorageSizeBytes: 0,
133-
failureStoreEnabled: false,
134-
indexMode: 'standard',
135-
failureStoreRetention: {
136-
defaultRetentionPeriod: '30d',
137-
},
138-
});
139-
});
140-
14140
describe('index mode of logs-*-* data streams', () => {
14241
const logsdbDataStreamName = 'logs-test-ds';
14342

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
import expect from '@kbn/expect';
9+
10+
import type { DataStream } from '@kbn/index-management-plugin/common';
11+
import getopts from 'getopts';
12+
import type { ServerlessProjectType } from '@kbn/es';
13+
import type { FtrProviderContext } from '../../../ftr_provider_context';
14+
import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services';
15+
16+
const API_BASE_PATH = '/api/index_management';
17+
18+
export default function ({ getService }: FtrProviderContext) {
19+
const svlCommonApi = getService('svlCommonApi');
20+
const svlUserManager = getService('svlUserManager');
21+
const supertestWithoutAuth = getService('supertestWithoutAuth');
22+
let roleAuthc: RoleCredentials;
23+
let internalReqHeader: InternalRequestHeader;
24+
const config = getService('config');
25+
const svlDatastreamsHelpers = getService('svlDatastreamsHelpers');
26+
27+
const options = getopts(config.get('kbnTestServer.serverArgs'));
28+
const projectType = options.serverless as ServerlessProjectType;
29+
30+
describe('Data streams MKI', function () {
31+
this.tags(['skipSvlWorkplaceAI', 'skipSvlOblt', 'skipSvlSearch', 'skipSvlSec']);
32+
33+
const testDataStreamName = 'test-data-stream';
34+
before(async () => {
35+
roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin');
36+
internalReqHeader = svlCommonApi.getInternalRequestHeader();
37+
await svlDatastreamsHelpers.createDataStream(testDataStreamName);
38+
});
39+
after(async () => {
40+
await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc);
41+
await svlDatastreamsHelpers.deleteDataStream(testDataStreamName);
42+
});
43+
it('returns an array of data streams', async () => {
44+
const { body: dataStreams, status } = await supertestWithoutAuth
45+
.get(`${API_BASE_PATH}/data_streams`)
46+
.set(internalReqHeader)
47+
.set(roleAuthc.apiKeyHeader);
48+
49+
svlCommonApi.assertResponseStatusCode(200, status, dataStreams);
50+
51+
expect(dataStreams).to.be.an('array');
52+
53+
// returned array can contain automatically created data streams
54+
const testDataStream = dataStreams.find(
55+
(dataStream: DataStream) => dataStream.name === testDataStreamName
56+
);
57+
58+
expect(testDataStream).to.be.ok();
59+
60+
// ES determines these values so we'll just echo them back.
61+
const { name: indexName, uuid } = testDataStream!.indices[0];
62+
63+
// Security MKI enforces a default project-level retention. Since we don't have a way of determining the project type, we'll just check for both cases.
64+
if (projectType === 'security') {
65+
expect(testDataStream).to.eql({
66+
name: testDataStreamName,
67+
lifecycle: {
68+
enabled: true,
69+
effective_retention: '396d',
70+
globalMaxRetention: '396d',
71+
retention_determined_by: 'default_global_retention',
72+
},
73+
privileges: {
74+
delete_index: true,
75+
manage_data_stream_lifecycle: true,
76+
read_failure_store: true,
77+
},
78+
timeStampField: { name: '@timestamp' },
79+
indices: [
80+
{
81+
name: indexName,
82+
uuid,
83+
preferILM: true,
84+
managedBy: 'Data stream lifecycle',
85+
},
86+
],
87+
nextGenerationManagedBy: 'Data stream lifecycle',
88+
generation: 1,
89+
health: 'green',
90+
indexTemplateName: testDataStreamName,
91+
hidden: false,
92+
failureStoreEnabled: false,
93+
indexMode: 'standard',
94+
failureStoreRetention: {
95+
defaultRetentionPeriod: '30d',
96+
},
97+
});
98+
} else {
99+
expect(testDataStream).to.eql({
100+
name: testDataStreamName,
101+
lifecycle: {
102+
enabled: true,
103+
},
104+
privileges: {
105+
delete_index: true,
106+
manage_data_stream_lifecycle: true,
107+
read_failure_store: true,
108+
},
109+
timeStampField: { name: '@timestamp' },
110+
indices: [
111+
{
112+
name: indexName,
113+
uuid,
114+
preferILM: true,
115+
managedBy: 'Data stream lifecycle',
116+
},
117+
],
118+
nextGenerationManagedBy: 'Data stream lifecycle',
119+
generation: 1,
120+
health: 'green',
121+
indexTemplateName: testDataStreamName,
122+
hidden: false,
123+
failureStoreEnabled: false,
124+
indexMode: 'standard',
125+
failureStoreRetention: {
126+
defaultRetentionPeriod: '30d',
127+
},
128+
});
129+
}
130+
});
131+
132+
it('returns a single data stream by ID', async () => {
133+
const { body: dataStream, status } = await supertestWithoutAuth
134+
.get(`${API_BASE_PATH}/data_streams/${testDataStreamName}`)
135+
.set(internalReqHeader)
136+
.set(roleAuthc.apiKeyHeader);
137+
138+
svlCommonApi.assertResponseStatusCode(200, status, dataStream);
139+
140+
// ES determines these values so we'll just echo them back.
141+
const { name: indexName, uuid } = dataStream.indices[0];
142+
const { storageSize, storageSizeBytes, ...dataStreamWithoutStorageSize } = dataStream;
143+
144+
// Security MKI enforces a default project-level retention. Since we don't have a way of determining the project type, we'll just check for both cases.
145+
if (projectType === 'security') {
146+
expect(dataStreamWithoutStorageSize).to.eql({
147+
name: testDataStreamName,
148+
privileges: {
149+
delete_index: true,
150+
manage_data_stream_lifecycle: true,
151+
read_failure_store: true,
152+
},
153+
timeStampField: { name: '@timestamp' },
154+
indices: [
155+
{
156+
name: indexName,
157+
managedBy: 'Data stream lifecycle',
158+
preferILM: true,
159+
uuid,
160+
},
161+
],
162+
generation: 1,
163+
health: 'green',
164+
indexTemplateName: testDataStreamName,
165+
nextGenerationManagedBy: 'Data stream lifecycle',
166+
hidden: false,
167+
lifecycle: {
168+
enabled: true,
169+
effective_retention: '396d',
170+
globalMaxRetention: '396d',
171+
retention_determined_by: 'default_global_retention',
172+
},
173+
meteringDocsCount: 0,
174+
meteringStorageSize: '0b',
175+
meteringStorageSizeBytes: 0,
176+
failureStoreEnabled: false,
177+
indexMode: 'standard',
178+
failureStoreRetention: {
179+
defaultRetentionPeriod: '30d',
180+
},
181+
});
182+
} else {
183+
expect(dataStreamWithoutStorageSize).to.eql({
184+
name: testDataStreamName,
185+
privileges: {
186+
delete_index: true,
187+
manage_data_stream_lifecycle: true,
188+
read_failure_store: true,
189+
},
190+
timeStampField: { name: '@timestamp' },
191+
indices: [
192+
{
193+
name: indexName,
194+
managedBy: 'Data stream lifecycle',
195+
preferILM: true,
196+
uuid,
197+
},
198+
],
199+
generation: 1,
200+
health: 'green',
201+
indexTemplateName: testDataStreamName,
202+
nextGenerationManagedBy: 'Data stream lifecycle',
203+
hidden: false,
204+
lifecycle: {
205+
enabled: true,
206+
},
207+
meteringDocsCount: 0,
208+
meteringStorageSize: '0b',
209+
meteringStorageSizeBytes: 0,
210+
failureStoreEnabled: false,
211+
indexMode: 'standard',
212+
failureStoreRetention: {
213+
defaultRetentionPeriod: '30d',
214+
},
215+
});
216+
}
217+
});
218+
});
219+
}

0 commit comments

Comments
 (0)