in src/AWS.Deploy.CLI/CloudFormation/StackEventMonitor.cs [75:136]
private async Task ReadNewEventsAsync()
{
var stackEvents = new List<StackEvent>();
var describeStackEventsRequest = new DescribeStackEventsRequest { StackName = _stackName };
var listStacksPaginator = _cloudFormationClient.Paginators.DescribeStackEvents(describeStackEventsRequest);
try
{
var breakPaginator = false;
await foreach (var response in listStacksPaginator.Responses)
{
foreach (var stackEvent in response?.StackEvents ?? new List<StackEvent>())
{
// Event from before we are interested in
if (stackEvent.Timestamp < _startTime)
{
breakPaginator = true;
break;
}
// Already processed event
if (_processedEventIds.Contains(stackEvent.EventId))
{
breakPaginator = true;
break;
}
// New event, save it
_processedEventIds.Add(stackEvent.EventId);
stackEvents.Add(stackEvent);
}
if (breakPaginator)
{
break;
}
}
}
catch (AmazonCloudFormationException exception) when (exception.ErrorCode.Equals("ValidationError") && exception.Message.Equals($"Stack [{_stackName}] does not exist"))
{
// Stack is deleted, there could be some missed events between the last poll timestamp and DELETE_COMPLETE
_interactiveService.WriteDebugLine(exception.PrettyPrint());
}
catch (AmazonCloudFormationException exception)
{
// Other AmazonCloudFormationException
_interactiveService.WriteDebugLine(exception.PrettyPrint());
}
foreach (var stackEvent in stackEvents.OrderBy(e => e.Timestamp))
{
var row = new[]
{
(stackEvent.Timestamp.ToString(CultureInfo.InvariantCulture), TIMESTAMP_WIDTH),
(stackEvent.ResourceStatus.ToString(), RESOURCE_STATUS_WIDTH),
(stackEvent.ResourceType.Truncate(RESOURCE_TYPE_WIDTH, true), RESOURCE_TYPE_WIDTH),
(stackEvent.LogicalResourceId, LOGICAL_RESOURCE_WIDTH),
};
_consoleUtilities.DisplayRow(row);
}
}