de.taimos.pipeline.aws.cloudformation.EventPrinter.java Source code

Java tutorial

Introduction

Here is the source code for de.taimos.pipeline.aws.cloudformation.EventPrinter.java

Source

/*
 * -
 * #%L
 * Pipeline: AWS Steps
 * %%
 * Copyright (C) 2016 Taimos GmbH
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

package de.taimos.pipeline.aws.cloudformation;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

import org.apache.commons.lang.StringUtils;

import com.amazonaws.AmazonWebServiceRequest;
import com.amazonaws.services.cloudformation.AmazonCloudFormationClient;
import com.amazonaws.services.cloudformation.model.AmazonCloudFormationException;
import com.amazonaws.services.cloudformation.model.DescribeStackEventsRequest;
import com.amazonaws.services.cloudformation.model.DescribeStackEventsResult;
import com.amazonaws.services.cloudformation.model.DescribeStacksRequest;
import com.amazonaws.services.cloudformation.model.StackEvent;
import com.amazonaws.waiters.Waiter;
import com.amazonaws.waiters.WaiterHandler;
import com.amazonaws.waiters.WaiterParameters;

import hudson.model.TaskListener;

public class EventPrinter {

    private final AmazonCloudFormationClient client;
    private final TaskListener listener;

    public EventPrinter(AmazonCloudFormationClient client, TaskListener listener) {
        this.client = client;
        this.listener = listener;
    }

    public void waitAndPrintStackEvents(String stack, Waiter<DescribeStacksRequest> waiter) {
        Date startDate = new Date();

        final AtomicBoolean done = new AtomicBoolean(false);

        waiter.runAsync(new WaiterParameters<>(new DescribeStacksRequest().withStackName(stack)),
                new WaiterHandler() {
                    @Override
                    public void onWaitSuccess(AmazonWebServiceRequest request) {
                        done.set(true);
                    }

                    @Override
                    public void onWaitFailure(Exception e) {
                        done.set(true);
                    }
                });

        String lastEventId = null;
        this.printLine();
        this.printStackName(stack);
        this.printLine();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

        while (!done.get()) {
            try {
                DescribeStackEventsResult result = this.client
                        .describeStackEvents(new DescribeStackEventsRequest().withStackName(stack));
                List<StackEvent> stackEvents = new ArrayList<>();
                for (StackEvent event : result.getStackEvents()) {
                    if (event.getEventId().equals(lastEventId) || event.getTimestamp().before(startDate)) {
                        break;
                    }
                    stackEvents.add(event);
                }
                if (!stackEvents.isEmpty()) {
                    Collections.reverse(stackEvents);
                    for (StackEvent event : stackEvents) {
                        this.printEvent(sdf, event);
                        this.printLine();
                    }
                    lastEventId = stackEvents.get(stackEvents.size() - 1).getEventId();
                }
            } catch (AmazonCloudFormationException e) {
                // suppress and continue
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void printEvent(SimpleDateFormat sdf, StackEvent event) {
        String time = this.padRight(sdf.format(event.getTimestamp()), 25);
        String logicalResourceId = this.padRight(event.getLogicalResourceId(), 20);
        String resourceStatus = this.padRight(event.getResourceStatus(), 36);
        String resourceStatusReason = this.padRight(event.getResourceStatusReason(), 140);
        this.listener.getLogger().format("| %s | %s | %s | %s |%n", time, logicalResourceId, resourceStatus,
                resourceStatusReason);
    }

    private void printLine() {
        this.listener.getLogger().println(StringUtils.repeat("-", 231));
    }

    private void printStackName(String stackName) {
        this.listener.getLogger().println("| " + this.padRight("Stack: " + stackName, 227) + " |");
    }

    private String padRight(String s, int len) {
        return String.format("%1$-" + len + "s", (s != null ? s : "")).substring(0, len);
    }

}