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

smgoller 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 7d6dfc6  Refactor metadata production and management. (#57)
7d6dfc6 is described below

commit 7d6dfc6b44b6d0822ca8a39e3d4f2fe348fc6e78
Author: Sean Goller <[email protected]>
AuthorDate: Wed Feb 27 14:56:45 2019 -0800

    Refactor metadata production and management. (#57)
    
    * Tests now output metadata if the metadata file doesn't exist.
    * benchmark run metadata.json is actually json.
    * Create configuration directory to store cluster information.
    * Move SSH private key for cluster to configuration directory.
    * Create metadata for cluster, currently including an instance ID and
      the list of IPs in the cluster.
    * Delete metadata when the cluster is destroyed.
---
 gradle/dependency-versions.properties              |  1 +
 harness/build.gradle                               |  1 +
 .../geode/perftest/runner/DefaultTestRunner.java   |  9 +++-
 .../yardstick/hdrhistogram/HdrHistogramWriter.java |  7 +++
 infrastructure/build.gradle                        |  1 +
 .../geode/infrastructure/BenchmarkMetadata.java    | 14 +++--
 .../infrastructure/aws/AwsBenchmarkMetadata.java   |  6 ++-
 .../geode/infrastructure/aws/DestroyCluster.java   | 11 ++++
 .../geode/infrastructure/aws/KeyInstaller.java     |  8 +--
 .../geode/infrastructure/aws/LaunchCluster.java    | 60 +++++++++++++++++-----
 .../{KeyInstaller.java => MetadataInstaller.java}  | 24 +++++----
 11 files changed, 107 insertions(+), 35 deletions(-)

diff --git a/gradle/dependency-versions.properties 
b/gradle/dependency-versions.properties
index 017d40b..e906204 100644
--- a/gradle/dependency-versions.properties
+++ b/gradle/dependency-versions.properties
@@ -28,3 +28,4 @@ awaitility.version = 3.0.0
 sshd-core.version = 2.1.0
 assertj-core.version = 3.11.1
 software-amazon-awssdk.version = 2.1.4
+JSON.version = 20180813
diff --git a/harness/build.gradle b/harness/build.gradle
index a4c6cce..e0e323c 100644
--- a/harness/build.gradle
+++ b/harness/build.gradle
@@ -41,6 +41,7 @@ dependencies {
     compile(group: 'commons-io', name: 'commons-io', version: 
project.'commons-io.version')
     compile(group: 'org.yardstickframework', name: 'yardstick', version: 
project.'yardstick.version')
     compile(group: 'org.hdrhistogram', name: 'HdrHistogram', version: 
project.'HdrHistogram.version')
+    compile(group: 'org.json', name: 'json', version: project.'JSON.version')
     testCompile(group: 'org.mockito', name: 'mockito-all', version: 
project.'mockito-all.version')
     testCompile(group: 'org.awaitility', name: 'awaitility', version: 
project.'awaitility.version')
     testCompile(group: 'org.slf4j', name: 'slf4j-simple', version: 
project.'slf4j-simple.version')
diff --git 
a/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestRunner.java 
b/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestRunner.java
index 8c676fe..019cb18 100644
--- 
a/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestRunner.java
+++ 
b/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestRunner.java
@@ -22,6 +22,7 @@ import java.io.FileWriter;
 import java.util.List;
 import java.util.Map;
 
+import org.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,9 +77,15 @@ public class DefaultTestRunner implements TestRunner {
       FileWriter metadataWriter = new 
FileWriter(metadataOutput.getAbsoluteFile(), true);
 
       String[] metadataEntries = metadata.split(",");
+      JSONObject JSONmetadata = new JSONObject();
+
       for (String data : metadataEntries) {
-        metadataWriter.write(data + "\n");
+        String[] kv = data.split(":");
+        if (kv.length == 2) {
+          JSONmetadata.put(kv[0], kv[1]);
+        }
       }
+      metadataWriter.write(JSONmetadata.toString());
       metadataWriter.flush();
     }
 
diff --git 
a/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramWriter.java
 
b/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramWriter.java
index 6233783..3ed4033 100644
--- 
a/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramWriter.java
+++ 
b/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramWriter.java
@@ -26,14 +26,17 @@ import org.HdrHistogram.HistogramLogWriter;
 public class HdrHistogramWriter implements Consumer<Histogram> {
 
   public static final String FILE_NAME = "latency.hlog";
+  public static final String FILE_NAME_CSV = "latency_csv";
   public static final String FILE_NAME_HDR = "latency_hdr";
 
   private final File outputFile;
   private final File outputHDRFile;
+  private final File outputCSVFile;
 
   public HdrHistogramWriter(File outputDir) {
     this.outputFile = new File(outputDir, FILE_NAME);
     this.outputHDRFile = new File(outputDir, FILE_NAME_HDR);
+    this.outputCSVFile = new File(outputDir, FILE_NAME_CSV);
   }
 
   @Override
@@ -51,6 +54,10 @@ public class HdrHistogramWriter implements 
Consumer<Histogram> {
           new HistogramLogProcessor(new String[] {"-i", 
outputFile.getAbsolutePath(), "-o",
               outputHDRFile.getAbsolutePath()});
       histogramLogProcessor.run();
+      HistogramLogProcessor histogramLogProcessorCSV =
+          new HistogramLogProcessor(new String[] {"-csv", "-i", 
outputFile.getAbsolutePath(), "-o",
+              outputCSVFile.getAbsolutePath()});
+      histogramLogProcessorCSV.run();
     } catch (FileNotFoundException e) {
       throw new UncheckedIOException(e);
     }
diff --git a/infrastructure/build.gradle b/infrastructure/build.gradle
index bf66802..3901df3 100644
--- a/infrastructure/build.gradle
+++ b/infrastructure/build.gradle
@@ -28,6 +28,7 @@ repositories {
 }
 
 dependencies {
+    implementation(group: 'org.json', name: 'json', version: 
project.'JSON.version')
     implementation 'software.amazon.awssdk:ec2'
     implementation(group: 'com.hierynomus', name: 'sshj', version: 
project.'sshj.version')
     runtime(group: 'org.slf4j', name: 'slf4j-simple', version: 
project.'slf4j-simple.version')
diff --git 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/BenchmarkMetadata.java
 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/BenchmarkMetadata.java
index dc920f5..550ef15 100644
--- 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/BenchmarkMetadata.java
+++ 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/BenchmarkMetadata.java
@@ -21,7 +21,6 @@ package org.apache.geode.infrastructure;
  */
 public class BenchmarkMetadata {
   public static String PREFIX = "geode-benchmarks";
-  public static String SSH_DIRECTORY = ".ssh/geode-benchmarks";
 
   public static String benchmarkPrefix(String tag) {
     return PREFIX + "-" + tag;
@@ -31,11 +30,16 @@ public class BenchmarkMetadata {
     return benchmarkPrefix(tag) + "-" + suffix;
   }
 
-  public static String benchmarkKeyFileDirectory() {
-    return System.getProperty("user.home") + "/" + SSH_DIRECTORY;
+  public static String benchmarkConfigDirectory() {
+    return System.getProperty("user.home") + "/." + PREFIX;
   }
 
-  public static String benchmarkKeyFileName(String tag) {
-    return benchmarkKeyFileDirectory() + "/" + tag + ".pem";
+
+  public static String benchmarkPrivateKeyFileName(String tag) {
+    return benchmarkConfigDirectory() + "/" + tag + "-privkey.pem";
+  }
+
+  public static String benchmarkMetadataFileName(String tag) {
+    return benchmarkConfigDirectory() + "/" + tag + "-metadata.json";
   }
 }
diff --git 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/AwsBenchmarkMetadata.java
 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/AwsBenchmarkMetadata.java
index 90fb757..b274050 100644
--- 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/AwsBenchmarkMetadata.java
+++ 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/AwsBenchmarkMetadata.java
@@ -48,7 +48,11 @@ class AwsBenchmarkMetadata extends BenchmarkMetadata {
   }
 
   public static String keyPairFileName(String tag) {
-    return BenchmarkMetadata.benchmarkKeyFileName(tag);
+    return BenchmarkMetadata.benchmarkPrivateKeyFileName(tag);
+  }
+
+  public static String metadataFileName(String tag) {
+    return BenchmarkMetadata.benchmarkMetadataFileName(tag);
   }
 
   public static InstanceType instanceType() {
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 137f8ab..1c7b668 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
@@ -55,6 +55,7 @@ public class DestroyCluster {
     deleteSecurityGroup(benchmarkTag);
     deletePlacementGroup(benchmarkTag);
     deleteKeyPair(benchmarkTag);
+    deleteMetadata(benchmarkTag);
   }
 
   private static void deleteKeyPair(String benchmarkTag) {
@@ -71,6 +72,16 @@ public class DestroyCluster {
     }
   }
 
+  private static void deleteMetadata(String benchmarkTag) {
+    try {
+      
Files.deleteIfExists(Paths.get(AwsBenchmarkMetadata.metadataFileName(benchmarkTag)));
+      System.out.println("Metadata for cluster '" + benchmarkTag + "' 
deleted.");
+    } catch (Exception e) {
+      System.out.println("We got an exception while deleting the Key pair");
+      System.out.println("Exception message: " + e);
+    }
+  }
+
   private static void deleteInstances(String benchmarkTag) throws 
InterruptedException {
     // delete instances
     try {
diff --git 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
index d7b9362..b082e91 100644
--- 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
+++ 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.net.ConnectException;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -39,12 +40,11 @@ public class KeyInstaller {
   private final String user;
   private final Path privateKey;
 
-  public KeyInstaller(String user, Path privateKey) {
-    this.user = user;
-    this.privateKey = privateKey;
+  public KeyInstaller(String benchmarkTag) {
+    this.user = AwsBenchmarkMetadata.USER;
+    this.privateKey = 
Paths.get(AwsBenchmarkMetadata.keyPairFileName(benchmarkTag));
   }
 
-
   public void installPrivateKey(Collection<String> hosts) {
     hosts.forEach(this::installKey);
   }
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 d523fec..0e54a3c 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
@@ -29,8 +29,11 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Locale;
+import java.util.UUID;
 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.AuthorizeSecurityGroupIngressRequest;
 import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest;
@@ -83,12 +86,20 @@ public class LaunchCluster {
 
     List<String> instanceIds = launchInstances(benchmarkTag, tags, count);
     DescribeInstancesResponse instances = waitForInstances(instanceIds);
-
-    List<String> publicIps = installPrivateKey(benchmarkTag, instances);
+    List<String> publicIps = getPublicIps(instances);
+    createMetadata(benchmarkTag, publicIps);
+    installPrivateKey(benchmarkTag, publicIps);
+    installMetadata(benchmarkTag, publicIps);
 
     System.out.println("Instances successfully launched! Public IPs: " + 
publicIps);
   }
 
+  private static List<String> getPublicIps(DescribeInstancesResponse 
describeInstancesResponse) {
+    return describeInstancesResponse.reservations().stream()
+        .flatMap(reservation -> reservation.instances().stream())
+        .map(Instance::publicIpAddress).collect(Collectors.toList());
+  }
+
   private static void usage(String s) {
     throw new IllegalStateException(s);
   }
@@ -132,19 +143,16 @@ public class LaunchCluster {
     return describeInstancesResponse;
   }
 
-  private static List<String> installPrivateKey(String benchmarkTag,
-      DescribeInstancesResponse describeInstancesResponse) {
-    List<String> publicIps =
-        describeInstancesResponse.reservations().stream()
-            .flatMap(reservation -> reservation.instances().stream())
-            .map(Instance::publicIpAddress).collect(Collectors.toList());
-
-    new KeyInstaller(AwsBenchmarkMetadata.USER,
-        
Paths.get(AwsBenchmarkMetadata.keyPairFileName(benchmarkTag))).installPrivateKey(publicIps);
-
+  private static void installPrivateKey(String benchmarkTag,
+      List<String> publicIps) {
+    new KeyInstaller(benchmarkTag).installPrivateKey(publicIps);
     System.out.println("Private key installed on all instances for 
passwordless ssh");
+  }
 
-    return publicIps;
+  private static void installMetadata(String benchmarkTag,
+      List<String> publicIps) {
+    new MetadataInstaller(benchmarkTag).installMetadata(publicIps);
+    System.out.println("Instance ID information installed on all instances");
   }
 
   private static long instanceCount(DescribeInstancesResponse 
describeInstancesResponse) {
@@ -164,14 +172,36 @@ public class LaunchCluster {
   }
 
   private static void createKeyPair(String benchmarkTag) throws IOException {
+    Path configDirectory = 
Paths.get(BenchmarkMetadata.benchmarkConfigDirectory());
     CreateKeyPairResponse ckpr = ec2.createKeyPair(
         
CreateKeyPairRequest.builder().keyName(AwsBenchmarkMetadata.keyPair(benchmarkTag)).build());
-    
Files.createDirectories(Paths.get(BenchmarkMetadata.benchmarkKeyFileDirectory()));
+
+    if (!configDirectory.toFile().exists()) {
+      
Files.createDirectories(Paths.get(BenchmarkMetadata.benchmarkConfigDirectory()));
+    }
     Path privateKey = 
Files.write(Paths.get(AwsBenchmarkMetadata.keyPairFileName(benchmarkTag)),
         ckpr.keyMaterial().getBytes());
     Files.setPosixFilePermissions(privateKey, 
PosixFilePermissions.fromString("rw-------"));
   }
 
+  private static void createMetadata(String benchmarkTag, List<String> 
publicIps)
+      throws IOException {
+    UUID instanceId = UUID.randomUUID();
+    JSONObject metadataJSON = new JSONObject();
+
+    metadataJSON.put("instanceId", instanceId.toString());
+    metadataJSON.put("publicIps", new JSONArray(publicIps));
+    Path configDirectory = 
Paths.get(BenchmarkMetadata.benchmarkConfigDirectory());
+
+    if (!configDirectory.toFile().exists()) {
+      
Files.createDirectories(Paths.get(BenchmarkMetadata.benchmarkConfigDirectory()));
+    }
+
+    Path metadata = 
Files.write(Paths.get(AwsBenchmarkMetadata.metadataFileName(benchmarkTag)),
+        metadataJSON.toString().getBytes());
+    Files.setPosixFilePermissions(metadata, 
PosixFilePermissions.fromString("rw-------"));
+  }
+
   private static void createLaunchTemplate(String benchmarkTag, Image 
newestImage) {
     ArrayList<String> securityGroupList = new ArrayList<>();
     securityGroupList.add(AwsBenchmarkMetadata.securityGroup(benchmarkTag));
@@ -233,6 +263,8 @@ public class LaunchCluster {
     List<Tag> tags = new ArrayList<>();
     
tags.add(Tag.builder().key("purpose").value(BenchmarkMetadata.PREFIX).build());
     
tags.add(Tag.builder().key(BenchmarkMetadata.PREFIX).value(benchmarkTag).build());
+    tags.add(Tag.builder().key(BenchmarkMetadata.benchmarkString(benchmarkTag, 
"instanceId"))
+        .value(UUID.randomUUID().toString()).build());
     return tags;
   }
 
diff --git 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/MetadataInstaller.java
similarity index 79%
copy from 
infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
copy to 
infrastructure/src/main/java/org/apache/geode/infrastructure/aws/MetadataInstaller.java
index d7b9362..07dc5e2 100644
--- 
a/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/KeyInstaller.java
+++ 
b/infrastructure/src/main/java/org/apache/geode/infrastructure/aws/MetadataInstaller.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.net.ConnectException;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -33,30 +34,33 @@ import 
net.schmizz.sshj.transport.verification.PromiscuousVerifier;
 import net.schmizz.sshj.xfer.FilePermission;
 import net.schmizz.sshj.xfer.FileSystemFile;
 
-public class KeyInstaller {
+
+public class MetadataInstaller {
   public static final Config CONFIG = new DefaultConfig();
   private static final int RETRIES = 30;
   private final String user;
+  private final Path metadata;
   private final Path privateKey;
 
-  public KeyInstaller(String user, Path privateKey) {
-    this.user = user;
-    this.privateKey = privateKey;
+  public MetadataInstaller(String benchmarkTag) {
+    this.user = AwsBenchmarkMetadata.USER;
+    this.privateKey = 
Paths.get(AwsBenchmarkMetadata.keyPairFileName(benchmarkTag));
+    this.metadata = 
Paths.get(AwsBenchmarkMetadata.metadataFileName(benchmarkTag));
   }
 
-
-  public void installPrivateKey(Collection<String> hosts) {
-    hosts.forEach(this::installKey);
+  public void installMetadata(Collection<String> hosts) {
+    hosts.forEach(this::installMetadata);
   }
 
-  private void installKey(String host) {
+  private void installMetadata(String host) {
     try (SSHClient client = new SSHClient(CONFIG)) {
       client.addHostKeyVerifier(new PromiscuousVerifier());
       connect(host, client);
       client.authPublickey(user, privateKey.toFile().getAbsolutePath());
       SFTPClient sftpClient = client.newSFTPClient();
-      String dest = "/home/" + user + "/.ssh/id_rsa";
-      sftpClient.put(new FileSystemFile(privateKey.toFile()), dest);
+      String dest = "/home/" + user + "/geode-benchmarks-metadata.json";
+
+      sftpClient.put(new FileSystemFile(metadata.toFile()), dest);
       sftpClient.setattr(dest, new FileAttributes.Builder()
           
.withPermissions(Collections.singleton(FilePermission.USR_R)).build());
     } catch (IOException e) {

Reply via email to