|
37 | 37 | import java.util.Map; |
38 | 38 | import java.util.UUID; |
39 | 39 |
|
| 40 | +import com.cloud.exception.ResourceAllocationException; |
40 | 41 | import com.cloud.offering.DiskOffering; |
41 | 42 | import com.cloud.resourcelimit.CheckedReservation; |
| 43 | +import com.cloud.vm.VmDetailConstants; |
42 | 44 | import org.apache.cloudstack.api.ResponseGenerator; |
43 | 45 | import org.apache.cloudstack.api.ResponseObject; |
44 | 46 | import org.apache.cloudstack.api.ServerApiException; |
|
55 | 57 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; |
56 | 58 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; |
57 | 59 | import org.apache.cloudstack.framework.config.dao.ConfigurationDao; |
| 60 | +import org.apache.cloudstack.resourcelimit.Reserver; |
58 | 61 | import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; |
59 | 62 | import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; |
60 | 63 | import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; |
|
72 | 75 | import org.mockito.MockedStatic; |
73 | 76 | import org.mockito.Mockito; |
74 | 77 | import org.mockito.MockitoAnnotations; |
| 78 | +import org.mockito.Spy; |
75 | 79 | import org.mockito.junit.MockitoJUnitRunner; |
76 | 80 |
|
77 | 81 | import com.cloud.agent.AgentManager; |
|
168 | 172 | public class UnmanagedVMsManagerImplTest { |
169 | 173 |
|
170 | 174 | @InjectMocks |
171 | | - private UnmanagedVMsManagerImpl unmanagedVMsManager = new UnmanagedVMsManagerImpl(); |
| 175 | + @Spy |
| 176 | + private UnmanagedVMsManagerImpl unmanagedVMsManager; |
172 | 177 |
|
173 | 178 | @Mock |
174 | 179 | private UserVmManager userVmManager; |
@@ -237,6 +242,14 @@ public class UnmanagedVMsManagerImplTest { |
237 | 242 | EntityManager entityMgr; |
238 | 243 | @Mock |
239 | 244 | 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; |
240 | 253 |
|
241 | 254 | private static final long virtualMachineId = 1L; |
242 | 255 |
|
@@ -363,6 +376,11 @@ public void setUp() throws Exception { |
363 | 376 |
|
364 | 377 | when(vmDao.findById(virtualMachineId)).thenReturn(virtualMachine); |
365 | 378 | 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); |
366 | 384 | } |
367 | 385 |
|
368 | 386 | @NotNull |
@@ -1110,4 +1128,102 @@ public void testSelectKVMHostForConversionInClusterWithImportInstanceIdInvalidHo |
1110 | 1128 |
|
1111 | 1129 | unmanagedVMsManager.selectKVMHostForConversionInCluster(cluster, hostId); |
1112 | 1130 | } |
| 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 | + } |
1113 | 1229 | } |
0 commit comments