import { forOwn, groupBy, sortBy } from 'lodash'; import * as React from 'react'; import type { IServerGroup } from '../../../domain'; import type { IModalComponentProps } from '../../../presentation'; import { ModalBody, ModalFooter, ModalHeader, useData } from '../../../presentation'; import { ServerGroupReader } from '../../serverGroupReader.service'; import { timestamp } from '../../../utils'; import { Spinner } from '../../../widgets'; import './ScalingActivitiesModal.less'; export interface IScalingEvent { description: string; availabilityZone: string; } export interface IScalingEventSummary { cause: string; events: IScalingEvent[]; startTime: number; statusCode: string; isSuccessful: boolean; } export interface IRawScalingActivity { details: string; description: string; cause: string; statusCode: string; startTime: number; } export interface IScalingActivitiesModalProps extends IModalComponentProps { serverGroup: IServerGroup; } export const groupScalingActivities = (activities: IRawScalingActivity[]): IScalingEventSummary[] => { const grouped = groupBy(activities, 'cause'); const results: IScalingEventSummary[] = []; forOwn(grouped, (group: IRawScalingActivity[]) => { if (group.length) { const events: IScalingEvent[] = []; group.forEach((entry: any) => { let availabilityZone = 'unknown'; try { availabilityZone = JSON.parse(entry.details)['Availability Zone'] || availabilityZone; } catch (e) { // I don't imagine this would happen but let's not blow up the world if it does. } events.push({ description: entry.description, availabilityZone }); }); results.push({ cause: group[0].cause, events, startTime: group[0].startTime, statusCode: group[0].statusCode, isSuccessful: group[0].statusCode === 'Successful', }); } }); return sortBy(results, 'startTime').reverse(); }; export const ScalingActivitiesModal = ({ dismissModal, serverGroup }: IScalingActivitiesModalProps) => { const fetchScalingActivities = () => ServerGroupReader.getScalingActivities(serverGroup).then((a) => groupScalingActivities(a)); const { result: scalingActivities, status, error } = useData(fetchScalingActivities, [], [serverGroup.name]); const loading = status === 'PENDING'; return ( <> {`Scaling Activities for ${serverGroup.name}`} {loading && (
)} {!loading && Boolean(error) && (

{`There was an error loading scaling activities for ${serverGroup.name}. Please try again later.`}

)} {!loading && !error && !scalingActivities.length && (

{`No scaling activities found for ${serverGroup.name}.`}

)} {!loading && !error && scalingActivities.length > 0 && (
{scalingActivities.map((a, i) => (

{a.statusCode} {timestamp(a.startTime)}

{a.cause}

Summary of activities:

    {sortBy(a.events, 'availabilityZone', 'description').map((e) => (
  • {e.description} {e.availabilityZone && {e.availabilityZone}}
  • ))}
{i !== scalingActivities.length - 1 &&
}
))}
)}
Close } /> ); };