From 5175d06e3781517531173142d14d83a067ecfd6d Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 23 Feb 2016 17:53:41 +0100 Subject: [PATCH] vm.create(): handle limits on template disks. --- src/api/vm.coffee | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/api/vm.coffee b/src/api/vm.coffee index 054617413..dbaa25fa8 100644 --- a/src/api/vm.coffee +++ b/src/api/vm.coffee @@ -92,13 +92,26 @@ create = $coroutine ({ } ) - xapiExistingVdis = existingDisks and map(existingDisks, (vdi) => + xapi = @getXapi(template) + + diskSizesByDevice = {} + + forEach(xapi.getObject(template._xapiId).$VBDs, (vbd) => + if ( + vbd.type is 'Disk' and + (vdi = vbd.$VDI) + ) + diskSizesByDevice[vbd.device] = +vdi.virtual_size + + return + ) + + xapiExistingVdis = existingDisks and map(existingDisks, (vdi, device) => sr = @getObject(vdi.$SR) - # FIXME: handle existing VDIs when not resized. - if vdi.size + if vdi.size? size = parseSize(vdi.size) - limits.disk += size + diskSizesByDevice[device] = size objectIds.push(sr.id) @@ -109,6 +122,8 @@ create = $coroutine ({ } ) + forEach(diskSizesByDevice, (size) => limits.disk += size) + xapiVifs = VIFs and map(VIFs, (vif) => network = @getObject(vif.network) @@ -126,7 +141,6 @@ create = $coroutine ({ else unless user.permission is 'admin' throw new Unauthorized() - xapi = @getXapi(template) xapiVm = yield xapi.createVm(template._xapiId, { installRepository: installation && installation.repository, nameDescription: name_description, @@ -141,7 +155,7 @@ create = $coroutine ({ if resourceSet @addAcl(user.id, vm.id, 'admin').catch(noop) - xapi.xo.setData(xapiVm.$id, 'resourceSet', resourceSet).catch(noop) + yield xapi.xo.setData(xapiVm.$id, 'resourceSet', resourceSet).catch(noop) return vm.id