diff --git a/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts b/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts index b0e733815d..8190220b07 100644 --- a/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts +++ b/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts @@ -6,7 +6,7 @@ import type { DerivedKubeApiOptions, KubeApiDependencies } from "../kube-api"; import { KubeApi } from "../kube-api"; import type { - BaseKubeObjectCondition, + BaseKubeObjectCondition, KubeObjectMetadata, KubeObjectStatus, NamespaceScopedMetadata, } from "../kube-object"; @@ -25,7 +25,7 @@ export class ReplicationControllerApi extends KubeApi { return `${this.formatUrlForNotListing(params)}/scale`; } - getScale(params: { namespace: string; name: string }) { + getScale(params: { namespace: string; name: string }): Promise { return this.request.get(this.getScaleApiUrl(params)); } @@ -37,9 +37,25 @@ export class ReplicationControllerApi extends KubeApi { replicas, }, }, + }, { + headers: { + "content-type": "application/strategic-merge-patch+json", + }, }); } +} +export interface Scale { + apiVersion: "autoscaling/v1"; + kind: "Scale"; + metadata: KubeObjectMetadata; + spec: { + replicas: number; + }; + status: { + replicas: number; + selector: string; + }; } export interface ReplicationControllerSpec { @@ -115,8 +131,8 @@ export class ReplicationController extends KubeObject< return this.status?.replicas; } - getDesiredReplicas(): number | undefined { - return this.spec?.replicas; + getDesiredReplicas(): number { + return this.spec?.replicas ?? 0; } getAvailableReplicas(): number | undefined { diff --git a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss index 5de391e4f4..5ebd954dda 100644 --- a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss +++ b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss @@ -4,4 +4,10 @@ */ .ReplicationControllerDetails { + + .desiredReplicas { + display: flex; + gap: calc(var(--margin) * 2); + align-items: center; + } } diff --git a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx index 0202cf6438..094e3d5344 100644 --- a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx +++ b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx @@ -5,6 +5,7 @@ import styles from "./replicationcontroller-details.module.scss"; import React from "react"; +import { makeObservable, observable } from "mobx"; import { observer } from "mobx-react"; import { withInjectables } from "@ogre-tools/injectable-react"; import { DrawerItem, DrawerTitle } from "../drawer"; @@ -12,17 +13,106 @@ import { Badge } from "../badge"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import type { ReplicationControllerStore } from "./replicationcontroller-store"; import replicationControllerStoreInjectable from "./replicationcontroller-store.injectable"; -import type { ReplicationController } from "../../../common/k8s-api/endpoints"; +import type { + ReplicationController, + ReplicationControllerApi, +} from "../../../common/k8s-api/endpoints"; +import replicationControllerApiInjectable + from "../../../common/k8s-api/endpoints/replication-controller.api.injectable"; +import { Button } from "../button"; +import { Input } from "../input"; +import showErrorNotificationInjectable from "../notifications/show-error-notification.injectable"; +import type { ShowNotification } from "../notifications"; +import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable"; export interface ReplicationControllerDetailsProps extends KubeObjectDetailsProps { } interface Dependencies { store: ReplicationControllerStore; + api: ReplicationControllerApi; + showNotificationError: ShowNotification; + + hideDetails(): void; } @observer -class NonInjectedReplicationControllerDetails extends React.Component { +class NonInjectedReplicationControllerDetails extends React.Component { + @observable showScaleDialog = false; + + constructor(props: Props) { + super(props); + makeObservable(this); + } + + inputRef = React.createRef(); + + scale(replicas: number) { + const { object: resource, api } = this.props; + + return api.scale({ + name: resource.getName(), + namespace: resource.getNs(), + }, replicas); + } + + renderReplicasAndScaleDialog() { + const { object: resource, showNotificationError, hideDetails } = this.props; + + if (this.showScaleDialog) { + return ( +
+ +
+ ); + } + + return ( +
+
+ {resource.getDesiredReplicas()} +
+
+ ); + } + render() { const { object: resource } = this.props; @@ -32,7 +122,7 @@ class NonInjectedReplicationControllerDetails extends React.Component - {resource.getDesiredReplicas()} + {this.renderReplicasAndScaleDialog()} { @@ -67,5 +157,8 @@ export const ReplicationControllerDetails = withInjectables ({ ...props, store: di.inject(replicationControllerStoreInjectable), + api: di.inject(replicationControllerApiInjectable), + showNotificationError: di.inject(showErrorNotificationInjectable), + hideDetails: di.inject(hideDetailsInjectable), }), });