|
38 | 38 | import java.util.ArrayList; |
39 | 39 | import java.util.Collections; |
40 | 40 | import java.util.HashMap; |
| 41 | +import java.util.HashSet; |
| 42 | +import java.util.LinkedHashMap; |
| 43 | +import java.util.LinkedHashSet; |
| 44 | +import java.util.LinkedList; |
41 | 45 | import java.util.List; |
42 | 46 | import java.util.Map; |
43 | 47 |
|
44 | | -import com.cloud.network.NetworkService; |
45 | 48 | import org.apache.cloudstack.acl.ControlledEntity; |
46 | 49 | import org.apache.cloudstack.acl.SecurityChecker; |
47 | 50 | import org.apache.cloudstack.api.BaseCmd.HTTPMethod; |
|
65 | 68 | import org.junit.runner.RunWith; |
66 | 69 | import org.mockito.InjectMocks; |
67 | 70 | import org.mockito.Mock; |
| 71 | +import org.mockito.MockedStatic; |
68 | 72 | import org.mockito.Mockito; |
69 | 73 | import org.mockito.Spy; |
70 | 74 | import org.mockito.junit.MockitoJUnitRunner; |
|
80 | 84 | import com.cloud.deploy.DeployDestination; |
81 | 85 | import com.cloud.deploy.DeploymentPlanner; |
82 | 86 | import com.cloud.deploy.DeploymentPlanningManager; |
| 87 | +import com.cloud.domain.DomainVO; |
| 88 | +import com.cloud.domain.dao.DomainDao; |
| 89 | +import com.cloud.event.UsageEventUtils; |
| 90 | +import com.cloud.event.UsageEventVO; |
83 | 91 | import com.cloud.exception.InsufficientAddressCapacityException; |
84 | 92 | import com.cloud.exception.InsufficientCapacityException; |
85 | 93 | import com.cloud.exception.InsufficientServerCapacityException; |
|
91 | 99 | import com.cloud.host.HostVO; |
92 | 100 | import com.cloud.host.dao.HostDao; |
93 | 101 | import com.cloud.hypervisor.Hypervisor; |
| 102 | +import com.cloud.network.Network; |
94 | 103 | import com.cloud.network.NetworkModel; |
| 104 | +import com.cloud.network.NetworkService; |
| 105 | +import com.cloud.network.dao.FirewallRulesDao; |
| 106 | +import com.cloud.network.dao.IPAddressDao; |
| 107 | +import com.cloud.network.dao.IPAddressVO; |
| 108 | +import com.cloud.network.dao.LoadBalancerVMMapDao; |
| 109 | +import com.cloud.network.dao.LoadBalancerVMMapVO; |
95 | 110 | import com.cloud.network.dao.NetworkDao; |
96 | 111 | import com.cloud.network.dao.NetworkVO; |
| 112 | +import com.cloud.network.dao.PhysicalNetworkDao; |
| 113 | +import com.cloud.network.dao.PhysicalNetworkVO; |
| 114 | +import com.cloud.network.guru.NetworkGuru; |
| 115 | +import com.cloud.network.rules.FirewallRuleVO; |
| 116 | +import com.cloud.network.rules.PortForwardingRule; |
| 117 | +import com.cloud.network.rules.dao.PortForwardingRulesDao; |
| 118 | +import com.cloud.network.security.SecurityGroupManager; |
97 | 119 | import com.cloud.network.security.SecurityGroupVO; |
98 | 120 | import com.cloud.offering.DiskOffering; |
| 121 | +import com.cloud.offering.NetworkOffering; |
99 | 122 | import com.cloud.offering.ServiceOffering; |
| 123 | +import com.cloud.offerings.NetworkOfferingVO; |
| 124 | +import com.cloud.offerings.dao.NetworkOfferingDao; |
100 | 125 | import com.cloud.server.ManagementService; |
101 | 126 | import com.cloud.service.ServiceOfferingVO; |
102 | 127 | import com.cloud.service.dao.ServiceOfferingDao; |
| 128 | +import com.cloud.service.dao.ServiceOfferingDetailsDao; |
103 | 129 | import com.cloud.storage.DiskOfferingVO; |
104 | 130 | import com.cloud.storage.GuestOSVO; |
105 | 131 | import com.cloud.storage.ScopeType; |
|
136 | 162 | import com.cloud.vm.dao.UserVmDetailsDao; |
137 | 163 | import com.cloud.vm.snapshot.VMSnapshotVO; |
138 | 164 | import com.cloud.vm.snapshot.dao.VMSnapshotDao; |
139 | | -import org.mockito.MockedStatic; |
140 | | - |
141 | | -import java.util.HashSet; |
142 | | -import java.util.LinkedHashMap; |
143 | | -import java.util.LinkedHashSet; |
144 | | -import java.util.LinkedList; |
145 | | -import com.cloud.domain.DomainVO; |
146 | | -import com.cloud.domain.dao.DomainDao; |
147 | | -import com.cloud.event.UsageEventUtils; |
148 | | -import com.cloud.network.Network; |
149 | | -import com.cloud.network.dao.FirewallRulesDao; |
150 | | -import com.cloud.network.dao.IPAddressDao; |
151 | | -import com.cloud.network.dao.IPAddressVO; |
152 | | -import com.cloud.network.dao.LoadBalancerVMMapDao; |
153 | | -import com.cloud.network.dao.LoadBalancerVMMapVO; |
154 | | -import com.cloud.network.dao.PhysicalNetworkDao; |
155 | | -import com.cloud.network.dao.PhysicalNetworkVO; |
156 | | -import com.cloud.network.guru.NetworkGuru; |
157 | | -import com.cloud.network.rules.FirewallRuleVO; |
158 | | -import com.cloud.network.rules.PortForwardingRule; |
159 | | -import com.cloud.network.rules.dao.PortForwardingRulesDao; |
160 | | -import com.cloud.network.security.SecurityGroupManager; |
161 | | -import com.cloud.offering.NetworkOffering; |
162 | | -import com.cloud.offerings.NetworkOfferingVO; |
163 | | -import com.cloud.offerings.dao.NetworkOfferingDao; |
164 | 165 |
|
165 | 166 | @RunWith(MockitoJUnitRunner.class) |
166 | 167 | public class UserVmManagerImplTest { |
@@ -370,6 +371,9 @@ public class UserVmManagerImplTest { |
370 | 371 | @Mock |
371 | 372 | NetworkService networkServiceMock; |
372 | 373 |
|
| 374 | + @Mock |
| 375 | + ServiceOfferingDetailsDao serviceOfferingDetailsDao; |
| 376 | + |
373 | 377 | private static final long vmId = 1l; |
374 | 378 | private static final long zoneId = 2L; |
375 | 379 | private static final long accountId = 3L; |
@@ -3121,4 +3125,91 @@ public void executeStepsToChangeOwnershipOfVmTestResourceCountRunningVmsOnlyEnab |
3121 | 3125 | Mockito.verify(userVmManagerImpl, Mockito.never()).resourceCountIncrement(Mockito.anyLong(), Mockito.any(), Mockito.any(), Mockito.any()); |
3122 | 3126 | } |
3123 | 3127 | } |
| 3128 | + |
| 3129 | + private ServiceOfferingVO getMockedServiceOffering(boolean custom, boolean customSpeed) { |
| 3130 | + ServiceOfferingVO serviceOffering = mock(ServiceOfferingVO.class); |
| 3131 | + when(serviceOffering.getUuid()).thenReturn("offering-uuid"); |
| 3132 | + when(serviceOffering.isDynamic()).thenReturn(custom); |
| 3133 | + when(serviceOffering.isCustomCpuSpeedSupported()).thenReturn(customSpeed); |
| 3134 | + if (custom) { |
| 3135 | + when(serviceOffering.getCpu()).thenReturn(null); |
| 3136 | + when(serviceOffering.getRamSize()).thenReturn(null); |
| 3137 | + } else { |
| 3138 | + when(serviceOffering.getCpu()).thenReturn(2); |
| 3139 | + when(serviceOffering.getRamSize()).thenReturn(2048); |
| 3140 | + } |
| 3141 | + if (customSpeed) { |
| 3142 | + when(serviceOffering.getSpeed()).thenReturn(null); |
| 3143 | + } else { |
| 3144 | + when(serviceOffering.isCustomCpuSpeedSupported()).thenReturn(false); |
| 3145 | + when(serviceOffering.getSpeed()).thenReturn(2500); |
| 3146 | + } |
| 3147 | + System.out.println("Service Offering customized: " + serviceOffering.isCustomized() + ", speed: " + serviceOffering.getSpeed()); |
| 3148 | + return serviceOffering; |
| 3149 | + } |
| 3150 | + |
| 3151 | + @Test |
| 3152 | + public void customOfferingNeedsCustomizationThrowsException() { |
| 3153 | + ServiceOfferingVO serviceOffering = getMockedServiceOffering(true, true); |
| 3154 | + InvalidParameterValueException ex = Assert.assertThrows(InvalidParameterValueException.class, () -> |
| 3155 | + userVmManagerImpl.validateCustomParameters(serviceOffering, Collections.emptyMap())); |
| 3156 | + assertEquals("Need to specify custom parameter values cpu, cpu speed and memory when using custom offering", ex.getMessage()); |
| 3157 | + } |
| 3158 | + |
| 3159 | + @Test |
| 3160 | + public void cpuSpeedCustomizationNotAllowedThrowsException() { |
| 3161 | + ServiceOfferingVO serviceOffering = getMockedServiceOffering(true, false); |
| 3162 | + |
| 3163 | + Map<String, String> customParameters = new HashMap<>(); |
| 3164 | + customParameters.put(UsageEventVO.DynamicParameters.cpuSpeed.name(), "2500"); |
| 3165 | + |
| 3166 | + InvalidParameterValueException ex = Assert.assertThrows(InvalidParameterValueException.class, () -> |
| 3167 | + userVmManagerImpl.validateCustomParameters(serviceOffering, customParameters)); |
| 3168 | + Assert.assertTrue(ex.getMessage().startsWith("The CPU speed of this offering")); |
| 3169 | + } |
| 3170 | + |
| 3171 | + @Test |
| 3172 | + public void cpuSpeedCustomizationAllowedDoesNotThrowException() { |
| 3173 | + ServiceOfferingVO serviceOffering = getMockedServiceOffering(true, true); |
| 3174 | + |
| 3175 | + Map<String, String> customParameters = new HashMap<>(); |
| 3176 | + customParameters.put(UsageEventVO.DynamicParameters.cpuSpeed.name(), "2500"); |
| 3177 | + |
| 3178 | + userVmManagerImpl.validateCustomParameters(serviceOffering, customParameters); |
| 3179 | + } |
| 3180 | + |
| 3181 | + @Test |
| 3182 | + public void verifyVmLimits_fixedOffering_throwsException() { |
| 3183 | + when(userVmVoMock.getId()).thenReturn(1L); |
| 3184 | + when(userVmVoMock.getServiceOfferingId()).thenReturn(1L); |
| 3185 | + when(accountDao.findById(anyLong())).thenReturn(callerAccount); |
| 3186 | + ServiceOfferingVO serviceOffering = getMockedServiceOffering(false, false); |
| 3187 | + when(_serviceOfferingDao.findById(anyLong())).thenReturn(serviceOffering); |
| 3188 | + when(_serviceOfferingDao.findByIdIncludingRemoved(anyLong(), anyLong())).thenReturn(serviceOffering); |
| 3189 | + |
| 3190 | + Map<String, String> customParameters = new HashMap<>(); |
| 3191 | + customParameters.put(VmDetailConstants.CPU_SPEED, "2500"); |
| 3192 | + |
| 3193 | + InvalidParameterValueException ex = Assert.assertThrows(InvalidParameterValueException.class, () -> |
| 3194 | + userVmManagerImpl.verifyVmLimits(userVmVoMock, customParameters)); |
| 3195 | + assertEquals("CPU number, Memory and CPU speed cannot be updated for a non-dynamic offering", ex.getMessage()); |
| 3196 | + } |
| 3197 | + |
| 3198 | + @Test |
| 3199 | + public void verifyVmLimits_constrainedOffering_throwsException() { |
| 3200 | + when(userVmVoMock.getId()).thenReturn(1L); |
| 3201 | + when(userVmVoMock.getServiceOfferingId()).thenReturn(1L); |
| 3202 | + when(accountDao.findById(anyLong())).thenReturn(callerAccount); |
| 3203 | + ServiceOfferingVO serviceOffering = getMockedServiceOffering(true, false); |
| 3204 | + when(_serviceOfferingDao.findById(anyLong())).thenReturn(serviceOffering); |
| 3205 | + when(_serviceOfferingDao.findByIdIncludingRemoved(anyLong(), anyLong())).thenReturn(serviceOffering); |
| 3206 | + |
| 3207 | + Map<String, String> customParameters = new HashMap<>(); |
| 3208 | + customParameters.put(VmDetailConstants.CPU_NUMBER, "1"); |
| 3209 | + customParameters.put(VmDetailConstants.CPU_SPEED, "2500"); |
| 3210 | + |
| 3211 | + InvalidParameterValueException ex = Assert.assertThrows(InvalidParameterValueException.class, () -> |
| 3212 | + userVmManagerImpl.verifyVmLimits(userVmVoMock, customParameters)); |
| 3213 | + Assert.assertTrue(ex.getMessage().startsWith("The CPU speed of this offering")); |
| 3214 | + } |
3124 | 3215 | } |
0 commit comments