import * as React from 'react'; import type { Application, IServerGroup } from '@spinnaker/core'; import { CloudProviderRegistry, ConfirmationModalService, HoverablePopover, ReactModal, robotToHuman, TaskExecutor, } from '@spinnaker/core'; import type { ITargetTrackingPolicy } from '../../../../domain'; import './TargetTrackingSummary.less'; export interface ITargetTrackingPolicySummaryProps { application: Application; policy: ITargetTrackingPolicy; serverGroup: IServerGroup; } interface IDeletePolicyJob { type: string; cloudProvider: string; credentials: string; region: string; policyName?: string; scalingPolicyID?: string; serverGroupName: string; } export const TargetTrackingSummary = ({ application, policy, serverGroup }: ITargetTrackingPolicySummaryProps) => { const provider = serverGroup.type || serverGroup.cloudProvider || 'aws'; const providerConfig = CloudProviderRegistry.getValue(provider, 'serverGroup'); const policyTitle = provider === 'aws' ? policy.policyName : policy.id; const UpsertModalComponent = providerConfig.UpsertTargetTrackingModal; const PopoverContent = providerConfig.TargetTrackingChart; const editPolicy = () => { const upsertProps = { app: application, policy, serverGroup, }; const modalProps = { dialogClassName: 'wizard-modal modal-lg' }; ReactModal.show(UpsertModalComponent, upsertProps, modalProps); }; const deletePolicy = () => { const taskMonitor = { application, title: `Deleting scaling policy ${policyTitle}`, }; const jobToSubmit: IDeletePolicyJob = { type: 'deleteScalingPolicy', cloudProvider: provider, credentials: serverGroup.account, region: serverGroup.region, scalingPolicyID: policy.id, serverGroupName: serverGroup.name, }; if (provider === 'aws') { delete jobToSubmit.scalingPolicyID; jobToSubmit.policyName = policy.policyName; } ConfirmationModalService.confirm({ header: `Really delete ${policyTitle}?`, buttonText: 'Delete scaling policy', account: serverGroup.account, taskMonitorConfig: taskMonitor, submitMethod: () => TaskExecutor.executeTask({ application, description: `Delete scaling policy ${policyTitle}`, job: [jobToSubmit], }), }); }; const config = policy.targetTrackingConfiguration; return (
} placement="left" title={policyTitle} >
{robotToHuman(policy.policyType).toUpperCase()}
Target {config.predefinedMetricSpecification?.predefinedMetricType || config.customizedMetricSpecification?.metricName} {Boolean(config.customizedMetricSpecification?.statistic) && {` @ ${config.targetValue}`}}
); };