import { Form } from 'formik'; import { orderBy } from 'lodash'; import React, { useState } from 'react'; import { Button, Modal } from 'react-bootstrap'; import type { Option } from 'react-select'; import type { Application, IModalComponentProps, IModalProps, IServerGroupManager } from '@spinnaker/core'; import { ManifestWriter, ModalClose, NameUtils, ReactSelectInput, robotToHuman, SpinFormik, SubmitButton, TaskMonitorWrapper, TaskReason, UserVerification, useTaskMonitor, } from '@spinnaker/core'; import type { IAnyKubernetesResource } from '../../interfaces'; import type { IRolloutRevision } from './undo.controller'; export interface IKubernetesUndoRolloutModalProps extends Pick, Pick { application: Application; resource: IAnyKubernetesResource; } export interface IKubernetesUndoRolloutValues { revision?: number; reason?: string; } const fetchRevisions = (serverGroupManager: IServerGroupManager): IRolloutRevision[] => { const [, ...rest] = orderBy(serverGroupManager.serverGroups, ['moniker.sequence'], ['desc']); return rest.map((serverGroup, index) => ({ label: `${NameUtils.getSequence(serverGroup.moniker.sequence)}${index > 0 ? '' : ' - previous revision'}`, revision: serverGroup.moniker.sequence, })); }; export function UndoRolloutModal({ application, resource, isOpen, dismissModal }: IKubernetesUndoRolloutModalProps) { const initialValues: IKubernetesUndoRolloutValues = {}; const revisions = fetchRevisions(resource as IServerGroupManager); const [verified, setVerified] = useState(false); const taskMonitor = useTaskMonitor( { application, title: `Undo rollout of ${resource.name} in ${resource.namespace}`, onTaskComplete: () => application.serverGroups.refresh(true), }, dismissModal, ); const submit = (values: IKubernetesUndoRolloutValues): void => { const payload = { cloudProvider: 'kubernetes', manifestName: resource.name, location: resource.namespace, account: resource.account, reason: values.reason, revision: values.revision, }; return taskMonitor.submit(() => ManifestWriter.undoRolloutManifest(payload, application)); }; return ( initialValues={initialValues} onSubmit={submit} render={(formik) => ( <> Undo rollout of {robotToHuman(resource.name)} in {resource.namespace}
clearable={false} value={formik.values.revision} options={revisions.map((revision) => ({ label: revision.label, value: revision.revision, }))} onChange={(option: Option) => { formik.setFieldValue('revision', option.target.value); }} />
formik.setFieldValue('reason', val)} />
submit(formik.values)} isDisabled={!formik.isValid || formik.isSubmitting || !verified} isFormSubmit={true} submitting={formik.isSubmitting} label={`Undo rollout of ${resource.name}`} /> )} />
); }