Repository: cloudstack
Updated Branches:
  refs/heads/resize-root 568742912 -> 23c113bff


CLOUDSTACK-6181: initial support for passing rootdisksize parameter to
    deployVirtualMachine. This currently works via 'details[0].rootdisksize=3'
    for example to get a 3G root. I'm not sure that the syntax is correct on the
    details map for deployVirtualMachine (was already implemented), so there's
    an email thread out about that.


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

Branch: refs/heads/resize-root
Commit: 23c113bff6039ec32993ecf2bce724204a3e4d65
Parents: 5687429
Author: Marcus Sorensen <[email protected]>
Authored: Mon Mar 3 17:16:40 2014 -0700
Committer: Marcus Sorensen <[email protected]>
Committed: Mon Mar 3 17:16:40 2014 -0700

----------------------------------------------------------------------
 .../orchestration/VolumeOrchestrator.java       | 10 +++++--
 .../kvm/storage/KVMStoragePoolManager.java      | 12 +++++---
 .../kvm/storage/KVMStorageProcessor.java        | 29 ++++++++++++++----
 .../kvm/storage/LibvirtStorageAdaptor.java      | 31 ++++++++++++++++----
 .../apache/cloudstack/utils/qemu/QemuImg.java   | 10 +++++--
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  8 ++++-
 6 files changed, 80 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/23c113bf/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
----------------------------------------------------------------------
diff --git 
a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
 
b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index d3eda8a..2232d69 100644
--- 
a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ 
b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -608,8 +608,14 @@ public class VolumeOrchestrator extends ManagerBase 
implements VolumeOrchestrati
         assert (template.getFormat() != ImageFormat.ISO) : "ISO is not a 
template really....";
 
         Long size = _tmpltMgr.getTemplateSize(template.getId(), 
vm.getDataCenterId());
-        if (rootDisksize != null) {
-            size = (rootDisksize * 1024 * 1024 * 1024);
+        if (rootDisksize != null ) {
+            rootDisksize = rootDisksize * 1024 * 1024 * 1024;
+            if (rootDisksize > size) {
+                s_logger.debug("Using root disk size of " + rootDisksize + " 
for volume " + name);
+                size = rootDisksize;
+            } else {
+                s_logger.debug("Using root disk size of " + size + " for 
volume " + name + "since specified root disk size of " + rootDisksize + " is 
smaller than template");
+            }
         }
         VolumeVO vol = new VolumeVO(type, name, vm.getDataCenterId(), 
owner.getDomainId(), owner.getId(), offering.getId(), size, 
offering.getMinIops(), offering.getMaxIops(),
                 null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/23c113bf/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
index 9e07e4b..583d48a 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
@@ -302,17 +302,21 @@ public class KVMStoragePoolManager {
     }
 
     public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, 
String name, KVMStoragePool destPool, int timeout) {
+        return createDiskFromTemplate(template, name, destPool, 
template.getSize(), timeout);
+    }
+
+    public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, 
String name, KVMStoragePool destPool, long size, int timeout) {
         StorageAdaptor adaptor = getStorageAdaptor(destPool.getType());
 
         // LibvirtStorageAdaptor-specific statement
         if (destPool.getType() == StoragePoolType.RBD) {
-            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.RAW, template.getSize(), destPool, timeout);
+            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.RAW, size, destPool, timeout);
         } else if (destPool.getType() == StoragePoolType.CLVM) {
-            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.RAW, template.getSize(), destPool, timeout);
+            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.RAW, size, destPool, timeout);
         } else if (template.getFormat() == PhysicalDiskFormat.DIR) {
-            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.DIR, template.getSize(), destPool, timeout);
+            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.DIR, size, destPool, timeout);
         } else {
-            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.QCOW2, template.getSize(), destPool, timeout);
+            return adaptor.createDiskFromTemplate(template, name, 
PhysicalDiskFormat.QCOW2, size, destPool, timeout);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/23c113bf/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 2ea3b42..9813389 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -182,13 +182,14 @@ public class KVMStorageProcessor implements 
StorageProcessor {
                         break;
                     }
                 }
-                if (tmplVol == null) {
-                    return new PrimaryStorageDownloadAnswer("Failed to get 
template from pool: " + secondaryPool.getUuid());
-                }
             } else {
                 tmplVol = secondaryPool.getPhysicalDisk(tmpltname);
             }
 
