From 698f67a31aa02fe0ce6f2375b8a6d3f30d0a7b0f Mon Sep 17 00:00:00 2001 From: kimchy Date: Thu, 16 Dec 2010 05:14:49 +0200 Subject: [PATCH] EC2 Discover: Support filtering instances by tags, closes #551. --- .../ec2/AwsEc2UnicastHostsProvider.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/plugins/cloud/aws/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2UnicastHostsProvider.java b/plugins/cloud/aws/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2UnicastHostsProvider.java index c3643a5d476..3ddbfd379c6 100644 --- a/plugins/cloud/aws/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2UnicastHostsProvider.java +++ b/plugins/cloud/aws/src/main/java/org/elasticsearch/discovery/ec2/AwsEc2UnicastHostsProvider.java @@ -23,6 +23,7 @@ import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.model.*; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.collect.ImmutableMap; import org.elasticsearch.common.collect.ImmutableSet; import org.elasticsearch.common.collect.Lists; import org.elasticsearch.common.collect.Sets; @@ -35,6 +36,7 @@ import org.elasticsearch.discovery.zen.ping.unicast.UnicastHostsProvider; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -57,6 +59,8 @@ public class AwsEc2UnicastHostsProvider extends AbstractComponent implements Uni private final ImmutableSet groups; + private final ImmutableMap tags; + private final ImmutableSet availabilityZones; private final HostType hostType; @@ -71,6 +75,8 @@ public class AwsEc2UnicastHostsProvider extends AbstractComponent implements Uni this.bindAnyGroup = componentSettings.getAsBoolean("any_group", true); this.groups = ImmutableSet.copyOf(componentSettings.getAsArray("groups")); + this.tags = componentSettings.getByPrefix("tag.").getAsMap(); + Set availabilityZones = Sets.newHashSet(componentSettings.getAsArray("availability_zones")); if (componentSettings.get("availability_zones") != null) { availabilityZones.addAll(Strings.commaDelimitedListToSet(componentSettings.get("availability_zones"))); @@ -110,6 +116,33 @@ public class AwsEc2UnicastHostsProvider extends AbstractComponent implements Uni continue; } } + // see if we need to filter by tags + boolean filterByTag = false; + if (!tags.isEmpty()) { + if (instance.getTags() == null) { + filterByTag = true; + } else { + // check that all tags listed are there on the instance + for (Map.Entry entry : tags.entrySet()) { + boolean found = false; + for (Tag tag : instance.getTags()) { + if (entry.getKey().equals(tag.getKey()) && entry.getValue().equals(tag.getValue())) { + found = true; + break; + } + } + if (!found) { + filterByTag = true; + break; + } + } + } + } + if (filterByTag) { + logger.trace("filtering out instance {} based tags {}, not part of {}", instance.getInstanceId(), tags, instance.getTags()); + continue; + } + InstanceState state = instance.getState(); if (state.getName().equalsIgnoreCase("pending") || state.getName().equalsIgnoreCase("running")) { String address = null;