You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2013/06/20 09:20:21 UTC

[48/50] [abbrv] git commit: updated refs/heads/master to 97f8c52

merge to master


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9aec9c60
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9aec9c60
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9aec9c60

Branch: refs/heads/master
Commit: 9aec9c605c1ee0737217dd56f55c50efe2ac57f8
Parents: f0ebb05 0a4e651
Author: Edison Su <su...@gmail.com>
Authored: Wed Jun 19 18:16:47 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Wed Jun 19 18:16:47 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/to/VolumeTO.java    |   37 +
 api/src/com/cloud/network/NetworkModel.java     |    2 +
 api/src/com/cloud/offering/DiskOffering.java    |   16 +
 api/src/com/cloud/offering/NetworkOffering.java |    4 +-
 api/src/com/cloud/storage/Storage.java          |    4 +-
 api/src/com/cloud/storage/Volume.java           |    2 +-
 api/src/com/cloud/vm/DiskProfile.java           |   36 +
 .../org/apache/cloudstack/api/ApiConstants.java |    7 +-
 .../command/admin/cluster/ListClustersCmd.java  |    8 +-
 .../admin/host/FindHostsForMigrationCmd.java    |    3 +-
 .../api/command/admin/host/ListHostsCmd.java    |    3 +-
 .../admin/internallb/ListInternalLBVMsCmd.java  |   10 +-
 .../api/command/admin/ldap/LDAPConfigCmd.java   |   20 +-
 .../admin/network/CreateNetworkOfferingCmd.java |    2 +-
 .../admin/offering/CreateDiskOfferingCmd.java   |   28 +
 .../offering/CreateServiceOfferingCmd.java      |   28 +
 .../api/command/admin/pod/ListPodsByCmd.java    |    7 -
 .../admin/region/ListPortableIpRangesCmd.java   |    3 +-
 .../command/admin/router/ListRoutersCmd.java    |    7 -
 .../admin/storage/ListStoragePoolsCmd.java      |    8 +
 .../admin/systemvm/ListSystemVMsCmd.java        |    7 -
 .../api/command/user/iso/ListIsosCmd.java       |    7 -
 .../command/user/network/ListNetworksCmd.java   |    7 -
 .../command/user/snapshot/ListSnapshotsCmd.java |   12 +-
 .../command/user/template/ListTemplatesCmd.java |    8 -
 .../api/command/user/zone/ListZonesByCmd.java   |    8 +-
 .../api/response/ClusterResponse.java           |    9 +-
 .../api/response/DiskOfferingResponse.java      |   28 +
 .../api/response/DomainRouterResponse.java      |   11 -
 .../cloudstack/api/response/HostResponse.java   |    9 +-
 .../api/response/NetworkResponse.java           |    7 -
 .../cloudstack/api/response/PodResponse.java    |    9 +-
 .../api/response/ServiceOfferingResponse.java   |   28 +
 .../api/response/SnapshotResponse.java          |   17 +-
 .../api/response/StoragePoolResponse.java       |   12 +-
 .../api/response/SystemVmResponse.java          |   11 -
 .../api/response/TemplateResponse.java          |    7 -
 .../cloudstack/api/response/UserVmResponse.java |    7 -
 .../cloudstack/api/response/VolumeResponse.java |   52 +-
 awsapi/web/web.xml                              |   11 +-
 .../classes/resources/messages.properties       |    4 +
 .../cloud/agent/api/AttachVolumeCommand.java    |   36 +
 core/src/com/cloud/agent/api/StartCommand.java  |   10 +-
 core/src/com/cloud/agent/api/StopCommand.java   |   15 +-
 .../agent/api/routing/DhcpEntryCommand.java     |   10 +-
 .../agent/api/routing/SavePasswordCommand.java  |    6 +-
 .../agent/api/routing/UserDataCommand.java      |    6 +-
 .../cloud/agent/api/routing/VmDataCommand.java  |   10 +-
 .../agent/api/storage/CopyVolumeCommand.java    |    6 +-
 .../cloud/agent/api/storage/CreateCommand.java  |   32 +-
 .../com/cloud/network/HAProxyConfigurator.java  |   22 +-
 docs/en-US/CloudStack_GSoC_Guide.xml            |    1 +
 docs/en-US/Release_Notes.xml                    |    2 +-
 docs/en-US/add-loadbalancer-rule-vpc.xml        |    8 +-
 docs/en-US/building-devcloud.xml                |    2 +-
 docs/en-US/configure-package-repository.xml     |    4 +-
 docs/en-US/create-vpn-connection-vpc.xml        |   31 +-
 docs/en-US/create-vpn-gateway-for-vpc.xml       |   30 +-
 docs/en-US/delete-reset-vpn.xml                 |   28 +-
 docs/en-US/gsoc-shiva.xml                       |   70 +
 .../management-server-install-db-local.xml      |    8 +
 docs/en-US/source-build.xml                     |    4 +-
 docs/pot/configure-package-repository.pot       |    4 +-
 .../subsystem/api/storage/VolumeInfo.java       |    5 +
 .../cloudstack/storage/to/VolumeObjectTO.java   |   40 +
 .../src/com/cloud/dc/dao/DataCenterDao.java     |    2 +-
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java |   15 +-
 .../com/cloud/offerings/NetworkOfferingVO.java  |    4 +
 .../src/com/cloud/storage/DiskOfferingVO.java   |   46 +-
 .../schema/src/com/cloud/storage/VolumeVO.java  |    2 +-
 .../com/cloud/vm/dao/DomainRouterDaoImpl.java   |   18 +-
 .../cloudstack/storage/volume/VolumeObject.java |   50 +-
 .../systemvm/debian/config/root/edithosts.sh    |    4 +-
 .../systemvm/debian/config/root/savepassword.sh |    4 +-
 patches/systemvm/debian/config/root/userdata.sh |    4 +-
 .../BaremetalDhcpManagerImpl.java               |    5 +-
 .../networkservice/BaremetalPxeManagerImpl.java |    4 +-
 .../kvm/resource/LibvirtComputingResource.java  |   34 +-
 .../kvm/resource/LibvirtDomainXMLParser.java    |   25 +
 .../hypervisor/kvm/resource/LibvirtVMDef.java   |   48 +
 .../guru/BigSwitchVnsGuestNetworkGuru.java      |    2 +-
 .../cloud/network/guru/OvsGuestNetworkGuru.java |    3 +-
 python/lib/cloudutils/networkConfig.py          |    2 +-
 .../manager/ClusteredAgentManagerImpl.java      |    4 +-
 server/src/com/cloud/api/ApiResponseHelper.java |   12 -
 .../com/cloud/api/query/QueryManagerImpl.java   |   66 +-
 .../api/query/dao/DiskOfferingJoinDaoImpl.java  |    5 +
 .../api/query/dao/DomainRouterJoinDaoImpl.java  |    1 -
 .../cloud/api/query/dao/HostJoinDaoImpl.java    |    1 -
 .../query/dao/ServiceOfferingJoinDaoImpl.java   |    4 +
 .../api/query/dao/StoragePoolJoinDaoImpl.java   |    6 +-
 .../cloud/api/query/dao/UserVmJoinDaoImpl.java  |    3 +-
 .../cloud/api/query/dao/VolumeJoinDaoImpl.java  |    8 +-
 .../cloud/api/query/vo/DiskOfferingJoinVO.java  |   42 +
 .../cloud/api/query/vo/DomainRouterJoinVO.java  |   12 -
 .../src/com/cloud/api/query/vo/HostJoinVO.java  |   11 -
 .../api/query/vo/ServiceOfferingJoinVO.java     |   41 +
 .../cloud/api/query/vo/StoragePoolJoinVO.java   |   11 -
 .../com/cloud/api/query/vo/UserVmJoinVO.java    |   13 -
 .../com/cloud/api/query/vo/VolumeJoinVO.java    |   58 +-
 server/src/com/cloud/configuration/Config.java  |   25 +-
 .../configuration/ConfigurationManager.java     |   14 +-
 .../configuration/ConfigurationManagerImpl.java |   45 +-
 .../com/cloud/ha/UserVmDomRInvestigator.java    |    3 +-
 .../src/com/cloud/network/NetworkManager.java   |    1 +
 .../com/cloud/network/NetworkManagerImpl.java   |   83 +-
 .../src/com/cloud/network/NetworkModelImpl.java |   11 +
 .../com/cloud/network/NetworkServiceImpl.java   |   95 +-
 .../element/CloudZonesNetworkElement.java       |    4 +-
 .../network/guru/ExternalGuestNetworkGuru.java  |    3 +-
 .../cloud/network/guru/GuestNetworkGuru.java    |   11 +-
 .../VirtualNetworkApplianceManagerImpl.java     |   10 +-
 .../cloud/server/ConfigurationServerImpl.java   |   25 +
 .../src/com/cloud/server/ManagementServer.java  |    2 +
 .../com/cloud/server/ManagementServerImpl.java  |   39 +-
 .../src/com/cloud/storage/StorageManager.java   |   10 +
 .../com/cloud/storage/StorageManagerImpl.java   |   71 +
 .../src/com/cloud/storage/s3/S3ManagerImpl.java |    9 +-
 .../storage/snapshot/SnapshotManagerImpl.java   |   11 -
 server/src/com/cloud/test/DatabaseConfig.java   |   28 +
 server/src/com/cloud/vm/UserVmManagerImpl.java  |   70 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |   16 +-
 .../network/DedicateGuestVlanRangesTest.java    |    4 +-
 .../com/cloud/network/MockNetworkModelImpl.java |    6 +
 .../cloud/vpc/MockConfigurationManagerImpl.java |    6 +-
 .../com/cloud/vpc/MockNetworkModelImpl.java     |    6 +
 .../console-proxy/server/scripts/ssvm-check.sh  |  136 -
 .../server/systemvm-descriptor.xml              |    9 +
 setup/bindir/cloud-set-guest-sshkey.in          |    5 +
 setup/db/db/schema-410to420.sql                 |   50 +-
 setup/dev/advanced.cfg                          |    3 +-
 test/integration/component/maint/__init__.py    |   21 +
 .../component/maint/test_high_availability.py   | 1079 +++++
 .../maint/test_host_high_availability.py        |  810 ++++
 .../maint/test_vpc_host_maintenance.py          |  561 +++
 .../maint/test_vpc_on_host_maintenance.py       |  323 ++
 test/integration/component/test_accounts.py     |   16 +-
 .../component/test_advancedsg_networks.py       |    5 +-
 test/integration/component/test_blocker_bugs.py |  303 --
 .../component/test_custom_hostname.py           |    2 +-
 .../component/test_explicit_dedication.py       |    3 -
 .../component/test_high_availability.py         | 1079 -----
 .../component/test_host_high_availability.py    |  811 ----
 .../component/test_implicit_planner.py          |    3 -
 .../component/test_netscaler_configs.py         |    2 +-
 test/integration/component/test_netscaler_lb.py |    4 +-
 .../component/test_netscaler_nw_off.py          |    5 +-
 .../component/test_redundant_router.py          | 4096 +-----------------
 .../component/test_redundant_router_cleanups.py |  675 +++
 ...test_redundant_router_deployment_planning.py | 1006 +++++
 .../test_redundant_router_network_rules.py      | 1416 ++++++
 .../component/test_redundant_router_services.py |  376 ++
 .../component/test_redundant_router_upgrades.py |  486 +++
 .../component/test_shared_networks.py           |    1 +
 test/integration/component/test_snapshots.py    |  247 +-
 .../component/test_storage_motion.py            |    3 -
 test/integration/component/test_volumes.py      |    3 -
 test/integration/component/test_vpc.py          |  466 +-
 .../component/test_vpc_host_maintenance.py      |  889 ----
 test/integration/component/test_vpc_network.py  |   80 +-
 .../component/test_vpc_network_lbrules.py       |    5 +-
 .../component/test_vpc_network_pfrules.py       |    5 +-
 .../component/test_vpc_network_staticnatrule.py |    3 -
 .../integration/component/test_vpc_offerings.py |   52 +-
 ...deploy_vms_with_varied_deploymentplanners.py |   12 +-
 test/integration/smoke/test_network.py          |    2 +-
 test/integration/smoke/test_nic.py              |    3 -
 .../integration/smoke/test_portable_publicip.py |    1 -
 test/integration/smoke/test_resource_detail.py  |    3 -
 test/integration/smoke/test_scale_vm.py         |    3 -
 test/integration/smoke/test_ssvm.py             |   42 +-
 test/integration/smoke/test_vm_life_cycle.py    |    2 +-
 test/integration/smoke/test_volumes.py          |    1 -
 tools/cli/cloudmonkey/config.py                 |    2 +-
 tools/cli/cloudmonkey/requester.py              |   47 +-
 tools/marvin/marvin/cloudstackTestClient.py     |    1 +
 tools/marvin/marvin/integration/lib/utils.py    |    2 +-
 tools/marvin/marvin/marvinPlugin.py             |   10 +-
 ui/css/cloudstack3.css                          |   67 +-
 ui/dictionary.jsp                               |    4 +
 ui/scripts/configuration.js                     |  157 +-
 ui/scripts/docs.js                              |    6 +-
 ui/scripts/globalSettings.js                    |    2 +-
 ui/scripts/network.js                           |  186 +-
 ui/scripts/sharedFunctions.js                   |    6 +-
 ui/scripts/system.js                            |  657 ++-
 ui/scripts/ui/widgets/listView.js               |   30 +-
 ui/scripts/ui/widgets/multiEdit.js              |    2 +-
 ui/scripts/zoneWizard.js                        |    8 +-
 utils/src/com/cloud/utils/S3Utils.java          |    4 +-
 utils/src/com/cloud/utils/StringUtils.java      |    6 +-
 utils/src/com/cloud/utils/net/NetUtils.java     |    2 +-
 .../src/com/cloud/utils/ssh/SSHKeysHelper.java  |    2 +-
 utils/test/com/cloud/utils/StringUtilsTest.java |    5 +
 .../com/cloud/utils/crypto/RSAHelperTest.java   |   50 +
 .../test/com/cloud/utils/net/NetUtilsTest.java  |    5 +
 .../com/cloud/utils/ssh/SSHKeysHelperTest.java  |   69 +
 .../test/com/cloud/utils/testcase/NioTest.java  |   14 +-
 198 files changed, 9765 insertions(+), 8761 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/api/src/com/cloud/storage/Storage.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/api/src/com/cloud/storage/Volume.java
