This is an automated email from the ASF dual-hosted git repository. shwstppr pushed a commit to branch 4.18 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit ce981574c33cdd01f77f4e7144c31a2ebae11eb3 Merge: 330a330555e 9aee625ab45 Author: Abhishek Kumar <[email protected]> AuthorDate: Fri Mar 31 17:00:00 2023 +0530 Merge remote-tracking branch 'apache/4.17' into 4.18 .../com/cloud/vm/VirtualMachineManagerImpl.java | 25 +++++++++ .../engine/orchestration/VolumeOrchestrator.java | 23 ++++---- .../cloud/vm/VirtualMachineManagerImplTest.java | 62 ++++++++++++++++++++++ 3 files changed, 100 insertions(+), 10 deletions(-) diff --cc engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 774950855c4,9bbe35fc97e..1b3d914b27a --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@@ -1025,12 -1009,25 +1029,31 @@@ public class VirtualMachineManagerImpl } } + protected void addHostIpToCertDetailsIfConfigAllows(Host vmHost, Map<String, String> ipAddressDetails, ConfigKey<Boolean> configKey) { + if (configKey.valueIn(vmHost.getDataCenterId())) { + ipAddressDetails.put(NetworkElementCommand.HYPERVISOR_HOST_PRIVATE_IP, vmHost.getPrivateIpAddress()); + } + } + + protected void checkIfTemplateNeededForCreatingVmVolumes(VMInstanceVO vm) { + final List<VolumeVO> existingRootVolumes = _volsDao.findReadyRootVolumesByInstance(vm.getId()); + if (CollectionUtils.isNotEmpty(existingRootVolumes)) { + return; + } + final VMTemplateVO template = _templateDao.findById(vm.getTemplateId()); + if (template == null) { + String msg = "Template for the VM instance can not be found, VM instance configuration needs to be updated"; + s_logger.error(String.format("%s. Template ID: %d seems to be removed", msg, vm.getTemplateId())); + throw new CloudRuntimeException(msg); + } + final VMTemplateZoneVO templateZoneVO = templateZoneDao.findByZoneTemplate(vm.getDataCenterId(), template.getId()); + if (templateZoneVO == null) { + String msg = "Template for the VM instance can not be found in the zone ID: %s, VM instance configuration needs to be updated"; + s_logger.error(String.format("%s. %s", msg, template)); + throw new CloudRuntimeException(msg); + } + } + @Override public void orchestrateStart(final String vmUuid, final Map<VirtualMachineProfile.Param, Object> params, final DeploymentPlan planToDeploy, final DeploymentPlanner planner) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { diff --cc engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java index ad7da2ceace,4ff4483e3ba..49c822d25ad --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java @@@ -37,17 -37,9 +37,12 @@@ import java.util.stream.Collectors import javax.inject.Inject; import javax.naming.ConfigurationException; - import com.cloud.event.ActionEvent; - import com.cloud.storage.StorageUtil; - +import org.apache.cloudstack.api.ApiCommandResourceType; +import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy; - import org.apache.cloudstack.context.CallContext; - import org.apache.cloudstack.secret.dao.PassphraseDao; - import org.apache.cloudstack.secret.PassphraseVO; import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd; import org.apache.cloudstack.api.command.admin.volume.MigrateVolumeCmdByAdmin; import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd; ++import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; @@@ -76,6 -68,7 +71,9 @@@ import org.apache.cloudstack.framework. import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; ++import org.apache.cloudstack.secret.PassphraseVO; ++import org.apache.cloudstack.secret.dao.PassphraseDao; + import org.apache.cloudstack.snapshot.SnapshotHelper; import org.apache.cloudstack.storage.command.CommandResult; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; @@@ -100,6 -94,6 +99,7 @@@ import com.cloud.dc.Pod import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlanner.ExcludeList; ++import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; import com.cloud.event.UsageEventUtils; import com.cloud.exception.ConcurrentOperationException; @@@ -145,6 -140,6 +145,7 @@@ import com.cloud.utils.db.Transaction import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionStatus; ++import com.cloud.utils.db.UUIDManager; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; diff --cc engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java index dd6f51d7577,7079eabc4b0..742bb3dda89 --- a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java +++ b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java @@@ -68,9 -62,10 +68,11 @@@ import com.cloud.service.ServiceOfferin import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.ScopeType; +import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolHostVO; + import com.cloud.storage.VMTemplateVO; + import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; @@@ -134,16 -128,11 +138,20 @@@ public class VirtualMachineManagerImplT @Mock private DiskOfferingDao diskOfferingDaoMock; + @Mock + VMTemplateDao templateDao; + @Mock + VMTemplateZoneDao templateZoneDao; + @Mock + private HostDao hostDaoMock; + @Mock + private UserVmJoinDao userVmJoinDaoMock; + @Mock + private UserVmDao userVmDaoMock; + @Mock + private UserVmVO userVmMock; + @Before public void setup() { virtualMachineManagerImpl.setHostAllocators(new ArrayList<>()); @@@ -776,4 -701,59 +784,58 @@@ Mockito.doReturn(isOfferingUsingLocal).when(diskOfferingMock).isUseLocalStorage(); virtualMachineManagerImpl.checkIfNewOfferingStorageScopeMatchesStoragePool(vmInstanceMock, diskOfferingMock); } + + @Test + public void checkIfTemplateNeededForCreatingVmVolumesExistingRootVolumes() { + long vmId = 1L; + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getId()).thenReturn(vmId); + Mockito.when(volumeDaoMock.findReadyRootVolumesByInstance(vmId)).thenReturn(List.of(Mockito.mock(VolumeVO.class))); + virtualMachineManagerImpl.checkIfTemplateNeededForCreatingVmVolumes(vm); + } + + @Test(expected = CloudRuntimeException.class) + public void checkIfTemplateNeededForCreatingVmVolumesMissingTemplate() { + long vmId = 1L; + long templateId = 1L; + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getId()).thenReturn(vmId); + Mockito.when(vm.getTemplateId()).thenReturn(templateId); + Mockito.when(volumeDaoMock.findReadyRootVolumesByInstance(vmId)).thenReturn(null); + Mockito.when(templateDao.findById(templateId)).thenReturn(null); + virtualMachineManagerImpl.checkIfTemplateNeededForCreatingVmVolumes(vm); + } + + @Test(expected = CloudRuntimeException.class) + public void checkIfTemplateNeededForCreatingVmVolumesMissingZoneTemplate() { + long vmId = 1L; + long templateId = 1L; + long dcId = 1L; + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getId()).thenReturn(vmId); + Mockito.when(vm.getTemplateId()).thenReturn(templateId); + Mockito.when(vm.getDataCenterId()).thenReturn(dcId); + Mockito.when(volumeDaoMock.findReadyRootVolumesByInstance(vmId)).thenReturn(null); + VMTemplateVO template = Mockito.mock(VMTemplateVO.class); + Mockito.when(vm.getId()).thenReturn(templateId); + Mockito.when(templateDao.findById(templateId)).thenReturn(template); - Mockito.when(templateZoneDao.findByZoneTemplate(dcId, templateId)).thenReturn(null); + virtualMachineManagerImpl.checkIfTemplateNeededForCreatingVmVolumes(vm); + } + + @Test + public void checkIfTemplateNeededForCreatingVmVolumesTemplateAvailable() { + long vmId = 1L; + long templateId = 1L; + long dcId = 1L; + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getId()).thenReturn(vmId); + Mockito.when(vm.getTemplateId()).thenReturn(templateId); + Mockito.when(vm.getDataCenterId()).thenReturn(dcId); + Mockito.when(volumeDaoMock.findReadyRootVolumesByInstance(vmId)).thenReturn(new ArrayList<>()); + VMTemplateVO template = Mockito.mock(VMTemplateVO.class); + Mockito.when(template.getId()).thenReturn(templateId); + Mockito.when(templateDao.findById(templateId)).thenReturn(template); + Mockito.when(templateZoneDao.findByZoneTemplate(dcId, templateId)).thenReturn(Mockito.mock(VMTemplateZoneVO.class)); + virtualMachineManagerImpl.checkIfTemplateNeededForCreatingVmVolumes(vm); + } }
