Skip to content

Commit 2d263a7

Browse files
committed
Merge pull request Netflix#257 from Ten48BASE/master
Make Conformity Monkey Notify Based on owner tag value
2 parents af839cb + 541d75e commit 2d263a7

File tree

2 files changed

+99
-4
lines changed

2 files changed

+99
-4
lines changed

src/main/java/com/netflix/simianarmy/aws/conformity/crawler/AWSClusterCrawler.java

+25-4
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
package com.netflix.simianarmy.aws.conformity.crawler;
1919

2020
import com.amazonaws.services.autoscaling.model.AutoScalingGroup;
21+
import com.amazonaws.services.autoscaling.model.TagDescription;
2122
import com.amazonaws.services.autoscaling.model.Instance;
2223
import com.amazonaws.services.autoscaling.model.SuspendedProcess;
2324
import com.google.common.collect.Lists;
2425
import com.google.common.collect.Maps;
2526
import com.google.common.collect.Sets;
27+
import com.netflix.simianarmy.basic.BasicSimianArmyContext;
2628
import com.netflix.simianarmy.MonkeyConfiguration;
2729
import com.netflix.simianarmy.client.aws.AWSClient;
2830
import com.netflix.simianarmy.conformity.Cluster;
@@ -97,7 +99,19 @@ public List<Cluster> clusters(String... clusterNames) {
9799
conformityAsg.setSuspended(true);
98100
}
99101
}
102+
100103
Cluster cluster = new Cluster(asg.getAutoScalingGroupName(), region, conformityAsg);
104+
105+
List<TagDescription> tagDescriptions = asg.getTags();
106+
for (TagDescription tagDescription : tagDescriptions) {
107+
if ( BasicSimianArmyContext.GLOBAL_OWNER_TAGKEY.equalsIgnoreCase(tagDescription.getKey()) ) {
108+
String value = tagDescription.getValue();
109+
if (value != null) {
110+
cluster.setOwnerEmail(value);
111+
}
112+
}
113+
}
114+
101115
updateCluster(cluster);
102116
list.add(cluster);
103117
}
@@ -143,11 +157,18 @@ public String getOwnerEmailForCluster(Cluster cluster) {
143157
String prop = String.format("%s.%s.ownerEmail", NS, cluster.getName());
144158
String ownerEmail = cfg.getStr(prop);
145159
if (ownerEmail == null) {
146-
LOGGER.info(String.format("No owner email is found for cluster %s in configuration"
147-
+ "please set property %s for it.", cluster.getName(), prop));
160+
ownerEmail = cluster.getOwnerEmail();
161+
if (ownerEmail == null) {
162+
LOGGER.info(String.format("No owner email is found for cluster %s in configuration "
163+
+ "%s or tag %s.", cluster.getName(), prop, BasicSimianArmyContext.GLOBAL_OWNER_TAGKEY));
164+
} else {
165+
LOGGER.info(String.format("Found owner email %s for cluster %s in tag %s.",
166+
ownerEmail, cluster.getName(), BasicSimianArmyContext.GLOBAL_OWNER_TAGKEY));
167+
return ownerEmail;
168+
}
148169
} else {
149-
LOGGER.info(String.format("Found owner email %s for cluster %s in configuration.",
150-
ownerEmail, cluster.getName()));
170+
LOGGER.info(String.format("Found owner email %s for cluster %s in configuration %s.",
171+
ownerEmail, cluster.getName(), prop));
151172
}
152173
return ownerEmail;
153174
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// CHECKSTYLE IGNORE Javadoc
2+
package com.netflix.simianarmy.aws.conformity;
3+
4+
import static org.mockito.Mockito.mock;
5+
import static org.mockito.Mockito.when;
6+
7+
import com.amazonaws.services.autoscaling.model.AutoScalingGroup;
8+
import com.amazonaws.services.autoscaling.model.SuspendedProcess;
9+
import com.amazonaws.services.autoscaling.model.TagDescription;
10+
11+
import com.google.common.collect.Maps;
12+
13+
import com.netflix.simianarmy.aws.conformity.crawler.AWSClusterCrawler;
14+
import com.netflix.simianarmy.basic.BasicConfiguration;
15+
import com.netflix.simianarmy.basic.conformity.BasicConformityMonkeyContext;
16+
import com.netflix.simianarmy.conformity.Cluster;
17+
import com.netflix.simianarmy.client.aws.AWSClient;
18+
19+
import junit.framework.Assert;
20+
import org.testng.annotations.Test;
21+
22+
import java.util.Map;
23+
import java.util.List;
24+
import java.util.LinkedList;
25+
import java.util.Properties;
26+
27+
public class TestASGOwnerEmailTag {
28+
29+
private static final String ASG1 = "asg1";
30+
private static final String ASG2 = "asg2";
31+
private static final String OWNER_TAG_KEY = "owner";
32+
private static final String OWNER_TAG_VALUE = "tyler@paperstreet.com";
33+
private static final String REGION = "eu-west-1";
34+
35+
@Test
36+
public void testForOwnerTag() {
37+
Properties properties = new Properties();
38+
BasicConformityMonkeyContext ctx = new BasicConformityMonkeyContext();
39+
40+
List<AutoScalingGroup> asgList = createASGList();
41+
String[] asgNames = {ASG1, ASG2};
42+
43+
AWSClient awsMock = createMockAWSClient(asgList, asgNames);
44+
Map<String, AWSClient> regionToAwsClient = Maps.newHashMap();
45+
regionToAwsClient.put("us-east-1", awsMock);
46+
AWSClusterCrawler clusterCrawler = new AWSClusterCrawler(regionToAwsClient, new BasicConfiguration(properties));
47+
48+
List<Cluster> clusters = clusterCrawler.clusters(asgNames);
49+
50+
Assert.assertTrue(OWNER_TAG_VALUE.equalsIgnoreCase(clusters.get(0).getOwnerEmail()));
51+
Assert.assertNull(clusters.get(1).getOwnerEmail());
52+
}
53+
54+
private List<AutoScalingGroup> createASGList() {
55+
List<AutoScalingGroup> asgList = new LinkedList<AutoScalingGroup>();
56+
asgList.add(makeASG(ASG1, OWNER_TAG_VALUE));
57+
asgList.add(makeASG(ASG2, null));
58+
return asgList;
59+
}
60+
61+
private AutoScalingGroup makeASG(String asgName, String ownerEmail) {
62+
TagDescription tag = new TagDescription().withKey(OWNER_TAG_KEY).withValue(ownerEmail);
63+
AutoScalingGroup asg = new AutoScalingGroup()
64+
.withAutoScalingGroupName(asgName)
65+
.withTags(tag);
66+
return asg;
67+
}
68+
69+
private AWSClient createMockAWSClient(List<AutoScalingGroup> asgList, String... asgNames) {
70+
AWSClient awsMock = mock(AWSClient.class);
71+
when(awsMock.describeAutoScalingGroups(asgNames)).thenReturn(asgList);
72+
return awsMock;
73+
}
74+
}

0 commit comments

Comments
 (0)