@@ -21,12 +21,11 @@ import org.cobbzilla.util.http.HttpRequestBean;
import org.cobbzilla.util.http.HttpResponseBean;
import org.cobbzilla.util.http.HttpResponseBean;
import java.io.IOException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.*;
import static bubble.model.cloud.BubbleNode.*;
import static bubble.model.cloud.BubbleNode.*;
import static org.cobbzilla.util.daemon.ZillaRuntime.die;
import static org.cobbzilla.util.daemon.ZillaRuntime.die;
import static org.cobbzilla.util.daemon.ZillaRuntime.empty;
import static org.cobbzilla.util.http.HttpStatusCodes.OK;
import static org.cobbzilla.util.http.HttpStatusCodes.OK;
import static org.cobbzilla.util.security.RsaKeyPair.newRsaKeyPair;
import static org.cobbzilla.util.security.RsaKeyPair.newRsaKeyPair;
import static org.cobbzilla.wizard.resources.ResourceUtil.notFoundEx;
import static org.cobbzilla.wizard.resources.ResourceUtil.notFoundEx;
@@ -36,28 +35,35 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
public static final String TAG_CLOUD_UUID = "cloudUUID";
public static final String TAG_CLOUD_UUID = "cloudUUID";
public static final String TAG_NODE_UUID = "nodeUUID";
public static final String TAG_NODE_UUID = "nodeUUID";
public static final String KEY_NAME_PREFIX = "K eyName_";
public static final String KEY_NAME_PREFIX = "k eyName_";
public static final int MIN_COUNT = 1;
public static final int MIN_COUNT = 1;
public static final int MAX_COUNT = 1;
public static final int MAX_COUNT = 1;
@Getter(lazy = true) private final AWSCredentialsProvider ec2credentials = new BubbleAwsCredentialsProvider(cloud, getCredentials());
@Getter(lazy=true) private final AWSCredentialsProvider ec2credentials = new BubbleAwsCredentialsProvider(cloud, getCredentials());
@Getter(lazy = true) private final AmazonEC2 ec2Client = initEC2Client ();
@Getter(lazy=true) private final Map<String, AmazonEC2> ec2ClientMap = new HashMap<> ();
private AmazonEC2 initEC2Client() {
final Regions region;
final String regionName = config.getRegions()[0].getName();
try {
region = Regions.valueOf(regionName);
} catch (Exception e) {
return die("initEC2Client: invalid region: " + regionName);
private AmazonEC2 getEC2Client(String regionName) {
Map<String, AmazonEC2> ec2ClientMap = getEc2ClientMap();
AmazonEC2 ec2client;
if (!ec2ClientMap.containsKey(regionName)) {
final Regions region;
try {
region = Regions.valueOf(regionName);
} catch (Exception e) {
return die("initEC2Client: invalid region: " + regionName);
}
ec2client = AmazonEC2ClientBuilder.standard()
.withRegion(region)
.withCredentials(getEc2credentials())
.build();
ec2ClientMap.put(regionName, ec2client);
}
}
return AmazonEC2ClientBuilder.standard()
.withRegion(region)
.withCredentials(getEc2credentials())
.build();
ec2client = ec2ClientMap.get(regionName);
return ec2client;
}
}
@Override protected String readSshKeyId(HttpResponseBean keyResponse) {
@Override protected String readSshKeyId(HttpResponseBean keyResponse) {
throw new UnsupportedOperationException();
throw new UnsupportedOperationException();
}
}
@@ -69,37 +75,36 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
@Override public List<BubbleNode> listNodes() throws IOException {
@Override public List<BubbleNode> listNodes() throws IOException {
final List<BubbleNode> nodes = new ArrayList<>();
final List<BubbleNode> nodes = new ArrayList<>();
final AmazonEC2 ec2Client = getEc2Client();
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.withFilters(
new Filter("instance.group-id").withValues(config.getConfig("group" )),
new Filter("tag:" + TAG_CLOUD_UUID).withValues(cloud.getUuid()),
new Filter("instance-state-name").withValues("running", "pending")
);
DescribeInstancesResult result = ec2Client.describeInstances(describeInstancesRequest);
if (result.getSdkHttpMetadata().getHttpStatusCode() == OK ) {
for (Reservation reservation : result.getReservation s()) {
for (Instance instance : reservation.getInstances()) {
final String instanceId = instance.getInstanceId ();
final String ip4 = instance.getPrivate IpAddress();
final String ip6 = instance.getPublicIpAddress( );
nodes.add(new BubbleNode().setIp4(ip4).setIp6(ip6).setTag(TAG_INSTANCE_ID, instanceId));
for (AmazonEC2 ec2Client : getEc2ClientMap().values()) {
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.withFilters(
new Filter("instance.group-id").withValues(config.getConfig("group")),
new Filter("tag:" + TAG_CLOUD_UUID).withValues(cloud.getUuid( )),
new Filter("instance-state-name").withValues("running", "pending")
);
DescribeInstancesResult result = ec2Client.describeInstances(describeInstancesRequest);
if (result.getSdkHttpMetadata().getHttpStatusCode() == OK) {
for (Reservation reservation : result.getReservations() ) {
for (Instance instance : reservation.getInstance s()) {
final String instanceId = instance.getInstanceId();
final String ip4 = instance.getPrivateIpAddress ();
final String ip6 = instance.getPublic IpAddress();
nodes.add(new BubbleNode().setIp4(ip4).setIp6(ip6).setTag(TAG_INSTANCE_ID, instanceId) );
}
}
}
} else {
return die("listNode: error listing nodes, status=" + result.getSdkHttpMetadata().getHttpStatusCode()
+ ": " + result.getSdkHttpMetadata().getAllHttpHeaders());
}
}
} else {
return die("listNode: error listing nodes, status=" + result.getSdkHttpMetadata().getHttpStatusCode()
+ ": " + result.getSdkHttpMetadata().getAllHttpHeaders());
}
}
return nodes;
return nodes;
}
}
@Override public BubbleNode start(BubbleNode node) throws Exception {
@Override public BubbleNode start(BubbleNode node) throws Exception {
final ComputeNodeSize size = config.getSize(node.getSize());
final ComputeNodeSize size = config.getSize(node.getSize());
final AmazonEC2 ec2Client = getEc2Client( );
final AmazonEC2 ec2Client = getEC2Client(node.getRegion() );
DescribeSubnetsRequest describeSubnetsRequest = new DescribeSubnetsRequest()
DescribeSubnetsRequest describeSubnetsRequest = new DescribeSubnetsRequest()
.withFilters(new Filter().withName("state").withValues("available"));
.withFilters(new Filter().withName("state").withValues("available"));
@@ -142,7 +147,7 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
for (Instance i : reservation.getInstances()) {
for (Instance i : reservation.getInstances()) {
if (i.getInstanceId().equals(instanceId)) {
if (i.getInstanceId().equals(instanceId)) {
final String ip4 = i.getPrivateIpAddress();
final String ip4 = i.getPrivateIpAddress();
if (ip4 != null && ip4.length() > 0 && !ip4.equals("0.0.0.0")){
if (ip4 != null && ip4.length() > 0 && !ip4.equals("0.0.0.0")) {
node.setIp4(ip4);
node.setIp4(ip4);
nodeDAO.update(node);
nodeDAO.update(node);
}
}
@@ -155,21 +160,34 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
}
}
}
}
}
}
} else {
log.error("start: error describe instance, status: " + result.getSdkHttpMetadata().getHttpStatusCode()
+ result.getSdkHttpMetadata().getAllHttpHeaders());
}
}
// Setting up the tags for the instance
// Setting up the tags for the instance
CreateTagsRequest createTagsRequest = new CreateTagsRequest()
.withResources(instanceId)
.withTags(new Tag(TAG_NODE_UUID, node.getUuid()),
new Tag(TAG_CLOUD_UUID, cloud.getUuid()));
// Setting up the tag for the test instance
if (configuration.getEnvironment().containsKey("TEST_TAG_CLOUD")){
CreateTagsRequest createTestTagRequest = new CreateTagsRequest()
try {
ec2Client.createTags(new CreateTagsRequest()
.withResources(instanceId)
.withResources(instanceId)
.withTags(new Tag(TAG_TEST, configuration.getEnvironment().get("TEST_TAG_CLOUD")));
.withTags(new Tag(TAG_NODE_UUID, node.getUuid()),
new Tag(TAG_CLOUD_UUID, cloud.getUuid())));
} catch (AmazonServiceException e) {
log.warn("start: error creating tags: " + e.getErrorMessage() + e.getErrorCode());
}
}
// Setting up the tag for the test instance
if (configuration.testMode()) {
final String testTag = configuration.getEnvironment().get("TEST_TAG_CLOUD");
if (empty(testTag)) return die("TEST_TAG_CLOUD env var is not defined or is empty");
try {
ec2Client.createTags(new CreateTagsRequest()
.withResources(instanceId)
.withTags(new Tag(TAG_TEST, configuration.getEnvironment().get("TEST_TAG_CLOUD"))));
} catch (AmazonServiceException e) {
log.warn("start: error creating test tag: " + e.getErrorMessage() + e.getErrorCode());
}
}
return node;
return node;
}
}
@@ -190,7 +208,7 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
StopInstancesRequest stopInstancesRequest = new StopInstancesRequest()
StopInstancesRequest stopInstancesRequest = new StopInstancesRequest()
.withInstanceIds(instanceID);
.withInstanceIds(instanceID);
final AmazonEC2 ec2Client = getEc2Client( );
final AmazonEC2 ec2Client = getEC2Client(node.getRegion() );
try {
try {
ec2Client.stopInstances(stopInstancesRequest);
ec2Client.stopInstances(stopInstancesRequest);
@@ -224,7 +242,7 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
.withKeyName(KEY_NAME_PREFIX + node.getUuid());
.withKeyName(KEY_NAME_PREFIX + node.getUuid());
// destroy key, check response
// destroy key, check response
final AmazonEC2 ec2Client = getEc2Client( );
final AmazonEC2 ec2Client = getEC2Client(node.getRegion() );
DeleteKeyPairResult response = ec2Client.deleteKeyPair(request);
DeleteKeyPairResult response = ec2Client.deleteKeyPair(request);
if (response.getSdkHttpMetadata().getHttpStatusCode() != OK) {
if (response.getSdkHttpMetadata().getHttpStatusCode() != OK) {
@@ -237,7 +255,7 @@ public class AmazonEC2Driver extends ComputeServiceDriverBase {
if (node.hasSshKey()) return die("registerSshKey: node already has a key: "+node.getUuid());
if (node.hasSshKey()) return die("registerSshKey: node already has a key: "+node.getUuid());
node.setSshKey(newRsaKeyPair());
node.setSshKey(newRsaKeyPair());
final AmazonEC2 ec2Client = getEc2Client( );
final AmazonEC2 ec2Client = getEC2Client(node.getRegion() );
ImportKeyPairRequest importKeyPairRequest = new ImportKeyPairRequest(
ImportKeyPairRequest importKeyPairRequest = new ImportKeyPairRequest(
KEY_NAME_PREFIX + node.getUuid(), node.getSshKey().getSshPublicKey()
KEY_NAME_PREFIX + node.getUuid(), node.getSshKey().getSshPublicKey()
);
);