mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Kludge "isEnabledForCluster" work again for kube object details
Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
7a2ab23621
commit
8e9d5cbf5e
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,172 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
import type { AsyncFnMock } from "@async-fn/jest";
|
||||
import asyncFn from "@async-fn/jest";
|
||||
import type { RenderResult } from "@testing-library/react";
|
||||
import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
||||
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
||||
import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder";
|
||||
import { getExtensionFakeFor } from "../../../../renderer/components/test-utils/get-extension-fake";
|
||||
import { getInjectable } from "@ogre-tools/injectable";
|
||||
import { frontEndRouteInjectionToken } from "../../../../common/front-end-routing/front-end-route-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import React from "react";
|
||||
import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token";
|
||||
import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token";
|
||||
import { KubeObject } from "../../../../common/k8s-api/kube-object";
|
||||
import extensionShouldBeEnabledForClusterFrameInjectable from "../../../../renderer/extension-loader/extension-should-be-enabled-for-cluster-frame.injectable";
|
||||
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
|
||||
import { KubeObjectDetails } from "../../../../renderer/components/kube-object-details";
|
||||
import type { ApiManager } from "../../../../common/k8s-api/api-manager";
|
||||
|
||||
describe("disable kube object detail items when cluster is not relevant", () => {
|
||||
let builder: ApplicationBuilder;
|
||||
let rendered: RenderResult;
|
||||
let isEnabledForClusterMock: AsyncFnMock<
|
||||
(cluster: KubernetesCluster) => boolean
|
||||
>;
|
||||
|
||||
beforeEach(async () => {
|
||||
builder = getApplicationBuilder();
|
||||
|
||||
builder.beforeApplicationStart(({ rendererDi }) => {
|
||||
rendererDi.override(
|
||||
apiManagerInjectable,
|
||||
() =>
|
||||
({
|
||||
getStore: () => ({
|
||||
getByPath: () =>
|
||||
getKubeObjectStub("some-kind", "some-api-version"),
|
||||
}),
|
||||
} as unknown as ApiManager),
|
||||
);
|
||||
});
|
||||
|
||||
const rendererDi = builder.dis.rendererDi;
|
||||
|
||||
rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable);
|
||||
|
||||
rendererDi.register(testRouteInjectable, testRouteComponentInjectable);
|
||||
|
||||
builder.setEnvironmentToClusterFrame();
|
||||
|
||||
const getExtensionFake = getExtensionFakeFor(builder);
|
||||
|
||||
isEnabledForClusterMock = asyncFn();
|
||||
|
||||
const testExtension = getExtensionFake({
|
||||
id: "test-extension-id",
|
||||
name: "test-extension",
|
||||
|
||||
rendererOptions: {
|
||||
isEnabledForCluster: isEnabledForClusterMock,
|
||||
|
||||
kubeObjectDetailItems: [
|
||||
{
|
||||
kind: "some-kind",
|
||||
apiVersions: ["some-api-version"],
|
||||
components: {
|
||||
Details: () => (
|
||||
<div data-testid="some-kube-object-detail-item">
|
||||
Some detail
|
||||
</div>
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
rendered = await builder.render();
|
||||
|
||||
const navigateToRoute = rendererDi.inject(navigateToRouteInjectionToken);
|
||||
const testRoute = rendererDi.inject(testRouteInjectable);
|
||||
|
||||
navigateToRoute(testRoute);
|
||||
|
||||
builder.extensions.enable(testExtension);
|
||||
});
|
||||
|
||||
describe("given not yet known if extension should be enabled for the cluster, when navigating", () => {
|
||||
it("renders", () => {
|
||||
expect(rendered.baseElement).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("does not show the kube object detail item", () => {
|
||||
const actual = rendered.queryByTestId("some-kube-object-detail-item");
|
||||
|
||||
expect(actual).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
describe("given extension shouldn't be enabled for the cluster, when navigating", () => {
|
||||
beforeEach(async () => {
|
||||
await isEnabledForClusterMock.resolve(false);
|
||||
});
|
||||
|
||||
it("renders", () => {
|
||||
expect(rendered.baseElement).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("does not show the kube object detail item", () => {
|
||||
const actual = rendered.queryByTestId("some-kube-object-detail-item");
|
||||
|
||||
expect(actual).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
describe("given extension should be enabled for the cluster, when navigating", () => {
|
||||
beforeEach(async () => {
|
||||
await isEnabledForClusterMock.resolve(true);
|
||||
});
|
||||
|
||||
it("renders", () => {
|
||||
expect(rendered.baseElement).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("shows the kube object detail item", () => {
|
||||
const actual = rendered.getByTestId("some-kube-object-detail-item");
|
||||
|
||||
expect(actual).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const testRouteInjectable = getInjectable({
|
||||
id: "test-route",
|
||||
|
||||
instantiate: () => ({
|
||||
path: "/test-route",
|
||||
clusterFrame: true,
|
||||
isEnabled: computed(() => true),
|
||||
}),
|
||||
|
||||
injectionToken: frontEndRouteInjectionToken,
|
||||
});
|
||||
|
||||
const testRouteComponentInjectable = getInjectable({
|
||||
id: "test-route-component",
|
||||
|
||||
instantiate: (di) => ({
|
||||
route: di.inject(testRouteInjectable),
|
||||
|
||||
Component: () => <KubeObjectDetails />,
|
||||
}),
|
||||
|
||||
injectionToken: routeSpecificComponentInjectionToken,
|
||||
});
|
||||
|
||||
const getKubeObjectStub = (kind: string, apiVersion: string) =>
|
||||
KubeObject.create({
|
||||
apiVersion,
|
||||
kind,
|
||||
metadata: {
|
||||
uid: "some-uid",
|
||||
name: "some-name",
|
||||
resourceVersion: "some-resource-version",
|
||||
namespace: "some-namespace",
|
||||
selfLink: "",
|
||||
},
|
||||
});
|
||||
@ -5,7 +5,7 @@
|
||||
export type { StatusBarRegistration } from "../../renderer/components/status-bar/status-bar-registration";
|
||||
export type { KubeObjectMenuRegistration, KubeObjectMenuComponents } from "../../renderer/components/kube-object-menu/kube-object-menu-registration";
|
||||
export type { AppPreferenceRegistration, AppPreferenceComponents } from "../../renderer/components/+preferences/app-preferences/app-preference-registration";
|
||||
export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../registries/kube-object-detail-registry";
|
||||
export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../../renderer/components/kube-object-details/kube-object-detail-registration";
|
||||
export type { KubeObjectStatusRegistration } from "../../renderer/components/kube-object-status-icon/kube-object-status-registration";
|
||||
export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, PageComponents, PageTarget } from "../registries/page-registry";
|
||||
export type { ClusterPageMenuRegistration, ClusterPageMenuComponents } from "../registries/page-menu-registry";
|
||||
|
||||
@ -12,7 +12,7 @@ import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../..
|
||||
import type { Disposer } from "../../common/utils";
|
||||
import { isDefined, toJS } from "../../common/utils";
|
||||
import logger from "../../main/logger";
|
||||
import type { CatalogEntity, KubernetesCluster } from "../common-api/catalog";
|
||||
import type { KubernetesCluster } from "../common-api/catalog";
|
||||
import type { InstalledExtension } from "../extension-discovery/extension-discovery";
|
||||
import type { LensExtension, LensExtensionConstructor, LensExtensionId } from "../lens-extension";
|
||||
import type { LensRendererExtension } from "../lens-renderer-extension";
|
||||
@ -275,32 +275,10 @@ export class ExtensionLoader {
|
||||
});
|
||||
};
|
||||
|
||||
loadOnClusterRenderer = (getCluster: () => CatalogEntity) => {
|
||||
loadOnClusterRenderer = () => {
|
||||
logger.debug(`${logModule}: load on cluster renderer (dashboard)`);
|
||||
|
||||
this.autoInitExtensions(async (ext) => {
|
||||
const entity = getCluster() as KubernetesCluster;
|
||||
const extension = ext as LensRendererExtension;
|
||||
|
||||
// getCluster must be a callback, as the entity might be available only after an extension has been loaded
|
||||
if (await this.dependencies.getExtensionIsEnabledForCluster(extension, entity)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const removeItems = [
|
||||
registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems),
|
||||
];
|
||||
|
||||
this.onRemoveExtensionId.addListener((removedExtensionId) => {
|
||||
if (removedExtensionId === extension.id) {
|
||||
removeItems.forEach(remove => {
|
||||
remove();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return removeItems;
|
||||
});
|
||||
this.autoInitExtensions(async () => []);
|
||||
};
|
||||
|
||||
protected async loadExtensions(installedExtensions: Map<string, InstalledExtension>, register: (ext: LensExtension) => Promise<Disposer[]>) {
|
||||
|
||||
@ -27,6 +27,7 @@ import { getExtensionRoutePath } from "../renderer/routes/for-extension";
|
||||
import type { LensRendererExtensionDependencies } from "./lens-extension-set-dependencies";
|
||||
import type { KubeObjectHandlerRegistration } from "../renderer/kube-object/handler";
|
||||
import type { AppPreferenceTabRegistration } from "../renderer/components/+preferences/app-preference-tab/app-preference-tab-registration";
|
||||
import type { KubeObjectDetailRegistration } from "../renderer/components/kube-object-details/kube-object-detail-registration";
|
||||
|
||||
export class LensRendererExtension extends LensExtension<LensRendererExtensionDependencies> {
|
||||
globalPages: registries.PageRegistration[] = [];
|
||||
@ -37,7 +38,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
||||
appPreferenceTabs: AppPreferenceTabRegistration[] = [];
|
||||
entitySettings: registries.EntitySettingRegistration[] = [];
|
||||
statusBarItems: StatusBarRegistration[] = [];
|
||||
kubeObjectDetailItems: registries.KubeObjectDetailRegistration[] = [];
|
||||
kubeObjectDetailItems: KubeObjectDetailRegistration[] = [];
|
||||
kubeObjectMenuItems: KubeObjectMenuRegistration[] = [];
|
||||
kubeWorkloadsOverviewItems: WorkloadsOverviewDetailRegistration[] = [];
|
||||
commands: CommandRegistration[] = [];
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
|
||||
export { KubeObjectDetailRegistry } from "../../extensions/registries/kube-object-detail-registry";
|
||||
@ -102,9 +102,6 @@ export async function bootstrap(di: DiContainer) {
|
||||
logger.info(`${logPrefix} initializing EntitySettingsRegistry`);
|
||||
initializers.initEntitySettingsRegistry();
|
||||
|
||||
logger.info(`${logPrefix} initializing KubeObjectDetailRegistry`);
|
||||
initializers.initKubeObjectDetailRegistry();
|
||||
|
||||
logger.info(`${logPrefix} initializing CatalogEntityDetailRegistry`);
|
||||
initializers.initCatalogEntityDetailRegistry();
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ export const FlexVolume: VolumeVariantComponent<"flexVolume"> = (
|
||||
{readOnly.toString()}
|
||||
</DrawerItem>
|
||||
{
|
||||
...Object.entries(options)
|
||||
Object.entries(options)
|
||||
.map(([key, value]) => (
|
||||
<DrawerItem key={key} name={`Option: ${key}`}>
|
||||
{value}
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* 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 { computed } from "mobx";
|
||||
import kubeDetailsUrlParamInjectable from "../kube-detail-params/kube-details-url.injectable";
|
||||
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
|
||||
import loggerInjectable from "../../../common/logger.injectable";
|
||||
|
||||
const currentKubeObjectInDetailsInjectable = getInjectable({
|
||||
id: "current-kube-object-in-details",
|
||||
|
||||
instantiate: (di) => {
|
||||
const urlParam = di.inject(kubeDetailsUrlParamInjectable);
|
||||
const apiManager = di.inject(apiManagerInjectable);
|
||||
const logger = di.inject(loggerInjectable);
|
||||
|
||||
return computed(() => {
|
||||
const path = urlParam.get();
|
||||
|
||||
try {
|
||||
return apiManager.getStore(path)?.getByPath(path);
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
`[KUBE-OBJECT-DETAILS]: failed to get store or object ${path}: ${error}`,
|
||||
);
|
||||
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export default currentKubeObjectInDetailsInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ClusterRoleBindingDetails } from "../../../+user-management/+cluster-role-bindings";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
|
||||
const clusterRoleBindingDetailItemInjectable = getInjectable({
|
||||
id: "cluster-role-binding-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ClusterRoleBindingDetails,
|
||||
enabled: computed(() => isClusterRoleBinding(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default clusterRoleBindingDetailItemInjectable;
|
||||
|
||||
export const isClusterRoleBinding = kubeObjectMatchesToKindAndApiVersion(
|
||||
"ClusterRoleBinding",
|
||||
["rbac.authorization.k8s.io/v1"],
|
||||
);
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ClusterRoleDetails } from "../../../+user-management/+cluster-roles";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
|
||||
const clusterRoleDetailItemInjectable = getInjectable({
|
||||
id: "cluster-role-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ClusterRoleDetails,
|
||||
enabled: computed(() => isClusterRole(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default clusterRoleDetailItemInjectable;
|
||||
|
||||
export const isClusterRole = kubeObjectMatchesToKindAndApiVersion(
|
||||
"ClusterRole",
|
||||
["rbac.authorization.k8s.io/v1"],
|
||||
);
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ConfigMapDetails } from "../../../+config-maps";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const configMapDetailItemInjectable = getInjectable({
|
||||
id: "config-map-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ConfigMapDetails,
|
||||
enabled: computed(() => isConfigMap(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default configMapDetailItemInjectable;
|
||||
|
||||
const isConfigMap = kubeObjectMatchesToKindAndApiVersion("ConfigMap", ["v1"]);
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { CronJobDetails } from "../../../+workloads-cronjobs";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
|
||||
const cronJobDetailItemInjectable = getInjectable({
|
||||
id: "cron-job-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: CronJobDetails,
|
||||
enabled: computed(() => isCronJob(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default cronJobDetailItemInjectable;
|
||||
|
||||
export const isCronJob = kubeObjectMatchesToKindAndApiVersion("CronJob", [
|
||||
"batch/v1beta1",
|
||||
]);
|
||||
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { CRDDetails } from "../../../+custom-resources";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const customResourceDefinitionsDetailItemInjectable = getInjectable({
|
||||
id: "custom-resource-definitions-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: CRDDetails,
|
||||
|
||||
enabled: computed(() => isCustomResourceDefinition(kubeObject.get())),
|
||||
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default customResourceDefinitionsDetailItemInjectable;
|
||||
|
||||
const isCustomResourceDefinition = kubeObjectMatchesToKindAndApiVersion(
|
||||
"CustomResourceDefinition",
|
||||
["apiextensions.k8s.io/v1", "apiextensions.k8s.io/v1beta1"],
|
||||
);
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { DaemonSetDetails } from "../../../+workloads-daemonsets";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const daemonSetDetailItemInjectable = getInjectable({
|
||||
id: "daemon-set-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: DaemonSetDetails,
|
||||
enabled: computed(() => isDaemonSet(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default daemonSetDetailItemInjectable;
|
||||
|
||||
export const isDaemonSet = kubeObjectMatchesToKindAndApiVersion("DaemonSet", [
|
||||
"apps/v1",
|
||||
]);
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { DeploymentDetails } from "../../../+workloads-deployments";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
|
||||
const deploymentDetailItemInjectable = getInjectable({
|
||||
id: "deployment-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: DeploymentDetails,
|
||||
enabled: computed(() => isDeployment(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isDeployment = kubeObjectMatchesToKindAndApiVersion("Deployment", [
|
||||
"apps/v1",
|
||||
]);
|
||||
|
||||
export default deploymentDetailItemInjectable;
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { EndpointsDetails } from "../../../+network-endpoints";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const endpointsDetailItemInjectable = getInjectable({
|
||||
id: "endpoints-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: EndpointsDetails,
|
||||
enabled: computed(() => isEndpoint(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isEndpoint = kubeObjectMatchesToKindAndApiVersion("Endpoints", [
|
||||
"v1",
|
||||
]);
|
||||
|
||||
export default endpointsDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { EventDetails } from "../../../+events";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const eventsDetailItemInjectable = getInjectable({
|
||||
id: "events-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: EventDetails,
|
||||
enabled: computed(() => isEvent(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isEvent = kubeObjectMatchesToKindAndApiVersion("Event", ["v1"]);
|
||||
|
||||
export default eventsDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { HpaDetails } from "../../../+config-autoscalers";
|
||||
import { computed } from "mobx";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const horizontalPodAutoscalerDetailItemInjectable = getInjectable({
|
||||
id: "horizontal-pod-autoscaler-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: HpaDetails,
|
||||
enabled: computed(() => isHorizontalPodAutoscaler(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isHorizontalPodAutoscaler = kubeObjectMatchesToKindAndApiVersion(
|
||||
"HorizontalPodAutoscaler",
|
||||
["autoscaling/v2beta1"],
|
||||
);
|
||||
|
||||
export default horizontalPodAutoscalerDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { IngressDetails } from "../../../+network-ingresses";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const ingressDetailItemInjectable = getInjectable({
|
||||
id: "ingress-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: IngressDetails,
|
||||
enabled: computed(() => isIngress(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isIngress = kubeObjectMatchesToKindAndApiVersion("Ingress", [
|
||||
"networking.k8s.io/v1",
|
||||
"extensions/v1beta1",
|
||||
]);
|
||||
|
||||
export default ingressDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { JobDetails } from "../../../+workloads-jobs";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const jobDetailItemInjectable = getInjectable({
|
||||
id: "job-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: JobDetails,
|
||||
enabled: computed(() => isJob(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isJob = kubeObjectMatchesToKindAndApiVersion("Job", ["batch/v1"]);
|
||||
|
||||
export default jobDetailItemInjectable;
|
||||
@ -0,0 +1,84 @@
|
||||
/**
|
||||
* 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 { computed } from "mobx";
|
||||
import { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { KubeEventDetails } from "../../../+events/kube-event-details";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
import { isClusterRole } from "./cluster-role-detail-item.injectable";
|
||||
import { isClusterRoleBinding } from "./cluster-role-binding-detail-item.injectable";
|
||||
import { isCronJob } from "./cron-job-detail-item.injectable";
|
||||
import { isDaemonSet } from "./daemon-set-detail-item.injectable";
|
||||
import { isDeployment } from "./deployment-detail-item.injectable";
|
||||
import { isEndpoint } from "./endpoints-detail-item.injectable";
|
||||
import { isHorizontalPodAutoscaler } from "./horizontal-pod-autoscaler-detail-item.injectable";
|
||||
import { isIngress } from "./ingress-detail-item.injectable";
|
||||
import { isJob } from "./job-detail-item.injectable";
|
||||
import { isNetworkPolicy } from "./network-policy-detail-item.injectable";
|
||||
import { isPersistentVolume } from "./persistent-volume-detail-item.injectable";
|
||||
import { isPersistentVolumeClaim } from "./persistent-volume-claim-detail-item.injectable";
|
||||
import { isNode } from "./node-detail-item.injectable";
|
||||
import { isPod } from "./pod-detail-item.injectable";
|
||||
import { isReplicaSet } from "./replica-set-detail-item.injectable";
|
||||
import { isRole } from "./role-detail-item.injectable";
|
||||
import { isRoleBinding } from "./role-binding-detail-item.injectable";
|
||||
import { isService } from "./service-detail-item.injectable";
|
||||
import { isServiceAccount } from "./service-account-detail-item.injectable";
|
||||
import { isStatefulSet } from "./stateful-set-detail-item.injectable";
|
||||
import { isStorageClass } from "./storage-class-detail-item.injectable";
|
||||
|
||||
const kubeEventForClusterRoleDetailItemInjectable = getInjectable({
|
||||
id: "kube-event-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const currentKubeObjectInDetails = di.inject(
|
||||
currentKubeObjectInDetailsInjectable,
|
||||
);
|
||||
|
||||
return {
|
||||
Component: KubeEventDetails,
|
||||
|
||||
enabled: computed(() => {
|
||||
const kubeObject = currentKubeObjectInDetails.get();
|
||||
|
||||
if (!kubeObject) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const predicates = [
|
||||
isClusterRole,
|
||||
isClusterRoleBinding,
|
||||
isCronJob,
|
||||
isDaemonSet,
|
||||
isDeployment,
|
||||
isEndpoint,
|
||||
isHorizontalPodAutoscaler,
|
||||
isIngress,
|
||||
isJob,
|
||||
isNetworkPolicy,
|
||||
isNode,
|
||||
isPersistentVolume,
|
||||
isPersistentVolumeClaim,
|
||||
isPod,
|
||||
isReplicaSet,
|
||||
isRole,
|
||||
isRoleBinding,
|
||||
isService,
|
||||
isServiceAccount,
|
||||
isStatefulSet,
|
||||
isStorageClass,
|
||||
];
|
||||
|
||||
return predicates.some((predicate) => predicate(kubeObject));
|
||||
}),
|
||||
|
||||
orderNumber: 355,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export default kubeEventForClusterRoleDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { LimitRangeDetails } from "../../../+config-limit-ranges";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const limitRangeDetailItemInjectable = getInjectable({
|
||||
id: "limit-range-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: LimitRangeDetails,
|
||||
enabled: computed(() => isLimitRange(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isLimitRange = kubeObjectMatchesToKindAndApiVersion("LimitRange", ["v1"]);
|
||||
|
||||
export default limitRangeDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { NamespaceDetails } from "../../../+namespaces";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const namespacesDetailItemInjectable = getInjectable({
|
||||
id: "namespaces-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: NamespaceDetails,
|
||||
enabled: computed(() => isNamespace(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isNamespace = kubeObjectMatchesToKindAndApiVersion("Namespace", ["v1"]);
|
||||
|
||||
export default namespacesDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { NetworkPolicyDetails } from "../../../+network-policies";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const networkPolicyDetailItemInjectable = getInjectable({
|
||||
id: "network-policy-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: NetworkPolicyDetails,
|
||||
enabled: computed(() => isNetworkPolicy(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isNetworkPolicy = kubeObjectMatchesToKindAndApiVersion(
|
||||
"NetworkPolicy",
|
||||
["networking.k8s.io/v1"],
|
||||
);
|
||||
|
||||
export default networkPolicyDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { NodeDetails } from "../../../+nodes/details";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
|
||||
const nodeDetailItemInjectable = getInjectable({
|
||||
id: "node-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: NodeDetails,
|
||||
enabled: computed(() => isNode(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isNode = kubeObjectMatchesToKindAndApiVersion("Node", ["v1"]);
|
||||
|
||||
export default nodeDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { PersistentVolumeClaimDetails } from "../../../+storage-volume-claims";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const persistentVolumeClaimDetailItemInjectable = getInjectable({
|
||||
id: "persistent-volume-claim-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: PersistentVolumeClaimDetails,
|
||||
enabled: computed(() => isPersistentVolumeClaim(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isPersistentVolumeClaim = kubeObjectMatchesToKindAndApiVersion(
|
||||
"PersistentVolumeClaim",
|
||||
["v1"],
|
||||
);
|
||||
|
||||
export default persistentVolumeClaimDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { PersistentVolumeDetails } from "../../../+storage-volumes";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const persistentVolumeDetailItemInjectable = getInjectable({
|
||||
id: "persistent-volume-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: PersistentVolumeDetails,
|
||||
enabled: computed(() => isPersistentVolume(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isPersistentVolume = kubeObjectMatchesToKindAndApiVersion(
|
||||
"PersistentVolume",
|
||||
["v1"],
|
||||
);
|
||||
|
||||
export default persistentVolumeDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { PodDetails } from "../../../+workloads-pods";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const podDetailItemInjectable = getInjectable({
|
||||
id: "pod-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: PodDetails,
|
||||
enabled: computed(() => isPod(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isPod = kubeObjectMatchesToKindAndApiVersion("Pod", ["v1"]);
|
||||
|
||||
export default podDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { PodDisruptionBudgetDetails } from "../../../+config-pod-disruption-budgets";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const podDisruptionBudgetDetailItemInjectable = getInjectable({
|
||||
id: "pod-disruption-budget-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: PodDisruptionBudgetDetails,
|
||||
enabled: computed(() => isPodDisruptionBudget(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isPodDisruptionBudget = kubeObjectMatchesToKindAndApiVersion(
|
||||
"PodDisruptionBudget",
|
||||
["policy/v1beta1"],
|
||||
);
|
||||
|
||||
export default podDisruptionBudgetDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { PodSecurityPolicyDetails } from "../../../+pod-security-policies";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const podSecurityPolicyDetailItemInjectable = getInjectable({
|
||||
id: "pod-security-policy-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: PodSecurityPolicyDetails,
|
||||
enabled: computed(() => isPodSecurityPolicy(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isPodSecurityPolicy = kubeObjectMatchesToKindAndApiVersion(
|
||||
"PodSecurityPolicy",
|
||||
["policy/v1beta1"],
|
||||
);
|
||||
|
||||
export default podSecurityPolicyDetailItemInjectable;
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ReplicaSetDetails } from "../../../+workloads-replicasets";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const replicaSetDetailItemInjectable = getInjectable({
|
||||
id: "replica-set-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ReplicaSetDetails,
|
||||
enabled: computed(() => isReplicaSet(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isReplicaSet = kubeObjectMatchesToKindAndApiVersion("ReplicaSet", [
|
||||
"apps/v1",
|
||||
]);
|
||||
|
||||
export default replicaSetDetailItemInjectable;
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ResourceQuotaDetails } from "../../../+config-resource-quotas";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const resourceQuotaDetailItemInjectable = getInjectable({
|
||||
id: "resource-quota-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ResourceQuotaDetails,
|
||||
enabled: computed(() => isResourceQuota(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isResourceQuota = kubeObjectMatchesToKindAndApiVersion("ResourceQuota", [
|
||||
"v1",
|
||||
]);
|
||||
|
||||
export default resourceQuotaDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { RoleBindingDetails } from "../../../+user-management/+role-bindings";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const roleBindingDetailItemInjectable = getInjectable({
|
||||
id: "role-binding-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: RoleBindingDetails,
|
||||
enabled: computed(() => isRoleBinding(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isRoleBinding = kubeObjectMatchesToKindAndApiVersion(
|
||||
"RoleBinding",
|
||||
["rbac.authorization.k8s.io/v1"],
|
||||
);
|
||||
|
||||
export default roleBindingDetailItemInjectable;
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { RoleDetails } from "../../../+user-management/+roles";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const roleDetailItemInjectable = getInjectable({
|
||||
id: "role-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: RoleDetails,
|
||||
enabled: computed(() => isRole(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isRole = kubeObjectMatchesToKindAndApiVersion("Role", [
|
||||
"rbac.authorization.k8s.io/v1",
|
||||
]);
|
||||
|
||||
export default roleDetailItemInjectable;
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { SecretDetails } from "../../../+config-secrets";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const secretsDetailItemInjectable = getInjectable({
|
||||
id: "secrets-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: SecretDetails,
|
||||
enabled: computed(() => isSecret(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
const isSecret = kubeObjectMatchesToKindAndApiVersion("Secret", ["v1"]);
|
||||
|
||||
export default secretsDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ServiceAccountsDetails } from "../../../+user-management/+service-accounts";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const serviceAccountDetailItemInjectable = getInjectable({
|
||||
id: "service-account-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ServiceAccountsDetails,
|
||||
enabled: computed(() => isServiceAccount(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isServiceAccount = kubeObjectMatchesToKindAndApiVersion(
|
||||
"ServiceAccount",
|
||||
["v1"],
|
||||
);
|
||||
|
||||
export default serviceAccountDetailItemInjectable;
|
||||
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { ServiceDetails } from "../../../+network-services";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const serviceDetailItemInjectable = getInjectable({
|
||||
id: "service-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: ServiceDetails,
|
||||
enabled: computed(() => isService(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isService = kubeObjectMatchesToKindAndApiVersion("Service", [
|
||||
"v1",
|
||||
]);
|
||||
|
||||
export default serviceDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { StatefulSetDetails } from "../../../+workloads-statefulsets";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const statefulSetDetailItemInjectable = getInjectable({
|
||||
id: "stateful-set-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: StatefulSetDetails,
|
||||
enabled: computed(() => isStatefulSet(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isStatefulSet = kubeObjectMatchesToKindAndApiVersion(
|
||||
"StatefulSet",
|
||||
["apps/v1"],
|
||||
);
|
||||
|
||||
export default statefulSetDetailItemInjectable;
|
||||
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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 { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
|
||||
import { computed } from "mobx";
|
||||
import { StorageClassDetails } from "../../../+storage-classes";
|
||||
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
|
||||
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
|
||||
|
||||
const storageClassDetailItemInjectable = getInjectable({
|
||||
id: "storage-class-detail-item",
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
|
||||
|
||||
return {
|
||||
Component: StorageClassDetails,
|
||||
enabled: computed(() => isStorageClass(kubeObject.get())),
|
||||
orderNumber: 10,
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
|
||||
export const isStorageClass = kubeObjectMatchesToKindAndApiVersion(
|
||||
"StorageClass",
|
||||
["storage.k8s.io/v1"],
|
||||
);
|
||||
|
||||
export default storageClassDetailItemInjectable;
|
||||
@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||
import type { IComputedValue } from "mobx";
|
||||
import type { KubeObjectDetailsProps } from "../kube-object-details";
|
||||
import type React from "react";
|
||||
|
||||
export interface KubeObjectDetailItem {
|
||||
Component: React.ElementType<KubeObjectDetailsProps<any>>;
|
||||
enabled: IComputedValue<boolean>;
|
||||
orderNumber: number;
|
||||
}
|
||||
|
||||
export const kubeObjectDetailItemInjectionToken = getInjectionToken<KubeObjectDetailItem>({
|
||||
id: "kube-object-detail-item-injection-token",
|
||||
});
|
||||
@ -0,0 +1,76 @@
|
||||
/**
|
||||
* 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 { computed } from "mobx";
|
||||
import getRandomIdInjectable from "../../../../common/utils/get-random-id.injectable";
|
||||
import type { LensRendererExtension } from "../../../../extensions/lens-renderer-extension";
|
||||
import extensionShouldBeEnabledForClusterFrameInjectable from "../../../extension-loader/extension-should-be-enabled-for-cluster-frame.injectable";
|
||||
import { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-item-injection-token";
|
||||
import { extensionRegistratorInjectionToken } from "../../../../extensions/extension-loader/extension-registrator-injection-token";
|
||||
import currentKubeObjectInDetailsInjectable from "../current-kube-object-in-details.injectable";
|
||||
import {
|
||||
kubeObjectMatchesToKindAndApiVersion,
|
||||
} from "./kube-object-matches-to-kind-and-api-version";
|
||||
|
||||
const kubeObjectDetailItemRegistratorInjectable = getInjectable({
|
||||
id: "kube-object-detail-item-registrator",
|
||||
|
||||
instantiate: (di) => {
|
||||
const getRandomId = di.inject(getRandomIdInjectable);
|
||||
|
||||
const getExtensionShouldBeEnabledForClusterFrame = (
|
||||
extension: LensRendererExtension,
|
||||
) =>
|
||||
di.inject(extensionShouldBeEnabledForClusterFrameInjectable, extension);
|
||||
|
||||
return (ext) => {
|
||||
const extension = ext as LensRendererExtension;
|
||||
|
||||
const extensionShouldBeEnabledForClusterFrame =
|
||||
getExtensionShouldBeEnabledForClusterFrame(extension);
|
||||
|
||||
return extension.kubeObjectDetailItems.map((registration) => {
|
||||
const id = `kube-object-detail-item-registration-from-${
|
||||
extension.sanitizedExtensionId
|
||||
}-${getRandomId()}`;
|
||||
|
||||
const isRelevantKubeObject = kubeObjectMatchesToKindAndApiVersion(
|
||||
registration.kind,
|
||||
registration.apiVersions,
|
||||
);
|
||||
|
||||
return getInjectable({
|
||||
id,
|
||||
|
||||
instantiate: (di) => {
|
||||
const kubeObject = di.inject(
|
||||
currentKubeObjectInDetailsInjectable,
|
||||
);
|
||||
|
||||
return {
|
||||
kind: registration.kind,
|
||||
apiVersions: registration.apiVersions,
|
||||
Component: registration.components.Details,
|
||||
|
||||
enabled: computed(
|
||||
() =>
|
||||
extensionShouldBeEnabledForClusterFrame.value.get() &&
|
||||
isRelevantKubeObject(kubeObject.get()),
|
||||
),
|
||||
|
||||
orderNumber: 300 - (registration.priority || 50),
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: kubeObjectDetailItemInjectionToken,
|
||||
});
|
||||
});
|
||||
};
|
||||
},
|
||||
|
||||
injectionToken: extensionRegistratorInjectionToken,
|
||||
});
|
||||
|
||||
export default kubeObjectDetailItemRegistratorInjectable;
|
||||
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* 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 { computed } from "mobx";
|
||||
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
|
||||
import { filter, map, sortBy } from "lodash/fp";
|
||||
import { pipeline } from "@ogre-tools/fp";
|
||||
import { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-item-injection-token";
|
||||
|
||||
const kubeObjectDetailItemsInjectable = getInjectable({
|
||||
id: "kube-object-detail-items",
|
||||
|
||||
instantiate: (di) => {
|
||||
const computedInjectMany = di.inject(computedInjectManyInjectable);
|
||||
const items = computedInjectMany(kubeObjectDetailItemInjectionToken);
|
||||
|
||||
return computed(() => {
|
||||
return pipeline(
|
||||
items.get(),
|
||||
filter((item) => item.enabled.get()),
|
||||
sortBy((item) => item.orderNumber),
|
||||
map((item) => item.Component),
|
||||
);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export default kubeObjectDetailItemsInjectable;
|
||||
@ -0,0 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
import type { KubeObject } from "../../../../common/k8s-api/kube-object";
|
||||
|
||||
export const kubeObjectMatchesToKindAndApiVersion =
|
||||
(kind: string, apiVersions: string[]) =>
|
||||
<TKubeObject extends KubeObject>(item?: TKubeObject) =>
|
||||
!!item && item.kind === kind && apiVersions.includes(item.apiVersion);
|
||||
@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
import type { KubeObject } from "../../../common/k8s-api/kube-object";
|
||||
import type { KubeObjectDetailsProps } from "./kube-object-details";
|
||||
import type React from "react";
|
||||
|
||||
export interface KubeObjectDetailComponents<T extends KubeObject = KubeObject> {
|
||||
Details: React.ComponentType<KubeObjectDetailsProps<T>>;
|
||||
}
|
||||
|
||||
export interface KubeObjectDetailRegistration<T extends KubeObject = KubeObject> {
|
||||
kind: string;
|
||||
apiVersions: string[];
|
||||
components: KubeObjectDetailComponents<T>;
|
||||
priority?: number;
|
||||
}
|
||||
@ -7,13 +7,13 @@ import "./kube-object-details.scss";
|
||||
|
||||
import React from "react";
|
||||
import { disposeOnUnmount, observer } from "mobx-react";
|
||||
import type { IComputedValue } from "mobx";
|
||||
import { computed, observable, reaction, makeObservable } from "mobx";
|
||||
import { Drawer } from "../drawer";
|
||||
import type { KubeObject } from "../../../common/k8s-api/kube-object";
|
||||
import { Spinner } from "../spinner";
|
||||
import type { ApiManager } from "../../../common/k8s-api/api-manager";
|
||||
import { KubeObjectMenu } from "../kube-object-menu";
|
||||
import { KubeObjectDetailRegistry } from "../../api/kube-object-detail-registry";
|
||||
import { CustomResourceDetails } from "../+custom-resources";
|
||||
import { KubeObjectMeta } from "../kube-object-meta";
|
||||
import type { PageParam } from "../../navigation";
|
||||
@ -24,7 +24,8 @@ import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.in
|
||||
import customResourceDefinitionStoreInjectable from "../+custom-resources/definition.store.injectable";
|
||||
import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable";
|
||||
import kubeDetailsUrlParamInjectable from "../kube-detail-params/kube-details-url.injectable";
|
||||
|
||||
import kubeObjectDetailItemsInjectable from "./kube-object-detail-items/kube-object-detail-items.injectable";
|
||||
import currentKubeObjectInDetailsInjectable from "./current-kube-object-in-details.injectable";
|
||||
|
||||
export interface KubeObjectDetailsProps<Kube extends KubeObject = KubeObject> {
|
||||
className?: string;
|
||||
@ -32,6 +33,8 @@ export interface KubeObjectDetailsProps<Kube extends KubeObject = KubeObject> {
|
||||
}
|
||||
|
||||
interface Dependencies {
|
||||
detailComponents: IComputedValue<React.ElementType[]>;
|
||||
kubeObject: IComputedValue<KubeObject | undefined>;
|
||||
kubeDetailsUrlParam: PageParam<string>;
|
||||
apiManager: ApiManager;
|
||||
hideDetails: HideDetails;
|
||||
@ -53,15 +56,7 @@ class NonInjectedKubeObjectDetails extends React.Component<Dependencies> {
|
||||
}
|
||||
|
||||
@computed get object() {
|
||||
try {
|
||||
return this.props.apiManager
|
||||
.getStore(this.path)
|
||||
?.getByPath(this.path);
|
||||
} catch (error) {
|
||||
console.error(`[KUBE-OBJECT-DETAILS]: failed to get store or object: ${error}`, { path: this.path });
|
||||
|
||||
return undefined;
|
||||
}
|
||||
return this.props.kubeObject.get();
|
||||
}
|
||||
|
||||
componentDidMount(): void {
|
||||
@ -108,13 +103,9 @@ class NonInjectedKubeObjectDetails extends React.Component<Dependencies> {
|
||||
|
||||
renderContents(object: KubeObject) {
|
||||
const { isLoading, loadingError } = this;
|
||||
const details = KubeObjectDetailRegistry
|
||||
.getInstance()
|
||||
.getItemsForKind(object.kind, object.apiVersion)
|
||||
.map((item, index) => (
|
||||
<item.components.Details object={object} key={`object-details-${index}`} />
|
||||
));
|
||||
const details = this.props.detailComponents.get();
|
||||
|
||||
const getContents = () => {
|
||||
if (details.length === 0) {
|
||||
const crd = this.props.customResourceDefinitionStore.getByObject(object);
|
||||
|
||||
@ -123,24 +114,29 @@ class NonInjectedKubeObjectDetails extends React.Component<Dependencies> {
|
||||
* any defined details we should try and display at least some details
|
||||
*/
|
||||
if (crd) {
|
||||
details.push(<CustomResourceDetails
|
||||
return (
|
||||
<CustomResourceDetails
|
||||
key={object.getId()}
|
||||
object={object}
|
||||
crd={crd}
|
||||
/>);
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
// if we still don't have any details to show, just show the standard object metadata
|
||||
return <KubeObjectMeta key={object.getId()} object={object} />;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.length === 0) {
|
||||
// if we still don't have any details to show, just show the standard object metadata
|
||||
details.push(<KubeObjectMeta key={object.getId()} object={object} />);
|
||||
}
|
||||
return details.map((DetailComponent, index) => (
|
||||
<DetailComponent key={index} object={object} />
|
||||
));
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{isLoading && <Spinner center/>}
|
||||
{loadingError && <div className="box center">{loadingError}</div>}
|
||||
{details}
|
||||
{getContents()}
|
||||
</>
|
||||
);
|
||||
}
|
||||
@ -169,5 +165,7 @@ export const KubeObjectDetails = withInjectables<Dependencies>(NonInjectedKubeOb
|
||||
customResourceDefinitionStore: di.inject(customResourceDefinitionStoreInjectable),
|
||||
hideDetails: di.inject(hideDetailsInjectable),
|
||||
kubeDetailsUrlParam: di.inject(kubeDetailsUrlParamInjectable),
|
||||
detailComponents: di.inject(kubeObjectDetailItemsInjectable),
|
||||
kubeObject: di.inject(currentKubeObjectInDetailsInjectable),
|
||||
}),
|
||||
});
|
||||
|
||||
@ -7,6 +7,5 @@ export * from "./catalog-entity-detail-registry";
|
||||
export * from "./catalog";
|
||||
export * from "./entity-settings-registry";
|
||||
export * from "./ipc";
|
||||
export * from "./kube-object-detail-registry";
|
||||
export * from "./registries";
|
||||
export * from "./catalog-category-registry";
|
||||
|
||||
@ -1,441 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
import { KubeObjectDetailRegistry } from "../api/kube-object-detail-registry";
|
||||
import type { HpaDetailsProps } from "../components/+config-autoscalers";
|
||||
import { HpaDetails } from "../components/+config-autoscalers";
|
||||
import { LimitRangeDetails } from "../components/+config-limit-ranges";
|
||||
import { ConfigMapDetails } from "../components/+config-maps";
|
||||
import { PodDisruptionBudgetDetails } from "../components/+config-pod-disruption-budgets";
|
||||
import { ResourceQuotaDetails } from "../components/+config-resource-quotas";
|
||||
import { SecretDetails } from "../components/+config-secrets";
|
||||
import { CRDDetails } from "../components/+custom-resources";
|
||||
import { EventDetails } from "../components/+events";
|
||||
import { KubeEventDetails } from "../components/+events/kube-event-details";
|
||||
import { NamespaceDetails } from "../components/+namespaces";
|
||||
import { EndpointsDetails } from "../components/+network-endpoints";
|
||||
import { IngressDetails } from "../components/+network-ingresses";
|
||||
import { NetworkPolicyDetails } from "../components/+network-policies";
|
||||
import { ServiceDetails } from "../components/+network-services";
|
||||
import { NodeDetails } from "../components/+nodes/details";
|
||||
import { PodSecurityPolicyDetails } from "../components/+pod-security-policies";
|
||||
import { StorageClassDetails } from "../components/+storage-classes";
|
||||
import { PersistentVolumeClaimDetails } from "../components/+storage-volume-claims";
|
||||
import { PersistentVolumeDetails } from "../components/+storage-volumes";
|
||||
import { ClusterRoleDetails } from "../components/+user-management/+cluster-roles";
|
||||
import { ClusterRoleBindingDetails } from "../components/+user-management/+cluster-role-bindings";
|
||||
import { RoleDetails } from "../components/+user-management/+roles";
|
||||
import { RoleBindingDetails } from "../components/+user-management/+role-bindings";
|
||||
import { ServiceAccountsDetails } from "../components/+user-management/+service-accounts";
|
||||
import { CronJobDetails } from "../components/+workloads-cronjobs";
|
||||
import { DaemonSetDetails } from "../components/+workloads-daemonsets";
|
||||
import { DeploymentDetails } from "../components/+workloads-deployments";
|
||||
import { JobDetails } from "../components/+workloads-jobs";
|
||||
import { PodDetails } from "../components/+workloads-pods";
|
||||
import { ReplicaSetDetails } from "../components/+workloads-replicasets";
|
||||
import { StatefulSetDetails } from "../components/+workloads-statefulsets";
|
||||
import type { KubeObjectDetailsProps } from "../components/kube-object-details";
|
||||
|
||||
export function initKubeObjectDetailRegistry() {
|
||||
const registry = KubeObjectDetailRegistry.getInstance();
|
||||
|
||||
registry.add({
|
||||
kind: "HorizontalPodAutoscaler",
|
||||
apiVersions: ["autoscaling/v2beta1"],
|
||||
components: {
|
||||
// Note: this line is left in the long form as a validation that this usecase is valid
|
||||
Details: (props: HpaDetailsProps) => <HpaDetails {...props}/>,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "HorizontalPodAutoscaler",
|
||||
apiVersions: ["autoscaling/v2beta1"],
|
||||
components: {
|
||||
// Note: this line is left in the long form as a validation that this usecase is valid
|
||||
Details: (props: HpaDetailsProps) => <HpaDetails {...props}/>,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "HorizontalPodAutoscaler",
|
||||
apiVersions: ["autoscaling/v2beta1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
// Note: this line is left in the long form as a validation that this usecase is valid
|
||||
Details: (props: KubeObjectDetailsProps) => <KubeEventDetails {...props}/>,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "LimitRange",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: LimitRangeDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ConfigMap",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: ConfigMapDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ConfigMap",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "PodDisruptionBudget",
|
||||
apiVersions: ["policy/v1beta1"],
|
||||
components: {
|
||||
Details: PodDisruptionBudgetDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ResourceQuota",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: ResourceQuotaDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Secret",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: SecretDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "CustomResourceDefinition",
|
||||
apiVersions: ["apiextensions.k8s.io/v1", "apiextensions.k8s.io/v1beta1"],
|
||||
components: {
|
||||
Details: CRDDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Event",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: EventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Namespace",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: NamespaceDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Endpoints",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: EndpointsDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Endpoints",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Ingress",
|
||||
apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"],
|
||||
components: {
|
||||
Details: IngressDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Ingress",
|
||||
apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "NetworkPolicy",
|
||||
apiVersions: ["networking.k8s.io/v1"],
|
||||
components: {
|
||||
Details: NetworkPolicyDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "NetworkPolicy",
|
||||
apiVersions: ["networking.k8s.io/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Service",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: ServiceDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Service",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Node",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: NodeDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Node",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "PodSecurityPolicy",
|
||||
apiVersions: ["policy/v1beta1"],
|
||||
components: {
|
||||
Details: PodSecurityPolicyDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "StorageClass",
|
||||
apiVersions: ["storage.k8s.io/v1"],
|
||||
components: {
|
||||
Details: StorageClassDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "StorageClass",
|
||||
apiVersions: ["storage.k8s.io/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "PersistentVolumeClaim",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: PersistentVolumeClaimDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "PersistentVolumeClaim",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "PersistentVolume",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: PersistentVolumeDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "PersistentVolume",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Role",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
components: {
|
||||
Details: RoleDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Role",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ClusterRole",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
components: {
|
||||
Details: ClusterRoleDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ClusterRole",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "RoleBinding",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
components: {
|
||||
Details: RoleBindingDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "RoleBinding",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ClusterRoleBinding",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
components: {
|
||||
Details: ClusterRoleBindingDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ClusterRoleBinding",
|
||||
apiVersions: ["rbac.authorization.k8s.io/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ServiceAccount",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: ServiceAccountsDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ServiceAccount",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "CronJob",
|
||||
apiVersions: ["batch/v1beta1"],
|
||||
components: {
|
||||
Details: CronJobDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "CronJob",
|
||||
apiVersions: ["batch/v1beta1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "DaemonSet",
|
||||
apiVersions: ["apps/v1"],
|
||||
components: {
|
||||
Details: DaemonSetDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "DaemonSet",
|
||||
apiVersions: ["apps/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Deployment",
|
||||
apiVersions: ["apps/v1"],
|
||||
components: {
|
||||
Details: DeploymentDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Deployment",
|
||||
apiVersions: ["apps/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Job",
|
||||
apiVersions: ["batch/v1"],
|
||||
components: {
|
||||
Details: JobDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Job",
|
||||
apiVersions: ["batch/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Pod",
|
||||
apiVersions: ["v1"],
|
||||
components: {
|
||||
Details: PodDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "Pod",
|
||||
apiVersions: ["v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ReplicaSet",
|
||||
apiVersions: ["apps/v1"],
|
||||
components: {
|
||||
Details: ReplicaSetDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "ReplicaSet",
|
||||
apiVersions: ["apps/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "StatefulSet",
|
||||
apiVersions: ["apps/v1"],
|
||||
components: {
|
||||
Details: StatefulSetDetails,
|
||||
},
|
||||
});
|
||||
registry.add({
|
||||
kind: "StatefulSet",
|
||||
apiVersions: ["apps/v1"],
|
||||
priority: 5,
|
||||
components: {
|
||||
Details: KubeEventDetails,
|
||||
},
|
||||
});
|
||||
}
|
||||
@ -7,6 +7,5 @@ import * as registries from "../../extensions/registries";
|
||||
|
||||
export function initRegistries() {
|
||||
registries.CatalogEntityDetailRegistry.createInstance();
|
||||
registries.KubeObjectDetailRegistry.createInstance();
|
||||
registries.EntitySettingRegistry.createInstance();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user