----------------------------------------------------------------------
diff --cc api/src/com/cloud/storage/Volume.java
index df48de2,4903594..f5ed4e2
--- a/api/src/com/cloud/storage/Volume.java
+++ b/api/src/com/cloud/storage/Volume.java
@@@ -153,7 -152,7 +153,7 @@@ public interface Volume extends Control
  
      Date getCreated();
  
--    long getDiskOfferingId();
++    Long getDiskOfferingId();
  
      String getChainInfo();
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/api/src/org/apache/cloudstack/api/response/TemplateResponse.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
----------------------------------------------------------------------
diff --cc engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
index 3d7b1aa,349325a..3b4aba9
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
@@@ -23,21 -22,9 +23,26 @@@ import com.cloud.hypervisor.Hypervisor.
  import com.cloud.storage.Volume;
  
  public interface VolumeInfo extends DataObject, Volume {
 -	public boolean isAttachedVM();
 -	public void addPayload(Object data);
 -	public Object getpayload();
 -	public HypervisorType getHypervisorType();
 -	public Long getLastPoolId();
 +    boolean isAttachedVM();
 +
 +    void addPayload(Object data);
 +
 +    Object getpayload();
 +
 +    HypervisorType getHypervisorType();
 +
 +    Long getLastPoolId();
 +
 +    String getAttachedVmName();
 +
 +    void processEventOnly(ObjectInDataStoreStateMachine.Event event);
 +
 +    void processEventOnly(ObjectInDataStoreStateMachine.Event event, Answer answer);
 +
 +    boolean stateTransit(Volume.Event event);
++
++    Long getBytesReadRate();
++    Long getBytesWriteRate();
++    Long getIopsReadRate();
++    Long getIopsWriteRate();
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
----------------------------------------------------------------------
diff --cc engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
index bc1c061,0000000..ab3d5ea
mode 100644,000000..100644
--- a/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
+++ b/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
@@@ -1,175 -1,0 +1,215 @@@
 +// Licensed to the Apache Software Foundation (ASF) under one
 +// or more contributor license agreements.  See the NOTICE file
 +// distributed with this work for additional information
 +// regarding copyright ownership.  The ASF licenses this file
 +// to you under the Apache License, Version 2.0 (the
 +// "License"); you may not use this file except in compliance
 +// with the License.  You may obtain a copy of the License at
 +//
 +//   http://www.apache.org/licenses/LICENSE-2.0
 +//
 +// Unless required by applicable law or agreed to in writing,
 +// software distributed under the License is distributed on an
 +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +// KIND, either express or implied.  See the License for the
 +// specific language governing permissions and limitations
 +// under the License.
 +package org.apache.cloudstack.storage.to;
 +
 +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 +
 +import com.cloud.agent.api.to.DataObjectType;
 +import com.cloud.agent.api.to.DataStoreTO;
 +import com.cloud.agent.api.to.DataTO;
 +import com.cloud.storage.Storage;
 +import com.cloud.storage.Volume;
 +
 +public class VolumeObjectTO implements DataTO {
 +    private String uuid;
 +    private Volume.Type volumeType;
 +    private DataStoreTO dataStore;
 +    private String name;
 +    private long size;
 +    private String path;
 +    private Long volumeId;
 +    private String vmName;
 +    private long accountId;
 +    private String chainInfo;
 +    private Storage.ImageFormat format;
 +    private long id;
++    private Long bytesReadRate;
++    private Long bytesWriteRate;
++    private Long iopsReadRate;
++    private Long iopsWriteRate;
 +
 +    public VolumeObjectTO() {
 +
 +    }
 +
 +    public VolumeObjectTO(VolumeInfo volume) {
 +        this.uuid = volume.getUuid();
 +        this.path = volume.getPath();
 +        this.accountId = volume.getAccountId();
 +        if (volume.getDataStore() != null) {
 +            this.dataStore = volume.getDataStore().getTO();
 +        } else {
 +            this.dataStore = null;
 +        }
 +        this.vmName = volume.getAttachedVmName();
 +        this.size = volume.getSize();
 +        this.setVolumeId(volume.getId());
 +        this.chainInfo = volume.getChainInfo();
 +        this.volumeType = volume.getVolumeType();
 +        this.name = volume.getName();
 +        this.setId(volume.getId());
 +        this.format = volume.getFormat();
++        this.bytesReadRate = volume.getBytesReadRate();
++        this.bytesWriteRate = volume.getBytesWriteRate();
++        this.iopsReadRate = volume.getIopsReadRate();
++        this.iopsWriteRate = volume.getIopsWriteRate();
 +    }
 +
 +    public String getUuid() {
 +        return this.uuid;
 +    }
 +
 +    @Override
 +    public String getPath() {
 +        return this.path;
 +    }
 +
 +    public Volume.Type getVolumeType() {
 +        return this.volumeType;
 +    }
 +
 +    @Override
 +    public DataStoreTO getDataStore() {
 +        return this.dataStore;
 +    }
 +
 +
 +    public void setDataStore(DataStoreTO store){
 +        this.dataStore = store;
 +    }
 +
 +    public void setDataStore(PrimaryDataStoreTO dataStore) {
 +        this.dataStore = dataStore;
 +    }
 +
 +    public String getName() {
 +        return this.name;
 +    }
 +
 +    public long getSize() {
 +        return this.size;
 +    }
 +
 +    @Override
 +    public DataObjectType getObjectType() {
 +        return DataObjectType.VOLUME;
 +    }
 +
 +    public void setUuid(String uuid) {
 +        this.uuid = uuid;
 +    }
 +
 +    public void setName(String name) {
 +        this.name = name;
 +    }
 +
 +    public void setSize(long size) {
 +        this.size = size;
 +    }
 +
 +    public void setPath(String path) {
 +        this.path = path;
 +    }
 +
 +    public Long getVolumeId() {
 +        return volumeId;
 +    }
 +
 +    public void setVolumeId(Long volumeId) {
 +        this.volumeId = volumeId;
 +    }
 +
 +    public long getAccountId() {
 +        return accountId;
 +    }
 +
 +    public void setAccountId(long accountId) {
 +        this.accountId = accountId;
 +    }
 +
 +    public String getVmName() {
 +        return vmName;
 +    }
 +
 +    public void setVmName(String vmName) {
 +        this.vmName = vmName;
 +    }
 +
 +    public String getChainInfo() {
 +        return chainInfo;
 +    }
 +
 +    public void setChainInfo(String chainInfo) {
 +        this.chainInfo = chainInfo;
 +    }
 +
 +    @Override
 +    public long getId() {
 +        return id;
 +    }
 +
 +    public void setId(long id) {
 +        this.id = id;
 +    }
 +
 +    public Storage.ImageFormat getFormat() {
 +        return format;
 +    }
 +
 +    public void setFormat(Storage.ImageFormat format) {
 +        this.format = format;
 +    }
 +
 +    @Override
 +    public String toString() {
 +        return new StringBuilder("volumeTO[uuid=").append(uuid).append("|path=").append(path)
 +                .append("|datastore=").append(dataStore).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/9aec9c60/engine/schema/src/com/cloud/storage/DiskOfferingVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/storage/DiskOfferingVO.java
index 23b8d60,44f9e8f..b7363e7
--- a/engine/schema/src/com/cloud/storage/DiskOfferingVO.java
+++ b/engine/schema/src/com/cloud/storage/DiskOfferingVO.java
@@@ -76,28 -79,40 +76,40 @@@ public class DiskOfferingVO implements 
      @Temporal(TemporalType.TIMESTAMP)
      private Date removed;
  
 -    @Column(name=GenericDao.CREATED_COLUMN)
 +    @Column(name = GenericDao.CREATED_COLUMN)
      private Date created;
  
 -    @Column(name="recreatable")
 +    @Column(name = "recreatable")
      private boolean recreatable;
  
 -    @Column(name="use_local_storage")
 +    @Column(name = "use_local_storage")
      private boolean useLocalStorage;
  
 -    @Column(name="system_use")
 +    @Column(name = "system_use")
      private boolean systemUse;
  
 -    @Column(name="customized")
 +    @Column(name = "customized")
      private boolean customized;
  
 -    @Column(name="uuid")
 +    @Column(name = "uuid")
      private String uuid;
  
 -    @Column(name="sort_key")
 +    @Column(name = "sort_key")
      int sortKey;
  
-     @Column(name = "display_offering")
+     @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;
  
      public DiskOfferingVO() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/engine/schema/src/com/cloud/storage/VolumeVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/storage/VolumeVO.java
index 984da21,1699afd..02c09a2
--- a/engine/schema/src/com/cloud/storage/VolumeVO.java
+++ b/engine/schema/src/com/cloud/storage/VolumeVO.java
@@@ -351,7 -343,7 +351,7 @@@ public class VolumeVO implements Volum
      }
  
      @Override
--    public long getDiskOfferingId() {
++    public Long getDiskOfferingId() {
          return diskOfferingId;
      }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
----------------------------------------------------------------------
diff --cc engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
index d689195,ea31be3..071c110
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
@@@ -20,25 -20,17 +20,27 @@@ import java.util.Date
  
  import javax.inject.Inject;
  
++import com.cloud.storage.DiskOfferingVO;
++import com.cloud.storage.dao.DiskOfferingDao;
  import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 -import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
  import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
  import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
  import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 -import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 +import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 +import org.apache.cloudstack.storage.command.CreateObjectAnswer;
  import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 +import org.apache.cloudstack.storage.to.VolumeObjectTO;
  import org.apache.log4j.Logger;
  
 +import com.cloud.agent.api.Answer;
 +import com.cloud.agent.api.storage.DownloadAnswer;
 +import com.cloud.agent.api.to.DataObjectType;
 +import com.cloud.agent.api.to.DataTO;
  import com.cloud.hypervisor.Hypervisor.HypervisorType;
 +import com.cloud.storage.DataStoreRole;
 +import com.cloud.storage.Storage.ImageFormat;
  import com.cloud.storage.Volume;
  import com.cloud.storage.VolumeVO;
  import com.cloud.storage.dao.VolumeDao;
@@@ -58,11 -48,7 +60,13 @@@ public class VolumeObject implements Vo
      @Inject
      VolumeDao volumeDao;
      @Inject
 -    ObjectInDataStoreManager ojbectInStoreMgr;
 +    VolumeDataStoreDao volumeStoreDao;
 +    @Inject
 +    ObjectInDataStoreManager objectInStoreMgr;
 +    @Inject
 +    VMInstanceDao vmInstanceDao;
++    @Inject
++    DiskOfferingDao diskOfferingDao;
      private Object payload;
  
      public VolumeObject() {
@@@ -141,6 -109,6 +145,50 @@@
          return result;
      }
  
++    private DiskOfferingVO getDiskOfferingVO() {
++        if (getDiskOfferingId() != null) {
++            DiskOfferingVO diskOfferingVO = diskOfferingDao.findById(getDiskOfferingId());
++            return diskOfferingVO;
++        }
++        return null;
++    }
++
++    @Override
++    public Long getBytesReadRate() {
++        DiskOfferingVO diskOfferingVO = getDiskOfferingVO();
++        if (diskOfferingVO != null) {
++            return diskOfferingVO.getBytesReadRate();
++        }
++        return null;
++    }
++
++    @Override
++    public Long getBytesWriteRate() {
++        DiskOfferingVO diskOfferingVO = getDiskOfferingVO();
++        if (diskOfferingVO != null) {
++            return diskOfferingVO.getBytesWriteRate();
++        }
++        return null;
++    }
++
++    @Override
++    public Long getIopsReadRate() {
++        DiskOfferingVO diskOfferingVO = getDiskOfferingVO();
++        if (diskOfferingVO != null) {
++            return diskOfferingVO.getIopsReadRate();
++        }
++        return null;
++    }
++
++    @Override
++    public Long getIopsWriteRate() {
++        DiskOfferingVO diskOfferingVO = getDiskOfferingVO();
++        if (diskOfferingVO != null) {
++            return diskOfferingVO.getIopsWriteRate();
++        }
++        return null;
++    }
++
      public void update() {
          volumeDao.update(volumeVO.getId(), volumeVO);
          volumeVO = volumeDao.findById(volumeVO.getId());
@@@ -313,7 -256,7 +361,7 @@@
      }
  
      @Override
--    public long getDiskOfferingId() {
++    public Long getDiskOfferingId() {
          return this.volumeVO.getDiskOfferingId();
      }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 3c7e24d,7d90f6a..46003e9
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@@ -56,13 -56,11 +56,14 @@@ import java.util.regex.Pattern
  import javax.ejb.Local;
  import javax.naming.ConfigurationException;
  
 -import org.apache.log4j.Logger;
 -import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 +import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
 +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
++import org.apache.cloudstack.storage.to.VolumeObjectTO;
  import org.apache.cloudstack.utils.qemu.QemuImg;
 -import org.apache.cloudstack.utils.qemu.QemuImgFile;
 +import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
  import org.apache.cloudstack.utils.qemu.QemuImgException;
 +import org.apache.cloudstack.utils.qemu.QemuImgFile;
 +import org.apache.log4j.Logger;
  import org.libvirt.Connect;
  import org.libvirt.Domain;
  import org.libvirt.DomainBlockStats;
@@@ -3435,6 -3507,15 +3446,17 @@@ 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());
++            VolumeObjectTO volumeObjectTO = (VolumeObjectTO)data;
++
++            if ((volumeObjectTO.getBytesReadRate() != null) && (volumeObjectTO.getBytesReadRate()  > 0))
++                disk.setBytesReadRate(volumeObjectTO.getBytesReadRate());
++            if ((volumeObjectTO.getBytesWriteRate() != null) && (volumeObjectTO.getBytesWriteRate() > 0))
++                disk.setBytesWriteRate(volumeObjectTO.getBytesWriteRate());
++            if ((volumeObjectTO.getIopsReadRate() != null) && (volumeObjectTO.getIopsReadRate() > 0))
++                disk.setIopsReadRate(volumeObjectTO.getIopsReadRate());
++            if ((volumeObjectTO.getIopsWriteRate() != null) && (volumeObjectTO.getIopsWriteRate() > 0))
++                disk.setIopsWriteRate(volumeObjectTO.getIopsWriteRate());
+ 
              vm.getDevices().addDevice(disk);
          }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/QueryManagerImpl.java
index fca4138,c851e3b..9bd8f2a
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@@ -27,6 -21,12 +27,7 @@@ import java.util.Set
  import javax.ejb.Local;
  import javax.inject.Inject;
  
 -import com.cloud.api.ApiDBUtils;
 -import com.cloud.server.ResourceMetaDataService;
 -import com.cloud.server.ResourceTag;
 -import com.cloud.server.TaggedResourceService;
 -import com.cloud.vm.NicDetailVO;
 -import com.cloud.vm.dao.NicDetailDao;
++import com.cloud.storage.*;
  import org.apache.cloudstack.affinity.AffinityGroupResponse;
  import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
  import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
@@@ -54,29 -54,8 +55,8 @@@ import org.apache.cloudstack.api.comman
  import org.apache.cloudstack.api.command.user.volume.ListResourceDetailsCmd;
  import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
  import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
- import org.apache.cloudstack.api.response.AccountResponse;
- import org.apache.cloudstack.api.response.AsyncJobResponse;
- import org.apache.cloudstack.api.response.DiskOfferingResponse;
- import org.apache.cloudstack.api.response.DomainRouterResponse;
- import org.apache.cloudstack.api.response.EventResponse;
- import org.apache.cloudstack.api.response.HostResponse;
- import org.apache.cloudstack.api.response.ImageStoreResponse;
- import org.apache.cloudstack.api.response.InstanceGroupResponse;
- import org.apache.cloudstack.api.response.ListResponse;
- import org.apache.cloudstack.api.response.ProjectAccountResponse;
- import org.apache.cloudstack.api.response.ProjectInvitationResponse;
- import org.apache.cloudstack.api.response.ProjectResponse;
- import org.apache.cloudstack.api.response.ResourceDetailResponse;
- import org.apache.cloudstack.api.response.ResourceTagResponse;
- import org.apache.cloudstack.api.response.SecurityGroupResponse;
- import org.apache.cloudstack.api.response.ServiceOfferingResponse;
- import org.apache.cloudstack.api.response.StoragePoolResponse;
- import org.apache.cloudstack.api.response.TemplateResponse;
- import org.apache.cloudstack.api.response.UserResponse;
- import org.apache.cloudstack.api.response.UserVmResponse;
- import org.apache.cloudstack.api.response.VolumeResponse;
- import org.apache.cloudstack.api.response.ZoneResponse;
+ import org.apache.cloudstack.api.response.*;
 -import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
 +import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
  import org.apache.cloudstack.query.QueryService;
  import org.apache.log4j.Logger;
  import org.springframework.stereotype.Component;
@@@ -143,23 -118,10 +123,18 @@@ import com.cloud.projects.ProjectInvita
  import com.cloud.projects.ProjectManager;
  import com.cloud.projects.dao.ProjectAccountDao;
  import com.cloud.projects.dao.ProjectDao;
 +import com.cloud.resource.ResourceManager;
  import com.cloud.server.Criteria;
 +import com.cloud.server.ResourceMetaDataService;
 +import com.cloud.server.ResourceTag;
 +import com.cloud.server.ResourceTag.TaggedResourceType;
 +import com.cloud.server.TaggedResourceService;
  import com.cloud.service.ServiceOfferingVO;
  import com.cloud.service.dao.ServiceOfferingDao;
- import com.cloud.storage.DataStoreRole;
- import com.cloud.storage.Storage;
 -import com.cloud.storage.Volume;
 +import com.cloud.storage.Storage.ImageFormat;
- import com.cloud.storage.VMTemplateVO;
- import com.cloud.storage.Volume;
- import com.cloud.storage.VolumeDetailVO;
 +import com.cloud.storage.dao.VMTemplateDao;
 +import com.cloud.storage.dao.VolumeDetailsDao;
 +import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
  import com.cloud.user.Account;
  import com.cloud.user.AccountManager;
  import com.cloud.user.AccountVO;
@@@ -1059,36 -977,37 +1034,35 @@@ public class QueryManagerImpl extends M
          return new Pair<List<SecurityGroupJoinVO>, Integer>(sgs, count);
      }
  
 -
      @Override
      public ListResponse<DomainRouterResponse> searchForRouters(ListRoutersCmd cmd) {
-         Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd, cmd.getId(),
-                 cmd.getRouterName(), cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getHostId(),
-                 cmd.getKeyword(), cmd.getNetworkId(), cmd.getVpcId(), cmd.getForVpc(), cmd.getRole(), cmd.getZoneType());
+         Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd, cmd.getId(), cmd.getRouterName(),
+                 cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getHostId(), cmd.getKeyword(), cmd.getNetworkId(),
+                 cmd.getVpcId(), cmd.getForVpc(), cmd.getRole());
          ListResponse<DomainRouterResponse> response = new ListResponse<DomainRouterResponse>();
  
 -        List<DomainRouterResponse> routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()]));
 +        List<DomainRouterResponse> routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first()
 +                .toArray(new DomainRouterJoinVO[result.first().size()]));
          response.setResponses(routerResponses, result.second());
          return response;
      }
  
 -    
      @Override
      public ListResponse<DomainRouterResponse> searchForInternalLbVms(ListInternalLBVMsCmd cmd) {
-         Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd, cmd.getId(),
-                 cmd.getRouterName(), cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getHostId(),
-                 cmd.getKeyword(), cmd.getNetworkId(), cmd.getVpcId(), cmd.getForVpc(), cmd.getRole(), cmd.getZoneType());
+         Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd, cmd.getId(), cmd.getRouterName(),
+                 cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getHostId(), cmd.getKeyword(), cmd.getNetworkId(),
+                 cmd.getVpcId(), cmd.getForVpc(), cmd.getRole());
          ListResponse<DomainRouterResponse> response = new ListResponse<DomainRouterResponse>();
  
 -        List<DomainRouterResponse> routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()]));
 +        List<DomainRouterResponse> routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first()
 +                .toArray(new DomainRouterJoinVO[result.first().size()]));
          response.setResponses(routerResponses, result.second());
          return response;
      }
 -    
  
