mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Conditionally render node taints upon value existance (#3989)
This commit is contained in:
parent
f51ce1e34b
commit
e64060cc69
@ -74,7 +74,7 @@ describe("preferences page tests", () => {
|
|||||||
utils.itIf(process.platform !== "win32")("ensures helm repos", async () => {
|
utils.itIf(process.platform !== "win32")("ensures helm repos", async () => {
|
||||||
await window.click("[data-testid=kubernetes-tab]");
|
await window.click("[data-testid=kubernetes-tab]");
|
||||||
await window.waitForSelector("[data-testid=repository-name]", {
|
await window.waitForSelector("[data-testid=repository-name]", {
|
||||||
timeout: 100_000,
|
timeout: 140_000,
|
||||||
});
|
});
|
||||||
await window.click("#HelmRepoSelect");
|
await window.click("#HelmRepoSelect");
|
||||||
await window.waitForSelector("div.Select__option");
|
await window.waitForSelector("div.Select__option");
|
||||||
|
|||||||
@ -93,7 +93,7 @@ export async function start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function clickWelcomeButton(window: Page) {
|
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() {
|
function minikubeEntityId() {
|
||||||
|
|||||||
@ -56,6 +56,21 @@ export interface INodeMetrics<T = IMetrics> {
|
|||||||
fsSize: T;
|
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 {
|
export interface Node {
|
||||||
spec: {
|
spec: {
|
||||||
podCIDR?: string;
|
podCIDR?: string;
|
||||||
@ -65,12 +80,7 @@ export interface Node {
|
|||||||
* @deprecated see https://issues.k8s.io/61966
|
* @deprecated see https://issues.k8s.io/61966
|
||||||
*/
|
*/
|
||||||
externalID?: string;
|
externalID?: string;
|
||||||
taints?: {
|
taints?: NodeTaint[];
|
||||||
key: string;
|
|
||||||
value: string;
|
|
||||||
effect: string;
|
|
||||||
timeAdded: string;
|
|
||||||
}[];
|
|
||||||
unschedulable?: boolean;
|
unschedulable?: boolean;
|
||||||
};
|
};
|
||||||
status: {
|
status: {
|
||||||
|
|||||||
@ -30,7 +30,7 @@ import { Badge } from "../badge";
|
|||||||
import { ResourceMetrics } from "../resource-metrics";
|
import { ResourceMetrics } from "../resource-metrics";
|
||||||
import { podsStore } from "../+workloads-pods/pods.store";
|
import { podsStore } from "../+workloads-pods/pods.store";
|
||||||
import type { KubeObjectDetailsProps } from "../kube-object-details";
|
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 { NodeCharts } from "./node-charts";
|
||||||
import { makeObservable, observable, reaction } from "mobx";
|
import { makeObservable, observable, reaction } from "mobx";
|
||||||
import { PodDetailsList } from "../+workloads-pods/pod-details-list";
|
import { PodDetailsList } from "../+workloads-pods/pod-details-list";
|
||||||
@ -132,11 +132,7 @@ export class NodeDetails extends React.Component<Props> {
|
|||||||
/>
|
/>
|
||||||
{taints.length > 0 && (
|
{taints.length > 0 && (
|
||||||
<DrawerItem name="Taints" labelsOnly>
|
<DrawerItem name="Taints" labelsOnly>
|
||||||
{
|
{taints.map(taint => <Badge key={taint.key} label={formatNodeTaint(taint)} />)}
|
||||||
taints.map(({ key, effect, value }) => (
|
|
||||||
<Badge key={key} label={`${key}=${value}:${effect}`} />
|
|
||||||
))
|
|
||||||
}
|
|
||||||
</DrawerItem>
|
</DrawerItem>
|
||||||
)}
|
)}
|
||||||
{conditions &&
|
{conditions &&
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import { cssNames, interval } from "../../utils";
|
|||||||
import { TabLayout } from "../layout/tab-layout";
|
import { TabLayout } from "../layout/tab-layout";
|
||||||
import { nodesStore } from "./nodes.store";
|
import { nodesStore } from "./nodes.store";
|
||||||
import { KubeObjectListLayout } from "../kube-object-list-layout";
|
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 { LineProgress } from "../line-progress";
|
||||||
import { bytesToUnits } from "../../../common/utils/convertMemory";
|
import { bytesToUnits } from "../../../common/utils/convertMemory";
|
||||||
import { Tooltip, TooltipPosition } from "../tooltip";
|
import { Tooltip, TooltipPosition } from "../tooltip";
|
||||||
@ -227,6 +227,7 @@ export class Nodes extends React.Component<Props> {
|
|||||||
]}
|
]}
|
||||||
renderTableContents={node => {
|
renderTableContents={node => {
|
||||||
const tooltipId = `node-taints-${node.getId()}`;
|
const tooltipId = `node-taints-${node.getId()}`;
|
||||||
|
const taints = node.getTaints();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
<Badge flat key="name" label={node.getName()} tooltip={node.getName()} />,
|
<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.renderMemoryUsage(node),
|
||||||
this.renderDiskUsage(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" }}>
|
<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>
|
</Tooltip>
|
||||||
</>,
|
</>,
|
||||||
node.getRoleLabels(),
|
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