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, iface,
network, gateway) network, gateway)
if CONF.share_dhcp_address: if network['share_address'] or CONF.share_dhcp_address:
isolate_dhcp_address(iface, network['dhcp_server']) isolate_dhcp_address(iface, network['dhcp_server'])
# NOTE(vish): applying here so we don't get a lock conflict # NOTE(vish): applying here so we don't get a lock conflict
iptables_manager.apply() iptables_manager.apply()
@ -1444,7 +1444,7 @@ class LinuxBridgeInterfaceDriver(LinuxNetInterfaceDriver):
LinuxBridgeInterfaceDriver.remove_bridge(network['bridge'], LinuxBridgeInterfaceDriver.remove_bridge(network['bridge'],
gateway) gateway)
if CONF.share_dhcp_address: if network['share_address'] or CONF.share_dhcp_address:
remove_isolate_dhcp_address(iface, network['dhcp_server']) remove_isolate_dhcp_address(iface, network['dhcp_server'])
iptables_manager.apply() iptables_manager.apply()

View File

@ -310,11 +310,15 @@ class NetworkManager(manager.Manager):
def _import_ipam_lib(self, ipam_lib): def _import_ipam_lib(self, ipam_lib):
self.ipam = importutils.import_module(ipam_lib).get_ipam_lib(self) 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') @utils.synchronized('get_dhcp')
def _get_dhcp_ip(self, context, network_ref, host=None): def _get_dhcp_ip(self, context, network_ref, host=None):
"""Get the proper dhcp address to listen on.""" """Get the proper dhcp address to listen on."""
# NOTE(vish): this is for compatibility if self._uses_shared_ip(network_ref):
if not network_ref.get('multi_host') or CONF.share_dhcp_address:
return network_ref['gateway'] return network_ref['gateway']
if not host: if not host:
@ -1985,7 +1989,7 @@ class VlanManager(RPCAllocateFixedIP, floating_ips.FloatingIP, NetworkManager):
LOG.debug("Remove unused gateway %s", network['bridge']) LOG.debug("Remove unused gateway %s", network['bridge'])
self.driver.kill_dhcp(dev) self.driver.kill_dhcp(dev)
self.l3driver.remove_gateway(network) 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( fip = fixed_ip_obj.FixedIP.get_by_address(
context, network.dhcp_server) context, network.dhcp_server)
fip.allocated = False fip.allocated = False

View File

@ -24,9 +24,10 @@ from nova.objects import fields
network_opts = [ network_opts = [
cfg.BoolOpt('share_dhcp_address', cfg.BoolOpt('share_dhcp_address',
default=False, default=False,
help='If True in multi_host mode, all compute hosts share ' help='DEPRECATED: THIS VALUE SHOULD BE SET WHEN CREATING THE '
'the same dhcp address. The same IP address used for ' 'NETWORK. If True in multi_host mode, all compute hosts '
'DHCP will be added on each nova-network node which ' '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.'), 'is only visible to the vms on the same host.'),
cfg.IntOpt('network_device_mtu', cfg.IntOpt('network_device_mtu',
help='MTU setting for network interface'), 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'], self.stubs.Set(linux_net.iptables_manager.ipv4['filter'],
'add_rule', verify_add_rule) 'add_rule', verify_add_rule)
driver = linux_net.LinuxBridgeInterfaceDriver() driver = linux_net.LinuxBridgeInterfaceDriver()
driver.plug({"bridge": "br100", "bridge_interface": "eth0"}, driver.plug({"bridge": "br100", "bridge_interface": "eth0",
"fakemac") "share_address": False}, "fakemac")
def test_linux_ovs_driver_plug_exception(self): def test_linux_ovs_driver_plug_exception(self):
self.flags(fake_network=False) self.flags(fake_network=False)
@ -529,6 +529,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase):
network = { network = {
"bridge": "br100", "bridge": "br100",
"bridge_interface": "base_interface", "bridge_interface": "base_interface",
"share_address": False,
"vlan": "fake" "vlan": "fake"
} }
self.flags(vlan_interface="") self.flags(vlan_interface="")
@ -559,6 +560,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase):
network = { network = {
"bridge": "br100", "bridge": "br100",
"bridge_interface": "base_interface", "bridge_interface": "base_interface",
"share_address": False,
} }
driver.plug(network, "fakemac") driver.plug(network, "fakemac")
self.assertEqual(info['passed_interface'], "base_interface") self.assertEqual(info['passed_interface'], "base_interface")
@ -676,6 +678,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase):
iface = 'eth0' iface = 'eth0'
dhcp = '192.168.1.1' dhcp = '192.168.1.1'
network = {'dhcp_server': dhcp, network = {'dhcp_server': dhcp,
'share_address': False,
'bridge': 'br100', 'bridge': 'br100',
'bridge_interface': iface} 'bridge_interface': iface}
driver.plug(network, 'fakemac') driver.plug(network, 'fakemac')
@ -767,6 +770,7 @@ class LinuxNetworkTestCase(test.NoDBTestCase):
iface = 'eth0' iface = 'eth0'
dhcp = '192.168.1.1' dhcp = '192.168.1.1'
network = {'dhcp_server': dhcp, network = {'dhcp_server': dhcp,
'share_address': False,
'bridge': 'br100', 'bridge': 'br100',
'bridge_interface': iface} 'bridge_interface': iface}
driver.plug(network, 'fakemac') driver.plug(network, 'fakemac')