package com.sequenceiq.cloudbreak.cloud.openstack.heat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean;
import com.google.common.collect.ImmutableMap;
import com.sequenceiq.cloudbreak.api.model.InstanceGroupType;
import com.sequenceiq.cloudbreak.cloud.model.CloudInstance;
import com.sequenceiq.cloudbreak.cloud.model.Group;
import com.sequenceiq.cloudbreak.cloud.model.Image;
import com.sequenceiq.cloudbreak.cloud.model.InstanceStatus;
import com.sequenceiq.cloudbreak.cloud.model.InstanceTemplate;
import com.sequenceiq.cloudbreak.cloud.model.Location;
import com.sequenceiq.cloudbreak.cloud.model.Network;
import com.sequenceiq.cloudbreak.cloud.model.PortDefinition;
import com.sequenceiq.cloudbreak.cloud.model.Region;
import com.sequenceiq.cloudbreak.cloud.model.Security;
import com.sequenceiq.cloudbreak.cloud.model.SecurityRule;
import com.sequenceiq.cloudbreak.cloud.model.Volume;
import com.sequenceiq.cloudbreak.cloud.openstack.common.OpenStackUtils;
import com.sequenceiq.cloudbreak.cloud.openstack.view.NeutronNetworkView;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;
@RunWith(MockitoJUnitRunner.class)
public class HeatTemplateBuilderTest {
@Mock
private Configuration freemarkerConfiguration;
@Mock
private OpenStackUtils openStackUtil;
@InjectMocks
private HeatTemplateBuilder heatTemplateBuilder = new HeatTemplateBuilder();
private String stackName;
private List<Group> groups;
private String name;
private List<Volume> volumes;
private CloudInstance instance;
private List<SecurityRule> rules;
private Security security;
private Map<InstanceGroupType, String> userData;
private Image image;
@Before
public void setup() throws IOException, TemplateException {
FreeMarkerConfigurationFactoryBean factoryBean = new FreeMarkerConfigurationFactoryBean();
factoryBean.setPreferFileSystemAccess(false);
factoryBean.setTemplateLoaderPath("classpath:/");
factoryBean.afterPropertiesSet();
Configuration configuration = factoryBean.getObject();
ReflectionTestUtils.setField(heatTemplateBuilder, "freemarkerConfiguration", configuration);
ReflectionTestUtils.setField(heatTemplateBuilder, "openStackHeatTemplatePath", "templates/openstack-heat.ftl");
stackName = "testStack";
groups = new ArrayList<>();
name = "master";
volumes = Arrays.asList(new Volume("/hadoop/fs1", "HDD", 1), new Volume("/hadoop/fs2", "HDD", 1));
InstanceTemplate instanceTemplate = new InstanceTemplate("m1.medium", name, 0L, volumes, InstanceStatus.CREATE_REQUESTED,
new HashMap<>());
instance = new CloudInstance("SOME_ID", instanceTemplate);
rules = Collections.singletonList(new SecurityRule("0.0.0.0/0",
new PortDefinition[]{new PortDefinition("22", "22"), new PortDefinition("443", "443")}, "tcp"));
security = new Security(rules, null);
groups.add(new Group(name, InstanceGroupType.CORE, Collections.singletonList(instance), security, null));
userData = ImmutableMap.of(
InstanceGroupType.CORE, "CORE",
InstanceGroupType.GATEWAY, "GATEWAY"
);
image = new Image("cb-centos66-amb200-2015-05-25", userData);
}
@Test
public void buildTestWithExistingNetworkAndExistingSubnetAndAssignFloatingIp() throws Exception {
//GIVEN
boolean existingNetwork = true;
boolean existingSubnet = true;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("cb-sec-group_" + "t"));
assertThat(templateString, containsString("app_net_id"));
assertThat(templateString, not(containsString("app_network")));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, not(containsString("app_subnet")));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, containsString("public_net_id"));
}
@Test
public void buildTestWithExistingSubnetAndAssignFloatingIpWithoutExistingNetwork() throws Exception {
//GIVEN
boolean existingNetwork = false;
boolean existingSubnet = true;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("cb-sec-group_" + "t"));
assertThat(templateString, not(containsString("app_net_id")));
assertThat(templateString, containsString("app_network"));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, not(containsString("app_subnet")));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, containsString("public_net_id"));
}
@Test
public void buildTestWithExistingNetworkAndAssignFloatingIpWithoutExistingSubnet() throws Exception {
//GIVEN
boolean existingNetwork = true;
boolean existingSubnet = false;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("name: cb-sec-group_" + "t"));
assertThat(templateString, containsString("app_net_id"));
assertThat(templateString, not(containsString("app_network")));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, containsString("app_subnet"));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, containsString("public_net_id"));
}
@Test
public void buildTestWithExistingNetworkAndExistingSubnetWithoutAssignFloatingIp() throws Exception {
//GIVEN
boolean existingNetwork = true;
boolean existingSubnet = true;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView(null);
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("name: cb-sec-group_" + "t"));
assertThat(templateString, containsString("app_net_id"));
assertThat(templateString, not(containsString("app_network")));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, not(containsString("app_subnet")));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, not(containsString("public_net_id")));
}
@Test
public void buildTestWithoutExistingNetworkAndExistingSubnetAndAssignFloatingIp() throws Exception {
//GIVEN
boolean existingNetwork = false;
boolean existingSubnet = false;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView(null);
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("name: cb-sec-group_" + "t"));
assertThat(templateString, not(containsString("app_net_id")));
assertThat(templateString, containsString("app_network"));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, containsString("app_subnet"));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, not(containsString("public_net_id")));
}
@Test
public void buildTestWithExistingNetworkWithoutExistingSubnetAndAssignFloatingIp() throws Exception {
//GIVEN
boolean existingNetwork = true;
boolean existingSubnet = false;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView(null);
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("name: cb-sec-group_" + "t"));
assertThat(templateString, containsString("app_net_id"));
assertThat(templateString, not(containsString("app_network")));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, containsString("app_subnet"));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, not(containsString("public_net_id")));
}
@Test
public void buildTestWithExistingSubnetWithoutExistingNetworkAndAssignFloatingIp() throws Exception {
//GIVEN
boolean existingNetwork = false;
boolean existingSubnet = true;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView(null);
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("name: cb-sec-group_" + "t"));
assertThat(templateString, not(containsString("app_net_id")));
assertThat(templateString, containsString("app_network"));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, not(containsString("app_subnet")));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, not(containsString("public_net_id")));
}
@Test
public void buildTestWithAssignFloatingIpWithoutExistingNetworkAndExistingSubnet() throws Exception {
//GIVEN
boolean existingNetwork = false;
boolean existingSubnet = false;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, containsString("name: cb-sec-group_" + "t"));
assertThat(templateString, not(containsString("app_net_id")));
assertThat(templateString, containsString("app_network"));
assertThat(templateString, containsString("subnet_id"));
assertThat(templateString, containsString("app_subnet"));
assertThat(templateString, containsString("network_id"));
assertThat(templateString, containsString("public_net_id"));
}
@Test(expected = AssertionError.class)
public void buildTestWithExistingNetworkAndExistingSubnetAndAssignFloatingIpShouldThrowAssertionException() throws Exception {
//GIVEN
boolean existingNetwork = true;
boolean existingSubnet = true;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, not(containsString("name: cb-sec-group_" + "t")));
assertThat(templateString, not(containsString("app_net_id")));
assertThat(templateString, containsString("app_network"));
assertThat(templateString, not(containsString("subnet_id")));
assertThat(templateString, containsString("app_subnet"));
assertThat(templateString, not(containsString("network_id")));
assertThat(templateString, not(containsString("public_net_id")));
}
@Test(expected = AssertionError.class)
public void buildTestWithExistingSubnetAndAssignFloatingIpWithoutExistingNetworkShouldThrowAssertionException() throws Exception {
//GIVEN
boolean existingNetwork = false;
boolean existingSubnet = true;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, not(containsString("name: cb-sec-group_" + "t")));
assertThat(templateString, containsString("app_net_id"));
assertThat(templateString, not(containsString("app_network")));
assertThat(templateString, not(containsString("subnet_id")));
assertThat(templateString, containsString("app_subnet"));
assertThat(templateString, not(containsString("network_id")));
assertThat(templateString, not(containsString("public_net_id")));
}
@Test(expected = AssertionError.class)
public void buildTestWithExistingNetworkAndAssignFloatingIpWithoutExistingSubnetShouldThrowAssertionException() throws Exception {
//GIVEN
boolean existingNetwork = true;
boolean existingSubnet = false;
NeutronNetworkView neutronNetworkView = createNeutronNetworkView("floating_pool_id");
//WHEN
when(openStackUtil.adjustStackNameLength(Mockito.anyString())).thenReturn("t");
HeatTemplateBuilder.ModelContext modelContext = new HeatTemplateBuilder.ModelContext();
modelContext.withExistingNetwork(existingNetwork);
modelContext.withExistingSubnet(existingSubnet);
modelContext.withGroups(groups);
modelContext.withInstanceUserData(image);
modelContext.withLocation(location());
modelContext.withStackName(stackName);
modelContext.withNeutronNetworkView(neutronNetworkView);
modelContext.withTemplateString(heatTemplateBuilder.getTemplate());
String templateString = heatTemplateBuilder.build(modelContext);
//THEN
assertThat(templateString, not(containsString("name: cb-sec-group_" + "t")));
assertThat(templateString, not(containsString("app_net_id")));
assertThat(templateString, containsString("app_network"));
assertThat(templateString, not(containsString("subnet_id")));
assertThat(templateString, not(containsString("app_subnet")));
assertThat(templateString, not(containsString("network_id")));
assertThat(templateString, not(containsString("public_net_id")));
}
private NeutronNetworkView createNeutronNetworkView(String publicNetId) {
Map<String, Object> parameters = new HashMap<>();
if (publicNetId != null) {
parameters.put("publicNetId", publicNetId);
}
Network network = new Network(null, parameters);
return new NeutronNetworkView(network);
}
private Location location() {
Region r = Region.region("local");
return Location.location(r);
}
}