Skip to content

Commit

Permalink
Merge pull request #7180 from jandubois/kube-1.21
Browse files Browse the repository at this point in the history
Raise minimum supported Kubernetes version from 1.15.0 → 1.21.0
  • Loading branch information
jandubois authored Jul 17, 2024
2 parents cd4a74a + f19bd02 commit f4913fc
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 120 deletions.
2 changes: 1 addition & 1 deletion pkg/rancher-desktop/assets/lima-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ provision:
script: |
#!/bin/sh
set -o errexit -o nounset -o xtrace
[[ "${RC_CGROUP_MODE:-}" =~ "unified|hybrid|legacy" ]] || exit 0
RC_CGROUP_MODE=unified
if ! grep -q -E "^#?rc_cgroup_mode=\"$RC_CGROUP_MODE\"" /etc/rc.conf; then
sed -i -E "s/^#?rc_cgroup_mode=\".*\"/rc_cgroup_mode=\"$RC_CGROUP_MODE\"/" /etc/rc.conf
# avoid reboot loop if sed failed for any reason
Expand Down
160 changes: 95 additions & 65 deletions pkg/rancher-desktop/backend/__tests__/k3sHelper.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import fetch from 'node-fetch';
import semver from 'semver';

import K3sHelper, {
buildVersion, ChannelMapping, NoCachedK3sVersionsError, ReleaseAPIEntry, VersionEntry,
buildVersion, ChannelMapping, firstStableVersion, NoCachedK3sVersionsError, ReleaseAPIEntry, VersionEntry,
} from '../k3sHelper';

import * as K8s from '@pkg/backend/k8s';
import paths from '@pkg/utils/paths';