+            if (tmplVol == null) {
+                return new PrimaryStorageDownloadAnswer("Failed to get 
template from pool: " + secondaryPool.getUuid());
+            }
+
             /* Copy volume to primary storage */
             s_logger.debug("Copying template to primary storage, template 
format is " + tmplVol.getFormat() );
             KVMStoragePool primaryPool = 
storagePoolMgr.getStoragePool(primaryStore.getPoolType(), 
primaryStore.getUuid());
@@ -196,6 +197,14 @@ public class KVMStorageProcessor implements 
StorageProcessor {
             KVMPhysicalDisk primaryVol = null;
             if (destData instanceof VolumeObjectTO) {
                 VolumeObjectTO volume = (VolumeObjectTO)destData;
+                // pass along volume's target size if it's bigger than 
template's size, for storage types that copy template rather than cloning on 
deploy
+                if (volume.getSize() != null && volume.getSize() > 
tmplVol.getVirtualSize()) {
+                    s_logger.debug("Using configured size of " + 
volume.getSize());
+                    tmplVol.setSize(volume.getSize());
+                    tmplVol.setVirtualSize(volume.getSize());
+                } else {
+                    s_logger.debug("Using template's size of " + 
tmplVol.getVirtualSize());
+                }
                 primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, 
volume.getUuid(), primaryPool, cmd.getWaitInMillSeconds());
             } else if (destData instanceof TemplateObjectTO) {
                 TemplateObjectTO destTempl = (TemplateObjectTO)destData;
@@ -239,7 +248,7 @@ public class KVMStorageProcessor implements 
StorageProcessor {
     }
 
     // this is much like PrimaryStorageDownloadCommand, but keeping it 
separate. copies template direct to root disk
-    private KVMPhysicalDisk templateToPrimaryDownload(String templateUrl, 
KVMStoragePool primaryPool, String volUuid, int timeout) {
+    private KVMPhysicalDisk templateToPrimaryDownload(String templateUrl, 
KVMStoragePool primaryPool, String volUuid, Long size, int timeout) {
         int index = templateUrl.lastIndexOf("/");
         String mountpoint = templateUrl.substring(0, index);
         String templateName = null;
@@ -275,6 +284,14 @@ public class KVMStorageProcessor implements 
StorageProcessor {
 
             /* Copy volume to primary storage */
 
+            if (size > templateVol.getSize()) {
+                s_logger.debug("Overriding provided template's size with new 
size " + size);
+                templateVol.setSize(size);
+                templateVol.setVirtualSize(size);
+            } else {
+                s_logger.debug("Using templates disk size of " + 
templateVol.getVirtualSize() + "since size passed was " + size);
+            }
+
             KVMPhysicalDisk primaryVol = 
storagePoolMgr.copyPhysicalDisk(templateVol, volUuid, primaryPool, timeout);
             return primaryVol;
         } catch (CloudRuntimeException e) {
@@ -306,14 +323,14 @@ public class KVMStorageProcessor implements 
StorageProcessor {
 
             if (primaryPool.getType() == StoragePoolType.CLVM) {
                 templatePath = ((NfsTO)imageStore).getUrl() + File.separator + 
templatePath;
-                vol = templateToPrimaryDownload(templatePath, primaryPool, 
volume.getUuid(), cmd.getWaitInMillSeconds());
+                vol = templateToPrimaryDownload(templatePath, primaryPool, 
volume.getUuid(), volume.getSize(), cmd.getWaitInMillSeconds());
             } else {
                 if (templatePath.contains("/mnt")) {
                     //upgrade issue, if the path contains path, need to 
extract the volume uuid from path
                     templatePath = 
templatePath.substring(templatePath.lastIndexOf(File.separator) + 1);
                 }
                 BaseVol = 
storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), 
primaryStore.getUuid(), templatePath);
-                vol = storagePoolMgr.createDiskFromTemplate(BaseVol, 
volume.getUuid(), BaseVol.getPool(), cmd.getWaitInMillSeconds());
+                vol = storagePoolMgr.createDiskFromTemplate(BaseVol, 
volume.getUuid(), BaseVol.getPool(), volume.getSize(), 
cmd.getWaitInMillSeconds());
             }
             if (vol == null) {
                 return new CopyCmdAnswer(" Can't create storage volume on 
storage pool");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/23c113bf/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index 4a8f1f1..0c1d55d 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -808,11 +808,21 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
                 } else if (format == PhysicalDiskFormat.QCOW2) {
                     QemuImgFile backingFile = new 
QemuImgFile(template.getPath(), template.getFormat());
                     QemuImgFile destFile = new QemuImgFile(disk.getPath());
+                    if (size > template.getVirtualSize()) {
+                        destFile.setSize(size);
+                    } else {
+                        destFile.setSize(template.getVirtualSize());
+                    }
                     QemuImg qemu = new QemuImg(timeout);
                     qemu.create(destFile, backingFile);
                 } else if (format == PhysicalDiskFormat.RAW) {
                     QemuImgFile sourceFile = new 
QemuImgFile(template.getPath(), template.getFormat());
                     QemuImgFile destFile = new QemuImgFile(disk.getPath(), 
PhysicalDiskFormat.RAW);
+                    if (size > template.getVirtualSize()) {
+                        destFile.setSize(size);
+                    } else {
+                        destFile.setSize(template.getVirtualSize());
+                    }
                     QemuImg qemu = new QemuImg(timeout);
                     qemu.convert(sourceFile, destFile);
                 }
@@ -820,8 +830,14 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
                 format = PhysicalDiskFormat.RAW;
                 disk = new KVMPhysicalDisk(destPool.getSourceDir() + "/" + 
newUuid, newUuid, destPool);
                 disk.setFormat(format);
-                disk.setSize(template.getVirtualSize());
-                disk.setVirtualSize(disk.getSize());
+                if (size > template.getVirtualSize()) {
+                    disk.setSize(size);
+                    disk.setVirtualSize(size);
+                } else {
+                    // leave these as they were if size isn't applicable
+                    disk.setSize(template.getVirtualSize());
+                    disk.setVirtualSize(disk.getSize());
+                }
 
                 QemuImg qemu = new QemuImg(timeout);
                 QemuImgFile srcFile;
@@ -829,6 +845,11 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
                         new 
QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(), 
destPool.getSourcePort(), destPool.getAuthUserName(),
                                 destPool.getAuthSecret(), disk.getPath()));
                 destFile.setFormat(format);
+                if (size > template.getVirtualSize()) {
+                    destFile.setSize(size);
+                } else {
+                    destFile.setSize(template.getVirtualSize());
+                }
 
                 if (srcPool.getType() != StoragePoolType.RBD) {
                     srcFile = new QemuImgFile(template.getPath(), 
template.getFormat());
@@ -862,9 +883,9 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
                             if (srcImage.isOldFormat()) {
                                 /* The source image is RBD format 1, we have 
to do a regular copy */
                                 s_logger.debug("The source image " + 
srcPool.getSourceDir() + "/" + template.getName() +
-                                        " is RBD format 1. We have to perform 
a regular copy (" + template.getVirtualSize() + " bytes)");
+                                        " is RBD format 1. We have to perform 
a regular copy (" + disk.getVirtualSize() + " bytes)");
 
-                                rbd.create(disk.getName(), 
template.getVirtualSize(), rbdFeatures, rbdOrder);
+                                rbd.create(disk.getName(), 
disk.getVirtualSize(), rbdFeatures, rbdOrder);
                                 RbdImage destImage = rbd.open(disk.getName());
 
                                 s_logger.debug("Starting to copy " + 
srcImage.getName() + " to " + destImage.getName() + " in Ceph pool " + 
srcPool.getSourceDir());
@@ -908,7 +929,7 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
 
                             s_logger.debug("Creating " + disk.getName() + " on 
the destination cluster " + rDest.confGet("mon_host") + " in pool " +
                                     destPool.getSourceDir());
-                            dRbd.create(disk.getName(), 
template.getVirtualSize(), rbdFeatures, rbdOrder);
+                            dRbd.create(disk.getName(), disk.getVirtualSize(), 
rbdFeatures, rbdOrder);
 
                             RbdImage srcImage = sRbd.open(template.getName());
                             RbdImage destImage = dRbd.open(disk.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/23c113bf/plugins/hypervisors/kvm/src/org/apache/cloudstack/utils/qemu/QemuImg.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/org/apache/cloudstack/utils/qemu/QemuImg.java 
b/plugins/hypervisors/kvm/src/org/apache/cloudstack/utils/qemu/QemuImg.java
index b380815..4bec375 100644
--- a/plugins/hypervisors/kvm/src/org/apache/cloudstack/utils/qemu/QemuImg.java
+++ b/plugins/hypervisors/kvm/src/org/apache/cloudstack/utils/qemu/QemuImg.java
@@ -111,10 +111,12 @@ public class QemuImg {
         }
 
         s.add(file.getFileName());
-
-        if (backingFile == null) {
+        if (file.getSize() != 0L) {
             s.add(Long.toString(file.getSize()));
+        } else if (backingFile == null) {
+            throw new QemuImgException("No size was passed, and no backing 
file was passed");
         }
+
         String result = s.execute();
         if (result != null) {
             throw new QemuImgException(result);
@@ -206,6 +208,10 @@ public class QemuImg {
         if (result != null) {
             throw new QemuImgException(result);
         }
+
+        if (srcFile.getSize() < destFile.getSize()) {
+            this.resize(destFile, destFile.getSize());
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/23c113bf/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 2f686be..72a80a9 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -2839,7 +2839,13 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                     if 
(NumbersUtil.parseLong(customParameters.get("rootdisksize"), -1) <= 0) {
                         throw new InvalidParameterValueException("rootdisk 
size should be a non zero number.");
                     }
-                    rootDiskSize = 
Long.parseLong(customParameters.get("rootDisksize"));
+                    // only KVM supports rootdisksize override
+                    if (hypervisor != HypervisorType.KVM) {
+                        throw new InvalidParameterValueException("Hypervisor " 
+ hypervisor + " does not support rootdisksize override");
+                    }
+
+                    s_logger.debug("found root disk size of " + 
customParameters.get("rootdisksize"));
+                    rootDiskSize = 
Long.parseLong(customParameters.get("rootdisksize"));
                     customParameters.remove("rootdisksize");
                 }
 

Reply via email to