jp.aws.test.ec2.EC2Instance.java Source code

Java tutorial

Introduction

Here is the source code for jp.aws.test.ec2.EC2Instance.java

Source

/**
 * @file
 * @brief EC2
 * @author tmor
 * @licence Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0
 *
 * $Revision: 266 $
 */

package jp.aws.test.ec2;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import jp.aws.test.AmazonClientManager;

import android.util.Log;
import android.util.Pair;

import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.ec2.model.CreateKeyPairRequest;
import com.amazonaws.services.ec2.model.CreateKeyPairResult;
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.DescribeKeyPairsResult;
import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest;
import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult;
import com.amazonaws.services.ec2.model.Filter;
import com.amazonaws.services.ec2.model.GroupIdentifier;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.KeyPair;
import com.amazonaws.services.ec2.model.KeyPairInfo;
import com.amazonaws.services.ec2.model.Placement;
import com.amazonaws.services.ec2.model.RebootInstancesRequest;
import com.amazonaws.services.ec2.model.Reservation;
import com.amazonaws.services.ec2.model.RunInstancesRequest;
import com.amazonaws.services.ec2.model.RunInstancesResult;
import com.amazonaws.services.ec2.model.SecurityGroup;
import com.amazonaws.services.ec2.model.StartInstancesRequest;
import com.amazonaws.services.ec2.model.StopInstancesRequest;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;

public class EC2Instance {
    private AmazonClientManager clientManager = null;

    public EC2Instance(AmazonClientManager clientManager) {
        this.clientManager = clientManager;
    }

    /**
     * ?
     *
     * @note - ????????
     * @return
     * @throws Exception
     */
    public List<EC2Item> list() {

        List<EC2Item> ec2ItemList = new ArrayList<EC2Item>();

        // 
        this.clientManager.changeRegion();

        // Reservation?List?
        List<Reservation> reservationList = this.clientManager.ec2().describeInstances().getReservations();

        for (Reservation reservation : reservationList) {
            // EC2?Instance?List?
            List<Instance> instanceList = reservation.getInstances();

            for (Instance instance : instanceList) {
                EC2Item ec2Item = new EC2Item();

                // com.amazonaws.services.ec2.model.Instance
                // http://docs.amazonwebservices.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/services/ec2/model/Instance.html
                ec2Item.architecture = instance.getArchitecture(); // i386,
                // x86_64
                ec2Item.instanceId = instance.getInstanceId(); // i-xxxxxxxx
                ec2Item.instanceType = instance.getInstanceType(); // t1.micro
                ec2Item.keyName = instance.getKeyName(); //
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                ec2Item.launchTime = sdf.format(instance.getLaunchTime()); // 2012-01-01
                // 01:02:03
                // +9:00
                ec2Item.privateDnsName = instance.getPrivateDnsName(); // domU-xxx.compute-1.internal
                ec2Item.privateIpAddress = instance.getPrivateIpAddress(); // 10.xxx.xxx.xxx
                ec2Item.publicDnsName = instance.getPublicDnsName(); // ec2-xxx.compute-1.amazonaws.com
                ec2Item.publicIpAddress = instance.getPublicIpAddress(); // 201.xxx.xxx.xxx
                ec2Item.rootDeviceType = instance.getRootDeviceType(); // ebs /
                // s3
                ec2Item.rootDeviceName = instance.getRootDeviceName(); // /dev/sda1)
                StringBuilder builder = new StringBuilder();
                List<GroupIdentifier> sgs = instance.getSecurityGroups(); // default
                for (GroupIdentifier sg : sgs) {
                    builder.append(sg.getGroupName());
                    builder.append(", ");
                }
                ec2Item.securityGroups = builder.toString();
                ec2Item.stateName = instance.getState().getName(); // Runnning
                ec2Item.imageId = instance.getImageId(); // ami-xxxxxxxx
                ec2Item.platform = instance.getPlatform(); // Windows
                builder.setLength(0); // ?
                List<Tag> tags = instance.getTags(); // tag
                for (Tag tag : tags) {
                    builder.append(tag.getValue());
                    builder.append(", ");
                }
                ec2Item.availabilityZone = instance.getPlacement().getAvailabilityZone(); // AvailabilityZone

                // ?
                ec2ItemList.add(ec2Item);
            }
        }

        return ec2ItemList;
    }

