com.liferay.amazontools.S3Cleaner.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.amazontools.S3Cleaner.java

Source

/**
 * 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);
    }

}