From d901b44fea897a038ce9a8afa32751ab79ffa210 Mon Sep 17 00:00:00 2001 From: Mandar Vaze Date: Thu, 26 Apr 2012 04:24:26 -0700 Subject: Fixes bug 983024 enable_dhcp, kill_dhcp and update_dhcp calls are sent to remote nova-network, when a network is not associated with current host. Change-Id: If7c7c6e58700cc171a8f56669e6455037df7f7e7 --- nova/network/quantum/manager.py | 46 +++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'nova') diff --git a/nova/network/quantum/manager.py b/nova/network/quantum/manager.py index 1dbcaafe5..15bbe50b3 100644 --- a/nova/network/quantum/manager.py +++ b/nova/network/quantum/manager.py @@ -98,6 +98,10 @@ class QuantumManager(manager.FloatingIP, manager.FlatManager): networks = self.get_all_networks(context.get_admin_context()) cidrs = [] for net in networks: + # Don't update host information for network that does not + # belong to you + if net['host'] != self.host: + continue if net['gateway']: LOG.debug("Initializing NAT: %s (cidr: %s, gw: %s)" % ( net['label'], net['cidr'], net['gateway'])) @@ -284,9 +288,20 @@ class QuantumManager(manager.FloatingIP, manager.FlatManager): self.ipam.delete_subnets_by_net_id(context, net_uuid, project_id) # Get rid of dnsmasq if FLAGS.quantum_use_dhcp: - dev = self.driver.get_dev(net_ref) - if self.driver._device_exists(dev): - self.driver.kill_dhcp(dev) + if net_ref['host'] == self.host: + self.kill_dhcp(net_ref) + else: + topic = self.db.queue_get_for(context, + FLAGS.network_topic, + net_ref['host']) + + rpc.call(context, topic, {'method': 'kill_dhcp', + 'args': {'net_ref': net_ref}}) + + def kill_dhcp(self, net_ref): + dev = self.driver.get_dev(net_ref) + if self.driver._device_exists(dev): + self.driver.kill_dhcp(dev) def allocate_for_instance(self, context, **kwargs): """Called by compute when it is creating a new VM. @@ -370,8 +385,18 @@ class QuantumManager(manager.FloatingIP, manager.FlatManager): allowed_address_pairs=pairs) # Set up/start the dhcp server for this network if necessary if FLAGS.quantum_use_dhcp: - self.enable_dhcp(context, network['quantum_net_id'], network, - vif_rec, network['net_tenant_id']) + if network['host'] == self.host: + self.enable_dhcp(context, network['quantum_net_id'], + network, vif_rec, network['net_tenant_id']) + else: + topic = self.db.queue_get_for(context, + FLAGS.network_topic, network['host']) + rpc.call(context, topic, {'method': 'enable_dhcp', + 'args': {'quantum_net_id': network['quantum_net_id'], + 'network_ref': network, + 'vif_rec': vif_rec, + 'project_id': network['net_tenant_id']}}) + return self.get_instance_nw_info(context, instance_id, instance['uuid'], rxtx_factor, host, @@ -579,8 +604,17 @@ class QuantumManager(manager.FloatingIP, manager.FlatManager): network['uuid'], project_id, vif, instance_id) if FLAGS.quantum_use_dhcp: - self.update_dhcp(context, ipam_tenant_id, network, + if network['host'] == self.host: + self.update_dhcp(context, ipam_tenant_id, network, vif, project_id) + else: + topic = self.db.queue_get_for(context, + FLAGS.network_topic, network['host']) + rpc.call(context, topic, {'method': 'update_dhcp', + 'args': {'ipam_tenant_id': ipam_tenant_id, + 'network_ref': network, + 'vif_ref': vif, + 'project_id': network['project_id']}}) db.virtual_interface_delete(admin_context, vif['id']) -- cgit