diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java index 5015f7c51b8..82a0fcbd5b9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java @@ -31,6 +31,7 @@ import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.ServiceOfferingResponse; +import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.CollectionUtils; @@ -216,6 +217,9 @@ public class CreateServiceOfferingCmd extends BaseCmd { since = "4.13") private Integer minMemory; + @Parameter(name = ApiConstants.STORAGE_POLICY, type = CommandType.UUID, entityType = VsphereStoragePoliciesResponse.class,required = false, description = "Name of the storage policy defined at vCenter, this is applicable only for VMware") + private Long storagePolicy; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -418,6 +422,10 @@ public class CreateServiceOfferingCmd extends BaseCmd { return minMemory; } + public Long getStoragePolicy() { + return storagePolicy; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java index f905ab98dd5..10ba8d574a1 100644 --- a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java +++ b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java @@ -26,4 +26,5 @@ import com.cloud.utils.db.GenericDao; public interface ServiceOfferingDetailsDao extends GenericDao, ResourceDetailsDao { List findDomainIds(final long resourceId); List findZoneIds(final long resourceId); + String getDetail(Long diskOfferingId, String key); } \ No newline at end of file diff --git a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java index 76840267461..0080174874d 100644 --- a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java @@ -58,4 +58,13 @@ public class ServiceOfferingDetailsDaoImpl extends ResourceDetailsDaoBase filteredDomainIds = filterChildSubDomains(domainIds); @@ -2620,6 +2627,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } + if (storagePolicyID != null) { + detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), ApiConstants.STORAGE_POLICY, String.valueOf(storagePolicyID), false)); + } + if ((offering = _serviceOfferingDao.persist(offering)) != null) { for (Long domainId : filteredDomainIds) { detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), ApiConstants.DOMAIN_ID, String.valueOf(domainId), false)); diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 0271e428c9b..eedcf71983b 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -42,6 +42,7 @@ import javax.inject.Inject; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.dc.VsphereStoragePolicyVO; import com.cloud.dc.dao.VsphereStoragePolicyDao; +import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.utils.StringUtils; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; @@ -307,6 +308,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @Inject DiskOfferingDetailsDao _diskOfferingDetailsDao; @Inject + ServiceOfferingDetailsDao _serviceOfferingDetailsDao; + @Inject VsphereStoragePolicyDao _vsphereStoragePolicyDao; protected List _discoverers; @@ -1990,7 +1993,16 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C List> answers = new ArrayList>(); for (Volume volume : volumes) { - String storagePolicyId = _diskOfferingDetailsDao.getDetail(volume.getDiskOfferingId(), ApiConstants.STORAGE_POLICY); + String storagePolicyId = null; + if (volume.getVolumeType() == Type.ROOT) { + Long vmId = volume.getInstanceId(); + if (vmId != null) { + VMInstanceVO vm = _vmInstanceDao.findByIdIncludingRemoved(vmId); + storagePolicyId = _serviceOfferingDetailsDao.getDetail(vm.getServiceOfferingId(), ApiConstants.STORAGE_POLICY); + } + } else { + storagePolicyId = _diskOfferingDetailsDao.getDetail(volume.getDiskOfferingId(), ApiConstants.STORAGE_POLICY); + } if (org.apache.commons.lang.StringUtils.isNotEmpty(storagePolicyId)) { VsphereStoragePolicyVO storagePolicyVO = _vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyId)); List hostIds = getUpHostsInPool(pool.getId());