Jenny Tokar has uploaded a new change for review.
Change subject: Add new api to get the IO tune policies for all vms
......................................................................
Add new api to get the IO tune policies for all vms
This patch adds a new api to vdsm that allows retrieval
of the io tune policy and its' values for all the vms via
a single api thus removing the need to query vdsm for that
info for every present vm.
Change-Id: I16ead268367901ae85e47fb71104e23705f0e0e1
Bug-Url:
https://bugzilla.redhat.com/1374988
Signed-off-by: Jenny Tokar <jtokar(a)redhat.com>
---
M lib/api/vdsm-api.yml
M lib/vdsm/jsonrpcvdscli.py
M lib/vdsm/rpc/Bridge.py
M lib/vdsm/rpc/bindingxmlrpc.py
M vdsm/API.py
M vdsm/clientIF.py
M vdsm/virt/vm.py
7 files changed, 65 insertions(+), 4 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/48/63748/7
diff --git a/lib/api/vdsm-api.yml b/lib/api/vdsm-api.yml
index c7ab7f5..c27079e 100644
--- a/lib/api/vdsm-api.yml
+++ b/lib/api/vdsm-api.yml
@@ -6027,6 +6027,28 @@
type: *VmDiskDeviceIoTuneParams
type: object
+ BulkIoTunePolicy: &BulkIoTunePolicy
+ added: '4.0'
+ description: Io tune policy info and current values for a vm
+ name: BulkIoTunePolicy
+ properties:
+ - description: Io tune policy info
+ name: policy
+ type: *VmDiskDeviceTuneLimits
+
+ - description: Io tune policy current values
+ name: current_values
+ type: *VmDiskDeviceTuneParams
+ type: object
+
+ BulkIoTunePolicyMap: &BulkIoTunePolicyMap
+ added: '4.0'
+ name: BulkIoTunePolicyMap
+ description: A map of io tune policies for all VMs
+ key-type: *UUID
+ value-type: *BulkIoTunePolicy
+ type: map
+
UpdateVmPolicyParams: &UpdateVmPolicyParams
added: '3.4'
description: QoS policy update data
@@ -7617,6 +7639,13 @@
type:
- *VmStats
+Host.getAllVmIoTunePolicies:
+ added: '4.0'
+ description: Get io tune policies for all virtual machines.
+ return:
+ description: A map of io tune policies for all VMs
+ type: *BulkIoTunePolicyMap
+
Host.hostdevListByCaps:
added: '3.6'
description: Refresh and get information about devices available on the
diff --git a/lib/vdsm/jsonrpcvdscli.py b/lib/vdsm/jsonrpcvdscli.py
index e276f86..837311c 100644
--- a/lib/vdsm/jsonrpcvdscli.py
+++ b/lib/vdsm/jsonrpcvdscli.py
@@ -59,6 +59,7 @@
'getAllTasksInfo': 'Host.getAllTasksInfo',
'getAllTasksStatuses': 'Host.getAllTasksStatuses',
'getAllVmStats': 'Host.getAllVmStats',
+ 'getAllVmIoTunePolicies': 'Host.getAllVmIoTunePolicies',
'getConnectedStoragePoolsList': 'Host.getConnectedStoragePools',
'getDeviceList': 'Host.getDeviceList',
'getImagesList': 'StorageDomain.getImages',
diff --git a/lib/vdsm/rpc/Bridge.py b/lib/vdsm/rpc/Bridge.py
index 5dedcc0..7456ab3 100644
--- a/lib/vdsm/rpc/Bridge.py
+++ b/lib/vdsm/rpc/Bridge.py
@@ -354,6 +354,7 @@
'Host_getVMList': {'call': Host_getVMList_Call, 'ret':
'vmList'},
'Host_getVMFullList': {'call': Host_getVMFullList_Call,
'ret': 'vmList'},
'Host_getAllVmStats': {'ret': 'statsList'},
+ 'Host_getAllVmIoTunePolicies': {'ret':
'io_tune_policies_dict'},
'Host_setupNetworks': {'ret': 'status'},
'Host_setKsmTune': {'ret': 'status'},
'Image_cloneStructure': {'ret': 'uuid'},
diff --git a/lib/vdsm/rpc/bindingxmlrpc.py b/lib/vdsm/rpc/bindingxmlrpc.py
index b8bb3f6..1a6ab84 100644
--- a/lib/vdsm/rpc/bindingxmlrpc.py
+++ b/lib/vdsm/rpc/bindingxmlrpc.py
@@ -561,6 +561,10 @@
api = API.Global()
return api.getAllVmStats()
+ def getAllVmIoTunePolicies(self):
+ api = API.Global()
+ return api.getAllVmIoTunePolicies()
+
def hostdevListByCaps(self, caps=None):
api = API.Global()
return api.hostdevListByCaps(caps)
@@ -1073,6 +1077,7 @@
(self.getStats, 'getVdsStats'),
(self.vmGetStats, 'getVmStats'),
(self.getAllVmStats, 'getAllVmStats'),
+ (self.getAllVmIoTunePolicies, 'getAllVmIoTunePolicies'),
(self.hostdevListByCaps, 'hostdevListByCaps'),
(self.hostdevChangeNumvfs, 'hostdevChangeNumvfs'),
(self.hostdevReattach, 'hostdevReattach'),
diff --git a/vdsm/API.py b/vdsm/API.py
index f000297..0ad84bf 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -780,7 +780,7 @@
v = self._cif.vmContainer.get(self._UUID)
if not v:
return errCode['noVM']
- return v.getIoTune()
+ return v.getIoTuneResponse()
def setIoTune(self, tunables):
v = self._cif.vmContainer.get(self._UUID)
@@ -792,7 +792,7 @@
v = self._cif.vmContainer.get(self._UUID)
if not v:
return errCode['noVM']
- return v.getIoTunePolicy()
+ return v.getIoTunePolicyResponse()
def setCpuTunePeriod(self, period):
v = self._cif.vmContainer.get(self._UUID)
@@ -1395,6 +1395,13 @@
AllVmStatsValue(statsList))
return {'status': doneCode, 'statsList': Suppressed(statsList)}
+ def getAllVmIoTunePolicies(self):
+ """
+ Get IO tuning policies of all running VMs.
+ """
+ io_tune_policies_dict = self._cif.getAllVmIoTunePolicies()
+ return {'status': doneCode, 'io_tune_policies_dict':
io_tune_policies_dict}
+
def hostdevListByCaps(self, caps=None):
devices = hostdev.list_by_caps(caps)
return {'status': doneCode, 'deviceList': devices}
diff --git a/vdsm/clientIF.py b/vdsm/clientIF.py
index fefc915..c3bc10f 100644
--- a/vdsm/clientIF.py
+++ b/vdsm/clientIF.py
@@ -441,6 +441,12 @@
def getAllVmStats(self):
return [v.getStats() for v in self.vmContainer.values()]
+ def getAllVmIoTunePolicies(self):
+ vm_io_tune_policies = {}
+ for v in self.vmContainer.values():
+ vm_io_tune_policies[v.id] = {'policy':v.getIoTunePolicy(),
'current_values': v.getIoTune()}
+ return vm_io_tune_policies
+
def createStompClient(self, client_socket):
if 'jsonrpc' in self.bindings:
json_binding = self.bindings['jsonrpc']
diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py
index 967dbab..0af45b7 100644
--- a/vdsm/virt/vm.py
+++ b/vdsm/virt/vm.py
@@ -2576,19 +2576,29 @@
else:
return None
+ def getIoTunePolicyResponse(self):
+ tunables = self.getIoTunePolicy()
+ return response.success(ioTunePolicyList=tunables)
+
def getIoTunePolicy(self):
tunables = []
qos = self._getVmPolicy()
ioTuneList = qos.getElementsByTagName("ioTune")
if not ioTuneList or not ioTuneList[0].hasChildNodes():
- return response.success(ioTunePolicyList=[])
+ return []
for device in ioTuneList[0].getElementsByTagName("device"):
tunables.append(io_tune_dom_to_values(device))
- return response.success(ioTunePolicyList=tunables)
+ return tunables
def getIoTune(self):
+ result = self.getIoTuneResponse()
+ if response.is_error(result):
+ return []
+ return result.get('ioTuneList', [])
+
+ def getIoTuneResponse(self):
resultList = []
for device in self.getDiskDevices():
@@ -2615,8 +2625,10 @@
except libvirt.libvirtError as e:
self.log.exception("getVmIoTune failed")
if e.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN:
+ self.logger.error('noVM')
return response.error('noVM')
else:
+ self.logger.error('updateIoTuneErr', e.message)
return response.error('updateIoTuneErr', e.message)
return response.success(ioTuneList=resultList)
--
To view, visit
https://gerrit.ovirt.org/63748
To unsubscribe, visit
https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I16ead268367901ae85e47fb71104e23705f0e0e1
Gerrit-PatchSet: 7
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Jenny Tokar <jtokar(a)redhat.com>
Gerrit-Reviewer: Andrej Krejcir <akrejcir(a)redhat.com>
Gerrit-Reviewer: Francesco Romani <fromani(a)redhat.com>
Gerrit-Reviewer: Jenny Tokar <jtokar(a)redhat.com>
Gerrit-Reviewer: Martin Sivák <msivak(a)redhat.com>
Gerrit-Reviewer: Phillip Bailey <phbailey(a)redhat.com>
Gerrit-Reviewer: Piotr Kliczewski <piotr.kliczewski(a)gmail.com>
Gerrit-Reviewer: Roman Mohr <rmohr(a)redhat.com>
Gerrit-Reviewer: Roy Golan <rgolan(a)redhat.com>
Gerrit-Reviewer: Yanir Quinn <yquinn(a)redhat.com>
Gerrit-Reviewer: gerrit-hooks <automation(a)ovirt.org>