diff --git a/locales/en/messages.po b/locales/en/messages.po index 039da01cb7..f2ca7973e8 100644 --- a/locales/en/messages.po +++ b/locales/en/messages.po @@ -274,7 +274,6 @@ msgstr "CA Bundle" #: src/renderer/components/+workloads-pods/pod-details-list.tsx:53 #: src/renderer/components/+workloads-pods/pod-details-list.tsx:95 #: src/renderer/components/resource-metrics/resource-metrics-text.tsx:13 -#: src/renderer/components/+nodes/nodes.tsx:55 msgid "CPU" msgstr "CPU" @@ -297,7 +296,10 @@ msgstr "CPU limits" msgid "CPU requests" msgstr "CPU requests" -#: src/renderer/components/+workspaces/workspaces.tsx:119 +#: src/renderer/components/+nodes/nodes.tsx:55 +msgid "CPU:" +msgstr "CPU:" + #: src/renderer/components/confirm-dialog/confirm-dialog.tsx:44 #: src/renderer/components/dock/info-panel.tsx:97 #: src/renderer/components/wizard/wizard.tsx:130 @@ -663,13 +665,12 @@ msgstr "Desired number of replicas" #: src/renderer/components/+nodes/node-details.tsx:65 #: src/renderer/components/+nodes/nodes.tsx:115 #: src/renderer/components/+storage-volume-claims/volume-claim-details.tsx:44 -#: src/renderer/components/+nodes/nodes.tsx:71 msgid "Disk" msgstr "Disk" -#: src/renderer/components/+preferences/preferences.tsx:171 -msgid "Does not affect cluster communications!" -msgstr "Does not affect cluster communications!" +#: src/renderer/components/+nodes/nodes.tsx:71 +msgid "Disk:" +msgstr "Disk:" #: src/renderer/components/+custom-resources/certmanager.k8s.io/certificate-details.tsx:89 msgid "Domains" @@ -1145,7 +1146,6 @@ msgstr "Medium" #: src/renderer/components/+workloads-pods/pod-details-list.tsx:63 #: src/renderer/components/+workloads-pods/pod-details-list.tsx:96 #: src/renderer/components/resource-metrics/resource-metrics-text.tsx:18 -#: src/renderer/components/+nodes/nodes.tsx:63 msgid "Memory" msgstr "Memory" @@ -1167,6 +1167,10 @@ msgstr "Memory requests" msgid "Memory usage" msgstr "Memory usage" +#: src/renderer/components/+nodes/nodes.tsx:63 +msgid "Memory:" +msgstr "Memory:" + #: src/renderer/components/+cluster/cluster-issues.tsx:100 #: src/renderer/components/+events/event-details.tsx:30 #: src/renderer/components/+events/events.tsx:62 @@ -2389,8 +2393,8 @@ msgid "and <0>{tailCount} more" msgstr "and <0>{tailCount} more" #: src/renderer/components/+nodes/nodes.tsx:55 -msgid "cores" -msgstr "cores" +msgid "cores:" +msgstr "cores:" #: src/renderer/components/+workloads-pods/pod-details-container.tsx:41 msgid "exit code" diff --git a/locales/fi/messages.po b/locales/fi/messages.po index 11eb031bac..4d81ae2a65 100644 --- a/locales/fi/messages.po +++ b/locales/fi/messages.po @@ -274,7 +274,6 @@ msgstr "" #: src/renderer/components/+workloads-pods/pod-details-list.tsx:53 #: src/renderer/components/+workloads-pods/pod-details-list.tsx:95 #: src/renderer/components/resource-metrics/resource-metrics-text.tsx:13 -#: src/renderer/components/+nodes/nodes.tsx:55 msgid "CPU" msgstr "" @@ -297,7 +296,10 @@ msgstr "" msgid "CPU requests" msgstr "" -#: src/renderer/components/+workspaces/workspaces.tsx:119 +#: src/renderer/components/+nodes/nodes.tsx:55 +msgid "CPU:" +msgstr "" + #: src/renderer/components/confirm-dialog/confirm-dialog.tsx:44 #: src/renderer/components/dock/info-panel.tsx:97 #: src/renderer/components/wizard/wizard.tsx:130 @@ -659,10 +661,13 @@ msgstr "" #: src/renderer/components/+nodes/node-details.tsx:65 #: src/renderer/components/+nodes/nodes.tsx:115 #: src/renderer/components/+storage-volume-claims/volume-claim-details.tsx:44 -#: src/renderer/components/+nodes/nodes.tsx:71 msgid "Disk" msgstr "" +#: src/renderer/components/+nodes/nodes.tsx:71 +msgid "Disk:" +msgstr "" + #: src/renderer/components/+custom-resources/certmanager.k8s.io/certificate-details.tsx:89 msgid "Domains" msgstr "" @@ -1132,7 +1137,6 @@ msgstr "" #: src/renderer/components/+workloads-pods/pod-details-list.tsx:63 #: src/renderer/components/+workloads-pods/pod-details-list.tsx:96 #: src/renderer/components/resource-metrics/resource-metrics-text.tsx:18 -#: src/renderer/components/+nodes/nodes.tsx:63 msgid "Memory" msgstr "" @@ -1154,6 +1158,10 @@ msgstr "" msgid "Memory usage" msgstr "" +#: src/renderer/components/+nodes/nodes.tsx:63 +msgid "Memory:" +msgstr "" + #: src/renderer/components/+cluster/cluster-issues.tsx:100 #: src/renderer/components/+events/event-details.tsx:30 #: src/renderer/components/+events/events.tsx:62 @@ -2368,7 +2376,7 @@ msgid "and <0>{tailCount} more" msgstr "" #: src/renderer/components/+nodes/nodes.tsx:55 -msgid "cores" +msgid "cores:" msgstr "" #: src/renderer/components/+workloads-pods/pod-details-container.tsx:41 diff --git a/locales/ru/messages.po b/locales/ru/messages.po index 6c53eb3c03..6e55ab9f73 100644 --- a/locales/ru/messages.po +++ b/locales/ru/messages.po @@ -275,7 +275,6 @@ msgstr "CA Bundle" #: src/renderer/components/+workloads-pods/pod-details-list.tsx:53 #: src/renderer/components/+workloads-pods/pod-details-list.tsx:95 #: src/renderer/components/resource-metrics/resource-metrics-text.tsx:13 -#: src/renderer/components/+nodes/nodes.tsx:55 msgid "CPU" msgstr "Процессор" @@ -298,7 +297,10 @@ msgstr "Лимиты процессора" msgid "CPU requests" msgstr "Запросы к процессору" -#: src/renderer/components/+workspaces/workspaces.tsx:119 +#: src/renderer/components/+nodes/nodes.tsx:55 +msgid "CPU:" +msgstr "CPU:" + #: src/renderer/components/confirm-dialog/confirm-dialog.tsx:44 #: src/renderer/components/dock/info-panel.tsx:97 #: src/renderer/components/wizard/wizard.tsx:130 @@ -664,13 +666,12 @@ msgstr "Нужный уровень реплик" #: src/renderer/components/+nodes/node-details.tsx:65 #: src/renderer/components/+nodes/nodes.tsx:115 #: src/renderer/components/+storage-volume-claims/volume-claim-details.tsx:44 -#: src/renderer/components/+nodes/nodes.tsx:71 msgid "Disk" msgstr "Диск" -#: src/renderer/components/+preferences/preferences.tsx:171 -msgid "Does not affect cluster communications!" -msgstr "" +#: src/renderer/components/+nodes/nodes.tsx:71 +msgid "Disk:" +msgstr "Диск:" #: src/renderer/components/+custom-resources/certmanager.k8s.io/certificate-details.tsx:89 msgid "Domains" @@ -1146,7 +1147,6 @@ msgstr "" #: src/renderer/components/+workloads-pods/pod-details-list.tsx:63 #: src/renderer/components/+workloads-pods/pod-details-list.tsx:96 #: src/renderer/components/resource-metrics/resource-metrics-text.tsx:18 -#: src/renderer/components/+nodes/nodes.tsx:63 msgid "Memory" msgstr "Память" @@ -1168,6 +1168,10 @@ msgstr "Запросы к памяти" msgid "Memory usage" msgstr "Использование памяти" +#: src/renderer/components/+nodes/nodes.tsx:63 +msgid "Memory:" +msgstr "Память:" + #: src/renderer/components/+cluster/cluster-issues.tsx:100 #: src/renderer/components/+events/event-details.tsx:30 #: src/renderer/components/+events/events.tsx:62 @@ -2390,8 +2394,8 @@ msgid "and <0>{tailCount} more" msgstr "и <0>{tailCount} ещё" #: src/renderer/components/+nodes/nodes.tsx:55 -msgid "cores" -msgstr "ядер" +msgid "cores:" +msgstr "ядер:" #: src/renderer/components/+workloads-pods/pod-details-container.tsx:41 msgid "exit code" diff --git a/src/renderer/api/api-manager.ts b/src/renderer/api/api-manager.ts index e585af3d41..22735c3c09 100644 --- a/src/renderer/api/api-manager.ts +++ b/src/renderer/api/api-manager.ts @@ -20,31 +20,16 @@ export class ApiManager { getApi(pathOrCallback: string | ((api: KubeApi) => boolean)) { if (typeof pathOrCallback === "string") { - const { apiBase } = KubeApi.parseApi(pathOrCallback); - const api = this.apis.get(pathOrCallback) || this.apis.get(apiBase); - if (!api) { - throw `"${apiBase}" is an unsupported kubernetes API`; - } - - return api; + return this.apis.get(pathOrCallback) || this.apis.get(KubeApi.parseApi(pathOrCallback).apiBase); } return Array.from(this.apis.values()).find(pathOrCallback); } - /** - * registerApi registers the provided api under its `apiBase` URL. - * @param api the KubeApi object to register - * @returns true if the KubeApi is a new entry, false if already - * present (and not updated) - */ - registerApi(api: KubeApi): boolean { - if (this.apis.has(api.apiBase)) { - return false + registerApi(apiBase: string, api: KubeApi) { + if (!this.apis.has(apiBase)) { + this.apis.set(apiBase, api); } - - this.apis.set(api.apiBase, api); - return true; } protected resolveApi(api: string | KubeApi): KubeApi { @@ -52,17 +37,13 @@ export class ApiManager { return api; } - /** - * unregisterApi removes the - * @param api the apiBase or KubeApi object to remove from the map - * @returns true if the item was removed, false if not present - */ - unregisterApi(api: string | KubeApi): boolean { - if (typeof api === "string") { - return this.apis.delete(api) + unregisterApi(api: string | KubeApi) { + if (typeof api === "string") this.apis.delete(api); + else { + const apis = Array.from(this.apis.entries()); + const entry = apis.find(entry => entry[1] === api); + if (entry) this.unregisterApi(entry[0]); } - - return this.apis.delete(api.apiBase); } registerStore(api: KubeApi, store: KubeObjectStore) { @@ -73,7 +54,11 @@ export class ApiManager { return this.stores.get(this.resolveApi(api)); } - private registerViewsForApi(api: KubeApi, views: ApiComponents) { + registerViews(api: KubeApi | KubeApi[], views: ApiComponents) { + if (Array.isArray(api)) { + api.forEach(api => this.registerViews(api, views)); + return; + } const currentViews = this.views.get(api) || {}; this.views.set(api, { ...currentViews, @@ -81,14 +66,6 @@ export class ApiManager { }); } - registerViews(api: KubeApi | KubeApi[], views: ApiComponents) { - if (Array.isArray(api)) { - api.forEach(api => this.registerViewsForApi(api, views)); - } else { - this.registerViewsForApi(api, views); - } - } - getViews(api: string | KubeApi): ApiComponents { return this.views.get(this.resolveApi(api)) || {} } diff --git a/src/renderer/api/kube-api-parse_test.ts b/src/renderer/api/kube-api-parse_test.ts index c103ad177c..1fda8c3e53 100644 --- a/src/renderer/api/kube-api-parse_test.ts +++ b/src/renderer/api/kube-api-parse_test.ts @@ -123,25 +123,13 @@ const tests: KubeApi_Parse_Test[] = [ namespace: undefined, }, }, - { - url: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/workspaceroles.iam.kubesphere.io", - expected: { - apiBase: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions", - apiPrefix: "/apis", - apiGroup: "apiextensions.k8s.io", - apiVersion: "v1", - apiVersionWithGroup: "apiextensions.k8s.io/v1", - resource: "customresourcedefinitions", - name: "workspaceroles.iam.kubesphere.io", - namespace: undefined, - }, - }, ]; describe.only("parseApi unit tests", () => { - for (const { url, expected } of tests) { - test(`testing "${url}"`, () => { - expect(parseApi(url)).toStrictEqual(expected); + for (const i in tests) { + const { url: tUrl, expected:tExpect} = tests[i]; + test(`test #${parseInt(i)+1}`, () => { + expect(parseApi(tUrl)).toStrictEqual(tExpect); }); } }); diff --git a/src/renderer/api/kube-api.ts b/src/renderer/api/kube-api.ts index ae97092667..869e3a90ea 100644 --- a/src/renderer/api/kube-api.ts +++ b/src/renderer/api/kube-api.ts @@ -68,7 +68,7 @@ export class KubeApi { this.objectConstructor = objectConstructor; this.parseResponse = this.parseResponse.bind(this); - apiManager.registerApi(this); + apiManager.registerApi(apiBase, this); } setResourceVersion(namespace = "", newVersion: string) { diff --git a/src/renderer/components/+nodes/nodes.tsx b/src/renderer/components/+nodes/nodes.tsx index f10273cb94..2b9658fbf3 100644 --- a/src/renderer/components/+nodes/nodes.tsx +++ b/src/renderer/components/+nodes/nodes.tsx @@ -36,66 +36,66 @@ enum sortBy { interface Props extends RouteComponentProps { } -function renderCpuUsage(node: Node) { - const metrics = nodesStore.getLastMetricValues(node, ["cpuUsage", "cpuCapacity"]); - if (!metrics?.[1]) { - return ; +@observer +export class Nodes extends React.Component { + private metricsWatcher = interval(30, () => nodesStore.loadUsageMetrics()); + + componentDidMount() { + this.metricsWatcher.start(true); } - const [usage, cores] = metrics; - const percentage = Math.ceil(usage * 100) / cores; - const CPUTrans = _i18n._(t`CPU`); - const CoreTrans = _i18n._(t`cores`); - - return ; -} - -function renderMemoryUsage(node: Node) { - const metrics = nodesStore.getLastMetricValues(node, ["memoryUsage", "memoryCapacity"]); - if (!metrics?.[1]) { - return ; + componentWillUnmount() { + this.metricsWatcher.stop(); } - const [usage, capacity] = metrics; - const percentage = Math.ceil(usage * 100 / capacity); - const MemoryTrans = _i18n._(t`Memory`); - - return ; -} - -function renderDiskUsage(node: Node): any { - const metrics = nodesStore.getLastMetricValues(node, ["fsUsage", "fsSize"]); - if (!metrics?.[1]) { - return ; + renderCpuUsage(node: Node) { + const metrics = nodesStore.getLastMetricValues(node, ["cpuUsage", "cpuCapacity"]); + if (!metrics || !metrics[1]) return ; + const usage = metrics[0]; + const cores = metrics[1]; + return ( + + ) } - const [usage, capacity] = metrics; - const percentage = Math.ceil(usage * 100 / capacity); - const DiskTrans = _i18n._(t`Disk`); - - return ; -} - -function renderConditions(node: Node) { - if (!node.status.conditions) { - return null + renderMemoryUsage(node: Node) { + const metrics = nodesStore.getLastMetricValues(node, ["memoryUsage", "memoryCapacity"]); + if (!metrics || !metrics[1]) return ; + const usage = metrics[0]; + const capacity = metrics[1]; + return ( + + ) } - return node - .getActiveConditions() - .map(condition => { + renderDiskUsage(node: Node): any { + const metrics = nodesStore.getLastMetricValues(node, ["fsUsage", "fsSize"]); + if (!metrics || !metrics[1]) return ; + const usage = metrics[0]; + const capacity = metrics[1]; + return ( + + ) + } + + renderConditions(node: Node) { + if (!node.status.conditions) { + return null + } + const conditions = node.getActiveConditions(); + return conditions.map(condition => { const { type } = condition const tooltipId = `node-${node.getName()}-condition-${type}` return ( @@ -113,18 +113,6 @@ function renderConditions(node: Node) { ) }) -} - -@observer -export class Nodes extends React.Component { - private metricsWatcher = interval(30, () => nodesStore.loadUsageMetrics()); - - componentDidMount() { - this.metricsWatcher.start(true); - } - - componentWillUnmount() { - this.metricsWatcher.stop(); } render() { @@ -132,8 +120,7 @@ export class Nodes extends React.Component { { const tooltipId = `node-taints-${node.getId()}`; return [ node.getName(), - renderCpuUsage(node), - renderMemoryUsage(node), - renderDiskUsage(node), + this.renderCpuUsage(node), + this.renderMemoryUsage(node), + this.renderDiskUsage(node), <> {node.getTaints().length} @@ -182,10 +169,12 @@ export class Nodes extends React.Component { node.getRoleLabels(), node.status.nodeInfo.kubeletVersion, node.getAge(), - renderConditions(node), + this.renderConditions(node), ] }} - renderItemMenu={(item: Node) => } + renderItemMenu={(item: Node) => { + return + }} /> )