com.dowdandassociates.gentoo.bootstrap.DefaultTestSnapshotProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.dowdandassociates.gentoo.bootstrap.DefaultTestSnapshotProvider.java

Source

/*
 *
 * DefaultTestSnapshotProvider.java
 *
 *-----------------------------------------------------------------------------
 * Copyright 2013 Dowd and Associates
 *
 * 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.
 *-----------------------------------------------------------------------------
 *
 */

package com.dowdandassociates.gentoo.bootstrap;

import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.model.CreateSnapshotRequest;
import com.amazonaws.services.ec2.model.CreateSnapshotResult;
import com.amazonaws.services.ec2.model.DeleteVolumeRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.DescribeSnapshotsRequest;
import com.amazonaws.services.ec2.model.DescribeSnapshotsResult;
import com.amazonaws.services.ec2.model.DescribeVolumesRequest;
import com.amazonaws.services.ec2.model.DescribeVolumesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Snapshot;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
import com.amazonaws.services.ec2.model.TerminateInstancesResult;
import com.amazonaws.services.ec2.model.Volume;

import com.google.common.base.Optional;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;

import com.google.inject.Inject;
import com.google.inject.Provider;

import com.netflix.governator.annotations.Configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DefaultTestSnapshotProvider implements Provider<Optional<Snapshot>> {
    private static Logger log = LoggerFactory.getLogger(DefaultTestSnapshotProvider.class);

    @Configuration("com.dowdandassociates.gentoo.bootstrap.TestSnapshot.checkInstanceSleep")
    private Supplier<Long> instanceSleep = Suppliers.ofInstance(10000L);

    @Configuration("com.dowdandassociates.gentoo.bootstrap.TestSnapshot.checkVolumeSleep")
    private Supplier<Long> volumeSleep = Suppliers.ofInstance(10000L);

    @Configuration("com.dowdandassociates.gentoo.bootstrap.TestSnapshot.checkSnapshotSleep")
    private Supplier<Long> snapshotSleep = Suppliers.ofInstance(10000L);

    private AmazonEC2 ec2Client;
    private BootstrapResultInformation bootstrapResultInformation;

    @Inject
    public DefaultTestSnapshotProvider(AmazonEC2 ec2Client, BootstrapResultInformation bootstrapResultInformation) {
        this.ec2Client = ec2Client;
        this.bootstrapResultInformation = bootstrapResultInformation;
    }

    public Optional<Snapshot> get() {
        BootstrapInstanceInformation instanceInfo = bootstrapResultInformation.getInstanceInfo();
        Optional<Instance> instance = instanceInfo.getInstance();
        Optional<Volume> volume = instanceInfo.getVolume();
        Optional<Integer> exitStatus = bootstrapResultInformation.getExitStatus();

        if (!instance.isPresent()) {
            log.info("Instance is absent");
            return Optional.absent();
        }

        String instanceId = instance.get().getInstanceId();

        TerminateInstancesResult terminateInstancesResult = ec2Client
                .terminateInstances(new TerminateInstancesRequest().withInstanceIds(instanceId));

        if (!volume.isPresent()) {
            log.info("Volume is absent");
            return Optional.absent();
        }

        String volumeId = volume.get().getVolumeId();

        DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
                .withInstanceIds(instanceId);

        DescribeVolumesRequest describeVolumesRequest = new DescribeVolumesRequest().withVolumeIds(volumeId);
        try {
            while (true) {
                log.info("Sleeping for " + instanceSleep.get() + " ms");
                Thread.sleep(instanceSleep.get());
                DescribeInstancesResult describeInstancesResult = ec2Client
                        .describeInstances(describeInstancesRequest);
                String state = describeInstancesResult.getReservations().get(0).getInstances().get(0).getState()
                        .getName();
                log.info("Instance State = " + state);
                if ("terminated".equals(state)) {
                    break;
                }
            }

            CreateSnapshotResult createSnapshotResult = ec2Client
                    .createSnapshot(new CreateSnapshotRequest().withVolumeId(volumeId));

            log.info("SnapshotId = " + createSnapshotResult.getSnapshot().getSnapshotId());

            DescribeSnapshotsRequest describeSnapshotsRequest = new DescribeSnapshotsRequest()
                    .withSnapshotIds(createSnapshotResult.getSnapshot().getSnapshotId());

            Snapshot snapshot;

            while (true) {
                log.info("Sleeping for " + snapshotSleep.get() + " ms");
                Thread.sleep(snapshotSleep.get());

                DescribeSnapshotsResult describeSnapshotsResult = ec2Client
                        .describeSnapshots(describeSnapshotsRequest);
                String state = describeSnapshotsResult.getSnapshots().get(0).getState();
                log.info("Snapshot State = " + state);
                if ("error".equals(state)) {
                    return Optional.absent();
                }
                if ("completed".equals(state)) {
                    snapshot = describeSnapshotsResult.getSnapshots().get(0);
                    break;
                }
            }

            ec2Client.deleteVolume(new DeleteVolumeRequest().withVolumeId(volumeId));

            if (!exitStatus.isPresent()) {
                log.info("Exit status is not present");
                return Optional.absent();
            }

            log.info("exit status = " + exitStatus.get());

            if (0 != exitStatus.get()) {
                return Optional.absent();
            }

            return Optional.fromNullable(snapshot);
        } catch (InterruptedException e) {
            return Optional.absent();
        }
    }
}