From dd4aa30b8d38ff37bf1139b60efa8654373335e3 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 1 Feb 2022 07:33:39 -0500 Subject: [PATCH 1/9] Update Node.getRoleLabels() to work with kube 1.16's defaults (#4771) Signed-off-by: Sebastian Malton --- src/common/k8s-api/__tests__/nodes.test.ts | 131 +++++++++++++++++++++ src/common/k8s-api/endpoints/nodes.api.ts | 32 +++-- 2 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 src/common/k8s-api/__tests__/nodes.test.ts diff --git a/src/common/k8s-api/__tests__/nodes.test.ts b/src/common/k8s-api/__tests__/nodes.test.ts new file mode 100644 index 0000000000..4b109a8f96 --- /dev/null +++ b/src/common/k8s-api/__tests__/nodes.test.ts @@ -0,0 +1,131 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { Node } from "../endpoints"; + +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +describe("Nodes tests", () => { + describe("getRoleLabels()", () => { + it("should return empty string if labels is not present", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + }, + }); + + expect(node.getRoleLabels()).toBe(""); + }); + + it("should return empty string if labels is empty object", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + labels: {}, + }, + }); + + expect(node.getRoleLabels()).toBe(""); + }); + + it("should return rest of keys with substring node-role.kubernetes.io/", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + labels: { + "node-role.kubernetes.io/foobar": "bat", + "hellonode-role.kubernetes.io/foobar1": "bat", + }, + }, + }); + + expect(node.getRoleLabels()).toBe("foobar, foobar1"); + }); + + it("should return rest of keys with substring node-role.kubernetes.io/ after last /", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + labels: { + "node-role.kubernetes.io/foobar": "bat", + "hellonode-role.kubernetes.io//////foobar1": "bat", + }, + }, + }); + + expect(node.getRoleLabels()).toBe("foobar, foobar1"); + }); + + it("should return value of label kubernetes.io/role if present", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + labels: { + "kubernetes.io/role": "master", + }, + }, + }); + + expect(node.getRoleLabels()).toBe("master"); + }); + + it("should return value of label node.kubernetes.io/role if present", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + labels: { + "node.kubernetes.io/role": "master", + }, + }, + }); + + expect(node.getRoleLabels()).toBe("master"); + }); + + it("all sources should be joined together", () => { + const node = new Node({ + apiVersion: "foo", + kind: "Node", + metadata: { + name: "bar", + resourceVersion: "1", + uid: "bat", + labels: { + "aksjhdkjahsdnode-role.kubernetes.io/foobar": "bat", + "kubernetes.io/role": "master", + "node.kubernetes.io/role": "master-v2-max", + }, + }, + }); + + expect(node.getRoleLabels()).toBe("foobar, master, master-v2-max"); + }); + }); +}); diff --git a/src/common/k8s-api/endpoints/nodes.api.ts b/src/common/k8s-api/endpoints/nodes.api.ts index 34e1dd0863..afe379f3b1 100644 --- a/src/common/k8s-api/endpoints/nodes.api.ts +++ b/src/common/k8s-api/endpoints/nodes.api.ts @@ -140,6 +140,12 @@ function* getTrueConditionTypes(conditions: IterableIterator | It } } +/** + * This regex is used in the `getRoleLabels()` method bellow, but placed here + * as factoring out regexes is best practice. + */ +const nodeRoleLabelKeyMatcher = /^.*node-role.kubernetes.io\/+(?.+)$/; + export class Node extends KubeObject { static kind = "Node"; static namespaced = false; @@ -165,17 +171,29 @@ export class Node extends KubeObject { return this.spec.taints || []; } - getRoleLabels() { - if (!this.metadata?.labels || typeof this.metadata.labels !== "object") { + getRoleLabels(): string { + const { labels } = this.metadata; + + if (!labels || typeof labels !== "object") { return ""; } - const roleLabels = Object.keys(this.metadata.labels) - .filter(key => key.includes("node-role.kubernetes.io")) - .map(key => key.match(/([^/]+$)/)[0]); // all after last slash + const roleLabels: string[] = []; - if (this.metadata.labels["kubernetes.io/role"] != undefined) { - roleLabels.push(this.metadata.labels["kubernetes.io/role"]); + for (const labelKey of Object.keys(labels)) { + const match = nodeRoleLabelKeyMatcher.exec(labelKey); + + if (match) { + roleLabels.push(match.groups.role); + } + } + + if (typeof labels["kubernetes.io/role"] === "string") { + roleLabels.push(labels["kubernetes.io/role"]); + } + + if (typeof labels["node.kubernetes.io/role"] === "string") { + roleLabels.push(labels["node.kubernetes.io/role"]); } return roleLabels.join(", "); From c1d557aeee34b69cf372a3fab24bdb39f671cb02 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann <40840436+jim-docker@users.noreply.github.com> Date: Tue, 1 Feb 2022 08:47:03 -0500 Subject: [PATCH 2/9] release v5.4.0-alpha.0 (#4780) Signed-off-by: Jim Ehrismann --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ebb8d290e6..64bd8fee19 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "productName": "OpenLens", "description": "OpenLens - Open Source IDE for Kubernetes", "homepage": "https://github.com/lensapp/lens", - "version": "5.3.0", + "version": "5.4.0-alpha.0", "main": "static/build/main.js", "copyright": "© 2021 OpenLens Authors", "license": "MIT", From e8205a64b98cf2d6f6fa03c62cf21754b1660a05 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Tue, 1 Feb 2022 15:18:43 +0100 Subject: [PATCH 3/9] Fix bugs in helm releases (#4785) * Fix opening of upgrade release tab Signed-off-by: Janne Savolainen * Bring back ability to rollback to specific revision Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen * Fix helm releases not updating after rollback Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen * Fix helm releases not updating after upgrade Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- src/main/helm/helm-release-manager.ts | 5 ++-- src/main/helm/helm-service.ts | 4 +--- src/main/routes/helm-route.ts | 4 ++-- .../update-release.injectable.ts | 23 +++++++++++++++++-- .../components/dock/upgrade-chart/view.tsx | 4 ++-- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/main/helm/helm-release-manager.ts b/src/main/helm/helm-release-manager.ts index 879bfed8ec..9c1d78bcfc 100644 --- a/src/main/helm/helm-release-manager.ts +++ b/src/main/helm/helm-release-manager.ts @@ -179,12 +179,13 @@ export async function getHistory(name: string, namespace: string, kubeconfigPath } export async function rollback(name: string, namespace: string, revision: number, kubeconfigPath: string) { - return JSON.parse(await execHelm([ + await execHelm([ "rollback", name, + `${revision}`, "--namespace", namespace, "--kubeconfig", kubeconfigPath, - ])); + ]); } async function getResources(name: string, namespace: string, kubeconfigPath: string, kubectlPath: string) { diff --git a/src/main/helm/helm-service.ts b/src/main/helm/helm-service.ts index fbb22eb6fc..d3a17d3f63 100644 --- a/src/main/helm/helm-service.ts +++ b/src/main/helm/helm-service.ts @@ -102,9 +102,7 @@ class HelmService { const proxyKubeconfig = await cluster.getProxyKubeconfigPath(); logger.debug("Rollback release"); - const output = rollback(releaseName, namespace, revision, proxyKubeconfig); - - return { message: output }; + await rollback(releaseName, namespace, revision, proxyKubeconfig); } } diff --git a/src/main/routes/helm-route.ts b/src/main/routes/helm-route.ts index 0f0905a675..958f729228 100644 --- a/src/main/routes/helm-route.ts +++ b/src/main/routes/helm-route.ts @@ -71,9 +71,9 @@ export class HelmApiRoute { const { cluster, params, payload, response } = request; try { - const result = await helmService.rollback(cluster, params.release, params.namespace, payload.revision); + await helmService.rollback(cluster, params.release, params.namespace, payload.revision); - respondJson(response, result); + response.end(); } catch (error) { logger.debug(error); respondText(response, error?.toString() || "Error rolling back chart", 422); diff --git a/src/renderer/components/+apps-releases/update-release/update-release.injectable.ts b/src/renderer/components/+apps-releases/update-release/update-release.injectable.ts index 2e5a681f51..06b1949da2 100644 --- a/src/renderer/components/+apps-releases/update-release/update-release.injectable.ts +++ b/src/renderer/components/+apps-releases/update-release/update-release.injectable.ts @@ -3,10 +3,29 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import { updateRelease } from "../../../../common/k8s-api/endpoints/helm-releases.api"; +import { + IReleaseUpdatePayload, + updateRelease, +} from "../../../../common/k8s-api/endpoints/helm-releases.api"; +import releasesInjectable from "../releases.injectable"; const updateReleaseInjectable = getInjectable({ - instantiate: () => updateRelease, + instantiate: (di) => { + const releases = di.inject(releasesInjectable); + + return async ( + name: string, + namespace: string, + payload: IReleaseUpdatePayload, + ) => { + const result = await updateRelease(name, namespace, payload); + + releases.invalidate(); + + return result; + }; + }, + lifecycle: lifecycleEnum.singleton, }); diff --git a/src/renderer/components/dock/upgrade-chart/view.tsx b/src/renderer/components/dock/upgrade-chart/view.tsx index bff0491610..9e5b0496a4 100644 --- a/src/renderer/components/dock/upgrade-chart/view.tsx +++ b/src/renderer/components/dock/upgrade-chart/view.tsx @@ -136,8 +136,8 @@ export class NonInjectedUpgradeChart extends React.Component; + if (!release || !this.props.upgradeChartTabStore.isReady(tabId) || !version) { + return ; } const currentVersion = release.getVersion(); const controlsAndInfo = ( From 11c78414a0b630061d81bba987ff73646aa19e4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Feb 2022 08:34:48 -0500 Subject: [PATCH 4/9] Bump @types/react-table from 7.7.8 to 7.7.9 (#4530) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 64bd8fee19..e85d38c6d3 100644 --- a/package.json +++ b/package.json @@ -304,7 +304,7 @@ "@types/react-dom": "^17.0.11", "@types/react-router-dom": "^5.3.2", "@types/react-select": "3.1.2", - "@types/react-table": "^7.7.8", + "@types/react-table": "^7.7.9", "@types/react-virtualized-auto-sizer": "^1.0.1", "@types/react-window": "^1.8.5", "@types/readable-stream": "^2.3.12", diff --git a/yarn.lock b/yarn.lock index 226a290633..1d8e0af6f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1762,10 +1762,10 @@ "@types/react-dom" "*" "@types/react-transition-group" "*" -"@types/react-table@^7.7.8": - version "7.7.8" - resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.8.tgz#b1aa5fb7a54432969262d2306b87fdbb9a5ee647" - integrity sha512-OMhbPlf+uUGte3M1WdArEKeBkyQ1XJxKvFYs+o1dGGGyaSVIqxPPQmBZ6Skkw0V9y0F/kOY7rnTD8r9GbfpBOg== +"@types/react-table@^7.7.9": + version "7.7.9" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.9.tgz#ea82875775fc6ee71a28408dcc039396ae067c92" + integrity sha512-ejP/J20Zlj9VmuLh73YgYkW2xOSFTW39G43rPH93M4mYWdMmqv66lCCr+axZpkdtlNLGjvMG2CwzT4S6abaeGQ== dependencies: "@types/react" "*" From 576135f7233f44a22cd716935e9a56ffb5cef2e8 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 2 Feb 2022 16:46:33 +0300 Subject: [PATCH 5/9] Fix quota entries layout in Add Resouce Quota dialog (#4789) Signed-off-by: Alex Andreev --- .../+config-resource-quotas/add-quota-dialog.scss | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/+config-resource-quotas/add-quota-dialog.scss b/src/renderer/components/+config-resource-quotas/add-quota-dialog.scss index 8d2e6a0ed7..941f1c9a49 100644 --- a/src/renderer/components/+config-resource-quotas/add-quota-dialog.scss +++ b/src/renderer/components/+config-resource-quotas/add-quota-dialog.scss @@ -9,19 +9,23 @@ } .quota-entries { - margin: -$margin * 0.5; + display: flex; + gap: 8px; + margin-left: -1px; + flex-wrap: wrap; &:empty { display: none; } .quota { - --flex-gap: #{$padding}; border: 1px solid var(--halfGray); border-radius: $radius; - margin: $margin * 0.5; padding: $padding * 0.5 $padding; transition: all 150ms ease; + display: flex; + align-items: center; + gap: 8px; &:hover { box-shadow: inset 0 0 0 1px var(--borderColor); From 334ab56f9d3b864a2a5866314a3f76a3ba51b21e Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 2 Feb 2022 16:47:33 +0300 Subject: [PATCH 6/9] Fix dialog icons hover color (#4791) Signed-off-by: Alex Andreev --- src/renderer/components/+catalog/catalog.module.scss | 2 ++ src/renderer/components/icon/icon.scss | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/+catalog/catalog.module.scss b/src/renderer/components/+catalog/catalog.module.scss index 5948d64a62..e285fb3ced 100644 --- a/src/renderer/components/+catalog/catalog.module.scss +++ b/src/renderer/components/+catalog/catalog.module.scss @@ -43,6 +43,8 @@ } .pinIcon { + --color-active: var(--textColorAccent); + transition: none; opacity: 0; margin-left: var(--padding); diff --git a/src/renderer/components/icon/icon.scss b/src/renderer/components/icon/icon.scss index b8d97cc3c8..de8d6fbdf2 100644 --- a/src/renderer/components/icon/icon.scss +++ b/src/renderer/components/icon/icon.scss @@ -111,7 +111,7 @@ } &.active { - color: var(--textColorAccent); + color: var(--color-active); box-shadow: 0 0 0 2px var(--iconActiveBackground); background-color: var(--iconActiveBackground); } From e58d9b631aa1f52d0f49c37314835d7c075dc02a Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Wed, 2 Feb 2022 15:46:07 +0100 Subject: [PATCH 7/9] Fix bugs in ItemListLayouts/KubeObjectListLayouts (#4792) * Fix virtual list behaviour in item list layout by making table rows observer Signed-off-by: Janne Savolainen * Make selecting item in ItemListLayout not scroll to top Signed-off-by: Janne Savolainen * Fix scrolling to top when selecting all items in item list layout Signed-off-by: Janne Savolainen * Fix refreshing release values when release is unselected Signed-off-by: Janne Savolainen * Remove noisy debugging Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen * Fix sorting of table rows Signed-off-by: Janne Savolainen * Replace avoidable asyncComputed with normal computed Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen * Revert unnecessary code style changes Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen * Fix render-storm in Events Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen * Fix missing key in React array Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- .../release-details.injectable.ts | 2 +- .../release-details/release-details.tsx | 6 +- .../release-values.injectable.ts | 8 +- .../release-details/release.injectable.ts | 4 +- src/renderer/components/+events/events.tsx | 4 +- .../components/item-object-list/content.tsx | 140 ++++++++++-------- .../components/kube-detail-params/params.ts | 1 - 7 files changed, 95 insertions(+), 70 deletions(-) diff --git a/src/renderer/components/+apps-releases/release-details/release-details.injectable.ts b/src/renderer/components/+apps-releases/release-details/release-details.injectable.ts index 1dac3b716f..c726e0429c 100644 --- a/src/renderer/components/+apps-releases/release-details/release-details.injectable.ts +++ b/src/renderer/components/+apps-releases/release-details/release-details.injectable.ts @@ -10,7 +10,7 @@ import releaseInjectable from "./release.injectable"; const releaseDetailsInjectable = getInjectable({ instantiate: (di) => asyncComputed(async () => { - const release = di.inject(releaseInjectable).value.get(); + const release = di.inject(releaseInjectable).get(); return await getRelease(release.name, release.namespace); }), diff --git a/src/renderer/components/+apps-releases/release-details/release-details.tsx b/src/renderer/components/+apps-releases/release-details/release-details.tsx index 30d34e1857..a41d0cae16 100644 --- a/src/renderer/components/+apps-releases/release-details/release-details.tsx +++ b/src/renderer/components/+apps-releases/release-details/release-details.tsx @@ -7,7 +7,7 @@ import "./release-details.scss"; import React, { Component } from "react"; import groupBy from "lodash/groupBy"; -import { computed, makeObservable, observable } from "mobx"; +import { computed, IComputedValue, makeObservable, observable } from "mobx"; import { Link } from "react-router-dom"; import kebabCase from "lodash/kebabCase"; import type { HelmRelease, IReleaseDetails, IReleaseUpdateDetails, IReleaseUpdatePayload } from "../../../../common/k8s-api/endpoints/helm-releases.api"; @@ -39,7 +39,7 @@ interface Props { } interface Dependencies { - release: IAsyncComputed + release: IComputedValue releaseDetails: IAsyncComputed releaseValues: IAsyncComputed updateRelease: (name: string, namespace: string, payload: IReleaseUpdatePayload) => Promise @@ -59,7 +59,7 @@ class NonInjectedReleaseDetails extends Component { } @computed get release() { - return this.props.release.value.get(); + return this.props.release.get(); } @computed get details() { diff --git a/src/renderer/components/+apps-releases/release-details/release-values.injectable.ts b/src/renderer/components/+apps-releases/release-details/release-values.injectable.ts index d7cc2c965c..965db1324f 100644 --- a/src/renderer/components/+apps-releases/release-details/release-values.injectable.ts +++ b/src/renderer/components/+apps-releases/release-details/release-values.injectable.ts @@ -12,7 +12,13 @@ import userSuppliedValuesAreShownInjectable from "./user-supplied-values-are-sho const releaseValuesInjectable = getInjectable({ instantiate: (di) => asyncComputed(async () => { - const release = di.inject(releaseInjectable).value.get(); + const release = di.inject(releaseInjectable).get(); + + // TODO: Figure out way to get rid of defensive code + if (!release) { + return ""; + } + const userSuppliedValuesAreShown = di.inject(userSuppliedValuesAreShownInjectable).value; try { diff --git a/src/renderer/components/+apps-releases/release-details/release.injectable.ts b/src/renderer/components/+apps-releases/release-details/release.injectable.ts index 6da2295765..75b821890a 100644 --- a/src/renderer/components/+apps-releases/release-details/release.injectable.ts +++ b/src/renderer/components/+apps-releases/release-details/release.injectable.ts @@ -6,14 +6,14 @@ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; import { matches } from "lodash/fp"; import releasesInjectable from "../releases.injectable"; import releaseRouteParametersInjectable from "./release-route-parameters.injectable"; -import { asyncComputed } from "@ogre-tools/injectable-react"; +import { computed } from "mobx"; const releaseInjectable = getInjectable({ instantiate: (di) => { const releases = di.inject(releasesInjectable); const releaseRouteParameters = di.inject(releaseRouteParametersInjectable); - return asyncComputed(async () => { + return computed(() => { const { name, namespace } = releaseRouteParameters.get(); if (!name || !namespace) { diff --git a/src/renderer/components/+events/events.tsx b/src/renderer/components/+events/events.tsx index 8b8ae46ccb..033189ea7d 100644 --- a/src/renderer/components/+events/events.tsx +++ b/src/renderer/components/+events/events.tsx @@ -124,7 +124,7 @@ export class Events extends React.Component { }; render() { - const { store, visibleItems } = this; + const { store } = this; const { compact, compactLimit, className, ...layoutProps } = this.props; const events = ( @@ -137,7 +137,7 @@ export class Events extends React.Component { renderHeaderTitle="Events" customizeHeader={this.customizeHeader} isSelectable={false} - items={visibleItems} + getItems={() => this.visibleItems} virtual={!compact} tableProps={{ sortSyncWithUrl: false, diff --git a/src/renderer/components/item-object-list/content.tsx b/src/renderer/components/item-object-list/content.tsx index ccfdddd7d3..773f70d74f 100644 --- a/src/renderer/components/item-object-list/content.tsx +++ b/src/renderer/components/item-object-list/content.tsx @@ -7,7 +7,7 @@ import "./item-list-layout.scss"; import React, { ReactNode } from "react"; import { computed, makeObservable } from "mobx"; -import { observer } from "mobx-react"; +import { Observer, observer } from "mobx-react"; import { ConfirmDialog, ConfirmDialogParams } from "../confirm-dialog"; import { Table, TableCell, TableCellProps, TableHead, TableProps, TableRow, TableRowProps, TableSortCallbacks } from "../table"; import { boundMethod, cssNames, IClassName, isReactNode, prevDefault, stopPropagation } from "../../utils"; @@ -70,58 +70,68 @@ export class ItemListLayoutContent extends React.Component @boundMethod getRow(uid: string) { - const { - isSelectable, renderTableHeader, renderTableContents, renderItemMenu, - store, hasDetailsView, onDetails, - copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, - } = this.props; - const { isSelected } = store; - const item = this.props.getItems().find(item => item.getId() == uid); - - if (!item) return null; - const itemId = item.getId(); - return ( - onDetails(item)) : undefined} - {...customizeTableRowProps(item)} - > - {isSelectable && ( - store.toggleSelection(item))} - /> - )} - { - renderTableContents(item).map((content, index) => { - const cellProps: TableCellProps = isReactNode(content) ? { children: content } : content; - const headCell = renderTableHeader?.[index]; +
+ + {() => { + const { + isSelectable, renderTableHeader, renderTableContents, renderItemMenu, + store, hasDetailsView, onDetails, + copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, + } = this.props; + const { isSelected } = store; + const item = this.props.getItems().find(item => item.getId() == uid); - if (copyClassNameFromHeadCells && headCell) { - cellProps.className = cssNames(cellProps.className, headCell.className); - } + if (!item) return null; + const itemId = item.getId(); - if (!headCell || this.showColumn(headCell)) { - return ; - } + return ( + onDetails(item)) : undefined} + {...customizeTableRowProps(item)} + > + {isSelectable && ( + store.toggleSelection(item))} + /> + )} + {renderTableContents(item).map((content, index) => { + const cellProps: TableCellProps = isReactNode(content) + ? { children: content } + : content; + const headCell = renderTableHeader?.[index]; - return null; - }) - } - {renderItemMenu && ( - -
- {renderItemMenu(item, store)} -
-
- )} -
+ if (copyClassNameFromHeadCells && headCell) { + cellProps.className = cssNames( + cellProps.className, + headCell.className, + ); + } + + if (!headCell || this.showColumn(headCell)) { + return ; + } + + return null; + })} + {renderItemMenu && ( + +
+ {renderItemMenu(item, store)} +
+
+ )} + + ); + }} +
+
); } @@ -190,11 +200,15 @@ export class ItemListLayoutContent extends React.Component return ( {isSelectable && ( - store.toggleSelectionAll(enabledItems))} - /> + + {() => ( + store.toggleSelectionAll(enabledItems))} + /> + )} + )} {renderTableHeader.map((cellProps, index) => ( this.showColumn(cellProps) && ( @@ -213,7 +227,6 @@ export class ItemListLayoutContent extends React.Component store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks, detailsItem, className, tableProps = {}, tableId, } = this.props; - const { selectedItems } = store; const selectedItemId = detailsItem && detailsItem.getId(); const classNames = cssNames(className, "box", "grow", ThemeStore.getInstance().activeTheme.type); @@ -234,11 +247,18 @@ export class ItemListLayoutContent extends React.Component {this.renderTableHeader()} {this.renderItems()} - + + + {() => ( + + )} + ); } diff --git a/src/renderer/components/kube-detail-params/params.ts b/src/renderer/components/kube-detail-params/params.ts index 953b666406..9eeb141e3f 100644 --- a/src/renderer/components/kube-detail-params/params.ts +++ b/src/renderer/components/kube-detail-params/params.ts @@ -46,7 +46,6 @@ export function hideDetails() { } export function getDetailsUrl(selfLink: string, resetSelected = false, mergeGlobals = true) { - console.debug("getDetailsUrl", { selfLink, resetSelected, mergeGlobals }); const params = new URLSearchParams(mergeGlobals ? navigation.searchParams : ""); params.set(kubeDetailsUrlParam.name, selfLink); From 534889458501dabf242b2eee6ab584f9c9dccd1b Mon Sep 17 00:00:00 2001 From: Jim Ehrismann <40840436+jim-docker@users.noreply.github.com> Date: Wed, 2 Feb 2022 11:52:13 -0500 Subject: [PATCH 8/9] release v5.4.0-alpha.1 (#4797) Signed-off-by: Jim Ehrismann --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e85d38c6d3..302511f3aa 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "productName": "OpenLens", "description": "OpenLens - Open Source IDE for Kubernetes", "homepage": "https://github.com/lensapp/lens", - "version": "5.4.0-alpha.0", + "version": "5.4.0-alpha.1", "main": "static/build/main.js", "copyright": "© 2021 OpenLens Authors", "license": "MIT", From 6ebfd766445c5a3129a793c2909a7f99ca8e404f Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Thu, 3 Feb 2022 07:37:21 +0200 Subject: [PATCH 9/9] Use system-node-critical priorityClassName for node shell (#4800) Signed-off-by: Jari Kolehmainen --- src/main/shell-session/node-shell-session/node-shell-session.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/shell-session/node-shell-session/node-shell-session.ts b/src/main/shell-session/node-shell-session/node-shell-session.ts index 1fa05a4ae2..8c5861bff5 100644 --- a/src/main/shell-session/node-shell-session/node-shell-session.ts +++ b/src/main/shell-session/node-shell-session/node-shell-session.ts @@ -94,6 +94,7 @@ export class NodeShellSession extends ShellSession { tolerations: [{ operator: "Exists", }], + priorityClassName: "system-node-critical", containers: [{ name: "shell", image: this.cluster.nodeShellImage,