From f8408eeb7a4fcdd736eda0cdaa1636bfb5b46286 Mon Sep 17 00:00:00 2001
From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com>
Date: Fri, 5 Jan 2024 16:37:40 +0100
Subject: [PATCH] [Fleet] add kibana version if air gapped or product versions
doesn't return (#174324)
## Summary
Closes https://github.com/elastic/ingest-dev/issues/2779
Adding the kibana version to the list of available agent versions if the
product versions api doesn't return any versions (not accessible or
airgapped environment). This is a best effort fix to add the missing
latest released version if the build version list is outdated.
To verify:
1. test with internet connection
- enroll an agent with the latest version 8.11.3 locally or in a VM (not
container)
- check that the upgrade available badge is not showing up and the add
agent instructions have 8.11.3 version
Restart kibana or wait 10m for the cache to expire before testing with
air gapped.
2. test air-gapped by adding `xpack.fleet.isAirGapped: true` in
kibana.yml
- test that the agent shows up with the badge upgrade available, and the
upgrade agent modal has 8.13 version locally
- check that the add agent instructions have the 8.13 version (current
kibana version)
### Checklist
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
---
.../fleet/server/services/agents/versions.test.ts | 8 ++++----
.../plugins/fleet/server/services/agents/versions.ts | 11 ++++++-----
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/x-pack/plugins/fleet/server/services/agents/versions.test.ts b/x-pack/plugins/fleet/server/services/agents/versions.test.ts
index 9f8a5091e3ee2..85ac760614c49 100644
--- a/x-pack/plugins/fleet/server/services/agents/versions.test.ts
+++ b/x-pack/plugins/fleet/server/services/agents/versions.test.ts
@@ -137,7 +137,7 @@ describe('getAvailableVersions', () => {
});
it('should cache results', async () => {
- mockKibanaVersion = '300.0.0';
+ mockKibanaVersion = '9.0.0';
mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`);
mockedFetch.mockResolvedValueOnce({
status: 200,
@@ -195,7 +195,7 @@ describe('getAvailableVersions', () => {
const res = await getAvailableVersions({ ignoreCache: true });
// Should sort, uniquify and filter out versions < 7.17
- expect(res).toEqual(['8.1.0', '8.0.0', '7.17.0']);
+ expect(res).toEqual(['300.0.0', '8.1.0', '8.0.0', '7.17.0']);
});
it('should gracefully handle network errors when fetching from product versions API', async () => {
@@ -206,7 +206,7 @@ describe('getAvailableVersions', () => {
const res = await getAvailableVersions({ ignoreCache: true });
// Should sort, uniquify and filter out versions < 7.17
- expect(res).toEqual(['8.1.0', '8.0.0', '7.17.0']);
+ expect(res).toEqual(['300.0.0', '8.1.0', '8.0.0', '7.17.0']);
});
it('should not fetch from product versions API when air-gapped config is set', async () => {
@@ -216,7 +216,7 @@ describe('getAvailableVersions', () => {
mockConfig = { isAirGapped: true };
const res = await getAvailableVersions({ ignoreCache: true });
- expect(res).toEqual(['8.1.0', '8.0.0', '7.17.0']);
+ expect(res).toEqual(['300.0.0', '8.1.0', '8.0.0', '7.17.0']);
expect(mockedFetch).not.toBeCalled();
});
});
diff --git a/x-pack/plugins/fleet/server/services/agents/versions.ts b/x-pack/plugins/fleet/server/services/agents/versions.ts
index 39941e2d38fc9..de295a588bee9 100644
--- a/x-pack/plugins/fleet/server/services/agents/versions.ts
+++ b/x-pack/plugins/fleet/server/services/agents/versions.ts
@@ -88,11 +88,12 @@ export const getAvailableVersions = async ({
.filter((v: any) => semverGte(v, MINIMUM_SUPPORTED_VERSION))
.sort((a: any, b: any) => (semverGt(a, b) ? -1 : 1));
- // If the current stack version isn't included in the list of available versions, add it
- // at the front of the array
- const hasCurrentVersion = availableVersions.some((v) => v === kibanaVersion);
- if (includeCurrentVersion && !hasCurrentVersion) {
- availableVersions = [kibanaVersion, ...availableVersions];
+ // if api versions are empty (air gapped or API not available), we add current kibana version, as the build file might not contain the latest released version
+ if (
+ includeCurrentVersion ||
+ (apiVersions.length === 0 && !config?.internal?.onlyAllowAgentUpgradeToKnownVersions)
+ ) {
+ availableVersions = uniq([kibanaVersion, ...availableVersions]);
}
// Allow upgrading to the current stack version if this override flag is provided via `kibana.yml`.