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 } /> > ); };
{`There was an error loading scaling activities for ${serverGroup.name}. Please try again later.`}
{`No scaling activities found for ${serverGroup.name}.`}
{a.statusCode} {timestamp(a.startTime)}
{a.cause}
Summary of activities: