[vdsm/f17] update to vdsm-4.10.0-3

Federico Simoncelli fsimonce at fedoraproject.org
Tue Jun 26 19:16:29 UTC 2012


commit 83b9f8f9bf02399226fb2801cd3803a39331b5f3
Author: Federico Simoncelli <fsimonce at redhat.com>
Date:   Tue Jun 26 21:07:08 2012 +0200

    update to vdsm-4.10.0-3
    
    - BZ#832577: node can't be approved
    - BZ#824298 fix typo in keyword argument exc_info
    
    Signed-off-by: Federico Simoncelli <fsimonce at redhat.com>

 .gitignore                                         |   17 ---
 ...til.yumFind-rename-and-simplify-semantics.patch |   70 ++++++++++
 0002-drop-deployUtil.yumSearch.patch               |   63 +++++++++
 ....yumSearchVersion-compare-versions-sanely.patch |   95 +++++++++++++
 ...over-delete-candidates-networks-only-once.patch |   77 +++++++++++
 ...nslation-in-setupNetworks-is-not-relevant.patch |   33 +++++
 0006-Minor-optimization-for-delNetwork.patch       |   97 ++++++++++++++
 ...-ignore-bridgeless-networks-in-ifaceUsers.patch |   38 ++++++
 0008-Minor-optimization-for-addNetwork.patch       |   65 +++++++++
 0009-Use-already-known-iface-in-addNetwork.patch   |   37 +++++
 ...se-proper-MTU-on-bonding-when-add-network.patch |   39 ++++++
 0011-Add-bridge-on-top-of-VLAN-if-exists.patch     |   50 +++++++
 ...dd-netConfigDirty-bit-to-getVdsCaps-repor.patch |   30 ++++
 0013-remove-flag-skipLibvirt.patch                 |  132 ++++++++++++++++++
 ...llow-to-change-bond-without-network-attac.patch |  140 ++++++++++++++++++++
 ...llow-to-change-network-according-the-diff.patch |   47 +++++++
 ...llow-to-remove-bond-and-attach-network-to.patch |   49 +++++++
 ...BZ-826873-Allow-to-create-bond-without-ne.patch |   31 +++++
 0018-BZ-832577-node-can-t-be-approved.patch        |   38 ++++++
 ...298-fix-typo-in-keyword-argument-exc_info.patch |   57 ++++++++
 sources                                            |   17 ---
 vdsm.spec                                          |   12 ++-
 22 files changed, 1198 insertions(+), 36 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 47ebc5c..2ea9961 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,20 +8,3 @@
 /vdsm-4.9.6-1b07249.tar.gz
 /vdsm-4.9.6-e952471.tar.gz
 /vdsm-4.10.0.tar.gz
