[Fleet] Add prerelease option to preconfigured package (#172399)

This commit is contained in:
Nicolas Chaulet 2023-12-04 14:17:08 -05:00 committed by GitHub
parent 7afcc820ee
commit 2fe91d32b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 62 additions and 10 deletions

View file

@ -33,7 +33,9 @@ export interface PreconfiguredAgentPolicy extends Omit<NewAgentPolicy, 'namespac
>;
}
export type PreconfiguredPackage = Omit<PackagePolicyPackage, 'title'>;
export interface PreconfiguredPackage extends Omit<PackagePolicyPackage, 'title'> {
prerelease?: boolean;
}
export interface PreconfiguredOutput extends Omit<Output, 'config_yaml'> {
config?: Record<string, unknown>;

View file

@ -19,7 +19,7 @@ import type { BulkInstallResponse, IBulkInstallPackageError } from './install';
interface BulkInstallPackagesParams {
savedObjectsClient: SavedObjectsClientContract;
packagesToInstall: Array<string | { name: string; version: string }>;
packagesToInstall: Array<string | { name: string; version?: string; prerelease?: boolean }>;
esClient: ElasticsearchClient;
force?: boolean;
spaceId: string;
@ -41,11 +41,26 @@ export async function bulkInstallPackages({
const packagesResults = await Promise.allSettled(
packagesToInstall.map(async (pkg) => {
if (typeof pkg !== 'string') {
return Promise.resolve(pkg);
if (typeof pkg === 'string') {
return Registry.fetchFindLatestPackageOrThrow(pkg, {
prerelease,
}).then((pkgRes) => ({
name: pkgRes.name,
version: pkgRes.version,
prerelease: undefined,
}));
}
if (pkg.version !== undefined) {
return Promise.resolve(pkg as { name: string; version: string; prerelease?: boolean });
}
return Registry.fetchFindLatestPackageOrThrow(pkg, { prerelease });
return Registry.fetchFindLatestPackageOrThrow(pkg.name, {
prerelease: prerelease || pkg.prerelease,
}).then((pkgRes) => ({
name: pkgRes.name,
version: pkgRes.version,
prerelease: pkg.prerelease,
}));
})
);
@ -97,7 +112,7 @@ export async function bulkInstallPackages({
installSource: 'registry',
spaceId,
force,
prerelease,
prerelease: prerelease || ('prerelease' in pkgKeyProps && pkgKeyProps.prerelease),
authorizationHeader,
});

View file

@ -122,10 +122,18 @@ function getPutPreconfiguredPackagesMock() {
jest.mock('./epm/registry', () => ({
...jest.requireActual('./epm/registry'),
async fetchFindLatestPackageOrThrow(packageName: string): Promise<RegistrySearchResult> {
async fetchFindLatestPackageOrThrow(
packageName: string,
options?: { prerelease?: boolean }
): Promise<RegistrySearchResult> {
let latestVersion = '1.0.0';
if (options?.prerelease && packageName === 'test_package') {
latestVersion = '3.0.1-beta.1';
}
return {
name: packageName,
version: '1.0.0',
version: latestVersion,
description: '',
release: 'experimental',
title: '',
@ -368,6 +376,25 @@ describe('policy preconfiguration', () => {
expect(nonFatalErrors.length).toBe(0);
});
it('should install prelease packages if needed', async () => {
const soClient = getPutPreconfiguredPackagesMock();
const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser;
const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies(
soClient,
esClient,
[] as PreconfiguredAgentPolicy[],
[{ name: 'test_package', version: 'latest', prerelease: true }],
mockDefaultOutput,
mockDefaultDownloadService,
DEFAULT_SPACE_ID
);
expect(policies.length).toEqual(0);
expect(packages).toEqual(expect.arrayContaining(['test_package-3.0.1-beta.1']));
expect(nonFatalErrors.length).toBe(0);
});
it('should not add new package policy to existing non managed policies', async () => {
const soClient = getPutPreconfiguredPackagesMock();
const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser;

View file

@ -78,8 +78,11 @@ export async function ensurePreconfiguredPackagesAndPolicies(
}
const packagesToInstall = packages.map((pkg) =>
pkg.version === PRECONFIGURATION_LATEST_KEYWORD ? pkg.name : pkg
pkg.version === PRECONFIGURATION_LATEST_KEYWORD
? { name: pkg.name, prerelease: pkg.prerelease }
: pkg
);
// Preinstall packages specified in Kibana config
const preconfiguredPackages = await bulkInstallPackages({
savedObjectsClient: soClient,

View file

@ -39,6 +39,7 @@ export const PreconfiguredPackagesSchema = schema.arrayOf(
}
},
}),
prerelease: schema.maybe(schema.boolean()),
}),
{
defaultValue: [],

View file

@ -186,7 +186,11 @@ export const BulkInstallPackagesFromRegistryRequestSchema = {
packages: schema.arrayOf(
schema.oneOf([
schema.string(),
schema.object({ name: schema.string(), version: schema.string() }),
schema.object({
name: schema.string(),
version: schema.string(),
prerelease: schema.maybe(schema.boolean()),
}),
]),
{ minSize: 1 }
),