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");
}