From db9a6b1e41d2714020aef20d4133e02d8bc5aa80 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Fri, 30 Oct 2020 17:38:00 +0200 Subject: [PATCH] Implement API ResourceStatusText extension Signed-off-by: Lauri Nevala --- src/extensions/extension-loader.ts | 6 +++- src/extensions/lens-renderer-extension.ts | 3 +- src/extensions/registries/index.ts | 1 + .../registries/resource-status-registry.ts | 36 +++++++++++++++++++ src/extensions/renderer-api/index.ts | 2 ++ .../renderer-api/resource-status.ts | 1 + .../components/+workloads-pods/pods.tsx | 25 +++++++++++-- 7 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/extensions/registries/resource-status-registry.ts create mode 100644 src/extensions/renderer-api/resource-status.ts diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index 5495438555..bf5b843d66 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 + kubeObjectDetailRegistry, kubeObjectMenuRegistry, menuRegistry, statusBarRegistry, resourceStatusRegistry } from "./registries"; export interface InstalledExtension extends ExtensionModel { @@ -59,7 +59,11 @@ export class ExtensionLoader { this.autoloadExtensions((extension: LensRendererExtension) => { extension.registerTo(clusterPageRegistry, extension.clusterPages) extension.registerTo(kubeObjectMenuRegistry, extension.kubeObjectMenuItems) +<<<<<<< HEAD extension.registerTo(kubeObjectDetailRegistry, extension.kubeObjectDetailItems) +======= + extension.registerTo(resourceStatusRegistry, extension.resourceStatusTexts) +>>>>>>> 4f6b790d... Implement API ResourceStatusText extension }) } diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index 502734854f..ef0563cf81 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 + PageRegistration, StatusBarRegistration, ResourceStatusRegistration } from "./registries" import { observable } from "mobx"; import { LensExtension } from "./lens-extension" @@ -9,6 +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 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 137a725170..eb2acae554 100644 --- a/src/extensions/registries/index.ts +++ b/src/extensions/registries/index.ts @@ -7,3 +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" diff --git a/src/extensions/registries/resource-status-registry.ts b/src/extensions/registries/resource-status-registry.ts new file mode 100644 index 0000000000..740676f3ff --- /dev/null +++ b/src/extensions/registries/resource-status-registry.ts @@ -0,0 +1,36 @@ +import { KubeObject } from "../renderer-api/k8s-api"; + +import { BaseRegistry } from "./base-registry"; + +export enum ResourceStatusColor { + INFO = "info", + SUCCESS = "success", + ERROR = "error" +} + +export abstract class ResourceStatusResolver { + protected object: KubeObject + + constructor(object: KubeObject) { + this.object = object + } + + public abstract getStatusText(): string + public abstract getStatusColor(): string +} + +export interface ResourceStatusRegistration { + kind: string; + apiVersions: string[]; + resolver: (object: KubeObject) => ResourceStatusResolver; +} + +export class ResourceStatusRegistry extends BaseRegistry { + getItemsForKind(kind: string, apiVersion: string) { + return this.items.filter((item) => { + return item.kind === kind && item.apiVersions.includes(apiVersion) + }) + } +} + +export const resourceStatusRegistry = new ResourceStatusRegistry(); diff --git a/src/extensions/renderer-api/index.ts b/src/extensions/renderer-api/index.ts index ef6de69e61..b4e36d1a4e 100644 --- a/src/extensions/renderer-api/index.ts +++ b/src/extensions/renderer-api/index.ts @@ -4,9 +4,11 @@ import * as Component from "./components" import * as K8sApi from "./k8s-api" import * as Navigation from "./navigation" +import * as ResourceStatus from "./resource-status" export { Component, K8sApi, Navigation, + ResourceStatus } diff --git a/src/extensions/renderer-api/resource-status.ts b/src/extensions/renderer-api/resource-status.ts new file mode 100644 index 0000000000..abffb008db --- /dev/null +++ b/src/extensions/renderer-api/resource-status.ts @@ -0,0 +1 @@ +export { ResourceStatusResolver as Resolver, ResourceStatusColor as Color } from "../registries/resource-status-registry" \ No newline at end of file diff --git a/src/renderer/components/+workloads-pods/pods.tsx b/src/renderer/components/+workloads-pods/pods.tsx index 0d36c50c34..a31447f297 100644 --- a/src/renderer/components/+workloads-pods/pods.tsx +++ b/src/renderer/components/+workloads-pods/pods.tsx @@ -1,6 +1,6 @@ import "./pods.scss" -import React, { Fragment } from "react"; +import React, { Children, Fragment } from "react"; import { observer } from "mobx-react"; import { Link } from "react-router-dom"; import { Trans } from "@lingui/macro"; @@ -19,6 +19,8 @@ import toPairs from "lodash/toPairs"; import startCase from "lodash/startCase"; import kebabCase from "lodash/kebabCase"; import { lookupApiLink } from "../../api/kube-api"; +import { resourceStatusRegistry } from "../../../extensions/registries/resource-status-registry"; +import { ResourceStatus } from "../resource-status"; enum sortBy { name = "name", @@ -67,6 +69,25 @@ export class Pods extends React.Component { }); } + renderPodStatus(pod: Pod) { + const podStatusTextsFromExtensions = resourceStatusRegistry.getItemsForKind(pod.kind, pod.apiVersion).map((item, index) => { + const podStatusResolver = item.resolver(pod) + return ( + + {podStatusResolver.getStatusText()} + + ) + }); + return { + className: kebabCase(pod.getStatusMessage()), + children: ( + + {pod.getStatusMessage()} {podStatusTextsFromExtensions} + + ) + } + } + render() { return ( { }), pod.getQosClass(), pod.getAge(), - { title: pod.getStatusMessage(), className: kebabCase(pod.getStatusMessage()) } + this.renderPodStatus(pod) ]} /> )