/*
* 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()));
}
}
}
}