Determine shared ip from table instead of flag

Partially-implements blueprint better-support-for-multiple-networks

Change-Id: Id7c6620704fef504d23cb42c5218251fa9e2dba7
This commit is contained in:
Vishvananda Ishaya 2014-05-08 14:03:55 -07:00
parent 4476419725
commit e29a80022c
4 changed files with 19 additions and 10 deletions

View File

@ -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()

View File

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

View File

@ -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'),

View File

@ -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')