-     private Pair<List<DomainRouterJoinVO>, Integer> searchForRoutersInternal(BaseListProjectAndAccountResourcesCmd cmd,
-             Long id, String name, String state, Long zoneId, Long podId, Long hostId, String keyword, Long networkId,
-             Long vpcId, Boolean forVpc, String role, String zoneType) {
- 
+     private Pair<List<DomainRouterJoinVO>, Integer> searchForRoutersInternal(BaseListProjectAndAccountResourcesCmd cmd, Long id,
+             String name, String state, Long zoneId, Long podId, Long hostId, String keyword, Long networkId, Long vpcId, Boolean forVpc, String role) {
+        
 -
          Account caller = UserContext.current().getCaller();
          List<Long> permittedAccounts = new ArrayList<Long>();
  
@@@ -1969,8 -1863,16 +1938,16 @@@
      }
  
      private Pair<List<StoragePoolJoinVO>, Integer> searchForStoragePoolsInternal(ListStoragePoolsCmd cmd) {
+         ScopeType scopeType = null;
+         if (cmd.getScope() != null) {
+             try {
+                 scopeType = Enum.valueOf(ScopeType.class, cmd.getScope().toUpperCase());
+             } catch (Exception e) {
+                 throw new InvalidParameterValueException("Invalid scope type: " + cmd.getScope());
+             }
+         }
  
 -        Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());       
 +        Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
          Object id = cmd.getId();
          Object name = cmd.getStoragePoolName();
          Object path = cmd.getPath();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
index 5ebfa7d,4254a7c..68d9113
--- a/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
@@@ -21,8 -21,11 +21,7 @@@ import java.util.List
  
  import javax.ejb.Local;
  import javax.inject.Inject;
--
 -import com.cloud.capacity.Capacity;
  import org.apache.cloudstack.api.response.StoragePoolResponse;
 -import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
 -import org.apache.commons.lang.ObjectUtils;
  import org.apache.log4j.Logger;
  import org.springframework.stereotype.Component;
  
@@@ -72,10 -79,7 +71,7 @@@ public class StoragePoolJoinDaoImpl ext
          poolResponse.setIpAddress(pool.getHostAddress());
          poolResponse.setZoneId(pool.getZoneUuid());
          poolResponse.setZoneName(pool.getZoneName());
-         poolResponse.setZoneType(pool.getZoneType());
-         if (pool.getPoolType() != null) {
-             poolResponse.setType(pool.getPoolType().toString());
-         }
 -        poolResponse.setType(ObjectUtils.toString(pool.getPoolType(), null));
++        poolResponse.setType(pool.getPoolType().toString());
          poolResponse.setPodId(pool.getPodUuid());
          poolResponse.setPodName(pool.getPodName());
          poolResponse.setCreated(pool.getCreated());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/configuration/Config.java
index 219bed0,3c73783..f14a76c
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@@ -416,14 -422,16 +427,16 @@@ public enum Config 
      VMSnapshotCreateWait("Advanced", VMSnapshotManager.class, Integer.class, "vmsnapshot.create.wait", "1800", "In second, timeout for create vm snapshot", null),
  
      CloudDnsName("Advanced", ManagementServer.class, String.class, "cloud.dns.name", null, "DNS name of the cloud for the GSLB service", null),
 -	
 +
      BlacklistedRoutes("Advanced", VpcManager.class, String.class, "blacklisted.routes", null, "Routes that are blacklisted, can not be used for Static Routes creation for the VPC Private Gateway",
  	           "routes", ConfigurationParameterScope.zone.toString()),
- 
-     InternalLbVmServiceOfferingId("Advanced", ManagementServer.class, Long.class, "internallbvm.service.offering", null, "Uuid of the service offering used by internal lb vm; if NULL - default system internal lb offering will be used", null);
- 
- 
- 
+ 	
+     InternalLbVmServiceOfferingId("Advanced", ManagementServer.class, Long.class, "internallbvm.service.offering", null, "Uuid of the service offering used by internal lb vm; if NULL - default system internal lb offering will be used", null),
+     ExecuteInSequence("Advanced", ManagementServer.class, Boolean.class, "execute.in.sequence.hypervisor.commands", "false", "If set to true, StartCommand, StopCommand, CopyVolumeCommand, CreateCommand will be synchronized on the agent side." +
+     		" If set to false, these commands become asynchronous. Default value is false.", null),
+     ExecuteInSequenceNetworkElementCommands("Advanced", NetworkManager.class, Boolean.class, "execute.in.sequence.network.element.commands", "false", "If set to true, DhcpEntryCommand, SavePasswordCommand, UserDataCommand, VmDataCommand will be synchronized on the agent side." + 
+             " If set to false, these commands become asynchronous. Default value is false.", null);
+ 	
  	private final String _category;
  	private final Class<?> _componentClass;
  	private final Class<?> _type;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index ef6968e,e7e3f74..8fc0229
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@@ -2155,13 -2039,21 +2156,22 @@@ public class ConfigurationManagerImpl e
      @ActionEvent(eventType = EventTypes.EVENT_SERVICE_OFFERING_CREATE, eventDescription = "creating service offering")
      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<String, String> details) {
+             boolean offerHA, boolean limitResourceUse, boolean volatileVm,  String tags, Long domainId, String hostTag,
+             Integer networkRate, String deploymentPlanner, Map<String, String> 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,
 +        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);
