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);
+     }
  }

Reply via email to