diff --git 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 index 05732e584113..e4cb8939de37 100644 --- 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 @@ -36,8 +36,10 @@ import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.dao.VMTemplateDetailsDao; import com.cloud.utils.StringUtils; +import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.VmDetailConstants; +import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDetailsDao; import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd; import org.apache.cloudstack.api.command.admin.volume.MigrateVolumeCmdByAdmin; @@ -216,6 +218,8 @@ public enum UserVmCloneType { TemplateService templateService; @Inject UserVmDetailsDao userVmDetailsDao; + @Inject + private SecondaryStorageVmDao secondaryStorageVmDao; private final StateMachine2 _volStateMachine; protected List _storagePoolAllocators; @@ -824,19 +828,27 @@ public List allocateTemplatedVolumes(Type type, String name, DiskOf int volumesNumber = 1; List templateAsIsDisks = null; String configurationId = null; - if (template.isDeployAsIs()) { - UserVmDetailVO configurationDetail = userVmDetailsDao.findDetail(vm.getId(), VmDetailConstants.DEPLOY_AS_IS_CONFIGURATION); - if (configurationDetail != null) { - configurationId = configurationDetail.getValue(); - } - templateAsIsDisks = _tmpltMgr.getTemplateDisksOnImageStore(template.getId(), DataStoreRole.Image, configurationId); - if (CollectionUtils.isNotEmpty(templateAsIsDisks)) { - templateAsIsDisks = templateAsIsDisks.stream() - .filter(x -> !x.isIso()) - .sorted(Comparator.comparing(DatadiskTO::getDiskNumber)) - .collect(Collectors.toList()); + boolean deployVmAsIs = false; + if (template.isDeployAsIs() && vm.getType() != VirtualMachine.Type.SecondaryStorageVm) { + List runningSSVMs = secondaryStorageVmDao.getSecStorageVmListInStates(null, vm.getDataCenterId(), State.Running); + if (CollectionUtils.isEmpty(runningSSVMs)) { + s_logger.info("Could not find a running SSVM in datacenter " + vm.getDataCenterId() + " for deploying VM as is, " + + "not deploying VM " + vm.getInstanceName() + " as-is"); + } else { + UserVmDetailVO configurationDetail = userVmDetailsDao.findDetail(vm.getId(), VmDetailConstants.DEPLOY_AS_IS_CONFIGURATION); + if (configurationDetail != null) { + configurationId = configurationDetail.getValue(); + } + templateAsIsDisks = _tmpltMgr.getTemplateDisksOnImageStore(template.getId(), DataStoreRole.Image, configurationId); + if (CollectionUtils.isNotEmpty(templateAsIsDisks)) { + templateAsIsDisks = templateAsIsDisks.stream() + .filter(x -> !x.isIso()) + .sorted(Comparator.comparing(DatadiskTO::getDiskNumber)) + .collect(Collectors.toList()); + } + volumesNumber = templateAsIsDisks.size(); + deployVmAsIs = true; } - volumesNumber = templateAsIsDisks.size(); } if (volumesNumber < 1) { @@ -849,7 +861,7 @@ public List allocateTemplatedVolumes(Type type, String name, DiskOf String volumeName = name; Long volumeSize = rootDisksize; long deviceId = type.equals(Type.ROOT) ? 0L : 1L; - if (template.isDeployAsIs()) { + if (deployVmAsIs) { int volumeNameSuffix = templateAsIsDisks.get(number).getDiskNumber(); volumeName = String.format("%s-%d", volumeName, volumeNameSuffix); volumeSize = templateAsIsDisks.get(number).getVirtualSize();