@@@ -4240,13 -3989,9 +4263,10 @@@
                  String publicLbStr = lbServiceCapabilityMap.get(Capability.LbSchemes);
                  if (serviceProviderMap.containsKey(Service.Lb)) {
                      if (publicLbStr != null) {
 -                        _networkModel.checkCapabilityForProvider(serviceProviderMap.get(Service.Lb), Service.Lb, Capability.LbSchemes, publicLbStr);
 +                        _networkModel.checkCapabilityForProvider(serviceProviderMap.get(Service.Lb), Service.Lb,
 +                                Capability.LbSchemes, publicLbStr);
                          internalLb = publicLbStr.contains("internal");
                          publicLb = publicLbStr.contains("public");
-                     } else {
-                         // if not specified, default public lb to true
-                         publicLb = true;
                      }
                  }
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkManagerImpl.java
index 2fd9bd0,745fe23..18813d3
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@@ -4296,42 -4327,42 +4326,41 @@@ public class NetworkManagerImpl extend
  
  
      private boolean removeVmSecondaryIpsOfNic(long nicId) {
 -       Transaction txn = Transaction.currentTxn();
 -       txn.start();
 -       List <NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
 -       if (ipList != null) {
 -           for (NicSecondaryIpVO ip: ipList) {
 -               _nicSecondaryIpDao.remove(ip.getId());
 +           Transaction txn = Transaction.currentTxn();
 +           txn.start();
 +           List <NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
 +           if (ipList != null) {
 +               for (NicSecondaryIpVO ip: ipList) {
 +                   _nicSecondaryIpDao.remove(ip.getId());
 +               }
 +               s_logger.debug("Revoving nic secondary ip entry ...");
             }
 -           s_logger.debug("Revoving nic secondary ip entry ...");
 -       }
 -       txn.commit();
 -       return true;
 -    }
 +           txn.commit();
 +           return true;
 +        }
  
  
 -    @Override
 -    public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod,Account owner,
 -            String requestedIp) throws InsufficientAddressCapacityException {
 -        PublicIp ip = assignPublicIpAddress(dc.getId(), null, owner, VlanType.DirectAttached, networkId, requestedIp, false);
 -        if (ip == null) {
 -            s_logger.debug("There is no free public ip address");
 -            return null;
 +        @Override
 +        public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod,Account owner,
 +                String requestedIp) throws InsufficientAddressCapacityException {
 +            PublicIp ip = assignPublicIpAddress(dc.getId(), null, owner, VlanType.DirectAttached, networkId, requestedIp, false);
 +            if (ip == null) {
 +                s_logger.debug("There is no free public ip address");
 +                return null;
 +            }
 +            Ip ipAddr = ip.getAddress();
 +            return ipAddr.addr();
          }
 -        Ip ipAddr = ip.getAddress();
 -        return ipAddr.addr();
 -    }
 -
 +        
  
 -    @Override
 +        @Override
      public NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType) {
 -        NicVO nic = new NicVO(null, null, network.getId(), null); 
 -        nic.setIp4Address(ip4Address);
 +            NicVO nic = new NicVO(null, null, network.getId(), null); 
 +            nic.setIp4Address(ip4Address);
          nic.setIp6Address(ip6Address);
-             nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
-             nic.setState(Nic.State.Reserved);
-             nic.setVmType(vmType);
-             return _nicDao.persist(nic);
-         }
-         
+         nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
+         nic.setState(Nic.State.Reserved);
+         nic.setVmType(vmType);
+         return _nicDao.persist(nic);
+     }
 -    
   }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/server/ConfigurationServerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index 5c2917f,cfc8333..424e7bd
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -915,32 -1010,12 +915,24 @@@ public class ManagementServerImpl exten
          Object hypervisorType = cmd.getHypervisorType();
          Object clusterType = cmd.getClusterType();
          Object allocationState = cmd.getAllocationState();
