From 04610ec4c6d5b0e5da927b7f4a05e651726ac07d Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Wed, 4 Nov 2020 17:11:28 +0200 Subject: [PATCH] Rename ResourceStatus* -> KubeObjectStatus* Signed-off-by: Lauri Nevala --- .../Makefile | 0 .../package-lock.json | 0 .../package.json | 4 +- .../renderer.tsx | 2 +- .../src/resolver.tsx | 14 +-- .../tsconfig.json | 0 .../webpack.config.js | 0 package.json | 2 +- src/extensions/extension-loader.ts | 4 +- src/extensions/lens-renderer-extension.ts | 4 +- src/extensions/registries/index.ts | 2 +- ...stry.ts => kube-object-status-registry.ts} | 12 +- src/extensions/renderer-api/index.ts | 4 +- .../renderer-api/kube-object-status.ts | 1 + .../renderer-api/resource-status.ts | 1 - .../components/+config-autoscalers/hpa.tsx | 4 +- .../components/+config-maps/config-maps.tsx | 4 +- .../pod-disruption-budgets.tsx | 4 +- .../resource-quotas.tsx | 4 +- .../components/+config-secrets/secrets.tsx | 4 +- .../components/+namespaces/namespaces.tsx | 4 +- .../+network-endpoints/endpoints.tsx | 4 +- .../+network-ingresses/ingresses.tsx | 4 +- .../+network-policies/network-policies.tsx | 4 +- .../components/+network-services/services.tsx | 4 +- src/renderer/components/+nodes/nodes.tsx | 4 +- .../pod-security-policies.tsx | 4 +- .../+storage-classes/storage-classes.tsx | 4 +- .../+storage-volume-claims/volume-claims.tsx | 4 +- .../components/+storage-volumes/volumes.tsx | 4 +- .../role-bindings.tsx | 4 +- .../+user-management-roles/roles.tsx | 4 +- .../service-accounts.tsx | 4 +- .../+workloads-cronjobs/cronjobs.tsx | 4 +- .../+workloads-daemonsets/daemonsets.tsx | 4 +- .../+workloads-deployments/deployments.tsx | 4 +- .../components/+workloads-jobs/jobs.tsx | 4 +- .../+workloads-pods/pod-details-list.tsx | 4 +- .../components/+workloads-pods/pods.tsx | 4 +- .../+workloads-replicasets/replicasets.tsx | 4 +- .../+workloads-statefulsets/statefulsets.tsx | 4 +- .../kube-object-status-icon/index.ts | 1 + .../kube-object-status-icon.scss} | 22 ++-- .../kube-object-status-icon.tsx | 103 ++++++++++++++++++ .../kube-object/kube-object-meta.tsx | 4 +- .../kube-resource-status-icon/index.ts | 1 - .../kube-resource-status-icon.tsx | 103 ------------------ 47 files changed, 194 insertions(+), 194 deletions(-) rename extensions/{event-resource-status => kube-object-event-status}/Makefile (100%) rename extensions/{event-resource-status => kube-object-event-status}/package-lock.json (100%) rename extensions/{event-resource-status => kube-object-event-status}/package.json (83%) rename extensions/{event-resource-status => kube-object-event-status}/renderer.tsx (97%) rename extensions/{event-resource-status => kube-object-event-status}/src/resolver.tsx (79%) rename extensions/{event-resource-status => kube-object-event-status}/tsconfig.json (100%) rename extensions/{event-resource-status => kube-object-event-status}/webpack.config.js (100%) rename src/extensions/registries/{resource-status-registry.ts => kube-object-status-registry.ts} (56%) create mode 100644 src/extensions/renderer-api/kube-object-status.ts delete mode 100644 src/extensions/renderer-api/resource-status.ts create mode 100644 src/renderer/components/kube-object-status-icon/index.ts rename src/renderer/components/{kube-resource-status-icon/kube-resource-status-icon.scss => kube-object-status-icon/kube-object-status-icon.scss} (63%) create mode 100644 src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx delete mode 100644 src/renderer/components/kube-resource-status-icon/index.ts delete mode 100644 src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.tsx diff --git a/extensions/event-resource-status/Makefile b/extensions/kube-object-event-status/Makefile similarity index 100% rename from extensions/event-resource-status/Makefile rename to extensions/kube-object-event-status/Makefile diff --git a/extensions/event-resource-status/package-lock.json b/extensions/kube-object-event-status/package-lock.json similarity index 100% rename from extensions/event-resource-status/package-lock.json rename to extensions/kube-object-event-status/package-lock.json diff --git a/extensions/event-resource-status/package.json b/extensions/kube-object-event-status/package.json similarity index 83% rename from extensions/event-resource-status/package.json rename to extensions/kube-object-event-status/package.json index 8f19c8f183..2805483c9f 100644 --- a/extensions/event-resource-status/package.json +++ b/extensions/kube-object-event-status/package.json @@ -1,7 +1,7 @@ { - "name": "event-resource-status", + "name": "kube-object-event-status", "version": "0.1.0", - "description": "Adds resource status from events", + "description": "Adds kube object status from events", "renderer": "dist/renderer.js", "lens": { "metadata": {}, diff --git a/extensions/event-resource-status/renderer.tsx b/extensions/kube-object-event-status/renderer.tsx similarity index 97% rename from extensions/event-resource-status/renderer.tsx rename to extensions/kube-object-event-status/renderer.tsx index 9b78ce7755..91e1d8b5fc 100644 --- a/extensions/event-resource-status/renderer.tsx +++ b/extensions/kube-object-event-status/renderer.tsx @@ -2,7 +2,7 @@ import { LensRendererExtension, K8sApi } from "@k8slens/extensions"; import { resolveStatus, resolveStatusForCronJobs, resolveStatusForPods } from "./src/resolver" export default class EventResourceStatusRendererExtension extends LensRendererExtension { - resourceStatusTexts = [ + kubeObjectStatusTexts = [ { kind: "Pod", apiVersions: ["v1"], diff --git a/extensions/event-resource-status/src/resolver.tsx b/extensions/kube-object-event-status/src/resolver.tsx similarity index 79% rename from extensions/event-resource-status/src/resolver.tsx rename to extensions/kube-object-event-status/src/resolver.tsx index ccdc5d6592..cb2c122d0f 100644 --- a/extensions/event-resource-status/src/resolver.tsx +++ b/extensions/kube-object-event-status/src/resolver.tsx @@ -1,6 +1,6 @@ -import { ResourceStatus, K8sApi } from "@k8slens/extensions"; +import { KubeObjectStatus, K8sApi } from "@k8slens/extensions"; -export function resolveStatus(object: K8sApi.KubeObject): ResourceStatus.Status { +export function resolveStatus(object: K8sApi.KubeObject): KubeObjectStatus.Status { const eventStore = K8sApi.apiManager.getStore(K8sApi.eventApi) const events = (eventStore as K8sApi.EventStore).getEventsByObject(object); let warnings = events.filter(evt => evt.isWarning()); @@ -9,13 +9,13 @@ export function resolveStatus(object: K8sApi.KubeObject): ResourceStatus.Status } const event = [...warnings, ...events][0]; // get latest event return { - level: ResourceStatus.Level.WARNING, + level: KubeObjectStatus.Level.WARNING, text: `${event.message}`, timestamp: event.metadata.creationTimestamp } } -export function resolveStatusForPods(pod: K8sApi.Pod): ResourceStatus.Status { +export function resolveStatusForPods(pod: K8sApi.Pod): KubeObjectStatus.Status { if (!pod.hasIssues()) { return null } @@ -27,13 +27,13 @@ export function resolveStatusForPods(pod: K8sApi.Pod): ResourceStatus.Status { } const event = [...warnings, ...events][0]; // get latest event return { - level: ResourceStatus.Level.WARNING, + level: KubeObjectStatus.Level.WARNING, text: `${event.message}`, timestamp: event.metadata.creationTimestamp } } -export function resolveStatusForCronJobs(cronJob: K8sApi.CronJob): ResourceStatus.Status { +export function resolveStatusForCronJobs(cronJob: K8sApi.CronJob): KubeObjectStatus.Status { const eventStore = K8sApi.apiManager.getStore(K8sApi.eventApi) let events = (eventStore as K8sApi.EventStore).getEventsByObject(cronJob); let warnings = events.filter(evt => evt.isWarning()); @@ -45,7 +45,7 @@ export function resolveStatusForCronJobs(cronJob: K8sApi.CronJob): ResourceStatu } const event = [...warnings, ...events][0]; // get latest event return { - level: ResourceStatus.Level.WARNING, + level: KubeObjectStatus.Level.WARNING, text: `${event.message}`, timestamp: event.metadata.creationTimestamp } diff --git a/extensions/event-resource-status/tsconfig.json b/extensions/kube-object-event-status/tsconfig.json similarity index 100% rename from extensions/event-resource-status/tsconfig.json rename to extensions/kube-object-event-status/tsconfig.json diff --git a/extensions/event-resource-status/webpack.config.js b/extensions/kube-object-event-status/webpack.config.js similarity index 100% rename from extensions/event-resource-status/webpack.config.js rename to extensions/kube-object-event-status/webpack.config.js diff --git a/package.json b/package.json index c93afba5bb..f87ea0342a 100644 --- a/package.json +++ b/package.json @@ -191,7 +191,7 @@ "metrics-cluster-feature", "license-menu-item", "support-page", - "event-resource-status" + "kube-object-event-status" ] }, "dependencies": { diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index fb8349ef2e..fa8ebe40f8 100644 --- a/src/extensions/extension-loader.ts +++ b/src/extensions/extension-loader.ts @@ -8,7 +8,7 @@ import logger from "../main/logger" import { app, ipcRenderer, remote } from "electron" import { appPreferenceRegistry, clusterFeatureRegistry, clusterPageRegistry, globalPageRegistry, - kubeObjectDetailRegistry, kubeObjectMenuRegistry, menuRegistry, statusBarRegistry, resourceStatusRegistry + kubeObjectDetailRegistry, kubeObjectMenuRegistry, menuRegistry, statusBarRegistry, kubeObjectStatusRegistry } from "./registries"; export interface InstalledExtension extends ExtensionModel { @@ -60,7 +60,7 @@ export class ExtensionLoader { extension.registerTo(clusterPageRegistry, extension.clusterPages) extension.registerTo(kubeObjectMenuRegistry, extension.kubeObjectMenuItems) extension.registerTo(kubeObjectDetailRegistry, extension.kubeObjectDetailItems) - extension.registerTo(resourceStatusRegistry, extension.resourceStatusTexts) + extension.registerTo(kubeObjectStatusRegistry, extension.kubeObjectStatusTexts) }) } diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index ef0563cf81..8c8735da86 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -1,7 +1,7 @@ import type { AppPreferenceRegistration, ClusterFeatureRegistration, KubeObjectMenuRegistration, KubeObjectDetailRegistration, - PageRegistration, StatusBarRegistration, ResourceStatusRegistration + PageRegistration, StatusBarRegistration, KubeObjectStatusRegistration } from "./registries" import { observable } from "mobx"; import { LensExtension } from "./lens-extension" @@ -9,7 +9,7 @@ import { LensExtension } from "./lens-extension" export class LensRendererExtension extends LensExtension { @observable.shallow globalPages: PageRegistration[] = [] @observable.shallow clusterPages: PageRegistration[] = [] - @observable.shallow resourceStatusTexts: ResourceStatusRegistration[] = [] + @observable.shallow kubeObjectStatusTexts: KubeObjectStatusRegistration[] = [] @observable.shallow appPreferences: AppPreferenceRegistration[] = [] @observable.shallow clusterFeatures: ClusterFeatureRegistration[] = [] @observable.shallow statusBarItems: StatusBarRegistration[] = [] diff --git a/src/extensions/registries/index.ts b/src/extensions/registries/index.ts index eb2acae554..fcb9ad03f2 100644 --- a/src/extensions/registries/index.ts +++ b/src/extensions/registries/index.ts @@ -7,4 +7,4 @@ export * from "./status-bar-registry" export * from "./kube-object-detail-registry"; export * from "./kube-object-menu-registry"; export * from "./cluster-feature-registry" -export * from "./resource-status-registry" +export * from "./kube-object-status-registry" diff --git a/src/extensions/registries/resource-status-registry.ts b/src/extensions/registries/kube-object-status-registry.ts similarity index 56% rename from src/extensions/registries/resource-status-registry.ts rename to src/extensions/registries/kube-object-status-registry.ts index 4400aacdfa..5d5ad0a49f 100644 --- a/src/extensions/registries/resource-status-registry.ts +++ b/src/extensions/registries/kube-object-status-registry.ts @@ -2,25 +2,25 @@ import { KubeObject } from "../renderer-api/k8s-api"; import { BaseRegistry } from "./base-registry"; -export enum ResourceStatusLevel { +export enum KubeObjectStatusLevel { INFO = 1, WARNING = 2, CRITICAL = 3 } -export type ResourceStatus = { +export type KubeObjectStatus = { level: number; text: string; timestamp?: string; } -export interface ResourceStatusRegistration { +export interface KubeObjectStatusRegistration { kind: string; apiVersions: string[]; - resolve: (object: KubeObject) => ResourceStatus; + resolve: (object: KubeObject) => KubeObjectStatus; } -export class ResourceStatusRegistry extends BaseRegistry { +export class KubeObjectStatusRegistry extends BaseRegistry { getItemsForKind(kind: string, apiVersion: string) { return this.items.filter((item) => { return item.kind === kind && item.apiVersions.includes(apiVersion) @@ -28,4 +28,4 @@ export class ResourceStatusRegistry extends BaseRegistry { ]} renderTableContents={(hpa: HorizontalPodAutoscaler) => [ hpa.getName(), - , + , hpa.getNs(), this.getTargets(hpa), hpa.getMinPods(), diff --git a/src/renderer/components/+config-maps/config-maps.tsx b/src/renderer/components/+config-maps/config-maps.tsx index ad646b348b..22cc4c354d 100644 --- a/src/renderer/components/+config-maps/config-maps.tsx +++ b/src/renderer/components/+config-maps/config-maps.tsx @@ -10,7 +10,7 @@ import { KubeObjectMenu, KubeObjectMenuProps } from "../kube-object/kube-object- import { KubeObjectListLayout } from "../kube-object"; import { IConfigMapsRouteParams } from "./config-maps.route"; import { apiManager } from "../../api/api-manager"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -48,7 +48,7 @@ export class ConfigMaps extends React.Component { ]} renderTableContents={(configMap: ConfigMap) => [ configMap.getName(), - , + , configMap.getNs(), configMap.getKeys().join(", "), configMap.getAge(), diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx index 99d7ec8e0e..275dcf0c7a 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx @@ -10,7 +10,7 @@ import { KubeObjectMenu, KubeObjectMenuProps } from "../kube-object/kube-object- import { KubeObjectDetailsProps, KubeObjectListLayout } from "../kube-object"; import { IPodDisruptionBudgetsRouteParams } from "./pod-disruption-budgets.route"; import { apiManager } from "../../api/api-manager"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -58,7 +58,7 @@ export class PodDisruptionBudgets extends React.Component { renderTableContents={(pdb: PodDisruptionBudget) => { return [ pdb.getName(), - , + , pdb.getNs(), pdb.getMinAvailable(), pdb.getMaxUnavailable(), diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.tsx b/src/renderer/components/+config-resource-quotas/resource-quotas.tsx index 007d26baf3..971e606fa8 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.tsx +++ b/src/renderer/components/+config-resource-quotas/resource-quotas.tsx @@ -11,7 +11,7 @@ import { AddQuotaDialog } from "./add-quota-dialog"; import { resourceQuotaStore } from "./resource-quotas.store"; import { IResourceQuotaRouteParams } from "./resource-quotas.route"; import { apiManager } from "../../api/api-manager"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -47,7 +47,7 @@ export class ResourceQuotas extends React.Component { ]} renderTableContents={(resourceQuota: ResourceQuota) => [ resourceQuota.getName(), - , + , resourceQuota.getNs(), resourceQuota.getAge(), ]} diff --git a/src/renderer/components/+config-secrets/secrets.tsx b/src/renderer/components/+config-secrets/secrets.tsx index cc72f07f26..bbcfd0b7cf 100644 --- a/src/renderer/components/+config-secrets/secrets.tsx +++ b/src/renderer/components/+config-secrets/secrets.tsx @@ -12,7 +12,7 @@ import { KubeObjectListLayout } from "../kube-object"; import { Badge } from "../badge"; import { secretsStore } from "./secrets.store"; import { apiManager } from "../../api/api-manager"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -57,7 +57,7 @@ export class Secrets extends React.Component { ]} renderTableContents={(secret: Secret) => [ secret.getName(), - , + , secret.getNs(), secret.getLabels().map(label => ), secret.getKeys().join(", "), diff --git a/src/renderer/components/+namespaces/namespaces.tsx b/src/renderer/components/+namespaces/namespaces.tsx index 022455875f..05ef3da964 100644 --- a/src/renderer/components/+namespaces/namespaces.tsx +++ b/src/renderer/components/+namespaces/namespaces.tsx @@ -10,7 +10,7 @@ import { RouteComponentProps } from "react-router"; import { KubeObjectListLayout } from "../kube-object"; import { INamespacesRouteParams } from "./namespaces.route"; import { namespaceStore } from "./namespace.store"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -49,7 +49,7 @@ export class Namespaces extends React.Component { ]} renderTableContents={(item: Namespace) => [ item.getName(), - , + , item.getLabels().map(label => ), item.getAge(), { title: item.getStatus(), className: item.getStatus().toLowerCase() }, diff --git a/src/renderer/components/+network-endpoints/endpoints.tsx b/src/renderer/components/+network-endpoints/endpoints.tsx index c24f57b9ca..b32b19946c 100644 --- a/src/renderer/components/+network-endpoints/endpoints.tsx +++ b/src/renderer/components/+network-endpoints/endpoints.tsx @@ -8,7 +8,7 @@ import { Endpoint } from "../../api/endpoints/endpoint.api" import { endpointStore } from "./endpoints.store"; import { KubeObjectListLayout } from "../kube-object"; import { Trans } from "@lingui/macro"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -43,7 +43,7 @@ export class Endpoints extends React.Component { ]} renderTableContents={(endpoint: Endpoint) => [ endpoint.getName(), - , + , endpoint.getNs(), endpoint.toString(), endpoint.getAge(), diff --git a/src/renderer/components/+network-ingresses/ingresses.tsx b/src/renderer/components/+network-ingresses/ingresses.tsx index ddc47ebdee..2ecfeb1585 100644 --- a/src/renderer/components/+network-ingresses/ingresses.tsx +++ b/src/renderer/components/+network-ingresses/ingresses.tsx @@ -8,7 +8,7 @@ import { Ingress } from "../../api/endpoints/ingress.api" import { ingressStore } from "./ingress.store"; import { KubeObjectListLayout } from "../kube-object"; import { Trans } from "@lingui/macro"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -45,7 +45,7 @@ export class Ingresses extends React.Component { ]} renderTableContents={(ingress: Ingress) => [ ingress.getName(), - , + , ingress.getNs(), ingress.getLoadBalancers().map(lb =>

{lb}

), ingress.getRoutes().map(route =>

{route}

), diff --git a/src/renderer/components/+network-policies/network-policies.tsx b/src/renderer/components/+network-policies/network-policies.tsx index 97978f84e1..f28917f653 100644 --- a/src/renderer/components/+network-policies/network-policies.tsx +++ b/src/renderer/components/+network-policies/network-policies.tsx @@ -8,7 +8,7 @@ import { NetworkPolicy } from "../../api/endpoints/network-policy.api"; import { KubeObjectListLayout } from "../kube-object"; import { INetworkPoliciesRouteParams } from "./network-policies.route"; import { networkPolicyStore } from "./network-policy.store"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -43,7 +43,7 @@ export class NetworkPolicies extends React.Component { ]} renderTableContents={(item: NetworkPolicy) => [ item.getName(), - , + , item.getNs(), item.getTypes().join(", "), item.getAge(), diff --git a/src/renderer/components/+network-services/services.tsx b/src/renderer/components/+network-services/services.tsx index 4cc4a78c08..ed7951a78b 100644 --- a/src/renderer/components/+network-services/services.tsx +++ b/src/renderer/components/+network-services/services.tsx @@ -9,7 +9,7 @@ import { Service } from "../../api/endpoints/service.api"; import { KubeObjectListLayout } from "../kube-object"; import { Badge } from "../badge"; import { serviceStore } from "./services.store"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -61,7 +61,7 @@ export class Services extends React.Component { ]} renderTableContents={(service: Service) => [ service.getName(), - , + , service.getNs(), service.getType(), service.getClusterIp(), diff --git a/src/renderer/components/+nodes/nodes.tsx b/src/renderer/components/+nodes/nodes.tsx index 84beaf905d..9e7c295f6c 100644 --- a/src/renderer/components/+nodes/nodes.tsx +++ b/src/renderer/components/+nodes/nodes.tsx @@ -16,7 +16,7 @@ import { bytesToUnits } from "../../utils/convertMemory"; import { Tooltip, TooltipPosition } from "../tooltip"; import kebabCase from "lodash/kebabCase"; import upperFirst from "lodash/upperFirst"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -163,7 +163,7 @@ export class Nodes extends React.Component { const tooltipId = `node-taints-${node.getId()}`; return [ node.getName(), - , + , this.renderCpuUsage(node), this.renderMemoryUsage(node), this.renderDiskUsage(node), diff --git a/src/renderer/components/+pod-security-policies/pod-security-policies.tsx b/src/renderer/components/+pod-security-policies/pod-security-policies.tsx index 570e7524c1..8ad6b77101 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policies.tsx +++ b/src/renderer/components/+pod-security-policies/pod-security-policies.tsx @@ -6,7 +6,7 @@ import { Trans } from "@lingui/macro"; import { KubeObjectListLayout } from "../kube-object"; import { podSecurityPoliciesStore } from "./pod-security-policies.store"; import { PodSecurityPolicy, pspApi } from "../../api/endpoints"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -45,7 +45,7 @@ export class PodSecurityPolicies extends React.Component { renderTableContents={(item: PodSecurityPolicy) => { return [ item.getName(), - , + , item.isPrivileged() ? Yes : No, item.getVolumes().join(", "), item.getAge(), diff --git a/src/renderer/components/+storage-classes/storage-classes.tsx b/src/renderer/components/+storage-classes/storage-classes.tsx index 7654a9031d..f75b48d691 100644 --- a/src/renderer/components/+storage-classes/storage-classes.tsx +++ b/src/renderer/components/+storage-classes/storage-classes.tsx @@ -8,7 +8,7 @@ import { StorageClass, storageClassApi } from "../../api/endpoints/storage-class import { KubeObjectListLayout } from "../kube-object"; import { IStorageClassesRouteParams } from "./storage-classes.route"; import { storageClassStore } from "./storage-class.store"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -48,7 +48,7 @@ export class StorageClasses extends React.Component { ]} renderTableContents={(storageClass: StorageClass) => [ storageClass.getName(), - , + , storageClass.provisioner, storageClass.getReclaimPolicy(), storageClass.isDefault() ? Yes : null, diff --git a/src/renderer/components/+storage-volume-claims/volume-claims.tsx b/src/renderer/components/+storage-volume-claims/volume-claims.tsx index 82ab8b5f45..e0e789a2e5 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claims.tsx +++ b/src/renderer/components/+storage-volume-claims/volume-claims.tsx @@ -13,7 +13,7 @@ import { unitsToBytes } from "../../utils/convertMemory"; import { stopPropagation } from "../../utils"; import { getDetailsUrl } from "../../navigation"; import { storageClassApi } from "../../api/endpoints"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -68,7 +68,7 @@ export class PersistentVolumeClaims extends React.Component { })); return [ pvc.getName(), - , + , pvc.getNs(), {storageClassName} diff --git a/src/renderer/components/+storage-volumes/volumes.tsx b/src/renderer/components/+storage-volumes/volumes.tsx index d0808e0766..c3b01e0b93 100644 --- a/src/renderer/components/+storage-volumes/volumes.tsx +++ b/src/renderer/components/+storage-volumes/volumes.tsx @@ -11,7 +11,7 @@ import { stopPropagation } from "../../utils"; import { getDetailsUrl } from "../../navigation"; import { volumesStore } from "./volumes.store"; import { pvcApi, storageClassApi } from "../../api/endpoints"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -59,7 +59,7 @@ export class PersistentVolumes extends React.Component { })); return [ volume.getName(), - , + , {storageClassName} , diff --git a/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx b/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx index 061a0bf6c1..cb010a3c1b 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx +++ b/src/renderer/components/+user-management-roles-bindings/role-bindings.tsx @@ -9,7 +9,7 @@ import { RoleBinding } from "../../api/endpoints"; import { roleBindingsStore } from "./role-bindings.store"; import { KubeObjectListLayout } from "../kube-object"; import { AddRoleBindingDialog } from "./add-role-binding-dialog"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -48,7 +48,7 @@ export class RoleBindings extends React.Component { ]} renderTableContents={(binding: RoleBinding) => [ binding.getName(), - , + , binding.getSubjectNames(), binding.getNs() || "-", binding.getAge(), diff --git a/src/renderer/components/+user-management-roles/roles.tsx b/src/renderer/components/+user-management-roles/roles.tsx index f68c2fa376..ca78c1d5d7 100644 --- a/src/renderer/components/+user-management-roles/roles.tsx +++ b/src/renderer/components/+user-management-roles/roles.tsx @@ -9,7 +9,7 @@ import { rolesStore } from "./roles.store"; import { Role } from "../../api/endpoints"; import { KubeObjectListLayout } from "../kube-object"; import { AddRoleDialog } from "./add-role-dialog"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -45,7 +45,7 @@ export class Roles extends React.Component { ]} renderTableContents={(role: Role) => [ role.getName(), - , + , role.getNs() || "-", role.getAge(), ]} diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts.tsx b/src/renderer/components/+user-management-service-accounts/service-accounts.tsx index f18c1642f6..0455a5cdc0 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts.tsx +++ b/src/renderer/components/+user-management-service-accounts/service-accounts.tsx @@ -14,7 +14,7 @@ import { IServiceAccountsRouteParams } from "../+user-management"; import { serviceAccountsStore } from "./service-accounts.store"; import { CreateServiceAccountDialog } from "./create-service-account-dialog"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -49,7 +49,7 @@ export class ServiceAccounts extends React.Component { ]} renderTableContents={(account: ServiceAccount) => [ account.getName(), - , + , account.getNs(), account.getAge(), ]} diff --git a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx index 05a198be1c..ab7609de81 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx @@ -16,7 +16,7 @@ import { KubeObjectListLayout } from "../kube-object"; import { _i18n } from "../../i18n"; import { CronJobTriggerDialog } from "./cronjob-trigger-dialog"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -62,7 +62,7 @@ export class CronJobs extends React.Component { ]} renderTableContents={(cronJob: CronJob) => [ cronJob.getName(), - , + , cronJob.getNs(), cronJob.isNeverRun() ? never : cronJob.getSchedule(), cronJob.getSuspendFlag(), diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.tsx b/src/renderer/components/+workloads-daemonsets/daemonsets.tsx index 1e414e7d2a..e185e7f99a 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonsets.tsx +++ b/src/renderer/components/+workloads-daemonsets/daemonsets.tsx @@ -12,7 +12,7 @@ import { KubeObjectListLayout } from "../kube-object"; import { IDaemonSetsRouteParams } from "../+workloads"; import { Trans } from "@lingui/macro"; import { Badge } from "../badge"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -64,7 +64,7 @@ export class DaemonSets extends React.Component { daemonSet.getName(), daemonSet.getNs(), this.getPodsLength(daemonSet), - , + , this.renderNodeSelector(daemonSet), daemonSet.getAge(), ]} diff --git a/src/renderer/components/+workloads-deployments/deployments.tsx b/src/renderer/components/+workloads-deployments/deployments.tsx index ef73f40b4a..19add5ed88 100644 --- a/src/renderer/components/+workloads-deployments/deployments.tsx +++ b/src/renderer/components/+workloads-deployments/deployments.tsx @@ -21,7 +21,7 @@ import { cssNames } from "../../utils"; import kebabCase from "lodash/kebabCase"; import orderBy from "lodash/orderBy"; import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -81,7 +81,7 @@ export class Deployments extends React.Component { deployment.getNs(), this.renderPods(deployment), deployment.getReplicas(), - , + , deployment.getAge(), this.renderConditions(deployment), ]} diff --git a/src/renderer/components/+workloads-jobs/jobs.tsx b/src/renderer/components/+workloads-jobs/jobs.tsx index 87c0e634b6..10bb99d53a 100644 --- a/src/renderer/components/+workloads-jobs/jobs.tsx +++ b/src/renderer/components/+workloads-jobs/jobs.tsx @@ -11,7 +11,7 @@ import { Job } from "../../api/endpoints/job.api"; import { KubeObjectListLayout } from "../kube-object"; import { IJobsRouteParams } from "../+workloads"; import kebabCase from "lodash/kebabCase"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -54,7 +54,7 @@ export class Jobs extends React.Component { job.getName(), job.getNs(), `${job.getCompletions()} / ${job.getDesiredCompletions()}`, - , + , job.getAge(), condition && { title: condition.type, diff --git a/src/renderer/components/+workloads-pods/pod-details-list.tsx b/src/renderer/components/+workloads-pods/pod-details-list.tsx index 9e72d9cb7f..ada7ff7753 100644 --- a/src/renderer/components/+workloads-pods/pod-details-list.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-list.tsx @@ -14,7 +14,7 @@ import { showDetails } from "../../navigation"; import { reaction } from "mobx"; import { Spinner } from "../spinner"; import { DrawerTitle } from "../drawer"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -107,7 +107,7 @@ export class PodDetailsList extends React.Component { onClick={prevDefault(() => showDetails(pod.selfLink, false))} > {pod.getName()} - + {pod.getNs()} {this.renderCpuUsage(`cpu-${pod.getId()}`, metrics.cpu)} {this.renderMemoryUsage(`memory-${pod.getId()}`, metrics.memory)} diff --git a/src/renderer/components/+workloads-pods/pods.tsx b/src/renderer/components/+workloads-pods/pods.tsx index 84a6c175be..04f99c00ff 100644 --- a/src/renderer/components/+workloads-pods/pods.tsx +++ b/src/renderer/components/+workloads-pods/pods.tsx @@ -18,7 +18,7 @@ import toPairs from "lodash/toPairs"; import startCase from "lodash/startCase"; import kebabCase from "lodash/kebabCase"; import { lookupApiLink } from "../../api/kube-api"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { @@ -81,7 +81,7 @@ export class Pods extends React.Component { renderPodStatusIcons(pod: Pod) { return ( - + ) } render() { diff --git a/src/renderer/components/+workloads-replicasets/replicasets.tsx b/src/renderer/components/+workloads-replicasets/replicasets.tsx index eaedeb1855..0a4e5ed7ff 100644 --- a/src/renderer/components/+workloads-replicasets/replicasets.tsx +++ b/src/renderer/components/+workloads-replicasets/replicasets.tsx @@ -12,7 +12,7 @@ import { DrawerTitle } from "../drawer"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { showDetails } from "../../navigation"; import { apiManager } from "../../api/api-manager"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -73,7 +73,7 @@ export class ReplicaSets extends React.Component { onClick={prevDefault(() => showDetails(replica.selfLink, false))} > {replica.getName()} - + {replica.getNs()} {this.getPodsLength(replica)} {replica.getAge()} diff --git a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx index ebcc2e522c..805c6b0911 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx @@ -11,7 +11,7 @@ import { nodesStore } from "../+nodes/nodes.store"; import { eventStore } from "../+events/event.store"; import { KubeObjectListLayout } from "../kube-object"; import { IStatefulSetsRouteParams } from "../+workloads"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; enum sortBy { name = "name", @@ -55,7 +55,7 @@ export class StatefulSets extends React.Component { statefulSet.getName(), statefulSet.getNs(), this.getPodsLength(statefulSet), - , + , statefulSet.getAge(), ]} /> diff --git a/src/renderer/components/kube-object-status-icon/index.ts b/src/renderer/components/kube-object-status-icon/index.ts new file mode 100644 index 0000000000..79aecb7414 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/index.ts @@ -0,0 +1 @@ +export * from "./kube-object-status-icon" \ No newline at end of file diff --git a/src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.scss b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.scss similarity index 63% rename from src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.scss rename to src/renderer/components/kube-object-status-icon/kube-object-status-icon.scss index cddd891a0d..f4edf77279 100644 --- a/src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.scss +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.scss @@ -1,32 +1,32 @@ -.ResourceStatusIcon { +.KubeObjectStatusIcon { &.warning { color: $golden; } } -.ResourceStatusTooltip { +.KubeObjectStatusTooltip { white-space: normal; - - .ResourceStatusLevel { + .level { padding: 4px; &:not(:only-child):not(:last-child) { border-bottom: 1px solid $borderFaintColor; } + .title { + font-weight: bold; + .Icon { + margin-right: $margin; + } + } + .msg { margin: $margin / 2 } + .age { color: $halfGray; } } - - .ResourceStatusTitle { - font-weight: bold; - .Icon { - margin-right: $margin; - } - } } diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx new file mode 100644 index 0000000000..8091b6b5c8 --- /dev/null +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx @@ -0,0 +1,103 @@ +import "./kube-object-status-icon.scss"; + +import React from "react"; +import { Icon } from "../icon"; +import { KubeObject } from "../../api/kube-object"; +import { cssNames, formatDuration } from "../../utils"; +import { KubeObjectStatusRegistration, KubeObjectStatus, KubeObjectStatusLevel, kubeObjectStatusRegistry } from "../../../extensions/registries/kube-object-status-registry" +import { computed } from "mobx"; + +interface Props { + object: KubeObject; +} + +export class KubeObjectStatusIcon extends React.Component { + @computed get objectStatuses() { + const { object } = this.props; + const registrations = kubeObjectStatusRegistry.getItemsForKind(object.kind, object.apiVersion) + return registrations.map((item: KubeObjectStatusRegistration) => { return item.resolve(object) }).filter((item: KubeObjectStatus) => !!item) + } + + statusClassName(level: number): string { + switch (level) { + case KubeObjectStatusLevel.INFO: + return "info" + case KubeObjectStatusLevel.WARNING: + return "warning" + case KubeObjectStatusLevel.CRITICAL: + return "error" + default: + return ""; + } + } + + statusTitle(level: number): string { + switch (level) { + case KubeObjectStatusLevel.INFO: + return "Info" + case KubeObjectStatusLevel.WARNING: + return "Warning" + case KubeObjectStatusLevel.CRITICAL: + return "Critical" + default: + return ""; + } + } + + getAge(timestamp: string) { + if (!timestamp) return "" + const diff = new Date().getTime() - new Date(timestamp).getTime(); + return formatDuration(diff, true); + } + + renderStatuses(statuses: KubeObjectStatus[], level: number) { + const filteredStatuses = statuses.filter((item) => item.level == level) + + return filteredStatuses.length > 0 && ( +
+ + {this.statusTitle(level)} + + { filteredStatuses.map((status, index) =>{ + return ( +
+ - {status.text} · { this.getAge(status.timestamp) } +
+ ) + })} +
+ ) + } + + render() { + const { objectStatuses} = this + if (!objectStatuses.length) return null + + const sortedStatuses = objectStatuses.sort((a: KubeObjectStatus, b: KubeObjectStatus) => { + if (a.level < b.level ) { + return 1 + } + if (a.level > b.level ) { + return -1 + } + return 0 + }) + + const level = this.statusClassName(sortedStatuses[0].level) + return ( + + {this.renderStatuses(sortedStatuses, KubeObjectStatusLevel.CRITICAL)} + {this.renderStatuses(sortedStatuses, KubeObjectStatusLevel.WARNING)} + {this.renderStatuses(sortedStatuses, KubeObjectStatusLevel.INFO)} + + ) + }} + /> + ) + } +} diff --git a/src/renderer/components/kube-object/kube-object-meta.tsx b/src/renderer/components/kube-object/kube-object-meta.tsx index 6df6e0c976..d9f317e66e 100644 --- a/src/renderer/components/kube-object/kube-object-meta.tsx +++ b/src/renderer/components/kube-object/kube-object-meta.tsx @@ -5,7 +5,7 @@ import { DrawerItem, DrawerItemLabels } from "../drawer"; import { getDetailsUrl } from "../../navigation"; import { lookupApiLink } from "../../api/kube-api"; import { Link } from "react-router-dom"; -import { KubeResourceStatusIcon } from "../kube-resource-status-icon"; +import { KubeObjectStatusIcon } from "../kube-object-status-icon"; export interface Props { object: KubeObject; @@ -37,7 +37,7 @@ export class KubeObjectMeta extends React.Component { {getAge(true, false)} ago ({creationTimestamp}) Name} hidden={this.isHidden("name")}> - {getName()} + {getName()} Namespace} hidden={this.isHidden("namespace") || !getNs()}> {getNs()} diff --git a/src/renderer/components/kube-resource-status-icon/index.ts b/src/renderer/components/kube-resource-status-icon/index.ts deleted file mode 100644 index 2097790c33..0000000000 --- a/src/renderer/components/kube-resource-status-icon/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./kube-resource-status-icon" \ No newline at end of file diff --git a/src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.tsx b/src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.tsx deleted file mode 100644 index 04a21890fc..0000000000 --- a/src/renderer/components/kube-resource-status-icon/kube-resource-status-icon.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import "./kube-resource-status-icon.scss"; - -import React from "react"; -import { Icon } from "../icon"; -import { KubeObject } from "../../api/kube-object"; -import { cssNames, formatDuration } from "../../utils"; -import { ResourceStatusRegistration, ResourceStatus, ResourceStatusLevel, resourceStatusRegistry } from "../../../extensions/registries/resource-status-registry" -import { computed } from "mobx"; - -interface Props { - object: KubeObject; -} - -export class KubeResourceStatusIcon extends React.Component { - @computed get resourceStatuses() { - const { object } = this.props; - const registrations = resourceStatusRegistry.getItemsForKind(object.kind, object.apiVersion) - return registrations.map((item: ResourceStatusRegistration) => { return item.resolve(object) }).filter((item: ResourceStatus) => !!item) - } - - resourceStatusClassName(level: number): string { - switch (level) { - case ResourceStatusLevel.INFO: - return "info" - case ResourceStatusLevel.WARNING: - return "warning" - case ResourceStatusLevel.CRITICAL: - return "error" - default: - return ""; - } - } - - resourceStatusTitle(level: number): string { - switch (level) { - case ResourceStatusLevel.INFO: - return "Info" - case ResourceStatusLevel.WARNING: - return "Warning" - case ResourceStatusLevel.CRITICAL: - return "Critical" - default: - return ""; - } - } - - getAge(timestamp: string) { - if (!timestamp) return "" - const diff = new Date().getTime() - new Date(timestamp).getTime(); - return formatDuration(diff, true); - } - - renderStatuses(statuses: ResourceStatus[], level: number) { - const filteredStatuses = statuses.filter((item) => item.level == level) - - return filteredStatuses.length > 0 && ( -
- - {this.resourceStatusTitle(level)} - - { filteredStatuses.map((status, index) =>{ - return ( -
- - {status.text} · { this.getAge(status.timestamp) } -
- ) - })} -
- ) - } - - render() { - const { resourceStatuses} = this - if (!resourceStatuses.length) return null - - const sortedStatuses = resourceStatuses.sort((a: ResourceStatus, b: ResourceStatus) => { - if (a.level < b.level ) { - return 1 - } - if (a.level > b.level ) { - return -1 - } - return 0 - }) - - const level = this.resourceStatusClassName(sortedStatuses[0].level) - return ( - - {this.renderStatuses(sortedStatuses, ResourceStatusLevel.CRITICAL)} - {this.renderStatuses(sortedStatuses, ResourceStatusLevel.WARNING)} - {this.renderStatuses(sortedStatuses, ResourceStatusLevel.INFO)} - - ) - }} - /> - ) - } -}