|
40 | 40 | import static org.mockito.Mockito.never; |
41 | 41 | import static org.mockito.Mockito.times; |
42 | 42 | import static org.mockito.Mockito.verify; |
| 43 | +import static org.mockito.Mockito.verifyNoMoreInteractions; |
43 | 44 | import static org.mockito.Mockito.when; |
44 | 45 |
|
| 46 | +import java.lang.reflect.Field; |
45 | 47 | import java.text.SimpleDateFormat; |
46 | 48 | import java.time.LocalDateTime; |
47 | 49 | import java.time.ZoneOffset; |
|
59 | 61 | import java.util.TimeZone; |
60 | 62 | import java.util.UUID; |
61 | 63 |
|
62 | | -import com.cloud.domain.Domain; |
63 | | -import com.cloud.storage.dao.SnapshotPolicyDao; |
64 | 64 | import org.apache.cloudstack.acl.ControlledEntity; |
65 | 65 | import org.apache.cloudstack.acl.SecurityChecker; |
66 | 66 | import org.apache.cloudstack.api.ApiCommandResourceType; |
|
88 | 88 | import org.apache.cloudstack.engine.subsystem.api.storage.Scope; |
89 | 89 | import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; |
90 | 90 | import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; |
| 91 | +import org.apache.cloudstack.framework.config.ConfigKey; |
91 | 92 | import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; |
92 | 93 | import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; |
93 | 94 | import org.apache.cloudstack.storage.template.VnfTemplateManager; |
|
117 | 118 | import com.cloud.deploy.DeployDestination; |
118 | 119 | import com.cloud.deploy.DeploymentPlanner; |
119 | 120 | import com.cloud.deploy.DeploymentPlanningManager; |
| 121 | +import com.cloud.domain.Domain; |
120 | 122 | import com.cloud.domain.DomainVO; |
121 | 123 | import com.cloud.domain.dao.DomainDao; |
122 | 124 | import com.cloud.event.ActionEventUtils; |
|
142 | 144 | import com.cloud.network.dao.LoadBalancerVMMapVO; |
143 | 145 | import com.cloud.network.dao.NetworkDao; |
144 | 146 | import com.cloud.network.dao.NetworkVO; |
145 | | -import com.cloud.network.element.UserDataServiceProvider; |
146 | 147 | import com.cloud.network.dao.PhysicalNetworkDao; |
147 | 148 | import com.cloud.network.dao.PhysicalNetworkVO; |
| 149 | +import com.cloud.network.element.UserDataServiceProvider; |
148 | 150 | import com.cloud.network.guru.NetworkGuru; |
149 | 151 | import com.cloud.network.rules.FirewallRuleVO; |
150 | 152 | import com.cloud.network.rules.PortForwardingRule; |
|
172 | 174 | import com.cloud.storage.dao.DiskOfferingDao; |
173 | 175 | import com.cloud.storage.dao.GuestOSDao; |
174 | 176 | import com.cloud.storage.dao.SnapshotDao; |
| 177 | +import com.cloud.storage.dao.SnapshotPolicyDao; |
175 | 178 | import com.cloud.storage.dao.VMTemplateDao; |
176 | 179 | import com.cloud.storage.dao.VolumeDao; |
177 | 180 | import com.cloud.template.VirtualMachineTemplate; |
@@ -467,6 +470,24 @@ public class UserVmManagerImplTest { |
467 | 470 | Class<InvalidParameterValueException> expectedInvalidParameterValueException = InvalidParameterValueException.class; |
468 | 471 | Class<CloudRuntimeException> expectedCloudRuntimeException = CloudRuntimeException.class; |
469 | 472 |
|
| 473 | + private Map<ConfigKey, Object> originalConfigValues = new HashMap<>(); |
| 474 | + |
| 475 | + |
| 476 | + private void updateDefaultConfigValue(final ConfigKey configKey, final Object o, boolean revert) { |
| 477 | + try { |
| 478 | + final String name = "_defaultValue"; |
| 479 | + Field f = ConfigKey.class.getDeclaredField(name); |
| 480 | + f.setAccessible(true); |
| 481 | + String stringVal = String.valueOf(o); |
| 482 | + if (!revert) { |
| 483 | + originalConfigValues.put(configKey, f.get(configKey)); |
| 484 | + } |
| 485 | + f.set(configKey, stringVal); |
| 486 | + } catch (IllegalAccessException | NoSuchFieldException e) { |
| 487 | + Assert.fail("Failed to mock config " + configKey.key() + " value due to " + e.getMessage()); |
| 488 | + } |
| 489 | + } |
| 490 | + |
470 | 491 | @Before |
471 | 492 | public void beforeTest() { |
472 | 493 | userVmManagerImpl.resourceLimitService = resourceLimitMgr; |
@@ -496,6 +517,9 @@ public void beforeTest() { |
496 | 517 | public void afterTest() { |
497 | 518 | CallContext.unregister(); |
498 | 519 | unmanagedVMsManagerMockedStatic.close(); |
| 520 | + for (Map.Entry<ConfigKey, Object> entry : originalConfigValues.entrySet()) { |
| 521 | + updateDefaultConfigValue(entry.getKey(), entry.getValue(), true); |
| 522 | + } |
499 | 523 | } |
500 | 524 |
|
501 | 525 | @Test |
@@ -4178,4 +4202,49 @@ public void testUnmanageUserVMSuccess() { |
4178 | 4202 | verify(userVmDao, times(1)).releaseFromLockTable(vmId); |
4179 | 4203 | } |
4180 | 4204 |
|
| 4205 | + @Test |
| 4206 | + public void updateVmExtraConfigCleansUpWhenCleanupFlagIsTrue() { |
| 4207 | + UserVmVO userVm = mock(UserVmVO.class); |
| 4208 | + when(userVm.getUuid()).thenReturn("test-uuid"); |
| 4209 | + when(userVm.getId()).thenReturn(1L); |
| 4210 | + |
| 4211 | + userVmManagerImpl.updateVmExtraConfig(userVm, "someConfig", true); |
| 4212 | + |
| 4213 | + verify(vmInstanceDetailsDao, times(1)).removeDetailsWithPrefix(1L, ApiConstants.EXTRA_CONFIG); |
| 4214 | + verifyNoMoreInteractions(vmInstanceDetailsDao); |
| 4215 | + } |
| 4216 | + |
| 4217 | + @Test |
| 4218 | + public void updateVmExtraConfigAddsConfigWhenValidAndEnabled() { |
| 4219 | + UserVmVO userVm = mock(UserVmVO.class); |
| 4220 | + when(userVm.getUuid()).thenReturn("test-uuid"); |
| 4221 | + when(userVm.getAccountId()).thenReturn(1L); |
| 4222 | + when(userVm.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM); |
| 4223 | + doNothing().when(userVmManagerImpl).persistExtraConfigKvm(anyString(), eq(userVm)); |
| 4224 | + updateDefaultConfigValue(UserVmManagerImpl.EnableAdditionalVmConfig, true, false); |
| 4225 | + |
| 4226 | + userVmManagerImpl.updateVmExtraConfig(userVm, "validConfig", false); |
| 4227 | + |
| 4228 | + verify(vmInstanceDetailsDao, never()).removeDetailsWithPrefix(anyLong(), anyString()); |
| 4229 | + verify(userVmManagerImpl, times(1)).addExtraConfig(userVm, "validConfig"); |
| 4230 | + } |
| 4231 | + |
| 4232 | + @Test(expected = InvalidParameterValueException.class) |
| 4233 | + public void updateVmExtraConfigThrowsExceptionWhenConfigDisabled() { |
| 4234 | + UserVmVO userVm = mock(UserVmVO.class); |
| 4235 | + when(userVm.getAccountId()).thenReturn(1L); |
| 4236 | + updateDefaultConfigValue(UserVmManagerImpl.EnableAdditionalVmConfig, false, false); |
| 4237 | + |
| 4238 | + userVmManagerImpl.updateVmExtraConfig(userVm, "validConfig", false); |
| 4239 | + } |
| 4240 | + |
| 4241 | + @Test |
| 4242 | + public void updateVmExtraConfigDoesNothingWhenExtraConfigIsBlank() { |
| 4243 | + UserVmVO userVm = mock(UserVmVO.class); |
| 4244 | + |
| 4245 | + userVmManagerImpl.updateVmExtraConfig(userVm, "", false); |
| 4246 | + |
| 4247 | + verify(vmInstanceDetailsDao, never()).removeDetailsWithPrefix(anyLong(), anyString()); |
| 4248 | + verify(userVmManagerImpl, never()).addExtraConfig(any(UserVmVO.class), anyString()); |
| 4249 | + } |
4181 | 4250 | } |
0 commit comments