-         String zoneType = cmd.getZoneType();
          String keyword = cmd.getKeyword();
 -
          zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
  
 +
 +    	Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
 +
 +        SearchBuilder<ClusterVO> sb = _clusterDao.createSearchBuilder();
 +        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
 +        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
 +        sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
 +        sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
 +        sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ);
 +        sb.and("clusterType", sb.entity().getClusterType(), SearchCriteria.Op.EQ);
 +        sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
 +
-         if(zoneType != null) {
-             SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
-             zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
-             sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
-         }
- 
- 
 +        SearchCriteria<ClusterVO> sc = sb.create();
          if (id != null) {
 -            sc.addAnd("id", SearchCriteria.Op.EQ, id);
 +            sc.setParameters("id", id);
          }
  
          if (name != null) {
@@@ -964,13 -1039,9 +956,9 @@@
          }
  
          if (allocationState != null) {
 -            sc.addAnd("allocationState", SearchCriteria.Op.EQ, allocationState);
 +            sc.setParameters("allocationState", allocationState);
          }
  
-         if(zoneType != null) {
-             sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
-         }
- 
          if (keyword != null) {
              SearchCriteria<ClusterVO> ssc = _clusterDao.createSearchCriteria();
              ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
@@@ -1386,24 -1460,9 +1374,17 @@@
          Long zoneId = cmd.getZoneId();
          Object keyword = cmd.getKeyword();
          Object allocationState = cmd.getAllocationState();
-         String zoneType = cmd.getZoneType();
 -
          zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
  
 +
 +    	Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
 +        SearchBuilder<HostPodVO> sb = _hostPodDao.createSearchBuilder();
 +        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
 +        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
 +        sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
 +        sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
 +
-         if(zoneType != null) {
-             SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
-             zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
-             sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
-         }
- 
 +        SearchCriteria<HostPodVO> sc = sb.create();
          if (keyword != null) {
              SearchCriteria<HostPodVO> ssc = _hostPodDao.createSearchCriteria();
              ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
@@@ -1425,13 -1484,9 +1406,9 @@@
          }
  
          if (allocationState != null) {
 -            sc.addAnd("allocationState", SearchCriteria.Op.EQ, allocationState);
 +            sc.setParameters("allocationState", allocationState);
          }
  
-         if(zoneType != null) {
-             sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
-         }
- 
          Pair<List<HostPodVO>, Integer> result = _hostPodDao.searchAndCount(sc, searchFilter);
          return new Pair<List<? extends Pod>, Integer>(result.first(), result.second());
      }
