Release 6.4.2 (#7286)

* Fix request namespace list permissions check if a list rule is not the first match (#7282)

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* Fix cluster metadata detectors (#7255)

Signed-off-by: Juho Heikka <juho.heikka@gmail.com>

* Fix extension API not having all the correct types (#7263)

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Update release guide and fix release script (#7276)

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Release 6.4.2

Signed-off-by: Juho Heikka <juho.heikka@gmail.com>

---------

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
Signed-off-by: Juho Heikka <juho.heikka@gmail.com>
Signed-off-by: Sebastian Malton <sebastian@malton.name>
Co-authored-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Juho HeikkaandSebastian Malton authored and GitHub committed 2023-03-06 13:01:42 +02:00
1 parent 67896437f0
commit 1d78912dd8
9 files changed
+142 -15

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@
"productName": "",
"description": "Lens Desktop Core",
"homepage": "https://github.com/lensapp/lens",
"version": "6.4.1",
"version": "6.4.2",
"repository": {
"type": "git",
"url": "git+https://github.com/lensapp/lens.git"
@@ -22,7 +22,10 @@ const pickHighestAccuracy = (prev: ClusterDetectionResult, curr: ClusterDetectio
const detectMetadataWithFor = (cluster: Cluster) => async (clusterMetadataDetector: ClusterMetadataDetector) => {
try {
return await clusterMetadataDetector.detect(cluster);
return {
key: clusterMetadataDetector.key,
result: await clusterMetadataDetector.detect(cluster),
};
} catch {
return null;
}
@@ -39,7 +42,12 @@ const detectClusterMetadataInjectable = getInjectable({
filter(isDefined),
(arg) => groupBy(arg, "key"),
(arg) => object.entries(arg),
map(([ key, results ]) => [key, reduce(results, pickHighestAccuracy)] as const),
map(([ key, detectionResults ]) => {
const results = detectionResults.map(({ result }) => result as ClusterDetectionResult);
const highestAccuracyResult = reduce(results, pickHighestAccuracy)?.value;
return [key, highestAccuracyResult] as const;
}),
filter(hasDefinedTupleValue),
);
@@ -0,0 +1,107 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { AppPaths } from "../../common/app-paths/app-path-injection-token";
import appPathsStateInjectable from "../../common/app-paths/app-paths-state.injectable";
import directoryForKubeConfigsInjectable from "../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable";
import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
import { ClusterMetadataKey } from "../../common/cluster-types";
import type { Cluster } from "../../common/cluster/cluster";
import { createClusterInjectionToken } from "../../common/cluster/create-cluster-injection-token";
import { getDiForUnitTesting } from "../getDiForUnitTesting";
import clusterDistributionDetectorInjectable from "./cluster-distribution-detector.injectable";
import clusterIdDetectorFactoryInjectable from "./cluster-id-detector.injectable";
import clusterLastSeenDetectorInjectable from "./cluster-last-seen-detector.injectable";
import clusterNodeCountDetectorInjectable from "./cluster-nodes-count-detector.injectable";
import type { DetectClusterMetadata } from "./detect-cluster-metadata.injectable";
import detectClusterMetadataInjectable from "./detect-cluster-metadata.injectable";
import requestClusterVersionInjectable from "./request-cluster-version.injectable";
describe("detect-cluster-metadata", () => {
let detectClusterMetadata: DetectClusterMetadata;
let cluster: Cluster;
beforeEach(async () => {
const di = getDiForUnitTesting({ doGeneralOverrides: true });
const lastSeenDetectMock = jest.fn().mockReturnValue(Promise.resolve({ value: "some-time-stamp", accuracy: 100 }));
const nodeCountDetectMock = jest.fn().mockReturnValue(Promise.resolve({ value: 42, accuracy: 100 }));
const clusterIdDetectMock = jest.fn().mockReturnValue(Promise.resolve({ value: "some-cluster-id", accuracy: 100 }));
const distributionDetectMock = jest.fn().mockReturnValue(Promise.resolve({ value: "some-distribution", accuracy: 100 }));
di.override(clusterLastSeenDetectorInjectable, () => {
return {
key: ClusterMetadataKey.LAST_SEEN,
detect: lastSeenDetectMock,
};
});
di.override(requestClusterVersionInjectable, () => () => Promise.resolve("some-cluster-version"));
di.override(clusterNodeCountDetectorInjectable, () => ({
key: ClusterMetadataKey.NODES_COUNT,
detect: nodeCountDetectMock,
}));
di.override(clusterIdDetectorFactoryInjectable, () => ({
key: ClusterMetadataKey.CLUSTER_ID,
detect: clusterIdDetectMock,
}));
di.override(clusterDistributionDetectorInjectable, () => ({
key: ClusterMetadataKey.DISTRIBUTION,
detect: distributionDetectMock,
}));
di.override(directoryForUserDataInjectable, () => "/some-user-store-path");
di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs");
di.override(appPathsStateInjectable, () => ({
get: () => ({} as AppPaths),
set: () => {},
}));
detectClusterMetadata = di.inject(detectClusterMetadataInjectable);
const createCluster = di.inject(createClusterInjectionToken);
cluster = createCluster({
id: "some-id",
contextName: "some-context",
kubeConfigPath: "minikube-config.yml",
}, {
clusterServerUrl: "foo",
});
});
it("given some cluster, last seen time stamp is added to the metadata", async () => {
const metadata = await detectClusterMetadata(cluster);
expect(metadata.lastSeen).toEqual("some-time-stamp");
});
it("given some cluster, cluster version is added to the metadata", async () => {
const metadata = await detectClusterMetadata(cluster);
expect(metadata.version).toEqual("some-cluster-version");
});
it("given some cluster, id is added to the metadata", async () => {
const metadata = await detectClusterMetadata(cluster);
expect(metadata.id).toEqual("some-cluster-id");
});
it("given some cluster, node count is added to the metadata", async () => {
const metadata = await detectClusterMetadata(cluster);
expect(metadata.nodes).toEqual(42);
});
it("given some cluster, distribution is added to the metadata", async () => {
const metadata = await detectClusterMetadata(cluster);
expect(metadata.distribution).toEqual("some-distribution");
});
});
+3 -2
View File
@@ -2,7 +2,7 @@
"name": "@k8slens/extensions",
"productName": "OpenLens extensions",
"description": "OpenLens - Open Source Kubernetes IDE: extensions",
"version": "6.4.1",
"version": "6.4.2",
"copyright": "© 2022 OpenLens Authors",
"license": "MIT",
"main": "dist/extension-api.js",
@@ -26,7 +26,7 @@
"prepare:dev": "yarn run build"
},
"dependencies": {
"@k8slens/core": "^6.4.1"
"@k8slens/core": "^6.4.2"
},
"devDependencies": {
"@types/node": "^16.18.6",
@@ -39,6 +39,7 @@
"style-loader": "^3.3.1",
"ts-loader": "^9.4.2",
"ts-node": "^10.9.1",
"typed-emitter": "^2.1.0",
"typedoc": "0.23.25",
"typedoc-plugin-markdown": "^3.13.6",
"typescript": "^4.9.5",
+2 -2
View File
@@ -4,7 +4,7 @@
"productName": "OpenLens",
"description": "OpenLens - Open Source IDE for Kubernetes",
"homepage": "https://github.com/lensapp/lens",
"version": "6.4.1",
"version": "6.4.2",
"repository": {
"type": "git",
"url": "git+https://github.com/lensapp/lens.git"
@@ -192,7 +192,7 @@
}
},
"dependencies": {
"@k8slens/core": "^6.4.1",
"@k8slens/core": "^6.4.2",
"@k8slens/ensure-binaries": "^6.4.0-beta.16",
"@k8slens/generate-tray-icons": "^6.4.0-beta.16",
"@ogre-tools/fp": "^12.0.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@k8slens/release-tool",
"version": "6.4.0",
"version": "6.4.2",
"description": "Release tool for lens monorepo",
"main": "dist/index.mjs",
"license": "MIT",
+11 -3
View File
@@ -145,6 +145,14 @@ function formatSemverForMilestone(version: SemVer): string {
return `${version.major}.${version.minor}.${version.patch}`;
}
function formatVersionForPickingPrs(version: SemVer): string {
if (version.prerelease.length > 0) {
return `${version.major}.${version.minor}.${version.patch}`;
}
return `${version.major}.${version.minor}.${version.patch+1}`;
}
async function createReleaseBranchAndCommit(prBase: string, version: SemVer, prBody: string): Promise<void> {
const prBranch = `release/v${version.format()}`;
@@ -182,9 +190,10 @@ function sortExtendedGithubPrData(left: ExtendedGithubPrData, right: ExtendedGit
return -1;
}
async function getRelevantPRs(milestone: string, previousReleasedVersion: string): Promise<ExtendedGithubPrData[]> {
async function getRelevantPRs(previousReleasedVersion: string): Promise<ExtendedGithubPrData[]> {
console.log("retrieving previous 200 PRs...");
const milestone = formatVersionForPickingPrs(await getCurrentVersionOfSubPackage("core"));
const getMergedPrsArgs = [
"gh",
"pr",
@@ -326,8 +335,7 @@ async function createRelease(): Promise<void> {
await bumpPackageVersions();
}
const prMilestone = formatSemverForMilestone(await getCurrentVersionOfSubPackage("core"));
const relevantPrs = await getRelevantPRs(prMilestone, previousReleasedVersion);
const relevantPrs = await getRelevantPRs(previousReleasedVersion);
const selectedPrs = await pickRelevantPrs(relevantPrs, isMasterBranch);
const prBody = formatChangelog(previousReleasedVersion, selectedPrs);