-/0001-deployUtil.yumFind-rename-and-simplify-semantics.patch
-/0002-drop-deployUtil.yumSearch.patch
-/0003-deployUtil.yumSearchVersion-compare-versions-sanely.patch
-/0004-Iterates-over-delete-candidates-networks-only-once.patch
-/0005-options-translation-in-setupNetworks-is-not-relevant.patch
-/0006-Minor-optimization-for-delNetwork.patch
-/0007-Don-t-ignore-bridgeless-networks-in-ifaceUsers.patch
-/0008-Minor-optimization-for-addNetwork.patch
-/0009-Use-already-known-iface-in-addNetwork.patch
-/0010-Use-proper-MTU-on-bonding-when-add-network.patch
-/0011-Add-bridge-on-top-of-VLAN-if-exists.patch
-/0012-BZ-830485-Add-netConfigDirty-bit-to-getVdsCaps-repor.patch
-/0013-remove-flag-skipLibvirt.patch
-/0014-BZ-826873-Allow-to-change-bond-without-network-attac.patch
-/0015-BZ-830486-Allow-to-change-network-according-the-diff.patch
-/0016-BZ-826467-Allow-to-remove-bond-and-attach-network-to.patch
-/0017-Related-to-BZ-826873-Allow-to-create-bond-without-ne.patch
diff --git a/0001-deployUtil.yumFind-rename-and-simplify-semantics.patch b/0001-deployUtil.yumFind-rename-and-simplify-semantics.patch
new file mode 100644
index 0000000..46041c1
--- /dev/null
+++ b/0001-deployUtil.yumFind-rename-and-simplify-semantics.patch
@@ -0,0 +1,70 @@
+From 8cf22884c2134353981bca1cb0600451391dd0de Mon Sep 17 00:00:00 2001
+From: Dan Kenigsberg <danken at redhat.com>
+Date: Tue, 19 Jun 2012 00:17:13 +0300
+Subject: [PATCH 01/17] deployUtil.yumFind: rename and simplify semantics
+
+deployUtil.yumListPackages is a convenience wrapper around
+yum.YumBase.pkgSack.searchNevra()
+
+Change-Id: I5ad5405ae0f8548c0116ac5a8066325455aef13a
+Signed-off-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5467
+Reviewed-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Tested-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5542
+Reviewed-by: Federico Simoncelli <fsimonce at redhat.com>
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm_reg/deployUtil.py.in |   14 ++++++--------
+ 1 files changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/vdsm_reg/deployUtil.py.in b/vdsm_reg/deployUtil.py.in
+index 976295f..c80b487 100644
+--- a/vdsm_reg/deployUtil.py.in
++++ b/vdsm_reg/deployUtil.py.in
+@@ -1029,18 +1029,16 @@ def installAndVerify(pckgType, pckgName, action, args=None):
+ 
+     return fReturn, msg
+ 
+-def yumFind(pkgName):
++def yumListPackages(pkgName):
+     """
+         Returns a list of available packages exists in yum's db.
+     """
+     import yum
+-    lReturn = None
+ 
+     my = yum.YumBase()
+     my.preconf.debuglevel = 0 # Remove yum noise
+-    lReturn = my.pkgSack.searchNevra(name=pkgName)
++    return my.pkgSack.searchNevra(name=pkgName)
+ 
+-    return lReturn
+ 
+ def yumSearch(pkgName):
+     """
+@@ -1048,8 +1046,8 @@ def yumSearch(pkgName):
+     """
+     fReturn = False
+ 
+-    pkgs = yumFind(pkgName)
+-    if pkgs and len(pkgs)>0:
++    pkgs = yumListPackages(pkgName)
++    if pkgs:
+         fReturn = True
+         logging.debug("yumSearch: found " + str(pkgName) + " entries: " + str(pkgs))
+     else:
+@@ -1064,8 +1062,8 @@ def yumSearchVersion(pkgName, ver, startWith=True):
+     """
+     fReturn = False
+ 
+-    pkgs = yumFind(pkgName)
+-    if pkgs and len(pkgs)>0:
++    pkgs = yumListPackages(pkgName)
++    if pkgs:
+         for item in pkgs:
+             if startWith:
+                 if str(item).startswith(ver):
+-- 
+1.7.1
+
diff --git a/0002-drop-deployUtil.yumSearch.patch b/0002-drop-deployUtil.yumSearch.patch
new file mode 100644
index 0000000..4980e65
--- /dev/null
+++ b/0002-drop-deployUtil.yumSearch.patch
@@ -0,0 +1,63 @@
+From 5edbed09c4091959e569e8cccc888bb72958082b Mon Sep 17 00:00:00 2001
+From: Dan Kenigsberg <danken at redhat.com>
+Date: Tue, 19 Jun 2012 00:21:55 +0300
+Subject: [PATCH 02/17] drop deployUtil.yumSearch
+
+It was just a complex way of calculating bool(yumFind()).
+
+Change-Id: Iafc9d67fef5cb348255b06a9e6b404a70ec35693
+Signed-off-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5468
+Reviewed-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Tested-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5543
+Reviewed-by: Federico Simoncelli <fsimonce at redhat.com>
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vds_bootstrap/vds_bootstrap.py |    2 +-
+ vdsm_reg/deployUtil.py.in      |   16 ----------------
+ 2 files changed, 1 insertions(+), 17 deletions(-)
+
+diff --git a/vds_bootstrap/vds_bootstrap.py b/vds_bootstrap/vds_bootstrap.py
+index 0df5023..12e127e 100755
+--- a/vds_bootstrap/vds_bootstrap.py
++++ b/vds_bootstrap/vds_bootstrap.py
+@@ -225,7 +225,7 @@ class Deploy:
+         rc = True
+ 
+         try:
+-            rc = deployUtil.yumSearch(VDSM_NAME)
++            rc = bool(deployUtil.yumListPackages(VDSM_NAME))
+         except:
+             rc = False
+             logging.error("checkRegistration: Error searching for VDSM package!",
+diff --git a/vdsm_reg/deployUtil.py.in b/vdsm_reg/deployUtil.py.in
+index c80b487..1adf1a5 100644
+--- a/vdsm_reg/deployUtil.py.in
++++ b/vdsm_reg/deployUtil.py.in
+@@ -1039,22 +1039,6 @@ def yumListPackages(pkgName):
+     my.preconf.debuglevel = 0 # Remove yum noise
+     return my.pkgSack.searchNevra(name=pkgName)
+ 
+-
+-def yumSearch(pkgName):
+-    """
+-        Returns True is package exists in yum's db.
+-    """
+-    fReturn = False
+-
+-    pkgs = yumListPackages(pkgName)
+-    if pkgs:
+-        fReturn = True
+-        logging.debug("yumSearch: found " + str(pkgName) + " entries: " + str(pkgs))
+-    else:
+-        logging.debug("yumSearch: package " + str(pkgName) + " not found!")
+-
+-    return fReturn
+-
+ def yumSearchVersion(pkgName, ver, startWith=True):
+     """
+         Returns True is package exists in yum's db with the given version.
+-- 
+1.7.1
+
diff --git a/0003-deployUtil.yumSearchVersion-compare-versions-sanely.patch b/0003-deployUtil.yumSearchVersion-compare-versions-sanely.patch
new file mode 100644
index 0000000..d9b45d7
--- /dev/null
+++ b/0003-deployUtil.yumSearchVersion-compare-versions-sanely.patch
@@ -0,0 +1,95 @@
+From 67309fc8a7a4edd4996490b64f51ce37f0ed2327 Mon Sep 17 00:00:00 2001
+From: Dan Kenigsberg <danken at redhat.com>
+Date: Tue, 19 Jun 2012 00:33:22 +0300
+Subject: [PATCH 03/17] deployUtil.yumSearchVersion: compare versions sanely
+
+Change-Id: I0aa40c3395ca012a21f148f20125b54e3ba16d8a
+Signed-off-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5469
+Reviewed-by: Mark Wu <wudxw at linux.vnet.ibm.com>
+Tested-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Reviewed-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5544
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+Reviewed-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vds_bootstrap/vds_bootstrap.py |    6 +++---
+ vdsm_reg/deployUtil.py.in      |   31 +++++++------------------------
+ 2 files changed, 10 insertions(+), 27 deletions(-)
+
+diff --git a/vds_bootstrap/vds_bootstrap.py b/vds_bootstrap/vds_bootstrap.py
+index 12e127e..9801459 100755
+--- a/vds_bootstrap/vds_bootstrap.py
++++ b/vds_bootstrap/vds_bootstrap.py
+@@ -80,13 +80,13 @@ fedorabased = deployUtil.versionCompare(deployUtil.getOSVersion(), "16") >= 0
+ 
+ if rhel6based:
+     VDSM_NAME = "vdsm"
+-    VDSM_MIN_VER = VDSM_NAME + "-4.9"
++    VDSM_MIN_VER = "4.9"
+     KERNEL_VER = "2.6.32-.*.el6"
+     KERNEL_MIN_VER = 150
+     MINIMAL_SUPPORTED_PLATFORM = "6.0"
+ else:
+     VDSM_NAME = "vdsm22"
+-    VDSM_MIN_VER = VDSM_NAME + "-4.5"
++    VDSM_MIN_VER = "4.5"
+     KERNEL_VER = "2.6.18-.*.el5"
+     KERNEL_MIN_VER = 159
+     MINIMAL_SUPPORTED_PLATFORM = "5.5"
+@@ -250,7 +250,7 @@ class Deploy:
+         rc = True
+ 
+         try:
+-            rc = deployUtil.yumSearchVersion(VDSM_NAME, VDSM_MIN_VER, True)
++            rc = deployUtil.yumSearchVersion(VDSM_NAME, VDSM_MIN_VER)
+         except:
+             rc = False
+             logging.error("checkMajorVersion: Error searching for VDSM version!",
+diff --git a/vdsm_reg/deployUtil.py.in b/vdsm_reg/deployUtil.py.in
+index 1adf1a5..1474196 100644
+--- a/vdsm_reg/deployUtil.py.in
++++ b/vdsm_reg/deployUtil.py.in
+@@ -1039,32 +1039,15 @@ def yumListPackages(pkgName):
+     my.preconf.debuglevel = 0 # Remove yum noise
+     return my.pkgSack.searchNevra(name=pkgName)
+ 
+-def yumSearchVersion(pkgName, ver, startWith=True):
+-    """
+-        Returns True is package exists in yum's db with the given version.
+-        Note: yum internal code has verEQ and verGT. We should use it ASAP.
+-    """
+-    fReturn = False
++def yumSearchVersion(pkgName, ver):
++    "Return True if package exists in yum's db with the given version or higer"
++    import rpmUtils.miscutils
+ 
+-    pkgs = yumListPackages(pkgName)
+-    if pkgs:
+-        for item in pkgs:
+-            if startWith:
+-                if str(item).startswith(ver):
+-                    fReturn = True
+-                    logging.debug("yumSearchVersion: pkg " + str(item) + " starts with: " + ver)
+-                else:
+-                    logging.debug("yumSearchVersion: pkg " + str(item) + " does not start with: " + ver)
+-            else:
+-                if str(item) == ver:
+-                    fReturn = True
+-                    logging.debug("yumSearchVersion: pkg " + str(item) + " matches: " + ver)
+-                else:
+-                    logging.debug("yumSearchVersion: pkg " + str(item) + " does not match: " + ver)
++    for pkg in yumListPackages(pkgName):
++        if rpmUtils.miscutils.compareVerOnly(pkg.ver, ver) >= 0:
++            return True
+     else:
+-        logging.debug("yumSearchVersion: package " + str(pkgName) + " not found!")
+-
+-    return fReturn
++        return False
+ 
+ #############################################################################################################
+ # Host PKI functions.
+-- 
+1.7.1
+
diff --git a/0004-Iterates-over-delete-candidates-networks-only-once.patch b/0004-Iterates-over-delete-candidates-networks-only-once.patch
new file mode 100644
index 0000000..3cb42b4
--- /dev/null
+++ b/0004-Iterates-over-delete-candidates-networks-only-once.patch
@@ -0,0 +1,77 @@
+From 165284de4e03fb72fb9e4ca811fbcc77618ff02d Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Mon, 4 Jun 2012 11:02:56 +0300
+Subject: [PATCH 04/17] Iterates over delete candidates networks only once
+
+Change-Id: Iec45c1cb3d76a70555e256f96c983e13a0518cbe
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5204
+Reviewed-by: Livnat Peer <lpeer at redhat.com>
+Reviewed-by: Shu Ming <shuming at linux.vnet.ibm.com>
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5546
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   26 ++++++++++++--------------
+ 1 files changed, 12 insertions(+), 14 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index b37ff0f..3f2e5fe 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -1010,26 +1010,23 @@ def setupNetworks(networks={}, bondings={}, **options):
+         networksAdded = []
+         #bondingNetworks = {}   # Reminder TODO
+ 
+-        logger.info("Setting up network")
+-        logger.debug("Setting up network according to configuration: networks:%r, bondings:%r, options:%r" % (networks, bondings, options))
++        logger.debug("Setting up network according to configuration: "
++                     "networks:%r, bondings:%r, options:%r" % (networks,
++                     bondings, options))
+ 
+         force = options.get('force', False)
+         if not utils.tobool(force):
+             logging.debug("Validating configuration")
+-            _validateNetworkSetup(dict(networks), dict(bondings), explicitBonding=options.get('explicitBonding', False))
++            _validateNetworkSetup(dict(networks), dict(bondings),
++                                  explicitBonding=options.get('explicitBonding',
++                                                              False))
+ 
+         logger.debug("Applying...")
+         try:
+-            delnetworks = {}
+-            for network, networkAttrs in networks.iteritems():
++            # Remove networks with 'remove' attribute
++            for network, networkAttrs in networks.items():
+                 if 'remove' in networkAttrs:
+-                    delnetworks[network] = networkAttrs
+-
+-            for network, networkAttrs in delnetworks.iteritems():
+-                if networkAttrs.pop('remove', False):
+-                    assert not networkAttrs
+-
+-                    logger.debug('Removing network %r'%network)
++                    logger.debug("Removing network %r" % network)
+                     delNetwork(network, configWriter=configWriter, force=force)
+                     del networks[network]
+ 
+@@ -1041,12 +1038,13 @@ def setupNetworks(networks={}, bondings={}, **options):
+                 d = dict(networkAttrs)
+                 if 'bonding' in d:
+                     d['nics'] = bondings[d['bonding']]['nics']
+-                    d['bondingOptions'] = bondings[d['bonding']].get('options', None)
++                    d['bondingOptions'] = bondings[d['bonding']].get('options',
++                                                                     None)
+                 else:
+                     d['nics'] = [d.pop('nic')]
+                 d['force'] = force
+ 
+-                logger.debug('Adding network %r'%network)
++                logger.debug("Adding network %r" % network)
+                 addNetwork(network, configWriter=configWriter, **d)
+ 
+             if utils.tobool(options.get('connectivityCheck', True)):
+-- 
+1.7.1
+
diff --git a/0005-options-translation-in-setupNetworks-is-not-relevant.patch b/0005-options-translation-in-setupNetworks-is-not-relevant.patch
new file mode 100644
index 0000000..a70cfca
--- /dev/null
+++ b/0005-options-translation-in-setupNetworks-is-not-relevant.patch
@@ -0,0 +1,33 @@
+From 752dd81155caf00895d14fadc4aa1cbbc3e88364 Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Mon, 4 Jun 2012 15:08:09 +0300
+Subject: [PATCH 05/17] 'options' translation in setupNetworks is not relevant
+
+Change-Id: I68871fe1a4112fd7223e794a1b67bf98e26c104c
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5205
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-by: Lei Li <lilei at linux.vnet.ibm.com>
+Tested-by: Lei Li <lilei at linux.vnet.ibm.com>
+Reviewed-by: Livnat Peer <lpeer at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5547
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/API.py |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+diff --git a/vdsm/API.py b/vdsm/API.py
+index c098b4b..70034aa 100644
+--- a/vdsm/API.py
++++ b/vdsm/API.py
+@@ -1145,7 +1145,6 @@ class Global(object):
+     def setupNetworks(self, networks={}, bondings={}, options={}):
+         """Add a new network to this vds, replacing an old one."""
+ 
+-        self._translateOptionsToNew(options)
+         if not self._cif._networkSemaphore.acquire(blocking=False):
+             self.log.warn('concurrent network verb already executing')
+             return errCode['unavail']
+-- 
+1.7.1
+
diff --git a/0006-Minor-optimization-for-delNetwork.patch b/0006-Minor-optimization-for-delNetwork.patch
new file mode 100644
index 0000000..d142f96
--- /dev/null
+++ b/0006-Minor-optimization-for-delNetwork.patch
@@ -0,0 +1,97 @@
+From 4accdc21e59f573ec0135ceb0faeda1b452acb22 Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Mon, 4 Jun 2012 20:23:28 +0300
+Subject: [PATCH 06/17] Minor optimization for delNetwork
+
+Change-Id: I66a37cb1100411af13197642bdb13ae745bc6e53
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5207
+Reviewed-by: Lei Li <lilei at linux.vnet.ibm.com>
+Tested-by: Lei Li <lilei at linux.vnet.ibm.com>
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5548
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   31 +++++++++++++++++++------------
+ 1 files changed, 19 insertions(+), 12 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 3f2e5fe..8d71375 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -736,22 +736,25 @@ def delNetwork(network, vlan=None, bonding=None, nics=None, force=False,
+ 
+     if not utils.tobool(options.get('skipLibvirt', False)):
+         if network not in _netinfo.networks:
+-            raise ConfigNetworkError(ne.ERR_BAD_BRIDGE, "Cannot delete network %r: It doesn't exist" % network)
++            raise ConfigNetworkError(ne.ERR_BAD_BRIDGE,
++                    "Cannot delete network %r: It doesn't exist" % network)
+ 
+         nics, vlan, bonding = _netinfo.getNicsVlanAndBondingForNetwork(network)
+         bridged = _netinfo.networks[network]['bridged']
+     else:
+         bridged = True
+ 
+-    logging.info("Removing network %s with vlan=%s, bonding=%s, nics=%s. options=%s"%(network, vlan, bonding, nics, options))
++    logging.info("Removing network %s with vlan=%s, bonding=%s, nics=%s,"
++                 "options=%s" % (network, vlan, bonding, nics, options))
+ 
+     if not utils.tobool(force):
+         if bonding:
+             validateBondingName(bonding)
+             if set(nics) != set(_netinfo.bondings[bonding]["slaves"]):
+-                raise ConfigNetworkError(ne.ERR_BAD_NIC, 'delNetwork: %s are not all nics enslaved to %s' % (nics, bonding))
++                raise ConfigNetworkError(ne.ERR_BAD_NIC,
++                        "delNetwork: %s are not all nics enslaved to %s" % \
++                        (nics, bonding))
+         if vlan:
+-            #assertVlan(vlan)
+             validateVlanId(vlan)
+         if bridged:
+             assertBridgeClean(network, vlan, bonding, nics)
+@@ -763,30 +766,34 @@ def delNetwork(network, vlan=None, bonding=None, nics=None, force=False,
+         configWriter.setNewMtu(network)
+ 
+     removeLibvirtNetwork(network, log=False)
+-    # the deleted bridge should never be up at this stage.
++    # We need to gather NetInfo again to refresh networks info from libvirt.
++    # The deleted bridge should never be up at this stage.
+     if network in NetInfo().networks:
+-        raise ConfigNetworkError(ne.ERR_USED_BRIDGE, 'delNetwork: bridge %s still exists' % network)
++        raise ConfigNetworkError(ne.ERR_USED_BRIDGE,
++                "delNetwork: bridge %s still exists" % network)
+ 
+     if network and bridged:
+         ifdown(network)
+         subprocess.call([constants.EXT_BRCTL, 'delbr', network])
+         configWriter.removeBridge(network)
++
+     if vlan:
+         vlandev = (bonding or nics[0]) + '.' + vlan
+         ifdown(vlandev)
+-        subprocess.call([constants.EXT_VCONFIG, 'rem', vlandev], stderr=subprocess.PIPE)
++        subprocess.call([constants.EXT_VCONFIG, 'rem', vlandev],
++                        stderr=subprocess.PIPE)
+         configWriter.removeVlan(vlan, bonding or nics[0])
++
+     if bonding:
+         if not bridged or not bondingOtherUsers(network, vlan, bonding):
+             ifdown(bonding)
+-        if not bridged or not bondingOtherUsers(network, vlan, bonding):
+             configWriter.removeBonding(bonding)
++
+     for nic in nics:
+-        if not bridged or not nicOtherUsers(network, vlan, bonding, nic):
++        nicUsers = nicOtherUsers(network, vlan, bonding, nic)
++        if not nicUsers:
+             ifdown(nic)
+-        if bridged and nicOtherUsers(network, vlan, bonding, nic):
+-            continue
+-        configWriter.removeNic(nic)
++            configWriter.removeNic(nic)
+ 
+ def clientSeen(timeout):
+     start = time.time()
+-- 
+1.7.1
+
diff --git a/0007-Don-t-ignore-bridgeless-networks-in-ifaceUsers.patch b/0007-Don-t-ignore-bridgeless-networks-in-ifaceUsers.patch
new file mode 100644
index 0000000..93fd5ae
--- /dev/null
+++ b/0007-Don-t-ignore-bridgeless-networks-in-ifaceUsers.patch
@@ -0,0 +1,38 @@
+From b66fdcfbfe9022aa6ec33df274a5a81a73d1af5f Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Mon, 4 Jun 2012 19:24:12 +0300
+Subject: [PATCH 07/17] Don't ignore bridgeless networks in ifaceUsers
+
+Change-Id: Id45b37683d52feebd1b31421c2a717695394147a
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5206
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5549
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |    8 +++++---
+ 1 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 8d71375..fc43d67 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -86,9 +86,11 @@ def ifaceUsers(iface):
+     "Returns a list of entities using the interface"
+     _netinfo = NetInfo()
+     users = set()
+-    for b, bdict in _netinfo.networks.iteritems():
+-        if bdict['bridged'] and iface in bdict['ports']:
+-            users.add(b)
++    for n, ndict in _netinfo.networks.iteritems():
++        if ndict['bridged'] and iface in ndict['ports']:
++            users.add(n)
++        elif not ndict['bridged'] and iface == ndict['interface']:
++            users.add(n)
+     for b, bdict in _netinfo.bondings.iteritems():
+         if iface in bdict['slaves']:
+             users.add(b)
+-- 
+1.7.1
+
diff --git a/0008-Minor-optimization-for-addNetwork.patch b/0008-Minor-optimization-for-addNetwork.patch
new file mode 100644
index 0000000..4d711f4
--- /dev/null
+++ b/0008-Minor-optimization-for-addNetwork.patch
@@ -0,0 +1,65 @@
+From 5bdaa7c0a1cc696ed4e1d492d9af576fd8c8e4eb Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Wed, 6 Jun 2012 09:25:03 +0300
+Subject: [PATCH 08/17] Minor optimization for addNetwork
+
+Change-Id: I5506140ccd065d76a77414593635598f26289829
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5208
+Reviewed-by: Lei Li <lilei at linux.vnet.ibm.com>
+Tested-by: Lei Li <lilei at linux.vnet.ibm.com>
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5550
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   21 ++++++++-------------
+ 1 files changed, 8 insertions(+), 13 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index fc43d67..89b3047 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -613,32 +613,27 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+                 ifdown(nic)
+ 
+     if bridged:
+-        configWriter.addBridge(network, ipaddr=ipaddr, netmask=netmask, mtu=mtu,
+-                gateway=gateway, **options)
++        configWriter.addBridge(network, ipaddr=ipaddr, netmask=netmask,
++                                mtu=mtu, gateway=gateway, **options)
+         ifdown(network)
+ 
+-    # since we have vlan device, it is connected to the bridge. other
+-    # interfaces should be connected to the bridge through vlan, and not directly.
+-    brName = network if bridged and not vlan else None
++    brName = network if bridged else None
+ 
+     # nics must be activated in the same order of boot time to expose the correct
+     # MAC address.
+     for nic in nicSort(nics):
+-        if not bonding and bridged:
+-            configWriter.addNic(nic, bridge=brName, mtu=max(prevmtu, mtu))
++        configWriter.addNic(nic, bonding=bonding, bridge=brName, mtu=max(prevmtu, mtu))
+         ifup(nic)
+     if bonding:
+         configWriter.addBonding(bonding, bridge=brName, bondingOptions=bondingOptions, mtu=mtu)
+-        for nic in nics:
+-            configWriter.addNic(nic, bonding=bonding, mtu=max(prevmtu, mtu))
+         ifup(bonding)
++
+     if vlan:
+         iface += '.' + vlan
+-        configWriter.addVlan(vlan, bonding or nics[0], network=network if bridged else None, mtu=mtu, bridged=bridged)
+-        # since we have vlan device, it is connected to the network. other
+-        # interfaces should be connected to the network through vlan, and not
+-        # directly.
++        configWriter.addVlan(vlan, bonding or nics[0], network=brName,
++                             mtu=mtu, bridged=bridged)
+         ifup((bonding or nics[0]) + '.' + vlan)
++
+     if bridged:
+         if options.get('bootproto') == 'dhcp' and not utils.tobool(options.get('blockingdhcp')):
+             # wait for dhcp in another thread, so vdsm won't get stuck (BZ#498940)
+-- 
+1.7.1
+
diff --git a/0009-Use-already-known-iface-in-addNetwork.patch b/0009-Use-already-known-iface-in-addNetwork.patch
new file mode 100644
index 0000000..09ea6db
--- /dev/null
+++ b/0009-Use-already-known-iface-in-addNetwork.patch
@@ -0,0 +1,37 @@
+From 16e43715e9731db46b4ea519eb4c0c1294bf18a4 Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Tue, 12 Jun 2012 15:38:27 +0300
+Subject: [PATCH 09/17] Use already known iface in addNetwork
+
+Change-Id: I085792401a04d7695855e81b16b442e4c31ab706
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5283
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5551
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 89b3047..87b32ed 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -629,10 +629,10 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+         ifup(bonding)
+ 
+     if vlan:
+-        iface += '.' + vlan
+-        configWriter.addVlan(vlan, bonding or nics[0], network=brName,
++        configWriter.addVlan(vlan, iface, network=brName,
+                              mtu=mtu, bridged=bridged)
+-        ifup((bonding or nics[0]) + '.' + vlan)
++        iface += '.' + vlan
++        ifup(iface)
+ 
+     if bridged:
+         if options.get('bootproto') == 'dhcp' and not utils.tobool(options.get('blockingdhcp')):
+-- 
+1.7.1
+
diff --git a/0010-Use-proper-MTU-on-bonding-when-add-network.patch b/0010-Use-proper-MTU-on-bonding-when-add-network.patch
new file mode 100644
index 0000000..7a24e2d
--- /dev/null
+++ b/0010-Use-proper-MTU-on-bonding-when-add-network.patch
@@ -0,0 +1,39 @@
+From 34a348e500b2c0f50f3de3095db8aa7d61f2953a Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Wed, 6 Jun 2012 14:16:37 +0300
+Subject: [PATCH 10/17] Use proper MTU on bonding when add network
+
+Change-Id: Id34f2462ddfc2c9f4a323235c79f919c0cce12a7
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5209
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5552
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 87b32ed..5353d0e 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -622,10 +622,13 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+     # nics must be activated in the same order of boot time to expose the correct
+     # MAC address.
+     for nic in nicSort(nics):
+-        configWriter.addNic(nic, bonding=bonding, bridge=brName, mtu=max(prevmtu, mtu))
++        configWriter.addNic(nic, bonding=bonding, bridge=brName,
++                             mtu=max(prevmtu, mtu))
+         ifup(nic)
+     if bonding:
+-        configWriter.addBonding(bonding, bridge=brName, bondingOptions=bondingOptions, mtu=mtu)
++        configWriter.addBonding(bonding, bridge=brName,
++                                 bondingOptions=bondingOptions,
++                                 mtu=max(prevmtu, mtu))
+         ifup(bonding)
+ 
+     if vlan:
+-- 
+1.7.1
+
diff --git a/0011-Add-bridge-on-top-of-VLAN-if-exists.patch b/0011-Add-bridge-on-top-of-VLAN-if-exists.patch
new file mode 100644
index 0000000..a566e93
--- /dev/null
+++ b/0011-Add-bridge-on-top-of-VLAN-if-exists.patch
@@ -0,0 +1,50 @@
+From 69af2fcbdedfe6eab77c4c748a911caa78366590 Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Tue, 12 Jun 2012 16:03:04 +0300
+Subject: [PATCH 11/17] Add bridge on top of VLAN if exists
+
+In VLAN case we should attach bridge only to the VLAN
+rather than to underlying NICs or bond
+
+Change-Id: I1c554853b5be9330933174da810b6d67c83eb96e
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5284
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5553
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   11 +++++++----
+ 1 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 5353d0e..97aec7c 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -617,16 +617,19 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+                                 mtu=mtu, gateway=gateway, **options)
+         ifdown(network)
+ 
++    # For VLAN we should attach bridge only to the VLAN device
++    # rather than to underlying NICs or bond
+     brName = network if bridged else None
++    bridgeForNic = None if vlan else brName
+ 
+-    # nics must be activated in the same order of boot time to expose the correct
+-    # MAC address.
++    # NICs must be activated in the same order of boot time
++    # to expose the correct MAC address.
+     for nic in nicSort(nics):
+-        configWriter.addNic(nic, bonding=bonding, bridge=brName,
++        configWriter.addNic(nic, bonding=bonding, bridge=bridgeForNic,
+                              mtu=max(prevmtu, mtu))
+         ifup(nic)
+     if bonding:
+-        configWriter.addBonding(bonding, bridge=brName,
++        configWriter.addBonding(bonding, bridge=bridgeForNic,
+                                  bondingOptions=bondingOptions,
+                                  mtu=max(prevmtu, mtu))
+         ifup(bonding)
+-- 
+1.7.1
+
diff --git a/0012-BZ-830485-Add-netConfigDirty-bit-to-getVdsCaps-repor.patch b/0012-BZ-830485-Add-netConfigDirty-bit-to-getVdsCaps-repor.patch
new file mode 100644
index 0000000..2f2ae71
--- /dev/null
+++ b/0012-BZ-830485-Add-netConfigDirty-bit-to-getVdsCaps-repor.patch
@@ -0,0 +1,30 @@
+From b5198d7ea6325374ad166043cf8597a148870a14 Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Mon, 11 Jun 2012 19:37:58 +0300
+Subject: [PATCH 12/17] BZ#830485 - Add netConfigDirty bit to getVdsCaps report
+
+Change-Id: Iba641a74d33157186ddc6ceb6196b531953c9c8b
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5257
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5554
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/API.py |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/vdsm/API.py b/vdsm/API.py
+index 70034aa..abb3510 100644
+--- a/vdsm/API.py
++++ b/vdsm/API.py
+@@ -1073,6 +1073,7 @@ class Global(object):
+         Report host capabilities.
+         """
+         c = caps.get()
++        c['netConfigDirty'] = str(self._cif._netConfigDirty)
+ 
+         return {'status': doneCode, 'info': c}
+ 
+-- 
+1.7.1
+
diff --git a/0013-remove-flag-skipLibvirt.patch b/0013-remove-flag-skipLibvirt.patch
new file mode 100644
index 0000000..5d9e8b7
--- /dev/null
+++ b/0013-remove-flag-skipLibvirt.patch
@@ -0,0 +1,132 @@
+From 325aa66a2c32a6889f199628f2aedfaba742cb00 Mon Sep 17 00:00:00 2001
+From: Douglas Schilling Landgraf <dougsland at redhat.com>
+Date: Wed, 13 Jun 2012 17:44:16 -0400
+Subject: [PATCH 13/17] remove flag skipLibvirt
+
+Currently, VDSM manage networks by it's own and uses libvirt to store the net definitions, not requiring any additional
+flag as skipLibvirt. This patch will remove completely skipLibvirt flag.
+
+Change-Id: Id87c89f04912976797d629344238749a8562382b
+Signed-off-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5262
+Reviewed-by: Shu Ming <shuming at linux.vnet.ibm.com>
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5555
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py     |   29 ++++++++++-------------------
+ vdsm_reg/deployUtil.py.in |    5 ++---
+ 2 files changed, 12 insertions(+), 22 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 97aec7c..effb279 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -238,8 +238,7 @@ class ConfigWriter(object):
+         s += 'NM_CONTROLLED=no\n'
+         BLACKLIST = ['TYPE', 'NAME', 'DEVICE', 'bondingOptions',
+                      'force', 'blockingdhcp',
+-                     'connectivityCheck', 'connectivityTimeout',
+-                     'skipLibvirt']
++                     'connectivityCheck', 'connectivityTimeout']
+         for k in set(kwargs.keys()).difference(set(BLACKLIST)):
+             if re.match('^[a-zA-Z_]\w*$', k):
+                 s += '%s=%s\n' % (k.upper(), pipes.quote(kwargs[k]))
+@@ -493,7 +492,7 @@ def validateVlanId(vlan):
+ 
+ 
+ def _addNetworkValidation(_netinfo, bridge, vlan, bonding, nics, ipaddr, netmask, gateway,
+-        bondingOptions, bridged=True, skipLibvirt=False):
++        bondingOptions, bridged=True):
+     if (vlan or bonding) and not nics:
+         raise ConfigNetworkError(ne.ERR_BAD_PARAMS, 'vlan/bonding definition requires nics. got: %r'%(nics,))
+ 
+@@ -502,12 +501,9 @@ def _addNetworkValidation(_netinfo, bridge, vlan, bonding, nics, ipaddr, netmask
+         validateBridgeName(bridge)
+         if bridge in _netinfo.networks:
+             raise ConfigNetworkError(ne.ERR_USED_BRIDGE, 'Bridge already exists')
+-    elif not skipLibvirt:
++
+         if bridge in _netinfo.getBridgelessNetworks():
+             raise ConfigNetworkError(ne.ERR_USED_BRIDGE, 'network already exists')
+-    else:
+-        raise ConfigNetworkError(ne.ERR_BAD_PARAMS,
+-                'bridgeless network can not be added when skip libvirt')
+ 
+     # vlan
+     if vlan:
+@@ -576,7 +572,6 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+                gateway=None, force=False, configWriter=None, bondingOptions=None, bridged=True, **options):
+     nics = nics or ()
+     _netinfo = NetInfo()
+-    skipLibvirt = utils.tobool(options.get('skipLibvirt', False))
+     bridged = utils.tobool(bridged)
+ 
+     if mtu:
+@@ -588,7 +583,7 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+         _addNetworkValidation(_netinfo, bridge=network if bridged else None,
+                 vlan=vlan, bonding=bonding, nics=nics, ipaddr=ipaddr,
+                 netmask=netmask, gateway=gateway, bondingOptions=bondingOptions,
+-                bridged=bridged, skipLibvirt=skipLibvirt)
++                bridged=bridged)
+ 
+     logging.info("Adding network %s with vlan=%s, bonding=%s, nics=%s,"
+                  " bondingOptions=%s, mtu=%s, bridged=%s, options=%s",
+@@ -650,8 +645,7 @@ def addNetwork(network, vlan=None, bonding=None, nics=None, ipaddr=None, netmask
+             ifup(network)
+ 
+     # add libvirt network
+-    if not skipLibvirt:
+-        createLibvirtNetwork(network, bridged, iface)
++    createLibvirtNetwork(network, bridged, iface)
+ 
+ def createLibvirtNetwork(network, bridged=True, iface=None):
+     conn = libvirtconnection.get()
+@@ -737,15 +731,12 @@ def delNetwork(network, vlan=None, bonding=None, nics=None, force=False,
+ 
+     validateBridgeName(network)
+ 
+-    if not utils.tobool(options.get('skipLibvirt', False)):
+-        if network not in _netinfo.networks:
+-            raise ConfigNetworkError(ne.ERR_BAD_BRIDGE,
+-                    "Cannot delete network %r: It doesn't exist" % network)
++    if network not in _netinfo.networks:
++        raise ConfigNetworkError(ne.ERR_BAD_BRIDGE,
++                "Cannot delete network %r: It doesn't exist" % network)
+ 
+-        nics, vlan, bonding = _netinfo.getNicsVlanAndBondingForNetwork(network)
+-        bridged = _netinfo.networks[network]['bridged']
+-    else:
+-        bridged = True
++    nics, vlan, bonding = _netinfo.getNicsVlanAndBondingForNetwork(network)
++    bridged = _netinfo.networks[network]['bridged']
+ 
+     logging.info("Removing network %s with vlan=%s, bonding=%s, nics=%s,"
+                  "options=%s" % (network, vlan, bonding, nics, options))
+diff --git a/vdsm_reg/deployUtil.py.in b/vdsm_reg/deployUtil.py.in
+index 1474196..2f240cc 100644
+--- a/vdsm_reg/deployUtil.py.in
++++ b/vdsm_reg/deployUtil.py.in
+@@ -894,7 +894,7 @@ def makeBridge(vdcName, vdsmDir):
+     #Delete existing bridge in oVirt
+     if fReturn and fIsOvirt:
+         try:
+-            out, err, ret = _logExec([os.path.join(vdsmDir, SCRIPT_NAME_DEL), mgtBridge, vlan, bonding, nic] + ['skipLibvirt=True'])
++            out, err, ret = _logExec([os.path.join(vdsmDir, SCRIPT_NAME_DEL), mgtBridge, vlan, bonding, nic])
+             if ret:
+                 if ret == 17: #ERR_BAD_BRIDGE
+                     logging.debug("makeBridge Ignoring error of del existing bridge. out=" + out + "\nerr=" + str(err) + "\nret=" + str(ret))
+@@ -909,8 +909,7 @@ def makeBridge(vdcName, vdsmDir):
+     if fReturn:
+         try:
+             lstBridgeOptions.append('blockingdhcp=true')
+-            out, err, ret = _logExec([os.path.join(vdsmDir, SCRIPT_NAME_ADD) , MGT_BRIDGE_NAME, vlan, bonding, nic] + lstBridgeOptions
+-                    + ['skipLibvirt=True'])
++            out, err, ret = _logExec([os.path.join(vdsmDir, SCRIPT_NAME_ADD) , MGT_BRIDGE_NAME, vlan, bonding, nic] + lstBridgeOptions)
+             if ret:
+                 fReturn = False
+                 logging.debug("makeBridge Failed to add " + MGT_BRIDGE_NAME + " bridge out=" + out + "\nerr=" + str(err) + "\nret=" + str(ret))
+-- 
+1.7.1
+
diff --git a/0014-BZ-826873-Allow-to-change-bond-without-network-attac.patch b/0014-BZ-826873-Allow-to-change-bond-without-network-attac.patch
new file mode 100644
index 0000000..b091f0a
--- /dev/null
+++ b/0014-BZ-826873-Allow-to-change-bond-without-network-attac.patch
@@ -0,0 +1,140 @@
+From ca7a6b1244f7a400bf5dc51a5d59662e5602534b Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Wed, 13 Jun 2012 12:18:02 +0300
+Subject: [PATCH 14/17] BZ#826873 - Allow to change bond without network attached to it
+
+Change-Id: I3770017d8e633ccf5f9cf9b41a93df57229c443e
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5312
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5556
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   64 ++++++++++++++++++++++++++++++++++++++++++++++++-
+ vdsm/netinfo.py       |    4 +++
+ 2 files changed, 67 insertions(+), 1 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index effb279..fce3e71 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -958,6 +958,52 @@ def _validateNetworkSetup(networks={}, bondings={}, explicitBonding=False):
+                             "Setup attached more than one network to bonding %s, some of which aren't vlans"%(bonding))
+ 
+ 
++def _editBondings(bondings, configWriter):
++    """ Add/Edit bond interface """
++    logger = logging.getLogger("_editBondings")
++
++    _netinfo = NetInfo()
++
++    for bond, bondAttrs in bondings.iteritems():
++        logger.debug("Creating/Editing bond %s with attributes %s",
++                        bond, bondAttrs)
++        if bond in _netinfo.bondings:
++            ifdown(bond)
++            # Take down all bond's NICs.
++            for nic in _netinfo.getNicsForBonding(bond):
++                ifdown(nic)
++                configWriter.removeNic(nic)
++
++        # NICs must be activated in the same order of boot time
++        # to expose the correct MAC address.
++        for nic in nicSort(bondAttrs['nics']):
++            configWriter.addNic(nic, bonding=bond)
++            ifup(nic)
++
++        configWriter.addBonding(bond,
++                                bondingOptions=bondAttrs.get('options', None))
++        ifup(bond)
++
++def _removeBondings(bondings, configWriter):
++    """ Add/Edit bond interface """
++    logger = logging.getLogger("_removeBondings")
++
++    _netinfo = NetInfo()
++
++    for bond, bondAttrs in bondings.items():
++        if 'remove' in bondAttrs:
++            nics = _netinfo.getNicsForBonding(bond)
++            logger.debug("Removing bond %r with nics = %s", bond, nics)
++            ifdown(bond)
++            configWriter.removeBonding(bond)
++
++            for nic in nics:
++                ifdown(nic)
++                configWriter.removeNic(nic)
++
++            del bondings[bond]
++
++
+ def setupNetworks(networks={}, bondings={}, **options):
+     """Add/Edit/Remove configuration for networks and bondings.
+ 
+@@ -1009,7 +1055,6 @@ def setupNetworks(networks={}, bondings={}, **options):
+         _netinfo = NetInfo()
+         configWriter = ConfigWriter()
+         networksAdded = []
+-        #bondingNetworks = {}   # Reminder TODO
+ 
+         logger.debug("Setting up network according to configuration: "
+                      "networks:%r, bondings:%r, options:%r" % (networks,
+@@ -1031,16 +1076,21 @@ def setupNetworks(networks={}, bondings={}, **options):
+                     delNetwork(network, configWriter=configWriter, force=force)
+                     del networks[network]
+ 
++            handledBonds = set()
+             for network, networkAttrs in networks.items():
+                 if network in _netinfo.networks:
+                     delNetwork(network, configWriter=configWriter, force=force)
+                 else:
+                     networksAdded.append(network)
++
+                 d = dict(networkAttrs)
+                 if 'bonding' in d:
+                     d['nics'] = bondings[d['bonding']]['nics']
+                     d['bondingOptions'] = bondings[d['bonding']].get('options',
+                                                                      None)
++                    # Don't remove bondX from the bonding list here,
++                    # because it may be in use for other networks
++                    handledBonds.add(d['bonding'])
+                 else:
+                     d['nics'] = [d.pop('nic')]
+                 d['force'] = force
+@@ -1048,6 +1098,18 @@ def setupNetworks(networks={}, bondings={}, **options):
+                 logger.debug("Adding network %r" % network)
+                 addNetwork(network, configWriter=configWriter, **d)
+ 
++            # Do not handle a bonding device twice.
++            # We already handled it before during addNetwork.
++            for bond in handledBonds:
++                del bondings[bond]
++
++            # We are now left with bondings whose network was not mentioned
++            # Remove bonds with 'remove' attribute
++            _removeBondings(bondings, configWriter)
++
++            # Check whether bonds should be resized
++            _editBondings(bondings, configWriter)
++
+             if utils.tobool(options.get('connectivityCheck', True)):
+                 logger.debug('Checking connectivity...')
+                 if not clientSeen(int(options.get('connectivityTimeout',
+diff --git a/vdsm/netinfo.py b/vdsm/netinfo.py
+index 05f8323..536b4c7 100644
+--- a/vdsm/netinfo.py
++++ b/vdsm/netinfo.py
+@@ -339,6 +339,10 @@ class NetInfo(object):
+             if nic in bdict['slaves']:
+                 yield b
+ 
++    def getNicsForBonding(self, bond):
++        bondAttrs = self.bondings[bond]
++        return bondAttrs['slaves']
++
+     def getBondingForNic(self, nic):
+         bondings = list(self.getBondingsForNic(nic))
+         if bondings:
+-- 
+1.7.1
+
diff --git a/0015-BZ-830486-Allow-to-change-network-according-the-diff.patch b/0015-BZ-830486-Allow-to-change-network-according-the-diff.patch
new file mode 100644
index 0000000..3fed28a
--- /dev/null
+++ b/0015-BZ-830486-Allow-to-change-network-according-the-diff.patch
@@ -0,0 +1,47 @@
+From d3c91bc345f27a78d17c836f04fe13f5d1be6856 Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Sun, 10 Jun 2012 10:40:48 +0300
+Subject: [PATCH 15/17] BZ#830486 - Allow to change network according the diffs from previous state
+
+We may not receive any information about the bonding device if it is unchanged.
+In this case vdsm shouldn't check the bond information of this network.
+
+Change-Id: I1ece66a351576d5789a8968ccda9e67f423b860c
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5211
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5557
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   15 +++++++++------
+ 1 files changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index fce3e71..ab07da6 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -1085,12 +1085,15 @@ def setupNetworks(networks={}, bondings={}, **options):
+ 
+                 d = dict(networkAttrs)
+                 if 'bonding' in d:
+-                    d['nics'] = bondings[d['bonding']]['nics']
+-                    d['bondingOptions'] = bondings[d['bonding']].get('options',
+-                                                                     None)
+-                    # Don't remove bondX from the bonding list here,
+-                    # because it may be in use for other networks
+-                    handledBonds.add(d['bonding'])
++                    # we may not receive any information
++                    # about the bonding device if it is unchanged
++                    if bondings:
++                        d['nics'] = bondings[d['bonding']]['nics']
++                        d['bondingOptions'] = bondings[d['bonding']].get('options',
++                                                                         None)
++                        # Don't remove bondX from the bonding list here,
++                        # because it may be in use for other networks
++                        handledBonds.add(d['bonding'])
+                 else:
+                     d['nics'] = [d.pop('nic')]
+                 d['force'] = force
+-- 
+1.7.1
+
diff --git a/0016-BZ-826467-Allow-to-remove-bond-and-attach-network-to.patch b/0016-BZ-826467-Allow-to-remove-bond-and-attach-network-to.patch
new file mode 100644
index 0000000..8ca276b
--- /dev/null
+++ b/0016-BZ-826467-Allow-to-remove-bond-and-attach-network-to.patch
@@ -0,0 +1,49 @@
+From 990be7c6e07646fb176d90f679baa691b28d279f Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Wed, 13 Jun 2012 16:10:58 +0300
+Subject: [PATCH 16/17] BZ#826467 - Allow to remove bond and attach network to NIC
+
+Change-Id: I0be3dafe6a0a65a09bf268c8c8c6ee6fd7ba1084
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5323
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5558
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |   14 ++++++--------
+ 1 files changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index ab07da6..0df6c8f 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -1069,20 +1069,18 @@ def setupNetworks(networks={}, bondings={}, **options):
+ 
+         logger.debug("Applying...")
+         try:
+-            # Remove networks with 'remove' attribute
+-            for network, networkAttrs in networks.items():
+-                if 'remove' in networkAttrs:
+-                    logger.debug("Removing network %r" % network)
+-                    delNetwork(network, configWriter=configWriter, force=force)
+-                    del networks[network]
+-
+-            handledBonds = set()
++            # Remove edited networks and networks with 'remove' attribute
+             for network, networkAttrs in networks.items():
+                 if network in _netinfo.networks:
++                    logger.debug("Removing network %r" % network)
+                     delNetwork(network, configWriter=configWriter, force=force)
++                    if 'remove' in networkAttrs:
++                        del networks[network]
+                 else:
+                     networksAdded.append(network)
+ 
++            handledBonds = set()
++            for network, networkAttrs in networks.iteritems():
+                 d = dict(networkAttrs)
+                 if 'bonding' in d:
+                     # we may not receive any information
+-- 
+1.7.1
+
diff --git a/0017-Related-to-BZ-826873-Allow-to-create-bond-without-ne.patch b/0017-Related-to-BZ-826873-Allow-to-create-bond-without-ne.patch
new file mode 100644
index 0000000..454538b
--- /dev/null
+++ b/0017-Related-to-BZ-826873-Allow-to-create-bond-without-ne.patch
@@ -0,0 +1,31 @@
+From 0329fec019726434a3313cc2acbd5f23480f365b Mon Sep 17 00:00:00 2001
+From: Igor Lvovsky <ilvovsky at redhat.com>
+Date: Tue, 19 Jun 2012 17:32:55 +0300
+Subject: [PATCH 17/17] Related to BZ#826873 - Allow to create bond without network
+
+Change-Id: Ic4bfababbc9b81d921b2e26be9e70d07aee7124e
+Signed-off-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5487
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5559
+Tested-by: Federico Simoncelli <fsimonce at redhat.com>
+---
+ vdsm/configNetwork.py |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 0df6c8f..8b831d6 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -950,7 +950,7 @@ def _validateNetworkSetup(networks={}, bondings={}, explicitBonding=False):
+                             "Setup attached more than one network to nic %s, some of which aren't vlans"%(nic))
+ 
+     for bonding, bondingAttrs in bondings.iteritems():
+-        networks = bondingAttrs['_networks']
++        networks = bondingAttrs.get('_networks', {})
+         if len(networks) > 1:
+             for network, networkAttrs in networks.iteritems():
+                 if not networkAttrs.get('vlan', None):
+-- 
+1.7.1
+
diff --git a/0018-BZ-832577-node-can-t-be-approved.patch b/0018-BZ-832577-node-can-t-be-approved.patch
new file mode 100644
index 0000000..1702ee5
--- /dev/null
+++ b/0018-BZ-832577-node-can-t-be-approved.patch
@@ -0,0 +1,38 @@
+From 013b2208f20d1b7ce0b894fc54a41980c0afc62f Mon Sep 17 00:00:00 2001
+From: Douglas Schilling Landgraf <dougsland at redhat.com>
+Date: Wed, 20 Jun 2012 15:48:03 -0400
+Subject: [PATCH 18/19] BZ#832577: node can't be approved
+
+Because of ovirt-node's readonly filesystem, directory creation at runtime has to be handled carefully.
+/rhev/data-center used to be created by the vdsm rpm when it is installed.
+It's now listed in vdsm.spec as %ghost which means it is *not* laid down by default.
+At runtime, it fails to be created because of the read-only filesystem.
+
+Regression introduced by commit ee1e68d3416d8fd728df75c0a41dd3db48f9138d
+Patch provided by: Mike Burns <mburns at redhat.com>
+
+Change-Id: I3818661c886118d34620e5308434e57bad92913f
+Signed-off-by: Douglas Schilling Landgraf <dougsland at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5567
+Reviewed-by: Dan Kenigsberg <danken at redhat.com>
+Tested-by: Dan Kenigsberg <danken at redhat.com>
+---
+ vdsm.spec.in |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/vdsm.spec.in b/vdsm.spec.in
+index c567e65..3fd404e 100644
+--- a/vdsm.spec.in
++++ b/vdsm.spec.in
+@@ -500,7 +500,7 @@ exit 0
+ /lib/systemd/systemd-vdsmd
+ %{_unitdir}/vdsmd.service
+ %endif
+-%ghost %dir %attr(-, %{vdsm_user}, %{vdsm_group}) @vdsmrepo@
++%dir %attr(-, %{vdsm_user}, %{vdsm_group}) @vdsmrepo@
+ %ghost %dir %attr(-, %{vdsm_user}, %{vdsm_group}) @vdsmrepo@/hsm-tasks
+ %ghost %dir %attr(-, %{vdsm_user}, %{vdsm_group}) @vdsmrepo@/mnt
+ %dir %{_libexecdir}/%{vdsm_name}
+-- 
+1.7.10.2
+
diff --git a/0019-BZ-824298-fix-typo-in-keyword-argument-exc_info.patch b/0019-BZ-824298-fix-typo-in-keyword-argument-exc_info.patch
new file mode 100644
index 0000000..60aa0ea
--- /dev/null
+++ b/0019-BZ-824298-fix-typo-in-keyword-argument-exc_info.patch
@@ -0,0 +1,57 @@
+From 5982cb826a56ee322c7e5d6fbee479ff5b996561 Mon Sep 17 00:00:00 2001
+From: Dan Kenigsberg <danken at redhat.com>
+Date: Sat, 23 Jun 2012 18:46:51 +0300
+Subject: [PATCH 19/19] BZ#824298 fix typo in keyword argument exc_info
+
+Change-Id: Iff2ba114298bc1223ae4969f5da0eb5a5ce8672e
+Signed-off-by: Dan Kenigsberg <danken at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5617
+Reviewed-by: Igor Lvovsky <ilvovsky at redhat.com>
+Reviewed-on: http://gerrit.ovirt.org/5628
+---
+ vdsm/configNetwork.py |    4 ++--
+ vdsm/storage/image.py |    4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/vdsm/configNetwork.py b/vdsm/configNetwork.py
+index 8b831d6..c535499 100755
+--- a/vdsm/configNetwork.py
++++ b/vdsm/configNetwork.py
+@@ -1,4 +1,4 @@
+-# Copyright 2011 Red Hat, Inc.
++# Copyright 2011-2012 Red Hat, Inc.
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+@@ -673,7 +673,7 @@ def removeLibvirtNetwork(network, log=True):
+     except libvirt.libvirtError:
+         if log:
+             logging.debug('failed to remove libvirt network %s', netName,
+-                          exec_info=True)
++                          exc_info=True)
+ 
+ def assertBridgeClean(bridge, vlan, bonding, nics):
+     brifs = os.listdir('/sys/class/net/%s/brif/' % bridge)
+diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
+index 03c94dc..a868568 100644
+--- a/vdsm/storage/image.py
++++ b/vdsm/storage/image.py
+@@ -1,5 +1,5 @@
+ #
+-# Copyright 2009-2011 Red Hat, Inc.
++# Copyright 2009-2012 Red Hat, Inc.
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+@@ -676,7 +676,7 @@ class Image:
+                 raise
+             except Exception, e:
+                 self.__cleanupMultimove(sdUUID=dstSdUUID, imgList=cleanup_candidates, postZero=postZero)
+-                self.log.error(e, exec_info=True)
++                self.log.error(e, exc_info=True)
+                 raise se.CopyImageError("image=%s, src domain=%s, dst domain=%s: msg %s" % (imgUUID, srcSdUUID, dstSdUUID, str(e)))
+ 
+             cleanup_candidates.append(imgUUID)
+-- 
+1.7.10.2
+
diff --git a/sources b/sources
index 45fc83a..87c07ec 100644
--- a/sources
+++ b/sources
@@ -1,18 +1 @@
 e8ab5eccdea0b4a4da2e812174971393  vdsm-4.10.0.tar.gz
-271a4bf061238b0485f588e5da989c6a  0001-deployUtil.yumFind-rename-and-simplify-semantics.patch
-1f82b6892731e7be936db6ec695caeef  0002-drop-deployUtil.yumSearch.patch
-6e51c8e0bd728f180bccf78ad7e4b761  0003-deployUtil.yumSearchVersion-compare-versions-sanely.patch
-3eb5b34836f09e3bea17605665ddd238  0004-Iterates-over-delete-candidates-networks-only-once.patch
-a34b83250137d392cc88f3cf8bb044ec  0005-options-translation-in-setupNetworks-is-not-relevant.patch
-ae0b01009e5cd7bc0bbf168e61948406  0006-Minor-optimization-for-delNetwork.patch
-e3d365f2fdae5b48e0bbb7bc9d4792b7  0007-Don-t-ignore-bridgeless-networks-in-ifaceUsers.patch
-7f7465f7dcd480890195e7dc550e7901  0008-Minor-optimization-for-addNetwork.patch
-8f0c154cbaef660dad9c55a1cffa03b9  0009-Use-already-known-iface-in-addNetwork.patch
-a02ec209a8763ca8f862f8787786b822  0010-Use-proper-MTU-on-bonding-when-add-network.patch
-443f8204853b13663b96adfe8970046c  0011-Add-bridge-on-top-of-VLAN-if-exists.patch
-71deacdfda0e338e043614274c5f55e4  0012-BZ-830485-Add-netConfigDirty-bit-to-getVdsCaps-repor.patch
-36d6ef004846bab4730dfd34a0d50de2  0013-remove-flag-skipLibvirt.patch
-3a06c6d62ca1f5bc142c8241e2aa3eb3  0014-BZ-826873-Allow-to-change-bond-without-network-attac.patch
-1926fd68e471424d3130a894c6bea6f1  0015-BZ-830486-Allow-to-change-network-according-the-diff.patch
-87f4dc171371ee591c45838479661355  0016-BZ-826467-Allow-to-remove-bond-and-attach-network-to.patch
-5221fe91ae85f29d763746b36126393b  0017-Related-to-BZ-826873-Allow-to-create-bond-without-ne.patch
diff --git a/vdsm.spec b/vdsm.spec
index 0f928ac..27e77b1 100644
--- a/vdsm.spec
+++ b/vdsm.spec
@@ -20,7 +20,7 @@
 
 Name:           %{vdsm_name}
 Version:        4.10.0
-Release:        2%{?vdsm_relvtag}%{?dist}%{?extra_release}
+Release:        3%{?vdsm_relvtag}%{?dist}%{?extra_release}
 Summary:        Virtual Desktop Server Manager
 
 Group:          Applications/System
@@ -52,6 +52,8 @@ Patch13: 0014-BZ-826873-Allow-to-change-bond-without-network-attac.patch
 Patch14: 0015-BZ-830486-Allow-to-change-network-according-the-diff.patch
 Patch15: 0016-BZ-826467-Allow-to-remove-bond-and-attach-network-to.patch
 Patch16: 0017-Related-to-BZ-826873-Allow-to-create-bond-without-ne.patch
+Patch17: 0018-BZ-832577-node-can-t-be-approved.patch
+Patch18: 0019-BZ-824298-fix-typo-in-keyword-argument-exc_info.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -360,6 +362,8 @@ Gluster plugin enables VDSM to serve Gluster functionalities.
 %patch14 -p1 -b .patch14
 %patch15 -p1 -b .patch15
 %patch16 -p1 -b .patch16
+%patch17 -p1 -b .patch17
+%patch18 -p1 -b .patch18
 
 %build
 %configure %{?with_hooks:--enable-hooks}
@@ -550,7 +554,7 @@ exit 0
 /lib/systemd/systemd-vdsmd
 %{_unitdir}/vdsmd.service
 %endif
-%ghost %dir %attr(-, %{vdsm_user}, %{vdsm_group}) /rhev/data-center
+%dir %attr(-, %{vdsm_user}, %{vdsm_group}) /rhev/data-center
 %ghost %dir %attr(-, %{vdsm_user}, %{vdsm_group}) /rhev/data-center/hsm-tasks
 %ghost %dir %attr(-, %{vdsm_user}, %{vdsm_group}) /rhev/data-center/mnt
 %dir %{_libexecdir}/%{vdsm_name}
@@ -901,6 +905,10 @@ exit 0
 %{_datadir}/%{vdsm_name}/gluster/hostname.py*
 
 %changelog
+* Tue Jun 26 2012 Federico Simoncelli <fsimonce at redhat.com> 4.10.0-3.fc17
+- BZ#832577: node can't be approved
+- BZ#824298 fix typo in keyword argument exc_info
+
 * Wed Jun 20 2012 Federico Simoncelli <fsimonce at redhat.com> 4.10.0-2.fc17
 - deployUtil.yumFind: rename and simplify semantics
 - drop deployUtil.yumSearch


More information about the scm-commits mailing list