@@@ -3406,6 -3716,6 +3372,11 @@@
      	_encryptionIV = null;
      }
  
++    @Override
++    public boolean getExecuteInSequence() {
++        return false;  //To change body of implemented methods use File | Settings | File Templates.
++    }
++
      private static String getBase64EncodedRandomKey(int nBits) {
  		SecureRandom random;
  		try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/StorageManagerImpl.java
index 687c4da,20b435c..0df3dbe
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@@ -141,11 -136,22 +143,14 @@@ import com.cloud.storage.dao.SnapshotDa
  import com.cloud.storage.dao.StoragePoolHostDao;
  import com.cloud.storage.dao.StoragePoolWorkDao;
  import com.cloud.storage.dao.VMTemplateDao;
 -import com.cloud.storage.dao.VMTemplateHostDao;
  import com.cloud.storage.dao.VMTemplatePoolDao;
 -import com.cloud.storage.dao.VMTemplateS3Dao;
 -import com.cloud.storage.dao.VMTemplateSwiftDao;
 +import com.cloud.storage.dao.VMTemplateZoneDao;
  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;
 -import com.cloud.storage.s3.S3Manager;
 -import com.cloud.storage.secondary.SecondaryStorageVmManager;
 -import com.cloud.storage.snapshot.SnapshotManager;
 -import com.cloud.storage.snapshot.SnapshotScheduler;
 -import com.cloud.tags.dao.ResourceTagDao;
  import com.cloud.template.TemplateManager;
  import com.cloud.user.Account;
  import com.cloud.user.AccountManager;
@@@ -1637,231 -1888,67 +1645,294 @@@ public class StorageManagerImpl extend
          return null;
      }
  
 +    @Override
 +    public ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException {
 +        String providerName = cmd.getProviderName();
 +        DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);
 +
 +        if (storeProvider == null) {
 +            storeProvider = _dataStoreProviderMgr.getDefaultImageDataStoreProvider();
 +            if (storeProvider == null) {
 +                throw new InvalidParameterValueException("can't find image store provider: " + providerName);
 +            }
 +            providerName = storeProvider.getName(); // ignored passed provider name and use default image store provider name
 +        }
 +
 +        Long dcId = cmd.getZoneId();
 +        String url = cmd.getUrl();
 +        Map details = cmd.getDetails();
 +        ScopeType scopeType = ScopeType.ZONE;
 +        if (dcId == null) {
 +            scopeType = ScopeType.REGION;
 +        }
 +
 +        // check if scope is supported by store provider
 +        if (!((ImageStoreProvider) storeProvider).isScopeSupported(scopeType)) {
 +            throw new InvalidParameterValueException("Image store provider " + providerName + " does not support scope " + scopeType);
 +        }
 +
 +        // check if we have already image stores from other different providers,
 +        // we currently are not supporting image stores from different
 +        // providers co-existing
 +        List<ImageStoreVO> imageStores = _imageStoreDao.listImageStores();
 +        for (ImageStoreVO store : imageStores) {
 +            if (!store.getProviderName().equalsIgnoreCase(providerName)) {
 +                throw new InvalidParameterValueException("You can only add new image stores from the same provider " + store.getProviderName()
 +                        + " already added");
 +            }
 +        }
 +
 +        if (dcId != null) {
 +            // Check if the zone exists in the system
 +            DataCenterVO zone = _dcDao.findById(dcId);
 +            if (zone == null) {
 +                throw new InvalidParameterValueException("Can't find zone by id " + dcId);
 +            }
 +
 +            Account account = UserContext.current().getCaller();
 +            if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) {
 +                PermissionDeniedException ex = new PermissionDeniedException(
 +                        "Cannot perform this operation, Zone with specified id is currently disabled");
 +                ex.addProxyObject(zone.getUuid(), "dcId");
 +                throw ex;
 +            }
 +        }
 +
 +        Map<String, Object> params = new HashMap<String, Object>();
 +        params.put("zoneId", dcId);
 +        params.put("url", cmd.getUrl());
 +        params.put("name", cmd.getName());
 +        params.put("details", details);
 +        params.put("scope", scopeType);
 +        params.put("providerName", storeProvider.getName());
 +        params.put("role", DataStoreRole.Image);
 +
 +        DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
 +        DataStore store = null;
 +        try {
 +            store = lifeCycle.initialize(params);
 +        } catch (Exception e) {
 +            s_logger.debug("Failed to add data store", e);
 +            throw new CloudRuntimeException("Failed to add data store", e);
 +        }
 +
 +        if (((ImageStoreProvider) storeProvider).needDownloadSysTemplate()) {
 +            // trigger system vm template download
 +            this._imageSrv.downloadBootstrapSysTemplate(store);
 +        }
 +        else {
 +            // populate template_store_ref table
 +            this._imageSrv.addSystemVMTemplatesToSecondary(store);
 +        }
 +
 +        // associate builtin template with zones associated with this image
 +        // store
 +        this.associateCrosszoneTemplatesToZone(dcId);
 +
 +        return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image);
 +    }
 +
 +    private void associateCrosszoneTemplatesToZone(Long zoneId) {
 +        VMTemplateZoneVO tmpltZone;
 +
 +        List<VMTemplateVO> allTemplates = _vmTemplateDao.listAll();
 +        List<Long> dcIds = new ArrayList<Long>();
 +        if (zoneId != null) {
 +            dcIds.add(zoneId);
 +        } else {
 +            List<DataCenterVO> dcs = _dcDao.listAll();
 +            if (dcs != null) {
 +                for (DataCenterVO dc : dcs) {
 +                    dcIds.add(dc.getId());
 +                }
 +            }
 +        }
 +
 +        for (VMTemplateVO vt : allTemplates) {
 +            if (vt.isCrossZones()) {
 +                for (Long dcId : dcIds) {
 +                    tmpltZone = _vmTemplateZoneDao.findByZoneTemplate(dcId, vt.getId());
 +                    if (tmpltZone == null) {
 +                        VMTemplateZoneVO vmTemplateZone = new VMTemplateZoneVO(dcId, vt.getId(), new Date());
 +                        _vmTemplateZoneDao.persist(vmTemplateZone);
 +                    }
 +                }
 +            }
 +        }
 +    }
 +
 +    @Override
 +    public boolean deleteImageStore(DeleteImageStoreCmd cmd) {
 +        long storeId = cmd.getId();
 +        User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId());
 +        // Verify that image store exists
 +        ImageStoreVO store = _imageStoreDao.findById(storeId);
 +        if (store == null) {
 +            throw new InvalidParameterValueException("Image store with id " + storeId + " doesn't exist");
 +        }
 +        _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), store.getDataCenterId());
 +
 +        // Verify that there are no live snapshot, template, volume on the image
 +        // store to be deleted
 +        List<SnapshotDataStoreVO> snapshots = _snapshotStoreDao.listByStoreId(storeId, DataStoreRole.Image);
 +        if (snapshots != null && snapshots.size() > 0) {
 +            throw new InvalidParameterValueException("Cannot delete image store with active snapshots backup!");
 +        }
 +        List<VolumeDataStoreVO> volumes = _volumeStoreDao.listByStoreId(storeId);
 +        if (volumes != null && volumes.size() > 0) {
 +            throw new InvalidParameterValueException("Cannot delete image store with active volumes backup!");
 +        }
 +
 +        // search if there are user templates stored on this image store, excluding system, builtin templates
 +        List<TemplateJoinVO> templates = this._templateViewDao.listActiveTemplates(storeId);
 +        if (templates != null && templates.size() > 0) {
 +            throw new InvalidParameterValueException("Cannot delete image store with active templates backup!");
 +        }
 +
 +        // ready to delete
 +        Transaction txn = Transaction.currentTxn();
 +        txn.start();
 +        // first delete from image_store_details table, we need to do that since
 +        // we are not actually deleting record from main
 +        // image_data_store table, so delete cascade will not work
 +        _imageStoreDetailsDao.deleteDetails(storeId);
 +        _snapshotStoreDao.deletePrimaryRecordsForStore(storeId);
 +        _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
 +        _templateStoreDao.deletePrimaryRecordsForStore(storeId);
 +        _imageStoreDao.remove(storeId);
 +        txn.commit();
 +        return true;
 +    }
 +
 +    @Override
 +    public ImageStore createCacheStore(CreateCacheStoreCmd cmd) {
 +        String providerName = cmd.getProviderName();
 +        DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);
 +
 +        if (storeProvider == null) {
 +            storeProvider = _dataStoreProviderMgr.getDefaultCacheDataStoreProvider();
 +            if (storeProvider == null) {
 +                throw new InvalidParameterValueException("can't find cache store provider: " + providerName);
 +            }
 +        }
 +
 +        Long dcId = cmd.getZoneId();
 +
 +        ScopeType scopeType = null;
 +        String scope = cmd.getScope();
 +        if (scope != null) {
 +            try {
 +                scopeType = Enum.valueOf(ScopeType.class, scope.toUpperCase());
 +
 +            } catch (Exception e) {
 +                throw new InvalidParameterValueException("invalid scope" + scope);
 +            }
 +
 +            if (scopeType != ScopeType.ZONE) {
 +                throw new InvalidParameterValueException("Only zone wide cache storage is supported");
 +            }
 +        }
 +
 +        if (scopeType == ScopeType.ZONE && dcId == null) {
 +            throw new InvalidParameterValueException("zone id can't be null, if scope is zone");
 +        }
 +
 +        // Check if the zone exists in the system
 +        DataCenterVO zone = _dcDao.findById(dcId);
 +        if (zone == null) {
 +            throw new InvalidParameterValueException("Can't find zone by id " + dcId);
 +        }
 +
 +        Account account = UserContext.current().getCaller();
 +        if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) {
 +            PermissionDeniedException ex = new PermissionDeniedException(
 +                    "Cannot perform this operation, Zone with specified id is currently disabled");
 +            ex.addProxyObject(zone.getUuid(), "dcId");
 +            throw ex;
 +        }
 +
 +        Map<String, Object> params = new HashMap<String, Object>();
 +        params.put("zoneId", dcId);
 +        params.put("url", cmd.getUrl());
 +        params.put("name", cmd.getUrl());
 +        params.put("details", cmd.getDetails());
 +        params.put("scope", scopeType);
 +        params.put("providerName", storeProvider.getName());
 +        params.put("role", DataStoreRole.ImageCache);
 +
 +        DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
 +        DataStore store = null;
 +        try {
 +            store = lifeCycle.initialize(params);
 +        } catch (Exception e) {
 +            s_logger.debug("Failed to add data store", e);
 +            throw new CloudRuntimeException("Failed to add data store", e);
 +        }
 +
 +        return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.ImageCache);
 +    }
 +
