1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

convert all KubeObjectStores to injectable with legacy global backups

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-04-13 11:59:38 -04:00
parent 096ab7b601
commit 930af6c6fd
110 changed files with 1046 additions and 403 deletions

View File

@ -3,7 +3,6 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { once } from "lodash/fp";
import type { ClusterId } from "../cluster-types";
/**
@ -26,12 +25,3 @@ export function getClusterIdFromHost(host: string): ClusterId | undefined {
export function getClusterFrameUrl(clusterId: ClusterId) {
return `//${clusterId}.${location.host}`;
}
/**
* Returns true only if code is running within a cluster iframe context
*/
export const isClusterPageContext = once(() => {
if (typeof window === "undefined") return false;
return !!getClusterIdFromHost(window.location.host);
});

View File

@ -87,31 +87,31 @@ export {
} from "./kube-object-status";
// stores
export type { EventStore } from "../../renderer/components/+events/event.store";
export type { EventStore } from "../../renderer/components/+events/store";
export type { PodStore as PodsStore } from "../../renderer/components/+workloads-pods/store";
export type { NodesStore } from "../../renderer/components/+nodes/nodes.store";
export type { NodeStore as NodesStore } from "../../renderer/components/+nodes/store";
export type { DeploymentStore } from "../../renderer/components/+workloads-deployments/store";
export type { DaemonSetStore } from "../../renderer/components/+workloads-daemonsets/store";
export type { StatefulSetStore } from "../../renderer/components/+workloads-statefulsets/store";
export type { JobStore } from "../../renderer/components/+workloads-jobs/store";
export type { CronJobStore } from "../../renderer/components/+workloads-cronjobs/store";
export type { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/+config-maps/config-maps.store";
export type { SecretStore as SecretsStore } from "../../renderer/components/+config-secrets/secrets.store";
export type { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/+config-maps/store";
export type { SecretStore as SecretsStore } from "../../renderer/components/+config-secrets/store";
export type { ReplicaSetStore } from "../../renderer/components/+workloads-replicasets/store";
export type { ResourceQuotaStore as ResourceQuotasStore } from "../../renderer/components/+config-resource-quotas/resource-quotas.store";
export type { ResourceQuotaStore as ResourceQuotasStore } from "../../renderer/components/+config-resource-quotas/store";
export type { LimitRangeStore as LimitRangesStore } from "../../renderer/components/+config-limit-ranges/store";
export type { HorizontalPodAutoscalerStore as HPAStore } from "../../renderer/components/+config-autoscalers/store";
export type { PodDisruptionBudgetStore as PodDisruptionBudgetsStore } from "../../renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store";
export type { ServiceStore } from "../../renderer/components/+network-services/services.store";
export type { EndpointStore } from "../../renderer/components/+network-endpoints/endpoints.store";
export type { IngressStore } from "../../renderer/components/+network-ingresses/ingress.store";
export type { NetworkPolicyStore } from "../../renderer/components/+network-policies/network-policy.store";
export type { PersistentVolumesStore } from "../../renderer/components/+storage-volumes/volumes.store";
export type { PersistentVolumeClaimStore as VolumeClaimStore } from "../../renderer/components/+storage-volume-claims/volume-claim.store";
export type { StorageClassStore } from "../../renderer/components/+storage-classes/storage-class.store";
export type { PodDisruptionBudgetStore as PodDisruptionBudgetsStore } from "../../renderer/components/+config-pod-disruption-budgets/store";
export type { ServiceStore } from "../../renderer/components/+network-services/store";
export type { EndpointsStore as EndpointStore } from "../../renderer/components/+network-endpoints/store";
export type { IngressStore } from "../../renderer/components/+network-ingresses/store";
export type { NetworkPolicyStore } from "../../renderer/components/+network-policies/store";
export type { PersistentVolumeStore as PersistentVolumesStore } from "../../renderer/components/+storage-volumes/store";
export type { PersistentVolumeClaimStore as VolumeClaimStore } from "../../renderer/components/+storage-volume-claims/store";
export type { StorageClassStore } from "../../renderer/components/+storage-classes/store";
export type { NamespaceStore } from "../../renderer/components/+namespaces/namespace-store/namespace.store";
export type { ServiceAccountStore as ServiceAccountsStore } from "../../renderer/components/+user-management/+service-accounts/store";
export type { RoleStore as RolesStore } from "../../renderer/components/+user-management/+roles/store";
export type { RoleBindingStore as RoleBindingsStore } from "../../renderer/components/+user-management/+role-bindings/store";
export type { CRDStore } from "../../renderer/components/+custom-resources/crd.store";
export type { CRDResourceStore } from "../../renderer/components/+custom-resources/crd-resource.store";
export type { CustomResourceDefinitionStore as CRDStore } from "../../renderer/components/+custom-resources/definition.store";
export type { CustomResourceStore as CRDResourceStore } from "../../renderer/components/+custom-resources/resource.store";

View File

@ -11,8 +11,8 @@ import { computed, makeObservable } from "mobx";
import { Icon } from "../icon";
import { SubHeader } from "../layout/sub-header";
import { Table, TableCell, TableHead, TableRow } from "../table";
import { nodesStore } from "../+nodes/nodes.store";
import { eventStore } from "../+events/event.store";
import { nodeStore } from "../+nodes/legacy-store";
import { eventStore } from "../+events/legacy-store";
import { cssNames, prevDefault } from "../../utils";
import type { ItemObject } from "../../../common/item.store";
import { Spinner } from "../spinner";
@ -48,7 +48,7 @@ export class ClusterIssues extends React.Component<ClusterIssuesProps> {
@computed get warnings(): Warning[] {
return [
...nodesStore.items.flatMap(node => (
...nodeStore.items.flatMap(node => (
node.getWarningConditions()
.map(({ message }) => ({
selfLink: node.selfLink,

View File

@ -5,20 +5,25 @@
import React from "react";
import { observer } from "mobx-react";
import { nodesStore } from "../+nodes/nodes.store";
import type { NodeStore } from "../+nodes/store";
import { cssNames } from "../../utils";
import { Radio, RadioGroup } from "../radio";
import type { ClusterOverviewStore } from "./cluster-overview-store/cluster-overview-store";
import { MetricNodeRole, MetricType } from "./cluster-overview-store/cluster-overview-store";
import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable";
import { withInjectables } from "@ogre-tools/injectable-react";
import nodeStoreInjectable from "../+nodes/store.injectable";
interface Dependencies {
clusterOverviewStore: ClusterOverviewStore;
nodeStore: NodeStore;
}
const NonInjectedClusterMetricSwitchers = observer(({ clusterOverviewStore }: Dependencies) => {
const { masterNodes, workerNodes } = nodesStore;
const NonInjectedClusterMetricSwitchers = observer(({
clusterOverviewStore,
nodeStore,
}: Dependencies) => {
const { masterNodes, workerNodes } = nodeStore;
const metricsValues = clusterOverviewStore.getMetricsValues(clusterOverviewStore.metrics);
const disableRoles = !masterNodes.length || !workerNodes.length;
const disableMetrics = !metricsValues.length;
@ -51,13 +56,10 @@ const NonInjectedClusterMetricSwitchers = observer(({ clusterOverviewStore }: De
);
});
export const ClusterMetricSwitchers = withInjectables<Dependencies>(
NonInjectedClusterMetricSwitchers,
{
getProps: (di) => ({
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
}),
},
);
export const ClusterMetricSwitchers = withInjectables<Dependencies>(NonInjectedClusterMetricSwitchers, {
getProps: (di) => ({
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
nodeStore: di.inject(nodeStoreInjectable),
}),
});

View File

@ -10,7 +10,7 @@ import { getMetricsByNodeNames, type ClusterMetricData } from "../../../../commo
import type { StorageLayer } from "../../../utils";
import { autoBind } from "../../../utils";
import { type IMetricsReqParams, normalizeMetrics } from "../../../../common/k8s-api/endpoints/metrics.api";
import { nodesStore } from "../../+nodes/nodes.store";
import type { NodeStore } from "../../+nodes/store";
export enum MetricType {
MEMORY = "memory",
@ -28,7 +28,8 @@ export interface ClusterOverviewStorageState {
}
interface Dependencies {
storage: StorageLayer<ClusterOverviewStorageState>;
readonly storage: StorageLayer<ClusterOverviewStorageState>;
readonly nodeStore: NodeStore;
}
export class ClusterOverviewStore extends KubeObjectStore<Cluster, ClusterApi> implements ClusterOverviewStorageState {
@ -69,8 +70,8 @@ export class ClusterOverviewStore extends KubeObjectStore<Cluster, ClusterApi> i
});
// check which node type to select
reaction(() => nodesStore.items.length, () => {
const { masterNodes, workerNodes } = nodesStore;
reaction(() => this.dependencies.nodeStore.items.length, () => {
const { masterNodes, workerNodes } = this.dependencies.nodeStore;
if (!masterNodes.length) this.metricNodeRole = MetricNodeRole.WORKER;
if (!workerNodes.length) this.metricNodeRole = MetricNodeRole.MASTER;
@ -79,8 +80,8 @@ export class ClusterOverviewStore extends KubeObjectStore<Cluster, ClusterApi> i
@action
async loadMetrics(params?: IMetricsReqParams) {
await when(() => nodesStore.isLoaded);
const { masterNodes, workerNodes } = nodesStore;
await when(() => this.dependencies.nodeStore.isLoaded);
const { masterNodes, workerNodes } = this.dependencies.nodeStore;
const nodes = this.metricNodeRole === MetricNodeRole.MASTER && masterNodes.length ? masterNodes : workerNodes;
this.metrics = await getMetricsByNodeNames(nodes.map(node => node.getName()), params);

View File

@ -8,7 +8,7 @@ import styles from "./cluster-overview.module.scss";
import React from "react";
import { reaction } from "mobx";
import { disposeOnUnmount, observer } from "mobx-react";
import { nodesStore } from "../+nodes/nodes.store";
import type { NodeStore } from "../+nodes/store";
import type { PodStore } from "../+workloads-pods/store";
import { interval } from "../../utils";
import { TabLayout } from "../layout/tab-layout";
@ -19,7 +19,7 @@ import type { ClusterOverviewStore } from "./cluster-overview-store/cluster-over
import { ClusterPieCharts } from "./cluster-pie-charts";
import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import { eventStore } from "../+events/event.store";
import type { EventStore } from "../+events/store";
import { withInjectables } from "@ogre-tools/injectable-react";
import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
@ -28,12 +28,16 @@ import hostedClusterInjectable from "../../../common/cluster-store/hosted-cluste
import assert from "assert";
import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
import podStoreInjectable from "../+workloads-pods/store.injectable";
import eventStoreInjectable from "../+events/store.injectable";
import nodeStoreInjectable from "../+nodes/store.injectable";
interface Dependencies {
subscribeStores: SubscribeStores;
clusterOverviewStore: ClusterOverviewStore;
hostedCluster: Cluster;
podStore: PodStore;
eventStore: EventStore;
nodeStore: NodeStore;
}
@observer
@ -52,8 +56,8 @@ class NonInjectedClusterOverview extends React.Component<Dependencies> {
disposeOnUnmount(this, [
this.props.subscribeStores([
this.props.podStore,
eventStore,
nodesStore,
this.props.eventStore,
this.props.nodeStore,
]),
reaction(
@ -94,7 +98,8 @@ class NonInjectedClusterOverview extends React.Component<Dependencies> {
}
render() {
const isLoaded = nodesStore.isLoaded && eventStore.isLoaded;
const { eventStore, nodeStore } = this.props;
const isLoaded = nodeStore.isLoaded && eventStore.isLoaded;
const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Cluster);
return (
@ -118,6 +123,8 @@ export const ClusterOverview = withInjectables<Dependencies>(NonInjectedClusterO
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
hostedCluster,
podStore: di.inject(podStoreInjectable),
eventStore: di.inject(eventStoreInjectable),
nodeStore: di.inject(nodeStoreInjectable),
};
},
});

View File

@ -11,7 +11,7 @@ import type { ClusterOverviewStore } from "./cluster-overview-store/cluster-over
import { MetricNodeRole } from "./cluster-overview-store/cluster-overview-store";
import { Spinner } from "../spinner";
import { Icon } from "../icon";
import { nodesStore } from "../+nodes/nodes.store";
import type { NodeStore } from "../+nodes/store";
import type { PieChartData } from "../chart";
import { PieChart } from "../chart";
import { ClusterNoMetrics } from "./cluster-no-metrics";
@ -20,6 +20,7 @@ import { ThemeStore } from "../../theme.store";
import { getMetricLastPoints } from "../../../common/k8s-api/endpoints/metrics.api";
import { withInjectables } from "@ogre-tools/injectable-react";
import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable";
import nodeStoreInjectable from "../+nodes/store.injectable";
function createLabels(rawLabelData: [string, number | undefined][]): string[] {
return rawLabelData.map(([key, value]) => `${key}: ${value?.toFixed(2) || "N/A"}`);
@ -27,9 +28,13 @@ function createLabels(rawLabelData: [string, number | undefined][]): string[] {
interface Dependencies {
clusterOverviewStore: ClusterOverviewStore;
nodeStore: NodeStore;
}
const NonInjectedClusterPieCharts = observer(({ clusterOverviewStore }: Dependencies) => {
const NonInjectedClusterPieCharts = observer(({
clusterOverviewStore,
nodeStore,
}: Dependencies) => {
const renderLimitWarning = () => {
return (
<div className="node-warning flex gaps align-center">
@ -210,7 +215,7 @@ const NonInjectedClusterPieCharts = observer(({ clusterOverviewStore }: Dependen
};
const renderContent = ({ metricNodeRole, metricsLoaded }: ClusterOverviewStore) => {
const { masterNodes, workerNodes } = nodesStore;
const { masterNodes, workerNodes } = nodeStore;
const nodes = metricNodeRole === MetricNodeRole.MASTER ? masterNodes : workerNodes;
if (!nodes.length) {
@ -249,12 +254,9 @@ const NonInjectedClusterPieCharts = observer(({ clusterOverviewStore }: Dependen
);
});
export const ClusterPieCharts = withInjectables<Dependencies>(
NonInjectedClusterPieCharts,
{
getProps: (di) => ({
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
}),
},
);
export const ClusterPieCharts = withInjectables<Dependencies>(NonInjectedClusterPieCharts, {
getProps: (di) => ({
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
nodeStore: di.inject(nodeStoreInjectable),
}),
});

View File

@ -9,7 +9,7 @@ import React from "react";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import type { HorizontalPodAutoscaler } from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api";
import { hpaStore } from "./hpa.store";
import { horizontalPodAutoscalerStore } from "./legacy-store";
import { Badge } from "../badge";
import { cssNames } from "../../utils";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
@ -54,7 +54,7 @@ export class HorizontalPodAutoscalers extends React.Component {
isConfigurable
tableId="configuration_hpa"
className="HorizontalPodAutoscalers"
store={hpaStore}
store={horizontalPodAutoscalerStore}
sortingCallbacks={{
[columnId.name]: hpa => hpa.getName(),
[columnId.namespace]: hpa => hpa.getNs(),

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import horizontalPodAutoscalerStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(horizontalPodAutoscalerStoreInjectable)` instead
*/
export const horizontalPodAutoscalerStore = asLegacyGlobalForExtensionApi(horizontalPodAutoscalerStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import horizontalPodAutoscalerApiInjectable from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { HorizontalPodAutoscalerStore } from "./store";
const horizontalPodAutoscalerStoreInjectable = getInjectable({
id: "horizontal-pod-autoscaler-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "horizontalPodAutoscalerStore is only available in certain environments");
const api = di.inject(horizontalPodAutoscalerApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new HorizontalPodAutoscalerStore(api);
apiManager.registerStore(store);
return store;
},
});
export default horizontalPodAutoscalerStoreInjectable;

View File

@ -5,17 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { HorizontalPodAutoscaler, HorizontalPodAutoscalerApi } from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api";
import { horizontalPodAutoscalerApi } from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class HorizontalPodAutoscalerStore extends KubeObjectStore<HorizontalPodAutoscaler, HorizontalPodAutoscalerApi> {
}
export const hpaStore = isClusterPageContext()
? new HorizontalPodAutoscalerStore(horizontalPodAutoscalerApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(hpaStore);
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import limitRangeStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(limitRangeStoreInjectable)` instead
*/
export const limitRangeStore = asLegacyGlobalForExtensionApi(limitRangeStoreInjectable);

View File

@ -7,7 +7,7 @@ import "./limit-ranges.scss";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { limitRangeStore } from "./limit-ranges.store";
import { limitRangeStore } from "./legacy-store";
import React from "react";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import limitRangeApiInjectable from "../../../common/k8s-api/endpoints/limit-range.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { LimitRangeStore } from "./store";
const limitRangeStoreInjectable = getInjectable({
id: "limit-range-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "limitRangeStore is only available in certain environments");
const api = di.inject(limitRangeApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new LimitRangeStore(api);
apiManager.registerStore(store);
return store;
},
});
export default limitRangeStoreInjectable;

View File

@ -4,18 +4,7 @@
*/
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { LimitRange, LimitRangeApi } from "../../../common/k8s-api/endpoints/limit-range.api";
import { limitRangeApi } from "../../../common/k8s-api/endpoints/limit-range.api";
import { isClusterPageContext } from "../../utils";
export class LimitRangeStore extends KubeObjectStore<LimitRange, LimitRangeApi> {
}
export const limitRangeStore = isClusterPageContext()
? new LimitRangeStore(limitRangeApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(limitRangeStore);
}

View File

@ -12,7 +12,7 @@ import { DrawerTitle } from "../drawer";
import { Notifications } from "../notifications";
import { Input } from "../input";
import { Button } from "../button";
import { configMapStore } from "./config-maps.store";
import { configMapStore } from "./legacy-store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { ConfigMap } from "../../../common/k8s-api/endpoints";
import { KubeObjectMeta } from "../kube-object-meta";

View File

@ -7,7 +7,7 @@ import "./config-maps.scss";
import React from "react";
import { observer } from "mobx-react";
import { configMapStore } from "./config-maps.store";
import { configMapStore } from "./legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import configMapStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(configMapStoreInjectable)` instead
*/
export const configMapStore = asLegacyGlobalForExtensionApi(configMapStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import configMapApiInjectable from "../../../common/k8s-api/endpoints/config-map.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { ConfigMapStore } from "./store";
const configMapStoreInjectable = getInjectable({
id: "config-map-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "configMapStore is only available in certain environments");
const api = di.inject(configMapApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new ConfigMapStore(api);
apiManager.registerStore(store);
return store;
},
});
export default configMapStoreInjectable;

View File

@ -5,17 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { ConfigMap, ConfigMapApi, ConfigMapData } from "../../../common/k8s-api/endpoints/config-map.api";
import { configMapApi } from "../../../common/k8s-api/endpoints/config-map.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class ConfigMapStore extends KubeObjectStore<ConfigMap, ConfigMapApi, ConfigMapData> {
}
export const configMapStore = isClusterPageContext()
? new ConfigMapStore(configMapApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(configMapStore);
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import podDisruptionBudgetStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(podDisruptionBudgetStoreInjectable)` instead
*/
export const podDisruptionBudgetStore = asLegacyGlobalForExtensionApi(podDisruptionBudgetStoreInjectable);

View File

@ -7,7 +7,7 @@ import "./pod-disruption-budgets.scss";
import * as React from "react";
import { observer } from "mobx-react";
import { podDisruptionBudgetsStore } from "./pod-disruption-budgets.store";
import { podDisruptionBudgetStore } from "./legacy-store";
import type { PodDisruptionBudget } from "../../../common/k8s-api/endpoints/pod-disruption-budget.api";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import type { KubeObjectDetailsProps } from "../kube-object-details";
@ -37,7 +37,7 @@ export class PodDisruptionBudgets extends React.Component<PodDisruptionBudgetsPr
isConfigurable
tableId="configuration_distribution_budgets"
className="PodDisruptionBudgets"
store={podDisruptionBudgetsStore}
store={podDisruptionBudgetStore}
sortingCallbacks={{
[columnId.name]: pdb => pdb.getName(),
[columnId.namespace]: pdb => pdb.getNs(),

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import podDisruptionBudgetApiInjectable from "../../../common/k8s-api/endpoints/pod-disruption-budget.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { PodDisruptionBudgetStore } from "./store";
const podDisruptionBudgetStoreInjectable = getInjectable({
id: "pod-disruption-budget-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "podDisruptionBudgetStore is only available in certain environments");
const api = di.inject(podDisruptionBudgetApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new PodDisruptionBudgetStore(api);
apiManager.registerStore(store);
return store;
},
});
export default podDisruptionBudgetStoreInjectable;

View File

@ -5,17 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { PodDisruptionBudget, PodDisruptionBudgetApi } from "../../../common/k8s-api/endpoints/pod-disruption-budget.api";
import { podDisruptionBudgetApi } from "../../../common/k8s-api/endpoints/pod-disruption-budget.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class PodDisruptionBudgetStore extends KubeObjectStore<PodDisruptionBudget, PodDisruptionBudgetApi> {
}
export const podDisruptionBudgetsStore = isClusterPageContext()
? new PodDisruptionBudgetStore(podDisruptionBudgetApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(podDisruptionBudgetsStore);
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import resourceQuotaStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(resourceQuotaStoreInjectable)` instead
*/
export const resourceQuotaStore = asLegacyGlobalForExtensionApi(resourceQuotaStoreInjectable);

View File

@ -9,7 +9,7 @@ import React from "react";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { AddQuotaDialog } from "./add-quota-dialog";
import { resourceQuotaStore } from "./resource-quotas.store";
import { resourceQuotaStore } from "./legacy-store";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import resourceQuotaApiInjectable from "../../../common/k8s-api/endpoints/resource-quota.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { ResourceQuotaStore } from "./store";
const resourceQuotaStoreInjectable = getInjectable({
id: "resource-quota-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "resourceQuotaStore is only available in certain environments");
const api = di.inject(resourceQuotaApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new ResourceQuotaStore(api);
apiManager.registerStore(store);
return store;
},
});
export default resourceQuotaStoreInjectable;

View File

@ -5,17 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { ResourceQuota, ResourceQuotaApi } from "../../../common/k8s-api/endpoints/resource-quota.api";
import { resourceQuotaApi } from "../../../common/k8s-api/endpoints/resource-quota.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class ResourceQuotaStore extends KubeObjectStore<ResourceQuota, ResourceQuotaApi> {
}
export const resourceQuotaStore = isClusterPageContext()
? new ResourceQuotaStore(resourceQuotaApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(resourceQuotaStore);
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import secretStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(secretStoreInjectable)` instead
*/
export const secretStore = asLegacyGlobalForExtensionApi(secretStoreInjectable);

View File

@ -14,7 +14,7 @@ import { Button } from "../button";
import { Notifications } from "../notifications";
import { base64, toggle } from "../../utils";
import { Icon } from "../icon";
import { secretStore } from "./secrets.store";
import { secretStore } from "./legacy-store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { Secret } from "../../../common/k8s-api/endpoints";
import { KubeObjectMeta } from "../kube-object-meta";

View File

@ -10,7 +10,7 @@ import { observer } from "mobx-react";
import { AddSecretDialog } from "./add-secret-dialog";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { Badge } from "../badge";
import { secretStore } from "./secrets.store";
import { secretStore } from "./legacy-store";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import secretApiInjectable from "../../../common/k8s-api/endpoints/secret.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { SecretStore } from "./store";
const secretStoreInjectable = getInjectable({
id: "secret-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "secretStore is only available in certain environments");
const api = di.inject(secretApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new SecretStore(api);
apiManager.registerStore(store);
return store;
},
});
export default secretStoreInjectable;

View File

@ -5,17 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { Secret, SecretApi, SecretData } from "../../../common/k8s-api/endpoints";
import { secretApi } from "../../../common/k8s-api/endpoints";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class SecretStore extends KubeObjectStore<Secret, SecretApi, SecretData> {
}
export const secretStore = isClusterPageContext()
? new SecretStore(secretApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(secretStore);
}

View File

@ -11,7 +11,7 @@ import { observer } from "mobx-react";
import { Link } from "react-router-dom";
import { iter, stopPropagation } from "../../utils";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { crdStore } from "./crd.store";
import { customResourceDefinitionStore } from "./legacy-store";
import { Select } from "../select";
import { createPageParam } from "../../navigation";
import { Icon } from "../icon";
@ -42,10 +42,10 @@ export class CustomResourceDefinitions extends React.Component {
@computed get items() {
if (this.selectedGroups.size) {
return crdStore.items.filter(item => this.selectedGroups.has(item.getGroup()));
return customResourceDefinitionStore.items.filter(item => this.selectedGroups.has(item.getGroup()));
}
return crdStore.items; // show all by default
return customResourceDefinitionStore.items; // show all by default
}
toggleSelection = (options: readonly ({ group: string })[]) => {
@ -76,8 +76,8 @@ export class CustomResourceDefinitions extends React.Component {
isConfigurable
tableId="crd"
className="CrdList"
store={crdStore}
// Don't subscribe the `crdStore` because <Sidebar> already has and is always mounted
store={customResourceDefinitionStore}
// Don't subscribe the `customResourceDefinitionStore` because <Sidebar> already has and is always mounted
subscribeStores={false}
items={items}
sortingCallbacks={{
@ -103,7 +103,7 @@ export class CustomResourceDefinitions extends React.Component {
<Select
className="group-select"
placeholder={this.getPlaceholder()}
options={Object.keys(crdStore.groups).map(group => ({ group }))}
options={Object.keys(customResourceDefinitionStore.groups).map(group => ({ group }))}
onChange={this.toggleSelection}
closeMenuOnSelect={false}
controlShouldRenderValue={false}

View File

@ -10,13 +10,15 @@ import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import type { IComputedValue } from "mobx";
import { computed, makeObservable } from "mobx";
import { crdStore } from "./crd.store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { ApiManager } from "../../../common/k8s-api/api-manager";
import { safeJSONPathValue } from "../../utils/jsonPath";
import { TabLayout } from "../layout/tab-layout-2";
import { withInjectables } from "@ogre-tools/injectable-react";
import customResourcesRouteParametersInjectable from "./custom-resources-route-parameters.injectable";
import { KubeObjectAge } from "../kube-object/age";
import type { CustomResourceDefinitionStore } from "./definition.store";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import customResourceDefinitionStoreInjectable from "./definition.store.injectable";
enum columnId {
name = "name",
@ -27,21 +29,23 @@ enum columnId {
interface Dependencies {
group: IComputedValue<string>;
name: IComputedValue<string>;
apiManager: ApiManager;
customResourceDefinitionStore: CustomResourceDefinitionStore;
}
@observer
class NonInjectedCrdResources extends React.Component<Dependencies> {
class NonInjectedCustomResources extends React.Component<Dependencies> {
constructor(props: Dependencies) {
super(props);
makeObservable(this);
}
@computed get crd() {
return crdStore.getByGroup(this.props.group.get(), this.props.name.get());
return this.props.customResourceDefinitionStore.getByGroup(this.props.group.get(), this.props.name.get());
}
@computed get store() {
return apiManager.getStore(this.crd?.getResourceApiBase());
return this.props.apiManager.getStore(this.crd?.getResourceApiBase());
}
render() {
@ -120,18 +124,11 @@ class NonInjectedCrdResources extends React.Component<Dependencies> {
}
}
export const CrdResources = withInjectables<Dependencies>(
NonInjectedCrdResources,
{
getProps: (di) => {
const routeParameters = di.inject(customResourcesRouteParametersInjectable);
return {
group: routeParameters.group,
name: routeParameters.name,
};
},
},
);
export const CustomResources = withInjectables<Dependencies>(NonInjectedCustomResources, {
getProps: (di) => ({
...di.inject(customResourcesRouteParametersInjectable),
apiManager: di.inject(apiManagerInjectable),
customResourceDefinitionStore: di.inject(customResourceDefinitionStoreInjectable),
}),
});

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { CrdResources } from "./crd-resources";
import { CustomResources } from "./crd-resources";
import customResourcesRouteInjectable from "../../../common/front-end-routing/routes/cluster/custom-resources/custom-resources/custom-resources-route.injectable";
import { routeSpecificComponentInjectionToken } from "../../routes/route-specific-component-injection-token";
@ -12,7 +12,7 @@ const customResourcesRouteComponentInjectable = getInjectable({
instantiate: (di) => ({
route: di.inject(customResourcesRouteInjectable),
Component: CrdResources,
Component: CustomResources,
}),
injectionToken: routeSpecificComponentInjectionToken,

View File

@ -5,23 +5,24 @@
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { crdStore } from "./crd.store";
import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
import currentlyInClusterFrameInjectable from "../../routes/currently-in-cluster-frame.injectable";
import customResourceDefinitionStoreInjectable from "./definition.store.injectable";
const customResourceDefinitionsInjectable = getInjectable({
id: "custom-resource-definitions",
instantiate: (di) => {
const currentlyInClusterFrame = di.inject(currentlyInClusterFrameInjectable);
const store = di.inject(customResourceDefinitionStoreInjectable);
if (currentlyInClusterFrame) {
const subscribeStores = di.inject(subscribeStoresInjectable);
subscribeStores([crdStore]);
subscribeStores([store]);
}
return computed(() => [...crdStore.items]);
return computed(() => [...store.items]);
},
});

View File

@ -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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import customResourceDefinitionApiInjectable from "../../../common/k8s-api/endpoints/custom-resource-definition.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { CustomResourceDefinitionStore } from "./definition.store";
import initCustomResourceStoreInjectable from "./init-resource-store.injectable";
const customResourceDefinitionStoreInjectable = getInjectable({
id: "custom-resource-definition-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "customResourceDefinitionStore is only available in certain environments");
const api = di.inject(customResourceDefinitionApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new CustomResourceDefinitionStore({
initCustomResourceStore: di.inject(initCustomResourceStoreInjectable),
}, api);
apiManager.registerStore(store);
return store;
},
});
export default customResourceDefinitionStoreInjectable;

View File

@ -4,39 +4,29 @@
*/
import { computed, reaction, makeObservable } from "mobx";
import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object.store";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { autoBind, isClusterPageContext } from "../../utils";
import { autoBind } from "../../utils";
import type { CustomResourceDefinition, CustomResourceDefinitionApi } from "../../../common/k8s-api/endpoints/custom-resource-definition.api";
import { crdApi } from "../../../common/k8s-api/endpoints/custom-resource-definition.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { KubeApi } from "../../../common/k8s-api/kube-api";
import { CRDResourceStore } from "./crd-resource.store";
import { KubeObject } from "../../../common/k8s-api/kube-object";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import type { InitCustomResourceStore } from "./init-resource-store.injectable";
function initStore(crd: CustomResourceDefinition) {
const objectConstructor = class extends KubeObject {
static readonly kind = crd.getResourceKind();
static readonly namespaced = crd.isNamespaced();
static readonly apiBase = crd.getResourceApiBase();
};
const api = apiManager.getApi(objectConstructor.apiBase)
?? new KubeApi({ objectConstructor });
if (!apiManager.getStore(api)) {
apiManager.registerStore(new CRDResourceStore(api));
}
export interface CustomResourceDefinitionStoreDependencies {
initCustomResourceStore: InitCustomResourceStore;
}
export class CRDStore extends KubeObjectStore<CustomResourceDefinition, CustomResourceDefinitionApi> {
constructor() {
super(crdApi);
export class CustomResourceDefinitionStore extends KubeObjectStore<CustomResourceDefinition, CustomResourceDefinitionApi> {
constructor(
protected readonly dependencies: CustomResourceDefinitionStoreDependencies,
api: CustomResourceDefinitionApi,
opts?: KubeObjectStoreOptions,
) {
super(api, opts);
makeObservable(this);
autoBind(this);
// auto-init stores for crd-s
reaction(() => this.getItems(), items => items.forEach(initStore));
reaction(() => this.getItems(), items => items.forEach(this.dependencies.initCustomResourceStore));
}
protected sortItems(items: CustomResourceDefinition[]) {
@ -69,11 +59,3 @@ export class CRDStore extends KubeObjectStore<CustomResourceDefinition, CustomRe
));
}
}
export const crdStore = isClusterPageContext()
? new CRDStore()
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(crdStore);
}

View File

@ -0,0 +1,36 @@
/**
* 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 apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import type { CustomResourceDefinition } from "../../../common/k8s-api/endpoints";
import { KubeApi } from "../../../common/k8s-api/kube-api";
import { KubeObject } from "../../../common/k8s-api/kube-object";
import { CustomResourceStore } from "./resource.store";
export type InitCustomResourceStore = (crd: CustomResourceDefinition) => void;
const initCustomResourceStoreInjectable = getInjectable({
id: "init-custom-resource-store",
instantiate: (di): InitCustomResourceStore => {
const apiManager = di.inject(apiManagerInjectable);
return (crd) => {
const objectConstructor = class extends KubeObject {
static readonly kind = crd.getResourceKind();
static readonly namespaced = crd.isNamespaced();
static readonly apiBase = crd.getResourceApiBase();
};
const api = apiManager.getApi(objectConstructor.apiBase)
?? new KubeApi({ objectConstructor });
if (!apiManager.getStore(api)) {
apiManager.registerStore(new CustomResourceStore(api));
}
};
},
});
export default initCustomResourceStoreInjectable;

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import customResourceDefinitionStoreInjectable from "./definition.store.injectable";
/**
* @deprecated use `di.inject(customResourceDefinitionStoreInjectable)` instead
*/
export const customResourceDefinitionStore = asLegacyGlobalForExtensionApi(customResourceDefinitionStoreInjectable);

View File

@ -7,7 +7,7 @@ import type { KubeApi } from "../../../common/k8s-api/kube-api";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
export class CRDResourceStore<K extends KubeObject> extends KubeObjectStore<K, KubeApi<K>> {
export class CustomResourceStore<K extends KubeObject> extends KubeObjectStore<K, KubeApi<K>> {
constructor(api: KubeApi<K>) {
super(api);
}

View File

@ -10,8 +10,7 @@ import { computed, observable, makeObservable } from "mobx";
import { observer } from "mobx-react";
import { orderBy } from "lodash";
import { TabLayout } from "../layout/tab-layout-2";
import type { EventStore } from "./event.store";
import { eventStore } from "./event.store";
import type { EventStore } from "./store";
import type { KubeObjectListLayoutProps } from "../kube-object-list-layout";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import type { KubeEvent, KubeEventApi, KubeEventData } from "../../../common/k8s-api/endpoints/events.api";
@ -23,11 +22,13 @@ import type { IClassName } from "../../utils";
import { cssNames, stopPropagation } from "../../utils";
import { Icon } from "../icon";
import { getDetailsUrl } from "../kube-detail-params";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { ApiManager } from "../../../common/k8s-api/api-manager";
import { withInjectables } from "@ogre-tools/injectable-react";
import navigateToEventsInjectable from "../../../common/front-end-routing/routes/cluster/events/navigate-to-events.injectable";
import { KubeObjectAge } from "../kube-object/age";
import { ReactiveDuration } from "../duration/reactive-duration";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import eventStoreInjectable from "./store.injectable";
enum columnId {
message = "message",
@ -52,6 +53,8 @@ const defaultProps: Partial<EventsProps> = {
interface Dependencies {
navigateToEvents: () => void;
eventStore: EventStore;
apiManager: ApiManager;
}
@observer
@ -77,12 +80,8 @@ class NonInjectedEvents extends React.Component<Dependencies & EventsProps> {
makeObservable(this);
}
get store(): EventStore {
return eventStore;
}
@computed get items(): KubeEvent[] {
const items = this.store.contextItems;
const items = this.props.eventStore.contextItems;
const { sortBy, orderBy: order } = this.sorting;
// we must sort items before passing to "KubeObjectListLayout -> Table"
@ -101,8 +100,8 @@ class NonInjectedEvents extends React.Component<Dependencies & EventsProps> {
}
customizeHeader: HeaderCustomizer = ({ info, title, ...headerPlaceholders }) => {
const { compact } = this.props;
const { store, items, visibleItems } = this;
const { compact, eventStore } = this.props;
const { items, visibleItems } = this;
const allEventsAreShown = visibleItems.length === items.length;
// handle "compact"-mode header
@ -133,7 +132,7 @@ class NonInjectedEvents extends React.Component<Dependencies & EventsProps> {
small
material="help_outline"
className="help-icon"
tooltip={`Limited to ${store.limit}`}
tooltip={`Limited to ${eventStore.limit}`}
/>
</>
),
@ -143,15 +142,14 @@ class NonInjectedEvents extends React.Component<Dependencies & EventsProps> {
};
render() {
const { store } = this;
const { compact, compactLimit, className, ...layoutProps } = this.props;
const { apiManager, eventStore, compact, compactLimit, className, ...layoutProps } = this.props;
const events = (
<KubeObjectListLayout
{...layoutProps}
isConfigurable
tableId="events"
store={store}
store={eventStore}
className={cssNames("Events", className, { compact })}
renderHeaderTitle="Events"
customizeHeader={this.customizeHeader}
@ -227,13 +225,11 @@ class NonInjectedEvents extends React.Component<Dependencies & EventsProps> {
}
}
export const Events = withInjectables<Dependencies, EventsProps>(
NonInjectedEvents,
{
getProps: (di, props) => ({
navigateToEvents: di.inject(navigateToEventsInjectable),
...props,
}),
},
);
export const Events = withInjectables<Dependencies, EventsProps>(NonInjectedEvents, {
getProps: (di, props) => ({
...props,
navigateToEvents: di.inject(navigateToEventsInjectable),
apiManager: di.inject(apiManagerInjectable),
eventStore: di.inject(eventStoreInjectable),
}),
});

View File

@ -11,12 +11,13 @@ import { KubeObject } from "../../../common/k8s-api/kube-object";
import { DrawerItem, DrawerTitle } from "../drawer";
import { cssNames } from "../../utils";
import { LocaleDate } from "../locale-date";
import { eventStore } from "./event.store";
import type { EventStore } from "./store";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
import eventStoreInjectable from "./store.injectable";
export interface KubeEventDetailsProps {
object: KubeObject;
@ -24,6 +25,7 @@ export interface KubeEventDetailsProps {
interface Dependencies {
subscribeStores: SubscribeStores;
eventStore: EventStore;
}
@observer
@ -31,13 +33,13 @@ class NonInjectedKubeEventDetails extends React.Component<KubeEventDetailsProps
componentDidMount() {
disposeOnUnmount(this, [
this.props.subscribeStores([
eventStore,
this.props.eventStore,
]),
]);
}
render() {
const { object } = this.props;
const { object, eventStore } = this.props;
if (!object) {
return null;
@ -90,6 +92,7 @@ export const KubeEventDetails = withInjectables<Dependencies, KubeEventDetailsPr
getProps: (di, props) => ({
...props,
subscribeStores: di.inject(subscribeStoresInjectable),
eventStore: di.inject(eventStoreInjectable),
}),
});

View File

@ -8,7 +8,7 @@ import "./kube-event-icon.scss";
import React from "react";
import { Icon } from "../icon";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import { eventStore } from "./event.store";
import { eventStore } from "./legacy-store";
import { cssNames } from "../../utils";
import type { KubeEvent } from "../../../common/k8s-api/endpoints/events.api";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import eventStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(eventStoreInjectable)` instead
*/
export const eventStore = asLegacyGlobalForExtensionApi(eventStoreInjectable);

View File

@ -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 assert from "assert";
import getPodByIdInjectable from "../+workloads-pods/get-pod-by-id.injectable";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import kubeEventApiInjectable from "../../../common/k8s-api/endpoints/events.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { EventStore } from "./store";
const eventStoreInjectable = getInjectable({
id: "event-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "eventStore is only available in certain environments");
const api = di.inject(kubeEventApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new EventStore({
getPodById: di.inject(getPodByIdInjectable),
}, api);
apiManager.registerStore(store);
return store;
},
});
export default eventStoreInjectable;

View File

@ -5,18 +5,25 @@
import groupBy from "lodash/groupBy";
import compact from "lodash/compact";
import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object.store";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { autoBind, isClusterPageContext } from "../../utils";
import { autoBind } from "../../utils";
import type { KubeEvent, KubeEventApi } from "../../../common/k8s-api/endpoints/events.api";
import { eventApi } from "../../../common/k8s-api/endpoints/events.api";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import { Pod } from "../../../common/k8s-api/endpoints/pod.api";
import { podStore } from "../+workloads-pods/legacy-store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { GetPodById } from "../+workloads-pods/get-pod-by-id.injectable";
export interface EventStoreDependencies {
getPodById: GetPodById;
}
export class EventStore extends KubeObjectStore<KubeEvent, KubeEventApi> {
constructor(api: KubeEventApi) {
super(api, { limit: 1000 });
constructor(
protected readonly dependencies: EventStoreDependencies,
api: KubeEventApi,
opts: KubeObjectStoreOptions = {},
) {
super(api, { limit: 1000, ...opts });
autoBind(this);
}
@ -48,9 +55,11 @@ export class EventStore extends KubeObjectStore<KubeEvent, KubeEventApi> {
const { kind, uid } = recent.involvedObject;
if (kind == Pod.kind) { // Wipe out running pods
const pod = podStore.getById(uid);
const pod = this.dependencies.getPodById(uid);
if (!pod || (!pod.hasIssues() && (pod.spec?.priority ?? 0) < 500000)) return undefined;
if (!pod || (!pod.hasIssues() && (pod.spec?.priority ?? 0) < 500000)) {
return undefined;
}
}
return recent;
@ -63,11 +72,3 @@ export class EventStore extends KubeObjectStore<KubeEvent, KubeEventApi> {
return this.getWarnings().length;
}
}
export const eventStore = isClusterPageContext()
? new EventStore(eventApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(eventStore);
}

View File

@ -14,9 +14,9 @@ import { getMetricsForNamespace, type PodMetricData, Namespace } from "../../../
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { Link } from "react-router-dom";
import { Spinner } from "../spinner";
import { resourceQuotaStore } from "../+config-resource-quotas/resource-quotas.store";
import { resourceQuotaStore } from "../+config-resource-quotas/legacy-store";
import { KubeObjectMeta } from "../kube-object-meta";
import { limitRangeStore } from "../+config-limit-ranges/limit-ranges.store";
import { limitRangeStore } from "../+config-limit-ranges/legacy-store";
import { ResourceMetrics } from "../resource-metrics";
import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";

View File

@ -1,21 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { Endpoints, EndpointsApi, EndpointsData } from "../../../common/k8s-api/endpoints/endpoint.api";
import { endpointsApi } from "../../../common/k8s-api/endpoints/endpoint.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class EndpointStore extends KubeObjectStore<Endpoints, EndpointsApi, EndpointsData> {
}
export const endpointStore = isClusterPageContext()
? new EndpointStore(endpointsApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(endpointStore);
}

View File

@ -7,7 +7,7 @@ import "./endpoints.scss";
import React from "react";
import { observer } from "mobx-react";
import { endpointStore } from "./endpoints.store";
import { endpointsStore } from "./legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
@ -29,7 +29,7 @@ export class Endpoints extends React.Component {
isConfigurable
tableId="network_endpoints"
className="Endpoints"
store={endpointStore}
store={endpointsStore}
sortingCallbacks={{
[columnId.name]: endpoint => endpoint.getName(),
[columnId.namespace]: endpoint => endpoint.getNs(),

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import endpointsStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(endpointsStoreInjectable)`
*/
export const endpointsStore = asLegacyGlobalForExtensionApi(endpointsStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import endpointsApiInjectable from "../../../common/k8s-api/endpoints/endpoint.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { EndpointsStore } from "./store";
const endpointsStoreInjectable = getInjectable({
id: "endpoints-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "endpointsStore is only available in certain environments");
const api = di.inject(endpointsApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new EndpointsStore(api);
apiManager.registerStore(store);
return store;
},
});
export default endpointsStoreInjectable;

View File

@ -0,0 +1,10 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { Endpoints, EndpointsApi, EndpointsData } from "../../../common/k8s-api/endpoints/endpoint.api";
export class EndpointsStore extends KubeObjectStore<Endpoints, EndpointsApi, EndpointsData> {
}

View File

@ -7,7 +7,7 @@ import "./ingresses.scss";
import React from "react";
import { observer } from "mobx-react";
import { ingressStore } from "./ingress.store";
import { ingressStore } from "./legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import ingressStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(ingressStoreInjectable)` instead
*/
export const ingressStore = asLegacyGlobalForExtensionApi(ingressStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import ingressApiInjectable from "../../../common/k8s-api/endpoints/ingress.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { IngressStore } from "./store";
const ingressStoreInjectable = getInjectable({
id: "ingress-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "ingressStore is only available in certain environments");
const api = di.inject(ingressApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new IngressStore(api);
apiManager.registerStore(store);
return store;
},
});
export default ingressStoreInjectable;

View File

@ -2,19 +2,8 @@
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { Ingress, IngressApi } from "../../../common/k8s-api/endpoints";
import { ingressApi } from "../../../common/k8s-api/endpoints";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { isClusterPageContext } from "../../utils";
export class IngressStore extends KubeObjectStore<Ingress, IngressApi> {
}
export const ingressStore = isClusterPageContext()
? new IngressStore(ingressApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(ingressStore);
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import networkPolicyStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(networkPolicyStoreInjectable)` instead
*/
export const networkPolicyStore = asLegacyGlobalForExtensionApi(networkPolicyStoreInjectable);

View File

@ -8,7 +8,7 @@ import "./network-policies.scss";
import React from "react";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { networkPolicyStore } from "./network-policy.store";
import { networkPolicyStore } from "./legacy-store";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import networkPolicyApiInjectable from "../../../common/k8s-api/endpoints/network-policy.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { NetworkPolicyStore } from "./store";
const networkPolicyStoreInjectable = getInjectable({
id: "network-policy-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "networkPolicyStore is only available in certain environments");
const api = di.inject(networkPolicyApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new NetworkPolicyStore(api);
apiManager.registerStore(store);
return store;
},
});
export default networkPolicyStoreInjectable;

View File

@ -5,11 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { NetworkPolicy, NetworkPolicyApi } from "../../../common/k8s-api/endpoints/network-policy.api";
import { networkPolicyApi } from "../../../common/k8s-api/endpoints/network-policy.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
export class NetworkPolicyStore extends KubeObjectStore<NetworkPolicy, NetworkPolicyApi> {
}
export const networkPolicyStore = new NetworkPolicyStore(networkPolicyApi);
apiManager.registerStore(networkPolicyStore);

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import serviceStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(serviceStoreInjectable)` instead
*/
export const serviceStore = asLegacyGlobalForExtensionApi(serviceStoreInjectable);

View File

@ -7,7 +7,7 @@ import { observer } from "mobx-react";
import React from "react";
import { Table, TableHead, TableCell, TableRow } from "../table";
import { prevDefault } from "../../utils";
import { endpointStore } from "../+network-endpoints/endpoints.store";
import { endpointsStore } from "../+network-endpoints/legacy-store";
import { Spinner } from "../spinner";
import { showDetails } from "../kube-detail-params";
import logger from "../../../common/logger";
@ -22,7 +22,7 @@ export class ServiceDetailsEndpoint extends React.Component<ServiceDetailsEndpoi
render() {
const { endpoints } = this.props;
if (!endpoints && !endpointStore.isLoaded) return (
if (!endpoints && !endpointsStore.isLoaded) return (
<div className="PodDetailsList flex justify-center"><Spinner/></div>
);

View File

@ -13,7 +13,7 @@ import type { KubeObjectDetailsProps } from "../kube-object-details";
import { Service } from "../../../common/k8s-api/endpoints";
import { KubeObjectMeta } from "../kube-object-meta";
import { ServicePortComponent } from "./service-port-component";
import { endpointStore } from "../+network-endpoints/endpoints.store";
import type { EndpointsStore } from "../+network-endpoints/store";
import { ServiceDetailsEndpoint } from "./service-details-endpoint";
import type { PortForwardStore } from "../../port-forward";
import logger from "../../../common/logger";
@ -21,6 +21,7 @@ import { withInjectables } from "@ogre-tools/injectable-react";
import portForwardStoreInjectable from "../../port-forward/port-forward-store/port-forward-store.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
import endpointsStoreInjectable from "../+network-endpoints/store.injectable";
export interface ServiceDetailsProps extends KubeObjectDetailsProps<Service> {
}
@ -28,25 +29,31 @@ export interface ServiceDetailsProps extends KubeObjectDetailsProps<Service> {
interface Dependencies {
subscribeStores: SubscribeStores;
portForwardStore: PortForwardStore;
endpointsStore: EndpointsStore;
}
@observer
class NonInjectedServiceDetails extends React.Component<ServiceDetailsProps & Dependencies> {
componentDidMount() {
const { object: service } = this.props;
const {
object: service,
subscribeStores,
endpointsStore,
portForwardStore,
} = this.props;
disposeOnUnmount(this, [
this.props.subscribeStores([
endpointStore,
subscribeStores([
endpointsStore,
], {
namespaces: [service.getNs()],
}),
this.props.portForwardStore.watch(),
portForwardStore.watch(),
]);
}
render() {
const { object: service } = this.props;
const { object: service, endpointsStore } = this.props;
if (!service) {
return null;
@ -59,7 +66,7 @@ class NonInjectedServiceDetails extends React.Component<ServiceDetailsProps & De
}
const { spec } = service;
const endpoints = endpointStore.getByName(service.getName(), service.getNs());
const endpoints = endpointsStore.getByName(service.getName(), service.getNs());
const externalIps = service.getExternalIps();
if (externalIps.length === 0 && spec?.externalName) {
@ -150,5 +157,6 @@ export const ServiceDetails = withInjectables<Dependencies, ServiceDetailsProps>
...props,
subscribeStores: di.inject(subscribeStoresInjectable),
portForwardStore: di.inject(portForwardStoreInjectable),
endpointsStore: di.inject(endpointsStoreInjectable),
}),
});

View File

@ -9,7 +9,7 @@ import React from "react";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { Badge } from "../badge";
import { serviceStore } from "./services.store";
import { serviceStore } from "./legacy-store";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import serviceApiInjectable from "../../../common/k8s-api/endpoints/service.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { ServiceStore } from "./store";
const serviceStoreInjectable = getInjectable({
id: "service-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "serviceStore is only available in certain environments");
const api = di.inject(serviceApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new ServiceStore(api);
apiManager.registerStore(store);
return store;
},
});
export default serviceStoreInjectable;

View File

@ -5,11 +5,6 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { Service, ServiceApi } from "../../../common/k8s-api/endpoints/service.api";
import { serviceApi } from "../../../common/k8s-api/endpoints/service.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
export class ServiceStore extends KubeObjectStore<Service, ServiceApi> {
}
export const serviceStore = new ServiceStore(serviceApi);
apiManager.registerStore(serviceStore);

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import nodeStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(nodeStoreInjectable)` instead
*/
export const nodeStore = asLegacyGlobalForExtensionApi(nodeStoreInjectable);

View File

@ -8,7 +8,7 @@ import React from "react";
import { observer } from "mobx-react";
import { cssNames, interval } from "../../utils";
import { TabLayout } from "../layout/tab-layout-2";
import { nodesStore } from "./nodes.store";
import { nodeStore } from "./legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import type { NodeMetricData, Node } from "../../../common/k8s-api/endpoints/node.api";
import { formatNodeTaint, getMetricsForAllNodes } from "../../../common/k8s-api/endpoints/node.api";
@ -19,7 +19,7 @@ import kebabCase from "lodash/kebabCase";
import upperFirst from "lodash/upperFirst";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { Badge } from "../badge/badge";
import { eventStore } from "../+events/event.store";
import { eventStore } from "../+events/legacy-store";
import { makeObservable, observable } from "mobx";
import isEmpty from "lodash/isEmpty";
import { KubeObjectAge } from "../kube-object/age";
@ -181,8 +181,8 @@ export class NodesRoute extends React.Component {
isConfigurable
tableId="nodes"
className="Nodes"
store={nodesStore}
isReady={nodesStore.isLoaded}
store={nodeStore}
isReady={nodeStore.isLoaded}
dependentStores={[eventStore]}
isSelectable={false}
sortingCallbacks={{

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import nodeApiInjectable from "../../../common/k8s-api/endpoints/node.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { NodeStore } from "./store";
const nodeStoreInjectable = getInjectable({
id: "node-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "nodeStore is only available in certain environments");
const api = di.inject(nodeApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new NodeStore(api);
apiManager.registerStore(store);
return store;
},
});
export default nodeStoreInjectable;

View File

@ -5,15 +5,14 @@
import { sum } from "lodash";
import { computed, makeObservable } from "mobx";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { Node, NodeApi } from "../../../common/k8s-api/endpoints";
import { nodeApi } from "../../../common/k8s-api/endpoints";
import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object.store";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { autoBind, isClusterPageContext } from "../../utils";
import { autoBind } from "../../utils";
export class NodesStore extends KubeObjectStore<Node, NodeApi> {
constructor() {
super(nodeApi);
export class NodeStore extends KubeObjectStore<Node, NodeApi> {
constructor(api: NodeApi, opts?: KubeObjectStoreOptions) {
super(api, opts);
makeObservable(this);
autoBind(this);
@ -28,14 +27,6 @@ export class NodesStore extends KubeObjectStore<Node, NodeApi> {
}
getWarningsCount(): number {
return sum(this.items.map((node: Node) => node.getWarningConditions().length));
return sum(this.items.map((node) => node.getWarningConditions().length));
}
}
export const nodesStore = isClusterPageContext()
? new NodesStore()
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(nodesStore);
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import podSecurityPolicyStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(podSecurityPolicyStoreInjectable)` instead
*/
export const podSecurityPolicyStore = asLegacyGlobalForExtensionApi(podSecurityPolicyStoreInjectable);

View File

@ -8,7 +8,7 @@ import "./pod-security-policies.scss";
import React from "react";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { podSecurityPolicyStore } from "./pod-security-policies.store";
import { podSecurityPolicyStore } from "./legacy-store";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import podSecurityPolicyApiInjectable from "../../../common/k8s-api/endpoints/pod-security-policy.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { PodSecurityPolicyStore } from "./store";
const podSecurityPolicyStoreInjectable = getInjectable({
id: "pod-security-policy-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "podSecurityPolicyStore is only available in certain environments");
const api = di.inject(podSecurityPolicyApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new PodSecurityPolicyStore(api);
apiManager.registerStore(store);
return store;
},
});
export default podSecurityPolicyStoreInjectable;

View File

@ -4,12 +4,7 @@
*/
import type { PodSecurityPolicy, PodSecurityPolicyApi } from "../../../common/k8s-api/endpoints";
import { podSecurityPolicyApi } from "../../../common/k8s-api/endpoints";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { apiManager } from "../../../common/k8s-api/api-manager";
export class PodSecurityPolicyStore extends KubeObjectStore<PodSecurityPolicy, PodSecurityPolicyApi> {
}
export const podSecurityPolicyStore = new PodSecurityPolicyStore(podSecurityPolicyApi);
apiManager.registerStore(podSecurityPolicyStore);

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import storageClassStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(storageClassStoreInjectable)` instead
*/
export const storageClassStore = asLegacyGlobalForExtensionApi(storageClassStoreInjectable);

View File

@ -13,19 +13,23 @@ import { disposeOnUnmount, observer } from "mobx-react";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { StorageClass } from "../../../common/k8s-api/endpoints";
import { KubeObjectMeta } from "../kube-object-meta";
import { storageClassStore } from "./storage-class.store";
import type { StorageClassStore } from "./store";
import { VolumeDetailsList } from "../+storage-volumes/volume-details-list";
import { volumesStore } from "../+storage-volumes/volumes.store";
import type { PersistentVolumeStore } from "../+storage-volumes/store";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
import storageClassStoreInjectable from "./store.injectable";
import persistentVolumeStoreInjectable from "../+storage-volumes/store.injectable";
export interface StorageClassDetailsProps extends KubeObjectDetailsProps<StorageClass> {
}
interface Dependencies {
subscribeStores: SubscribeStores;
storageClassStore: StorageClassStore;
persistentVolumeStore: PersistentVolumeStore;
}
@observer
@ -33,13 +37,13 @@ class NonInjectedStorageClassDetails extends React.Component<StorageClassDetails
componentDidMount() {
disposeOnUnmount(this, [
this.props.subscribeStores([
volumesStore,
this.props.persistentVolumeStore,
]),
]);
}
render() {
const { object: storageClass } = this.props;
const { object: storageClass, storageClassStore } = this.props;
if (!storageClass) {
return null;
@ -97,6 +101,8 @@ export const StorageClassDetails = withInjectables<Dependencies, StorageClassDet
getProps: (di, props) => ({
...props,
subscribeStores: di.inject(subscribeStoresInjectable),
storageClassStore: di.inject(storageClassStoreInjectable),
persistentVolumeStore: di.inject(persistentVolumeStoreInjectable),
}),
});

View File

@ -1,19 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { StorageClass, StorageClassApi, StorageClassData } from "../../../common/k8s-api/endpoints/storage-class.api";
import { storageClassApi } from "../../../common/k8s-api/endpoints/storage-class.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { volumesStore } from "../+storage-volumes/volumes.store";
export class StorageClassStore extends KubeObjectStore<StorageClass, StorageClassApi, StorageClassData> {
getPersistentVolumes(storageClass: StorageClass) {
return volumesStore.getByStorageClass(storageClass);
}
}
export const storageClassStore = new StorageClassStore(storageClassApi);
apiManager.registerStore(storageClassStore);

View File

@ -8,7 +8,7 @@ import "./storage-classes.scss";
import React from "react";
import { observer } from "mobx-react";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { storageClassStore } from "./storage-class.store";
import { storageClassStore } from "./legacy-store";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
import { KubeObjectAge } from "../kube-object/age";

View File

@ -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 assert from "assert";
import getPersistentVolumesByStorageClassInjectable from "../+storage-volumes/get-persisten-volumes-by-storage-class.injectable";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import storageClassApiInjectable from "../../../common/k8s-api/endpoints/storage-class.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { StorageClassStore } from "./store";
const storageClassStoreInjectable = getInjectable({
id: "storage-class-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "storageClassStore is only available in certain environments");
const api = di.inject(storageClassApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new StorageClassStore({
getPersistentVolumesByStorageClass: di.inject(getPersistentVolumesByStorageClassInjectable),
}, api);
apiManager.registerStore(store);
return store;
},
});
export default storageClassStoreInjectable;

View File

@ -0,0 +1,27 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object.store";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { StorageClass, StorageClassApi, StorageClassData } from "../../../common/k8s-api/endpoints/storage-class.api";
import type { GetPersistentVolumesByStorageClass } from "../+storage-volumes/get-persisten-volumes-by-storage-class.injectable";
export interface StorageClassStoreDependencies {
getPersistentVolumesByStorageClass: GetPersistentVolumesByStorageClass;
}
export class StorageClassStore extends KubeObjectStore<StorageClass, StorageClassApi, StorageClassData> {
constructor(
protected readonly dependencies: StorageClassStoreDependencies,
api: StorageClassApi,
opts?: KubeObjectStoreOptions,
) {
super(api, opts);
}
getPersistentVolumes(storageClass: StorageClass) {
return this.dependencies.getPersistentVolumesByStorageClass(storageClass);
}
}

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import persistentVolumeClaimStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(persistentVolumeClaimStoreInjectable)` instead
*/
export const persistentVolumeClaimStore = asLegacyGlobalForExtensionApi(persistentVolumeClaimStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import persistentVolumeClaimApiInjectable from "../../../common/k8s-api/endpoints/persistent-volume-claim.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { PersistentVolumeClaimStore } from "./store";
const persistentVolumeClaimStoreInjectable = getInjectable({
id: "persistent-volume-claim-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "persistentVolumeClaimStore is only available in certain environments");
const api = di.inject(persistentVolumeClaimApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new PersistentVolumeClaimStore(api);
apiManager.registerStore(store);
return store;
},
});
export default persistentVolumeClaimStoreInjectable;

View File

@ -2,13 +2,8 @@
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { PersistentVolumeClaim, PersistentVolumeClaimApi } from "../../../common/k8s-api/endpoints";
import { persistentVolumeClaimApi } from "../../../common/k8s-api/endpoints";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
export class PersistentVolumeClaimStore extends KubeObjectStore<PersistentVolumeClaim, PersistentVolumeClaimApi> {
}
export const persistentVolumeClaimStore = new PersistentVolumeClaimStore(persistentVolumeClaimApi);
apiManager.registerStore(persistentVolumeClaimStore);

View File

@ -8,7 +8,7 @@ import "./volume-claims.scss";
import React from "react";
import { observer } from "mobx-react";
import { Link } from "react-router-dom";
import { persistentVolumeClaimStore } from "./volume-claim.store";
import { persistentVolumeClaimStore } from "./legacy-store";
import { podStore } from "../+workloads-pods/legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { unitsToBytes } from "../../../common/utils/convertMemory";

View File

@ -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 type { PersistentVolume, StorageClass } from "../../../common/k8s-api/endpoints";
import persistentVolumeStoreInjectable from "./store.injectable";
export type GetPersistentVolumesByStorageClass = (obj: StorageClass) => PersistentVolume[];
const getPersistentVolumesByStorageClassInjectable = getInjectable({
id: "get-persistent-volumes-by-storage-class",
instantiate: (di): GetPersistentVolumesByStorageClass => {
const store = di.inject(persistentVolumeStoreInjectable);
return (obj) => store.getByStorageClass(obj);
},
});
export default getPersistentVolumesByStorageClassInjectable;

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import persistentVolumeStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(persistentVolumeStoreInjectable)` instead
*/
export const persistentVolumeStore = asLegacyGlobalForExtensionApi(persistentVolumeStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import persistentVolumeApiInjectable from "../../../common/k8s-api/endpoints/persistent-volume.api.injectable";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { PersistentVolumeStore } from "./store";
const persistentVolumeStoreInjectable = getInjectable({
id: "persistent-volume-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "persistentVolumeStore is only available in certain environments");
const api = di.inject(persistentVolumeApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new PersistentVolumeStore(api);
apiManager.registerStore(store);
return store;
},
});
export default persistentVolumeStoreInjectable;

View File

@ -5,17 +5,13 @@
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { PersistentVolume, PersistentVolumeApi } from "../../../common/k8s-api/endpoints/persistent-volume.api";
import { persistentVolumeApi } from "../../../common/k8s-api/endpoints/persistent-volume.api";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { StorageClass } from "../../../common/k8s-api/endpoints/storage-class.api";
export class PersistentVolumesStore extends KubeObjectStore<PersistentVolume, PersistentVolumeApi> {
export class PersistentVolumeStore extends KubeObjectStore<PersistentVolume, PersistentVolumeApi> {
getByStorageClass(storageClass: StorageClass): PersistentVolume[] {
return this.items.filter(volume =>
volume.getStorageClassName() === storageClass.getName(),
);
const storageClassName = storageClass.getName();
return this.items
.filter(volume => volume.getStorageClassName() === storageClassName);
}
}
export const volumesStore = new PersistentVolumesStore(persistentVolumeApi);
apiManager.registerStore(volumesStore);

View File

@ -16,7 +16,7 @@ import { Spinner } from "../spinner/spinner";
import { DrawerTitle } from "../drawer/drawer-title";
import { Table } from "../table/table";
import { TableHead } from "../table/table-head";
import { volumesStore } from "./volumes.store";
import { persistentVolumeStore } from "./legacy-store";
import kebabCase from "lodash/kebabCase";
export interface VolumeDetailsListProps {
@ -64,7 +64,7 @@ export class VolumeDetailsList extends React.Component<VolumeDetailsListProps> {
const virtual = persistentVolumes.length > 100;
if (!persistentVolumes.length) {
return !volumesStore.isLoaded && <Spinner center/>;
return !persistentVolumeStore.isLoaded && <Spinner center/>;
}
return (

View File

@ -11,7 +11,7 @@ import { Link } from "react-router-dom";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { getDetailsUrl } from "../kube-detail-params";
import { stopPropagation } from "../../utils";
import { volumesStore } from "./volumes.store";
import { persistentVolumeStore } from "./legacy-store";
import { persistentVolumeClaimApi, storageClassApi } from "../../../common/k8s-api/endpoints";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
@ -35,7 +35,7 @@ export class PersistentVolumes extends React.Component {
isConfigurable
tableId="storage_volumes"
className="PersistentVolumes"
store={volumesStore}
store={persistentVolumeStore}
sortingCallbacks={{
[columnId.name]: volume => volume.getName(),
[columnId.storageClass]: volume => volume.getStorageClass(),

View File

@ -17,7 +17,7 @@ import type { KubeObjectDetailsProps } from "../../kube-object-details";
import { KubeObjectMeta } from "../../kube-object-meta";
import { Table, TableCell, TableHead, TableRow } from "../../table";
import { RoleBindingDialog } from "./dialog";
import { roleBindingStore } from "./store";
import { roleBindingStore } from "./legacy-store";
import { ObservableHashSet } from "../../../../common/utils/hash-set";
import { hashSubject } from "../hashers";

View File

@ -23,7 +23,7 @@ import { SubTitle } from "../../layout/sub-title";
import { Notifications } from "../../notifications";
import { Select } from "../../select";
import { Wizard, WizardStep } from "../../wizard";
import { roleBindingStore } from "./store";
import { roleBindingStore } from "./legacy-store";
import { clusterRoleStore } from "../+cluster-roles/legacy-store";
import { Input } from "../../input";
import { ObservableHashSet, nFircate } from "../../../utils";

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalForExtensionApi } from "../../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import roleBindingStoreInjectable from "./store.injectable";
/**
* @deprecated use `di.inject(roleBindingStoreInjectable)` instead
*/
export const roleBindingStore = asLegacyGlobalForExtensionApi(roleBindingStoreInjectable);

View File

@ -0,0 +1,27 @@
/**
* 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 assert from "assert";
import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable";
import roleBindingApiInjectable from "../../../../common/k8s-api/endpoints/role-binding.api.injectable";
import createStoresAndApisInjectable from "../../../create-stores-apis.injectable";
import { RoleBindingStore } from "./store";
const roleBindingStoreInjectable = getInjectable({
id: "role-binding-store",
instantiate: (di) => {
assert(di.inject(createStoresAndApisInjectable), "roleBindingStore is only available in certain environments");
const api = di.inject(roleBindingApiInjectable);
const apiManager = di.inject(apiManagerInjectable);
const store = new RoleBindingStore(api);
apiManager.registerStore(store);
return store;
},
});
export default roleBindingStoreInjectable;

View File

@ -3,12 +3,10 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { apiManager } from "../../../../common/k8s-api/api-manager";
import type { RoleBinding, RoleBindingApi, RoleBindingData } from "../../../../common/k8s-api/endpoints";
import { roleBindingApi } from "../../../../common/k8s-api/endpoints";
import type { Subject } from "../../../../common/k8s-api/endpoints/types/subject";
import { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store";
import { HashSet, isClusterPageContext } from "../../../utils";
import { HashSet } from "../../../utils";
import { hashSubject } from "../hashers";
export class RoleBindingStore extends KubeObjectStore<RoleBinding, RoleBindingApi, RoleBindingData> {
@ -36,11 +34,3 @@ export class RoleBindingStore extends KubeObjectStore<RoleBinding, RoleBindingAp
return this.updateSubjects(roleBinding, currentSubjects.toJSON());
}
}
export const roleBindingStore = isClusterPageContext()
? new RoleBindingStore(roleBindingApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(roleBindingStore);
}

View File

@ -9,7 +9,7 @@ import React from "react";
import { KubeObjectListLayout } from "../../kube-object-list-layout";
import { KubeObjectStatusIcon } from "../../kube-object-status-icon";
import { RoleBindingDialog } from "./dialog";
import { roleBindingStore } from "./store";
import { roleBindingStore } from "./legacy-store";
import { roleStore } from "../+roles/legacy-store";
import { clusterRoleStore } from "../+cluster-roles/legacy-store";
import { serviceAccountStore } from "../+service-accounts/legacy-store";

View File

@ -10,7 +10,7 @@ import { disposeOnUnmount, observer } from "mobx-react";
import React from "react";
import { Link } from "react-router-dom";
import { secretStore } from "../../+config-secrets/secrets.store";
import { secretStore } from "../../+config-secrets/legacy-store";
import type { Secret, ServiceAccount } from "../../../../common/k8s-api/endpoints";
import { DrawerItem, DrawerTitle } from "../../drawer";
import { Icon } from "../../icon";

View File

@ -9,7 +9,7 @@ import React from "react";
import { observer } from "mobx-react";
import { cronJobStore } from "./legacy-store";
import { jobStore } from "../+workloads-jobs/legacy-store";
import { eventStore } from "../+events/event.store";
import { eventStore } from "../+events/legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
import moment from "moment";

Some files were not shown because too many files have changed in this diff Show More