jp.primecloud.auto.process.aws.AwsCommonProcess.java Source code

Java tutorial

Introduction

Here is the source code for jp.primecloud.auto.process.aws.AwsCommonProcess.java

Source

/*
 * Copyright 2016 by PrimeCloud Controller/OSS Community.
 * 
 * This file is part of PrimeCloud Controller(TM).
 * 
 * PrimeCloud Controller(TM) is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 * 
 * PrimeCloud Controller(TM) is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>.
 */
package jp.primecloud.auto.process.aws;

import java.util.List;

import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;

import com.amazonaws.services.ec2.model.Address;
import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.DescribeAddressesRequest;
import com.amazonaws.services.ec2.model.DescribeAddressesResult;
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesRequest;
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult;
import com.amazonaws.services.ec2.model.DescribeImagesRequest;
import com.amazonaws.services.ec2.model.DescribeImagesResult;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest;
import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult;
import com.amazonaws.services.ec2.model.DescribeSubnetsRequest;
import com.amazonaws.services.ec2.model.DescribeSubnetsResult;
import com.amazonaws.services.ec2.model.DescribeVolumesRequest;
import com.amazonaws.services.ec2.model.DescribeVolumesResult;
import com.amazonaws.services.ec2.model.Filter;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceStateName;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.SecurityGroup;
import com.amazonaws.services.ec2.model.Subnet;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.Volume;
import com.amazonaws.services.ec2.model.VolumeState;
import com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancersRequest;
import com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancersResult;
import com.amazonaws.services.elasticloadbalancing.model.LoadBalancerDescription;

/**
 * <p>
 * TODO: 
 * </p>
 * 
 */
public class AwsCommonProcess extends ServiceSupport {

    public Instance waitInstance(AwsProcessClient awsProcessClient, String instanceId) {
        // ???
        Instance instance;
        while (true) {
            try {
                Thread.sleep(1000L * awsProcessClient.getDescribeInterval());
            } catch (InterruptedException ignore) {
            }

            instance = describeInstance(awsProcessClient, instanceId);
            InstanceStateName state;
            try {
                state = InstanceStateName.fromValue(instance.getState().getName());
            } catch (IllegalArgumentException e) {
                // ???
                AutoException exception = new AutoException("EPROCESS-000104", instanceId,
                        instance.getState().getName());
                exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(instance));
                throw exception;
            }

            // ?????
            if (state == InstanceStateName.Running || state == InstanceStateName.Terminated
                    || state == InstanceStateName.Stopped) {
                break;
            }
        }