+     // 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/9aec9c60/server/src/com/cloud/storage/s3/S3ManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/s3/S3ManagerImpl.java
index 2edf232,91fa9c3..f393fff
--- a/server/src/com/cloud/storage/s3/S3ManagerImpl.java
+++ b/server/src/com/cloud/storage/s3/S3ManagerImpl.java
@@@ -356,11 -395,9 +355,9 @@@ public class S3ManagerImpl extends Mana
                          throw new CloudRuntimeException(errMsg);
                      }
  
-                     final String installPath = join(
-                             asList("template", "tmpl", accountId,
-                                     templateId), File.separator);
+                     final String installPath = join(File.separator, "template", "tmpl", accountId, templateId);
                      final VMTemplateHostVO tmpltHost = new VMTemplateHostVO(
 -                            secondaryStorageHost.getId(), templateId,
 +                            secondaryStore.getId(), templateId,
                              now(), 100, Status.DOWNLOADED, null, null,
                              null, installPath, template.getUrl());
                      tmpltHost.setSize(templateS3VO.getSize());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index 7e1e3d4,c720169..ebe06e7
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@@ -535,9 -571,9 +535,8 @@@ public class SnapshotManagerImpl extend
          String keyword = cmd.getKeyword();
          String snapshotTypeStr = cmd.getSnapshotType();
          String intervalTypeStr = cmd.getIntervalType();
