diff --git a/src/common/k8s-api/endpoints/legacy-globals.ts b/src/common/k8s-api/endpoints/legacy-globals.ts index d5d46a4ea6..e097677233 100644 --- a/src/common/k8s-api/endpoints/legacy-globals.ts +++ b/src/common/k8s-api/endpoints/legacy-globals.ts @@ -4,56 +4,18 @@ */ import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; -import clusterRoleBindingApiInjectable from "./cluster-role-binding.api.injectable"; -import clusterRoleApiInjectable from "./cluster-role.api.injectable"; -import clusterApiInjectable from "./cluster.api.injectable"; -import componentStatusApiInjectable from "./component-status.api.injectable"; import configMapApiInjectable from "./config-map.api.injectable"; import cronJobApiInjectable from "./cron-job.api.injectable"; -import customResourceDefinitionApiInjectable from "./custom-resource-definition.api.injectable"; -import daemonSetApiInjectable from "./daemon-set.api.injectable"; -import deploymentApiInjectable from "./deployment.api.injectable"; -import endpointsApiInjectable from "./endpoint.api.injectable"; -import kubeEventApiInjectable from "./events.api.injectable"; -import horizontalPodAutoscalerApiInjectable from "./horizontal-pod-autoscaler.api.injectable"; -import ingressApiInjectable from "./ingress.api.injectable"; import jobApiInjectable from "./job.api.injectable"; -import limitRangeApiInjectable from "./limit-range.api.injectable"; -import namespaceApiInjectable from "./namespace.api.injectable"; import networkPolicyApiInjectable from "./network-policy.api.injectable"; import nodeApiInjectable from "./node.api.injectable"; import persistentVolumeClaimApiInjectable from "./persistent-volume-claim.api.injectable"; -import persistentVolumeApiInjectable from "./persistent-volume.api.injectable"; -import podDisruptionBudgetApiInjectable from "./pod-disruption-budget.api.injectable"; -import podMetricsApiInjectable from "./pod-metrics.api.injectable"; -import podSecurityPolicyApiInjectable from "./pod-security-policy.api.injectable"; import podApiInjectable from "./pod.api.injectable"; -import replicaSetApiInjectable from "./replica-set.api.injectable"; -import resourceQuotaApiInjectable from "./resource-quota.api.injectable"; -import roleBindingApiInjectable from "./role-binding.api.injectable"; import roleApiInjectable from "./role.api.injectable"; import secretApiInjectable from "./secret.api.injectable"; -import selfSubjectRulesReviewApiInjectable from "./self-subject-rules-reviews.api.injectable"; -import serviceAccountApiInjectable from "./service-account.api.injectable"; import serviceApiInjectable from "./service.api.injectable"; -import statefulSetApiInjectable from "./stateful-set.api.injectable"; import storageClassApiInjectable from "./storage-class.api.injectable"; -/** - * @deprecated use `di.inject(clusterRoleBindingApiInjectable)` instead - */ -export const clusterRoleBindingApi = asLegacyGlobalForExtensionApi(clusterRoleBindingApiInjectable); - -/** - * @deprecated use `di.inject(clusterRoleApiInjectable)` instead - */ -export const clusterRoleApi = asLegacyGlobalForExtensionApi(clusterRoleApiInjectable); - -/** - * @deprecated use `di.inject(serviceAccountApiInjectable)` instead - */ -export const serviceAccountApi = asLegacyGlobalForExtensionApi(serviceAccountApiInjectable); - /** * @deprecated use `di.inject(roleApiInjectable)` instead */ @@ -64,26 +26,6 @@ export const roleApi = asLegacyGlobalForExtensionApi(roleApiInjectable); */ export const podApi = asLegacyGlobalForExtensionApi(podApiInjectable); -/** - * @deprecated use `di.inject(daemonSetApiInjectable)` instead - */ -export const daemonSetApi = asLegacyGlobalForExtensionApi(daemonSetApiInjectable); - -/** - * @deprecated use `di.inject(replicaSetApiInjectable)` instead - */ -export const replicaSetApi = asLegacyGlobalForExtensionApi(replicaSetApiInjectable); - -/** - * @deprecated use `di.inject(statefulSetApiInjectable)` instead - */ -export const statefulSetApi = asLegacyGlobalForExtensionApi(statefulSetApiInjectable); - -/** - * @deprecated use `di.inject(deploymentApiInjectable)` instead - */ -export const deploymentApi = asLegacyGlobalForExtensionApi(deploymentApiInjectable); - /** * @deprecated use `di.inject(cronJobApiInjectable)` instead */ @@ -94,56 +36,11 @@ export const cronJobApi = asLegacyGlobalForExtensionApi(cronJobApiInjectable); */ export const jobApi = asLegacyGlobalForExtensionApi(jobApiInjectable); -/** - * @deprecated use `di.inject(clusterApiInjectable)` instead - */ -export const clusterApi = asLegacyGlobalForExtensionApi(clusterApiInjectable); - /** * @deprecated use `di.inject(configMapApiInjectable)` instead */ export const configMapApi = asLegacyGlobalForExtensionApi(configMapApiInjectable); -/** - * @deprecated use `di.inject(componentStatusApiInjectable)` instead - */ -export const componentStatusApi = asLegacyGlobalForExtensionApi(componentStatusApiInjectable); - -/** - * @deprecated use `di.inject(customResourceDefinitionApiInjectable)` instead - */ -export const customResourceDefinitionApi = asLegacyGlobalForExtensionApi(customResourceDefinitionApiInjectable); - -/** - * @deprecated use `di.inject(kubeEventApiInjectable)` instead - */ -export const kubeEventApi = asLegacyGlobalForExtensionApi(kubeEventApiInjectable); - -/** - * @deprecated use `di.inject(endpointsApiInjectable)` instead - */ -export const endpointsApi = asLegacyGlobalForExtensionApi(endpointsApiInjectable); - -/** - * @deprecated use `di.inject(horizontalPodAutoscalerApiInjectable)` instead - */ -export const horizontalPodAutoscalerApi = asLegacyGlobalForExtensionApi(horizontalPodAutoscalerApiInjectable); - -/** - * @deprecated use `di.inject(ingressApiInjectable)` instead - */ -export const ingressApi = asLegacyGlobalForExtensionApi(ingressApiInjectable); - -/** - * @deprecated use `di.inject(limitRangeApiInjectable)` instead - */ -export const limitRangeApi = asLegacyGlobalForExtensionApi(limitRangeApiInjectable); - -/** - * @deprecated use `di.inject(namespaceApiInjectable)` instead - */ -export const namespaceApi = asLegacyGlobalForExtensionApi(namespaceApiInjectable); - /** * @deprecated use `di.inject(networkPolicyApiInjectable)` instead */ @@ -159,46 +56,11 @@ export const nodeApi = asLegacyGlobalForExtensionApi(nodeApiInjectable); */ export const persistentVolumeClaimApi = asLegacyGlobalForExtensionApi(persistentVolumeClaimApiInjectable); -/** - * @deprecated use `di.inject(persistentVolumeApiInjectable)` instead - */ -export const persistentVolumeApi = asLegacyGlobalForExtensionApi(persistentVolumeApiInjectable); - -/** - * @deprecated use `di.inject(podDisruptionBudgetApiInjectable)` instead - */ -export const podDisruptionBudgetApi = asLegacyGlobalForExtensionApi(podDisruptionBudgetApiInjectable); - -/** - * @deprecated use `di.inject(podMetricsApiInjectable)` instead - */ -export const podMetricsApi = asLegacyGlobalForExtensionApi(podMetricsApiInjectable); - -/** - * @deprecated use `di.inject(podSecurityPolicyApiInjectable)` instead - */ -export const podSecurityPolicyApi = asLegacyGlobalForExtensionApi(podSecurityPolicyApiInjectable); - -/** - * @deprecated use `di.inject(resourceQuotaApiInjectable)` instead - */ -export const resourceQuotaApi = asLegacyGlobalForExtensionApi(resourceQuotaApiInjectable); - -/** - * @deprecated use `di.inject(roleBindingApiInjectable)` instead - */ -export const roleBindingApi = asLegacyGlobalForExtensionApi(roleBindingApiInjectable); - /** * @deprecated use `di.inject(secretApiInjectable)` instead */ export const secretApi = asLegacyGlobalForExtensionApi(secretApiInjectable); -/** - * @deprecated use `di.inject(selfSubjectRulesReviewApiInjectable)` instead - */ -export const selfSubjectRulesReviewApi = asLegacyGlobalForExtensionApi(selfSubjectRulesReviewApiInjectable); - /** * @deprecated use `di.inject(serviceApiInjectable)` instead */ diff --git a/src/common/k8s-api/endpoints/pod.api.ts b/src/common/k8s-api/endpoints/pod.api.ts index 135c11ac93..9a0cff65ef 100644 --- a/src/common/k8s-api/endpoints/pod.api.ts +++ b/src/common/k8s-api/endpoints/pod.api.ts @@ -5,7 +5,7 @@ import type { MetricData } from "./metrics.api"; import { metricsApi } from "./metrics.api"; -import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; +import type { DerivedKubeApiOptions, IgnoredKubeApiOptions, ResourceDescriptor } from "../kube-api"; import { KubeApi } from "../kube-api"; import type { RequireExactlyOne } from "type-fest"; import type { KubeObjectMetadata, LocalObjectReference, Affinity, Toleration, LabelSelector, KubeObjectScope } from "../kube-object"; @@ -22,11 +22,11 @@ export class PodApi extends KubeApi { }); } - getLogs = async (params: { namespace: string; name: string }, query?: IPodLogsQuery): Promise => { + async getLogs(params: ResourceDescriptor, query?: PodLogsQuery): Promise { const path = `${this.getUrl(params)}/log`; return this.request.get(path, { query }); - }; + } } export function getMetricsForPods(pods: Pod[], namespace: string, selector = "pod, namespace"): Promise { @@ -65,7 +65,7 @@ export interface PodMetricData extends Partial> { } // Reference: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#read-log-pod-v1-core -export interface IPodLogsQuery { +export interface PodLogsQuery { container?: string; tailLines?: number; timestamps?: boolean; diff --git a/src/extensions/renderer-api/k8s-api.ts b/src/extensions/renderer-api/k8s-api.ts index 9c0efed85a..e8cc52248f 100644 --- a/src/extensions/renderer-api/k8s-api.ts +++ b/src/extensions/renderer-api/k8s-api.ts @@ -109,7 +109,7 @@ export type { NetworkPolicyStore } from "../../renderer/components/+network-poli 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 { NamespaceStore } from "../../renderer/components/+namespaces/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"; diff --git a/src/renderer/cluster-frame-context/cluster-frame-context.injectable.ts b/src/renderer/cluster-frame-context/cluster-frame-context.injectable.ts index d53f7df22d..08a921a87e 100644 --- a/src/renderer/cluster-frame-context/cluster-frame-context.injectable.ts +++ b/src/renderer/cluster-frame-context/cluster-frame-context.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { ClusterFrameContext } from "./cluster-frame-context"; -import namespaceStoreInjectable from "../components/+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../components/+namespaces/store.injectable"; import hostedClusterInjectable from "../../common/cluster-store/hosted-cluster.injectable"; import assert from "assert"; diff --git a/src/renderer/cluster-frame-context/cluster-frame-context.ts b/src/renderer/cluster-frame-context/cluster-frame-context.ts index 68ae6fa61d..1f1625e9e1 100755 --- a/src/renderer/cluster-frame-context/cluster-frame-context.ts +++ b/src/renderer/cluster-frame-context/cluster-frame-context.ts @@ -4,7 +4,7 @@ */ import type { Cluster } from "../../common/cluster/cluster"; -import type { NamespaceStore } from "../components/+namespaces/namespace-store/namespace.store"; +import type { NamespaceStore } from "../components/+namespaces/store"; import type { ClusterContext } from "../../common/k8s-api/cluster-context"; import { computed, makeObservable } from "mobx"; diff --git a/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.injectable.ts b/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.injectable.ts index 1dd175d838..f6a11daa33 100644 --- a/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.injectable.ts +++ b/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.injectable.ts @@ -12,13 +12,19 @@ import { } from "./cluster-overview-store"; import createStorageInjectable from "../../../utils/create-storage/create-storage.injectable"; import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable"; -import { clusterApi } from "../../../../common/k8s-api/endpoints"; +import clusterApiInjectable from "../../../../common/k8s-api/endpoints/cluster.api.injectable"; +import createStoresAndApisInjectable from "../../../create-stores-apis.injectable"; +import assert from "assert"; +import nodeStoreInjectable from "../../+nodes/store.injectable"; const clusterOverviewStoreInjectable = getInjectable({ id: "cluster-overview-store", instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "clusterOverviewStore is only available in certain environments"); const createStorage = di.inject(createStorageInjectable); + const clusterApi = di.inject(clusterApiInjectable); + const apiManager = di.inject(apiManagerInjectable); const storage = createStorage( "cluster_overview", @@ -27,13 +33,11 @@ const clusterOverviewStoreInjectable = getInjectable({ metricNodeRole: MetricNodeRole.WORKER, }, ); - const store = new ClusterOverviewStore({ storage, + nodeStore: di.inject(nodeStoreInjectable), }, clusterApi); - const apiManager = di.inject(apiManagerInjectable); - apiManager.registerStore(store); return store; diff --git a/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts b/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts index e6c912adc6..d3f47cb430 100644 --- a/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts +++ b/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts @@ -27,7 +27,7 @@ export interface ClusterOverviewStorageState { metricNodeRole: MetricNodeRole; } -interface Dependencies { +interface ClusterOverviewStoreDependencies { readonly storage: StorageLayer; readonly nodeStore: NodeStore; } @@ -52,7 +52,7 @@ export class ClusterOverviewStore extends KubeObjectStore i this.dependencies.storage.merge({ metricNodeRole: value }); } - constructor(protected readonly dependencies: Dependencies, api: ClusterApi) { + constructor(protected readonly dependencies: ClusterOverviewStoreDependencies, api: ClusterApi) { super(api); makeObservable(this); autoBind(this); diff --git a/src/renderer/components/+helm-releases/releases.injectable.ts b/src/renderer/components/+helm-releases/releases.injectable.ts index 1d85dac9f2..5fb8e2e570 100644 --- a/src/renderer/components/+helm-releases/releases.injectable.ts +++ b/src/renderer/components/+helm-releases/releases.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { asyncComputed } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../+namespaces/store.injectable"; import { listReleases } from "../../../common/k8s-api/endpoints/helm-releases.api"; const releasesInjectable = getInjectable({ diff --git a/src/renderer/components/+helm-releases/releases.tsx b/src/renderer/components/+helm-releases/releases.tsx index caba98d722..b8c642c2a5 100644 --- a/src/renderer/components/+helm-releases/releases.tsx +++ b/src/renderer/components/+helm-releases/releases.tsx @@ -9,7 +9,7 @@ import "./releases.scss"; import React, { Component } from "react"; import type { HelmRelease } from "../../../common/k8s-api/endpoints/helm-releases.api"; import { withInjectables } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../+namespaces/store.injectable"; import type { ItemListStore } from "../item-object-list"; import { ItemListLayout } from "../item-object-list"; import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; diff --git a/src/renderer/components/+namespaces/add-namespace-dialog.tsx b/src/renderer/components/+namespaces/add-namespace-dialog.tsx index 0563c0b397..8969c08027 100644 --- a/src/renderer/components/+namespaces/add-namespace-dialog.tsx +++ b/src/renderer/components/+namespaces/add-namespace-dialog.tsx @@ -16,11 +16,11 @@ import { Input } from "../input"; import { systemName } from "../input/input_validators"; import { Notifications } from "../notifications"; import { withInjectables } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "./namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "./store.injectable"; import type { AddNamespaceDialogModel } from "./add-namespace-dialog-model/add-namespace-dialog-model"; import addNamespaceDialogModelInjectable from "./add-namespace-dialog-model/add-namespace-dialog-model.injectable"; -import type { NamespaceStore } from "./namespace-store/namespace.store"; +import type { NamespaceStore } from "./store"; export interface AddNamespaceDialogProps extends DialogProps { onSuccess?(ns: Namespace): void; diff --git a/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.injectable.ts b/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.injectable.ts index 571029c853..087ff4a29b 100644 --- a/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.injectable.ts +++ b/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.injectable.ts @@ -4,7 +4,7 @@ */ import { NamespaceSelectFilterModel } from "./namespace-select-filter-model"; import { getInjectable } from "@ogre-tools/injectable"; -import namespaceStoreInjectable from "../namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../store.injectable"; const namespaceSelectFilterModelInjectable = getInjectable({ id: "namespace-select-filter-model", diff --git a/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx b/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx index 311128ca2d..33e966b207 100644 --- a/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx +++ b/src/renderer/components/+namespaces/namespace-select-filter-model/namespace-select-filter-model.tsx @@ -4,7 +4,7 @@ */ import React from "react"; import { observable, makeObservable, action, untracked, computed } from "mobx"; -import type { NamespaceStore } from "../namespace-store/namespace.store"; +import type { NamespaceStore } from "../store"; import { isMac } from "../../../../common/vars"; import type { ActionMeta } from "react-select"; import { Icon } from "../../icon"; diff --git a/src/renderer/components/+namespaces/namespace-select-filter.tsx b/src/renderer/components/+namespaces/namespace-select-filter.tsx index 938660f056..b9e69250d7 100644 --- a/src/renderer/components/+namespaces/namespace-select-filter.tsx +++ b/src/renderer/components/+namespaces/namespace-select-filter.tsx @@ -9,12 +9,12 @@ import React from "react"; import { observer } from "mobx-react"; import type { PlaceholderProps } from "react-select"; import { components } from "react-select"; -import type { NamespaceStore } from "./namespace-store/namespace.store"; +import type { NamespaceStore } from "./store"; import { Select } from "../select"; import { withInjectables } from "@ogre-tools/injectable-react"; import type { NamespaceSelectFilterModel, NamespaceSelectFilterOption, SelectAllNamespaces } from "./namespace-select-filter-model/namespace-select-filter-model"; import namespaceSelectFilterModelInjectable from "./namespace-select-filter-model/namespace-select-filter-model.injectable"; -import namespaceStoreInjectable from "./namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "./store.injectable"; interface NamespaceSelectFilterProps { id: string; diff --git a/src/renderer/components/+namespaces/namespace-select.tsx b/src/renderer/components/+namespaces/namespace-select.tsx index c69f7c0518..57cd94234f 100644 --- a/src/renderer/components/+namespaces/namespace-select.tsx +++ b/src/renderer/components/+namespaces/namespace-select.tsx @@ -12,9 +12,9 @@ import type { SelectProps } from "../select"; import { Select } from "../select"; import { cssNames } from "../../utils"; import { Icon } from "../icon"; -import type { NamespaceStore } from "./namespace-store/namespace.store"; +import type { NamespaceStore } from "./store"; import { withInjectables } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "./namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "./store.injectable"; export type NamespaceSelectSort = (left: string, right: string) => number; diff --git a/src/renderer/components/+namespaces/namespace-store/namespace-store.injectable.ts b/src/renderer/components/+namespaces/namespace-store/namespace-store.injectable.ts deleted file mode 100644 index 47131ce4b4..0000000000 --- a/src/renderer/components/+namespaces/namespace-store/namespace-store.injectable.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * 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 { NamespaceStore } from "./namespace.store"; -import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable"; -import createStorageInjectable from "../../../utils/create-storage/create-storage.injectable"; -import { namespaceApi } from "../../../../common/k8s-api/endpoints"; - -const namespaceStoreInjectable = getInjectable({ - id: "namespace-store", - - instantiate: (di) => { - const createStorage = di.inject(createStorageInjectable); - - const storage = createStorage( - "selected_namespaces", - undefined, - ); - - const namespaceStore = new NamespaceStore({ - storage, - }, namespaceApi); - - const apiManager = di.inject(apiManagerInjectable); - - apiManager.registerStore(namespaceStore); - - return namespaceStore; - }, -}); - -export default namespaceStoreInjectable; diff --git a/src/renderer/components/+namespaces/route.tsx b/src/renderer/components/+namespaces/route.tsx index ba1103c5d5..4c110fee7f 100644 --- a/src/renderer/components/+namespaces/route.tsx +++ b/src/renderer/components/+namespaces/route.tsx @@ -11,10 +11,10 @@ import { AddNamespaceDialog } from "./add-namespace-dialog"; import { TabLayout } from "../layout/tab-layout-2"; import { Badge } from "../badge"; import { KubeObjectListLayout } from "../kube-object-list-layout"; -import type { NamespaceStore } from "./namespace-store/namespace.store"; +import type { NamespaceStore } from "./store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { withInjectables } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "./namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "./store.injectable"; import addNamespaceDialogModelInjectable from "./add-namespace-dialog-model/add-namespace-dialog-model.injectable"; import { KubeObjectAge } from "../kube-object/age"; diff --git a/src/renderer/components/+namespaces/store.injectable.ts b/src/renderer/components/+namespaces/store.injectable.ts new file mode 100644 index 0000000000..1beb52f7c5 --- /dev/null +++ b/src/renderer/components/+namespaces/store.injectable.ts @@ -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 { NamespaceStore } from "./store"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import createStorageInjectable from "../../utils/create-storage/create-storage.injectable"; +import namespaceApiInjectable from "../../../common/k8s-api/endpoints/namespace.api.injectable"; +import assert from "assert"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; + +const namespaceStoreInjectable = getInjectable({ + id: "namespace-store", + + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "namespaceStore is only available in certain environments"); + const createStorage = di.inject(createStorageInjectable); + const apiManager = di.inject(apiManagerInjectable); + const api = di.inject(namespaceApiInjectable); + + const storage = createStorage( + "selected_namespaces", + undefined, + ); + const store = new NamespaceStore({ + storage, + }, api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default namespaceStoreInjectable; diff --git a/src/renderer/components/+namespaces/namespace-store/namespace.store.ts b/src/renderer/components/+namespaces/store.ts similarity index 93% rename from src/renderer/components/+namespaces/namespace-store/namespace.store.ts rename to src/renderer/components/+namespaces/store.ts index 396403d813..7eda23a941 100644 --- a/src/renderer/components/+namespaces/namespace-store/namespace.store.ts +++ b/src/renderer/components/+namespaces/store.ts @@ -5,12 +5,12 @@ import type { IReactionDisposer } from "mobx"; import { action, comparer, computed, makeObservable, reaction } from "mobx"; -import type { StorageLayer } from "../../../utils"; -import { autoBind, noop, toggle } from "../../../utils"; -import type { KubeObjectStoreLoadingParams } from "../../../../common/k8s-api/kube-object.store"; -import { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store"; -import type { NamespaceApi } from "../../../../common/k8s-api/endpoints/namespace.api"; -import { Namespace } from "../../../../common/k8s-api/endpoints/namespace.api"; +import type { StorageLayer } from "../../utils"; +import { autoBind, noop, toggle } from "../../utils"; +import type { KubeObjectStoreLoadingParams } from "../../../common/k8s-api/kube-object.store"; +import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; +import type { NamespaceApi } from "../../../common/k8s-api/endpoints/namespace.api"; +import { Namespace } from "../../../common/k8s-api/endpoints/namespace.api"; interface Dependencies { storage: StorageLayer; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/cron-jobs-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/cron-jobs-workload.injectable.ts index ac83557430..48c4caf1f5 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/cron-jobs-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/cron-jobs-workload.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import cronJobsStoreInjectable from "../../../+workloads-cronjobs/store.injectable"; import { computed } from "mobx"; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts index 3a011df7fd..0124c0d1ce 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import daemonsetsStoreInjectable from "../../../+workloads-daemonsets/store.injectable"; import navigateToDaemonsetsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/daemonsets/navigate-to-daemonsets.injectable"; import { computed } from "mobx"; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/deployments-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/deployments-workload.injectable.ts index f75537e0b7..27ca74fe97 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/deployments-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/deployments-workload.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import deploymentsStoreInjectable from "../../../+workloads-deployments/store.injectable"; import navigateToDeploymentsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable"; import { computed } from "mobx"; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts index 43d6b5a0a2..3442aabaf7 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import jobStoreInjectable from "../../../+workloads-jobs/store.injectable"; import navigateToJobsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/jobs/navigate-to-jobs.injectable"; import { computed } from "mobx"; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts index 1a84f02885..2a2afefe3a 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import { computed } from "mobx"; import podStoreInjectable from "../../../+workloads-pods/store.injectable"; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/replicasets-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/replicasets-workload.injectable.ts index f8cc629ce0..5dd9ef4375 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/replicasets-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/replicasets-workload.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import replicasetsStoreInjectable from "../../../+workloads-replicasets/store.injectable"; import { computed } from "mobx"; diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts index d32736efc3..b1606ab817 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable"; -import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; import statefulsetsStoreInjectable from "../../../+workloads-statefulsets/store.injectable"; import { computed } from "mobx"; diff --git a/src/renderer/components/+workloads-pods/store.injectable.ts b/src/renderer/components/+workloads-pods/store.injectable.ts index d6fb50968d..0124eafbde 100644 --- a/src/renderer/components/+workloads-pods/store.injectable.ts +++ b/src/renderer/components/+workloads-pods/store.injectable.ts @@ -8,6 +8,7 @@ import podApiInjectable from "../../../common/k8s-api/endpoints/pod.api.injectab import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; import { PodStore } from "./store"; +import podMetricsApiInjectable from "../../../common/k8s-api/endpoints/pod-metrics.api.injectable"; const podStoreInjectable = getInjectable({ id: "pod-store", @@ -16,7 +17,9 @@ const podStoreInjectable = getInjectable({ const api = di.inject(podApiInjectable); const apiManager = di.inject(apiManagerInjectable); - const store = new PodStore(api); + const store = new PodStore({ + podMetricsApi: di.inject(podMetricsApiInjectable), + }, api); apiManager.registerStore(store); diff --git a/src/renderer/components/+workloads-pods/store.ts b/src/renderer/components/+workloads-pods/store.ts index 6552e7ff5f..acff1edbce 100644 --- a/src/renderer/components/+workloads-pods/store.ts +++ b/src/renderer/components/+workloads-pods/store.ts @@ -5,18 +5,30 @@ import countBy from "lodash/countBy"; import { observable } from "mobx"; +import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object.store"; import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import { cpuUnitsToNumber, unitsToBytes } from "../../utils"; -import type { Pod, PodMetrics, PodApi } from "../../../common/k8s-api/endpoints"; -import { podMetricsApi } from "../../../common/k8s-api/endpoints"; +import type { Pod, PodMetrics, PodApi, PodMetricsApi } from "../../../common/k8s-api/endpoints"; import type { KubeObject, KubeObjectScope } from "../../../common/k8s-api/kube-object"; +export interface PodStoreDependencies { + readonly podMetricsApi: PodMetricsApi; +} + export class PodStore extends KubeObjectStore { + constructor( + protected readonly dependencies: PodStoreDependencies, + api: PodApi, + opts?: KubeObjectStoreOptions, + ) { + super(api, opts); + } + readonly kubeMetrics = observable.array([]); async loadKubeMetrics(namespace?: string) { try { - const metrics = await podMetricsApi.list({ namespace }); + const metrics = await this.dependencies.podMetricsApi.list({ namespace }); this.kubeMetrics.replace(metrics ?? []); } catch (error) { diff --git a/src/renderer/components/dock/logs/call-for-logs.injectable.ts b/src/renderer/components/dock/logs/call-for-logs.injectable.ts index 0389cff0c1..74a85ade3b 100644 --- a/src/renderer/components/dock/logs/call-for-logs.injectable.ts +++ b/src/renderer/components/dock/logs/call-for-logs.injectable.ts @@ -3,11 +3,19 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { podApi } from "../../../../common/k8s-api/endpoints"; +import type { PodLogsQuery } from "../../../../common/k8s-api/endpoints"; +import podApiInjectable from "../../../../common/k8s-api/endpoints/pod.api.injectable"; +import type { ResourceDescriptor } from "../../../../common/k8s-api/kube-api"; + +export type CallForLogs = (params: ResourceDescriptor, query?: PodLogsQuery) => Promise; const callForLogsInjectable = getInjectable({ id: "call-for-logs", - instantiate: () => podApi.getLogs, + instantiate: (di): CallForLogs => { + const api = di.inject(podApiInjectable); + + return (params, query) => api.getLogs(params, query); + }, }); export default callForLogsInjectable; diff --git a/src/renderer/components/dock/logs/store.ts b/src/renderer/components/dock/logs/store.ts index 60d7ef992f..3f13fe8f62 100644 --- a/src/renderer/components/dock/logs/store.ts +++ b/src/renderer/components/dock/logs/store.ts @@ -5,11 +5,12 @@ import type { IComputedValue } from "mobx"; import { observable } from "mobx"; -import type { IPodLogsQuery, Pod } from "../../../../common/k8s-api/endpoints"; +import type { PodLogsQuery, Pod } from "../../../../common/k8s-api/endpoints"; import { waitUntilDefinied } from "../../../../common/utils/wait"; import type { IntervalFn } from "../../../utils"; import { getOrInsertWith, interval } from "../../../utils"; import type { TabId } from "../dock/store"; +import type { CallForLogs } from "./call-for-logs.injectable"; import type { LogTabData } from "./tab-store"; type PodLogLine = string; @@ -17,7 +18,7 @@ type PodLogLine = string; const logLinesToLoad = 500; interface Dependencies { - callForLogs: ({ namespace, name }: { namespace: string; name: string }, query: IPodLogsQuery) => Promise; + callForLogs: CallForLogs; } export class LogStore { @@ -109,7 +110,7 @@ export class LogStore { * @param params request parameters described in IPodLogsQuery interface * @returns A fetch request promise */ - private async loadLogs(computedPod: IComputedValue, logTabData: IComputedValue, params: Partial): Promise { + private async loadLogs(computedPod: IComputedValue, logTabData: IComputedValue, params: Partial): Promise { const { pod, tabData: { diff --git a/src/renderer/components/item-object-list/list-layout.tsx b/src/renderer/components/item-object-list/list-layout.tsx index 6f68637938..723f1188bd 100644 --- a/src/renderer/components/item-object-list/list-layout.tsx +++ b/src/renderer/components/item-object-list/list-layout.tsx @@ -17,8 +17,8 @@ import type { ItemObject } from "../../../common/item.store"; import type { SearchInputUrlProps } from "../input"; import { FilterType, pageFilters } from "./page-filters.store"; import { PageFiltersList } from "./page-filters-list"; -import type { NamespaceStore } from "../+namespaces/namespace-store/namespace.store"; -import namespaceStoreInjectable from "../+namespaces/namespace-store/namespace-store.injectable"; +import type { NamespaceStore } from "../+namespaces/store"; +import namespaceStoreInjectable from "../+namespaces/store.injectable"; import { withInjectables } from "@ogre-tools/injectable-react"; import itemListLayoutStorageInjectable from "./storage.injectable"; import { ItemListLayoutContent } from "./content"; diff --git a/src/renderer/frames/cluster-frame/cluster-frame.tsx b/src/renderer/frames/cluster-frame/cluster-frame.tsx index 2a8862261a..e5fdc68512 100755 --- a/src/renderer/frames/cluster-frame/cluster-frame.tsx +++ b/src/renderer/frames/cluster-frame/cluster-frame.tsx @@ -22,9 +22,9 @@ import { Dock } from "../../components/dock"; import { watchHistoryState } from "../../remote-helpers/history-updater"; import { PortForwardDialog } from "../../port-forward"; import { DeleteClusterDialog } from "../../components/delete-cluster-dialog"; -import type { NamespaceStore } from "../../components/+namespaces/namespace-store/namespace.store"; +import type { NamespaceStore } from "../../components/+namespaces/store"; import { withInjectables } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "../../components/+namespaces/namespace-store/namespace-store.injectable"; +import namespaceStoreInjectable from "../../components/+namespaces/store.injectable"; import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api"; import { disposer } from "../../utils"; import currentRouteComponentInjectable from "../../routes/current-route-component.injectable";