        return instance;
    }

    public Instance describeInstance(AwsProcessClient awsProcessClient, String instanceId) {
        // ???
        DescribeInstancesRequest request = new DescribeInstancesRequest();
        request.withInstanceIds(instanceId);
        DescribeInstancesResult result = awsProcessClient.getEc2Client().describeInstances(request);
        List<Reservation> reservations = result.getReservations();

        // API??
        if (reservations.size() == 0) {
            // ?????
            throw new AutoException("EPROCESS-000101", instanceId);

        } else if (reservations.size() > 1) {
            // ??????
            AutoException exception = new AutoException("EPROCESS-000102", instanceId);
            exception.addDetailInfo("result=" + reservations);
            throw exception;
        }

        List<com.amazonaws.services.ec2.model.Instance> instances = reservations.get(0).getInstances();

        if (instances.size() == 0) {
            // ?????
            throw new AutoException("EPROCESS-000101", instanceId);

        } else if (instances.size() > 1) {
            // ??????
            AutoException exception = new AutoException("EPROCESS-000103", instanceId);
            exception.addDetailInfo("result=" + instances);
            throw exception;
        }

        return instances.get(0);
    }

    public Volume waitVolume(AwsProcessClient awsProcessClient, String volumeId) {
        // ???
        Volume volume;
        while (true) {
            try {
                Thread.sleep(1000L * awsProcessClient.getDescribeInterval());
            } catch (InterruptedException ignore) {
            }

            volume = describeVolume(awsProcessClient, volumeId);
            VolumeState state;
            try {
                state = VolumeState.fromValue(volume.getState());
            } catch (IllegalArgumentException e) {
                // ???
                AutoException exception = new AutoException("EPROCESS-000112", volume, volume.getState());
                exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume));
                throw exception;
            }

            // ?????
            if (state == VolumeState.Available || state == VolumeState.InUse || state == VolumeState.Deleted
                    || state == VolumeState.Error) {
                break;
            }
        }

        return volume;
    }

    public Volume describeVolume(AwsProcessClient awsProcessClient, String volumeId) {
        // ???
        DescribeVolumesRequest request = new DescribeVolumesRequest();
        request.withVolumeIds(volumeId);
        DescribeVolumesResult result = awsProcessClient.getEc2Client().describeVolumes(request);
        List<Volume> volumes = result.getVolumes();

        // API??
        if (volumes.size() == 0) {
            // ?????
            throw new AutoException("EPROCESS-000110", volumeId);

        } else if (volumes.size() > 1) {
            // ??????
            AutoException exception = new AutoException("EPROCESS-000111", volumeId);
            exception.addDetailInfo("result=" + volumes);
            throw exception;
        }

        return volumes.get(0);
    }

    public Address describeAddress(AwsProcessClient awsProcessClient, String publicIp) {
        // ???
        DescribeAddressesRequest request = new DescribeAddressesRequest();
        request.withPublicIps(publicIp);
        DescribeAddressesResult result = awsProcessClient.getEc2Client().describeAddresses(request);
        List<Address> addresses = result.getAddresses();

        // API??
        if (addresses.size() == 0) {
            // ?????
            throw new AutoException("EPROCESS-000117", publicIp);

        } else if (addresses.size() > 1) {
            // ??????
            AutoException exception = new AutoException("EPROCESS-000118", publicIp);
            exception.addDetailInfo("result=" + addresses);
            throw exception;
        }

        return addresses.get(0);
    }

    public LoadBalancerDescription describeLoadBalancer(AwsProcessClient awsProcessClient,
            String loadBalancerName) {
        // ????
        DescribeLoadBalancersRequest request = new DescribeLoadBalancersRequest();
        request.withLoadBalancerNames(loadBalancerName);
        DescribeLoadBalancersResult result = awsProcessClient.getElbClient().describeLoadBalancers(request);
        List<LoadBalancerDescription> descriptions = result.getLoadBalancerDescriptions();

        // API??
        if (descriptions.size() == 0) {
            // ?????
            throw new AutoException("EPROCESS-000131", loadBalancerName);

        } else if (descriptions.size() > 1) {
            // ??????
            AutoException exception = new AutoException("EPROCESS-000132", loadBalancerName);
            exception.addDetailInfo("result=" + descriptions);
            throw exception;
        }

        return descriptions.get(0);
    }

    public Image describeImage(AwsProcessClient awsProcessClient, String imageId) {
        DescribeImagesRequest request = new DescribeImagesRequest();
        request.withImageIds(imageId);
        DescribeImagesResult result = awsProcessClient.getEc2Client().describeImages(request);
        List<Image> images = result.getImages();

        if (images.isEmpty()) {
            return null;
        }

        return images.get(0);
    }

    public List<AvailabilityZone> describeAvailabilityZones(AwsProcessClient awsProcessClient) {
        DescribeAvailabilityZonesRequest request = new DescribeAvailabilityZonesRequest();
        DescribeAvailabilityZonesResult result = awsProcessClient.getEc2Client().describeAvailabilityZones(request);
        List<AvailabilityZone> availabilityZones = result.getAvailabilityZones();

        return availabilityZones;
    }

    public List<SecurityGroup> describeSecurityGroupsByVpcId(AwsProcessClient awsProcessClient, String vpcId) {
        DescribeSecurityGroupsRequest request = new DescribeSecurityGroupsRequest();
        request.withFilters(new Filter().withName("vpc-id").withValues(vpcId));
        DescribeSecurityGroupsResult result = awsProcessClient.getEc2Client().describeSecurityGroups(request);
        List<SecurityGroup> securityGroups = result.getSecurityGroups();

        return securityGroups;
    }

    public List<Subnet> describeSubnetsByVpcId(AwsProcessClient awsProcessClient, String vpcId) {
        DescribeSubnetsRequest request = new DescribeSubnetsRequest();
        request.withFilters(new Filter().withName("vpc-id").withValues(vpcId));
        DescribeSubnetsResult result = awsProcessClient.getEc2Client().describeSubnets(request);
        List<Subnet> subnets = result.getSubnets();

        return subnets;
    }

    public void createTag(AwsProcessClient awsProcessClient, String resourceId, List<Tag> tags) {
        CreateTagsRequest request = new CreateTagsRequest();
        request.withResources(resourceId);
        request.withTags(tags);
        awsProcessClient.getEc2Client().createTags(request);

        // 
        if (log.isInfoEnabled()) {
            for (Tag tag : tags) {
                log.info(MessageUtils.getMessage("IPROCESS-100154", resourceId, tag.getKey(), tag.getValue()));
            }
        }
    }

}