    /**
     * ??
     *
     * @throws Exception
     */
    public void reboot(String instanceId) {
        ArrayList<String> instanceIds = new ArrayList<String>();
        instanceIds.add(instanceId);

        RebootInstancesRequest rebootInstancesRequest = new RebootInstancesRequest();
        // rebootInstancesRequest.withInstanceIds(instanceId); // ???
        rebootInstancesRequest.setInstanceIds(instanceIds); // ??
        clientManager.ec2().rebootInstances(rebootInstancesRequest);
    }

    /*
     * ?
     *
     * @throws Exception
     */
    public void terminate(String instanceId) {
        ArrayList<String> instanceIds = new ArrayList<String>();
        instanceIds.add(instanceId);

        TerminateInstancesRequest terminateInstancesRequest = new TerminateInstancesRequest();
        terminateInstancesRequest.setInstanceIds(instanceIds); // ??
        clientManager.ec2().terminateInstances(terminateInstancesRequest);
    }

    /**
     * ?
     *
     * @throws Exception
     */
    public void start(String instanceId) {
        ArrayList<String> instanceIds = new ArrayList<String>();
        instanceIds.add(instanceId);

        StartInstancesRequest startInstancesRequest = new StartInstancesRequest();
        startInstancesRequest.setInstanceIds(instanceIds);
        clientManager.ec2().startInstances(startInstancesRequest);
    }

    /**
     * ??
     *
     * @throws Exception
     */
    public void stop(String instanceId) {
        ArrayList<String> instanceIds = new ArrayList<String>();
        instanceIds.add(instanceId);

        StopInstancesRequest stopInstancesRequest = new StopInstancesRequest();
        stopInstancesRequest.setInstanceIds(instanceIds);
        clientManager.ec2().stopInstances(stopInstancesRequest);
    }

    /**
     * EC2
     *
     * @param imageId
     * @param min
     * @param max
     * @param instanceType
     * @param keyPairName
     * @param availabilityZone
     * @param securityGroups
     * @return Vector<Instance>
     * @throws Exception
     */
    public Vector<Instance> launchEC2Instances(String imageId, int min, int max, String instanceType,
            String keyPairName, String availabilityZone, Collection<String> securityGroups, String additionalInfo,
            String userData) throws Exception {

        Vector<Instance> newInstances = new Vector<Instance>();

        if (min <= 0 || max <= 0 || min > max) {
            return newInstances;
        }

        RunInstancesRequest request = new RunInstancesRequest();
        request.setImageId(imageId);
        request.setInstanceType(instanceType);
        request.setMinCount(min);
        request.setMaxCount(max);
        Placement p = new Placement();
        if (availabilityZone.toLowerCase().equals("any"))
            availabilityZone = ""; // ??????
        p.setAvailabilityZone(availabilityZone);
        request.setPlacement(p);
        request.setSecurityGroups(securityGroups);
        request.setKeyName(keyPairName);// assign Keypair name for this request
        request.setUserData(userData);
        request.setAdditionalInfo(additionalInfo);

        // 
        RunInstancesResult runInstancesRes = clientManager.ec2().runInstances(request);
        String reservationId = runInstancesRes.getReservation().getReservationId();

        List<Instance> instances = runInstancesRes.getReservation().getInstances();
        if (runInstancesRes != null) {
            for (Instance instance : instances) {
                // EC2InstanceObject newInstanceObject = new
                // EC2InstanceObject();
                // newInstanceObject.setDnsName(i.getPublicDnsName());
                // newInstanceObject.setInstanceId(i.getInstanceId());
                // instances.add(newInstanceObject);
                // newInstances.add(newInstanceObject);
                newInstances.add(instance);
            }
        }

        return newInstances;
    }

