This is an automated email from the ASF dual-hosted git repository.

jbarrett pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-benchmarks.git


The following commit(s) were added to refs/heads/develop by this push:
     new 6cb68ee  Create dedicated hosts (#109)
6cb68ee is described below

commit 6cb68ee7b78b0b439c7257f0d568485f04c75101
Author: Jacob Barrett <jbarr...@pivotal.io>
AuthorDate: Tue Sep 17 19:52:50 2019 -0700

    Create dedicated hosts (#109)
---
 infrastructure/scripts/aws/run_tests.sh            |  4 +-
 .../geode/infrastructure/aws/DestroyCluster.java   | 20 +++++++
 .../geode/infrastructure/aws/LaunchCluster.java    | 61 ++++++++++++++--------
 3 files changed, 61 insertions(+), 24 deletions(-)

diff --git a/infrastructure/scripts/aws/run_tests.sh 
b/infrastructure/scripts/aws/run_tests.sh
index 3dd4d0d..9a77404 100755
--- a/infrastructure/scripts/aws/run_tests.sh
+++ b/infrastructure/scripts/aws/run_tests.sh
@@ -17,7 +17,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-set -e -o pipefail
+set -x -e -o pipefail
 
 DEFAULT_BENCHMARK_REPO='https://github.com/apache/geode-benchmarks'
 BENCHMARK_REPO=${DEFAULT_BENCHMARK_REPO}
@@ -144,7 +144,7 @@ REPO=$(fixRepoName ${REPO})
 SSH_OPTIONS="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i 
~/.geode-benchmarks/${TAG}-privkey.pem"
 HOSTS=`aws ec2 describe-instances --query 
'Reservations[*].Instances[*].PrivateIpAddress' --filter 
"Name=tag:geode-benchmarks,Values=${TAG}" --output text`
 HOSTS=$(echo ${HOSTS} | tr ' ' ',')
-FIRST_INSTANCE=`aws ec2 describe-instances --query 
'Reservations[*].Instances[*].PublicIpAddress' --filter 
"Name=tag:geode-benchmarks,Values=${TAG}" --output text | cut -f 1`
+FIRST_INSTANCE=`aws ec2 describe-instances --query 
'Reservations[*].Instances[*].PublicIpAddress' --filter 
"Name=tag:geode-benchmarks,Values=${TAG}" --output text | cut -f 1 | head -n 1`
 
 echo "FIRST_INSTANCE=${FIRST_INSTANCE}"
 echo "HOSTS=${HOSTS}"
diff --git 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/DestroyCluster.java
 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/DestroyCluster.java
index 1c7b668..7156168 100644
--- 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/DestroyCluster.java
+++ 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/DestroyCluster.java
@@ -29,10 +29,14 @@ import 
software.amazon.awssdk.services.ec2.model.DeleteKeyPairRequest;
 import software.amazon.awssdk.services.ec2.model.DeleteLaunchTemplateRequest;
 import software.amazon.awssdk.services.ec2.model.DeletePlacementGroupRequest;
 import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupRequest;
+import software.amazon.awssdk.services.ec2.model.DescribeHostsRequest;
+import software.amazon.awssdk.services.ec2.model.DescribeHostsResponse;
 import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
 import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;
 import software.amazon.awssdk.services.ec2.model.Filter;
+import software.amazon.awssdk.services.ec2.model.Host;
 import software.amazon.awssdk.services.ec2.model.Instance;
+import software.amazon.awssdk.services.ec2.model.ReleaseHostsRequest;
 import software.amazon.awssdk.services.ec2.model.TerminateInstancesRequest;
 
 import org.apache.geode.infrastructure.BenchmarkMetadata;
@@ -51,6 +55,7 @@ public class DestroyCluster {
     }
 
     deleteInstances(benchmarkTag);
+    releaseHosts(benchmarkTag);
     deleteLaunchTemplate(benchmarkTag);
     deleteSecurityGroup(benchmarkTag);
     deletePlacementGroup(benchmarkTag);
@@ -58,6 +63,21 @@ public class DestroyCluster {
     deleteMetadata(benchmarkTag);
   }
 
+  private static void releaseHosts(String benchmarkTag) {
+    DescribeHostsResponse hosts = 
ec2.describeHosts(DescribeHostsRequest.builder()
+        .filter(Filter.builder()
+            .name("tag:" + BenchmarkMetadata.PREFIX)
+            .values(benchmarkTag)
+            .build())
+        .build());
+
+    List<String> hostIds = 
hosts.hosts().stream().map(Host::hostId).collect(Collectors.toList());
+
+    ec2.releaseHosts(ReleaseHostsRequest.builder().hostIds(hostIds).build());
+
+    System.out.println("Hosts for cluster '" + benchmarkTag + "' released.");
+  }
+
   private static void deleteKeyPair(String benchmarkTag) {
     try {
       System.out.println("Deleting cluster keypair: " + 
AwsBenchmarkMetadata.keyPair(benchmarkTag));
diff --git 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/LaunchCluster.java
 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/LaunchCluster.java
index 339fbd0..879178d 100644
--- 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/LaunchCluster.java
+++ 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/LaunchCluster.java
@@ -35,6 +35,8 @@ import java.util.stream.Collectors;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import software.amazon.awssdk.services.ec2.Ec2Client;
+import software.amazon.awssdk.services.ec2.model.AllocateHostsRequest;
+import software.amazon.awssdk.services.ec2.model.AllocateHostsResponse;
 import 
software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest;
 import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest;
 import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse;
@@ -55,14 +57,15 @@ import software.amazon.awssdk.services.ec2.model.Image;
 import software.amazon.awssdk.services.ec2.model.Instance;
 import 
software.amazon.awssdk.services.ec2.model.LaunchTemplateBlockDeviceMappingRequest;
 import 
software.amazon.awssdk.services.ec2.model.LaunchTemplateEbsBlockDeviceRequest;
-import 
software.amazon.awssdk.services.ec2.model.LaunchTemplatePlacementRequest;
 import software.amazon.awssdk.services.ec2.model.LaunchTemplateSpecification;
+import software.amazon.awssdk.services.ec2.model.Placement;
 import software.amazon.awssdk.services.ec2.model.RequestLaunchTemplateData;
 import software.amazon.awssdk.services.ec2.model.ResourceType;
 import software.amazon.awssdk.services.ec2.model.RunInstancesRequest;
 import software.amazon.awssdk.services.ec2.model.RunInstancesResponse;
 import software.amazon.awssdk.services.ec2.model.Tag;
 import software.amazon.awssdk.services.ec2.model.TagSpecification;
+import software.amazon.awssdk.services.ec2.model.Tenancy;
 import software.amazon.awssdk.services.ec2.model.VolumeType;
 
 import org.apache.geode.infrastructure.BenchmarkMetadata;
@@ -93,7 +96,8 @@ public class LaunchCluster {
     authorizeSecurityGroup(benchmarkTag);
     createLaunchTemplate(benchmarkTag, newestImage);
 
-    List<String> instanceIds = launchInstances(benchmarkTag, tags, count);
+    List<String> hostIds = allocateHosts(tags, count);
+    List<String> instanceIds = launchInstances(benchmarkTag, tags, count, 
hostIds);
     DescribeInstancesResponse instances = waitForInstances(instanceIds);
     List<String> publicIps = getPublicIps(instances);
     createMetadata(benchmarkTag, publicIps);
@@ -113,27 +117,44 @@ public class LaunchCluster {
     throw new IllegalStateException(s);
   }
 
-  private static List<String> launchInstances(String benchmarkTag, List<Tag> 
tags,
-      int instanceCount)
-      throws InterruptedException {
-    // launch instances
-
-    RunInstancesResponse rir = ec2.runInstances(RunInstancesRequest.builder()
-        .launchTemplate(LaunchTemplateSpecification.builder()
-            
.launchTemplateName(AwsBenchmarkMetadata.launchTemplate(benchmarkTag))
-            .build())
+  private static List<String> allocateHosts(List<Tag> tags, int count) {
+    AllocateHostsResponse hosts = 
ec2.allocateHosts(AllocateHostsRequest.builder()
+        .availabilityZone("us-west-2a")
+        .instanceType(AwsBenchmarkMetadata.instanceType().toString())
+        .quantity(count)
         .tagSpecifications(TagSpecification.builder()
             .tags(tags)
-            .resourceType(ResourceType.INSTANCE)
+            .resourceType(ResourceType.DEDICATED_HOST)
             .build())
-        .minCount(instanceCount)
-        .maxCount(instanceCount)
         .build());
 
-    List<String> instanceIds = rir.instances()
-        .stream()
-        .map(Instance::instanceId)
-        .collect(Collectors.toList());
+    return hosts.hostIds();
+  }
+
+  private static List<String> launchInstances(String launchTemplate, List<Tag> 
tags,
+      int instanceCount, List<String> hosts)
+      throws InterruptedException {
+    List<String> instanceIds = new ArrayList<>(instanceCount);
+    for (String host : hosts) {
+      // launch instances
+      RunInstancesResponse rir = ec2.runInstances(RunInstancesRequest.builder()
+          .launchTemplate(LaunchTemplateSpecification.builder()
+              
.launchTemplateName(AwsBenchmarkMetadata.launchTemplate(launchTemplate))
+              .build())
+          .placement(Placement.builder()
+              .tenancy(Tenancy.HOST)
+              .hostId(host)
+              .build())
+          .tagSpecifications(TagSpecification.builder()
+              .tags(tags)
+              .resourceType(ResourceType.INSTANCE)
+              .build())
+          .minCount(1)
+          .maxCount(1)
+          .build());
+
+      instanceIds.add(rir.instances().get(0).instanceId());
+    }
 
     return instanceIds;
   }
@@ -222,10 +243,6 @@ public class LaunchCluster {
             .launchTemplateData(RequestLaunchTemplateData.builder()
                 .imageId(newestImage.imageId())
                 .instanceType(AwsBenchmarkMetadata.instanceType())
-                .placement(LaunchTemplatePlacementRequest.builder()
-                    
.groupName(AwsBenchmarkMetadata.placementGroup(benchmarkTag))
-                    .tenancy(AwsBenchmarkMetadata.tenancy())
-                    .build())
                 .keyName(AwsBenchmarkMetadata.keyPair(benchmarkTag))
                 .securityGroups(securityGroupList)
                 
.blockDeviceMappings(LaunchTemplateBlockDeviceMappingRequest.builder()

Reply via email to