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>
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>
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>
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>
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>
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>