Skip to content

Commit 4f28b28

Browse files
committed
Add unit tests
1 parent 4af9c76 commit 4f28b28

File tree

2 files changed

+120
-4
lines changed

2 files changed

+120
-4
lines changed

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,7 +1559,7 @@ private UserVm importUnmanagedInstanceFromHypervisor(DataCenter zone, Cluster cl
15591559
return userVm;
15601560
}
15611561

1562-
private void checkVmResourceLimitsForUnmanagedInstanceImport(Account owner, UnmanagedInstanceTO unmanagedInstance, ServiceOfferingVO serviceOffering, VMTemplateVO template, List<Reserver> reservations) throws ResourceAllocationException {
1562+
protected void checkVmResourceLimitsForUnmanagedInstanceImport(Account owner, UnmanagedInstanceTO unmanagedInstance, ServiceOfferingVO serviceOffering, VMTemplateVO template, List<Reserver> reservations) throws ResourceAllocationException {
15631563
// When importing an unmanaged instance, the amount of CPUs and memory is obtained from the hypervisor unless powered off
15641564
// and not using a dynamic offering, unlike the external VM import that always obtains it from the compute offering
15651565
Integer cpu = serviceOffering.getCpu();
@@ -2766,7 +2766,7 @@ private UserVm importKvmVirtualMachineFromDisk(final ImportSource importSource,
27662766
}
27672767
}
27682768

2769-
private void checkVmResourceLimitsForExternalKvmVmImport(Account owner, ServiceOfferingVO serviceOffering, VMTemplateVO template, Map<String, String> details, List<Reserver> reservations) throws ResourceAllocationException {
2769+
protected void checkVmResourceLimitsForExternalKvmVmImport(Account owner, ServiceOfferingVO serviceOffering, VMTemplateVO template, Map<String, String> details, List<Reserver> reservations) throws ResourceAllocationException {
27702770
// When importing an external VM, the amount of CPUs and memory is always obtained from the compute offering,
27712771
// unlike the unmanaged instance import that obtains it from the hypervisor unless the VM is powered off and the offering is fixed
27722772
Integer cpu = serviceOffering.getCpu();
@@ -2789,7 +2789,7 @@ private void checkVmResourceLimitsForExternalKvmVmImport(Account owner, ServiceO
27892789
reservations.add(memReservation);
27902790
}
27912791

2792-
private Integer getDetailAsInteger(String key, Map<String, String> details) {
2792+
protected Integer getDetailAsInteger(String key, Map<String, String> details) {
27932793
String detail = details.get(key);
27942794
if (detail == null) {
27952795
throw new InvalidParameterValueException(String.format("Detail '%s' must be provided.", key));

server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@
3737
import java.util.Map;
3838
import java.util.UUID;
3939

40+
import com.cloud.exception.ResourceAllocationException;
4041
import com.cloud.offering.DiskOffering;
4142
import com.cloud.resourcelimit.CheckedReservation;
43+
import com.cloud.vm.VmDetailConstants;
4244
import org.apache.cloudstack.api.ResponseGenerator;
4345
import org.apache.cloudstack.api.ResponseObject;
4446
import org.apache.cloudstack.api.ServerApiException;
@@ -55,6 +57,7 @@
5557
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
5658
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
5759
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
60+
import org.apache.cloudstack.resourcelimit.Reserver;
5861
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
5962
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
6063
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
@@ -72,6 +75,7 @@
7275
import org.mockito.MockedStatic;
7376
import org.mockito.Mockito;
7477
import org.mockito.MockitoAnnotations;
78+
import org.mockito.Spy;
7579
import org.mockito.junit.MockitoJUnitRunner;
7680

7781
import com.cloud.agent.AgentManager;
@@ -168,7 +172,8 @@
168172
public class UnmanagedVMsManagerImplTest {
169173

170174
@InjectMocks
171-
private UnmanagedVMsManagerImpl unmanagedVMsManager = new UnmanagedVMsManagerImpl();
175+
@Spy
176+
private UnmanagedVMsManagerImpl unmanagedVMsManager;
172177

173178
@Mock
174179
private UserVmManager userVmManager;
@@ -237,6 +242,14 @@ public class UnmanagedVMsManagerImplTest {
237242
EntityManager entityMgr;
238243
@Mock
239244
DeploymentPlanningManager deploymentPlanningManager;
245+
@Mock
246+
private Account accountMock;
247+
@Mock
248+
private ServiceOfferingVO serviceOfferingMock;
249+
@Mock
250+
private VMTemplateVO templateMock;
251+
@Mock
252+
private UnmanagedInstanceTO unmanagedInstanceMock;
240253

241254
private static final long virtualMachineId = 1L;
242255

@@ -363,6 +376,11 @@ public void setUp() throws Exception {
363376

364377
when(vmDao.findById(virtualMachineId)).thenReturn(virtualMachine);
365378
when(virtualMachine.getState()).thenReturn(VirtualMachine.State.Running);
379+
380+
when(unmanagedInstanceMock.getCpuCores()).thenReturn(8);
381+
when(unmanagedInstanceMock.getMemory()).thenReturn(4096);
382+
when(serviceOfferingMock.getCpu()).thenReturn(4);
383+
when(serviceOfferingMock.getRamSize()).thenReturn(2048);
366384
}
367385

368386
@NotNull
@@ -1110,4 +1128,102 @@ public void testSelectKVMHostForConversionInClusterWithImportInstanceIdInvalidHo
11101128

11111129
unmanagedVMsManager.selectKVMHostForConversionInCluster(cluster, hostId);
11121130
}
1131+
1132+
@Test
1133+
public void checkVmResourceLimitsForUnmanagedInstanceImportTestUsesInformationFromHypervisorWhenOfferingIsDynamic() throws Exception {
1134+
when(serviceOfferingMock.isDynamic()).thenReturn(true);
1135+
List<Reserver> reservations = new ArrayList<>();
1136+
1137+
try (MockedConstruction<CheckedReservation> mockedConstruction = Mockito.mockConstruction(CheckedReservation.class)) {
1138+
unmanagedVMsManager.checkVmResourceLimitsForUnmanagedInstanceImport(accountMock, unmanagedInstanceMock, serviceOfferingMock, templateMock, reservations);
1139+
1140+
Assert.assertEquals(3, mockedConstruction.constructed().size());
1141+
Assert.assertEquals(3, reservations.size());
1142+
verify(unmanagedInstanceMock).getCpuCores();
1143+
verify(unmanagedInstanceMock).getMemory();
1144+
}
1145+
}
1146+
1147+
@Test
1148+
public void checkVmResourceLimitsForUnmanagedInstanceImportTestUsesInformationFromHypervisorWhenVmIsPoweredOn() throws Exception {
1149+
when(unmanagedInstanceMock.getPowerState()).thenReturn(UnmanagedInstanceTO.PowerState.PowerOn);
1150+
when(serviceOfferingMock.isDynamic()).thenReturn(false);
1151+
List<Reserver> reservations = new ArrayList<>();
1152+
1153+
try (MockedConstruction<CheckedReservation> mockedConstruction = Mockito.mockConstruction(CheckedReservation.class)) {
1154+
unmanagedVMsManager.checkVmResourceLimitsForUnmanagedInstanceImport(accountMock, unmanagedInstanceMock, serviceOfferingMock, templateMock, reservations);
1155+
1156+
Assert.assertEquals(3, mockedConstruction.constructed().size());
1157+
Assert.assertEquals(3, reservations.size());
1158+
verify(unmanagedInstanceMock).getCpuCores();
1159+
verify(unmanagedInstanceMock).getMemory();
1160+
}
1161+
}
1162+
1163+
@Test
1164+
public void checkVmResourceLimitsForUnmanagedInstanceImportTestUsesInformationFromOfferingWhenOfferingIsNotDynamicAndVmIsPoweredOff() throws Exception {
1165+
when(unmanagedInstanceMock.getPowerState()).thenReturn(UnmanagedInstanceTO.PowerState.PowerOff);
1166+
when(serviceOfferingMock.isDynamic()).thenReturn(false);
1167+
List<Reserver> reservations = new ArrayList<>();
1168+
1169+
try (MockedConstruction<CheckedReservation> mockedConstruction = Mockito.mockConstruction(CheckedReservation.class)) {
1170+
unmanagedVMsManager.checkVmResourceLimitsForUnmanagedInstanceImport(accountMock, unmanagedInstanceMock, serviceOfferingMock, templateMock, reservations);
1171+
1172+
Assert.assertEquals(3, mockedConstruction.constructed().size());
1173+
Assert.assertEquals(3, reservations.size());
1174+
verify(serviceOfferingMock).getCpu();
1175+
verify(serviceOfferingMock).getRamSize();
1176+
verify(unmanagedInstanceMock, Mockito.never()).getCpuCores();
1177+
verify(unmanagedInstanceMock, Mockito.never()).getMemory();
1178+
}
1179+
}
1180+
1181+
@Test
1182+
public void checkVmResourceLimitsForExternalKvmVmImportTestUsesInformationFromOfferingWhenOfferingIsNotDynamic() throws ResourceAllocationException {
1183+
when(serviceOfferingMock.isDynamic()).thenReturn(false);
1184+
Map<String, String> details = new HashMap<>();
1185+
List<Reserver> reservations = new ArrayList<>();
1186+
1187+
try (MockedConstruction<CheckedReservation> mockedConstruction = Mockito.mockConstruction(CheckedReservation.class)) {
1188+
unmanagedVMsManager.checkVmResourceLimitsForExternalKvmVmImport(accountMock, serviceOfferingMock, templateMock, details, reservations);
1189+
1190+
Assert.assertEquals(3, mockedConstruction.constructed().size());
1191+
Assert.assertEquals(3, reservations.size());
1192+
verify(serviceOfferingMock).getCpu();
1193+
verify(serviceOfferingMock).getRamSize();
1194+
verify(unmanagedVMsManager, Mockito.never()).getDetailAsInteger(VmDetailConstants.CPU_NUMBER, details);
1195+
verify(unmanagedVMsManager, Mockito.never()).getDetailAsInteger(VmDetailConstants.MEMORY, details);
1196+
}
1197+
}
1198+
1199+
@Test
1200+
public void checkVmResourceLimitsForExternalKvmVmImportTestUsesInformationFromDetailsWhenOfferingIsDynamic() throws ResourceAllocationException {
1201+
when(serviceOfferingMock.isDynamic()).thenReturn(true);
1202+
Map<String, String> details = new HashMap<>();
1203+
details.put(VmDetailConstants.CPU_NUMBER, "8");
1204+
details.put(VmDetailConstants.MEMORY, "4096");
1205+
List<Reserver> reservations = new ArrayList<>();
1206+
1207+
try (MockedConstruction<CheckedReservation> mockedConstruction = Mockito.mockConstruction(CheckedReservation.class)) {
1208+
unmanagedVMsManager.checkVmResourceLimitsForExternalKvmVmImport(accountMock, serviceOfferingMock, templateMock, details, reservations);
1209+
1210+
Assert.assertEquals(3, mockedConstruction.constructed().size());
1211+
Assert.assertEquals(3, reservations.size());
1212+
verify(unmanagedVMsManager).getDetailAsInteger(VmDetailConstants.CPU_NUMBER, details);
1213+
verify(unmanagedVMsManager).getDetailAsInteger(VmDetailConstants.MEMORY, details);
1214+
}
1215+
}
1216+
1217+
@Test(expected = InvalidParameterValueException.class)
1218+
public void getDetailAsIntegerTestThrowsInvalidParameterValueExceptionWhenDetailIsNull() {
1219+
Map<String, String> details = new HashMap<>();
1220+
unmanagedVMsManager.getDetailAsInteger("non-existent", details);
1221+
}
1222+
1223+
@Test(expected = InvalidParameterValueException.class)
1224+
public void getDetailAsIntegerTestThrowsInvalidParameterValueExceptionWhenValueIsInvalid() {
1225+
Map<String, String> details = new HashMap<>();
1226+
details.put("key", "not-a-number");
1227+
unmanagedVMsManager.getDetailAsInteger("key", details);
1228+
}
11131229
}

0 commit comments

Comments
 (0)