-         String zoneType = cmd.getZoneType();
          Map<String, String> tags = cmd.getTags();
          Long zoneId = cmd.getZoneId();
 -        
          Account caller = UserContext.current().getCaller();
          List<Long> permittedAccounts = new ArrayList<Long>();
  
@@@ -568,23 -604,17 +567,17 @@@
          sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
          
          if (tags != null && !tags.isEmpty()) {
 -        SearchBuilder<ResourceTagVO> tagSearch = _resourceTagDao.createSearchBuilder();
 -        for (int count=0; count < tags.size(); count++) {
 -            tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ);
 -            tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ);
 -            tagSearch.cp();
 +            SearchBuilder<ResourceTagVO> tagSearch = _resourceTagDao.createSearchBuilder();
 +            for (int count=0; count < tags.size(); count++) {
 +                tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ);
 +                tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ);
 +                tagSearch.cp();
 +            }
 +            tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ);
 +            sb.groupBy(sb.entity().getId());
 +            sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER);
          }
 -        tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ);
 -        sb.groupBy(sb.entity().getId());
 -        sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER);
 -    }
  
-         if(zoneType != null) {
-             SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
-             zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
-             sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
-         }
- 
          SearchCriteria<SnapshotVO> sc = sb.create();
          _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 6af664a,5814075..72d046e
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@@ -1169,8 -1172,8 +1172,7 @@@ public class VirtualMachineManagerImpl 
          }
  
          vmGuru.prepareStop(profile);
-         
-         StopCommand stop = new StopCommand(vm);
 -
+         StopCommand stop = new StopCommand(vm, _mgmtServer.getExecuteInSequence());
          boolean stopped = false;
          StopAnswer answer = null;
          try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --cc setup/db/db/schema-410to420.sql
index a8a133f,c782234..cc8dfaf
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@@ -2088,10 -1866,13 +2108,13 @@@ CREATE TABLE `cloud_usage`.`usage_vm_di
  ) 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;
 +SET foreign_key_checks = 1;			
  
  UPDATE `cloud`.`snapshot_policy` set uuid=id WHERE uuid is NULL;
  #update shared sg enabled network with not null name in Advance Security Group enabled network

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/test/integration/smoke/test_volumes.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/ui/scripts/system.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/ui/scripts/zoneWizard.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9aec9c60/utils/src/com/cloud/utils/S3Utils.java
----------------------------------------------------------------------