/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.amazontools;
import com.amazonaws.services.autoscaling.model.AutoScalingGroup;
import com.amazonaws.services.autoscaling.model.DescribeAutoScalingGroupsResult;
import com.amazonaws.services.autoscaling.model.DescribeLaunchConfigurationsRequest;
import com.amazonaws.services.autoscaling.model.DescribeLaunchConfigurationsResult;
import com.amazonaws.services.autoscaling.model.LaunchConfiguration;
import com.amazonaws.services.ec2.model.DescribeImagesRequest;
import com.amazonaws.services.ec2.model.DescribeImagesResult;
import com.amazonaws.services.ec2.model.Image;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.DeleteObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import jargs.gnu.CmdLineParser;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mladen Cikara
*/
public class S3Cleaner extends BaseAMITool {
public static void main(String[] args) throws Exception {
CmdLineParser cmdLineParser = new CmdLineParser();
CmdLineParser.Option propertiesFileNameOption =
cmdLineParser.addStringOption("properties.file.name");
cmdLineParser.parse(args);
try {
new S3Cleaner(
(String)cmdLineParser.getOptionValue(propertiesFileNameOption));
}
catch (Exception e) {
e.printStackTrace();
System.exit(-1);
return;
}
System.exit(0);
}
public S3Cleaner(String propertiesFileName) throws Exception {
super(propertiesFileName);
deleteBuckets();
}
protected void deleteBucket(String bucketName) {
ObjectListing objectListing = amazonS3Client.listObjects(bucketName);
List<S3ObjectSummary> objectSummaries =
objectListing.getObjectSummaries();
if (!objectSummaries.isEmpty()) {
DeleteObjectsRequest deleteObjectsRequest =
new DeleteObjectsRequest(bucketName);
List<DeleteObjectsRequest.KeyVersion> keyVersions =
new ArrayList<>();
for (S3ObjectSummary objectSummary : objectSummaries) {
keyVersions.add(
new DeleteObjectsRequest.KeyVersion(
objectSummary.getKey()));
}
deleteObjectsRequest.setKeys(keyVersions);
amazonS3Client.deleteObjects(deleteObjectsRequest);
}
amazonS3Client.deleteBucket(bucketName);
}
protected void deleteBuckets() {
System.out.println("Deleting buckets");
List<String> timestamps = new ArrayList<>();
List<String> imageNames = getImageNames(
getImageIds(getLaunchConfigurationNames()));
for (String imageName : imageNames) {
timestamps.add(getTimestamp(imageName));
}
List<String> bucketNames = getBucketNames(timestamps);
for (String bucketName : bucketNames) {
System.out.println("Deleting bucket " + bucketName);
deleteBucket(bucketName);
}
}
protected List<String> getBucketNames(List<String> timestamps) {
List<String> bucketNames = new ArrayList<>();
List<Bucket> buckets = amazonS3Client.listBuckets();
for (Bucket bucket : buckets) {
String name = bucket.getName();
if (name.startsWith("frw-cluster") ||
name.startsWith("lcs-cluster") || name.startsWith("lcs-sqs")) {
String timestamp = getTimestamp(name);
if (!timestamps.contains(timestamp)) {
bucketNames.add(bucket.getName());
}
}
}
return bucketNames;
}
protected List<String> getImageIds(List<String> launchConfigurationNames) {
List<String> imageIds = new ArrayList<>();
DescribeLaunchConfigurationsRequest
describeLaunchConfigurationsRequest =
new DescribeLaunchConfigurationsRequest();
describeLaunchConfigurationsRequest.setLaunchConfigurationNames(
launchConfigurationNames);
DescribeLaunchConfigurationsResult describeLaunchConfigurationsResult =
amazonAutoScalingClient.describeLaunchConfigurations(
describeLaunchConfigurationsRequest);
for (LaunchConfiguration launchConfiguration :
describeLaunchConfigurationsResult.getLaunchConfigurations()) {
imageIds.add(launchConfiguration.getImageId());
}
return imageIds;
}
protected List<String> getImageNames(List<String> imageIds) {
List<String> imageNames = new ArrayList<>();
DescribeImagesRequest describeImagesRequest =
new DescribeImagesRequest();
describeImagesRequest.setImageIds(imageIds);
DescribeImagesResult describeImagesResult =
amazonEC2Client.describeImages(describeImagesRequest);
for (Image image : describeImagesResult.getImages()) {
imageNames.add(image.getName());
}
return imageNames;
}
protected List<String> getLaunchConfigurationNames() {
List<String> launchConfigurationNames = new ArrayList<>();
DescribeAutoScalingGroupsResult describeAutoScalingGroupsResult =
amazonAutoScalingClient.describeAutoScalingGroups();
List<AutoScalingGroup> autoScalingGroups =
describeAutoScalingGroupsResult.getAutoScalingGroups();
for (AutoScalingGroup autoScalingGroup : autoScalingGroups) {
launchConfigurationNames.add(
autoScalingGroup.getLaunchConfigurationName());
}
return launchConfigurationNames;
}
protected String getTimestamp(String imageName) {
return imageName.substring(imageName.lastIndexOf('-') + 1);
}
}