/** * 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.AmazonServiceException; import com.amazonaws.services.autoscaling.model.DeleteLaunchConfigurationRequest; 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.autoscaling.model.ResourceInUseException; import com.amazonaws.services.ec2.model.DeleteVolumeRequest; import com.amazonaws.services.ec2.model.DeregisterImageRequest; import com.amazonaws.services.ec2.model.DescribeImagesRequest; import com.amazonaws.services.ec2.model.DescribeImagesResult; import com.amazonaws.services.ec2.model.DescribeInstancesResult; import com.amazonaws.services.ec2.model.DescribeVolumesRequest; import com.amazonaws.services.ec2.model.DescribeVolumesResult; import com.amazonaws.services.ec2.model.Filter; import com.amazonaws.services.ec2.model.Image; import com.amazonaws.services.ec2.model.Instance; import com.amazonaws.services.ec2.model.Reservation; import com.amazonaws.services.ec2.model.Volume; import com.amazonaws.services.identitymanagement.model.GetUserResult; import com.amazonaws.services.identitymanagement.model.User; import jargs.gnu.CmdLineParser; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * @author Ivica Cardic * @author Mladen Cikara */ public class AMICleaner 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 AMICleaner( (String)cmdLineParser.getOptionValue(propertiesFileNameOption)); } catch (Exception e) { e.printStackTrace(); System.exit(-1); return; } System.exit(0); } public AMICleaner(String propertiesFileName) throws Exception { super(propertiesFileName); System.out.println("Deleting volumes"); deleteVolumes(); System.out.println("Deleting launch configurations"); deleteLaunchConfigurations(); System.out.println("Deleting images"); deleteImages(); } protected void deleteImage(String imageId) { DeregisterImageRequest deregisterImageRequest = new DeregisterImageRequest(); deregisterImageRequest.setImageId(imageId); amazonEC2Client.deregisterImage(deregisterImageRequest); } protected void deleteImages() { Set<String> imageIds = getImageIds(); Set<String> unusedImageIds = getUnusedImageIds(getUserId(), imageIds); for (String imageId : unusedImageIds) { deleteImage(imageId); } } protected void deleteLaunchConfigurations() { DescribeLaunchConfigurationsRequest describeLaunchConfigurationsRequest = new DescribeLaunchConfigurationsRequest(); DescribeLaunchConfigurationsResult describeLaunchConfigurationsResult = amazonAutoScalingClient.describeLaunchConfigurations( describeLaunchConfigurationsRequest); List<LaunchConfiguration> launchConfigurations = describeLaunchConfigurationsResult.getLaunchConfigurations(); for (int i = 0; i < launchConfigurations.size(); i++) { DeleteLaunchConfigurationRequest deleteLaunchConfigurationRequest = new DeleteLaunchConfigurationRequest(); LaunchConfiguration launchConfiguration = launchConfigurations.get( i); deleteLaunchConfigurationRequest.setLaunchConfigurationName( launchConfiguration.getLaunchConfigurationName()); try { amazonAutoScalingClient.deleteLaunchConfiguration( deleteLaunchConfigurationRequest); } catch (ResourceInUseException riue) { } } } protected void deleteVolumes() { DescribeVolumesRequest describeVolumesRequest = new DescribeVolumesRequest(); Filter filter = new Filter(); filter.setName("status"); filter.withValues("available"); describeVolumesRequest.withFilters(filter); DescribeVolumesResult describeVolumesResult = amazonEC2Client.describeVolumes(describeVolumesRequest); List<Volume> volumes = describeVolumesResult.getVolumes(); for (int i = 0; i < volumes.size(); i++) { DeleteVolumeRequest deleteVolumeRequest = new DeleteVolumeRequest(); Volume volume = volumes.get(i); deleteVolumeRequest.setVolumeId(volume.getVolumeId()); amazonEC2Client.deleteVolume(deleteVolumeRequest); } } protected Set<String> getImageIds() { Set<String> imageIds = new HashSet<>(); DescribeInstancesResult describeInstancesResult = amazonEC2Client.describeInstances(); for (Reservation reservation : describeInstancesResult.getReservations()) { for (Instance instance : reservation.getInstances()) { imageIds.add(instance.getImageId()); } } return imageIds; } protected Set<String> getUnusedImageIds( String userId, Set<String> imageIds) { Set<String> unusedImageIds = new HashSet<>(); DescribeImagesRequest describeImagesRequest = new DescribeImagesRequest(); List<String> owners = new ArrayList<>(); owners.add(userId); describeImagesRequest.setOwners(owners); DescribeImagesResult describeImagesResult = amazonEC2Client.describeImages(describeImagesRequest); List<Image> images = describeImagesResult.getImages(); for (Image image : images) { String imageName = image.getName(); if ((imageName != null) && imageName.startsWith("osb-lcs-") && !imageIds.contains(image.getImageId())) { unusedImageIds.add(image.getImageId()); } } return unusedImageIds; } protected String getUserId() { String userId = null; try { GetUserResult getUserResult = amazonIdentityManagementClient.getUser(); User user = getUserResult.getUser(); userId = user.getUserId(); } catch (AmazonServiceException ase) { String errorCode = ase.getErrorCode(); if (errorCode.compareTo("AccessDenied") == 0) { String message = ase.getMessage(); int x = message.indexOf("::"); int y = message.indexOf(":", x + 2); userId = message.substring(x + 2, y); } } return userId; } }