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: Ib6921bf349ce88000539150fc884f1163c738186
Signed-off-by: Kobi Ianko <[email protected]>
---
M client/vdsClient.py
M debian/vdsm.install
M lib/vdsm/define.py
M vdsm/API.py
M vdsm/BindingXMLRPC.py
M vdsm/Makefile.am
M vdsm/virt/vm.py
M vdsm_api/Bridge.py
M vdsm_api/vdsmapi-schema.json
9 files changed, 76 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/90/28190/1

diff --git a/client/vdsClient.py b/client/vdsClient.py
index 0235837..d9c53bd 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])
@@ -2567,6 +2571,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/debian/vdsm.install b/debian/vdsm.install
index b435fa6..696286d 100644
--- a/debian/vdsm.install
+++ b/debian/vdsm.install
@@ -17,6 +17,7 @@
 ./etc/vdsm/mom.d/01-parameters.policy
 ./etc/vdsm/mom.d/02-balloon.policy
 ./etc/vdsm/mom.d/03-ksm.policy
+./etc/vdsm/mom.d/04-cputune.policy
 ./etc/vdsm/svdsm.logger.conf
 ./etc/vdsm/upgrade.logger.conf
 ./etc/vdsm/vdsm-tmpfiles.conf
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 3235a6f..456a083 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -483,6 +483,23 @@
 
         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 629ed62..18ded0a 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -362,6 +362,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
@@ -932,7 +936,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/Makefile.am b/vdsm/Makefile.am
index b72c100..3d6ac9c 100644
--- a/vdsm/Makefile.am
+++ b/vdsm/Makefile.am
@@ -105,6 +105,7 @@
        mom.d/01-parameters.policy \
        mom.d/02-balloon.policy \
        mom.d/03-ksm.policy \
+       mom.d/04-cputune.policy \
        sourceRoute.sh \
        sudoers.vdsm.in \
        svdsm.logger.conf.in \
diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py
index 691e952..a5298eb 100644
--- a/vdsm/virt/vm.py
+++ b/vdsm/virt/vm.py
@@ -3358,6 +3358,26 @@
         hooks.after_set_num_of_cpus()
         return {'status': doneCode, 'vmList': self.status()}
 
+    def updateVmPolicy(self, params):
+
+        if self.isMigrating():
+            return errCode['migInProgress']
+
+        try:
+            metadataType = libvirt.VIR_DOMAIN_METADATA_ELEMENT
+            self._dom.setMetadata(metadataType, '<vcpulimit>' +
+                                  params['vcpuLimit'] +
+                                  '</vcpulimit>', 'ovirt',
+                                  '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..dec602b 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': {},
     '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 28df1e9..c01265c 100644
--- a/vdsm_api/vdsmapi-schema.json
+++ b/vdsm_api/vdsmapi-schema.json
@@ -7298,7 +7298,6 @@
  'data': {'vmID': 'UUID', 'numberOfCpus': 'int'},
  'returns': 'VmDefinition'}
 
-
 ##
 # @VM.setCpuTuneQuota:
 #
@@ -7329,3 +7328,21 @@
 {'command': {'class': 'VM', 'name': 'setCpuTunePeriod'},
  'data': {'period': 'int'},
  'returns': 'TasksStatus'}
+
+##
+# @VM.updateVmPolicy:
+#
+# Set VM SLA parameters
+#
+# @vmID:    The UUID of the VM
+#
+# @vcpuLimit:  vcpu limit to set - the value is a percentage representation
+#              of the amount of cpu from the Host that the VM can consume
+#
+# 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/28190
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib6921bf349ce88000539150fc884f1163c738186
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Kobi Ianko <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to