From e29a80022c305fa5050e83fe7a420d5a57f7a9b4 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Thu, 8 May 2014 14:03:55 -0700 Subject: [PATCH] Determine shared ip from table instead of flag Partially-implements blueprint better-support-for-multiple-networks Change-Id: Id7c6620704fef504d23cb42c5218251fa9e2dba7 --- nova/network/linux_net.py | 4 ++-- nova/network/manager.py | 10 +++++++--- nova/objects/network.py | 7 ++++--- nova/tests/network/test_linux_net.py | 8 ++++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index 024525ceb0ba..9664378347dd 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -1427,7 +1427,7 @@ class LinuxBridgeInterfaceDriver(LinuxNetInterfaceDriver): iface, network, gateway) - if CONF.share_dhcp_address: + if network['share_address'] or CONF.share_dhcp_address: isolate_dhcp_address(iface, network['dhcp_server']) # NOTE(vish): applying here so we don't get a lock conflict iptables_manager.apply() @@ -1444,7 +1444,7 @@ class LinuxBridgeInterfaceDriver(LinuxNetInterfaceDriver): LinuxBridgeInterfaceDriver.remove_bridge(network['bridge'], gateway) - if CONF.share_dhcp_address: + if network['share_address'] or CONF.share_dhcp_address: remove_isolate_dhcp_address(iface, network['dhcp_server']) iptables_manager.apply() diff --git a/nova/network/manager.py b/nova/network/manager.py index 967dd41b60f0..6fa4af8311c0 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -310,11 +310,15 @@ class NetworkManager(manager.Manager): def _import_ipam_lib(self, ipam_lib): self.ipam = importutils.import_module(ipam_lib).get_ipam_lib(self) + @staticmethod + def _uses_shared_ip(network): + shared = network.get('share_address') or CONF.share_dhcp_address + return not network.get('multi_host') or shared + @utils.synchronized('get_dhcp') def _get_dhcp_ip(self, context, network_ref, host=None): """Get the proper dhcp address to listen on.""" - # NOTE(vish): this is for compatibility - if not network_ref.get('multi_host') or CONF.share_dhcp_address: + if self._uses_shared_ip(network_ref): return network_ref['gateway'] if not host: @@ -1985,7 +1989,7 @@ class VlanManager(RPCAllocateFixedIP, floating_ips.FloatingIP, NetworkManager): LOG.debug("Remove unused gateway %s", network['bridge']) self.driver.kill_dhcp(dev) self.l3driver.remove_gateway(network) - if not CONF.share_dhcp_address: + if not self._uses_shared_ip(network): fip = fixed_ip_obj.FixedIP.get_by_address( context, network.dhcp_server) fip.allocated = False diff --git a/nova/objects/network.py b/nova/objects/network.py index 4a17c2089d4a..dc717bdb8a68 100644 --- a/nova/objects/network.py +++ b/nova/objects/network.py @@ -24,9 +24,10 @@ from nova.objects import fields network_opts = [ cfg.BoolOpt('share_dhcp_address', default=False, - help='If True in multi_host mode, all compute hosts share ' - 'the same dhcp address. The same IP address used for ' - 'DHCP will be added on each nova-network node which ' + help='DEPRECATED: THIS VALUE SHOULD BE SET WHEN CREATING THE ' + 'NETWORK. If True in multi_host mode, all compute hosts ' + 'share the same dhcp address. The same IP address used ' + 'for DHCP will be added on each nova-network node which ' 'is only visible to the vms on the same host.'), cfg.IntOpt('network_device_mtu', help='MTU setting for network interface'), diff --git a/nova/tests/network/test_linux_net.py b/nova/tests/network/test_linux_net.py index 5a2618df209d..9d081c83b318 100644 --- a/nova/tests/network/test_linux_net.py +++ b/nova/tests/network/test_linux_net.py @@ -490,8 +490,8 @@ class LinuxNetworkTestCase(test.NoDBTestCase): self.stubs.Set(linux_net.iptables_manager.ipv4['filter'], 'add_rule', verify_add_rule) driver = linux_net.LinuxBridgeInterfaceDriver() - driver.plug({"bridge": "br100", "bridge_interface": "eth0"}, - "fakemac") + driver.plug({"bridge": "br100", "bridge_interface": "eth0", + "share_address": False}, "fakemac") def test_linux_ovs_driver_plug_exception(self): self.flags(fake_network=False) @@ -529,6 +529,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase): network = { "bridge": "br100", "bridge_interface": "base_interface", + "share_address": False, "vlan": "fake" } self.flags(vlan_interface="") @@ -559,6 +560,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase): network = { "bridge": "br100", "bridge_interface": "base_interface", + "share_address": False, } driver.plug(network, "fakemac") self.assertEqual(info['passed_interface'], "base_interface") @@ -676,6 +678,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase): iface = 'eth0' dhcp = '192.168.1.1' network = {'dhcp_server': dhcp, + 'share_address': False, 'bridge': 'br100', 'bridge_interface': iface} driver.plug(network, 'fakemac') @@ -767,6 +770,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase): iface = 'eth0' dhcp = '192.168.1.1' network = {'dhcp_server': dhcp, + 'share_address': False, 'bridge': 'br100', 'bridge_interface': iface} driver.plug(network, 'fakemac')