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