blob: 71561689447dbefe41c119f7b1ec141e460376ef [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geode.infrastructure.aws;
import static java.lang.Thread.sleep;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import software.amazon.awssdk.services.ec2.Ec2Client;
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;
public class DestroyCluster {
private static Ec2Client ec2 = Ec2Client.create();
public static void main(String[] args) throws InterruptedException {
if (args.length != 1) {
throw new IllegalStateException("This takes one argument, the cluster tag to work with.");
}
String benchmarkTag = args[0];
if (benchmarkTag == null || benchmarkTag.isEmpty()) {
throw new IllegalStateException("No valid tag found.");
}
deleteInstances(benchmarkTag);
releaseHosts(benchmarkTag);
deleteLaunchTemplate(benchmarkTag);
deleteSecurityGroup(benchmarkTag);
deletePlacementGroup(benchmarkTag);
deleteKeyPair(benchmarkTag);
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));
ec2.deleteKeyPair(DeleteKeyPairRequest.builder()
.keyName(AwsBenchmarkMetadata.keyPair(benchmarkTag))
.build());
Files.deleteIfExists(Paths.get(AwsBenchmarkMetadata.keyPairFileName(benchmarkTag)));
System.out.println("Key Pair 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 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 {
DescribeInstancesResponse dir = ec2.describeInstances(DescribeInstancesRequest.builder()
.filters(Filter.builder()
.name("tag:" + BenchmarkMetadata.PREFIX).values(benchmarkTag).build())
.build());
Stream<Instance> instanceStream = dir.reservations()
.stream()
.flatMap(reservation -> reservation.instances().stream());
List<String> instanceIds = dir
.reservations()
.stream()
.flatMap(reservation -> reservation
.instances()
.stream())
.map(Instance::instanceId)
.collect(Collectors.toList());
ec2.terminateInstances(TerminateInstancesRequest.builder()
.instanceIds(instanceIds)
.build());
System.out.println("Waiting for cluster instances to terminate.");
while (ec2.describeInstances(DescribeInstancesRequest.builder()
.instanceIds(instanceIds)
.filters(Filter.builder()
.name("instance-state-name")
.values("pending", "running", "shutting-down", "stopping", "stopped")
.build())
.build()).reservations().stream().flatMap(reservation -> reservation.instances().stream())
.count() > 0) {
sleep(AwsBenchmarkMetadata.POLL_INTERVAL);
System.out.println("Continuing to wait.");
}
System.out.println("Instances for cluster '" + benchmarkTag + "' deleted.");
} catch (Exception e) {
System.out.println("We got an exception while deleting the instances");
System.out.println("Exception message: " + e);
}
}
private static void deletePlacementGroup(String benchmarkTag) {
try {
ec2.deletePlacementGroup(DeletePlacementGroupRequest.builder()
.groupName(AwsBenchmarkMetadata.placementGroup(benchmarkTag))
.build());
System.out.println("Placement Group for cluster '" + benchmarkTag + "' deleted.");
} catch (Exception e) {
System.out.println("We got an exception while deleting the placement group");
System.out.println("Exception message: " + e);
}
}
private static void deleteSecurityGroup(String benchmarkTag) {
try {
ec2.deleteSecurityGroup(DeleteSecurityGroupRequest.builder()
.groupName(AwsBenchmarkMetadata.securityGroup(benchmarkTag))
.build());
System.out.println("Security Group for cluster '" + benchmarkTag + "' deleted.");
} catch (Exception e) {
System.out.println("We got an exception while deleting the security group");
System.out.println("Exception message: " + e);
}
}
private static void deleteLaunchTemplate(String benchmarkTag) {
try {
ec2.deleteLaunchTemplate(DeleteLaunchTemplateRequest.builder()
.launchTemplateName(AwsBenchmarkMetadata.launchTemplate(benchmarkTag))
.build());
System.out.println("Launch template for cluster '" + benchmarkTag + "' deleted.");
} catch (Exception e) {
System.out.println("We got an exception while deleting the launch template");
System.out.println("Exception message: " + e);
}
}
}