diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index 53e7a52e4b..39adeb647d 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -132,6 +132,14 @@ export class KubernetesCluster< break; } } + + get k8sVersion() { + return this.metadata.kubeVersion?.replace("unknown", "") || ""; + } + + get k8sDistro() { + return this.metadata.distro?.replace("unknown", "") || ""; + } } export class KubernetesClusterCategory extends CatalogCategory { diff --git a/src/common/catalog/categories/kubernetes-cluster.injectable.ts b/src/common/catalog/categories/kubernetes-cluster.injectable.ts index 6dc3f9be8d..533e7ed582 100644 --- a/src/common/catalog/categories/kubernetes-cluster.injectable.ts +++ b/src/common/catalog/categories/kubernetes-cluster.injectable.ts @@ -4,12 +4,10 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { KubernetesClusterCategory } from "../../catalog-entities/kubernetes-cluster"; -import { builtInCategoryInjectionToken } from "../category-registry.injectable"; const kubernetesClusterCategoryInjectable = getInjectable({ id: "kubernetes-cluster-category", instantiate: () => new KubernetesClusterCategory(), - injectionToken: builtInCategoryInjectionToken, }); export default kubernetesClusterCategoryInjectable; diff --git a/src/main/catalog-entities/kubernetes-cluster.ts b/src/main/catalog-entities/kubernetes-cluster.ts new file mode 100644 index 0000000000..de0844d03a --- /dev/null +++ b/src/main/catalog-entities/kubernetes-cluster.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { KubernetesClusterCategory } from "../../common/catalog-entities/kubernetes-cluster"; + +export { + KubernetesClusterCategory, +}; diff --git a/src/main/catalog/categories/kubernetes-cluster.injectable.ts b/src/main/catalog/categories/kubernetes-cluster.injectable.ts new file mode 100644 index 0000000000..dee1f5b151 --- /dev/null +++ b/src/main/catalog/categories/kubernetes-cluster.injectable.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { KubernetesClusterCategory } from "../../catalog-entities/kubernetes-cluster"; +import { builtInCategoryInjectionToken } from "../../../common/catalog/category-registry.injectable"; + +const kubernetesClusterCategoryInjectable = getInjectable({ + id: "kubernetes-cluster-category-main", + instantiate: () => new KubernetesClusterCategory(), + injectionToken: builtInCategoryInjectionToken, +}); + +export default kubernetesClusterCategoryInjectable; diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index d0f671d20a..1d462e3c43 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -42,7 +42,7 @@ import hotbarStoreInjectable from "../common/hotbars/store.injectable"; import { bindEvents } from "./navigation/events"; import openDeleteClusterDialogInjectable from "./components/delete-cluster-dialog/open.injectable"; import { init } from "@sentry/electron/renderer"; -import kubernetesClusterCategoryInjectable from "../common/catalog/categories/kubernetes-cluster.injectable"; +import kubernetesClusterCategoryInjectable from "./catalog/categories/kubernetes-cluster.injectable"; import autoRegistrationInjectable from "../common/k8s-api/api-manager/auto-registration.injectable"; import assert from "assert"; import startFrameInjectable from "./start-frame/start-frame.injectable"; diff --git a/src/common/catalog-entities/__tests__/kubernetes-cluster.test.ts b/src/renderer/catalog-entities/__tests__/kubernetes-cluster.test.ts similarity index 95% rename from src/common/catalog-entities/__tests__/kubernetes-cluster.test.ts rename to src/renderer/catalog-entities/__tests__/kubernetes-cluster.test.ts index d681713a80..4764a77df4 100644 --- a/src/common/catalog-entities/__tests__/kubernetes-cluster.test.ts +++ b/src/renderer/catalog-entities/__tests__/kubernetes-cluster.test.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getDiForUnitTesting } from "../../../renderer/getDiForUnitTesting"; +import { getDiForUnitTesting } from "../../getDiForUnitTesting"; import kubernetesClusterCategoryInjectable from "../../catalog/categories/kubernetes-cluster.injectable"; import type { KubernetesClusterCategory } from "../kubernetes-cluster"; diff --git a/src/renderer/catalog-entities/kubernetes-cluster.module.scss b/src/renderer/catalog-entities/kubernetes-cluster.module.scss new file mode 100644 index 0000000000..71f4b643c6 --- /dev/null +++ b/src/renderer/catalog-entities/kubernetes-cluster.module.scss @@ -0,0 +1,18 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +.statusCell { + max-width: 100px; + + :global { + .connected, .available { + color: var(--colorSuccess); + } + + .disconnected, .deleting, .unavailable { + color: var(--halfGray); + } + } +} \ No newline at end of file diff --git a/src/renderer/catalog-entities/kubernetes-cluster.tsx b/src/renderer/catalog-entities/kubernetes-cluster.tsx new file mode 100644 index 0000000000..620c91bc4d --- /dev/null +++ b/src/renderer/catalog-entities/kubernetes-cluster.tsx @@ -0,0 +1,63 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import React from "react"; +import { categoryVersion } from "../../common/catalog"; +import type { CatalogCategorySpec, CatalogEntityConstructor } from "../../common/catalog"; +import { KubernetesCluster, KubernetesClusterCategory as KubernetesClusterCommonCategory } from "../../common/catalog-entities"; +import styles from "./kubernetes-cluster.module.scss"; + +export class KubernetesClusterCategory extends KubernetesClusterCommonCategory { + public spec: CatalogCategorySpec = { + group: "entity.k8slens.dev", + versions: [ + categoryVersion("v1alpha1", KubernetesCluster as CatalogEntityConstructor), + ], + names: { + kind: "KubernetesCluster", + }, + displayColumns: [ + { + id: "distro", + priority: 30, + renderCell: entity => ( + + {(entity as KubernetesCluster).k8sDistro} + + ), + titleProps: { + title: "Distro", + }, + }, + { + id: "api-version", + priority: 30, + renderCell: entity => ( + + {(entity as KubernetesCluster).k8sVersion} + + ), + titleProps: { + title: "Version", + }, + }, + { + id: "status", + priority: 50, + renderCell: entity => ( + + {entity.status.phase} + + ), + titleProps: { + title: "Status", + className: styles.statusCell, + }, + searchFilter: entity => entity.status.phase, + sortCallback: entity => entity.status.phase, + }, + ], + }; +} diff --git a/src/renderer/catalog/categories/kubernetes-cluster.injectable.ts b/src/renderer/catalog/categories/kubernetes-cluster.injectable.ts new file mode 100644 index 0000000000..d61fd3f7a1 --- /dev/null +++ b/src/renderer/catalog/categories/kubernetes-cluster.injectable.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { KubernetesClusterCategory } from "../../catalog-entities/kubernetes-cluster"; +import { builtInCategoryInjectionToken } from "../../../common/catalog/category-registry.injectable"; + +const kubernetesClusterCategoryInjectable = getInjectable({ + id: "kubernetes-cluster-category-renderer", + instantiate: () => new KubernetesClusterCategory(), + injectionToken: builtInCategoryInjectionToken, +}); + +export default kubernetesClusterCategoryInjectable;