summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/api.py2
-rw-r--r--nova/network/api.py3
-rw-r--r--nova/network/linux_net.py1
-rw-r--r--nova/network/manager.py184
4 files changed, 75 insertions, 115 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 472513329..c22ece068 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1706,7 +1706,9 @@ def network_get_all_by_host(context, host):
with session.begin():
return session.query(models.Network).\
filter_by(deleted=False).\
+ join(models.Network.fixed_ips).\
filter_by(host=host).\
+ filter_by(deleted=False).\
all()
diff --git a/nova/network/api.py b/nova/network/api.py
index c0f0fb8eb..38560b037 100644
--- a/nova/network/api.py
+++ b/nova/network/api.py
@@ -174,7 +174,8 @@ class API(base.Base):
def get_instance_nw_info(self, context, instance):
"""Returns all network info related to an instance."""
args = {'instance_id': instance['id'],
- 'instance_type_id': instance['instance_type_id']}
+ 'instance_type_id': instance['instance_type_id'],
+ 'host': instance['host']}
return rpc.call(context, FLAGS.network_topic,
{'method': 'get_instance_nw_info',
'args': args})
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index 848e40643..a8ce1c16a 100644
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -700,6 +700,7 @@ def _dnsmasq_cmd(net):
cmd = ['sudo', '-E', 'dnsmasq',
'--strict-order',
'--bind-interfaces',
+ '--interface=%s' % net['bridge'],
'--conf-file=%s' % FLAGS.dnsmasq_config_file,
'--domain=%s' % FLAGS.dhcp_domain,
'--pid-file=%s' % _dhcp_file(net['bridge'], 'pid'),
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 83ab4dd72..8ef9c9a33 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -28,7 +28,6 @@ topologies. All of the network commands are issued to a subclass of
:flat_network_bridge: Bridge device for simple network instances
:flat_interface: FlatDhcp will bridge into this interface if set
:flat_network_dns: Dns for simple network
-:flat_network_dhcp_start: Dhcp start for FlatDhcp
:vlan_start: First VLAN for private networks
:vpn_ip: Public IP for the cloudpipe VPN servers
:vpn_start: First Vpn port for private networks
@@ -77,8 +76,6 @@ flags.DEFINE_bool('flat_injected', True,
'Whether to attempt to inject network setup into guest')
flags.DEFINE_string('flat_interface', None,
'FlatDhcp will bridge into this interface if set')
-flags.DEFINE_string('flat_network_dhcp_start', '10.0.0.2',
- 'Dhcp start for FlatDhcp')
flags.DEFINE_integer('vlan_start', 100, 'First VLAN for private networks')
flags.DEFINE_string('vlan_interface', None,
'vlans will bridge into this interface if set')
@@ -134,6 +131,11 @@ class RPCAllocateFixedIP(object):
# NOTE(vish): if we are not multi_host pass to the network host
if not network['multi_host']:
host = network['host']
+ # NOTE(vish): if there is no network host, set one
+ if host == None:
+ host = rpc.call(context, FLAGS.network_topic,
+ {'method': 'set_network_host',
+ 'args': {'network_ref': network}})
if host != self.host:
# need to call allocate_fixed_ip to correct network host
topic = self.db.queue_get_for(context, FLAGS.network_topic, host)
@@ -302,51 +304,34 @@ class NetworkManager(manager.SchedulerDependentManager):
super(NetworkManager, self).__init__(service_name='network',
*args, **kwargs)
- def _update_dhcp(self, context, network_ref):
- """Sets the listen address before sending update to the driver."""
- network_ref['dhcp_server'] = self._get_dhcp_ip(context, network_ref)
- return self.driver.update_dhcp(context, network_ref)
-
- def _get_dhcp_ip(self, context, network_ref):
- """Get the proper dhcp address to listen on.
-
- If it is a multi_host network, get the ip assigned to this host,
- otherwise, assume that dhcp is listening on the gateway."""
- if network_ref['multi_host']:
-
- @utils.synchronized('get_dhcp')
- def _sync_get_dhcp_ip():
- network_id = network_ref['id']
- try:
- fip = self.db.fixed_ip_get_by_network_host(context,
- network_id,
- self.host)
- return fip['address']
- except exception.FixedIpNotFoundForNetworkHost:
- addr = self.db.fixed_ip_associate_pool(context.elevated(),
- network_id,
- host=self.host)
- return addr
-
- return _sync_get_dhcp_ip()
+ @utils.synchronized('get_dhcp')
+ def _get_dhcp_ip(self, context, network_ref, host=None):
+ """Get the proper dhcp address to listen on."""
+ if not host:
+ host = self.host
+ network_id = network_ref['id']
+ try:
+ fip = self.db.fixed_ip_get_by_network_host(context,
+ network_id,
+ host)
+ return fip['address']
+ except exception.FixedIpNotFoundForNetworkHost:
+ elevated = context.elevated()
+ addr = self.db.fixed_ip_associate_pool(elevated,
+ network_id,
+ host=host)
+ return addr
- else:
- return network_ref['gateway']
def init_host(self):
"""Do any initialization that needs to be run if this is a
standalone service.
"""
- # Set up this host for networks in which it's already
- # the designated network host.
+ # NOTE(vish): Set up networks for which this host already has
+ # an ip address.
ctxt = context.get_admin_context()
for network in self.db.network_get_all_by_host(ctxt, self.host):
- self._on_set_network_host(ctxt, network['id'])
- for network in self.db.network_get_all(ctxt):
- # NOTE(vish): multi_host networks need to be set on all boxes
- if network['multi_host']:
- self._on_set_network_host(ctxt, network['id'])
-
+ self._setup_network(ctxt, network)
def periodic_tasks(self, context=None):
"""Tasks to be run at a periodic interval."""
@@ -361,37 +346,21 @@ class NetworkManager(manager.SchedulerDependentManager):
if num:
LOG.debug(_('Dissassociated %s stale fixed ip(s)'), num)
- # setup any new networks which have been created
- self.set_network_hosts(context)
-
- def set_network_host(self, context, network_id):
+ def set_network_host(self, context, network_ref):
"""Safely sets the host of the network."""
LOG.debug(_('setting network host'), context=context)
host = self.db.network_set_host(context,
- network_id,
+ network_ref['id'],
self.host)
- if host == self.host:
- self._on_set_network_host(context, network_id)
return host
- def set_network_hosts(self, context):
- """Set the network hosts for any networks which are unset."""
- networks = self.db.network_get_all(context)
- for network in networks:
- if not network['multi_host'] and not network['host']:
- # return so worker will only grab 1 (to help scale flatter)
- return self.set_network_host(context, network['id'])
-
def _get_networks_for_instance(self, context, instance_id, project_id):
"""Determine & return which networks an instance should connect to."""
# TODO(tr3buchet) maybe this needs to be updated in the future if
# there is a better way to determine which networks
# a non-vlan instance should connect to
- networks = self.db.network_get_all(context)
-
- # return only networks which are not vlan networks and have host set
- return [network for network in networks if not network['vlan']
- and network['host'] or network['multi_host']]
+ return [network for network in self.db.network_get_all(context)
+ if not network['vlan']]
def allocate_for_instance(self, context, **kwargs):
"""Handles allocating the various network resources for an instance.
@@ -410,7 +379,7 @@ class NetworkManager(manager.SchedulerDependentManager):
LOG.warn(networks)
self._allocate_mac_addresses(context, instance_id, networks)
self._allocate_fixed_ips(admin_context, instance_id, host, networks)
- return self.get_instance_nw_info(context, instance_id, type_id)
+ return self.get_instance_nw_info(context, instance_id, type_id, host)
def deallocate_for_instance(self, context, **kwargs):
"""Handles deallocating various network resources for an instance.
@@ -430,7 +399,7 @@ class NetworkManager(manager.SchedulerDependentManager):
# deallocate vifs (mac addresses)
self.db.virtual_interface_delete_by_instance(context, instance_id)
- def get_instance_nw_info(self, context, instance_id, instance_type_id):
+ def get_instance_nw_info(self, context, instance_id, instance_type_id, host):
"""Creates network info list for instance.
called by allocate_for_instance and netowrk_api
@@ -474,10 +443,16 @@ class NetworkManager(manager.SchedulerDependentManager):
'cidr': network['cidr'],
'cidr_v6': network['cidr_v6'],
'injected': network['injected']}
+ if network['multi_host']:
+ dhcp_server = self._get_dhcp_ip(context, network, host)
+ else:
+ dhcp_server = self._get_dhcp_ip(context,
+ network,
+ network['host'])
info = {
'label': network['label'],
'gateway': network['gateway'],
- 'dhcp_server': self._get_dhcp_ip(context, network),
+ 'dhcp_server': dhcp_server,
'broadcast': network['broadcast'],
'mac': vif['address'],
'rxtx_cap': flavor['rxtx_cap'],
@@ -537,6 +512,7 @@ class NetworkManager(manager.SchedulerDependentManager):
values = {'allocated': True,
'virtual_interface_id': vif['id']}
self.db.fixed_ip_update(context, address, values)
+ self._setup_network(context, network)
return address
def deallocate_fixed_ip(self, context, address, **kwargs):
@@ -583,8 +559,7 @@ class NetworkManager(manager.SchedulerDependentManager):
# the code below will update the file if necessary
if FLAGS.update_dhcp_on_disassociate:
network_ref = self.db.fixed_ip_get_network(context, address)
- network_ref['dhcp_server'] = self._get_dhcp_ip(context, network_ref)
- self._update_dhcp(context, network_ref)
+ self._setup_network(context, network_ref)
def create_networks(self, context, label, cidr, multi_host, num_networks,
network_size, cidr_v6, gateway_v6, bridge,
@@ -685,8 +660,8 @@ class NetworkManager(manager.SchedulerDependentManager):
"""Calls allocate_fixed_ip once for each network."""
raise NotImplementedError()
- def _on_set_network_host(self, context, network_id):
- """Called when this host becomes the host for a network."""
+ def _setup_network(self, context, network_ref):
+ """Sets up network on this host."""
raise NotImplementedError()
def setup_compute_network(self, context, instance_id):
@@ -746,12 +721,12 @@ class FlatManager(NetworkManager):
"""
pass
- def _on_set_network_host(self, context, network_id):
- """Called when this host becomes the host for a network."""
+ def _setup_network(self, context, network_ref):
+ """Setup Network on this host."""
net = {}
net['injected'] = FLAGS.flat_injected
net['dns'] = FLAGS.flat_network_dns
- self.db.network_update(context, network_id, net)
+ self.db.network_update(context, network_ref['id'], net)
class FlatDHCPManager(FloatingIP, RPCAllocateFixedIP, NetworkManager):
@@ -786,31 +761,18 @@ class FlatDHCPManager(FloatingIP, RPCAllocateFixedIP, NetworkManager):
self.driver.ensure_bridge(network['bridge'],
network['bridge_interface'])
- def allocate_fixed_ip(self, context, instance_id, network):
- """Allocate flat_network fixed_ip, then setup dhcp for this network."""
- address = super(FlatDHCPManager, self).allocate_fixed_ip(context,
- instance_id,
- network)
- if not FLAGS.fake_network:
- self._update_dhcp(context, network)
-
- def _on_set_network_host(self, context, network_id):
- """Called when this host becomes the host for a project."""
- net = {}
- net['dhcp_start'] = FLAGS.flat_network_dhcp_start
- self.db.network_update(context, network_id, net)
- network = db.network_get(context, network_id)
- network['dhcp_server'] = self._get_dhcp_ip(context, network)
- self.driver.ensure_bridge(network['bridge'],
- network['bridge_interface'],
- network)
+ def _setup_network(self, context, network_ref):
+ """Sets up network on this host."""
+ network_ref['dhcp_server'] = self._get_dhcp_ip(context, network_ref)
+ self.driver.ensure_bridge(network_ref['bridge'],
+ network_ref['bridge_interface'],
+ network_ref)
if not FLAGS.fake_network:
- network_ref = self.db.network_get(context, network_id)
- self._update_dhcp(context, network_ref)
+ self.driver.update_dhcp(context, network_ref)
if(FLAGS.use_ipv6):
self.driver.update_ra(context, network_ref)
gateway = utils.get_my_linklocal(network_ref['bridge'])
- self.db.network_update(context, network_id,
+ self.db.network_update(context, network_ref['id'],
{'gateway_v6': gateway})
@@ -859,8 +821,8 @@ class VlanManager(RPCAllocateFixedIP, FloatingIP, NetworkManager):
values = {'allocated': True,
'virtual_interface_id': vif['id']}
self.db.fixed_ip_update(context, address, values)
- if not FLAGS.fake_network:
- self._update_dhcp(context, network)
+ self._setup_network(context, network)
+ return address
def add_network_to_project(self, context, project_id):
"""Force adds another network to a project."""
@@ -880,11 +842,7 @@ class VlanManager(RPCAllocateFixedIP, FloatingIP, NetworkManager):
def _get_networks_for_instance(self, context, instance_id, project_id):
"""Determine which networks an instance should connect to."""
# get networks associated with project
- networks = self.db.project_get_networks(context, project_id)
-
- # return only networks which have host set or are multi_host
- return [network for network in networks
- if network['host'] or network['multi_host']]
+ return self.db.project_get_networks(context, project_id)
def create_networks(self, context, **kwargs):
"""Create networks based on parameters."""
@@ -903,36 +861,34 @@ class VlanManager(RPCAllocateFixedIP, FloatingIP, NetworkManager):
NetworkManager.create_networks(self, context, vpn=True, **kwargs)
- def _on_set_network_host(self, context, network_id):
- """Called when this host becomes the host for a network."""
- network = self.db.network_get(context, network_id)
- if not network['vpn_public_address']:
+ def _setup_network(self, context, network_ref):
+ """Sets up network on this host."""
+ network_ref['dhcp_server'] = self._get_dhcp_ip(context, network_ref)
+ if not network_ref['vpn_public_address']:
net = {}
address = FLAGS.vpn_ip
net['vpn_public_address'] = address
- db.network_update(context, network_id, net)
+ network_ref = db.network_update(context, network_ref, net)
else:
- address = network['vpn_public_address']
- network['dhcp_server'] = self._get_dhcp_ip(context, network)
- self.driver.ensure_vlan_bridge(network['vlan'],
- network['bridge'],
- network['bridge_interface'],
- network)
+ address = network_ref['vpn_public_address']
+ self.driver.ensure_vlan_bridge(network_ref['vlan'],
+ network_ref['bridge'],
+ network_ref['bridge_interface'],
+ network_ref)
# NOTE(vish): only ensure this forward if the address hasn't been set
# manually.
if address == FLAGS.vpn_ip and hasattr(self.driver,
"ensure_vlan_forward"):
self.driver.ensure_vlan_forward(FLAGS.vpn_ip,
- network['vpn_public_port'],
- network['vpn_private_address'])
+ network_ref['vpn_public_port'],
+ network_ref['vpn_private_address'])
if not FLAGS.fake_network:
- network_ref = self.db.network_get(context, network_id)
- self._update_dhcp(context, network_ref)
+ self.driver.update_dhcp(context, network_ref)
if(FLAGS.use_ipv6):
self.driver.update_ra(context, network_ref)
gateway = utils.get_my_linklocal(network_ref['bridge'])
- self.db.network_update(context, network_id,
+ self.db.network_update(context, network_ref['id'],
{'gateway_v6': gateway})
@property