package org.ovirt.engine.core.bll.network.host;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.ovirt.engine.core.bll.network.host.UnmanagedNetworkValidator.LABEL;
import static org.ovirt.engine.core.bll.network.host.UnmanagedNetworkValidator.NETWORK;
import static org.ovirt.engine.core.bll.network.host.UnmanagedNetworkValidator.NIC;
import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.businessentities.BusinessEntityMap;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment;
import org.ovirt.engine.core.common.businessentities.network.Nic;
import org.ovirt.engine.core.common.businessentities.network.NicLabel;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface.NetworkImplementationDetails;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.utils.ReplacementUtils;
@RunWith(MockitoJUnitRunner.class)
public class UnmanagedNetworkValidatorTest {
private UnmanagedNetworkValidator validator = new UnmanagedNetworkValidator();
@Test
public void testFilterNicsWithUnmanagedNetworks(){
VdsNetworkInterface nicManaged = createNicWithNetworkImplementationDetails("eth0", true);
VdsNetworkInterface nicUnmanaged = createNicWithNetworkImplementationDetails("eth1", false);
List<VdsNetworkInterface> existingInterfaces = Arrays.asList(nicManaged, nicUnmanaged);
Set<String> unmanagedNicsSet = validator.filterNicsWithUnmanagedNetworks(existingInterfaces, Collections.emptySet());
assertEquals(1, unmanagedNicsSet.size());
assertTrue(unmanagedNicsSet.contains("eth1"));
}
@Test
public void testFilterNicsWithUnmanagedNetworksNetworkImplementationDetailsIsNull(){
VdsNetworkInterface nicWithNetworkImplementationsDetailsNull = createNic("eth1");
List<VdsNetworkInterface> existingInterfaces = Collections.singletonList(nicWithNetworkImplementationsDetailsNull);
Set<String> unmanagedNicsSet = validator.filterNicsWithUnmanagedNetworks(existingInterfaces, Collections.emptySet());
assertTrue(unmanagedNicsSet.isEmpty());
}
public void testFilterNicsWithUnmanagedNetworksUmngmtNetRemoved(){
VdsNetworkInterface nicWithUnmanagedToBeRemoved = createNicWithNetworkImplementationDetails("eth_unmanaged1_toBeRemoved", false);
VdsNetworkInterface nicWithUnmanaged = createNicWithNetworkImplementationDetails("eth_unmanaged", false);
VdsNetworkInterface nicWithManagedToBeRemoved = createNicWithNetworkImplementationDetails("eth_managed_toBeRemoved", true);
VdsNetworkInterface nicWithManaged = createNicWithNetworkImplementationDetails("eth_managed", true);
List<VdsNetworkInterface> existingInterfaces = Arrays.asList(nicWithUnmanagedToBeRemoved, nicWithUnmanaged, nicWithManagedToBeRemoved, nicWithManaged);
Collection<String> removedUnmanagedNetworks = Arrays.asList("eth_unmanaged1_toBeRemoved", "eth_managed_toBeRemoved");
Set<String> unmanagedNicsSet = validator.filterNicsWithUnmanagedNetworks(existingInterfaces, removedUnmanagedNetworks);
assertEquals(1, unmanagedNicsSet.size());
assertTrue(unmanagedNicsSet.contains("eth_unmanaged"));
}
@Test
public void testValidateLabels(){
String nicWithUnmanagedNetwork = "eth_unmanaged";
NicLabel label = new NicLabel(null, "eth1", "label1");
NicLabel labelWithUnmanagedNetwork = new NicLabel(null, nicWithUnmanagedNetwork, "labelOnUnmanaged");
Collection<NicLabel> labels = Arrays.asList(label, labelWithUnmanagedNetwork);
ValidationResult result = validator.validateLabels(nicWithUnmanagedNetwork, labels);
assertThat(result,
failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_LABEL_ON_UNMANAGED_NETWORK,
ReplacementUtils.createSetVariableString(LABEL, "labelOnUnmanaged"),
ReplacementUtils.createSetVariableString(NIC, "eth_unmanaged")));
NicLabel labelWithoutUnmanaged = new NicLabel(null, "eth_other", "label1");
Collection<NicLabel> labelsNotOnUnmanagedNetwork = Collections.singletonList(labelWithoutUnmanaged);
result = validator.validateLabels(nicWithUnmanagedNetwork, labelsNotOnUnmanagedNetwork);
assertTrue(result.isValid());
}
@Test
public void testValidateLabelsForVlan(){
Nic nic = createNic("eth0");
NicLabel label = new NicLabel(null, "eth1", "label1");
NicLabel labelWithUnmanagedNetwork = new NicLabel(null, "eth0", "labelOnUnmanaged");
Collection<NicLabel> labels = Arrays.asList(label, labelWithUnmanagedNetwork);
VdsNetworkInterface vlanNic = createVlanNic(nic, "eth0.100", 100, false);
List<VdsNetworkInterface> existingInterfaces = Collections.singletonList(vlanNic);
Set<String> nicsWithUnmanagedNetworks = validator.filterNicsWithUnmanagedNetworks(existingInterfaces, Collections.emptySet());
assertEquals(1, nicsWithUnmanagedNetworks.size());
String vlanNicName = nicsWithUnmanagedNetworks.iterator().next();
ValidationResult result = validator.validateLabels(vlanNicName, labels);
assertThat(result,
failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_LABEL_ON_UNMANAGED_NETWORK,
ReplacementUtils.createSetVariableString(LABEL, "labelOnUnmanaged"),
ReplacementUtils.createSetVariableString(NIC, "eth0")));
NicLabel labelWithoutUnmanaged = new NicLabel(null, "eth_other", "label1");
Collection<NicLabel> labelsNotOnUnmanagedNetwork = Collections.singletonList(labelWithoutUnmanaged);
result = validator.validateLabels(vlanNicName, labelsNotOnUnmanagedNetwork);
assertTrue(result.isValid());
}
@Test
public void testValidateAttachements(){
String unmanagedNicName = "eth0";
NetworkAttachment attachement1 = new NetworkAttachment();
attachement1.setNetworkName("network1");
attachement1.setNicName(unmanagedNicName);
NetworkAttachment attachement2 = new NetworkAttachment();
attachement2.setNetworkName("any2");
attachement2.setNicName("eth1");
List<NetworkAttachment> attachementList = Arrays.asList(attachement1, attachement2);
Nic unmgmtNic = createNicWithNetworkImplementationDetails(unmanagedNicName, false);
List<VdsNetworkInterface> existingInterfaces = Collections.singletonList(unmgmtNic);
Set<String> nicsWithUnmanagedNetworks = validator.filterNicsWithUnmanagedNetworks(existingInterfaces, Collections.emptySet());
assertEquals(1, nicsWithUnmanagedNetworks.size());
String filteredNicName = nicsWithUnmanagedNetworks.iterator().next();
assertEquals(unmanagedNicName, filteredNicName);
ValidationResult result = validator.validateAttachements(filteredNicName, attachementList);
assertThat(result,
failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_ATTACHEMENT_ON_UNMANAGED_NETWORK,
ReplacementUtils.createSetVariableString(NETWORK, "network1"),
ReplacementUtils.createSetVariableString(NIC, "eth0")));
result = validator.validateAttachements("eth7", attachementList);
assertTrue(result.isValid());
}
@Test
public void testValidateAttachementsForVlans(){
String unmanagedBaseNicName = "eth0";
NetworkAttachment attachement1 = new NetworkAttachment();
attachement1.setNetworkName("network1");
attachement1.setNicName(unmanagedBaseNicName);
NetworkAttachment attachement2 = new NetworkAttachment();
attachement2.setNetworkName("any2");
attachement2.setNicName("eth1");
List<NetworkAttachment> attachementList = Arrays.asList(attachement1, attachement2);
Nic nic = createNic(unmanagedBaseNicName);
VdsNetworkInterface vlanNic = createVlanNic(nic, "eth0.100", 100, false);
List<VdsNetworkInterface> existingInterfaces = Collections.singletonList(vlanNic);
Set<String> nicsWithUnmanagedNetworks = validator.filterNicsWithUnmanagedNetworks(existingInterfaces, Collections.emptySet());
assertEquals(1, nicsWithUnmanagedNetworks.size());
String filteredNicName = nicsWithUnmanagedNetworks.iterator().next();
assertEquals(unmanagedBaseNicName, filteredNicName);
ValidationResult result = validator.validateAttachements(filteredNicName, attachementList);
assertThat(result,
failsWith(EngineMessage.ACTION_TYPE_FAILED_HOST_NETWORK_ATTACHEMENT_ON_UNMANAGED_NETWORK,
ReplacementUtils.createSetVariableString(NETWORK, "network1"),
ReplacementUtils.createSetVariableString(NIC, "eth0")));
result = validator.validateAttachements("eth7", attachementList);
assertTrue(result.isValid());
}
@Test
public void testValidateRemovedUnmanagedNetworks(){
String networkName = "networkName";
Nic nic = createNicWithNetworkImplementationDetails("eth0", false);
nic.setNetworkName(networkName);
Network network = new Network();
network.setName(networkName);
ValidationResult result = validator.validateRemovedUnmanagedNetworks(
Collections.singletonList(networkName),
Collections.singletonList(nic),
new BusinessEntityMap<>(Collections.emptySet()));
assertTrue(result.isValid());
result = validator.validateRemovedUnmanagedNetworks(
Collections.singletonList(networkName),
Collections.singletonList(nic),
new BusinessEntityMap<>(Collections.singletonList(network)));
assertThat(result,
failsWith(EngineMessage.REMOVED_UNMANAGED_NETWORK_IS_A_CLUSTER_NETWORK,
ReplacementUtils.createSetVariableString(NETWORK, networkName)));
String unmanagedNetworkNotPresentOnAnyNic = "unmanagedNetworkNotPresentOnAnyNic";
result = validator.validateRemovedUnmanagedNetworks(
Arrays.asList(networkName, unmanagedNetworkNotPresentOnAnyNic),
Collections.singletonList(nic),
new BusinessEntityMap<>(Collections.emptySet()));
assertThat(result,
failsWith(EngineMessage.REMOVED_UNMANAGED_NETWORK_DOES_NOT_EXISIT_ON_HOST,
ReplacementUtils.createSetVariableString(NETWORK, unmanagedNetworkNotPresentOnAnyNic)));
}
private Nic createNic(String name){
Nic nic = new Nic();
nic.setName(name);
return nic;
}
public VdsNetworkInterface createVlanNic(VdsNetworkInterface baseNic, String nicName, Integer vlanId, boolean isManaged) {
VdsNetworkInterface vlanNic = new VdsNetworkInterface();
vlanNic.setId(Guid.newGuid());
vlanNic.setName(nicName);
vlanNic.setVlanId(vlanId);
vlanNic.setBaseInterface(baseNic.getName());
vlanNic.setNetworkName("unmanagedNetworkName");
vlanNic.setNetworkImplementationDetails(new NetworkImplementationDetails(true, isManaged));
return vlanNic;
}
private Nic createNicWithNetworkImplementationDetails(String name, boolean isManaged){
Nic nic = createNic(name);
NetworkImplementationDetails networkImplementationDetails1 = new NetworkImplementationDetails(true, isManaged);
nic.setNetworkImplementationDetails(networkImplementationDetails1);
return nic;
}
}