diff --git a/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts index 28ecff01b1..68d830ee69 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts @@ -18,6 +18,14 @@ const podDisruptionBudgetApiInjectable = getInjectable({ return new PodDisruptionBudgetApi({ logger: di.inject(loggerInjectable), maybeKubeApi: di.inject(maybeKubeApiInjectable), + }, { + checkPreferredVersion: true, + allowedUsableVersions: { + policy: [ + "v1", + "v1beta1", + ], + }, }); }, diff --git a/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts b/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts index 0010bbb642..e94de01abd 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts @@ -7,20 +7,45 @@ import type { LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions, KubeApiDependencies } from "../kube-api"; import { KubeApi } from "../kube-api"; +import type { Condition } from "./types/condition"; -export interface PodDisruptionBudgetSpec { +export interface V1Beta1PodDisruptionBudgetSpec { minAvailable: string; maxUnavailable: string; selector: LabelSelector; } -export interface PodDisruptionBudgetStatus { +export interface V1PodDisruptionBudgetSpec { + maxUnavailable?: string | number; + minAvailable?: string | number; + selector?: LabelSelector; +} + +export type PodDisruptionBudgetSpec = + | V1Beta1PodDisruptionBudgetSpec + | V1PodDisruptionBudgetSpec; + +export interface V1Beta1PodDisruptionBudgetStatus { currentHealthy: number; desiredHealthy: number; disruptionsAllowed: number; expectedPods: number; } +export interface V1PodDisruptionBudgetStatus { + conditions?: Condition[]; + currentHealthy: number; + desiredHealthy: number; + disruptedPods?: Partial>; + disruptionsAllowed: number; + expectedPods: number; + observedGeneration?: number; +} + +export type PodDisruptionBudgetStatus = + | V1Beta1PodDisruptionBudgetStatus + | V1PodDisruptionBudgetStatus; + export class PodDisruptionBudget extends KubeObject< NamespaceScopedMetadata, PodDisruptionBudgetStatus, @@ -31,7 +56,7 @@ export class PodDisruptionBudget extends KubeObject< static readonly apiBase = "/apis/policy/v1beta1/poddisruptionbudgets"; getSelectors() { - return KubeObject.stringifyLabels(this.spec.selector.matchLabels); + return KubeObject.stringifyLabels(this.spec.selector?.matchLabels); } getMinAvailable() { diff --git a/packages/core/src/common/k8s-api/endpoints/types/condition.ts b/packages/core/src/common/k8s-api/endpoints/types/condition.ts new file mode 100644 index 0000000000..81bf191194 --- /dev/null +++ b/packages/core/src/common/k8s-api/endpoints/types/condition.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +export interface Condition { + lastTransitionTime: string; + message: string; + observedGeneration?: number; + reason: string; + status: string; + type: string; +} diff --git a/packages/core/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx b/packages/core/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx index a6b6e48342..1ce45e42d0 100644 --- a/packages/core/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx +++ b/packages/core/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx @@ -10,70 +10,44 @@ import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import { Badge } from "../badge"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import { PodDisruptionBudget } from "../../../common/k8s-api/endpoints"; -import type { Logger } from "../../../common/logger"; -import { withInjectables } from "@ogre-tools/injectable-react"; -import loggerInjectable from "../../../common/logger.injectable"; +import type { PodDisruptionBudget } from "../../../common/k8s-api/endpoints"; export interface PodDisruptionBudgetDetailsProps extends KubeObjectDetailsProps { } -interface Dependencies { - logger: Logger; -} +export const PodDisruptionBudgetDetails = observer((props: PodDisruptionBudgetDetailsProps) => { + const { object: pdb } = props; -@observer -class NonInjectedPodDisruptionBudgetDetails extends React.Component { - - render() { - const { object: pdb } = this.props; - - if (!pdb) { - return null; - } - - if (!(pdb instanceof PodDisruptionBudget)) { - this.props.logger.error("[PodDisruptionBudgetDetails]: passed object that is not an instanceof PodDisruptionBudget", pdb); - - return null; - } - - const selectors = pdb.getSelectors(); - - return ( -
- {selectors.length > 0 && ( - - { - selectors.map(label => ) - } - - )} - - - {pdb.getMinAvailable()} - - - - {pdb.getMaxUnavailable()} - - - - {pdb.getCurrentHealthy()} - - - - {pdb.getDesiredHealthy()} - - -
- ); + if (!pdb) { + return null; } -} -export const PodDisruptionBudgetDetails = withInjectables(NonInjectedPodDisruptionBudgetDetails, { - getProps: (di, props) => ({ - ...props, - logger: di.inject(loggerInjectable), - }), + const selectors = pdb.getSelectors(); + + return ( +
+ {selectors.length > 0 && ( + + {selectors.map(label => )} + + )} + + + {pdb.getMinAvailable()} + + + + {pdb.getMaxUnavailable()} + + + + {pdb.getCurrentHealthy()} + + + + {pdb.getDesiredHealthy()} + + +
+ ); }); diff --git a/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/implementations/pod-disruption-budget-detail-item.injectable.ts b/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/implementations/pod-disruption-budget-detail-item.injectable.ts index c35e2f6d15..c6d9435f4b 100644 --- a/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/implementations/pod-disruption-budget-detail-item.injectable.ts +++ b/packages/core/src/renderer/components/kube-object-details/kube-object-detail-items/implementations/pod-disruption-budget-detail-item.injectable.ts @@ -6,8 +6,8 @@ import { getInjectable } from "@ogre-tools/injectable"; import { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token"; import { computed } from "mobx"; import { PodDisruptionBudgetDetails } from "../../../+config-pod-disruption-budgets"; -import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version"; import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable"; +import { PodDisruptionBudget } from "../../../../../common/k8s-api/endpoints"; const podDisruptionBudgetDetailItemInjectable = getInjectable({ id: "pod-disruption-budget-detail-item", @@ -17,7 +17,7 @@ const podDisruptionBudgetDetailItemInjectable = getInjectable({ return { Component: PodDisruptionBudgetDetails, - enabled: computed(() => isPodDisruptionBudget(kubeObject.value.get()?.object)), + enabled: computed(() => kubeObject.value.get()?.object instanceof PodDisruptionBudget), orderNumber: 10, }; }, @@ -25,9 +25,4 @@ const podDisruptionBudgetDetailItemInjectable = getInjectable({ injectionToken: kubeObjectDetailItemInjectionToken, }); -const isPodDisruptionBudget = kubeObjectMatchesToKindAndApiVersion( - "PodDisruptionBudget", - ["policy/v1beta1"], -); - export default podDisruptionBudgetDetailItemInjectable;