From 711f98111a270bfb4445b40b2e161369acd38cdf Mon Sep 17 00:00:00 2001 From: Jim Ehrismann <40840436+jim-docker@users.noreply.github.com> Date: Tue, 15 Mar 2022 09:44:21 -0400 Subject: [PATCH] Release/v5.4.2 (#5005) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix annotation for cronjob when is manually triggered (#4976) Signed-off-by: Carlos René Mederos Arias * Fix HelmChart validator requiring digest field (#4920) * Fix HelmChart validator requiring digest field Signed-off-by: Sebastian Malton * fix tests Signed-off-by: Sebastian Malton * fixed non-virtual list row rendering (#4983) * Remove listener for online event (#4970) * Fix "logs from" date (#4987) * release v5.4.2 Signed-off-by: Jim Ehrismann Co-authored-by: Carlos René Mederos Arias Co-authored-by: Sebastian Malton Co-authored-by: Alex Andreev --- package.json | 2 +- .../k8s-api/__tests__/helm-charts.api.test.ts | 15 +-- .../k8s-api/endpoints/helm-charts.api.ts | 18 +-- .../cronjob-trigger-dialog.tsx | 4 +- .../components/dock/logs/controls.tsx | 2 +- .../components/item-object-list/content.tsx | 114 ++++++++++-------- .../init-cluster-frame/init-cluster-frame.ts | 4 - 7 files changed, 85 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index d4f9bea92b..b8a1124b7a 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.1", + "version": "5.4.2", "main": "static/build/main.js", "copyright": "© 2021 OpenLens Authors", "license": "MIT", diff --git a/src/common/k8s-api/__tests__/helm-charts.api.test.ts b/src/common/k8s-api/__tests__/helm-charts.api.test.ts index dbe477d333..283c5168f5 100644 --- a/src/common/k8s-api/__tests__/helm-charts.api.test.ts +++ b/src/common/k8s-api/__tests__/helm-charts.api.test.ts @@ -36,13 +36,6 @@ describe("HelmChart tests", () => { version: "!", repo: "!", } as any)).toThrowError('"created" is required'); - expect(() => HelmChart.create({ - apiVersion: "!", - name: "!", - version: "!", - repo: "!", - created: "!", - } as any)).toThrowError('"digest" is required'); }); it("should throw on fields being wrong type", () => { @@ -62,6 +55,14 @@ describe("HelmChart tests", () => { created: "!", digest: "!", } as any)).toThrowError('"name" must be a string'); + expect(() => HelmChart.create({ + apiVersion: "!", + name: "!", + version: "!", + repo: "!", + created: "!", + digest: 1, + } as any)).toThrowError('"digest" must be a string'); expect(() => HelmChart.create({ apiVersion: "1", name: "", diff --git a/src/common/k8s-api/endpoints/helm-charts.api.ts b/src/common/k8s-api/endpoints/helm-charts.api.ts index b73bcfdaf2..163f90ef36 100644 --- a/src/common/k8s-api/endpoints/helm-charts.api.ts +++ b/src/common/k8s-api/endpoints/helm-charts.api.ts @@ -75,7 +75,7 @@ export interface RawHelmChart { version: string; repo: string; created: string; - digest: string; + digest?: string; kubeVersion?: string; description?: string; home?: string; @@ -142,7 +142,7 @@ const helmChartValidator = Joi.object({ .required(), digest: Joi .string() - .required(), + .optional(), kubeVersion: Joi .string() .optional(), @@ -247,22 +247,22 @@ export interface HelmChart { name: string; version: string; repo: string; - kubeVersion?: string; created: string; description: string; - digest: string; keywords: string[]; - home?: string; sources: string[]; urls: string[]; annotations: Record; dependencies: HelmChartDependency[]; maintainers: HelmChartMaintainer[]; + deprecated: boolean; + kubeVersion?: string; + digest?: string; + home?: string; engine?: string; icon?: string; appVersion?: string; type?: string; - deprecated: boolean; tillerVersion?: string; } @@ -324,7 +324,11 @@ export class HelmChart { } getId(): string { - return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}+${this.digest}`; + const digestPart = this.digest + ? `+${this.digest}` + : ""; + + return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}${digestPart}`; } getName(): string { diff --git a/src/renderer/components/+workloads-cronjobs/cronjob-trigger-dialog.tsx b/src/renderer/components/+workloads-cronjobs/cronjob-trigger-dialog.tsx index 689dd87ee1..7fbfd906b7 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjob-trigger-dialog.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjob-trigger-dialog.tsx @@ -15,7 +15,6 @@ import { Notifications } from "../notifications"; import { cssNames } from "../../utils"; import { Input } from "../input"; import { systemName, maxLength } from "../input/input_validators"; -import type { KubeObjectMetadata } from "../../../common/k8s-api/kube-object"; interface Props extends Partial { } @@ -80,6 +79,7 @@ export class CronJobTriggerDialog extends Component { }, { spec: cronjobDefinition.spec.jobTemplate.spec, metadata: { + annotations: { "cronjob.kubernetes.io/instantiate": "manual" }, ownerReferences: [{ apiVersion: cronjob.apiVersion, blockOwnerDeletion: true, @@ -88,7 +88,7 @@ export class CronJobTriggerDialog extends Component { name: cronjob.metadata.name, uid: cronjob.metadata.uid, }], - } as KubeObjectMetadata, + }, }); close(); diff --git a/src/renderer/components/dock/logs/controls.tsx b/src/renderer/components/dock/logs/controls.tsx index 59aead384b..159b135435 100644 --- a/src/renderer/components/dock/logs/controls.tsx +++ b/src/renderer/components/dock/logs/controls.tsx @@ -58,7 +58,7 @@ const NonInjectedLogControls = observer(({ openSaveFileDialog, model }: Dependen {since && ( Logs from{" "} - {new Date(since[0]).toLocaleString()} + {new Date(since).toLocaleString()} )} diff --git a/src/renderer/components/item-object-list/content.tsx b/src/renderer/components/item-object-list/content.tsx index d8c4e178cf..d7359bd535 100644 --- a/src/renderer/components/item-object-list/content.tsx +++ b/src/renderer/components/item-object-list/content.tsx @@ -68,67 +68,76 @@ export class ItemListLayoutContent extends React.Component return this.props.store.failedLoading; } + @boundMethod + renderRow(item: I) { + return this.getTableRow(item); + } + + getTableRow(item: I) { + const { + isSelectable, renderTableHeader, renderTableContents, renderItemMenu, + store, hasDetailsView, onDetails, + copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, + } = this.props; + const { isSelected } = store; + + 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]; + + if (copyClassNameFromHeadCells && headCell) { + cellProps.className = cssNames( + cellProps.className, + headCell.className, + ); + } + + if (!headCell || this.showColumn(headCell)) { + return ; + } + + return null; + })} + {renderItemMenu && ( + +
+ {renderItemMenu(item, store)} +
+
+ )} +
+ ); + } + @boundMethod getRow(uid: string) { return (
{() => { - 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); + 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]; - - if (copyClassNameFromHeadCells && headCell) { - cellProps.className = cssNames( - cellProps.className, - headCell.className, - ); - } - - if (!headCell || this.showColumn(headCell)) { - return ; - } - - return null; - })} - {renderItemMenu && ( - -
- {renderItemMenu(item, store)} -
-
- )} -
- ); + return this.getTableRow(item); }}
@@ -248,6 +257,7 @@ export class ItemListLayoutContent extends React.Component selectable={hasDetailsView} sortable={sortingCallbacks} getTableRow={this.getRow} + renderRow={virtual ? undefined : this.renderRow} items={items} selectedItemId={selectedItemId} noItems={this.renderNoItems()} diff --git a/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts b/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts index 94766f0e11..66515f0a2e 100644 --- a/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts +++ b/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts @@ -77,10 +77,6 @@ export const initClusterFrame = }); }); - window.addEventListener("online", () => { - window.location.reload(); - }); - window.onbeforeunload = () => { logger.info( `${logPrefix} Unload dashboard, clusterId=${(hostedCluster.id)}, frameId=${frameRoutingId}`,