/**
* Copyright 2010 the original author or authors.
*
* Licensed 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 datameer.awstasks.ant.ec2;
import java.util.List;
import java.util.Set;
import awstasks.com.amazonaws.services.ec2.AmazonEC2;
import awstasks.com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import awstasks.com.amazonaws.services.ec2.model.Filter;
import awstasks.com.amazonaws.services.ec2.model.Instance;
import awstasks.com.amazonaws.services.ec2.model.Reservation;
import awstasks.com.amazonaws.services.ec2.model.Tag;
import datameer.com.google.common.base.Objects;
import datameer.com.google.common.collect.ImmutableList;
import datameer.com.google.common.collect.LinkedHashMultimap;
import datameer.com.google.common.collect.Lists;
import datameer.com.google.common.collect.Multimap;
public class Ec2ListRunningInstances extends AbstractEc2Task {
private List<FilterEntry> _filterEntries = Lists.newArrayList();
private String _nameFilter;
public String getNameFilter() {
return _nameFilter;
}
public void setNameFilter(String nameFilter) {
_nameFilter = nameFilter;
}
public void addFilter(FilterEntry filterEntry) {
_filterEntries.add(filterEntry);
}
@Override
protected void doExecute(AmazonEC2 ec2) {
DescribeInstancesRequest describeRequest = createDescribeRequest();
List<Filter> filters = describeRequest.getFilters();
System.out.println("Setup following filters:");
for (Filter filter : filters) {
System.out.println("\t" + filter);
}
List<Reservation> reservations = ec2.describeInstances(describeRequest).getReservations();
System.out.println("Retrieved following reservations:");
int runningInstanceGroups = 0;
int runningInstances = 0;
for (Reservation reservation : reservations) {
List<Instance> instances = reservation.getInstances();
runningInstanceGroups++;
runningInstances += instances.size();
System.out.println(reservation.getGroupNames() + ":");
for (Instance instance : instances) {
System.out.println("\t" + getInstanceName(instance) + " (" + instance.getInstanceId() + " / " + instance.getState().getName() + "): " + instance.getPublicDnsName());
}
}
System.out.println("Found " + runningInstances + " running instances in " + runningInstanceGroups + " instance groups");
}
private DescribeInstancesRequest createDescribeRequest() {
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
Multimap<String, String> keyToValuesMap = combineFiltersWithSameName();
Set<String> keySet = keyToValuesMap.keySet();
for (String key : keySet) {
describeInstancesRequest.withFilters(new Filter(key, ImmutableList.copyOf(keyToValuesMap.get(key))));
}
return describeInstancesRequest;
}
private Multimap<String, String> combineFiltersWithSameName() {
Multimap<String, String> keyToValuesMap = LinkedHashMultimap.create();
for (FilterEntry filterEntry : _filterEntries) {
keyToValuesMap.put(filterEntry.getName(), filterEntry.getValue());
}
return keyToValuesMap;
}
private Object getInstanceName(Instance instance) {
for (Tag tag : instance.getTags()) {
if (tag.getKey().equalsIgnoreCase("name")) {
return tag.getValue();
}
}
return null;
}
public static class FilterEntry {
private String _name;
private String _value;
public void setName(String name) {
this._name = name;
}
public String getName() {
return _name;
}
public void setValue(String value) {
this._value = value;
}
public String getValue() {
return _value;
}
@Override
public String toString() {
return Objects.toStringHelper(this).addValue(_name).addValue(_value).toString();
}
}
}