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

Java tutorial

Introduction

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

Source

/*
 *
 * InstanceUtils.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.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.DescribeInstanceStatusRequest;
import com.amazonaws.services.ec2.model.DescribeInstanceStatusResult;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStatus;
import com.amazonaws.services.ec2.model.Placement;
import com.amazonaws.services.ec2.model.RunInstancesRequest;
import com.amazonaws.services.ec2.model.RunInstancesResult;

import com.google.common.base.Optional;

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

public class InstanceUtils {
    private static Logger log = LoggerFactory.getLogger(InstanceUtils.class);

    public static Optional<Instance> onDemandInstance(AmazonEC2 ec2Client, Optional<Image> image, Integer minCount,
            Integer maxCount, SecurityGroupInformation securityGroupInformation,
            KeyPairInformation keyPairInformation, Optional<String> instanceType, Optional<String> availabilityZone,
            Long sleep) {
        if (!image.isPresent()) {
            return Optional.absent();
        }

        RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId(image.get().getImageId())
                .withMinCount(minCount).withMaxCount(maxCount)
                .withSecurityGroups(securityGroupInformation.getGroupName())
                .withKeyName(keyPairInformation.getName());

        log.info("ImageId=" + image.get().getImageId());
        log.info("MinCount=" + minCount);
        log.info("MaxCount=" + maxCount);
        log.info("SecurityGroups.1=" + securityGroupInformation.getGroupName());
        log.info("KeyName=" + keyPairInformation.getName());

        if (instanceType.isPresent()) {
            runInstancesRequest.setInstanceType(instanceType.get());
            log.info("InstanceType=" + instanceType.get());
        }

        if (availabilityZone.isPresent()) {
            runInstancesRequest.setPlacement(new Placement().withAvailabilityZone(availabilityZone.get()));

            log.info("Placement.AvailabilityZone=" + availabilityZone.get());
        }

        RunInstancesResult runInstancesResult = ec2Client.runInstances(runInstancesRequest);

        DescribeInstanceStatusRequest describeInstanceStatusRequest = new DescribeInstanceStatusRequest()
                .withInstanceIds(runInstancesResult.getReservation().getInstances().get(0).getInstanceId());

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

                DescribeInstanceStatusResult describeInstanceStatusResult = ec2Client
                        .describeInstanceStatus(describeInstanceStatusRequest);
                if (describeInstanceStatusResult.getInstanceStatuses().isEmpty()) {
                    continue;
                }
                InstanceStatus instance = describeInstanceStatusResult.getInstanceStatuses().get(0);

                String instanceState = instance.getInstanceState().getName();

                log.info("instanceState = " + instanceState);

                if ("pending".equals(instanceState)) {
                    continue;
                }

                if (!"running".equals(instanceState)) {
                    return Optional.absent();
                }

                String instanceStatus = instance.getInstanceStatus().getStatus();
                String systemStatus = instance.getSystemStatus().getStatus();

                log.info("instanceStatus = " + instanceStatus);
                log.info("systemStatus = " + systemStatus);

                if ("impaired".equals(instanceStatus)) {
                    return Optional.absent();
                }

                if ("impaired".equals(systemStatus)) {
                    return Optional.absent();
                }

                if (!"ok".equals(instanceStatus)) {
                    continue;
                }

                if (!"ok".equals(systemStatus)) {
                    continue;
                }

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

        DescribeInstancesResult describeInstancesResult = ec2Client.describeInstances(new DescribeInstancesRequest()
                .withInstanceIds(runInstancesResult.getReservation().getInstances().get(0).getInstanceId()));

        return Optional.fromNullable(describeInstancesResult.getReservations().get(0).getInstances().get(0));
    }
}