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`)