    /**
     * AMI?
     *
     * @param HashMap
     *            <String,String> filterMap : ID: ownerid => self, amazon,
     *            redhat, 00000000  root-device-type => ebs, instance-store
     *            architecture => i386, x86_64 name => amzn-ami*
     * @return
     * @throws Exception
     * @note - ????????
     */
    public List<AMIItem> ami_list(HashMap<String, String> filterMap) {

        List<AMIItem> amiItemList = new ArrayList<AMIItem>();

        // 
        this.clientManager.changeRegion();

        // AMI??
        DescribeImagesRequest describeImagesRequest = new DescribeImagesRequest();
        List<String> ownersList = new ArrayList<String>();

        // OwnerID?(self, amazon, redhat, 00000000)
        ownersList.add(filterMap.get("ownerid"));
        describeImagesRequest.setOwners(ownersList);

        // AMI????????Filter?
        ArrayList<Filter> filters = new ArrayList<Filter>();

        Filter filter = new Filter();
        filter.setName("image-type");

        // machine
        List<String> valueList = new ArrayList<String>();
        valueList.add("machine");
        filter.setValues(valueList);

        // Filter
        filters.add(filter);

        // 
        for (Iterator<String> it = filterMap.keySet().iterator(); it.hasNext();) {
            String key = it.next();
            Log.d("ami_list", String.format("key:%s, value:%s", key, filterMap.get(key)));
            if (key.toLowerCase().equals("ownerid"))
                continue;
            filters.add(new Filter().withName(key).withValues(filterMap.get(key)));
        }

        // Filter
        describeImagesRequest.setFilters(filters);

        // ????AMI??
        DescribeImagesResult describeImagesResult = this.clientManager.ec2().describeImages(describeImagesRequest);

        // AMI?List?(Image?com.amazonaws.services.ec2.model?Image???)
        List<Image> amiList = describeImagesResult.getImages();

        // ?AMI??
        for (Image image : amiList) {
            // http://docs.amazonwebservices.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/services/ec2/model/Image.html
            AMIItem amiItem = new AMIItem();

            StringBuilder builder = new StringBuilder();

            amiItem.imageId = image.getImageId();
            amiItem.imageType = image.getImageType();
            amiItem.imageLocation = image.getImageLocation();
            amiItem.name = image.getName();
            amiItem.architecture = image.getArchitecture();
            amiItem.platform = image.getPlatform();
            amiItem.state = image.getState();
            amiItem.ownerId = image.getOwnerId();
            amiItem.rootDeviceType = image.getRootDeviceType();
            amiItem.rootDeviceName = image.getRootDeviceName();
            amiItem.description = image.getDescription();
            builder.setLength(0); // ?
            List<Tag> tags = image.getTags(); // tag
            for (Tag tag : tags) {
                builder.append(tag.getValue());
                builder.append(", ");
            }

            // ?
            amiItemList.add(amiItem);
        }

        return amiItemList;
    }

    /**
     * ??
     *
     * @param keyPairName
     * @return
     * @throws Exception
     *
     * @code Pair<String, String> sshAuthenticationKey = createKeyPairs("hoge");
     *       Strinig fingerprint = sshAuthenticationKey.first; String material =
     *       sshAuthenticationKey.second;
     * @endcode
     */
    public Pair<String, String> createKeyPairs(String keyPairName) {
        KeyPair keyPair;

        CreateKeyPairRequest kpReq = new CreateKeyPairRequest();
        kpReq.setKeyName(keyPairName);
        CreateKeyPairResult keyPairRes = clientManager.ec2().createKeyPair(kpReq);
        keyPair = keyPairRes.getKeyPair();

        Pair<String, String> sshAuthenticationKey = new Pair<String, String>(keyPair.getKeyFingerprint(),
                keyPair.getKeyMaterial());

        return sshAuthenticationKey;
    }

    /**
     * ?
     *
     * @return
     */
    public List<String> getKeyPairs() {
        List<String> itemList = new ArrayList<String>();

        DescribeKeyPairsResult describeKeyPairsResult = this.clientManager.ec2().describeKeyPairs();
        List<KeyPairInfo> keyPairInfos = describeKeyPairsResult.getKeyPairs();
        for (KeyPairInfo keyPairInfo : keyPairInfos) {
            itemList.add(keyPairInfo.getKeyName());
        }

        return itemList;
    }

    /**
     * ?
     *
     * @return
     * @note - "any"=????????????
     */
    public List<String> getAvailabilityZones() {
        List<String> itemList = new ArrayList<String>();

        DescribeAvailabilityZonesRequest request = new DescribeAvailabilityZonesRequest();
        DescribeAvailabilityZonesResult describeAvailabilityZonesResult = this.clientManager.ec2()
                .describeAvailabilityZones(request);
        List<AvailabilityZone> availabilityZones = describeAvailabilityZonesResult.getAvailabilityZones();

        itemList.add("any");
        for (AvailabilityZone az : availabilityZones) {
            itemList.add(az.getZoneName());
        }

        return itemList;
    }

    /**
     * ?
     *
     * @return
     */
    public List<String> getSecurityGroups() {
        List<String> itemList = new ArrayList<String>();

        DescribeSecurityGroupsRequest request = new DescribeSecurityGroupsRequest();
        DescribeSecurityGroupsResult describeSecurityGroupsResult = this.clientManager.ec2()
                .describeSecurityGroups(request);
        List<SecurityGroup> securityGroups = describeSecurityGroupsResult.getSecurityGroups();
        for (SecurityGroup sg : securityGroups) {
            itemList.add(sg.getGroupName());
        }

        return itemList;
    }
}