Change in vdsm[master]: sp: remove duplicated code for repoPath
by Federico Simoncelli
Federico Simoncelli has uploaded a new change for review.
Change subject: sp: remove duplicated code for repoPath
......................................................................
sp: remove duplicated code for repoPath
Change-Id: Id9e7160a0934f687d3f7b23de06f392ec9a3a9b7
Signed-off-by: Federico Simoncelli <fsimonce(a)redhat.com>
---
M vdsm/storage/sp.py
1 file changed, 18 insertions(+), 24 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/03/12803/1
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index 7a64bf5..0a84bc4 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -1074,14 +1074,14 @@
# broken after the upgrade
sdUUID = domain.sdUUID
isMsd = (self.masterDomain.sdUUID == sdUUID)
- repoPath = os.path.join(self.storage_repository, self.spUUID)
if targetFormat is None:
targetFormat = self.getFormat()
try:
self._formatConverter.convert(
- repoPath, self.id, domain.getRealDomain(), isMsd, targetFormat)
+ self.poolPath, self.id, domain.getRealDomain(), isMsd,
+ targetFormat)
finally:
# For safety we remove the domain from the cache also if the
# conversion supposedly failed.
@@ -1753,12 +1753,11 @@
rmanager.acquireResource(dstImageResourcesNamespace,
dstImgUUID, rm.LockType.exclusive)
):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- dstUUID = image.Image(repoPath).copy(sdUUID, vmUUID, srcImgUUID,
- srcVolUUID, dstImgUUID,
- dstVolUUID, descr, dstSdUUID,
- volType, volFormat,
- preallocate, postZero, force)
+ dstUUID = image.Image(self.poolPath).copy(
+ sdUUID, vmUUID, srcImgUUID, srcVolUUID, dstImgUUID,
+ dstVolUUID, descr, dstSdUUID, volType, volFormat, preallocate,
+ postZero, force)
+
return dict(uuid=dstUUID)
def moveImage(self, srcDomUUID, dstDomUUID, imgUUID, vmUUID, op, postZero,
@@ -1801,9 +1800,8 @@
imgUUID, srcLock),
rmanager.acquireResource(dstImageResourcesNamespace,
imgUUID, rm.LockType.exclusive)):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- image.Image(repoPath).move(srcDomUUID, dstDomUUID, imgUUID, vmUUID,
- op, postZero, force)
+ image.Image(self.poolPath).move(srcDomUUID, dstDomUUID, imgUUID,
+ vmUUID, op, postZero, force)
def cloneImageStructure(self, sdUUID, imgUUID, dstSdUUID):
"""
@@ -1829,8 +1827,8 @@
)))
with nested(*resList):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- image.Image(repoPath).cloneStructure(sdUUID, imgUUID, dstSdUUID)
+ image.Image(self.poolPath).cloneStructure(
+ sdUUID, imgUUID, dstSdUUID)
def syncImageData(self, sdUUID, imgUUID, dstSdUUID, syncType):
"""
@@ -1857,9 +1855,8 @@
)))
with nested(*resList):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- image.Image(repoPath).syncData(sdUUID, imgUUID, dstSdUUID,
- syncType)
+ image.Image(self.poolPath).syncData(
+ sdUUID, imgUUID, dstSdUUID, syncType)
def moveMultipleImages(self, srcDomUUID, dstDomUUID, imgDict, vmUUID,
force):
@@ -1896,9 +1893,8 @@
dstImageResourcesNamespace, imgUUID, rm.LockType.exclusive))
with nested(*resourceList):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- image.Image(repoPath).multiMove(srcDomUUID, dstDomUUID, imgDict,
- vmUUID, force)
+ image.Image(self.poolPath).multiMove(
+ srcDomUUID, dstDomUUID, imgDict, vmUUID, force)
def mergeSnapshots(self, sdUUID, vmUUID, imgUUID, ancestor, successor,
postZero):
@@ -1923,9 +1919,8 @@
with rmanager.acquireResource(imageResourcesNamespace, imgUUID,
rm.LockType.exclusive):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- image.Image(repoPath).merge(sdUUID, vmUUID, imgUUID, ancestor,
- successor, postZero)
+ image.Image(self.poolPath).merge(
+ sdUUID, vmUUID, imgUUID, ancestor, successor, postZero)
def createVolume(self, sdUUID, imgUUID, size, volFormat, preallocate,
diskType, volUUID=None, desc="",
@@ -2096,8 +2091,7 @@
self.log.warning("SP %s SD %s img %s Vol %s - teardown failed")
def validateVolumeChain(self, sdUUID, imgUUID):
- repoPath = os.path.join(self.storage_repository, self.spUUID)
- image.Image(repoPath).validateVolumeChain(sdUUID, imgUUID)
+ image.Image(self.poolPath).validateVolumeChain(sdUUID, imgUUID)
def extendSD(self, sdUUID, devlist, force):
sdCache.produce(sdUUID).extend(devlist, force)
--
To view, visit http://gerrit.ovirt.org/12803
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Id9e7160a0934f687d3f7b23de06f392ec9a3a9b7
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce(a)redhat.com>
11 years
Change in vdsm[master]: Multiply amount of open file descriptor for vdsm user
by ybronhei@redhat.com
Yaniv Bronhaim has uploaded a new change for review.
Change subject: Multiply amount of open file descriptor for vdsm user
......................................................................
Multiply amount of open file descriptor for vdsm user
As part of fixing fds leak we increase the amount of available open fds
to allow stability in large scale of simultaneously operations.
Currently lv operations can't run simultaneously and
wait for pior operation to end. Simultaneously attach sd requests open
fds and close them only after end, when operation waits on lv operation
vdsm keeps the fds open for long time.
Change-Id: Ide73b075c56c83d0298a9cd3a0892b0ce7cd46f6
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=920532
Signed-off-by: Yaniv Bronhaim <ybronhei(a)redhat.com>
---
M vdsm/limits.conf
1 file changed, 3 insertions(+), 2 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/66/13566/1
diff --git a/vdsm/limits.conf b/vdsm/limits.conf
index 287f70d..fc018a6 100644
--- a/vdsm/limits.conf
+++ b/vdsm/limits.conf
@@ -1,6 +1,7 @@
# This limits are intended for medium VDSM hosts, for large hosts scale these
# numbers appropriately.
-# nproc\nofile should be at least 150 + (3 * <The maximum amount of running VMs>)
+# nproc should be at least 150 + The maximum amount of running VMs (640) + The maximum amount of storage operations
+# nofile should be at least 3(stdin,stdour,stderr) * each external process. Each VM run or storage operation initiates external process.
vdsm - nproc 4096
-vdsm - nofile 4096
+vdsm - nofile 8192
--
To view, visit http://gerrit.ovirt.org/13566
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ide73b075c56c83d0298a9cd3a0892b0ce7cd46f6
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Yaniv Bronhaim <ybronhei(a)redhat.com>
11 years
Change in vdsm[master]: Fix crash on vm start with netdevs some w/out info
by asegurap@redhat.com
Antoni Segura Puimedon has uploaded a new change for review.
Change subject: Fix crash on vm start with netdevs some w/out info
......................................................................
Fix crash on vm start with netdevs some w/out info
Some devices, like sr-iov do not have have information in the domxml
to represent alias and name.
This patch is a first version to get around the crash. It would maybe
be preferrable to add support for some hook call in the except that
would allow us to ask for the missing information to the hook (which
could return something specific or default to the empty string, for
example).
Change-Id: I5a90fba21075ab2c7ecb0cb75f14ca07f090829e
Signed-off-by: Antoni S. Puimedon <asegurap(a)redhat.com>
---
M vdsm/libvirtvm.py
1 file changed, 12 insertions(+), 3 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/40/13540/1
diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py
index cb792b5..2837b8f 100644
--- a/vdsm/libvirtvm.py
+++ b/vdsm/libvirtvm.py
@@ -2966,10 +2966,19 @@
getElementsByTagName('interface')
for x in ifsxml:
devType = x.getAttribute('type')
- name = x.getElementsByTagName('target')[0].getAttribute('dev')
+ try:
+ name = x.getElementsByTagName('target')[0].getAttribute('dev')
+ except IndexError:
+ name = ''
+ try:
+ alias = x.getElementsByTagName('alias')[0].getAttribute('name')
+ except IndexError:
+ alias = ''
+ try:
+ model = x.getElementsByTagName('model')[0].getAttribute('type')
+ except IndexError:
+ model = ''
mac = x.getElementsByTagName('mac')[0].getAttribute('address')
- alias = x.getElementsByTagName('alias')[0].getAttribute('name')
- model = x.getElementsByTagName('model')[0].getAttribute('type')
network = None
try:
--
To view, visit http://gerrit.ovirt.org/13540
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I5a90fba21075ab2c7ecb0cb75f14ca07f090829e
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Antoni Segura Puimedon <asegurap(a)redhat.com>
11 years
Change in vdsm[master]: Per device custom properties for before/after vm destroy.
by amuller@redhat.com
Assaf Muller has uploaded a new change for review.
Change subject: Per device custom properties for before/after vm destroy.
......................................................................
Per device custom properties for before/after vm destroy.
Change-Id: Ic18b838dc51ea6bde31ef1a4bf0d0d372d95cd41
Signed-off-by: Assaf Muller <amuller(a)redhat.com>
---
M vdsm.spec.in
M vdsm/hooks.py
M vdsm/libvirtvm.py
M vdsm/vdsmd.8.in
M vdsm_hooks/Makefile.am
5 files changed, 27 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/11/13411/1
diff --git a/vdsm.spec.in b/vdsm.spec.in
index 32eb97d..724a113 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -794,6 +794,8 @@
%{_libexecdir}/%{vdsm_name}/spmstop.sh
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_device_create
%dir %{_libexecdir}/%{vdsm_name}/hooks/after_device_create
+%dir %{_libexecdir}/%{vdsm_name}/hooks/before_device_destroy
+%dir %{_libexecdir}/%{vdsm_name}/hooks/after_device_destroy
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_vm_start
%dir %{_libexecdir}/%{vdsm_name}/hooks/after_vm_start
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_vm_cont
diff --git a/vdsm/hooks.py b/vdsm/hooks.py
index a2cb932..c66bfef 100644
--- a/vdsm/hooks.py
+++ b/vdsm/hooks.py
@@ -101,6 +101,16 @@
params=customProperties)
+def before_device_destroy(devicexml, vmconf={}, customProperties={}):
+ return _runHooksDir(devicexml, 'before_device_destroy', vmconf=vmconf,
+ params=customProperties)
+
+
+def after_device_destroy(devicexml, vmconf={}, customProperties={}):
+ return _runHooksDir(devicexml, 'after_device_destroy', vmconf=vmconf,
+ params=customProperties)
+
+
def before_vm_start(domxml, vmconf={}):
return _runHooksDir(domxml, 'before_vm_start', vmconf=vmconf)
diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py
index 4c41c6b..3f682dc 100644
--- a/vdsm/libvirtvm.py
+++ b/vdsm/libvirtvm.py
@@ -2599,6 +2599,11 @@
hooks.after_vm_destroy(self._lastXMLDesc, self.conf)
+ for devType in self._devices:
+ for dev in self._devices[devType]:
+ hooks.after_device_destroy(dev._deviceXML, self.conf,
+ getattr(dev, 'custom', {}))
+
self._released = True
return {'status': doneCode}
@@ -2618,6 +2623,11 @@
def destroy(self):
self.log.debug('destroy Called')
+ for devType in self._devices:
+ for dev in self._devices[devType]:
+ hooks.before_device_destroy(dev._deviceXML, self.conf,
+ getattr(dev, 'custom', {}))
+
hooks.before_vm_destroy(self._lastXMLDesc, self.conf)
self.destroyed = True
diff --git a/vdsm/vdsmd.8.in b/vdsm/vdsmd.8.in
index 50da8cf..1803b58 100644
--- a/vdsm/vdsmd.8.in
+++ b/vdsm/vdsmd.8.in
@@ -48,6 +48,7 @@
before_vm_destroy, after_vm_destroy,
before_vm_set_ticket, after_vm_set_ticket,
before_device_create, after_device_create,
+ before_device_destroy, after_device_destroy,
before_nic_hotplug, after_nic_hotplug, after_nic_hotplug_fail,
before_nic_hotunplug, after_nic_hotunplug, after_nic_unhotplug_fail,
before_disk_hotplug, after_disk_hotplug,
@@ -89,7 +90,8 @@
before_nic_hotunplug, after_nic_hotunplug, after_nic_unhotplug_fail,
before_disk_hotplug, after_disk_hotplug,
before_disk_hotunplug, after_disk_hotunplug,
- before_device_create, after_device_create.
+ before_device_create, after_device_create,
+ before_device_destroy, after_device_destroy.
Are all augmented by custom properties specific to those devices, sent by the caller of the hook. For example if before_nic_hotplug is called with custom: {qos: '0.5', color: 'red'} then qos and color will be directly available as environment variables when before_nic_hotplug is called.
diff --git a/vdsm_hooks/Makefile.am b/vdsm_hooks/Makefile.am
index 3f890f6..12bea50 100644
--- a/vdsm_hooks/Makefile.am
+++ b/vdsm_hooks/Makefile.am
@@ -61,6 +61,8 @@
VDSMHOOKS = \
before_device_create \
after_device_create \
+ before_device_destroy \
+ after_device_destroy \
before_vm_start \
after_vm_start \
before_vm_cont \
--
To view, visit http://gerrit.ovirt.org/13411
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic18b838dc51ea6bde31ef1a4bf0d0d372d95cd41
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Assaf Muller <amuller(a)redhat.com>
11 years
Change in vdsm[master]: Added support for before and after device create.
by amuller@redhat.com
Assaf Muller has uploaded a new change for review.
Change subject: Added support for before and after device create.
......................................................................
Added support for before and after device create.
before_device_create is called for each device, right before
before_vm_create. Each such hook is supplied the device's
dom xml and any custom properties. after_device_create is
called right after after_vm_start.
Change-Id: I3291032ff85254d5c3a4260bffb7003ca3502d22
Signed-off-by: Muller <amuller(a)redhat.com>
---
M vdsm.spec.in
M vdsm/hooks.py
M vdsm/libvirtvm.py
M vdsm/vm.py
M vdsm_hooks/Makefile.am
5 files changed, 39 insertions(+), 2 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/96/13396/1
diff --git a/vdsm.spec.in b/vdsm.spec.in
index 3f7397a..32eb97d 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -792,6 +792,8 @@
%{_libexecdir}/%{vdsm_name}/safelease
%{_libexecdir}/%{vdsm_name}/spmprotect.sh
%{_libexecdir}/%{vdsm_name}/spmstop.sh
+%dir %{_libexecdir}/%{vdsm_name}/hooks/before_device_create
+%dir %{_libexecdir}/%{vdsm_name}/hooks/after_device_create
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_vm_start
%dir %{_libexecdir}/%{vdsm_name}/hooks/after_vm_start
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_vm_cont
diff --git a/vdsm/hooks.py b/vdsm/hooks.py
index 33faa6e..a2cb932 100644
--- a/vdsm/hooks.py
+++ b/vdsm/hooks.py
@@ -91,6 +91,16 @@
return finalxml
+def before_device_create(devicexml, vmconf={}, customProperties={}):
+ return _runHooksDir(devicexml, 'before_device_create', vmconf=vmconf,
+ params=customProperties)
+
+
+def after_device_create(devicexml, vmconf={}, customProperties={}):
+ return _runHooksDir(devicexml, 'after_device_create', vmconf=vmconf,
+ params=customProperties)
+
+
def before_vm_start(domxml, vmconf={}):
return _runHooksDir(domxml, 'before_vm_start', vmconf=vmconf)
diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py
index 3855e56..25b0208 100644
--- a/vdsm/libvirtvm.py
+++ b/vdsm/libvirtvm.py
@@ -1318,10 +1318,26 @@
domxml.appendInput()
domxml.appendGraphics()
+ # Temp injection of custom properties for testing purposes
for devType in self._devices:
for dev in self._devices[devType]:
- devElem = dev.getXML()
- domxml._devices.appendChild(devElem)
+ if devType == vm.NIC_DEVICES:
+ dev.custom = {'qos': True, 'color': 'red'}
+
+ '''
+ For each device
+ Get its XML, run a before_device_create hook
+ Append the XML to the VM's DOM XML
+ Save the XML for future use
+ '''
+ for devType in self._devices:
+ for dev in self._devices[devType]:
+ devxmlString = dev.getXML().toxml(encoding='utf-8')
+ devxmlString = hooks.before_device_create(
+ devxmlString, self.conf, getattr(dev, 'custom', {}))
+ dev._deviceXML = devxmlString
+ devxml = xml.dom.minidom.parseString(devxmlString).firstChild
+ domxml._devices.appendChild(devxml)
for drive in self._devices[vm.DISK_DEVICES][:]:
if not hasattr(drive, 'volumeChain'):
@@ -1503,6 +1519,12 @@
if self._dom.UUIDString() != self.id:
raise Exception('libvirt bug 603494')
hooks.after_vm_start(self._dom.XMLDesc(0), self.conf)
+
+ for devType in self._devices:
+ for dev in self._devices[devType]:
+ hooks.after_device_create(dev._deviceXML, self.conf,
+ getattr(dev, 'custom', {}))
+
if not self._dom:
self.setDownStatus(ERROR, 'failed to start libvirt vm')
return
diff --git a/vdsm/vm.py b/vdsm/vm.py
index 98f04fd..66ffeb2 100644
--- a/vdsm/vm.py
+++ b/vdsm/vm.py
@@ -69,6 +69,7 @@
pass
self.conf = conf
self.log = log
+ self._deviceXML = None
def __str__(self):
attrs = [":".join((a, str(getattr(self, a)))) for a in dir(self)
diff --git a/vdsm_hooks/Makefile.am b/vdsm_hooks/Makefile.am
index fa5a795..3f890f6 100644
--- a/vdsm_hooks/Makefile.am
+++ b/vdsm_hooks/Makefile.am
@@ -59,6 +59,8 @@
persist-vdsm-hooks.in
VDSMHOOKS = \
+ before_device_create \
+ after_device_create \
before_vm_start \
after_vm_start \
before_vm_cont \
--
To view, visit http://gerrit.ovirt.org/13396
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3291032ff85254d5c3a4260bffb7003ca3502d22
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Assaf Muller <amuller(a)redhat.com>
11 years
Change in vdsm[master]: Work in progress: First commit for custom device properties.
by amuller@redhat.com
Assaf Muller has uploaded a new change for review.
Change subject: Work in progress: First commit for custom device properties.
......................................................................
Work in progress: First commit for custom device properties.
1) All methods related to nic and disk hot plug and unplug
in hooks.py and libvirtvm.py now pass the params dictionary
onwards.
2) Added unit test 'deviceCustomProperties' under hooksTests.py,
that verifies that a custom property sent to a hook is indeed
available in that hook.
Change-Id: Id1684c3bcf8838b43c7856f3794f1bffd8c4b28c
Signed-off-by: Assaf Muller <amuller(a)redhat.com>
---
M tests/hooksTests.py
M vdsm/hooks.py
M vdsm/libvirtvm.py
3 files changed, 70 insertions(+), 31 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/24/13124/1
diff --git a/tests/hooksTests.py b/tests/hooksTests.py
index f80f271..e32862d 100644
--- a/tests/hooksTests.py
+++ b/tests/hooksTests.py
@@ -103,3 +103,24 @@
os.unlink(sName)
expectedRes = dict([(os.path.basename(sName), {'md5': md5})])
self.assertEqual(expectedRes, info)
+
+ def test_deviceCustomProperties(self):
+ dirName = tempfile.mkdtemp()
+ script = tempfile.NamedTemporaryFile(dir=dirName, delete=False)
+ code = """#!/usr/bin/python
+
+import os
+import hooking
+
+domXMLFile = file(os.environ['_hook_domxml'], 'a')
+customProperty = os.environ['customProperty']
+domXMLFile.write(customProperty)
+ """
+
+ script.write(code)
+ os.chmod(script.name, 0775)
+ script.close()
+
+ result = hooks._runHooksDir("oVirt", dirName,
+ params={'customProperty': ' rocks!'})
+ self.assertEqual(result, "oVirt rocks!")
diff --git a/vdsm/hooks.py b/vdsm/hooks.py
index 95516a8..33faa6e 100644
--- a/vdsm/hooks.py
+++ b/vdsm/hooks.py
@@ -174,47 +174,54 @@
raiseError=False, params=params)
-def before_nic_hotplug(nicxml, vmconf={}):
- return _runHooksDir(nicxml, 'before_nic_hotplug', vmconf=vmconf)
+def before_nic_hotplug(nicxml, vmconf={}, params={}):
+ return _runHooksDir(nicxml, 'before_nic_hotplug', vmconf=vmconf,
+ params=params)
-def after_nic_hotplug(nicxml, vmconf={}):
- return _runHooksDir(nicxml, 'after_nic_hotplug', vmconf=vmconf)
+def after_nic_hotplug(nicxml, vmconf={}, params={}):
+ return _runHooksDir(nicxml, 'after_nic_hotplug', vmconf=vmconf,
+ params=params)
-def before_nic_hotunplug(nicxml, vmconf={}):
- return _runHooksDir(nicxml, 'before_nic_hotunplug', vmconf=vmconf)
+def before_nic_hotunplug(nicxml, vmconf={}, params={}):
+ return _runHooksDir(nicxml, 'before_nic_hotunplug', vmconf=vmconf,
+ params=params)
-def after_nic_hotunplug(nicxml, vmconf={}):
+def after_nic_hotunplug(nicxml, vmconf={}, params={}):
return _runHooksDir(nicxml, 'after_nic_hotunplug', vmconf=vmconf,
- raiseError=False)
+ params=params, raiseError=False)
-def after_nic_hotplug_fail(nicxml, vmconf={}):
+def after_nic_hotplug_fail(nicxml, vmconf={}, params={}):
return _runHooksDir(nicxml, 'after_nic_hotplug_fail', vmconf=vmconf,
- raiseError=False)
+ params=params, raiseError=False)
-def after_nic_hotunplug_fail(nicxml, vmconf={}):
+def after_nic_hotunplug_fail(nicxml, vmconf={}, params={}):
return _runHooksDir(nicxml, 'after_nic_hotunplug_fail', vmconf=vmconf,
- raiseError=False)
+ params=params, raiseError=False)
-def before_disk_hotplug(domxml, vmconf={}):
- return _runHooksDir(domxml, 'before_disk_hotplug', vmconf=vmconf)
+def before_disk_hotplug(domxml, vmconf={}, params={}):
+ return _runHooksDir(domxml, 'before_disk_hotplug', vmconf=vmconf,
+ params=params)
-def after_disk_hotplug(domxml, vmconf={}):
- return _runHooksDir(domxml, 'after_disk_hotplug', vmconf=vmconf)
+def after_disk_hotplug(domxml, vmconf={}, params={}):
+ return _runHooksDir(domxml, 'after_disk_hotplug', vmconf=vmconf,
+ params=params)
-def before_disk_hotunplug(domxml, vmconf={}):
- return _runHooksDir(domxml, 'before_disk_hotunplug', vmconf=vmconf)
+def before_disk_hotunplug(domxml, vmconf={}, params={}):
+ return _runHooksDir(domxml, 'before_disk_hotunplug', vmconf=vmconf,
+ params=params)
-def after_disk_hotunplug(domxml, vmconf={}):
- return _runHooksDir(domxml, 'after_disk_hotunplug', vmconf=vmconf)
+def after_disk_hotunplug(domxml, vmconf={}, params={}):
+ return _runHooksDir(domxml, 'after_disk_hotunplug', vmconf=vmconf,
+ params=params)
def before_vdsm_start():
diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py
index 39d1b5b..f42e8b7 100644
--- a/vdsm/libvirtvm.py
+++ b/vdsm/libvirtvm.py
@@ -1501,14 +1501,16 @@
nicParams = params['nic']
nic = NetworkInterfaceDevice(self.conf, self.log, **nicParams)
nicXml = nic.getXML().toprettyxml(encoding='utf-8')
- nicXml = hooks.before_nic_hotplug(nicXml, self.conf)
+ nicXml = hooks.before_nic_hotplug(nicXml, self.conf,
+ params=params.get('custom', {}))
self.log.debug("Hotplug NIC xml: %s", nicXml)
try:
self._dom.attachDevice(nicXml)
except libvirt.libvirtError as e:
self.log.error("Hotplug failed", exc_info=True)
- nicXml = hooks.after_nic_hotplug_fail(nicXml, self.conf)
+ nicXml = hooks.after_nic_hotplug_fail(
+ nicXml, self.conf, params=params.get('custom', {}))
if e.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN:
return errCode['noVM']
return {'status': {'code': errCode['hotplugNic']['status']['code'],
@@ -1522,7 +1524,8 @@
self.conf['devices'].append(nicParams)
self.saveState()
self._getUnderlyingNetworkInterfaceInfo()
- hooks.after_nic_hotplug(nicXml, self.conf)
+ hooks.after_nic_hotplug(nicXml, self.conf,
+ params=params.get('custom', {}))
if hasattr(nic, 'portMirroring'):
mirroredNetworks = []
@@ -1538,7 +1541,8 @@
self.log.error("setPortMirroring for network %s failed",
network, exc_info=True)
nicParams['portMirroring'] = mirroredNetworks
- self.hotunplugNic({'nic': nicParams})
+ self.hotunplugNic({'nic': nicParams},
+ params=params.get('custom', {}))
return {'status':
{'code': errCode['hotplugNic']['status']['code'],
'message': e.message}}
@@ -1679,7 +1683,8 @@
supervdsm.getProxy().unsetPortMirroring(network, nic.name)
nicXml = nic.getXML().toprettyxml(encoding='utf-8')
- hooks.before_nic_hotunplug(nicXml, self.conf)
+ hooks.before_nic_hotunplug(nicXml, self.conf,
+ params=params.get('custom', {}))
self.log.debug("Hotunplug NIC xml: %s", nicXml)
else:
self.log.error("Hotunplug NIC failed - NIC not found: %s",
@@ -1715,12 +1720,14 @@
if nic:
self._devices[vm.NIC_DEVICES].append(nic)
self.saveState()
- hooks.after_nic_hotunplug_fail(nicXml, self.conf)
+ hooks.after_nic_hotunplug_fail(nicXml, self.conf,
+ params=params.get('custom', {}))
return {
'status': {'code': errCode['hotunplugNic']['status']['code'],
'message': e.message}}
- hooks.after_nic_hotunplug(nicXml, self.conf)
+ hooks.after_nic_hotunplug(nicXml, self.conf,
+ params=params.get('custom', {}))
return {'status': doneCode, 'vmList': self.status()}
def hotplugDisk(self, params):
@@ -1738,7 +1745,8 @@
driveXml = drive.getXML().toprettyxml(encoding='utf-8')
self.log.debug("Hotplug disk xml: %s" % (driveXml))
- hooks.before_disk_hotplug(driveXml, self.conf)
+ hooks.before_disk_hotplug(driveXml, self.conf,
+ params=params.get('custom', {}))
try:
self._dom.attachDevice(driveXml)
except libvirt.libvirtError as e:
@@ -1758,7 +1766,8 @@
self.conf['devices'].append(diskParams)
self.saveState()
self._getUnderlyingDriveInfo()
- hooks.after_disk_hotplug(driveXml, self.conf)
+ hooks.after_disk_hotplug(driveXml, self.conf,
+ params=params.get('custom', {}))
return {'status': doneCode, 'vmList': self.status()}
@@ -1800,7 +1809,8 @@
self.saveState()
- hooks.before_disk_hotunplug(driveXml, self.conf)
+ hooks.before_disk_hotunplug(driveXml, self.conf,
+ params=params.get('custom', {}))
try:
self._dom.detachDevice(driveXml)
except libvirt.libvirtError as e:
@@ -1817,7 +1827,8 @@
'status': {'code': errCode['hotunplugDisk']['status']['code'],
'message': e.message}}
else:
- hooks.after_disk_hotunplug(driveXml, self.conf)
+ hooks.after_disk_hotunplug(driveXml, self.conf,
+ params=params.get('custom', {}))
self._cleanup()
return {'status': doneCode, 'vmList': self.status()}
--
To view, visit http://gerrit.ovirt.org/13124
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Id1684c3bcf8838b43c7856f3794f1bffd8c4b28c
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Assaf Muller <amuller(a)redhat.com>
11 years
Change in vdsm[master]: vdsm-reg: avoid issuing errors to console
by Alon Bar-Lev
Alon Bar-Lev has uploaded a new change for review.
Change subject: vdsm-reg: avoid issuing errors to console
......................................................................
vdsm-reg: avoid issuing errors to console
Using logging.error() during the ovirt-node dialog results in writing
messages to console. This is undesired in dialog mode.
Change the error to debug to avoid.
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=947905
Change-Id: Ib25f516b74dc03cca4fe696467121c8e8db06b76
Signed-off-by: Alon Bar-Lev <alonbl(a)redhat.com>
---
M vdsm_reg/deployUtil.py.in
1 file changed, 3 insertions(+), 3 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/61/13561/1
diff --git a/vdsm_reg/deployUtil.py.in b/vdsm_reg/deployUtil.py.in
index f2bef9d..3b056ca 100644
--- a/vdsm_reg/deployUtil.py.in
+++ b/vdsm_reg/deployUtil.py.in
@@ -1720,7 +1720,7 @@
return True
except:
- logging.error(
+ logging.debug(
"Failed acquiring web certificates",
exc_info=True
)
@@ -1736,10 +1736,10 @@
fp = filter(lambda l: 'Fingerprint' in
l, out.split())[0].split('=')[1]
except Exception:
- logging.error("Failed generating finger print for %s", path,
+ logging.debug("Failed generating finger print for %s", path,
exc_info=True)
else:
- logging.error("Command %s failed with return value %d",
+ logging.debug("Command %s failed with return value %d",
' '.join(cmd), rc)
return fp
--
To view, visit http://gerrit.ovirt.org/13561
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib25f516b74dc03cca4fe696467121c8e8db06b76
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Alon Bar-Lev <alonbl(a)redhat.com>
11 years
Change in vdsm[master]: Fix iSCSI functional tests in Fedora 18
by zhshzhou@linux.vnet.ibm.com
Zhou Zheng Sheng has uploaded a new change for review.
Change subject: Fix iSCSI functional tests in Fedora 18
......................................................................
Fix iSCSI functional tests in Fedora 18
There are two fix.
1. modprobe iscsi_target_mod before running tests in Fedora 18
In Fedora 18, iscsi_target_mod is not loaded by default. If the module
is not loaded, the rtslib will fail to configure iSCSI targets for the
storage backend and the test will fail. This patch load the module
explicitly before running the tests.
2. Wait for some time for VDSM to refreshing the device list
If two iSCSI tests are arranged back to back, we should wait for VDSM to
refresh the iSCSI session info. Otherwise the _getIqnDevs method fails.
Change-Id: If0ffd21cbf0b68fa19e4f9a84e399bf2c75039bc
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
M tests/functional/xmlrpcTests.py
M tests/testrunner.py
2 files changed, 12 insertions(+), 3 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/94/12594/1
diff --git a/tests/functional/xmlrpcTests.py b/tests/functional/xmlrpcTests.py
index 95f06a8..54a66b5 100644
--- a/tests/functional/xmlrpcTests.py
+++ b/tests/functional/xmlrpcTests.py
@@ -48,6 +48,7 @@
raise SkipTest("XML-RPC Bindings are disabled")
_mkinitrd = CommandPath("mkinird", "/usr/bin/mkinitrd")
+_modprobe = CommandPath("modprobe", "/usr/sbin/modprobe")
def readableBy(filePath, user):
@@ -424,8 +425,13 @@
class IscsiServer(BackendServer):
def __init__(self, vdsmServer, asserts):
+ # check if the system supports configuring iSCSI target
if not "rtslib" in globals().keys():
raise SkipTest("python-rtslib is not installed.")
+
+ cmd = [_modprobe.cmd, "iscsi_target_mod"]
+ rc, out, err = execCmd(cmd, sudo=True)
+ asserts.assertEquals(rc, 0)
super(IscsiServer, self).__init__(vdsmServer, asserts)
self.address = '127.0.0.1'
@@ -506,13 +512,16 @@
iqnDevs[iqn] = dev['GUID']
break
else:
- raise RuntimeError(
+ raise AssertionError(
'Can not find related device of iqn %s' % iqn)
return iqnDevs
def _genTypeSpecificArgs(self, connections, rollback):
iqns = [conn['params']['iqn'] for conn in connections.itervalues()]
- iqnDevs = self._getIqnDevs(iqns)
+ # If two iSCSI tests are run back to back, it takes VDSM some time to
+ # refresh the iSCSI session info.
+ iqnDevs = self.asserts.retryAssert(partial(self._getIqnDevs, iqns),
+ timeout=30)
args = {}
for uuid, conn in connections.iteritems():
diff --git a/tests/testrunner.py b/tests/testrunner.py
index 2c55a51..f58011a 100644
--- a/tests/testrunner.py
+++ b/tests/testrunner.py
@@ -134,7 +134,7 @@
# hackVdsmModule() is called. Do not import it at the
# module level.
from vdsm.utils import retry
- retry(expectedException=AssertionError, *args, **kwargs)
+ return retry(expectedException=AssertionError, *args, **kwargs)
def assertRaises(self, excClass, callableObj=None, *args, **kwargs):
# FIXME: This is a forward port of the assertRaises from python
--
To view, visit http://gerrit.ovirt.org/12594
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If0ffd21cbf0b68fa19e4f9a84e399bf2c75039bc
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
11 years
Change in vdsm[master]: Relink template hard links to meta and lease files
by ykaplan@redhat.com
Yeela Kaplan has uploaded a new change for review.
Change subject: Relink template hard links to meta and lease files
......................................................................
Relink template hard links to meta and lease files
Change-Id: Idce0f3f1812fdf45efeeeffcccb7dc22b3b0d0f0
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=864073
Signed-off-by: Yeela Kaplan <ykaplan(a)redhat.com>
---
M vdsm/storage/fileSD.py
M vdsm/storage/fileVolume.py
M vdsm/storage/image.py
M vdsm/storage/sd.py
4 files changed, 63 insertions(+), 38 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/37/12837/1
diff --git a/vdsm/storage/fileSD.py b/vdsm/storage/fileSD.py
index fa837fc..1d7e7d7 100644
--- a/vdsm/storage/fileSD.py
+++ b/vdsm/storage/fileSD.py
@@ -519,6 +519,50 @@
for imageDir in removedImages:
self.oop.fileUtils.cleanupdir(imageDir)
+ def templateRelink(self, imgUUID, volUUID):
+ """
+ Relink all hardlinks of the template 'volUUID' in all VMs based on it.
+
+ This function assumes that dom is backup dom and that template image is
+ used by other volumes.
+ """
+ # Avoid relink templates for non-NFS domains
+ if self.getStorageType() not in [sd.NFS_DOMAIN]:
+ self.log.debug("Doesn't relink templates non-NFS domain %s",
+ self.sdUUID)
+ return
+
+ allVols = self.getAllVolumes()
+ tImgs = allVols[volUUID].imgs
+ if len(tImgs) < 2:
+ self.log.debug("Volume %s is an unused template or a regular "
+ "volume. Found in images: %s allVols: %s", volUUID,
+ tImgs, allVols)
+ return
+ templateImage = tImgs[0]
+ relinkImgs = tuple(tImgs[1:])
+ for rImg in relinkImgs:
+ # This function assumes that all relevant images and template
+ # namespaces are locked.
+ repoPath = self._getRepoPath()
+ tLink = os.path.join(repoPath, self.sdUUID,
+ sd.DOMAIN_IMAGES, rImg, volUUID)
+ for ext in ['', fileVolume.META_FILEEXT]:
+ self.oop.os.unlink(tLink + ext)
+ self.oop.os.link(os.path.join(repoPath, self.sdUUID,
+ sd.DOMAIN_IMAGES, templateImage,
+ volUUID + ext), tLink + ext)
+
+ try:
+ self.oop.os.unlink(tLink + fileVolume.LEASE_FILEEXT)
+ self.oop.os.link(os.path.join(
+ repoPath, self.sdUUID, sd.DOMAIN_IMAGES,
+ templateImage, volUUID + fileVolume.LEASE_FILEEXT),
+ tLink + fileVolume.LEASE_FILEEXT)
+ except OSError as e:
+ if e.errno != os.errno.ENOENT:
+ raise
+
def getMountsList(pattern="*"):
finalPat = os.path.join(sd.StorageDomain.storage_repository,
diff --git a/vdsm/storage/fileVolume.py b/vdsm/storage/fileVolume.py
index 01575e0..6e12cd8 100644
--- a/vdsm/storage/fileVolume.py
+++ b/vdsm/storage/fileVolume.py
@@ -34,6 +34,7 @@
import task
from threadLocal import vars
+META_FILEEXT = ".meta"
LEASE_FILEEXT = ".lease"
LEASE_FILEOFFSET = 0
@@ -538,7 +539,7 @@
@classmethod
def __metaVolumePath(cls, vol_path):
if vol_path:
- return vol_path + '.meta'
+ return vol_path + META_FILEEXT
else:
return None
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index 025885f..3eada2b 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -36,7 +36,6 @@
from threadLocal import vars
import resourceFactories
import resourceManager as rm
-import outOfProcess as oop
log = logging.getLogger('Storage.Image')
rmanager = rm.ResourceManager.getInstance()
@@ -368,38 +367,6 @@
# Do not deactivate the template yet (might be in use by an other vm)
# TODO: reference counting to deactivate when unused
- def __templateRelink(self, destDom, imgUUID, volUUID):
- """
- Relink all hardlinks of the template 'volUUID' in all VMs based on it.
-
- This function assumes that dom is backup dom and that template image is
- used by other volumes.
- """
- # Avoid relink templates for non-NFS domains
- if destDom.getStorageType() not in [sd.NFS_DOMAIN]:
- self.log.debug("Doesn't relink templates non-NFS domain %s",
- destDom.sdUUID)
- return
-
- allVols = destDom.getAllVolumes()
- tImgs = allVols[volUUID].imgs
- if len(tImgs) < 2:
- self.log.debug("Volume %s is an unused template or a regular "
- "volume. Found in images: %s allVols: %s", volUUID,
- tImgs, allVols)
- return
- templateImage = tImgs[0]
- relinkImgs = tuple(tImgs[1:])
- for rImg in relinkImgs:
- # This function assumes that all relevant images and template
- # namespaces are locked.
- tLink = os.path.join(self.repoPath, destDom.sdUUID,
- sd.DOMAIN_IMAGES, rImg, volUUID)
- oop.getProcessPool(destDom.sdUUID).os.unlink(tLink)
- oop.getProcessPool(destDom.sdUUID).os.link(os.path.join(
- self.repoPath, destDom.sdUUID, sd.DOMAIN_IMAGES, templateImage,
- volUUID), tLink)
-
def createFakeTemplate(self, sdUUID, volParams):
"""
Create fake template (relevant for Backup domain only)
@@ -431,8 +398,8 @@
vol.setShared()
# Now we should re-link all hardlinks of this template in
# all VMs based on it
- self.__templateRelink(destDom, volParams['imgUUID'],
- volParams['volUUID'])
+ destDom.templateRelink(volParams['imgUUID'],
+ volParams['volUUID'])
self.log.debug("Succeeded to create fake image %s in "
"domain %s", volParams['imgUUID'],
@@ -658,7 +625,7 @@
if force:
leafVol = chains['dstChain'][-1]
# Now we should re-link all deleted hardlinks, if exists
- self.__templateRelink(destDom, imgUUID, leafVol.volUUID)
+ destDom.templateRelink(imgUUID, leafVol.volUUID)
# At this point we successfully finished the 'copy' part of the
# operation and we can clear all recoveries.
@@ -931,7 +898,7 @@
if force:
# Now we should re-link all deleted hardlinks, if exists
- self.__templateRelink(destDom, dstImgUUID, dstVolUUID)
+ destDom.templateRelink(dstImgUUID, dstVolUUID)
except se.StorageException:
self.log.error("Unexpected error", exc_info=True)
raise
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index 9ce836b..c65abac 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -785,3 +785,16 @@
(on NFS mostly) due to lazy file removal
"""
pass
+
+ def templateRelink(self, imgUUID, volUUID):
+ """
+ Relink all hardlinks of the template 'volUUID' in all VMs based on it.
+
+ This function assumes that dom is backup dom and that template image is
+ used by other volumes.
+ """
+ # Avoid relink templates for non-NFS domains
+ if self.getStorageType() not in [NFS_DOMAIN]:
+ self.log.debug("Doesn't relink templates non-NFS domain %s",
+ self.sdUUID)
+ return
--
To view, visit http://gerrit.ovirt.org/12837
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Idce0f3f1812fdf45efeeeffcccb7dc22b3b0d0f0
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Yeela Kaplan <ykaplan(a)redhat.com>
11 years
Change in vdsm[master]: Return the result directly instead of generator when getting...
by wudxw@linux.vnet.ibm.com
Mark Wu has uploaded a new change for review.
Change subject: Return the result directly instead of generator when getting network for interface
......................................................................
Return the result directly instead of generator when getting network
for interface
Since one nic could be only used for one non-VLANed bridge or one non-VLANed
bridgeless network, it needn't continue to check other networks after
found one.
Change-Id: I80c47d0f0df70de73993ef0c09f69cbf882f6629
Signed-off-by: Mark Wu <wudxw(a)linux.vnet.ibm.com>
---
M vdsm/configNetwork.py
M vdsm/netinfo.py
2 files changed, 17 insertions(+), 16 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/37/9737/1
diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
index 09d70ac..dd92bb1 100755
--- a/vdsm/configNetwork.py
+++ b/vdsm/configNetwork.py
@@ -858,11 +858,11 @@
raise ConfigNetworkError(ne.ERR_USED_NIC,
"nic %s already used by vlans %s" %
(nic, vlansForNic))
- networksForNic = tuple(_netinfo.getNetworksForIface(nic))
- if networksForNic:
+ networkForNic = _netinfo.getNetworkForIface(nic)
+ if networkForNic:
raise ConfigNetworkError(ne.ERR_USED_NIC,
- "nic %s already used by networks %s" %
- (nic, networksForNic))
+ "nic %s already used by network %s" %
+ (nic, networkForNic))
else:
_validateInterNetworkCompatibility(_netinfo, vlan, nic, bridged)
@@ -1213,9 +1213,7 @@
logger.debug("Creating/Editing bond %s with attributes %s",
bond, bondAttrs)
- brNets = list(_netinfo.getBridgedNetworksForIface(bond))
- # Only one bridged-non-VLANed network allowed on same nic/bond
- bridge = brNets[0] if brNets else None
+ bridge = _netinfo.getBridgedNetworkForIface(bond)
mtu = None
if bond in _netinfo.bondings:
diff --git a/vdsm/netinfo.py b/vdsm/netinfo.py
index f7d1799..0113688 100644
--- a/vdsm/netinfo.py
+++ b/vdsm/netinfo.py
@@ -432,22 +432,25 @@
if iface == vdict['iface']:
yield v.split('.', 1)[1]
- def getNetworksForIface(self, iface):
- """ Return all networks attached to nic/bond """
- return chain(self.getBridgelessNetworksForIface(iface),
- self.getBridgedNetworksForIface(iface))
+ def getNetworkForIface(self, iface):
+ """ Return the network attached to nic/bond """
+ network = self.getBridgelessNetworkForIface(iface)
+ if network is not None:
+ return network
+ else:
+ return self.getBridgedNetworkForIface(iface)
- def getBridgelessNetworksForIface(self, iface):
- """ Return all bridgeless networks attached to nic/bond """
+ def getBridgelessNetworkForIface(self, iface):
+ """ Return the bridgeless network attached to nic/bond """
for network, netdict in self.networks.iteritems():
if not netdict['bridged'] and iface == netdict['iface']:
- yield network
+ return network
- def getBridgedNetworksForIface(self, iface):
+ def getBridgedNetworkForIface(self, iface):
""" Return all bridged networks attached to nic/bond """
for bridge, netdict in self.networks.iteritems():
if netdict['bridged'] and iface in netdict['ports']:
- yield bridge
+ return bridge
def getBondingsForNic(self, nic):
for b, bdict in self.bondings.iteritems():
--
To view, visit http://gerrit.ovirt.org/9737
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I80c47d0f0df70de73993ef0c09f69cbf882f6629
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Mark Wu <wudxw(a)linux.vnet.ibm.com>
11 years