import React from 'react'; import { Modal } from 'react-bootstrap'; import type { Application, IJob, IModalComponentProps } from '@spinnaker/core'; import { confirmNotManaged, HelpField, ModalClose, ReactModal, TaskExecutor, TaskMonitor, TaskMonitorWrapper, TaskReason, } from '@spinnaker/core'; import { WarmPoolService } from './WarmPoolService'; import { AwsModalFooter } from '../../../common/AwsModalFooter'; import type { IAmazonServerGroup } from '../../../domain'; export interface IModifyWarmPoolModalProps extends IModalComponentProps { application: Application; serverGroup: IAmazonServerGroup; } interface IModifyWarmPoolModalState { enabled: boolean; minSize: number; maxGroupPreparedCapacity: number; poolState: string; reuseOnScaleIn: boolean; reason?: string; taskMonitor: TaskMonitor; } export function buildWarmPoolJob(state: IModifyWarmPoolModalState, serverGroup: IAmazonServerGroup): IJob { const base = { asgName: serverGroup.name, regions: [serverGroup.region], credentials: serverGroup.account, cloudProvider: 'aws', reason: state.reason, }; if (!state.enabled) { return { ...base, type: 'modifyWarmPool', action: 'delete' }; } return { ...base, type: 'modifyWarmPool', action: 'upsert', minSize: state.minSize, maxGroupPreparedCapacity: state.maxGroupPreparedCapacity, poolState: state.poolState, reuseOnScaleIn: state.reuseOnScaleIn, }; } export class ModifyWarmPoolModal extends React.Component { public static show(props: IModifyWarmPoolModalProps) { return confirmNotManaged(props.serverGroup, props.application).then( (notManaged) => notManaged && ReactModal.show(ModifyWarmPoolModal, props), ); } private initialConfiguration = WarmPoolService.getWarmPoolConfiguration(this.props.serverGroup); public state: IModifyWarmPoolModalState = { enabled: !!this.initialConfiguration, minSize: this.initialConfiguration?.minSize ?? 0, maxGroupPreparedCapacity: this.initialConfiguration?.maxGroupPreparedCapacity ?? -1, poolState: this.initialConfiguration?.poolState ?? 'Stopped', reuseOnScaleIn: this.initialConfiguration?.instanceReusePolicy?.reuseOnScaleIn ?? false, taskMonitor: new TaskMonitor({ application: this.props.application, title: `Update Warm Pool for ${this.props.serverGroup.name}`, onDismiss: this.props.dismissModal, onTaskComplete: () => this.props.application.serverGroups.refresh(), }), }; private submit = () => { const { application, serverGroup } = this.props; const job = buildWarmPoolJob(this.state, serverGroup); this.state.taskMonitor.submit(() => TaskExecutor.executeTask({ application, description: `Update Warm Pool for ${serverGroup.name}`, job: [job], }), ); }; public render() { const { dismissModal, serverGroup } = this.props; const { enabled, minSize, maxGroupPreparedCapacity, poolState, reuseOnScaleIn } = this.state; return ( <> Modify Warm Pool for {serverGroup.name}
{enabled && ( <>
this.setState({ minSize: Number(event.target.value) })} />
this.setState({ maxGroupPreparedCapacity: Number(event.target.value) })} />
)} this.setState({ reason })} />
); } }