package org.ovirt.engine.core.vdsbroker.vdsbroker;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.stringContainsInOrder;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.VmInit;
import org.ovirt.engine.core.common.businessentities.VmInitNetwork;
import org.ovirt.engine.core.common.businessentities.network.Ipv4BootProtocol;
import org.ovirt.engine.core.common.businessentities.network.Ipv6BootProtocol;
import org.ovirt.engine.core.utils.JsonHelper;
public class CloudInitHandlerTest {
private static final String IFACE_NAME = "iface name";
private static final String IPV4_ADDRESS = "ipv4 address";
private static final String IPV4_NETMASK = "ipv4 netmask";
private static final String IPV4_GATEWAY = "ipv4 gateway";
private static final String IPV6_ADDRESS = "ipv6 address";
private static final int IPV6_PREFIX = 666;
private static final String IPV6_GATEWAY = "ipv6 gateway";
private static final String DNS_SERVERS = "dns servers";
private static final String DNS_SEARCH = "dns search";
private VmInit vmInit;
private CloudInitHandler underTest;
@Before
public void setUp() {
vmInit = new VmInit();
underTest = new CloudInitHandler(vmInit);
}
@Test
public void testGetFileDataStoreNoNetwork() throws IOException {
final Map<String, byte[]> actual = underTest.getFileData();
final Map<String, Object> actualMetaData = parseResult(actual);
assertThat(actualMetaData, not(hasKey("network_config")));
assertThat(actualMetaData, not(hasKey("network-interfaces")));
}
@Test
public void testGetFileDataStoreNetwork() throws IOException {
vmInit.setNetworks(singletonList(createVmInitNetwork()));
final Map<String, byte[]> actual = underTest.getFileData();
final Map<String, Object> actualMetaData = parseResult(actual);
assertNetworkConfig(actualMetaData);
assertNetworkInterfaces(actualMetaData);
}
@Test
public void testGetFileDataStoreDns() throws IOException {
vmInit.setNetworks(singletonList(createVmInitNetwork()));
vmInit.setDnsServers(DNS_SERVERS);
vmInit.setDnsSearch(DNS_SEARCH);
final Map<String, byte[]> actual = underTest.getFileData();
final Map<String, Object> actualMetaData = parseResult(actual);
assertDnsProperties(actualMetaData);
}
private void assertDnsProperties(Map<String, Object> actualMetaData) {
assertThat(actualMetaData, hasKey("network-interfaces"));
final String networkInterfaces = (String) actualMetaData.get("network-interfaces");
assertThat(networkInterfaces, stringContainsInOrder(asList(
"iface " + IFACE_NAME + " inet static\n",
" dns-nameservers " + DNS_SERVERS + "\n",
" dns-search " + DNS_SEARCH + "\n",
"iface " + IFACE_NAME + " inet6 static\n")));
}
private void assertNetworkConfig(Map<String, Object> metaData) {
@SuppressWarnings("unchecked")
final Map<String, String> networkConfig = (Map<String, String>) metaData.get("network_config");
assertThat(networkConfig, hasEntry("path", "/etc/network/interfaces"));
assertThat(networkConfig, hasEntry("content_path", "/content/0000"));
}
private void assertNetworkInterfaces(Map<String, Object> actualMetaData) {
assertThat(actualMetaData, hasKey("network-interfaces"));
final String networkInterfaces = (String) actualMetaData.get("network-interfaces");
assertThat(networkInterfaces, stringContainsInOrder(asList(
"iface " + IFACE_NAME + " inet static\n",
" address " + IPV4_ADDRESS + "\n",
" netmask " + IPV4_NETMASK + "\n",
" gateway " + IPV4_GATEWAY + "\n",
"iface " + IFACE_NAME + " inet6 static\n",
" address " + IPV6_ADDRESS + "\n",
" netmask " + IPV6_PREFIX + "\n",
" gateway " + IPV6_GATEWAY + "\n")));
}
private Map<String, Object> parseResult(Map<String, byte[]> actual) throws IOException {
final byte[] actualJson = actual.get("openstack/latest/meta_data.json");
final String jsonString = new String(actualJson, "US-ASCII");
return JsonHelper.jsonToMap(jsonString);
}
private VmInitNetwork createVmInitNetwork() {
final VmInitNetwork vmInitNetwork = new VmInitNetwork();
vmInitNetwork.setName(IFACE_NAME);
vmInitNetwork.setBootProtocol(Ipv4BootProtocol.STATIC_IP);
vmInitNetwork.setIp(IPV4_ADDRESS);
vmInitNetwork.setNetmask(IPV4_NETMASK);
vmInitNetwork.setGateway(IPV4_GATEWAY);
vmInitNetwork.setIpv6BootProtocol(Ipv6BootProtocol.STATIC_IP);
vmInitNetwork.setIpv6Address(IPV6_ADDRESS);
vmInitNetwork.setIpv6Prefix(IPV6_PREFIX);
vmInitNetwork.setIpv6Gateway(IPV6_GATEWAY);
return vmInitNetwork;
}
}