package org.ovirt.engine.core.bll;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.action.AddUnmanagedVmsParameters;
import org.ovirt.engine.core.common.businessentities.DisplayType;
import org.ovirt.engine.core.common.businessentities.GraphicsDevice;
import org.ovirt.engine.core.common.businessentities.GraphicsType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmDevice;
import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.dao.VmStaticDao;
import org.ovirt.engine.core.utils.MockConfigRule;
import org.ovirt.engine.core.vdsbroker.vdsbroker.VdsProperties;
@RunWith(MockitoJUnitRunner.class)
public class AddUnmanagedVmsCommandTest {
@ClassRule
public static MockConfigRule mcr = new MockConfigRule();
@Mock
VmStaticDao vmStaticDao;
@Spy
@InjectMocks
AddUnmanagedVmsCommand<AddUnmanagedVmsParameters> addUnamangedVmsCommand =
new AddUnmanagedVmsCommand<>(new AddUnmanagedVmsParameters(), null);
private static Map<String, Object> external_vm;
private static Map<String, Object> hosted_engine;
@BeforeClass
public static void loadVmData() throws IOException {
external_vm = loadVm("/external_vm.json");
hosted_engine = loadVm("/he_vm.json");
}
@Before
public void setup() {
doNothing().when(addUnamangedVmsCommand).addExternallyManagedVm(any(VmStatic.class));
doNothing().when(addUnamangedVmsCommand).addDevices(anyMap(), anyLong());
doNothing().when(addUnamangedVmsCommand).importHostedEngineVm(any(VM.class));
}
private static Map<String, Object> loadVm(String resourcePath) throws IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(AddUnmanagedVmsCommand.class.getResourceAsStream(resourcePath));
Map<String, Object> map = mapper.convertValue(node, Map.class);
map.put(VdsProperties.Devices, ((List) map.get(VdsProperties.Devices)).toArray());
return map;
}
@Test
public void shouldConvertExternalVm() throws IOException {
addUnamangedVmsCommand.convertVm(1, DisplayType.qxl, System.nanoTime(), external_vm);
verify(addUnamangedVmsCommand).addExternallyManagedVm(argThat(vmStatic -> {
assertThat(vmStatic.getNumOfSockets(), is(4));
assertThat(vmStatic.getMemSizeMb(), is(7052));
return true;
}));
}
@Test
public void shouldDetectHostedEngineVM() throws IOException {
addUnamangedVmsCommand.importHostedEngineVm(hosted_engine);
verify(addUnamangedVmsCommand, times(0)).addExternallyManagedVm(any(VmStatic.class));
verify(addUnamangedVmsCommand).importHostedEngineVm(argThat(new HEVmMatcher()));
}
private class HEVmMatcher implements ArgumentMatcher<VM> {
@Override
public boolean matches(VM argument) {
VmStatic vmStatic = argument.getStaticData();
assertThat(vmStatic.getNumOfSockets(), is(4));
assertThat(vmStatic.getMemSizeMb(), is(7052));
assertThat(vmStatic.getManagedDeviceMap().size(), is(2));
for(VmDevice vmDevice : vmStatic.getManagedDeviceMap().values()){
if(vmDevice instanceof GraphicsDevice){
GraphicsDevice device = (GraphicsDevice) vmDevice;
assertThat(device.getGraphicsType(), is(GraphicsType.VNC));
assertThat(vmStatic.getDefaultDisplayType(), is(DisplayType.vga));
}
else{
assertThat(vmDevice.getType(), is(VmDeviceGeneralType.CONSOLE));
}
}
return true;
}
}
}