From 5eeee5cf739f10ecdf89b739bc70047f303fb72c Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Mon, 3 Mar 2014 18:42:04 -0700 Subject: [PATCH] rootdisksize: fail earlier when template size is greater than specified rootdisksize --- server/src/com/cloud/vm/UserVmManagerImpl.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 72a80a928c4..48166f39d1e 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2835,17 +2835,29 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir vm.setIsoId(template.getId()); } Long rootDiskSize = null; + // custom root disk size, resizes base template to larger size if (customParameters.containsKey("rootdisksize")) { 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")); + // rotdisksize must be larger than template + VMTemplateVO templateVO = _templateDao.findById(template.getId()); + if (templateVO == null) { + throw new InvalidParameterValueException("Unable to look up template by id " + template.getId()); + } + + if ((rootDiskSize << 30) < templateVO.getSize()) { + throw new InvalidParameterValueException("unsupported: rootdisksize override is smaller than template size " + templateVO.getSize()); + } + + s_logger.debug("found root disk size of " + rootDiskSize); customParameters.remove("rootdisksize"); }