// CHECKSTYLE IGNORE Javadoc
/*
*
* Copyright 2012 Netflix, Inc.
*
* 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 com.netflix.simianarmy.aws.janitor.crawler;
import com.amazonaws.services.autoscaling.model.AutoScalingGroup;
import com.amazonaws.services.autoscaling.model.LaunchConfiguration;
import com.google.common.collect.Lists;
import com.netflix.simianarmy.Resource;
import com.netflix.simianarmy.aws.AWSResourceType;
import com.netflix.simianarmy.client.aws.AWSClient;
import org.apache.commons.lang.Validate;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.EnumSet;
import java.util.List;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class TestLaunchConfigJanitorCrawler {
@Test
public void testResourceTypes() {
int n = 2;
String[] lcNames = {"launchConfig1", "launchConfig2"};
LaunchConfigJanitorCrawler crawler = new LaunchConfigJanitorCrawler(createMockAWSClient(
createASGList(n), createLaunchConfigList(n), lcNames));
EnumSet<?> types = crawler.resourceTypes();
Assert.assertEquals(types.size(), 1);
Assert.assertEquals(types.iterator().next().name(), "LAUNCH_CONFIG");
}
@Test
public void testInstancesWithNullNames() {
int n = 2;
List<LaunchConfiguration> lcList = createLaunchConfigList(n);
LaunchConfigJanitorCrawler crawler = new LaunchConfigJanitorCrawler(createMockAWSClient(
createASGList(n), lcList));
List<Resource> resources = crawler.resources();
verifyLaunchConfigList(resources, lcList);
}
@Test
public void testInstancesWithNames() {
int n = 2;
String[] lcNames = {"launchConfig1", "launchConfig2"};
List<LaunchConfiguration> lcList = createLaunchConfigList(n);
LaunchConfigJanitorCrawler crawler = new LaunchConfigJanitorCrawler(createMockAWSClient(
createASGList(n), lcList, lcNames));
List<Resource> resources = crawler.resources(lcNames);
verifyLaunchConfigList(resources, lcList);
}
@Test
public void testInstancesWithResourceType() {
int n = 2;
List<LaunchConfiguration> lcList = createLaunchConfigList(n);
LaunchConfigJanitorCrawler crawler = new LaunchConfigJanitorCrawler(createMockAWSClient(
createASGList(n), lcList));
for (AWSResourceType resourceType : AWSResourceType.values()) {
List<Resource> resources = crawler.resources(resourceType);
if (resourceType == AWSResourceType.LAUNCH_CONFIG) {
verifyLaunchConfigList(resources, lcList);
} else {
Assert.assertTrue(resources.isEmpty());
}
}
}
private void verifyLaunchConfigList(List<Resource> resources, List<LaunchConfiguration> lcList) {
Assert.assertEquals(resources.size(), lcList.size());
for (int i = 0; i < resources.size(); i++) {
LaunchConfiguration lc = lcList.get(i);
if (i % 2 == 0) {
verifyLaunchConfig(resources.get(i), lc.getLaunchConfigurationName(), true);
} else {
verifyLaunchConfig(resources.get(i), lc.getLaunchConfigurationName(), null);
}
}
}
private void verifyLaunchConfig(Resource launchConfig, String lcName, Boolean usedByASG) {
Assert.assertEquals(launchConfig.getResourceType(), AWSResourceType.LAUNCH_CONFIG);
Assert.assertEquals(launchConfig.getId(), lcName);
Assert.assertEquals(launchConfig.getRegion(), "us-east-1");
if (usedByASG != null) {
Assert.assertEquals(launchConfig.getAdditionalField(
LaunchConfigJanitorCrawler.LAUNCH_CONFIG_FIELD_USED_BY_ASG), usedByASG.toString());
}
}
private AWSClient createMockAWSClient(List<AutoScalingGroup> asgList,
List<LaunchConfiguration> lcList, String... lcNames) {
AWSClient awsMock = mock(AWSClient.class);
when(awsMock.describeAutoScalingGroups()).thenReturn(asgList);
when(awsMock.describeLaunchConfigurations(lcNames)).thenReturn(lcList);
when(awsMock.region()).thenReturn("us-east-1");
return awsMock;
}
private List<LaunchConfiguration> createLaunchConfigList(int n) {
List<LaunchConfiguration> lcList = Lists.newArrayList();
for (int i = 1; i <= n; i++) {
lcList.add(mkLaunchConfig("launchConfig" + i));
}
return lcList;
}
private LaunchConfiguration mkLaunchConfig(String lcName) {
return new LaunchConfiguration().withLaunchConfigurationName(lcName);
}
private List<AutoScalingGroup> createASGList(int n) {
Validate.isTrue(n > 0);
List<AutoScalingGroup> asgList = Lists.newArrayList();
for (int i = 1; i <= n; i += 2) {
asgList.add(mkASG("asg" + i, "launchConfig" + i));
}
return asgList;
}
private AutoScalingGroup mkASG(String asgName, String lcName) {
return new AutoScalingGroup().withAutoScalingGroupName(asgName).withLaunchConfigurationName(lcName);
}
}