mirror of
https://github.com/lensapp/lens.git
synced 2024-09-20 05:47:24 +03:00
Conditionally render node taints upon value existance (#3989)
This commit is contained in:
parent
f51ce1e34b
commit
e64060cc69
@ -33,7 +33,7 @@ describe("preferences page tests", () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
let app: ElectronApplication;
|
||||
|
||||
|
||||
({ window, cleanup, app } = await utils.start());
|
||||
await utils.clickWelcomeButton(window);
|
||||
|
||||
@ -74,7 +74,7 @@ describe("preferences page tests", () => {
|
||||
utils.itIf(process.platform !== "win32")("ensures helm repos", async () => {
|
||||
await window.click("[data-testid=kubernetes-tab]");
|
||||
await window.waitForSelector("[data-testid=repository-name]", {
|
||||
timeout: 100_000,
|
||||
timeout: 140_000,
|
||||
});
|
||||
await window.click("#HelmRepoSelect");
|
||||
await window.waitForSelector("div.Select__option");
|
||||
|
@ -93,7 +93,7 @@ export async function start() {
|
||||
}
|
||||
|
||||
export async function clickWelcomeButton(window: Page) {
|
||||
await window.click("#hotbarIcon-catalog-entity .Icon");
|
||||
await window.click("[data-testid=welcome-menu-container] li a");
|
||||
}
|
||||
|
||||
function minikubeEntityId() {
|
||||
|
@ -56,6 +56,21 @@ export interface INodeMetrics<T = IMetrics> {
|
||||
fsSize: T;
|
||||
}
|
||||
|
||||
export interface NodeTaint {
|
||||
key: string;
|
||||
value?: string;
|
||||
effect: string;
|
||||
timeAdded: string;
|
||||
}
|
||||
|
||||
export function formatNodeTaint(taint: NodeTaint): string {
|
||||
if (taint.value) {
|
||||
return `${taint.key}=${taint.value}:${taint.effect}`;
|
||||
}
|
||||
|
||||
return `${taint.key}:${taint.effect}`;
|
||||
}
|
||||
|
||||
export interface Node {
|
||||
spec: {
|
||||
podCIDR?: string;
|
||||
@ -65,12 +80,7 @@ export interface Node {
|
||||
* @deprecated see https://issues.k8s.io/61966
|
||||
*/
|
||||
externalID?: string;
|
||||
taints?: {
|
||||
key: string;
|
||||
value: string;
|
||||
effect: string;
|
||||
timeAdded: string;
|
||||
}[];
|
||||
taints?: NodeTaint[];
|
||||
unschedulable?: boolean;
|
||||
};
|
||||
status: {
|
||||
|
@ -30,7 +30,7 @@ import { Badge } from "../badge";
|
||||
import { ResourceMetrics } from "../resource-metrics";
|
||||
import { podsStore } from "../+workloads-pods/pods.store";
|
||||
import type { KubeObjectDetailsProps } from "../kube-object-details";
|
||||
import { getMetricsByNodeNames, IClusterMetrics, Node } from "../../../common/k8s-api/endpoints";
|
||||
import { formatNodeTaint, getMetricsByNodeNames, IClusterMetrics, Node } from "../../../common/k8s-api/endpoints";
|
||||
import { NodeCharts } from "./node-charts";
|
||||
import { makeObservable, observable, reaction } from "mobx";
|
||||
import { PodDetailsList } from "../+workloads-pods/pod-details-list";
|
||||
@ -132,11 +132,7 @@ export class NodeDetails extends React.Component<Props> {
|
||||
/>
|
||||
{taints.length > 0 && (
|
||||
<DrawerItem name="Taints" labelsOnly>
|
||||
{
|
||||
taints.map(({ key, effect, value }) => (
|
||||
<Badge key={key} label={`${key}=${value}:${effect}`} />
|
||||
))
|
||||
}
|
||||
{taints.map(taint => <Badge key={taint.key} label={formatNodeTaint(taint)} />)}
|
||||
</DrawerItem>
|
||||
)}
|
||||
{conditions &&
|
||||
|
@ -27,7 +27,7 @@ import { cssNames, interval } from "../../utils";
|
||||
import { TabLayout } from "../layout/tab-layout";
|
||||
import { nodesStore } from "./nodes.store";
|
||||
import { KubeObjectListLayout } from "../kube-object-list-layout";
|
||||
import { getMetricsForAllNodes, INodeMetrics, Node } from "../../../common/k8s-api/endpoints/nodes.api";
|
||||
import { formatNodeTaint, getMetricsForAllNodes, INodeMetrics, Node } from "../../../common/k8s-api/endpoints/nodes.api";
|
||||
import { LineProgress } from "../line-progress";
|
||||
import { bytesToUnits } from "../../../common/utils/convertMemory";
|
||||
import { Tooltip, TooltipPosition } from "../tooltip";
|
||||
@ -227,6 +227,7 @@ export class Nodes extends React.Component<Props> {
|
||||
]}
|
||||
renderTableContents={node => {
|
||||
const tooltipId = `node-taints-${node.getId()}`;
|
||||
const taints = node.getTaints();
|
||||
|
||||
return [
|
||||
<Badge flat key="name" label={node.getName()} tooltip={node.getName()} />,
|
||||
@ -235,9 +236,9 @@ export class Nodes extends React.Component<Props> {
|
||||
this.renderMemoryUsage(node),
|
||||
this.renderDiskUsage(node),
|
||||
<>
|
||||
<span id={tooltipId}>{node.getTaints().length}</span>
|
||||
<span id={tooltipId}>{taints.length}</span>
|
||||
<Tooltip targetId={tooltipId} tooltipOnParentHover={true} style={{ whiteSpace: "pre-line" }}>
|
||||
{node.getTaints().map(({ key, value, effect }) => `${key}=${value}:${effect}`).join("\n")}
|
||||
{taints.map(formatNodeTaint).join("\n")}
|
||||
</Tooltip>
|
||||
</>,
|
||||
node.getRoleLabels(),
|
||||
|
41
src/renderer/components/__tests__/nodes.api.test.ts
Normal file
41
src/renderer/components/__tests__/nodes.api.test.ts
Normal file
@ -0,0 +1,41 @@
|
||||
/**
|
||||
* Copyright (c) 2021 OpenLens Authors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
import { formatNodeTaint } from "../../../common/k8s-api/endpoints";
|
||||
|
||||
describe("formatNodeTaint tests", () => {
|
||||
it("should use value if defined", () => {
|
||||
expect(formatNodeTaint({
|
||||
effect: "Foo",
|
||||
key: "hello",
|
||||
timeAdded: "pre",
|
||||
value: "a"
|
||||
})).toBe("hello=a:Foo");
|
||||
});
|
||||
|
||||
it("should not use value if not defined", () => {
|
||||
expect(formatNodeTaint({
|
||||
effect: "Foo",
|
||||
key: "hello",
|
||||
timeAdded: "pre",
|
||||
})).toBe("hello:Foo");
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user