diff --git a/src/main/java/com/netflix/simianarmy/aws/conformity/crawler/AWSClusterCrawler.java b/src/main/java/com/netflix/simianarmy/aws/conformity/crawler/AWSClusterCrawler.java index ebec5940..2a7f4e60 100644 --- a/src/main/java/com/netflix/simianarmy/aws/conformity/crawler/AWSClusterCrawler.java +++ b/src/main/java/com/netflix/simianarmy/aws/conformity/crawler/AWSClusterCrawler.java @@ -18,11 +18,13 @@ package com.netflix.simianarmy.aws.conformity.crawler; import com.amazonaws.services.autoscaling.model.AutoScalingGroup; +import com.amazonaws.services.autoscaling.model.TagDescription; import com.amazonaws.services.autoscaling.model.Instance; import com.amazonaws.services.autoscaling.model.SuspendedProcess; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.netflix.simianarmy.basic.BasicSimianArmyContext; import com.netflix.simianarmy.MonkeyConfiguration; import com.netflix.simianarmy.client.aws.AWSClient; import com.netflix.simianarmy.conformity.Cluster; @@ -97,7 +99,19 @@ public List clusters(String... clusterNames) { conformityAsg.setSuspended(true); } } + Cluster cluster = new Cluster(asg.getAutoScalingGroupName(), region, conformityAsg); + + List tagDescriptions = asg.getTags(); + for (TagDescription tagDescription : tagDescriptions) { + if ( BasicSimianArmyContext.GLOBAL_OWNER_TAGKEY.equalsIgnoreCase(tagDescription.getKey()) ) { + String value = tagDescription.getValue(); + if (value != null) { + cluster.setOwnerEmail(value); + } + } + } + updateCluster(cluster); list.add(cluster); } @@ -143,11 +157,18 @@ public String getOwnerEmailForCluster(Cluster cluster) { String prop = String.format("%s.%s.ownerEmail", NS, cluster.getName()); String ownerEmail = cfg.getStr(prop); if (ownerEmail == null) { - LOGGER.info(String.format("No owner email is found for cluster %s in configuration" - + "please set property %s for it.", cluster.getName(), prop)); + ownerEmail = cluster.getOwnerEmail(); + if (ownerEmail == null) { + LOGGER.info(String.format("No owner email is found for cluster %s in configuration " + + "%s or tag %s.", cluster.getName(), prop, BasicSimianArmyContext.GLOBAL_OWNER_TAGKEY)); + } else { + LOGGER.info(String.format("Found owner email %s for cluster %s in tag %s.", + ownerEmail, cluster.getName(), BasicSimianArmyContext.GLOBAL_OWNER_TAGKEY)); + return ownerEmail; + } } else { - LOGGER.info(String.format("Found owner email %s for cluster %s in configuration.", - ownerEmail, cluster.getName())); + LOGGER.info(String.format("Found owner email %s for cluster %s in configuration %s.", + ownerEmail, cluster.getName(), prop)); } return ownerEmail; } diff --git a/src/test/java/com/netflix/simianarmy/aws/conformity/TestASGOwnerEmailTag.java b/src/test/java/com/netflix/simianarmy/aws/conformity/TestASGOwnerEmailTag.java new file mode 100644 index 00000000..1f85d552 --- /dev/null +++ b/src/test/java/com/netflix/simianarmy/aws/conformity/TestASGOwnerEmailTag.java @@ -0,0 +1,74 @@ +// CHECKSTYLE IGNORE Javadoc +package com.netflix.simianarmy.aws.conformity; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.amazonaws.services.autoscaling.model.AutoScalingGroup; +import com.amazonaws.services.autoscaling.model.SuspendedProcess; +import com.amazonaws.services.autoscaling.model.TagDescription; + +import com.google.common.collect.Maps; + +import com.netflix.simianarmy.aws.conformity.crawler.AWSClusterCrawler; +import com.netflix.simianarmy.basic.BasicConfiguration; +import com.netflix.simianarmy.basic.conformity.BasicConformityMonkeyContext; +import com.netflix.simianarmy.conformity.Cluster; +import com.netflix.simianarmy.client.aws.AWSClient; + +import junit.framework.Assert; +import org.testng.annotations.Test; + +import java.util.Map; +import java.util.List; +import java.util.LinkedList; +import java.util.Properties; + +public class TestASGOwnerEmailTag { + + private static final String ASG1 = "asg1"; + private static final String ASG2 = "asg2"; + private static final String OWNER_TAG_KEY = "owner"; + private static final String OWNER_TAG_VALUE = "tyler@paperstreet.com"; + private static final String REGION = "eu-west-1"; + + @Test + public void testForOwnerTag() { + Properties properties = new Properties(); + BasicConformityMonkeyContext ctx = new BasicConformityMonkeyContext(); + + List asgList = createASGList(); + String[] asgNames = {ASG1, ASG2}; + + AWSClient awsMock = createMockAWSClient(asgList, asgNames); + Map regionToAwsClient = Maps.newHashMap(); + regionToAwsClient.put("us-east-1", awsMock); + AWSClusterCrawler clusterCrawler = new AWSClusterCrawler(regionToAwsClient, new BasicConfiguration(properties)); + + List clusters = clusterCrawler.clusters(asgNames); + + Assert.assertTrue(OWNER_TAG_VALUE.equalsIgnoreCase(clusters.get(0).getOwnerEmail())); + Assert.assertNull(clusters.get(1).getOwnerEmail()); + } + + private List createASGList() { + List asgList = new LinkedList(); + asgList.add(makeASG(ASG1, OWNER_TAG_VALUE)); + asgList.add(makeASG(ASG2, null)); + return asgList; + } + + private AutoScalingGroup makeASG(String asgName, String ownerEmail) { + TagDescription tag = new TagDescription().withKey(OWNER_TAG_KEY).withValue(ownerEmail); + AutoScalingGroup asg = new AutoScalingGroup() + .withAutoScalingGroupName(asgName) + .withTags(tag); + return asg; + } + + private AWSClient createMockAWSClient(List asgList, String... asgNames) { + AWSClient awsMock = mock(AWSClient.class); + when(awsMock.describeAutoScalingGroups(asgNames)).thenReturn(asgList); + return awsMock; + } +} \ No newline at end of file