Restructure to monorepo (#6907)

* wip: restructure to monorepo

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* refactor create-release-pr to a package

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* build fixes

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* github workflow fixes

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix typo

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* add webpack-env types to core

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix github workflows

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* refactor/fix integration tests

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* lint fix

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* yarn run dev

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* eslint settings for vscode

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* move templates to right package

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* open-lens build fixes

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* integration test fix

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix nx task dependencies

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* use bash shell for unit tests in test workflow

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix test:unit for windows

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix win-ca webpack error in open-lens

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix win-ca webpack error in open-lens

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* fix build:app on windows

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* remove ELECTRON_BUILDER_EXTRA_ARGS

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* sync src/ from master

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

* remove Makefile from core

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
Jari Kolehmainen authored and GitHub committed 2023-01-24 10:46:26 -08:00
1 parent 0066ca4ea2
commit 2657df2293
3321 files changed
+28699 -11447

No files matched your search

@@ -0,0 +1,44 @@
/**
* 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 kubeDetailsUrlParamInjectable from "../kube-detail-params/kube-details-url.injectable";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import { asyncComputed } from "@ogre-tools/injectable-react";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
export type CurrentKubeObject =
| undefined
| { object: KubeObject; error?: undefined }
| { object?: undefined; error: string };
const currentKubeObjectInDetailsInjectable = getInjectable({
id: "current-kube-object-in-details",
instantiate: (di) => {
const urlParam = di.inject(kubeDetailsUrlParamInjectable);
const apiManager = di.inject(apiManagerInjectable);
return asyncComputed({
getValueFromObservedPromise: async (): Promise<CurrentKubeObject> => {
const path = urlParam.get();
const store = apiManager.getStore(path);
if (!store) {
return undefined;
}
try {
const object = await store.loadFromPath(path);
return { object };
} catch (error) {
return { error: String(error) };
}
},
});
},
});
export default currentKubeObjectInDetailsInjectable;
@@ -0,0 +1,37 @@
/**
* 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 React from "react";
import { CustomResourceDetails } from "../+custom-resources";
import customResourceDefinitionStoreInjectable from "../+custom-resources/definition.store.injectable";
import currentKubeObjectInDetailsInjectable from "./current-kube-object-in-details.injectable";
import { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-items/kube-object-detail-item-injection-token";
const customResourceDetailItemInjectable = getInjectable({
id: "custom-resource-detail-item",
instantiate: (di) => {
const customResourceDefinitionStore = di.inject(customResourceDefinitionStoreInjectable);
const currentKubeObjectInDetails = di.inject(currentKubeObjectInDetailsInjectable);
const currentCustomResourceDefinition = computed(() => {
const { object } = currentKubeObjectInDetails.value.get() ?? {};
if (!object) {
return undefined;
}
return customResourceDefinitionStore.getByObject(object);
});
return {
Component: ({ object }) => <CustomResourceDetails object={object} crd={currentCustomResourceDefinition.get()} />,
enabled: computed(() => Boolean(currentCustomResourceDefinition.get())),
orderNumber: 100,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export default customResourceDetailItemInjectable;
@@ -0,0 +1,20 @@
/**
* 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 { KubeObjectMeta } from "../kube-object-meta";
import { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-items/kube-object-detail-item-injection-token";
const defaultKubeObjectMetaDetailsItemInjectable = getInjectable({
id: "default-kube-object-meta-details-item",
instantiate: () => ({
Component: KubeObjectMeta,
enabled: computed(() => true),
orderNumber: 0,
}),
injectionToken: kubeObjectDetailItemInjectionToken,
});
export default defaultKubeObjectMetaDetailsItemInjectable;
@@ -0,0 +1,6 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
export * from "./kube-object-details";
@@ -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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export default cronJobDetailItemInjectable;
export const isCronJob = kubeObjectMatchesToKindAndApiVersion("CronJob", [
"batch/v1beta1",
]);
@@ -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 { 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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export const isHorizontalPodAutoscaler = kubeObjectMatchesToKindAndApiVersion(
"HorizontalPodAutoscaler",
["autoscaling/v2", "autoscaling/v2beta2", "autoscaling/v2beta1", "autoscaling/v1"],
);
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 { IngressClassDetails } from "../../../+network-ingresses";
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
const ingressClassDetailItemInjectable = getInjectable({
id: "ingress-class-detail-item",
instantiate: (di) => {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
return {
Component: IngressClassDetails,
enabled: computed(() => isIngressClass(kubeObject.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export const isIngressClass = kubeObjectMatchesToKindAndApiVersion("IngressClass", [
"networking.k8s.io/v1",
"extensions/v1beta1",
]);
export default ingressClassDetailItemInjectable;
@@ -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.value.get()?.object)),
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.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export const isJob = kubeObjectMatchesToKindAndApiVersion("Job", ["batch/v1"]);
export default jobDetailItemInjectable;
@@ -0,0 +1,22 @@
/**
* 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";
const kubeEventDetailItemInjectable = getInjectable({
id: "kube-event-detail-item",
instantiate: () => ({
Component: KubeEventDetails,
enabled: computed(() => true),
orderNumber: Infinity,
}),
injectionToken: kubeObjectDetailItemInjectionToken,
});
export default kubeEventDetailItemInjectable;
@@ -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 { LeaseDetails } from "../../../+config-leases";
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
const leaseDetailItemInjectable = getInjectable({
id: "lease-detail-item",
instantiate: (di) => {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
return {
Component: LeaseDetails,
enabled: computed(() => isLease(kubeObject.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
const isLease = kubeObjectMatchesToKindAndApiVersion(
"Lease",
["coordination.k8s.io/v1"],
);
export default leaseDetailItemInjectable;
@@ -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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
const isPodSecurityPolicy = kubeObjectMatchesToKindAndApiVersion(
"PodSecurityPolicy",
["policy/v1beta1"],
);
export default podSecurityPolicyDetailItemInjectable;
@@ -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 { PriorityClassesDetails } from "../../../+config-priority-classes";
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
const priorityClassDetailItemInjectable = getInjectable({
id: "priority-class-detail-item",
instantiate: (di) => {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
return {
Component: PriorityClassesDetails,
enabled: computed(() => isPriorityClass(kubeObject.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
const isPriorityClass = kubeObjectMatchesToKindAndApiVersion(
"PriorityClass",
["scheduling.k8s.io/v1"],
);
export default priorityClassDetailItemInjectable;
@@ -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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
export const isRole = kubeObjectMatchesToKindAndApiVersion("Role", [
"rbac.authorization.k8s.io/v1",
]);
export default roleDetailItemInjectable;
@@ -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 { RuntimeClassesDetails } from "../../../+config-runtime-classes";
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
const runtimeClassDetailItemInjectable = getInjectable({
id: "runtime-class-detail-item",
instantiate: (di) => {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
return {
Component: RuntimeClassesDetails,
enabled: computed(() => isRuntimeClass(kubeObject.value.get()?.object)),
orderNumber: 10,
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
const isRuntimeClass = kubeObjectMatchesToKindAndApiVersion(
"RuntimeClass",
["node.k8s.io/v1"],
);
export default runtimeClassDetailItemInjectable;
@@ -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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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.value.get()?.object)),
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,78 @@
/**
* 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(() => {
if (!extensionShouldBeEnabledForClusterFrame.value.get()) {
return false;
}
if (!isRelevantKubeObject(kubeObject.value.get()?.object)) {
return false;
}
return registration.visible ? registration.visible.get() : true;
}),
orderNumber: 300 - (registration.priority || 50),
};
},
injectionToken: kubeObjectDetailItemInjectionToken,
});
});
};
},
injectionToken: extensionRegistratorInjectionToken,
});
export default kubeObjectDetailItemRegistratorInjectable;
@@ -0,0 +1,28 @@
/**
* 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 { kubeObjectDetailItemInjectionToken } from "./kube-object-detail-item-injection-token";
import { byValue } from "../../../../common/utils/sort-function";
const kubeObjectDetailItemsInjectable = getInjectable({
id: "kube-object-detail-items",
instantiate: (di) => {
const computedInjectMany = di.inject(computedInjectManyInjectable);
const items = computedInjectMany(kubeObjectDetailItemInjectionToken);
return computed(() => (
items.get()
.filter(item => item.enabled.get())
.sort(byValue(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 | undefined) =>
!!item && item.kind === kind && apiVersions.includes(item.apiVersion);
@@ -0,0 +1,20 @@
/**
* 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";
import type { IComputedValue } from "mobx";
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;
visible?: IComputedValue<boolean>;
}
@@ -0,0 +1,22 @@
/**
* 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 { KubeObjectDetails } from "./kube-object-details";
import { clusterFrameChildComponentInjectionToken } from "../../frames/cluster-frame/cluster-frame-child-component-injection-token";
const kubeObjectDetailsClusterFrameChildComponentInjectable = getInjectable({
id: "kube-object-details-cluster-frame-child-component",
instantiate: () => ({
id: "kube-object-details",
shouldRender: computed(() => true),
Component: KubeObjectDetails,
}),
injectionToken: clusterFrameChildComponentInjectionToken,
});
export default kubeObjectDetailsClusterFrameChildComponentInjectable;
@@ -0,0 +1,14 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
.KubeObjectDetails {
z-index: $zIndex-drawer + 1 !important;
.drawer-title {
.Menu {
border: none;
}
}
}
@@ -0,0 +1,82 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import "./kube-object-details.scss";
import React from "react";
import { observer } from "mobx-react";
import type { IComputedValue } from "mobx";
import { Drawer } from "../drawer";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import { Spinner } from "../spinner";
import { KubeObjectMenu } from "../kube-object-menu";
import type { HideDetails } from "../kube-detail-params/hide-details.injectable";
import type { IAsyncComputed } from "@ogre-tools/injectable-react";
import { withInjectables } from "@ogre-tools/injectable-react";
import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable";
import kubeObjectDetailItemsInjectable from "./kube-object-detail-items/kube-object-detail-items.injectable";
import type { CurrentKubeObject } from "./current-kube-object-in-details.injectable";
import currentKubeObjectInDetailsInjectable from "./current-kube-object-in-details.injectable";
export interface KubeObjectDetailsProps<Kube extends KubeObject = KubeObject> {
className?: string;
object: Kube;
}
interface Dependencies {
detailComponents: IComputedValue<React.ElementType[]>;
kubeObject: IAsyncComputed<CurrentKubeObject>;
hideDetails: HideDetails;
}
const NonInjectedKubeObjectDetails = observer((props: Dependencies) => {
const {
detailComponents,
hideDetails,
kubeObject,
} = props;
const currentKubeObject = kubeObject.value.get();
const isLoading = kubeObject.pending.get();
return (
<Drawer
className="KubeObjectDetails flex column"
open={Boolean(isLoading || currentKubeObject)}
title={(
currentKubeObject?.object
? `${currentKubeObject.object.kind}: ${currentKubeObject.object.getName()}`
: ""
)}
toolbar={currentKubeObject?.object && <KubeObjectMenu object={currentKubeObject.object} toolbar={true}/>}
onClose={hideDetails}
>
{isLoading && <Spinner center/>}
{currentKubeObject?.error && (
<div className="box center">
Resource loading has failed:
<b>{currentKubeObject.error}</b>
</div>
)}
{currentKubeObject?.object && (
<>
{
detailComponents.get()
.map((Component, index) => <Component key={index} object={currentKubeObject.object} />)
}
</>
)}
</Drawer>
);
});
export const KubeObjectDetails = withInjectables<Dependencies>(NonInjectedKubeObjectDetails, {
getProps: (di, props) => ({
...props,
hideDetails: di.inject(hideDetailsInjectable),
detailComponents: di.inject(kubeObjectDetailItemsInjectable),
kubeObject: di.inject(currentKubeObjectInDetailsInjectable),
}),
});