Skip to content

Commit af839cb

Browse files
committed
Merge pull request Netflix#256 from Ten48BASE/master
Redo: Adding feature to specify resource types for untaggedResource Rule
2 parents 1aaaa6d + 9796249 commit af839cb

File tree

5 files changed

+129
-6
lines changed

5 files changed

+129
-6
lines changed

src/main/java/com/netflix/simianarmy/basic/janitor/BasicJanitorMonkeyContext.java

+26-6
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ private ASGJanitor getASGJanitor() {
197197
instanceValidator
198198
));
199199
}
200-
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
200+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)
201+
&& getUntaggedRuleResourceSet().contains("ASG")) {
201202
ruleEngine.addRule(new UntaggedRule(monkeyCalendar, getPropertySet("simianarmy.janitor.rule.untaggedRule.requiredTags"),
202203
(int) configuration().getNumOrElse(
203204
"simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner", 3),
@@ -233,7 +234,9 @@ private InstanceJanitor getInstanceJanitor() {
233234
"simianarmy.janitor.rule.orphanedInstanceRule.opsworks.parentage",
234235
false)));
235236
}
236-
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
237+
238+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)
239+
&& getUntaggedRuleResourceSet().contains("INSTANCE")) {
237240
ruleEngine.addRule(new UntaggedRule(monkeyCalendar, getPropertySet("simianarmy.janitor.rule.untaggedRule.requiredTags"),
238241
(int) configuration().getNumOrElse(
239242
"simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner", 3),
@@ -269,7 +272,8 @@ && configuration().getBoolOrElse("simianarmy.janitor.rule.deleteOnTerminationRul
269272
"simianarmy.janitor.rule.deleteOnTerminationRule.retentionDays", 3)));
270273
}
271274
}
272-
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
275+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)
276+
&& getUntaggedRuleResourceSet().contains("EBS_VOLUME")) {
273277
ruleEngine.addRule(new UntaggedRule(monkeyCalendar, getPropertySet("simianarmy.janitor.rule.untaggedRule.requiredTags"),
274278
(int) configuration().getNumOrElse(
275279
"simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner", 3),
@@ -301,7 +305,8 @@ private EBSSnapshotJanitor getEBSSnapshotJanitor() {
301305
configuration().getStrOrElse(
302306
"simianarmy.janitor.rule.noGeneratedAMIRule.ownerEmail", null)));
303307
}
304-
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
308+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)
309+
&& getUntaggedRuleResourceSet().contains("EBS_SNAPSHOT")) {
305310
ruleEngine.addRule(new UntaggedRule(monkeyCalendar, getPropertySet("simianarmy.janitor.rule.untaggedRule.requiredTags"),
306311
(int) configuration().getNumOrElse(
307312
"simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner", 3),
@@ -333,7 +338,8 @@ private LaunchConfigJanitor getLaunchConfigJanitor() {
333338
(int) configuration().getNumOrElse(
334339
"simianarmy.janitor.rule.oldUnusedLaunchConfigRule.retentionDays", 3)));
335340
}
336-
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
341+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)
342+
&& getUntaggedRuleResourceSet().contains("LAUNCH_CONFIG")) {
337343
ruleEngine.addRule(new UntaggedRule(monkeyCalendar, getPropertySet("simianarmy.janitor.rule.untaggedRule.requiredTags"),
338344
(int) configuration().getNumOrElse(
339345
"simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner", 3),
@@ -374,7 +380,8 @@ private ImageJanitor getImageJanitor() {
374380
(int) configuration().getNumOrElse(
375381
"simianarmy.janitor.rule.unusedImageRule.lastReferenceDaysThreshold", 45)));
376382
}
377-
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
383+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)
384+
&& getUntaggedRuleResourceSet().contains("IMAGE")) {
378385
ruleEngine.addRule(new UntaggedRule(monkeyCalendar, getPropertySet("simianarmy.janitor.rule.untaggedRule.requiredTags"),
379386
(int) configuration().getNumOrElse(
380387
"simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner", 3),
@@ -407,6 +414,19 @@ private Set<String> getEnabledResourceSet() {
407414
return enabledResourceSet;
408415
}
409416

417+
private Set<String> getUntaggedRuleResourceSet() {
418+
Set<String> untaggedRuleResourceSet = new HashSet<String>();
419+
if (configuration().getBoolOrElse("simianarmy.janitor.rule.untaggedRule.enabled", false)) {
420+
String untaggedRuleResources = configuration().getStr("simianarmy.janitor.rule.untaggedRule.resources");
421+
if (StringUtils.isNotBlank(untaggedRuleResources)) {
422+
for (String resourceType : untaggedRuleResources.split(",")) {
423+
untaggedRuleResourceSet.add(resourceType.trim().toUpperCase());
424+
}
425+
}
426+
}
427+
return untaggedRuleResourceSet;
428+
}
429+
410430
private Set<String> getPropertySet(String property) {
411431
Set<String> propertyValueSet = new HashSet<String>();
412432
String propertyValue = configuration().getStr(property);

src/main/java/com/netflix/simianarmy/basic/janitor/BasicJanitorRuleEngine.java

+6
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,10 @@ public BasicJanitorRuleEngine addRule(Rule rule) {
9898
rules.add(rule);
9999
return this;
100100
}
101+
102+
/** {@inheritDoc} */
103+
@Override
104+
public List<Rule> getRules() {
105+
return this.rules;
106+
}
101107
}

src/main/java/com/netflix/simianarmy/janitor/JanitorRuleEngine.java

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package com.netflix.simianarmy.janitor;
2020

2121
import com.netflix.simianarmy.Resource;
22+
import java.util.List;
2223

2324
/**
2425
* The interface for janitor rule engine that can decide if a resource should be a candidate of cleanup
@@ -44,4 +45,11 @@ public interface JanitorRuleEngine {
4445
* @return The JanitorRuleEngine object.
4546
*/
4647
JanitorRuleEngine addRule(Rule rule);
48+
49+
/**
50+
* Get rules to find out what's planned for enforcement.
51+
*
52+
* @return An ArrayList of Rules.
53+
*/
54+
List<Rule> getRules();
4755
}

src/main/resources/janitor.properties

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ simianarmy.janitor.rule.orphanedInstanceRule.opsworks.parentage = false
6767
simianarmy.janitor.rule.untaggedRule.enabled = false
6868
# List of tags that are required for each resource
6969
simianarmy.janitor.rule.untaggedRule.requiredTags = owner, purpose, project
70+
# List of resource types that require tags
71+
simianarmy.janitor.rule.untaggedRule.resources = Instance, ASG, EBS_Volume, EBS_Snapshot
7072
# The number of business days the resource is kept after a notification is sent for the deletion
7173
# when the resource has an owner.
7274
simianarmy.janitor.rule.untaggedRule.retentionDaysWithOwner = 2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.netflix.simianarmy.basic.janitor;
2+
3+
import com.netflix.simianarmy.aws.janitor.rule.generic.UntaggedRule;
4+
import com.netflix.simianarmy.basic.TestBasicCalendar;
5+
import com.netflix.simianarmy.janitor.JanitorRuleEngine;
6+
import com.netflix.simianarmy.janitor.Rule;
7+
8+
import org.apache.commons.lang.StringUtils;
9+
10+
import org.testng.Assert;
11+
import org.testng.annotations.BeforeMethod;
12+
import org.testng.annotations.Test;
13+
14+
import java.util.Arrays;
15+
import java.util.HashSet;
16+
import java.util.Set;
17+
18+
/**
19+
* The basic implementation of the context class for Janitor monkey.
20+
*/
21+
public class TestBasicJanitorMonkeyContext {
22+
23+
private static final int SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RETENTIONDAYSWITHOWNER = 3;
24+
25+
private static final int SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RETENTIONDAYSWITHOUTOWNER = 8;
26+
27+
private static final Boolean SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_ENABLED = true;
28+
29+
private static final Set<String> SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_REQUIREDTAGS = new HashSet<String>(Arrays.asList("owner", "costcenter"));
30+
31+
private static final String SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RESOURCES = "Instance";
32+
33+
private String monkeyRegion;
34+
35+
private TestBasicCalendar monkeyCalendar;
36+
37+
public TestBasicJanitorMonkeyContext() {
38+
super();
39+
}
40+
41+
@BeforeMethod
42+
public void before() {
43+
monkeyRegion = "us-east-1";
44+
monkeyCalendar = new TestBasicCalendar();
45+
}
46+
47+
@Test
48+
public void testAddRuleWithUntaggedRuleResource() {
49+
JanitorRuleEngine ruleEngine = new BasicJanitorRuleEngine();
50+
Boolean untaggedRuleEnabled = new Boolean(true);
51+
52+
Rule rule = new UntaggedRule(monkeyCalendar, SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_REQUIREDTAGS,
53+
SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RETENTIONDAYSWITHOWNER,
54+
SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RETENTIONDAYSWITHOUTOWNER);
55+
if (untaggedRuleEnabled && getUntaggedRuleResourceSet().contains("INSTANCE")) {
56+
ruleEngine.addRule(rule);
57+
}
58+
Assert.assertTrue(ruleEngine.getRules().contains(rule));
59+
}
60+
61+
@Test
62+
public void testAddRuleWithoutUntaggedRuleResource() {
63+
JanitorRuleEngine ruleEngine = new BasicJanitorRuleEngine();
64+
Boolean untaggedRuleEnabled = new Boolean(true);
65+
66+
Rule rule = new UntaggedRule(monkeyCalendar, SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_REQUIREDTAGS,
67+
SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RETENTIONDAYSWITHOWNER,
68+
SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RETENTIONDAYSWITHOUTOWNER);
69+
if (untaggedRuleEnabled && getUntaggedRuleResourceSet().contains("ASG")) {
70+
ruleEngine.addRule(rule);
71+
}
72+
Assert.assertFalse(ruleEngine.getRules().contains(rule));
73+
}
74+
75+
private Set<String> getUntaggedRuleResourceSet() {
76+
Set<String> untaggedRuleResourceSet = new HashSet<String>();
77+
if (SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_ENABLED) {
78+
String untaggedRuleResources = SIMIANARMY_JANITOR_RULE_UNTAGGEDRULE_RESOURCES;
79+
if (StringUtils.isNotBlank(untaggedRuleResources)) {
80+
for (String resourceType : untaggedRuleResources.split(",")) {
81+
untaggedRuleResourceSet.add(resourceType.trim().toUpperCase());
82+
}
83+
}
84+
}
85+
return untaggedRuleResourceSet;
86+
}
87+
}

0 commit comments

Comments
 (0)