const cachePath = path.join(paths.cache, 'k3s-versions.json');
Expand Down Expand Up @@ -47,11 +48,11 @@ beforeEach(() => {

describe(buildVersion, () => {
test('parses the build number', () => {
expect(buildVersion(new semver.SemVer('v1.2.3+k3s4'))).toEqual(4);
expect(buildVersion(new semver.SemVer('v1.99.3+k3s4'))).toEqual(4);
});

test('handles non-conforming versions', () => {
expect(buildVersion(new semver.SemVer('v1.2.3'))).toEqual(-1);
expect(buildVersion(new semver.SemVer('v1.99.3'))).toEqual(-1);
});
});

Expand Down Expand Up @@ -91,31 +92,31 @@ describe(K3sHelper, () => {
expect(await subject.availableVersions).toHaveLength(0);
});
it('should skip prereleases', async() => {
expect(process('1.2.3-beta1')).toEqual(true);
expect(process('1.99.3-beta1')).toEqual(true);
expect(await subject.availableVersions).toHaveLength(0);
});
it('should skip valid but erroneous versions', async() => {
expect(process('1.2.3+rk3s1')).toEqual(true);
expect(process('1.99.3+rk3s1')).toEqual(true);
expect(await subject.availableVersions).toHaveLength(0);
});
it('should ignore old versions', async() => {
expect(process('0.2.0')).toEqual(true);
expect(process('1.2.0')).toEqual(true);
expect(await subject.availableVersions).toHaveLength(0);
});
it('should ignore obsolete builds', async() => {
expect(process('1.2.3_k3s4', ['1.2.3+k3s5'])).toEqual(true);
expect(process('1.99.3+k3s4', ['1.99.3+k3s5'])).toEqual(true);
expect(await subject.availableVersions).toHaveLength(1);
});
it('should ignore existing builds', async() => {
expect(process('1.2.3+k3s4', ['1.2.3+k3s4'])).toEqual(false);
expect(process('1.99.3+k3s4', ['1.99.3+k3s4'])).toEqual(false);
expect(await subject.availableVersions).toHaveLength(1);
});
it('should ignore versions with missing assets', async() => {
expect(process('1.2.3+k3s4')).toEqual(true);
expect(process('1.99.3+k3s4')).toEqual(true);
expect(await subject.availableVersions).toHaveLength(0);
});
it('should add versions', async() => {
expect(process('1.2.3+k3s4', [], true)).toEqual(true);
expect(process('1.99.3+k3s4', [], true)).toEqual(true);
expect(await subject.availableVersions).toHaveLength(1);
});
});
Expand All @@ -124,8 +125,8 @@ describe(K3sHelper, () => {
const subject = new K3sHelper('x86_64');
const workDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'rd-test-cache-'));
const versions: Record<string, VersionEntry> = {
'1.2.3': new VersionEntry(semver.parse('1.2.3+k3s1') as semver.SemVer, ['stable']),
'2.3.4': new VersionEntry(semver.parse('2.3.4+k3s3') as semver.SemVer),
'1.99.3': new VersionEntry(semver.parse('1.99.3+k3s1') as semver.SemVer, ['stable']),
'2.3.4': new VersionEntry(semver.parse('2.3.4+k3s3') as semver.SemVer),
};
const versionStrings = Object.values(versions)
.map(v => v.version)
Expand All @@ -143,7 +144,7 @@ describe(K3sHelper, () => {

expect(actual).toHaveProperty('cacheVersion');
expect(semver.sort(actualStrings)).toEqual(versionStrings);
expect(channels).toEqual({ stable: '1.2.3' });
expect(channels).toEqual({ stable: '1.99.3' });

// Check that we can load the values back properly
subject['versions'] = {};
Expand Down Expand Up @@ -173,8 +174,8 @@ describe(K3sHelper, () => {
const result = new ChannelMapping();

for (const [version, tags] of Object.entries({
'v1.2.1+k3s1': ['stale-tag'],
'v1.2.3+k3s1': ['stable'],
'v1.99.1+k3s1': ['stale-tag'],
'v1.99.3+k3s1': ['stable'],
})) {
const parsedVersion = new semver.SemVer(version);

Expand All @@ -199,7 +200,7 @@ describe(K3sHelper, () => {
JSON.stringify({
data: [{
name: 'stable',
latest: 'v1.2.3+k3s3',
latest: 'v1.99.3+k3s3',
}],
}),
));
Expand All @@ -209,12 +210,12 @@ describe(K3sHelper, () => {

return Promise.resolve(new FetchResponse(
JSON.stringify([
{ tag_name: 'v1.2.3+k3s2', assets: validAssets },
{ tag_name: 'v1.2.3+k3s3', assets: validAssets },
{ tag_name: 'v1.99.3+k3s2', assets: validAssets },
{ tag_name: 'v1.99.3+k3s3', assets: validAssets },
// The next one is skipped because there's a newer build
{ tag_name: 'v1.2.3+k3s1', assets: validAssets },
{ tag_name: 'v1.2.4+k3s1', assets: [] },
{ tag_name: 'v1.2.1+k3s2', assets: validAssets },
{ tag_name: 'v1.99.3+k3s1', assets: validAssets },
{ tag_name: 'v1.99.4+k3s1', assets: [] },
{ tag_name: 'v1.99.1+k3s2', assets: validAssets },
]),
{ headers: { link: '<url>; rel="next"' } },
));
Expand All @@ -233,7 +234,7 @@ describe(K3sHelper, () => {
return Promise.resolve(new FetchResponse(
JSON.stringify([
{ tag_name: 'Invalid tag name', assets: validAssets },
{ tag_name: 'v1.2.0+k3s5', assets: validAssets },
{ tag_name: 'v1.99.0+k3s5', assets: validAssets },
]),
{ headers: { link: '<url>; rel="first"' } },
));
Expand All @@ -249,9 +250,9 @@ describe(K3sHelper, () => {
expect(fetch).toHaveBeenCalledTimes(4);
expect(subject['delayForWaitLimiting']).toHaveBeenCalledTimes(1);
expect(await subject.availableVersions).toEqual([
new VersionEntry(new semver.SemVer('v1.2.3+k3s3'), ['stable']),
new VersionEntry(new semver.SemVer('v1.2.1+k3s2')),
new VersionEntry(new semver.SemVer('v1.2.0+k3s5')),
new VersionEntry(new semver.SemVer('v1.99.3+k3s3'), ['stable']),
new VersionEntry(new semver.SemVer('v1.99.1+k3s2')),
new VersionEntry(new semver.SemVer('v1.99.0+k3s5')),
]);
});

Expand All @@ -274,15 +275,15 @@ describe(K3sHelper, () => {
const result = new ChannelMapping();

for (const [version, tags] of Object.entries({
'v1.26.0+k3s2': [],
'v1.26.1+k3s1': [],
'v1.26.2+k3s1': [],
'v1.26.3+k3s1': ['v1.26', 'stable'],
'v1.27.1+k3s1': [],
'v1.27.2+k3s1': [],
'v1.27.3+k3s1': [],
'v1.27.4+k3s1': [],
'v1.27.5+k3s1': ['v1.27', 'latest'],
'v1.96.0+k3s2': [],
'v1.96.1+k3s1': [],
'v1.96.2+k3s1': [],
'v1.96.3+k3s1': ['v1.96', 'stable'],
'v1.97.1+k3s1': [],
'v1.97.2+k3s1': [],
'v1.97.3+k3s1': [],
'v1.97.4+k3s1': [],
'v1.97.5+k3s1': ['v1.97', 'latest'],
})) {
const parsedVersion = new semver.SemVer(version);

Expand All @@ -293,10 +294,10 @@ describe(K3sHelper, () => {
}

subject['versionFromChannel'] = {
stable: '1.26.3',
latest: '1.27.5',
'v1.26': '1.26.3',
'v1.27': '1.27.5',
stable: '1.96.3',
latest: '1.97.5',
'v1.96': '1.96.3',
'v1.97': '1.97.5',
};

return Promise.resolve(result);
Expand All @@ -311,11 +312,11 @@ describe(K3sHelper, () => {
return Promise.resolve(new FetchResponse(
JSON.stringify({
data: [
{ name: 'v1.26', latest: '1.26.9+k3s1' },
{ name: 'v1.27', latest: '1.27.7+k3s1' },
{ name: 'stable', latest: '1.27.7+k3s1' },
{ name: 'latest', latest: '1.28.3+k3s1' },
{ name: 'v1.28', latest: '1.28.3+k3s1' },
{ name: 'v1.96', latest: '1.96.9+k3s1' },
{ name: 'v1.97', latest: '1.97.7+k3s1' },
{ name: 'stable', latest: '1.97.7+k3s1' },
{ name: 'latest', latest: '1.98.3+k3s1' },
{ name: 'v1.98', latest: '1.98.3+k3s1' },
],
}),
));
Expand All @@ -325,11 +326,11 @@ describe(K3sHelper, () => {

return Promise.resolve(new FetchResponse(
JSON.stringify([
{ tag_name: 'v1.28.3+k3s2', assets: validAssets },
{ tag_name: 'v1.28.2+k3s2', assets: validAssets },
{ tag_name: 'v1.28.1+k3s2', assets: validAssets },
{ tag_name: 'v1.27.7+k3s2', assets: validAssets },
{ tag_name: 'v1.27.6+k3s1', assets: validAssets },
{ tag_name: 'v1.98.3+k3s2', assets: validAssets },
{ tag_name: 'v1.98.2+k3s2', assets: validAssets },
{ tag_name: 'v1.98.1+k3s2', assets: validAssets },
{ tag_name: 'v1.97.7+k3s2', assets: validAssets },
{ tag_name: 'v1.97.6+k3s1', assets: validAssets },
]),
{ headers: { link: '<url>; rel="first"' } },
));
Expand All @@ -346,28 +347,28 @@ describe(K3sHelper, () => {
const availableVersions = await subject.availableVersions;

expect(availableVersions).toEqual([
new VersionEntry(new semver.SemVer('v1.28.3+k3s2'), ['latest', 'v1.28']),
new VersionEntry(new semver.SemVer('v1.28.2+k3s2')),
new VersionEntry(new semver.SemVer('v1.28.1+k3s2')),
new VersionEntry(new semver.SemVer('v1.27.7+k3s2'), ['stable', 'v1.27']),
new VersionEntry(new semver.SemVer('v1.27.6+k3s1')),
new VersionEntry(new semver.SemVer('v1.27.5+k3s1')),
new VersionEntry(new semver.SemVer('v1.27.4+k3s1')),
new VersionEntry(new semver.SemVer('v1.27.3+k3s1')),
new VersionEntry(new semver.SemVer('v1.27.2+k3s1')),
new VersionEntry(new semver.SemVer('v1.27.1+k3s1')),
new VersionEntry(new semver.SemVer('v1.26.3+k3s1'), ['v1.26']),
new VersionEntry(new semver.SemVer('v1.26.2+k3s1')),
new VersionEntry(new semver.SemVer('v1.26.1+k3s1')),
new VersionEntry(new semver.SemVer('v1.26.0+k3s2')),
new VersionEntry(new semver.SemVer('v1.98.3+k3s2'), ['latest', 'v1.98']),
new VersionEntry(new semver.SemVer('v1.98.2+k3s2')),
new VersionEntry(new semver.SemVer('v1.98.1+k3s2')),
new VersionEntry(new semver.SemVer('v1.97.7+k3s2'), ['stable', 'v1.97']),
new VersionEntry(new semver.SemVer('v1.97.6+k3s1')),
new VersionEntry(new semver.SemVer('v1.97.5+k3s1')),
new VersionEntry(new semver.SemVer('v1.97.4+k3s1')),
new VersionEntry(new semver.SemVer('v1.97.3+k3s1')),
new VersionEntry(new semver.SemVer('v1.97.2+k3s1')),
new VersionEntry(new semver.SemVer('v1.97.1+k3s1')),
new VersionEntry(new semver.SemVer('v1.96.3+k3s1'), ['v1.96']),
new VersionEntry(new semver.SemVer('v1.96.2+k3s1')),
new VersionEntry(new semver.SemVer('v1.96.1+k3s1')),
new VersionEntry(new semver.SemVer('v1.96.0+k3s2')),
]);
});

describe('initialize', () => {
it('should finish initialize without network if cache is available', async() => {
const writer = new K3sHelper('x86_64');

writer['versions'] = { 'v1.0.0': new VersionEntry(new semver.SemVer('v1.0.0')) };
writer['versions'] = { 'v1.99.0': new VersionEntry(new semver.SemVer('v1.99.0')) };
await writer['writeCache']();

// We want to check that initialize() returns before updateCache() does.
Expand All @@ -385,7 +386,7 @@ describe(K3sHelper, () => {
});

expect(await subject.availableVersions).toContainEqual({
version: semver.parse('v1.0.0'),
version: semver.parse('v1.99.0'),
channels: undefined,
});
await pendingInit;
Expand Down Expand Up @@ -423,9 +424,38 @@ describe(K3sHelper, () => {
});

test('can handle zero choices', () => {
const desiredSemver = new semver.SemVer('v1.2.3+k3s4');
const desiredSemver = new semver.SemVer('v1.99.3+k3s4');

expect(() => subject['selectClosestSemVer'](desiredSemver, [])).toThrow(NoCachedK3sVersionsError);
});
});

describe('firstStableVersion', () => {
it('should return the first stable version', () => {
const versions: K8s.VersionEntry[] = [
new VersionEntry(new semver.SemVer('v1.0.0'), ['unstable']),
new VersionEntry(new semver.SemVer('v1.1.0'), ['stable']),
new VersionEntry(new semver.SemVer('v1.2.0'), ['stable']),
];
const result = firstStableVersion(versions)?.version;

expect(result).toEqual(versions[1].version);
});

it('should return first entry if no stable version is found', () => {
const versions: K8s.VersionEntry[] = [
new VersionEntry(new semver.SemVer('v1.0.0'), ['unstable']),
new VersionEntry(new semver.SemVer('v1.1.0'), ['beta']),
];
const result = firstStableVersion(versions)?.version;

expect(result).toEqual(versions[0].version);
});

it('should return undefined if the list is empty', () => {
const result = firstStableVersion([]);

expect(result).toBeUndefined();
});
});
});
Loading

0 comments on commit f4913fc

Please sign in to comment.