Change in vdsm[master]: Adding "updateVmPolicy" api
kobi at redhat.com
kobi at redhat.com
Wed Apr 30 16:22:11 UTC 2014
Kobi Ianko has uploaded a new change for review.
Change subject: Adding "updateVmPolicy" api
......................................................................
Adding "updateVmPolicy" api
Adding an API method "updateVmPolicy".
The method will be called from the engine
when a VM SLA parameter will change, for now
it will support the change of vcpuLimit.
Change-Id: I9750667c4d20d7589a1797e65d5683692ec02afe
Signed-off-by: Kobi Ianko <kianku at redhat.com>
---
M client/vdsClient.py
M lib/vdsm/define.py
M vdsm/API.py
M vdsm/BindingXMLRPC.py
M vdsm/virt/vm.py
M vdsm_api/Bridge.py
M vdsm_api/vdsmapi-schema.json
7 files changed, 71 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/72/27272/1
diff --git a/client/vdsClient.py b/client/vdsClient.py
index 9764ea5..564ba40 100644
--- a/client/vdsClient.py
+++ b/client/vdsClient.py
@@ -258,6 +258,10 @@
def setNumberOfCpus(self, args):
return self.ExecAndExit(self.s.setNumberOfCpus(args[0], args[1]))
+ def updateVmPolicy(self, args):
+ params = {'vmId': args[0], 'vcpuLimit':args[1]}
+ return self.ExecAndExit(self.s.updateVmPolicy(params))
+
def do_changeCD(self, args):
vmId = args[0]
file = self._parseDriveSpec(args[1])
@@ -2556,6 +2560,11 @@
'<vmId> <numberOfCpus>',
'set the number of cpus for a running VM'
)),
+ 'updateVmPolicy': (
+ serv.updateVmPolicy, (
+ '<vmId> <vcpuLimit>',
+ 'set SLA parameter for a VM'
+ )),
}
if _glusterEnabled:
commands.update(ge.getGlusterCmdDict(serv))
diff --git a/lib/vdsm/define.py b/lib/vdsm/define.py
index 7e6cadb..025d952 100644
--- a/lib/vdsm/define.py
+++ b/lib/vdsm/define.py
@@ -138,6 +138,9 @@
'haErr': {'status': {
'code': 61,
'message': 'Failed to set Hosted Engine HA policy'}},
+ 'updateVmPolicyErr': {'status': {
+ 'code': 62,
+ 'message': 'Failed to update VM SLA policy'}},
'recovery': {'status': {
'code': 99,
'message': 'Recovering from crash or Initializing'}},
diff --git a/vdsm/API.py b/vdsm/API.py
index 94b39b6..304cbc0 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -482,6 +482,22 @@
return curVm.setNumberOfCpus(int(numberOfCpus))
+ def updateVmPolicy(self, params):
+
+ if params['vmId'] is None or params['vcpuLimit'] is None:
+ self.log.error('Missing one of required parameters: \
+ vmId: (%s), numberOfCpus: (%s)', params['vmId'], params['vcpuLimit'])
+ return {'status': {'code': errCode['MissParam']['status']['code'],
+ 'message': 'Missing one of required '
+ 'parameters: vmId, vcpuLimit'}}
+ try:
+ curVm = self._cif.vmContainer[self._UUID]
+ except KeyError:
+ self.log.warning("vm %s doesn't exist", self._UUID)
+ return errCode['noVM']
+
+ return curVm.updateVmPolicy(params)
+
def migrate(self, params):
"""
Migrate a VM to a remote host.
diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index 76251f5..6bbc333 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -359,6 +359,10 @@
vm = API.VM(vmId)
return vm.setNumberOfCpus(vmId, numberOfCpus)
+ def vmUpdateVmPolicy(self, params):
+ vm = API.VM(params['vmId'])
+ return vm.updateVmPolicy(params)
+
def vmSnapshot(self, vmId, snapDrives, snapMemVolHandle=''):
"""
Take snapshot of VM
@@ -939,7 +943,8 @@
(self.vmHotplugNic, 'hotplugNic'),
(self.vmHotunplugNic, 'hotunplugNic'),
(self.vmUpdateDevice, 'vmUpdateDevice'),
- (self.vmSetNumberOfCpus, 'setNumberOfCpus'))
+ (self.vmSetNumberOfCpus, 'setNumberOfCpus')
+ (self.vmUpdateVmPolicy, 'updateVmPolicy'))
def getIrsMethods(self):
return ((self.domainActivate, 'activateStorageDomain'),
diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py
index 670e8b8..87360c8 100644
--- a/vdsm/virt/vm.py
+++ b/vdsm/virt/vm.py
@@ -3174,6 +3174,25 @@
hooks.after_set_num_of_cpus()
return {'status': doneCode, 'vmList': self.status()}
+ def updateVmPolicy(self, params):
+
+ if self.isMigrating():
+ return errCode['migInProgress']
+
+ self.log.debug("Setting VM policy to [vcpuLimit: %s]", params['vcpuLimit'])
+# hooks.before_set_num_of_cpus()
+ try:
+ domain = self._connection.lookupByUUIDString(self.id)
+ domain.setMetadata(2, params['vcpuLimit'], 'http://ovirt.org/param/vcpu_limit',0)
+ except libvirt.libvirtError as e:
+ self.log.error("updateVmPolicy failed", exc_info=True)
+ if e.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN:
+ return errCode['noVM']
+ return {'status': {'code': errCode['updateVmPolicyErr']
+ ['status']['code'], 'message': e.message}}
+
+ return {'status': doneCode }
+
def _createTransientDisk(self, diskParams):
if diskParams.get('shared', None) != DRIVE_SHARED_TYPE.TRANSIENT:
return
diff --git a/vdsm_api/Bridge.py b/vdsm_api/Bridge.py
index 566587f..42506f9 100644
--- a/vdsm_api/Bridge.py
+++ b/vdsm_api/Bridge.py
@@ -364,6 +364,7 @@
'VM_mergeStatus': {'ret': 'mergeStatus'},
'VM_migrationCreate': {'ret': VM_migrationCreate_Ret},
'VM_setNumberOfCpus': {'ret': 'vmList'},
+ 'VM_updateVmPolicy': {'ret'},
'Volume_copy': {'ret': 'uuid'},
'Volume_create': {'ret': 'uuid'},
'Volume_delete': {'ret': 'uuid'},
diff --git a/vdsm_api/vdsmapi-schema.json b/vdsm_api/vdsmapi-schema.json
index 31bd869..81be9cc 100644
--- a/vdsm_api/vdsmapi-schema.json
+++ b/vdsm_api/vdsmapi-schema.json
@@ -7088,3 +7088,20 @@
{'command': {'class': 'VM', 'name': 'setNumberOfCpus'},
'data': {'vmID': 'UUID', 'numberOfCpus': 'int'},
'returns': 'VmDefinition'}
+
+ ##
+# @VM.updateVmPolicy:
+#
+# Set VM SLA parameters
+#
+# @vmID: The UUID of the VM
+#
+# @vcpuLimit: vcpu limit to set
+#
+# Returns:
+# The VM definition, as updated
+#
+# Since: 4.15.0
+##
+{'command': {'class': 'VM', 'name': 'updateVmPolicy'},
+ 'data': {'vmID': 'UUID', 'vcpuLimit': 'int'}}
--
To view, visit http://gerrit.ovirt.org/27272
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9750667c4d20d7589a1797e65d5683692ec02afe
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Kobi Ianko <kobi at redhat.com>
More information about the vdsm-patches
mailing list