UNPKG

@spotinst/spinnaker-deck

Version:

Spinnaker-Deck service, forked with support to Spotinst

189 lines (167 loc) 5.7 kB
import { getAllTargetGroups, IAmazonApplicationLoadBalancer, IAmazonHealth, IAmazonNetworkLoadBalancer, IAmazonTargetGroupHealth, ITargetGroup, } from '@spinnaker/amazon'; import { Action, Application, ConfirmationModalService, IInstance, IJob, InstanceWriter, ReactInjector, } from '@spinnaker/core'; export const applyTargetGroupInfoToHealthMetric = ( metricGroups: IAmazonTargetGroupHealth[], targetGroups: ITargetGroup[], account: string, ) => { return metricGroups.map((tg) => { const group = targetGroups.find( (g) => (g.name === tg.name || g.name === tg.targetGroupName) && g.account === account, ); const useTrafficPort = group?.healthCheckPort === 'traffic-port' || !group?.healthCheckPort; return { ...tg, name: group?.name, healthCheckPath: group ? `:${useTrafficPort ? group?.port : group.healthCheckPort}${group?.healthCheckPath || ''}` : undefined, healthCheckProtocol: group?.healthCheckProtocol?.toLowerCase(), }; }); }; export const extractHealthMetrics = ( health: IAmazonHealth[], loadBalancers: IAmazonApplicationLoadBalancer[] | IAmazonNetworkLoadBalancer[], account: string, ): IAmazonHealth[] => { const displayableMetrics = (health || []).filter((m) => m.state !== 'Unknown'); const allTargetGroups = getAllTargetGroups(loadBalancers); return displayableMetrics.map((metric) => { if (metric.type === 'TargetGroup') { const augmentedGroups = applyTargetGroupInfoToHealthMetric(metric.targetGroups, allTargetGroups, account); return { ...metric, targetGroups: augmentedGroups } as IAmazonHealth; } return metric; }); }; const terminateInstance = (instance: IInstance, app: Application) => { return () => { const taskMonitorConfig = { application: app, title: `Terminating ${instance.id}`, onTaskComplete: () => { if (ReactInjector.$state.includes('**.instanceDetails', { id: instance.id })) { ReactInjector.$state.go('^'); } }, }; const submitMethod = () => { const params: IJob = { cloudProvider: 'titus' }; if (instance.serverGroup) { params.serverGroupName = instance.serverGroup; } return InstanceWriter.terminateInstance(instance, app, params); }; ConfirmationModalService.confirm({ header: `Really terminate ${instance.id}?`, buttonText: `Terminate ${instance.id}`, account: instance.account, taskMonitorConfig, submitMethod, }); }; }; const terminateInstanceAndShrinkServerGroup = (instance: IInstance, app: Application) => { return () => { const taskMonitorConfig = { application: app, title: `Terminating ${instance.id} and shrinking server group`, onTaskComplete: () => { if (ReactInjector.$state.includes('**.instanceDetails', { instanceId: instance.id })) { ReactInjector.$state.go('^'); } }, }; const submitMethod = () => { return InstanceWriter.terminateInstancesAndShrinkServerGroups( [ { cloudProvider: instance.cloudProvider, instanceIds: [instance.id], account: instance.account, region: instance.region, serverGroup: instance.serverGroup, instances: [instance], }, ], app, ); }; ConfirmationModalService.confirm({ header: `Really terminate ${instance.id} and shrink ${instance.serverGroup}?`, buttonText: `Terminate ${instance.id} and shrink ${instance.serverGroup}`, account: instance.account, taskMonitorConfig, submitMethod, }); }; }; const enableInstanceInDiscovery = (instance: IInstance, app: Application) => { return () => { const taskMonitorConfig = { application: app, title: `Enabling ${instance.id} in discovery`, }; const submitMethod = () => InstanceWriter.enableInstanceInDiscovery(instance, app); ConfirmationModalService.confirm({ header: `Really enable ${instance.id} in discovery?`, buttonText: `Enable ${instance.id}`, account: instance.account, taskMonitorConfig, submitMethod, }); }; }; const disableInstanceInDiscovery = (instance: IInstance, app: Application) => { return () => { const taskMonitorConfig = { application: app, title: `Disabling ${instance.id} in discovery`, }; const submitMethod = () => InstanceWriter.disableInstanceInDiscovery(instance, app); ConfirmationModalService.confirm({ header: `Really disable ${instance.id} in discovery?`, buttonText: `Disable ${instance.id}`, account: instance.account, taskMonitorConfig, submitMethod, }); }; }; export const buildTaskActions = (instance: IInstance, app: Application): Action[] => { const taskActions = [ { label: 'Terminate', triggerAction: terminateInstance(instance, app) }, { label: 'Terminate and Shrink Server Group', triggerAction: terminateInstanceAndShrinkServerGroup(instance, app) }, ]; const discoveryHealth = (instance.health || []).filter((h) => h.type === 'Discovery'); if (discoveryHealth.length && discoveryHealth[0].state === 'OutOfService') { taskActions.push({ label: 'Enable in Discovery', triggerAction: enableInstanceInDiscovery(instance, app), }); } const hasHealthState = (discoveryHealth || []).some((h) => h.state === 'Up' || h.state === 'Down'); if (hasHealthState) { taskActions.push({ label: 'Disable in Discovery', triggerAction: disableInstanceInDiscovery(instance, app), }); } return taskActions; };