Skip to content

Commit

Permalink
[8.14] [Fleet] Fix bulk install package with force flag when package …
Browse files Browse the repository at this point in the history
…is already installed (elastic#184580) (elastic#184593)

# Backport

This will backport the following commits from `main` to `8.14`:
- [[Fleet] Fix bulk install package with force flag when package is
already installed
(elastic#184580)](elastic#184580)

<!--- Backport version: 9.4.3 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Julia
Bardi","email":"[email protected]"},"sourceCommit":{"committedDate":"2024-05-31T14:38:02Z","message":"[Fleet]
Fix bulk install package with force flag when package is already
installed (elastic#184580)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/184491\r\n\r\nSmall fix for
bulk install package API force flag, to allow reinstalling\r\na package
if already installed.\r\n\r\nTo verify:\r\n```\r\n# Install Apache
integration \r\nPOST kbn:/api/fleet/epm/packages/apache\r\n\r\n# Install
older version with force\r\nPOST
kbn:/api/fleet/epm/packages/_bulk\r\n{\r\n \"packages\": [\r\n {\r\n
\"name\": \"apache\",\r\n \"version\": \"1.17.2\"\r\n }\r\n ],\r\n
\"force\": true\r\n}\r\n\r\n# Expect 1.17.2 to be installed\r\n{\r\n
\"items\": [\r\n {\r\n \"name\": \"apache\",\r\n \"version\":
\"1.17.2\",\r\n \"result\": {\r\n \"assets\": [\r\n ...\r\n ],\r\n
\"status\": \"installed\",\r\n \"installType\": \"install\",\r\n
\"installSource\": \"registry\"\r\n }\r\n }\r\n ],\r\n```\r\n\r\n###
Checklist\r\n\r\n- [x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common
scenarios","sha":"3701edc6a2b084009c3073b13f744497faa2f740","branchLabelMapping":{"^v8.15.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","Team:Fleet","backport:prev-minor","v8.15.0"],"title":"[Fleet]
Fix bulk install package with force flag when package is already
installed","number":184580,"url":"https://github.com/elastic/kibana/pull/184580","mergeCommit":{"message":"[Fleet]
Fix bulk install package with force flag when package is already
installed (elastic#184580)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/184491\r\n\r\nSmall fix for
bulk install package API force flag, to allow reinstalling\r\na package
if already installed.\r\n\r\nTo verify:\r\n```\r\n# Install Apache
integration \r\nPOST kbn:/api/fleet/epm/packages/apache\r\n\r\n# Install
older version with force\r\nPOST
kbn:/api/fleet/epm/packages/_bulk\r\n{\r\n \"packages\": [\r\n {\r\n
\"name\": \"apache\",\r\n \"version\": \"1.17.2\"\r\n }\r\n ],\r\n
\"force\": true\r\n}\r\n\r\n# Expect 1.17.2 to be installed\r\n{\r\n
\"items\": [\r\n {\r\n \"name\": \"apache\",\r\n \"version\":
\"1.17.2\",\r\n \"result\": {\r\n \"assets\": [\r\n ...\r\n ],\r\n
\"status\": \"installed\",\r\n \"installType\": \"install\",\r\n
\"installSource\": \"registry\"\r\n }\r\n }\r\n ],\r\n```\r\n\r\n###
Checklist\r\n\r\n- [x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common
scenarios","sha":"3701edc6a2b084009c3073b13f744497faa2f740"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v8.15.0","branchLabelMappingKey":"^v8.15.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/184580","number":184580,"mergeCommit":{"message":"[Fleet]
Fix bulk install package with force flag when package is already
installed (elastic#184580)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/184491\r\n\r\nSmall fix for
bulk install package API force flag, to allow reinstalling\r\na package
if already installed.\r\n\r\nTo verify:\r\n```\r\n# Install Apache
integration \r\nPOST kbn:/api/fleet/epm/packages/apache\r\n\r\n# Install
older version with force\r\nPOST
kbn:/api/fleet/epm/packages/_bulk\r\n{\r\n \"packages\": [\r\n {\r\n
\"name\": \"apache\",\r\n \"version\": \"1.17.2\"\r\n }\r\n ],\r\n
\"force\": true\r\n}\r\n\r\n# Expect 1.17.2 to be installed\r\n{\r\n
\"items\": [\r\n {\r\n \"name\": \"apache\",\r\n \"version\":
\"1.17.2\",\r\n \"result\": {\r\n \"assets\": [\r\n ...\r\n ],\r\n
\"status\": \"installed\",\r\n \"installType\": \"install\",\r\n
\"installSource\": \"registry\"\r\n }\r\n }\r\n ],\r\n```\r\n\r\n###
Checklist\r\n\r\n- [x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common
scenarios","sha":"3701edc6a2b084009c3073b13f744497faa2f740"}}]}]
BACKPORT-->

Co-authored-by: Julia Bardi <[email protected]>
  • Loading branch information
kibanamachine and juliaElastic authored May 31, 2024
1 parent bce3b37 commit 5eb8d60
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ interface BulkInstallPackagesParams {
preferredSource?: 'registry' | 'bundled';
prerelease?: boolean;
authorizationHeader?: HTTPAuthorizationHeader | null;
skipIfInstalled?: boolean;
}

export async function bulkInstallPackages({
Expand All @@ -39,6 +40,7 @@ export async function bulkInstallPackages({
force,
prerelease,
authorizationHeader,
skipIfInstalled,
}: BulkInstallPackagesParams): Promise<BulkInstallResponse[]> {
const logger = appContextService.getLogger();

Expand Down Expand Up @@ -91,28 +93,30 @@ export async function bulkInstallPackages({
}

const pkgKeyProps = result.value;
const installedPackageResult = await isPackageVersionOrLaterInstalled({
savedObjectsClient,
pkgName: pkgKeyProps.name,
pkgVersion: pkgKeyProps.version,
});

if (installedPackageResult) {
const {
name,
version,
installed_es: installedEs,
installed_kibana: installedKibana,
} = installedPackageResult.package;
return {
name,
version,
result: {
assets: [...installedEs, ...installedKibana],
status: 'already_installed',
installType: 'unknown',
} as InstallResult,
};
if (!force || skipIfInstalled) {
const installedPackageResult = await isPackageVersionOrLaterInstalled({
savedObjectsClient,
pkgName: pkgKeyProps.name,
pkgVersion: pkgKeyProps.version,
});

if (installedPackageResult) {
const {
name,
version,
installed_es: installedEs,
installed_kibana: installedKibana,
} = installedPackageResult.package;
return {
name,
version,
result: {
assets: [...installedEs, ...installedKibana],
status: 'already_installed',
installType: 'unknown',
} as InstallResult,
};
}
}

const pkgkey = Registry.pkgToPkgKey(pkgKeyProps);
Expand Down
1 change: 1 addition & 0 deletions x-pack/plugins/fleet/server/services/preconfiguration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ export async function ensurePreconfiguredPackagesAndPolicies(
esClient,
packagesToInstall,
force: true, // Always force outdated packages to be installed if a later version isn't installed
skipIfInstalled: true, // force flag alone would reinstall packages that are already installed
spaceId,
});

Expand Down
24 changes: 22 additions & 2 deletions x-pack/test/fleet_api_integration/apis/epm/bulk_install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,35 @@ export default function (providerContext: FtrProviderContext) {
await uninstallPackage(pkgName, pkgOlderVersion);
});

it('should install an older version if force is true when package is already installed', async () => {
// install latest package
await supertest
.post(`/api/fleet/epm/packages/_bulk?prerelease=true`)
.set('kbn-xsrf', 'xxxx')
.send({ packages: [pkgName] })
.expect(200);

const response = await supertest
.post(`/api/fleet/epm/packages/_bulk?prerelease=true`)
.set('kbn-xsrf', 'xxxx')
.send({ packages: [{ name: pkgName, version: pkgOlderVersion }], force: true })
.expect(200);

expect(response.body.items.length).equal(1);
expect(response.body.items[0].version).equal(pkgOlderVersion);

await uninstallPackage(pkgName, pkgOlderVersion);
});

it('should reject installing an older version if force is false', async () => {
const response = await supertest
.post(`/api/fleet/epm/packages/_bulk?prerelease=true`)
.set('kbn-xsrf', 'xxxx')
.send({ packages: [{ name: pkgName, version: pkgOlderVersion }] })
.expect(200);

expect(response.body.response[0].statusCode).equal(400);
expect(response.body.response[0].error).equal(
expect(response.body.items[0].statusCode).equal(400);
expect(response.body.items[0].error).equal(
'multiple_versions-0.1.0 is out-of-date and cannot be installed or updated'
);
});
Expand Down
1 change: 1 addition & 0 deletions x-pack/test/fleet_api_integration/apis/epm/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default function loadTests({ loadTestFile, getService }) {
loadTestFile(require.resolve('./install_tsds_disable'));
loadTestFile(require.resolve('./install_tag_assets'));
loadTestFile(require.resolve('./bulk_upgrade'));
loadTestFile(require.resolve('./bulk_install'));
loadTestFile(require.resolve('./update_assets'));
loadTestFile(require.resolve('./data_stream'));
loadTestFile(require.resolve('./package_install_complete'));
Expand Down

0 comments on commit 5eb8d60

Please sign in to comment.