From 2303afe55c5cae6f7a44ec58e27e16955991cc13 Mon Sep 17 00:00:00 2001 From: abhishek Date: Wed, 3 Nov 2010 17:40:40 -0700 Subject: [PATCH] making changes for disk offerings with a new column called customized being added, for the UI to cosume whilst deploying vm with an arbitrary volume size. The UI will use this value to set the right size and the offering will ensure the right tags are taken. --- .../com/cloud/service/ServiceOfferingVO.java | 2 +- .../src/com/cloud/storage/DiskOfferingVO.java | 21 +++++++++++++++---- server/src/com/cloud/api/ApiConstants.java | 1 + .../src/com/cloud/api/ApiResponseHelper.java | 1 + .../api/commands/CreateDiskOfferingCmd.java | 8 ++++++- .../api/response/DiskOfferingResponse.java | 12 +++++++++++ .../configuration/ConfigurationManager.java | 3 ++- .../ConfigurationManagerImpl.java | 19 ++++++++++------- .../cloud/server/ConfigurationServerImpl.java | 2 +- .../cloud/server/ManagementServerImpl.java | 7 ++++++- server/src/com/cloud/test/DatabaseConfig.java | 2 +- setup/db/create-schema.sql | 1 + 12 files changed, 62 insertions(+), 17 deletions(-) diff --git a/core/src/com/cloud/service/ServiceOfferingVO.java b/core/src/com/cloud/service/ServiceOfferingVO.java index d7983af7a9d..d4e48cfbe51 100644 --- a/core/src/com/cloud/service/ServiceOfferingVO.java +++ b/core/src/com/cloud/service/ServiceOfferingVO.java @@ -63,7 +63,7 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering } public ServiceOfferingVO(String name, int cpu, int ramSize, int speed, int rateMbps, int multicastRateMbps, boolean offerHA, String displayText, NetworkOffering.GuestIpType guestIpType, boolean useLocalStorage, boolean recreatable, String tags, boolean systemUse) { - super(name, displayText, false, tags, recreatable, useLocalStorage, systemUse); + super(name, displayText, false, tags, recreatable, useLocalStorage, systemUse,false); this.cpu = cpu; this.ramSize = ramSize; this.speed = speed; diff --git a/core/src/com/cloud/storage/DiskOfferingVO.java b/core/src/com/cloud/storage/DiskOfferingVO.java index 10027a0b2f6..c1d01371ad8 100644 --- a/core/src/com/cloud/storage/DiskOfferingVO.java +++ b/core/src/com/cloud/storage/DiskOfferingVO.java @@ -90,10 +90,13 @@ public class DiskOfferingVO implements DiskOffering { @Column(name="system_use") private boolean systemUse; + @Column(name="customized") + private boolean customized; + public DiskOfferingVO() { } - public DiskOfferingVO(long domainId, String name, String displayText, long diskSize, String tags) { + public DiskOfferingVO(long domainId, String name, String displayText, long diskSize, String tags, Boolean isCustomized) { this.domainId = domainId; this.name = name; this.displayText = displayText; @@ -101,10 +104,11 @@ public class DiskOfferingVO implements DiskOffering { this.tags = tags; this.recreatable = false; this.type = Type.Disk; - this.useLocalStorage = false; + this.useLocalStorage = false; + this.customized = isCustomized; } - public DiskOfferingVO(String name, String displayText, boolean mirrored, String tags, boolean recreatable, boolean useLocalStorage, boolean systemUse) { + public DiskOfferingVO(String name, String displayText, boolean mirrored, String tags, boolean recreatable, boolean useLocalStorage, boolean systemUse, boolean customized) { this.domainId = null; this.type = Type.Service; this.name = name; @@ -114,6 +118,7 @@ public class DiskOfferingVO implements DiskOffering { this.recreatable = recreatable; this.useLocalStorage = useLocalStorage; this.systemUse = systemUse; + this.customized = customized; } @Override @@ -121,7 +126,15 @@ public class DiskOfferingVO implements DiskOffering { return id; } - @Override + public boolean isCustomized() { + return customized; + } + + public void setCustomized(boolean customized) { + this.customized = customized; + } + + @Override public String getUniqueName() { return uniqueName; } diff --git a/server/src/com/cloud/api/ApiConstants.java b/server/src/com/cloud/api/ApiConstants.java index aa501f7fbe7..23674d26f25 100644 --- a/server/src/com/cloud/api/ApiConstants.java +++ b/server/src/com/cloud/api/ApiConstants.java @@ -39,6 +39,7 @@ public class ApiConstants { public static final String CPU_NUMBER = "cpunumber"; public static final String CPU_SPEED = "cpuspeed"; public static final String CREATED = "created"; + public static final String CUSTOMIZED = "customized"; public static final String DESCRIPTION = "description"; public static final String DESTINATION_ZONE_ID = "destzoneid"; public static final String DETAILS = "details"; diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index aef6c8ac975..4c4aa9ec216 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -246,6 +246,7 @@ public class ApiResponseHelper { diskOfferingResponse.setDomainId(offering.getDomainId()); } diskOfferingResponse.setTags(offering.getTags()); + diskOfferingResponse.setCustomized(offering.isCustomized()); return diskOfferingResponse; } diff --git a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java index c8267a82228..a99bf88e058 100755 --- a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java +++ b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java @@ -39,7 +39,7 @@ public class CreateDiskOfferingCmd extends BaseCmd { //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// - @Parameter(name=ApiConstants.DISK_SIZE, type=CommandType.LONG, required=true, description="disk size of the disk offering in GB") + @Parameter(name=ApiConstants.DISK_SIZE, type=CommandType.LONG, description="disk size of the disk offering in GB") private Long diskSize; @Parameter(name=ApiConstants.DISPLAY_TEXT, type=CommandType.STRING, required=true, description="alternate display text of the disk offering") @@ -54,6 +54,8 @@ public class CreateDiskOfferingCmd extends BaseCmd { @Parameter(name=ApiConstants.TAGS, type=CommandType.STRING, description="tags for the disk offering") private String tags; + @Parameter(name=ApiConstants.CUSTOMIZED, type=CommandType.BOOLEAN, description="whether disk offering is custom or not") + private Boolean customized; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -78,6 +80,10 @@ public class CreateDiskOfferingCmd extends BaseCmd { return tags; } + public Boolean isCustomized(){ + return customized; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/server/src/com/cloud/api/response/DiskOfferingResponse.java b/server/src/com/cloud/api/response/DiskOfferingResponse.java index c3b8a8b8e83..ed73a90bd1d 100644 --- a/server/src/com/cloud/api/response/DiskOfferingResponse.java +++ b/server/src/com/cloud/api/response/DiskOfferingResponse.java @@ -48,6 +48,9 @@ public class DiskOfferingResponse extends BaseResponse { @SerializedName("ismirrored") private Boolean mirrored; + @SerializedName("isCustomized") + private Boolean customized; + @SerializedName(ApiConstants.TAGS) @Param(description="the tags for the disk offering") private String tags; @@ -122,4 +125,13 @@ public class DiskOfferingResponse extends BaseResponse { public void setTags(String tags) { this.tags = tags; } + + public Boolean isCustomized() { + return customized; + } + + public void setCustomized(Boolean customized) { + this.customized = customized; + } + } diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index ed4c5046a06..a5a35a36a21 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -147,9 +147,10 @@ public interface ConfigurationManager extends Manager { * @param description * @param numGibibytes * @param tags + * @param isCustomized * @return newly created disk offering */ - DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags); + DiskOfferingVO createDiskOffering(long domainId, String name, String description, Long numGibibytes, String tags, Boolean isCustomized); /** * Creates a new pod diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 556587fa453..48aea9dec32 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1171,16 +1171,20 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } @Override - public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException { - if ((numGibibytes <= 0)) { + public DiskOfferingVO createDiskOffering(long domainId, String name, String description, Long numGibibytes, String tags, Boolean isCustomized) throws InvalidParameterValueException { + long diskSize = 0;//special case for custom disk offerings + if (numGibibytes != null && (numGibibytes <= 0)) { throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb."); - } else if (numGibibytes > _maxVolumeSizeInGb) { + } else if (numGibibytes != null && (numGibibytes > _maxVolumeSizeInGb)) { throw new InvalidParameterValueException("The maximum size for a disk is " + _maxVolumeSizeInGb + " Gb."); } - long diskSize = numGibibytes * 1024; + if(numGibibytes != null){ + diskSize = numGibibytes * 1024; + } + tags = cleanupTags(tags); - DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags); + DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags, isCustomized); return _diskOfferingDao.persist(newDiskOffering); } @@ -1189,14 +1193,15 @@ public class ConfigurationManagerImpl implements ConfigurationManager { Long domainId = cmd.getDomainId(); String name = cmd.getOfferingName(); String description = cmd.getDisplayText(); - int numGibibytes = cmd.getDiskSize().intValue(); + Long numGibibytes = cmd.getDiskSize(); + Boolean isCustomized = cmd.isCustomized() != null ? cmd.isCustomized() : false; //false by default String tags = cmd.getTags(); if (domainId == null) { domainId = Long.valueOf(DomainVO.ROOT_DOMAIN); } - return createDiskOffering(domainId, name, description, numGibibytes, tags); + return createDiskOffering(domainId, name, description, numGibibytes, tags, isCustomized); } @Override diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 26ad4d94628..3e0e3c0fc52 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -643,7 +643,7 @@ public class ConfigurationServerImpl implements ConfigurationServer { long diskSize = numGibibytes * 1024; tags = cleanupTags(tags); - DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags); + DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags,false); return _diskOfferingDao.persist(newDiskOffering); } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 90ca883bf24..f8c324f16c5 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1860,11 +1860,16 @@ public class ManagementServerImpl implements ManagementServer { if (diskOfferingId != null) { diskOffering = _diskOfferingDao.findById(diskOfferingId); } - + if (isIso && diskOffering == null) { throw new InvalidParameterValueException("Please specify a valid disk offering ID."); } + //if it is a custom disk offering,AND the size passed in here is <= 0; error out + if(diskOffering.isCustomized() && size <= 0){ + throw new InvalidParameterValueException("Please specify a valid disk size for VM creation; custom disk offering has no size set"); + } + // validate that the template is usable by the account if (!template.isPublicTemplate()) { Long templateOwner = template.getAccountId(); diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 47bbcfc3540..881a5dec434 100644 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java @@ -798,7 +798,7 @@ public class DatabaseConfig { newTags.delete(newTags.length() - 1, newTags.length()); tags = newTags.toString(); } - DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace, tags); + DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace, tags, false); diskOffering.setUseLocalStorage(local); DiskOfferingDaoImpl offering = ComponentLocator.inject(DiskOfferingDaoImpl.class); try { diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index f66718bdb66..3e94ad48669 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -887,6 +887,7 @@ CREATE TABLE `cloud`.`disk_offering` ( `use_local_storage` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Indicates whether local storage pools should be used', `unique_name` varchar(32) UNIQUE COMMENT 'unique name', `system_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'is this offering for system used only', + `customized` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '0 implies not customized by default', `removed` datetime COMMENT 'date removed', `created` datetime COMMENT 'date the disk offering was created', PRIMARY KEY (`id`)