Skip to content

Commit 59e96a5

Browse files
authored
add experimental when getting packages, add integration tests for side effects like recreation of index patterns (#81940) (#82016)
1 parent d8544c9 commit 59e96a5

File tree

20 files changed

+267
-1
lines changed

20 files changed

+267
-1
lines changed

x-pack/plugins/ingest_manager/server/services/epm/packages/get.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export async function getPackageKeysByStatus(
8686
savedObjectsClient: SavedObjectsClientContract,
8787
status: InstallationStatus
8888
) {
89-
const allPackages = await getPackages({ savedObjectsClient });
89+
const allPackages = await getPackages({ savedObjectsClient, experimental: true });
9090
return allPackages.reduce<Array<{ pkgName: string; pkgVersion: string }>>((acc, pkg) => {
9191
if (pkg.status === status) {
9292
if (pkg.status === InstallationStatus.installed) {
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import expect from '@kbn/expect';
8+
import { FtrProviderContext } from '../../../api_integration/ftr_provider_context';
9+
import { skipIfNoDockerRegistry } from '../../helpers';
10+
11+
export default function (providerContext: FtrProviderContext) {
12+
const { getService } = providerContext;
13+
const kibanaServer = getService('kibanaServer');
14+
const supertest = getService('supertest');
15+
const dockerServers = getService('dockerServers');
16+
const server = dockerServers.get('registry');
17+
const pkgName = 'all_assets';
18+
const pkgVersion = '0.1.0';
19+
const pkgKey = `${pkgName}-${pkgVersion}`;
20+
const experimentalPkgName = 'experimental';
21+
const experimentalPkgKey = `${experimentalPkgName}-${pkgVersion}`;
22+
const experimental2PkgName = 'experimental2';
23+
const experimental2PkgKey = `${experimental2PkgName}-${pkgVersion}`;
24+
25+
const uninstallPackage = async (pkg: string) => {
26+
await supertest.delete(`/api/fleet/epm/packages/${pkg}`).set('kbn-xsrf', 'xxxx');
27+
};
28+
const installPackage = async (pkg: string) => {
29+
await supertest
30+
.post(`/api/fleet/epm/packages/${pkg}`)
31+
.set('kbn-xsrf', 'xxxx')
32+
.send({ force: true });
33+
};
34+
35+
const installPackages = async (pkgs: string[]) => {
36+
const installingPackagesPromise = pkgs.map((pkg) => installPackage(pkg));
37+
return Promise.all(installingPackagesPromise);
38+
};
39+
const uninstallPackages = async (pkgs: string[]) => {
40+
const uninstallingPackagesPromise = pkgs.map((pkg) => uninstallPackage(pkg));
41+
return Promise.all(uninstallingPackagesPromise);
42+
};
43+
const expectPkgFieldToExist = async (
44+
fields: any[],
45+
fieldName: string,
46+
exists: boolean = true
47+
) => {
48+
const fieldExists = fields.find((field: { name: string }) => field.name === fieldName);
49+
if (exists) {
50+
expect(fieldExists).not.to.be(undefined);
51+
} else {
52+
expect(fieldExists).to.be(undefined);
53+
}
54+
};
55+
describe('installs and uninstalls multiple packages side effects', async () => {
56+
skipIfNoDockerRegistry(providerContext);
57+
before(async () => {
58+
if (!server.enabled) return;
59+
await installPackages([pkgKey, experimentalPkgKey, experimental2PkgKey]);
60+
});
61+
after(async () => {
62+
if (!server.enabled) return;
63+
await uninstallPackages([pkgKey, experimentalPkgKey, experimental2PkgKey]);
64+
});
65+
it('should create index patterns from all installed packages, experimental or beta', async () => {
66+
const resIndexPatternLogs = await kibanaServer.savedObjects.get({
67+
type: 'index-pattern',
68+
id: 'logs-*',
69+
});
70+
71+
const fieldsLogs = JSON.parse(resIndexPatternLogs.attributes.fields);
72+
73+
expectPkgFieldToExist(fieldsLogs, 'logs_test_name');
74+
expectPkgFieldToExist(fieldsLogs, 'logs_experimental_name');
75+
expectPkgFieldToExist(fieldsLogs, 'logs_experimental2_name');
76+
const resIndexPatternMetrics = await kibanaServer.savedObjects.get({
77+
type: 'index-pattern',
78+
id: 'metrics-*',
79+
});
80+
const fieldsMetrics = JSON.parse(resIndexPatternMetrics.attributes.fields);
81+
expectPkgFieldToExist(fieldsMetrics, 'metrics_test_name');
82+
expectPkgFieldToExist(fieldsMetrics, 'metrics_experimental_name');
83+
expectPkgFieldToExist(fieldsMetrics, 'metrics_experimental2_name');
84+
});
85+
it('should correctly recreate index patterns when a package is uninstalled', async () => {
86+
await uninstallPackage(experimental2PkgKey);
87+
const resIndexPatternLogs = await kibanaServer.savedObjects.get({
88+
type: 'index-pattern',
89+
id: 'logs-*',
90+
});
91+
const fields = JSON.parse(resIndexPatternLogs.attributes.fields);
92+
expectPkgFieldToExist(fields, 'logs_test_name');
93+
expectPkgFieldToExist(fields, 'logs_experimental_name');
94+
expectPkgFieldToExist(fields, 'logs_experimental2_name', false);
95+
const resIndexPatternMetrics = await kibanaServer.savedObjects.get({
96+
type: 'index-pattern',
97+
id: 'metrics-*',
98+
});
99+
const fieldsMetrics = JSON.parse(resIndexPatternMetrics.attributes.fields);
100+
101+
expectPkgFieldToExist(fieldsMetrics, 'metrics_test_name');
102+
expectPkgFieldToExist(fieldsMetrics, 'metrics_experimental_name');
103+
expectPkgFieldToExist(fieldsMetrics, 'metrics_experimental2_name', false);
104+
});
105+
});
106+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- name: logs_experimental_name
2+
title: logs_experimental_title
3+
type: keyword
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
- name: data_stream.type
2+
type: constant_keyword
3+
description: >
4+
Data stream type.
5+
- name: data_stream.dataset
6+
type: constant_keyword
7+
description: >
8+
Data stream dataset.
9+
- name: data_stream.namespace
10+
type: constant_keyword
11+
description: >
12+
Data stream namespace.
13+
- name: '@timestamp'
14+
type: date
15+
description: >
16+
Event timestamp.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
title: Test Dataset
2+
3+
type: logs
4+
5+
elasticsearch:
6+
index_template.mappings:
7+
dynamic: false
8+
index_template.settings:
9+
index.lifecycle.name: reference
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- name: metrics_experimental_name
2+
title: metrics_experimental_title
3+
type: keyword
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
- name: data_stream.type
2+
type: constant_keyword
3+
description: >
4+
Data stream type.
5+
- name: data_stream.dataset
6+
type: constant_keyword
7+
description: >
8+
Data stream dataset.
9+
- name: data_stream.namespace
10+
type: constant_keyword
11+
description: >
12+
Data stream namespace.
13+
- name: '@timestamp'
14+
type: date
15+
description: >
16+
Event timestamp.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
title: Test Dataset
2+
3+
type: metrics
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Test package
2+
3+
For testing side effects when installing and removing multiple packages
Lines changed: 7 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)