Change in vdsm[master]: Handle bridge reconfiguration

ibarkan at redhat.com ibarkan at redhat.com
Mon Jan 19 13:57:30 UTC 2015


Ido Barkan has uploaded a new change for review.

Change subject: Handle bridge reconfiguration
......................................................................

Handle bridge reconfiguration

This fixing a regression  that was introduced in
3951f078d840f6c99d3e72b8ef95a94c6fad4094. When a bridged is reconfigured, for
example, changing it's IP or it's bootproto, vdsm would change nothing,
since it tried to leave the bridge intact. Comparing the required configuration
(setupNetworks arguments) to the running configuration solves this.

Change-Id: Ia461004eb59d10283ac893dc8b5858388d5c4a8c
Signed-off-by: Ido Barkan <ibarkan at redhat.com>
---
M tests/functional/networkTests.py
M vdsm/network/api.py
2 files changed, 77 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/59/37059/1

diff --git a/tests/functional/networkTests.py b/tests/functional/networkTests.py
index 9b15fcc..8212dbc 100644
--- a/tests/functional/networkTests.py
+++ b/tests/functional/networkTests.py
@@ -1783,6 +1783,69 @@
                     dhcp.delete_dhclient_leases(
                         NETWORK_NAME if bridged else right, dhcpv4)
 
+    @cleanupNet
+    @RequireVethMod
+    def testSetupNetworksReconfigureBridge(self):
+        el6 = _system_is_el6()
+
+        with vethIf() as (left, right):
+            veth.setIP(left, IP_ADDRESS, IP_CIDR)
+            veth.setLinkUp(left)
+            with dnsmasqDhcp(left, el6):
+                try:
+                    # initially set a network with dhcp
+                    status, msg = self.vdsm_net.setupNetworks(
+                        {NETWORK_NAME: {'nic': right, 'bridged': True,
+                                        'bootproto': 'dhcp',
+                                        'blockingdhcp': True}},
+                        {}, NOCHK)
+                    self.assertEqual(status, SUCCESS, msg)
+                    self.assertNetworkExists(NETWORK_NAME)
+
+                    test_net = self.vdsm_net.netinfo.networks[NETWORK_NAME]
+                    self.assertEqual(test_net['dhcpv4'], True)
+
+                    self.assertEqual(test_net['cfg']['BOOTPROTO'], 'dhcp')
+
+                    devs = self.vdsm_net.netinfo.bridges
+                    self.assertIn(NETWORK_NAME, devs)
+                    self.assertEqual(
+                        devs[NETWORK_NAME]['cfg']['BOOTPROTO'], 'dhcp')
+                    self.assertEqual(devs[NETWORK_NAME]['dhcpv4'], True)
+
+                    # change the network with to static ip configuration
+                    status, msg = self.vdsm_net.setupNetworks(
+                        {NETWORK_NAME: {'nic': right, 'bridged': True,
+                                        'ipaddr': IP_ADDRESS_IN_NETWORK,
+                                        'netmask': prefix2netmask(int(IP_CIDR)),
+                                        'gateway': IP_GATEWAY}},
+                        {}, NOCHK)
+                    self.assertEqual(status, SUCCESS, msg)
+                    self.assertNetworkExists(NETWORK_NAME)
+
+                    dhcp.delete_dhclient_leases(NETWORK_NAME, dhcpv4=True)
+                    self.vdsm_net.refreshNetinfo()
+                    test_net = self.vdsm_net.netinfo.networks[NETWORK_NAME]
+                    self.assertEqual(test_net['dhcpv4'], False)
+
+                    self.assertEqual(test_net['cfg']['BOOTPROTO'], 'none')
+                    self.assertEqual(test_net['addr'], IP_ADDRESS_IN_NETWORK)
+
+                    devs = self.vdsm_net.netinfo.bridges
+                    self.assertIn(NETWORK_NAME, devs)
+                    self.assertEqual(
+                        devs[NETWORK_NAME]['cfg']['BOOTPROTO'], 'none')
+                    self.assertEqual(devs[NETWORK_NAME]['dhcpv4'], False)
+
+                    status, msg = self.vdsm_net.setupNetworks(
+                        {NETWORK_NAME: {'remove': True}}, {},
+                        NOCHK)
+                    self.assertEqual(status, SUCCESS, msg)
+                    self.assertNetworkDoesntExist(NETWORK_NAME)
+
+                finally:
+                    dhcp.delete_dhclient_leases(NETWORK_NAME, dhcpv4=False)
+
     @permutations([[(4, 'default')], [(4, 'local')], [(6, 'not applicable')]])
     @cleanupNet
     @RequireVethMod
diff --git a/vdsm/network/api.py b/vdsm/network/api.py
index 3eafde0..2c62997 100755
--- a/vdsm/network/api.py
+++ b/vdsm/network/api.py
@@ -705,11 +705,19 @@
     return bondings, networks, options
 
 
-def _should_keep_bridge(marked_for_removal, currently_bridged,
-                        should_be_bridged):
+def _should_keep_bridge(network_attrs, currently_bridged,
+                        current_network_config):
+    marked_for_removal = 'remove' in network_attrs
     if marked_for_removal:
         return False
+
+    should_be_bridged = network_attrs.get('bridged')
     if currently_bridged and not should_be_bridged:
+        return False
+
+    if currently_bridged and current_network_config != network_attrs:
+        # the bridge is being reconfigured
+        logging.debug("the bridge is being reconfigured")
         return False
 
     return True
@@ -781,9 +789,11 @@
             if network in _netinfo.networks:
                 logger.debug("Removing network %r", network)
                 keep_bridge = _should_keep_bridge(
-                    marked_for_removal='remove' in attrs,
+                    network_attrs=attrs,
                     currently_bridged=_netinfo.networks[network]['bridged'],
-                    should_be_bridged=attrs.get('bridged'))
+                    current_network_config=
+                    configurator.runningConfig.networks.get(network)
+                )
 
                 _delNetwork(network, configurator=configurator, force=force,
                             implicitBonding=False, _netinfo=_netinfo,


-- 
To view, visit http://gerrit.ovirt.org/37059
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia461004eb59d10283ac893dc8b5858388d5c4a8c
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ido Barkan <ibarkan at redhat.com>


More information about the vdsm-patches mailing list