Federico Simoncelli has uploaded a new change for review.
Change subject: vm: add the live diskSizeExtend method
......................................................................
vm: add the live diskSizeExtend method
This patch adds the diskSizeExtend HSM method to implement the live disk
extension.
returnCode = diskSizeExtend(vmUUID, driveSpecs, newSize)
driveSpecs = {
'poolID': '<spUUID>',
'domainID': '<sdUUID>',
'imageID': '<imgUUID>',
'volumeID': '<volUUID>',
}
returnCode = {
'status': {'code': 0, 'message': 'Done'},
'size': '<newSize>',
}
The driveSpecs (usually poolID, domainID, imageID, volumeID) indentify
the disk to extend. The driveSpecs as GUID is not supported.
The returnCode also returns the newSize of the disk seen by the guest
(might be different from the requested one, e.g. rounded by QEMU).
The returnCode might also return the following specific errors:
- noVM(1): Virtual machine does not exist
- resizeErr(58): Wrong resize disk parameter
- updateDevice(56): Failed to update device
Change-Id: I326f0e71d53382a49eb3b43cdf0bc0472f71abdc
Signed-off-by: Federico Simoncelli <[email protected]>
---
M client/vdsClient.py
M lib/vdsm/define.py
M vdsm/API.py
M vdsm/BindingXMLRPC.py
M vdsm/vm.py
M vdsm_api/vdsmapi-schema.json
6 files changed, 86 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/14/15614/1
diff --git a/client/vdsClient.py b/client/vdsClient.py
index 1c0b27f..f7bb4e2 100644
--- a/client/vdsClient.py
+++ b/client/vdsClient.py
@@ -1687,6 +1687,20 @@
return status['status']['code'], status['status']['message']
+ def diskSizeExtend(self, args):
+ vmUUID, spUUID, sdUUID, imgUUID, volUUID, newSize = args
+
+ status = self.s.diskSizeExtend(
+ vmUUID, {
+ 'poolID': spUUID, 'domainID': sdUUID, 'imageID': imgUUID,
+ 'volumeID': volUUID
+ }, newSize)
+
+ if status['status']['code'] == 0:
+ print "New disk size: " + status.get('size', 0)
+
+ return status['status']['code'], status['status']['message']
+
if __name__ == '__main__':
if _glusterEnabled:
serv = ge.GlusterService()
@@ -2416,6 +2430,11 @@
'Finish live replication to the destination '
'domain'
)),
+ 'diskSizeExtend': (
+ serv.diskSizeExtend, (
+ '<vmId> <spUUID> <sdUUID> <imgUUID> <volUUID> <newSize>',
+ 'Finish live replication to the destination domain'
+ )),
}
if _glusterEnabled:
commands.update(ge.getGlusterCmdDict(serv))
diff --git a/lib/vdsm/define.py b/lib/vdsm/define.py
index ac91824..ecb96b2 100644
--- a/lib/vdsm/define.py
+++ b/lib/vdsm/define.py
@@ -126,6 +126,9 @@
'hwInfoErr': {'status': {
'code': 57,
'message': 'Failed to read hardware information'}},
+ 'resizeErr': {'status': {
+ 'code': 58,
+ 'message': 'Wrong resize disk parameter'}},
'recovery': {'status': {
'code': 99,
'message': 'Recovering from crash or Initializing'}},
diff --git a/vdsm/API.py b/vdsm/API.py
index b1d5d0b..010d444 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -533,6 +533,12 @@
return errCode['noVM']
return v.diskReplicateFinish(srcDisk, dstDisk)
+ def diskSizeExtend(self, driveSpecs, newSize):
+ v = self._cif.vmContainer.get(self._UUID)
+ if not v:
+ return errCode['noVM']
+ return v.diskSizeExtend(driveSpecs, newSize)
+
def pause(self):
v = self._cif.vmContainer.get(self._UUID)
if not v:
diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index 5f2f8f7..99d02f2 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -362,6 +362,10 @@
vm = API.VM(vmId)
return vm.diskReplicateFinish(srcDisk, dstDisk)
+ def vmDiskSizeExtend(self, vmId, driveSpecs, newSize):
+ vm = API.VM(vmId)
+ return vm.diskSizeExtend(driveSpecs, newSize)
+
def addNetwork(self, bridge, vlan=None, bond=None, nics=None, options={}):
api = API.Global()
return api.addNetwork(bridge, vlan, bond, nics, options)
@@ -798,6 +802,7 @@
(self.vmMonitorCommand, 'monitorCommand'),
(self.vmDiskReplicateStart, 'diskReplicateStart'),
(self.vmDiskReplicateFinish, 'diskReplicateFinish'),
+ (self.vmDiskSizeExtend, 'diskSizeExtend'),
(self.addNetwork, 'addNetwork'),
(self.delNetwork, 'delNetwork'),
(self.editNetwork, 'editNetwork'),
diff --git a/vdsm/vm.py b/vdsm/vm.py
index 67328d2..0e23824 100644
--- a/vdsm/vm.py
+++ b/vdsm/vm.py
@@ -39,6 +39,7 @@
from vdsm import constants
from vdsm import libvirtconnection
from vdsm import netinfo
+from vdsm import qemuImg
from vdsm import utils
from vdsm import vdscli
from vdsm.config import config
@@ -3770,6 +3771,38 @@
return {'status': doneCode}
+ def diskSizeExtend(self, driveSpecs, newSize):
+ try:
+ newSize = int(newSize)
+ except ValueError:
+ return errCode['resizeErr']
+
+ drive = self._findDriveByUUIDs(driveSpecs)
+
+ try:
+ diskFormat = "qcow2" if drive.format == "cow" else "raw"
+ # Apparently this is what libvirt would do anyway, except that
+ # it would fail on NFS when root_squash is enabled, see BZ#963881
+ currentSize = qemuImg.info(drive.path, diskFormat)['virtualsize']
+
+ if currentSize > newSize:
+ self.log.error(
+ "Requested extension size for disk %s is smaller than "
+ "the current size %s < %s failing", drive.name, newSize,
+ currentSize)
+ return errCode['resizeErr']
+
+ self._dom.blockResize(drive.name, newSize,
+ libvirt.VIR_DOMAIN_BLOCK_RESIZE_BYTES)
+ # Same as above, this is what libvirt would do, see BZ#963881
+ sizeRounded = qemuImg.info(drive.path, diskFormat)['virtualsize']
+ except:
+ self.log.error("Unable to extend disk %s to size %s", drive.name,
+ newSize, exc_info=True)
+ return errCode['updateDevice']
+
+ return {'status': doneCode, 'size': str(sizeRounded)}
+
def _onWatchdogEvent(self, action):
def actionToString(action):
# the following action strings come from the comments of
diff --git a/vdsm_api/vdsmapi-schema.json b/vdsm_api/vdsmapi-schema.json
index aaab8a3..8ef1b38 100644
--- a/vdsm_api/vdsmapi-schema.json
+++ b/vdsm_api/vdsmapi-schema.json
@@ -5857,6 +5857,26 @@
'data': {'vmID': 'UUID', 'srcDisk': 'DriveSpecVolume',
'dstDisk': 'DriveSpecVolume'}}
+##
+# @VM.diskSizeExtend:
+#
+# Extends the virtual size of a disk through the running VM.
+#
+# @vmID: The UUID of the VM
+#
+# @driveSpecs: A @DriveSpecVolume structure rapresenting the disk
+#
+# @newSize: The new desired size (in bytes)
+#
+# Returns:
+# The new size of the disk (might have been rounded)
+#
+# Since: 4.12.0
+##
+{'command': {'class': 'VM', 'name': 'diskSizeExtend'},
+ 'data': {'vmID': 'UUID', 'driveSpecs': 'DriveSpecVolume', 'newSize': 'str'},
+ 'returns': 'str'}
+
## Category: @Volume
###########################################################
##
# @Volume:
--
To view, visit http://gerrit.ovirt.org/15614
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I326f0e71d53382a49eb3b43cdf0bc0472f71abdc
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches