Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 58C3910B7D for ; Tue, 18 Jun 2013 08:03:15 +0000 (UTC) Received: (qmail 52253 invoked by uid 500); 18 Jun 2013 08:03:14 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 52211 invoked by uid 500); 18 Jun 2013 08:03:14 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 52189 invoked by uid 99); 18 Jun 2013 08:03:14 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Jun 2013 08:03:14 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id B86FB8A6C99; Tue, 18 Jun 2013 08:03:13 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: weizhou@apache.org To: commits@cloudstack.apache.org Date: Tue, 18 Jun 2013 08:03:14 -0000 Message-Id: <12572afe99f049ea9be43543e5932eee@git.apache.org> In-Reply-To: <1850d060c7704ac8aa442f9a69f03dea@git.apache.org> References: <1850d060c7704ac8aa442f9a69f03dea@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] git commit: updated refs/heads/master to 882220e CLOUDSTACK-1301: VM Disk I/O Throttling Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/882220e8 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/882220e8 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/882220e8 Branch: refs/heads/master Commit: 882220e802bb449081ad454251c856e1cd0d7fda Parents: 9e2eeb2 Author: Wei Zhou Authored: Tue Jun 18 10:02:55 2013 +0200 Committer: Wei Zhou Committed: Tue Jun 18 10:02:55 2013 +0200 ---------------------------------------------------------------------- api/src/com/cloud/agent/api/to/VolumeTO.java | 37 ++++ api/src/com/cloud/offering/DiskOffering.java | 16 ++ api/src/com/cloud/vm/DiskProfile.java | 36 ++++ .../org/apache/cloudstack/api/ApiConstants.java | 4 + .../admin/offering/CreateDiskOfferingCmd.java | 28 +++ .../offering/CreateServiceOfferingCmd.java | 28 +++ .../api/response/DiskOfferingResponse.java | 28 +++ .../api/response/ServiceOfferingResponse.java | 28 +++ .../cloudstack/api/response/VolumeResponse.java | 44 +++++ .../classes/resources/messages.properties | 4 + .../cloud/agent/api/AttachVolumeCommand.java | 36 ++++ .../src/com/cloud/storage/DiskOfferingVO.java | 44 +++++ .../kvm/resource/LibvirtComputingResource.java | 31 +++- .../kvm/resource/LibvirtDomainXMLParser.java | 25 +++ .../hypervisor/kvm/resource/LibvirtVMDef.java | 48 +++++ .../api/query/dao/DiskOfferingJoinDaoImpl.java | 5 + .../query/dao/ServiceOfferingJoinDaoImpl.java | 4 + .../cloud/api/query/dao/VolumeJoinDaoImpl.java | 5 + .../cloud/api/query/vo/DiskOfferingJoinVO.java | 42 +++++ .../api/query/vo/ServiceOfferingJoinVO.java | 41 ++++ .../com/cloud/api/query/vo/VolumeJoinVO.java | 43 +++++ server/src/com/cloud/configuration/Config.java | 4 + .../configuration/ConfigurationManager.java | 14 +- .../configuration/ConfigurationManagerImpl.java | 33 +++- .../src/com/cloud/storage/StorageManager.java | 10 + .../com/cloud/storage/StorageManagerImpl.java | 65 +++++++ .../com/cloud/storage/VolumeManagerImpl.java | 67 ++++++- server/src/com/cloud/test/DatabaseConfig.java | 28 +++ .../cloud/vpc/MockConfigurationManagerImpl.java | 6 +- setup/db/db/schema-410to420.sql | 29 ++- ui/dictionary.jsp | 4 + ui/scripts/configuration.js | 185 ++++++++++++++++++- 32 files changed, 1007 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/com/cloud/agent/api/to/VolumeTO.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/agent/api/to/VolumeTO.java b/api/src/com/cloud/agent/api/to/VolumeTO.java index 4cbe82b..cc0e818 100644 --- a/api/src/com/cloud/agent/api/to/VolumeTO.java +++ b/api/src/com/cloud/agent/api/to/VolumeTO.java @@ -37,6 +37,10 @@ public class VolumeTO implements InternalIdentity { private long deviceId; private String chainInfo; private String guestOsType; + private Long bytesReadRate; + private Long bytesWriteRate; + private Long iopsReadRate; + private Long iopsWriteRate; public VolumeTO(long id, Volume.Type type, StoragePoolType poolType, String poolUuid, String name, String mountPoint, String path, long size, String chainInfo) { this.id = id; @@ -133,4 +137,37 @@ public class VolumeTO implements InternalIdentity { public String toString() { return new StringBuilder("Vol[").append(id).append("|").append(type).append("|").append(path).append("|").append(size).append("]").toString(); } + + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/com/cloud/offering/DiskOffering.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/offering/DiskOffering.java b/api/src/com/cloud/offering/DiskOffering.java index dd77c70..ae4528c 100644 --- a/api/src/com/cloud/offering/DiskOffering.java +++ b/api/src/com/cloud/offering/DiskOffering.java @@ -52,4 +52,20 @@ public interface DiskOffering extends InfrastructureEntity, Identity, InternalId boolean isCustomized(); void setDiskSize(long diskSize); + + void setBytesReadRate(Long bytesReadRate); + + Long getBytesReadRate(); + + void setBytesWriteRate(Long bytesWriteRate); + + Long getBytesWriteRate(); + + void setIopsReadRate(Long iopsReadRate); + + Long getIopsReadRate(); + + void setIopsWriteRate(Long iopsWriteRate); + + Long getIopsWriteRate(); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/com/cloud/vm/DiskProfile.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/vm/DiskProfile.java b/api/src/com/cloud/vm/DiskProfile.java index e3a3386..3d4c9e7 100644 --- a/api/src/com/cloud/vm/DiskProfile.java +++ b/api/src/com/cloud/vm/DiskProfile.java @@ -35,6 +35,10 @@ public class DiskProfile { private Long templateId; private long volumeId; private String path; + private Long bytesReadRate; + private Long bytesWriteRate; + private Long iopsReadRate; + private Long iopsWriteRate; private HypervisorType hyperType; @@ -154,4 +158,36 @@ public class DiskProfile { public void setSize(long size) { this.size = size; } + + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/org/apache/cloudstack/api/ApiConstants.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index ab1402c..1704ca3 100755 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -31,6 +31,8 @@ public class ApiConstants { public static final String BOOTABLE = "bootable"; public static final String BIND_DN = "binddn"; public static final String BIND_PASSWORD = "bindpass"; + public static final String BYTES_READ_RATE = "bytesreadrate"; + public static final String BYTES_WRITE_RATE = "byteswriterate"; public static final String CATEGORY = "category"; public static final String CERTIFICATE = "certificate"; public static final String PRIVATE_KEY = "privatekey"; @@ -104,6 +106,8 @@ public class ApiConstants { public static final String INTERNAL_DNS1 = "internaldns1"; public static final String INTERNAL_DNS2 = "internaldns2"; public static final String INTERVAL_TYPE = "intervaltype"; + public static final String IOPS_READ_RATE = "iopsreadrate"; + public static final String IOPS_WRITE_RATE = "iopswriterate"; public static final String IP_ADDRESS = "ipaddress"; public static final String IP6_ADDRESS = "ip6address"; public static final String IP_ADDRESS_ID = "ipaddressid"; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java index aa11599..a2c5f77 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java @@ -62,6 +62,18 @@ public class CreateDiskOfferingCmd extends BaseCmd { @Parameter(name=ApiConstants.STORAGE_TYPE, type=CommandType.STRING, description="the storage type of the disk offering. Values are local and shared.") private String storageType = ServiceOffering.StorageType.shared.toString(); + @Parameter(name=ApiConstants.BYTES_READ_RATE, type=CommandType.LONG, required=false, description="bytes read rate of the disk offering") + private Long bytesReadRate; + + @Parameter(name=ApiConstants.BYTES_WRITE_RATE, type=CommandType.LONG, required=false, description="bytes write rate of the disk offering") + private Long bytesWriteRate; + + @Parameter(name=ApiConstants.IOPS_READ_RATE, type=CommandType.LONG, required=false, description="io requests read rate of the disk offering") + private Long iopsReadRate; + + @Parameter(name=ApiConstants.IOPS_WRITE_RATE, type=CommandType.LONG, required=false, description="io requests write rate of the disk offering") + private Long iopsWriteRate; + @Parameter(name=ApiConstants.DISPLAY_OFFERING, type=CommandType.BOOLEAN, description="an optional field, whether to display the offering to the end user or not.") private Boolean displayOffering; @@ -93,6 +105,22 @@ public class CreateDiskOfferingCmd extends BaseCmd { return domainId; } + public Long getBytesReadRate() { + return bytesReadRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } + public String getStorageType() { return storageType; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java index 4c54a4e..decac29 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java @@ -93,6 +93,18 @@ public class CreateServiceOfferingCmd extends BaseCmd { @Parameter(name = ApiConstants.SERVICE_OFFERING_DETAILS, type = CommandType.MAP, description = "details for planner, used to store specific parameters") private Map details; + @Parameter(name=ApiConstants.BYTES_READ_RATE, type=CommandType.LONG, required=false, description="bytes read rate of the disk offering") + private Long bytesReadRate; + + @Parameter(name=ApiConstants.BYTES_WRITE_RATE, type=CommandType.LONG, required=false, description="bytes write rate of the disk offering") + private Long bytesWriteRate; + + @Parameter(name=ApiConstants.IOPS_READ_RATE, type=CommandType.LONG, required=false, description="io requests read rate of the disk offering") + private Long iopsReadRate; + + @Parameter(name=ApiConstants.IOPS_WRITE_RATE, type=CommandType.LONG, required=false, description="io requests write rate of the disk offering") + private Long iopsWriteRate; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -171,6 +183,22 @@ public class CreateServiceOfferingCmd extends BaseCmd { return params; } + public Long getBytesReadRate() { + return bytesReadRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/org/apache/cloudstack/api/response/DiskOfferingResponse.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/response/DiskOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/DiskOfferingResponse.java index 377e66e..35cf21a 100644 --- a/api/src/org/apache/cloudstack/api/response/DiskOfferingResponse.java +++ b/api/src/org/apache/cloudstack/api/response/DiskOfferingResponse.java @@ -58,6 +58,18 @@ public class DiskOfferingResponse extends BaseResponse { @SerializedName("storagetype") @Param(description="the storage type for this disk offering") private String storageType; + @SerializedName("diskBytesReadRate") @Param(description="bytes read rate of the disk offering") + private Long bytesReadRate; + + @SerializedName("diskBytesWriteRate") @Param(description="bytes write rate of the disk offering") + private Long bytesWriteRate; + + @SerializedName("diskIopsReadRate") @Param(description="io requests read rate of the disk offering") + private Long iopsReadRate; + + @SerializedName("diskIopsWriteRate") @Param(description="io requests write rate of the disk offering") + private Long iopsWriteRate; + @SerializedName("displayoffering") @Param(description="whether to display the offering to the end user or not.") private Boolean displayOffering; @@ -149,4 +161,20 @@ public class DiskOfferingResponse extends BaseResponse { public void setStorageType(String storageType) { this.storageType = storageType; } + + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java index 31533f8..288f76b 100644 --- a/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java @@ -87,6 +87,18 @@ public class ServiceOfferingResponse extends BaseResponse { @SerializedName(ApiConstants.NETWORKRATE) @Param(description="data transfer rate in megabits per second allowed.") private Integer networkRate; + @SerializedName("diskBytesReadRate") @Param(description="bytes read rate of the service offering") + private Long bytesReadRate; + + @SerializedName("diskBytesWriteRate") @Param(description="bytes write rate of the service offering") + private Long bytesWriteRate; + + @SerializedName("diskIopsReadRate") @Param(description="io requests read rate of the service offering") + private Long iopsReadRate; + + @SerializedName("diskIopsWriteRate") @Param(description="io requests write rate of the service offering") + private Long iopsWriteRate; + @SerializedName(ApiConstants.DEPLOYMENT_PLANNER) @Param(description="deployment strategy used to deploy VM.") private String deploymentPlanner; @@ -248,4 +260,20 @@ public class ServiceOfferingResponse extends BaseResponse { public void setVolatileVm(boolean isVolatile) { this.isVolatile = isVolatile; } + + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/api/src/org/apache/cloudstack/api/response/VolumeResponse.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java index 21d7d1a..e3463bd 100644 --- a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java +++ b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java @@ -110,6 +110,18 @@ public class VolumeResponse extends BaseResponse implements ControlledViewEntity @Param(description = "shared or local storage") private String storageType; + @SerializedName("diskBytesReadRate") @Param(description="bytes read rate of the disk volume") + private Long bytesReadRate; + + @SerializedName("diskBytesWriteRate") @Param(description="bytes write rate of the disk volume") + private Long bytesWriteRate; + + @SerializedName("diskIopsReadRate") @Param(description="io requests read rate of the disk volume") + private Long iopsReadRate; + + @SerializedName("diskIopsWriteRate") @Param(description="io requests write rate of the disk volume") + private Long iopsWriteRate; + @SerializedName(ApiConstants.HYPERVISOR) @Param(description = "Hypervisor the volume belongs to") private String hypervisor; @@ -258,6 +270,38 @@ public class VolumeResponse extends BaseResponse implements ControlledViewEntity this.storageType = storageType; } + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } + public void setHypervisor(String hypervisor) { this.hypervisor = hypervisor; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/client/WEB-INF/classes/resources/messages.properties ---------------------------------------------------------------------- diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index 2b17359..a0a36c8 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -466,6 +466,10 @@ label.disable.vpn=Disable VPN label.disabled=Disabled label.disabling.vpn.access=Disabling VPN Access label.disk.allocated=Disk Allocated +label.disk.bytes.read.rate=Disk Read Rate (BPS) +label.disk.bytes.write.rate=Disk Write Rate (BPS) +label.disk.iops.read.rate=Disk Read Rate (IOPS) +label.disk.iops.write.rate=Disk Write Rate (IOPS) label.disk.offering=Disk Offering label.disk.read.bytes=Disk Read (Bytes) label.disk.read.io=Disk Read (IO) http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/core/src/com/cloud/agent/api/AttachVolumeCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/AttachVolumeCommand.java b/core/src/com/cloud/agent/api/AttachVolumeCommand.java index 302b8f8..2658262 100644 --- a/core/src/com/cloud/agent/api/AttachVolumeCommand.java +++ b/core/src/com/cloud/agent/api/AttachVolumeCommand.java @@ -29,6 +29,10 @@ public class AttachVolumeCommand extends Command { String volumeName; Long deviceId; String chainInfo; + Long bytesReadRate; + Long bytesWriteRate; + Long iopsReadRate; + Long iopsWriteRate; protected AttachVolumeCommand() { } @@ -96,4 +100,36 @@ public class AttachVolumeCommand extends Command { public String getChainInfo() { return chainInfo; } + + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/engine/schema/src/com/cloud/storage/DiskOfferingVO.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/storage/DiskOfferingVO.java b/engine/schema/src/com/cloud/storage/DiskOfferingVO.java index 909d7fe..44f9e8f 100755 --- a/engine/schema/src/com/cloud/storage/DiskOfferingVO.java +++ b/engine/schema/src/com/cloud/storage/DiskOfferingVO.java @@ -100,6 +100,18 @@ public class DiskOfferingVO implements DiskOffering { @Column(name="sort_key") int sortKey; + @Column(name="bytes_read_rate") + Long bytesReadRate; + + @Column(name="bytes_write_rate") + Long bytesWriteRate; + + @Column(name="iops_read_rate") + Long iopsReadRate; + + @Column(name="iops_write_rate") + Long iopsWriteRate; + @Column(name="display_offering") boolean displayOffering; @@ -327,4 +339,36 @@ public class DiskOfferingVO implements DiskOffering { public void setDisplayOffering(boolean displayOffering) { this.displayOffering = displayOffering; } + + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index f90edd8..7d90f6a 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -336,6 +336,8 @@ ServerResource { protected HypervisorType _hypervisorType; protected String _hypervisorURI; + protected long _hypervisorLibvirtVersion; + protected long _hypervisorQemuVersion; protected String _hypervisorPath; protected String _networkDirectSourceMode; protected String _networkDirectDevice; @@ -735,6 +737,8 @@ ServerResource { try { _hvVersion = conn.getVersion(); _hvVersion = (_hvVersion % 1000000) / 1000; + _hypervisorLibvirtVersion = conn.getLibVirVersion(); + _hypervisorQemuVersion = conn.getVersion(); } catch (LibvirtException e) { s_logger.trace("Ignoring libvirt error.", e); } @@ -1411,6 +1415,10 @@ ServerResource { VolumeTO volume = new VolumeTO(cmd.getVolumeId(), dskch.getType(), pool.getType(), pool.getUuid(), pool.getPath(), vol.getName(), vol.getName(), disksize, null); + volume.setBytesReadRate(dskch.getBytesReadRate()); + volume.setBytesWriteRate(dskch.getBytesWriteRate()); + volume.setIopsReadRate(dskch.getIopsReadRate()); + volume.setIopsWriteRate(dskch.getIopsWriteRate()); return new CreateAnswer(cmd, volume); } catch (CloudRuntimeException e) { s_logger.debug("Failed to create volume: " + e.toString()); @@ -2626,7 +2634,7 @@ ServerResource { cmd.getPoolUuid()); KVMPhysicalDisk disk = primary.getPhysicalDisk(cmd.getVolumePath()); attachOrDetachDisk(conn, cmd.getAttach(), cmd.getVmName(), disk, - cmd.getDeviceId().intValue()); + cmd.getDeviceId().intValue(), cmd.getBytesReadRate(), cmd.getBytesWriteRate(), cmd.getIopsReadRate(), cmd.getIopsWriteRate()); } catch (LibvirtException e) { return new AttachVolumeAnswer(cmd, e.toString()); } catch (InternalErrorException e) { @@ -3224,6 +3232,8 @@ ServerResource { } else { guest.setGuestType(GuestDef.guestType.KVM); vm.setHvsType(HypervisorType.KVM.toString().toLowerCase()); + vm.setLibvirtVersion(_hypervisorLibvirtVersion); + vm.setQemuVersion(_hypervisorQemuVersion); } guest.setGuestArch(vmTO.getArch()); guest.setMachineType("pc"); @@ -3497,6 +3507,15 @@ ServerResource { } + if ((volume.getBytesReadRate() != null) && (volume.getBytesReadRate() > 0)) + disk.setBytesReadRate(volume.getBytesReadRate()); + if ((volume.getBytesWriteRate() != null) && (volume.getBytesWriteRate() > 0)) + disk.setBytesWriteRate(volume.getBytesWriteRate()); + if ((volume.getIopsReadRate() != null) && (volume.getIopsReadRate() > 0)) + disk.setIopsReadRate(volume.getIopsReadRate()); + if ((volume.getIopsWriteRate() != null) && (volume.getIopsWriteRate() > 0)) + disk.setIopsWriteRate(volume.getIopsWriteRate()); + vm.getDevices().addDevice(disk); } @@ -3630,7 +3649,7 @@ ServerResource { protected synchronized String attachOrDetachDisk(Connect conn, boolean attach, String vmName, KVMPhysicalDisk attachingDisk, - int devId) throws LibvirtException, InternalErrorException { + int devId, Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate) throws LibvirtException, InternalErrorException { List disks = null; Domain dm = null; DiskDef diskdef = null; @@ -3670,6 +3689,14 @@ ServerResource { diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, DiskDef.diskBus.VIRTIO); } + if ((bytesReadRate != null) && (bytesReadRate > 0)) + diskdef.setBytesReadRate(bytesReadRate); + if ((bytesWriteRate != null) && (bytesWriteRate > 0)) + diskdef.setBytesWriteRate(bytesWriteRate); + if ((iopsReadRate != null) && (iopsReadRate > 0)) + diskdef.setIopsReadRate(iopsReadRate); + if ((iopsWriteRate != null) && (iopsWriteRate > 0)) + diskdef.setIopsWriteRate(iopsWriteRate); } String xml = diskdef.toString(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java index b8645e1..8514a5b 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java @@ -105,6 +105,31 @@ public class LibvirtDomainXMLParser { DiskDef.diskBus.valueOf(bus.toUpperCase())); } } + + NodeList iotune = disk.getElementsByTagName("iotune"); + if ((iotune != null) && (iotune.getLength() !=0)) { + String bytesReadRateStr = getTagValue("read_bytes_sec", (Element)iotune.item(0)); + if (bytesReadRateStr != null) { + Long bytesReadRate = Long.parseLong(bytesReadRateStr); + def.setBytesReadRate(bytesReadRate); + } + String bytesWriteRateStr = getTagValue("write_bytes_sec", (Element)iotune.item(0)); + if (bytesWriteRateStr != null) { + Long bytesWriteRate = Long.parseLong(bytesWriteRateStr); + def.setBytesWriteRate(bytesWriteRate); + } + String iopsReadRateStr = getTagValue("read_iops_sec", (Element)iotune.item(0)); + if (iopsReadRateStr != null) { + Long iopsReadRate = Long.parseLong(iopsReadRateStr); + def.setIopsReadRate(iopsReadRate); + } + String iopsWriteRateStr = getTagValue("write_iops_sec", (Element)iotune.item(0)); + if (iopsWriteRateStr != null) { + Long iopsWriteRate = Long.parseLong(iopsWriteRateStr); + def.setIopsWriteRate(iopsWriteRate); + } + } + diskDefs.add(def); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index e91e347..0aa0e14 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -22,8 +22,12 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import com.cloud.utils.script.Script; + public class LibvirtVMDef { private String _hvsType; + private static long _libvirtVersion; + private static long _qemuVersion; private String _domName; private String _domUUID; private String _desc; @@ -439,6 +443,10 @@ public class LibvirtVMDef { private boolean _readonly = false; private boolean _shareable = false; private boolean _deferAttach = false; + private Long _bytesReadRate; + private Long _bytesWriteRate; + private Long _iopsReadRate; + private Long _iopsWriteRate; public void setDeviceType(deviceType deviceType) { _deviceType = deviceType; @@ -584,6 +592,22 @@ public class LibvirtVMDef { return suffix - 'a'; } + public void setBytesReadRate(Long bytesReadRate) { + _bytesReadRate = bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + _bytesWriteRate = bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + _iopsReadRate = iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + _iopsWriteRate = iopsWriteRate; + } + @Override public String toString() { StringBuilder diskBuilder = new StringBuilder(); @@ -627,6 +651,22 @@ public class LibvirtVMDef { diskBuilder.append(" bus='" + _bus + "'"); } diskBuilder.append("/>\n"); + + if ((_deviceType != deviceType.CDROM) && (_libvirtVersion >= 9008) && (_qemuVersion >= 1001000) + && (((_bytesReadRate != null) && (_bytesReadRate > 0)) || ((_bytesWriteRate != null) && (_bytesWriteRate > 0)) + || ((_iopsReadRate != null) && (_iopsReadRate > 0)) || ((_iopsWriteRate != null) && (_iopsWriteRate > 0)) )) { // not CDROM, from libvirt 0.9.8 and QEMU 1.1.0 + diskBuilder.append("\n"); + if ((_bytesReadRate != null) && (_bytesReadRate > 0)) + diskBuilder.append("" + _bytesReadRate + "\n"); + if ((_bytesWriteRate != null) && (_bytesWriteRate > 0)) + diskBuilder.append("" + _bytesWriteRate + "\n"); + if ((_iopsReadRate != null) && (_iopsReadRate > 0)) + diskBuilder.append("" + _iopsReadRate + "\n"); + if ((_iopsWriteRate != null) && (_iopsWriteRate > 0)) + diskBuilder.append("" + _iopsWriteRate + "\n"); + diskBuilder.append("\n"); + } + diskBuilder.append("\n"); return diskBuilder.toString(); } @@ -1012,6 +1052,14 @@ public class LibvirtVMDef { return _hvsType; } + public void setLibvirtVersion(long libvirtVersion) { + _libvirtVersion = libvirtVersion; + } + + public void setQemuVersion(long qemuVersion) { + _qemuVersion = qemuVersion; + } + public void setDomainName(String domainName) { _domName = domainName; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java index 283181f..7022ee6 100644 --- a/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java @@ -75,7 +75,12 @@ public class DiskOfferingJoinDaoImpl extends GenericDaoBase implem } volResponse.setStorageType(volume.isUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared .toString()); + volResponse.setBytesReadRate(volume.getBytesReadRate()); + volResponse.setBytesWriteRate(volume.getBytesReadRate()); + volResponse.setIopsReadRate(volume.getIopsWriteRate()); + volResponse.setIopsWriteRate(volume.getIopsWriteRate()); + } Long poolId = volume.getPoolId(); String poolName = (poolId == null) ? "none" : volume.getPoolName(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java b/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java index 6d3cdcb..2336a48 100644 --- a/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java +++ b/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java @@ -64,6 +64,18 @@ public class DiskOfferingJoinVO extends BaseViewVO implements InternalIdentity, @Column(name="sort_key") int sortKey; + @Column(name="bytes_read_rate") + Long bytesReadRate; + + @Column(name="bytes_write_rate") + Long bytesWriteRate; + + @Column(name="iops_read_rate") + Long iopsReadRate; + + @Column(name="iops_write_rate") + Long iopsWriteRate; + @Column(name="type") Type type; @@ -239,6 +251,36 @@ public class DiskOfferingJoinVO extends BaseViewVO implements InternalIdentity, this.type = type; } + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/api/query/vo/ServiceOfferingJoinVO.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/vo/ServiceOfferingJoinVO.java b/server/src/com/cloud/api/query/vo/ServiceOfferingJoinVO.java index e87a101..05ff5f3 100644 --- a/server/src/com/cloud/api/query/vo/ServiceOfferingJoinVO.java +++ b/server/src/com/cloud/api/query/vo/ServiceOfferingJoinVO.java @@ -90,6 +90,17 @@ public class ServiceOfferingJoinVO extends BaseViewVO implements InternalIdentit @Column(name="sort_key") int sortKey; + @Column(name="bytes_read_rate") + Long bytesReadRate; + + @Column(name="bytes_write_rate") + Long bytesWriteRate; + + @Column(name="iops_read_rate") + Long iopsReadRate; + + @Column(name="iops_write_rate") + Long iopsWriteRate; @Column(name=GenericDao.CREATED_COLUMN) private Date created; @@ -329,5 +340,35 @@ public class ServiceOfferingJoinVO extends BaseViewVO implements InternalIdentit this.volatileVm = volatileVm; } + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/api/query/vo/VolumeJoinVO.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/query/vo/VolumeJoinVO.java b/server/src/com/cloud/api/query/vo/VolumeJoinVO.java index 6ef8c91..735cf9a 100644 --- a/server/src/com/cloud/api/query/vo/VolumeJoinVO.java +++ b/server/src/com/cloud/api/query/vo/VolumeJoinVO.java @@ -184,6 +184,18 @@ public class VolumeJoinVO extends BaseViewVO implements ControlledViewEntity { @Column(name="use_local_storage") private boolean useLocalStorage; + @Column(name="bytes_read_rate") + Long bytesReadRate; + + @Column(name="bytes_write_rate") + Long bytesWriteRate; + + @Column(name="iops_read_rate") + Long iopsReadRate; + + @Column(name="iops_write_rate") + Long iopsWriteRate; + @Column(name="pool_id") private long poolId; @@ -742,6 +754,37 @@ public class VolumeJoinVO extends BaseViewVO implements ControlledViewEntity { } + public void setBytesReadRate(Long bytesReadRate) { + this.bytesReadRate = bytesReadRate; + } + + public Long getBytesReadRate() { + return bytesReadRate; + } + + public void setBytesWriteRate(Long bytesWriteRate) { + this.bytesWriteRate = bytesWriteRate; + } + + public Long getBytesWriteRate() { + return bytesWriteRate; + } + + public void setIopsReadRate(Long iopsReadRate) { + this.iopsReadRate = iopsReadRate; + } + + public Long getIopsReadRate() { + return iopsReadRate; + } + + public void setIopsWriteRate(Long iopsWriteRate) { + this.iopsWriteRate = iopsWriteRate; + } + + public Long getIopsWriteRate() { + return iopsWriteRate; + } public long getPoolId() { return poolId; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/configuration/Config.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 5432ab6..f6fa974 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -239,6 +239,10 @@ public enum Config { VmDiskStatsInterval("Advanced", ManagementServer.class, Integer.class, "vm.disk.stats.interval", "0", "Interval (in seconds) to report vm disk statistics.", null), VmTransitionWaitInterval("Advanced", ManagementServer.class, Integer.class, "vm.tranisition.wait.interval", "3600", "Time (in seconds) to wait before taking over a VM in transition state", null), VmDestroyForcestop("Advanced", ManagementServer.class, Boolean.class, "vm.destroy.forcestop", "false", "On destroy, force-stop takes this value ", null), + VmDiskThrottlingIopsReadRate("Advanced", ManagementServer.class, Integer.class, "vm.disk.throttling.iops_read_rate", "0", "Default disk I/O read rate in requests per second allowed in User vm's disk.", null), + VmDiskThrottlingIopsWriteRate("Advanced", ManagementServer.class, Integer.class, "vm.disk.throttling.iops_write_rate", "0", "Default disk I/O writerate in requests per second allowed in User vm's disk.", null), + VmDiskThrottlingBytesReadRate("Advanced", ManagementServer.class, Integer.class, "vm.disk.throttling.bytes_read_rate", "0", "Default disk I/O read rate in bytes per second allowed in User vm's disk.", null), + VmDiskThrottlingBytesWriteRate("Advanced", ManagementServer.class, Integer.class, "vm.disk.throttling.bytes_write_rate", "0", "Default disk I/O writerate in bytes per second allowed in User vm's disk.", null), ControlCidr("Advanced", ManagementServer.class, String.class, "control.cidr", "169.254.0.0/16", "Changes the cidr for the control network traffic. Defaults to using link local. Must be unique within pods", null), ControlGateway("Advanced", ManagementServer.class, String.class, "control.gateway", "169.254.0.1", "gateway for the control network traffic", null), http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/configuration/ConfigurationManager.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index 8db037b..93cadfa 100755 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -81,10 +81,15 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @param useVirtualNetwork * @param deploymentPlanner * @param details + * @param bytesReadRate + * @param bytesWriteRate + * @param iopsReadRate + * @param iopsWriteRate * @return ID */ ServiceOfferingVO createServiceOffering(long userId, boolean isSystem, VirtualMachine.Type vm_typeType, String name, int cpu, int ramSize, int speed, String displayText, boolean localStorageRequired, - boolean offerHA, boolean limitResourceUse, boolean volatileVm, String tags, Long domainId, String hostTag, Integer networkRate, String deploymentPlanner, Map details); + boolean offerHA, boolean limitResourceUse, boolean volatileVm, String tags, Long domainId, String hostTag, Integer networkRate, String deploymentPlanner, Map details, + Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate); /** * Creates a new disk offering @@ -97,9 +102,14 @@ public interface ConfigurationManager extends ConfigurationService, Manager { * @param isCustomized * @param localStorageRequired * @param isDisplayOfferingEnabled + * @param bytesReadRate + * @param bytesWriteRate + * @param iopsReadRate + * @param iopsWriteRate * @return newly created disk offering */ - DiskOfferingVO createDiskOffering(Long domainId, String name, String description, Long numGibibytes, String tags, boolean isCustomized, boolean localStorageRequired, boolean isDisplayOfferingEnabled); + DiskOfferingVO createDiskOffering(Long domainId, String name, String description, Long numGibibytes, String tags, boolean isCustomized, boolean localStorageRequired, boolean isDisplayOfferingEnabled, + Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate); /** * Creates a new pod http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/configuration/ConfigurationManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 6dac26c..e7e3f74 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2031,7 +2031,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati return createServiceOffering(userId, cmd.getIsSystem(), vmType, cmd.getServiceOfferingName(), cpuNumber.intValue(), memory.intValue(), cpuSpeed.intValue(), cmd.getDisplayText(), localStorageRequired, offerHA, limitCpuUse, volatileVm, cmd.getTags(), cmd.getDomainId(), - cmd.getHostTag(), cmd.getNetworkRate(), cmd.getDeploymentPlanner(), cmd.getDetails()); + cmd.getHostTag(), cmd.getNetworkRate(), cmd.getDeploymentPlanner(), cmd.getDetails(), + cmd.getBytesReadRate(), cmd.getBytesWriteRate(), cmd.getIopsReadRate(), cmd.getIopsWriteRate()); } @Override @@ -2039,11 +2040,20 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati public ServiceOfferingVO createServiceOffering(long userId, boolean isSystem, VirtualMachine.Type vm_type, String name, int cpu, int ramSize, int speed, String displayText, boolean localStorageRequired, boolean offerHA, boolean limitResourceUse, boolean volatileVm, String tags, Long domainId, String hostTag, - Integer networkRate, String deploymentPlanner, Map details) { + Integer networkRate, String deploymentPlanner, Map details, Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate) { tags = cleanupTags(tags); ServiceOfferingVO offering = new ServiceOfferingVO(name, cpu, ramSize, speed, networkRate, null, offerHA, limitResourceUse, volatileVm, displayText, localStorageRequired, false, tags, isSystem, vm_type, domainId, hostTag, deploymentPlanner); + if ((bytesReadRate != null) && (bytesReadRate > 0)) + offering.setBytesReadRate(bytesReadRate); + if ((bytesWriteRate != null) && (bytesWriteRate > 0)) + offering.setBytesWriteRate(bytesWriteRate); + if ((iopsReadRate != null) && (iopsReadRate > 0)) + offering.setIopsReadRate(iopsReadRate); + if ((iopsWriteRate != null) && (iopsWriteRate > 0)) + offering.setIopsWriteRate(iopsWriteRate); + if ((offering = _serviceOfferingDao.persist(offering)) != null) { if (details != null) { _serviceOfferingDetailsDao.persist(offering.getId(), details); @@ -2129,7 +2139,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati @Override @ActionEvent(eventType = EventTypes.EVENT_DISK_OFFERING_CREATE, eventDescription = "creating disk offering") - public DiskOfferingVO createDiskOffering(Long domainId, String name, String description, Long numGibibytes, String tags, boolean isCustomized, boolean localStorageRequired, boolean isDisplayOfferingEnabled) { + public DiskOfferingVO createDiskOffering(Long domainId, String name, String description, Long numGibibytes, String tags, boolean isCustomized, boolean localStorageRequired, boolean isDisplayOfferingEnabled, + Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate) { 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."); @@ -2149,6 +2160,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize, tags, isCustomized); newDiskOffering.setUseLocalStorage(localStorageRequired); newDiskOffering.setDisplayOffering(isDisplayOfferingEnabled); + + if (bytesReadRate != null && (bytesReadRate > 0)) + newDiskOffering.setBytesReadRate(bytesReadRate); + if (bytesWriteRate != null && (bytesWriteRate > 0)) + newDiskOffering.setBytesWriteRate(bytesWriteRate); + if (iopsReadRate != null && (iopsReadRate > 0)) + newDiskOffering.setIopsReadRate(iopsReadRate); + if (iopsWriteRate != null && (iopsWriteRate > 0)) + newDiskOffering.setIopsWriteRate(iopsWriteRate); + UserContext.current().setEventDetails("Disk offering id=" + newDiskOffering.getId()); DiskOfferingVO offering = _diskOfferingDao.persist(newDiskOffering); if (offering != null) { @@ -2189,7 +2210,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } - return createDiskOffering(domainId, name, description, numGibibytes, tags, isCustomized, localStorageRequired, isDisplayOfferingEnabled); + Long bytesReadRate = cmd.getBytesReadRate(); + Long bytesWriteRate = cmd.getBytesWriteRate(); + Long iopsReadRate = cmd.getIopsReadRate(); + Long iopsWriteRate = cmd.getIopsWriteRate(); + return createDiskOffering(domainId, name, description, numGibibytes, tags, isCustomized, localStorageRequired, isDisplayOfferingEnabled, bytesReadRate, bytesWriteRate, iopsReadRate, iopsWriteRate); } @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/storage/StorageManager.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index d49a7f8..29c7ebc 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -35,6 +35,8 @@ import com.cloud.exception.ConnectionException; import com.cloud.exception.StorageUnavailableException; import com.cloud.host.Host; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.utils.Pair; import com.cloud.vm.DiskProfile; @@ -122,4 +124,12 @@ public interface StorageManager extends StorageService { DataStore createLocalStorage(Host host, StoragePoolInfo poolInfo) throws ConnectionException; BigDecimal getStorageOverProvisioningFactor(Long dcId); + + Long getDiskBytesReadRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering); + + Long getDiskBytesWriteRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering); + + Long getDiskIopsReadRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering); + + Long getDiskIopsWriteRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/storage/StorageManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 655eaea..20b435c 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -127,6 +127,7 @@ import com.cloud.resource.ResourceState; import com.cloud.server.ManagementServer; import com.cloud.server.StatsCollector; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Volume.Type; @@ -142,6 +143,7 @@ import com.cloud.storage.dao.VMTemplateS3Dao; import com.cloud.storage.dao.VMTemplateSwiftDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeHostDao; +import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.download.DownloadMonitor; import com.cloud.storage.listener.StoragePoolMonitor; import com.cloud.storage.listener.VolumeStateListener; @@ -1886,4 +1888,67 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C return null; } + // get bytesReadRate from service_offering, disk_offering and vm.disk.throttling.bytes_read_rate + @Override + public Long getDiskBytesReadRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering) { + if ((offering != null) && (offering.getBytesReadRate() != null) && (offering.getBytesReadRate() > 0)) { + return offering.getBytesReadRate(); + } else if ((diskOffering != null) && (diskOffering.getBytesReadRate() != null) && (diskOffering.getBytesReadRate() > 0)) { + return diskOffering.getBytesReadRate(); + } else { + Long bytesReadRate = Long.parseLong(_configDao.getValue(Config.VmDiskThrottlingBytesReadRate.key())); + if ((bytesReadRate > 0) && ((offering == null) || (! offering.getSystemUse()))) { + return bytesReadRate; + } + } + return 0L; + } + + // get bytesWriteRate from service_offering, disk_offering and vm.disk.throttling.bytes_write_rate + @Override + public Long getDiskBytesWriteRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering) { + if ((offering != null) && (offering.getBytesWriteRate() != null) && (offering.getBytesWriteRate() > 0)) { + return offering.getBytesWriteRate(); + } else if ((diskOffering != null) && (diskOffering.getBytesWriteRate() != null) && (diskOffering.getBytesWriteRate() > 0)) { + return diskOffering.getBytesWriteRate(); + } else { + Long bytesWriteRate = Long.parseLong(_configDao.getValue(Config.VmDiskThrottlingBytesWriteRate.key())); + if ((bytesWriteRate > 0) && ((offering == null) || (! offering.getSystemUse()))) { + return bytesWriteRate; + } + } + return 0L; + } + + // get iopsReadRate from service_offering, disk_offering and vm.disk.throttling.iops_read_rate + @Override + public Long getDiskIopsReadRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering) { + if ((offering != null) && (offering.getIopsReadRate() != null) && (offering.getIopsReadRate() > 0)) { + return offering.getIopsReadRate(); + } else if ((diskOffering != null) && (diskOffering.getIopsReadRate() != null) && (diskOffering.getIopsReadRate() > 0)) { + return diskOffering.getIopsReadRate(); + } else { + Long iopsReadRate = Long.parseLong(_configDao.getValue(Config.VmDiskThrottlingIopsReadRate.key())); + if ((iopsReadRate > 0) && ((offering == null) || (! offering.getSystemUse()))) { + return iopsReadRate; + } + } + return 0L; + } + + // get iopsWriteRate from service_offering, disk_offering and vm.disk.throttling.iops_write_rate + @Override + public Long getDiskIopsWriteRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering) { + if ((offering != null) && (offering.getIopsWriteRate() != null) && (offering.getIopsWriteRate() > 0)) { + return offering.getIopsWriteRate(); + } else if ((diskOffering != null) && (diskOffering.getIopsWriteRate() != null) && (diskOffering.getIopsWriteRate() > 0)) { + return diskOffering.getIopsWriteRate(); + } else { + Long iopsWriteRate = Long.parseLong(_configDao.getValue(Config.VmDiskThrottlingIopsWriteRate.key())); + if ((iopsWriteRate > 0) && ((offering == null) || (! offering.getSystemUse()))) { + return iopsWriteRate; + } + } + return 0L; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/storage/VolumeManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java index 4297efb..e5868d3 100644 --- a/server/src/com/cloud/storage/VolumeManagerImpl.java +++ b/server/src/com/cloud/storage/VolumeManagerImpl.java @@ -115,6 +115,7 @@ import com.cloud.server.ManagementServer; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageManager; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Volume.Event; import com.cloud.storage.Volume.Type; @@ -336,6 +337,11 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); dskCh.setHyperType(dataDiskHyperType); + dskCh.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + dskCh.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + dskCh.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + dskCh.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); + DataCenterVO destPoolDataCenter = _dcDao.findById(destPoolDcId); HostPodVO destPoolPod = _podDao.findById(destPoolPodId); @@ -511,6 +517,10 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { DataCenterVO dc = _dcDao.findById(volume.getDataCenterId()); DiskProfile dskCh = new DiskProfile(volume, diskOffering, snapshot.getHypervisorType()); + dskCh.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + dskCh.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + dskCh.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + dskCh.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); // Determine what pod to store the volume in while ((pod = _resourceMgr.findPod(null, null, dc, account.getId(), @@ -611,6 +621,11 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { DiskProfile dskCh = createDiskCharacteristics(volume, template, dc, diskOffering); dskCh.setHyperType(vm.getHypervisorType()); + dskCh.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + dskCh.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + dskCh.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + dskCh.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); + // Find a suitable storage to create volume on StoragePool destPool = storageMgr.findStoragePool(dskCh, dc, pod, clusterId, null, vm, avoidPools); @@ -649,13 +664,21 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { if (volume.getVolumeType() == Type.ROOT && Storage.ImageFormat.ISO != template.getFormat()) { dskCh = createDiskCharacteristics(volume, template, dc, offering); + dskCh.setBytesReadRate(storageMgr.getDiskBytesReadRate(offering, diskOffering)); + dskCh.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(offering, diskOffering)); + dskCh.setIopsReadRate(storageMgr.getDiskIopsReadRate(offering, diskOffering)); + dskCh.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(offering, diskOffering)); } else { dskCh = createDiskCharacteristics(volume, template, dc, diskOffering); + dskCh.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + dskCh.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + dskCh.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + dskCh.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); } dskCh.setHyperType(hyperType); - + final HashSet avoidPools = new HashSet( avoids); @@ -1546,6 +1569,11 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { volume.getFolder(), volume.getPath(), volume.getName(), deviceId, volume.getChainInfo()); cmd.setPoolUuid(volumePool.getUuid()); + DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId()); + cmd.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + cmd.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + cmd.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + cmd.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); try { answer = (AttachVolumeAnswer) _agentMgr.send(hostId, cmd); @@ -1906,6 +1934,11 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { StoragePoolVO volumePool = _storagePoolDao.findById(volume .getPoolId()); cmd.setPoolUuid(volumePool.getUuid()); + DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId()); + cmd.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + cmd.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + cmd.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + cmd.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); // Collect vm disk statistics from host before stopping Vm _userVmMgr.collectVmDiskStatistics(vm); @@ -2233,7 +2266,21 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { for (VolumeVO vol : vols) { PrimaryDataStoreInfo pool = (PrimaryDataStoreInfo)this.dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary); - vm.addDisk(new VolumeTO(vol, pool)); + ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId()); + DiskOfferingVO diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId()); + VolumeTO newVolume = new VolumeTO(vol, pool); + if (vol.getVolumeType() == Type.ROOT) { + newVolume.setBytesReadRate(storageMgr.getDiskBytesReadRate(offering, diskOffering)); + newVolume.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(offering, diskOffering)); + newVolume.setIopsReadRate(storageMgr.getDiskIopsReadRate(offering, diskOffering)); + newVolume.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(offering, diskOffering)); + } else { + newVolume.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + newVolume.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + newVolume.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + newVolume.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); + } + vm.addDisk(newVolume); } if (vm.getType() == VirtualMachine.Type.User) { @@ -2463,7 +2510,21 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { pool = (StoragePool)dataStoreMgr.getDataStore(result.second().getId(), DataStoreRole.Primary); vol = result.first(); } - vm.addDisk(new VolumeTO(vol, pool)); + ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId()); + DiskOfferingVO diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId()); + VolumeTO newVolume = new VolumeTO(vol, pool); + if (vol.getVolumeType() == Type.ROOT) { + newVolume.setBytesReadRate(storageMgr.getDiskBytesReadRate(offering, diskOffering)); + newVolume.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(offering, diskOffering)); + newVolume.setIopsReadRate(storageMgr.getDiskIopsReadRate(offering, diskOffering)); + newVolume.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(offering, diskOffering)); + } else { + newVolume.setBytesReadRate(storageMgr.getDiskBytesReadRate(null, diskOffering)); + newVolume.setBytesWriteRate(storageMgr.getDiskBytesWriteRate(null, diskOffering)); + newVolume.setIopsReadRate(storageMgr.getDiskIopsReadRate(null, diskOffering)); + newVolume.setIopsWriteRate(storageMgr.getDiskIopsWriteRate(null, diskOffering)); + } + vm.addDisk(newVolume); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/src/com/cloud/test/DatabaseConfig.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 70c8178..ef0259d 100755 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java @@ -918,6 +918,20 @@ public class DatabaseConfig { } ServiceOfferingVO serviceOffering = new ServiceOfferingVO(name, cpu, ramSize, speed, null, null, ha, displayText, useLocalStorage, false, null, false, null, false); + + Long bytesReadRate = Long.parseLong(_currentObjectParams.get("bytesReadRate")); + if ((bytesReadRate != null) && (bytesReadRate > 0)) + serviceOffering.setBytesReadRate(bytesReadRate); + Long bytesWriteRate = Long.parseLong(_currentObjectParams.get("bytesWriteRate")); + if ((bytesWriteRate != null) && (bytesWriteRate > 0)) + serviceOffering.setBytesWriteRate(bytesWriteRate); + Long iopsReadRate = Long.parseLong(_currentObjectParams.get("iopsReadRate")); + if ((iopsReadRate != null) && (iopsReadRate > 0)) + serviceOffering.setIopsReadRate(iopsReadRate); + Long iopsWriteRate = Long.parseLong(_currentObjectParams.get("iopsWriteRate")); + if ((iopsWriteRate != null) && (iopsWriteRate > 0)) + serviceOffering.setIopsWriteRate(iopsWriteRate); + ServiceOfferingDaoImpl dao = ComponentContext.inject(ServiceOfferingDaoImpl.class); try { dao.persist(serviceOffering); @@ -967,6 +981,20 @@ public class DatabaseConfig { } DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace , tags, false); diskOffering.setUseLocalStorage(local); + + Long bytesReadRate = Long.parseLong(_currentObjectParams.get("bytesReadRate")); + if (bytesReadRate != null && (bytesReadRate > 0)) + diskOffering.setBytesReadRate(bytesReadRate); + Long bytesWriteRate = Long.parseLong(_currentObjectParams.get("bytesWriteRate")); + if (bytesWriteRate != null && (bytesWriteRate > 0)) + diskOffering.setBytesWriteRate(bytesWriteRate); + Long iopsReadRate = Long.parseLong(_currentObjectParams.get("iopsReadRate")); + if (iopsReadRate != null && (iopsReadRate > 0)) + diskOffering.setIopsReadRate(iopsReadRate); + Long iopsWriteRate = Long.parseLong(_currentObjectParams.get("iopsWriteRate")); + if (iopsWriteRate != null && (iopsWriteRate > 0)) + diskOffering.setIopsWriteRate(iopsWriteRate); + DiskOfferingDaoImpl offering = ComponentContext.inject(DiskOfferingDaoImpl.class); try { offering.persist(diskOffering); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java index 21b3590..6e3d187 100755 --- a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java +++ b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java @@ -489,7 +489,8 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu */ @Override public ServiceOfferingVO createServiceOffering(long userId, boolean isSystem, Type vm_typeType, String name, int cpu, int ramSize, int speed, String displayText, boolean localStorageRequired, boolean offerHA, - boolean limitResourceUse, boolean volatileVm, String tags, Long domainId, String hostTag, Integer networkRate, String deploymentPlanner, Map details) { + boolean limitResourceUse, boolean volatileVm, String tags, Long domainId, String hostTag, Integer networkRate, String deploymentPlanner, Map details, + Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate) { // TODO Auto-generated method stub return null; } @@ -654,7 +655,8 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu * @see com.cloud.configuration.ConfigurationManager#createDiskOffering(java.lang.Long, java.lang.String, java.lang.String, java.lang.Long, java.lang.String, boolean, boolean, boolean) */ @Override - public DiskOfferingVO createDiskOffering(Long domainId, String name, String description, Long numGibibytes, String tags, boolean isCustomized, boolean localStorageRequired, boolean isDisplayOfferingEnabled) { + public DiskOfferingVO createDiskOffering(Long domainId, String name, String description, Long numGibibytes, String tags, boolean isCustomized, boolean localStorageRequired, boolean isDisplayOfferingEnabled, + Long bytesReadRate, Long bytesWriteRate, Long iopsReadRate, Long iopsWriteRate) { // TODO Auto-generated method stub return null; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/setup/db/db/schema-410to420.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 272fc42..bcdf2d9 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -290,6 +290,14 @@ ALTER TABLE `cloud`.`nics` ADD COLUMN `display_nic` tinyint(1) NOT NULL DEFAULT ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `display_offering` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Should disk offering be displayed to the end user'; +ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `bytes_read_rate` bigint(20); + +ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `bytes_write_rate` bigint(20); + +ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `iops_read_rate` bigint(20); + +ALTER TABLE `cloud`.`disk_offering` ADD COLUMN `iops_write_rate` bigint(20); + CREATE TABLE `cloud`.`volume_details` ( `id` bigint unsigned NOT NULL auto_increment, `volume_id` bigint unsigned NOT NULL COMMENT 'volume id', @@ -762,6 +770,10 @@ CREATE VIEW `cloud`.`volume_view` AS disk_offering.display_text disk_offering_display_text, disk_offering.use_local_storage, disk_offering.system_use, + disk_offering.bytes_read_rate, + disk_offering.bytes_write_rate, + disk_offering.iops_read_rate, + disk_offering.iops_write_rate, storage_pool.id pool_id, storage_pool.uuid pool_uuid, storage_pool.name pool_name, @@ -1070,6 +1082,10 @@ CREATE VIEW `cloud`.`service_offering_view` AS disk_offering.removed, disk_offering.use_local_storage, disk_offering.system_use, + disk_offering.bytes_read_rate, + disk_offering.bytes_write_rate, + disk_offering.iops_read_rate, + disk_offering.iops_write_rate, service_offering.cpu, service_offering.speed, service_offering.ram_size, @@ -1376,6 +1392,10 @@ CREATE VIEW `cloud`.`disk_offering_view` AS disk_offering.removed, disk_offering.use_local_storage, disk_offering.system_use, + disk_offering.bytes_read_rate, + disk_offering.bytes_write_rate, + disk_offering.iops_read_rate, + disk_offering.iops_write_rate, disk_offering.sort_key, disk_offering.type, disk_offering.display_offering, @@ -1616,6 +1636,10 @@ CREATE VIEW `cloud`.`volume_view` AS disk_offering.display_text disk_offering_display_text, disk_offering.use_local_storage, disk_offering.system_use, + disk_offering.bytes_read_rate, + disk_offering.bytes_write_rate, + disk_offering.iops_read_rate, + disk_offering.iops_write_rate, storage_pool.id pool_id, storage_pool.uuid pool_uuid, storage_pool.name pool_name, @@ -1846,7 +1870,10 @@ CREATE TABLE `cloud_usage`.`usage_vm_disk` ( ) ENGINE=InnoDB CHARSET=utf8; INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.disk.stats.interval', 0, 'Interval (in seconds) to report vm disk statistics.'); - +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.disk.throttling.iops_read_rate', 0, 'Default disk I/O read rate in requests per second allowed in User vm\'s disk. '); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.disk.throttling.iops_write_rate', 0, 'Default disk I/O write rate in requests per second allowed in User vm\'s disk. '); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.disk.throttling.bytes_read_rate', 0, 'Default disk I/O read rate in bytes per second allowed in User vm\'s disk. '); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.disk.throttling.bytes_write_rate', 0, 'Default disk I/O write rate in bytes per second allowed in User vm\'s disk. '); -- Re-enable foreign key checking, at the end of the upgrade path SET foreign_key_checks = 1; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/882220e8/ui/dictionary.jsp ---------------------------------------------------------------------- diff --git a/ui/dictionary.jsp b/ui/dictionary.jsp index a5f0662..7809cdb 100644 --- a/ui/dictionary.jsp +++ b/ui/dictionary.jsp @@ -472,6 +472,10 @@ dictionary = { 'label.disable.vpn': '', 'label.disabling.vpn.access': '', 'label.disk.allocated': '', +'label.disk.bytes.read.rate': '', +'label.disk.bytes.write.rate': '', +'label.disk.iops.write.rate': '', +'label.disk.iops.read.rate': '', 'label.disk.read.bytes': '', 'label.disk.read.io': '', 'label.disk.offering': '',