]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Make dhcp agent configurable for namespace
authorAaron Rosen <arosen@nicira.com>
Sun, 12 Aug 2012 00:17:30 +0000 (17:17 -0700)
committerAaron Rosen <arosen@nicira.com>
Sun, 12 Aug 2012 21:14:07 +0000 (14:14 -0700)
Bug #1035769

Change-Id: I9f0d48a73f059a4985d629c7f0209675f5b01bec

etc/dhcp_agent.ini
quantum/agent/dhcp_agent.py
quantum/agent/linux/dhcp.py
quantum/tests/unit/test_dhcp_agent.py
quantum/tests/unit/test_linux_dhcp.py

index e9c458c30e2b41952dee4475323b33ab9098f887..377c83b649f1010dd0ef2ed586a186961e9181aa 100644 (file)
@@ -22,6 +22,10 @@ interface_driver = quantum.agent.linux.interface.OVSInterfaceDriver
 # no additional setup of the DHCP server.
 dhcp_driver = quantum.agent.linux.dhcp.Dnsmasq
 
+# Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and
+# iproute2 package that supports namespaces).
+use_namespaces = True
+
 #
 # Temporary F2 variables until the Agent <> Quantum Server is reworked in F3
 #
index 9e3e48d1c3ad7ce5769c9335c05ef3a9df16342a..0643acbf57605e1fdbff2cbde438edbdb5bad7b7 100644 (file)
@@ -53,7 +53,9 @@ class DhcpAgent(object):
                    help="The time in seconds between state poll requests."),
         cfg.IntOpt('reconnect_interval',
                    default=5,
-                   help="The time in seconds between db reconnect attempts.")
+                   help="The time in seconds between db reconnect attempts."),
+        cfg.BoolOpt('use_namespaces', default=True,
+                    help="Allow overlapping IP.")
     ]
 
     def __init__(self, conf):
@@ -211,7 +213,6 @@ class DeviceManager(object):
     def __init__(self, conf, db):
         self.conf = conf
         self.db = db
-
         if not conf.interface_driver:
             LOG.error(_('You must specify an interface driver'))
         self.driver = importutils.import_object(conf.interface_driver, conf)
@@ -232,9 +233,14 @@ class DeviceManager(object):
         port = self._get_or_create_port(network)
         interface_name = self.get_interface_name(network, port)
 
-        if ip_lib.device_exists(interface_name,
-                                self.conf.root_helper,
-                                network.id):
+        if self.conf.use_namespaces:
+            namespace = network.id
+        else:
+            namespace = None
+
+        if  ip_lib.device_exists(interface_name,
+                                 self.conf.root_helper,
+                                 namespace):
             if not reuse_existing:
                 raise exceptions.PreexistingDeviceFailure(
                     dev_name=interface_name)
@@ -245,7 +251,7 @@ class DeviceManager(object):
                              port.id,
                              interface_name,
                              port.mac_address,
-                             namespace=network.id)
+                             namespace=namespace)
         ip_cidrs = []
         for fixed_ip in port.fixed_ips:
             subnet = fixed_ip.subnet
@@ -254,7 +260,7 @@ class DeviceManager(object):
             ip_cidrs.append(ip_cidr)
 
         self.driver.init_l3(interface_name, ip_cidrs,
-                            namespace=network.id)
+                            namespace=namespace)
 
     def destroy(self, network):
         self.driver.unplug(self.get_interface_name(network))
index 5792f9a71f4aea18c2760a3eaba530a8e3ed5260..270a2c4ffe5f292f1cdb34fa4193b1103480a81f 100644 (file)
@@ -112,9 +112,12 @@ class DhcpLocalProcess(DhcpBase):
 
         if self.active:
             cmd = ['kill', '-9', pid]
-            ip_wrapper = ip_lib.IPWrapper(self.root_helper,
-                                          namespace=self.network.id)
-            ip_wrapper.netns.execute(cmd)
+            if self.conf.use_namespaces:
+                ip_wrapper = ip_lib.IPWrapper(self.root_helper,
+                                              namespace=self.network.id)
+                ip_wrapper.netns.execute(cmd)
+            else:
+                utils.execute(cmd, self.root_helper)
             self.device_delegate.destroy(self.network)
         elif pid:
             LOG.debug(_('DHCP for %s pid %d is stale, ignoring command') %
@@ -222,9 +225,12 @@ class Dnsmasq(DhcpLocalProcess):
         if self.conf.dnsmasq_dns_server:
             cmd.append('--server=%s' % self.conf.dnsmasq_dns_server)
 
-        ip_wrapper = ip_lib.IPWrapper(self.root_helper,
-                                      namespace=self.network.id)
-        ip_wrapper.netns.execute(cmd)
+        if self.conf.use_namespaces:
+            ip_wrapper = ip_lib.IPWrapper(self.root_helper,
+                                          namespace=self.network.id)
+            ip_wrapper.netns.execute(cmd)
+        else:
+            utils.execute(cmd, self.root_helper)
 
     def reload_allocations(self):
         """If all subnets turn off dhcp, kill the process."""
@@ -238,9 +244,13 @@ class Dnsmasq(DhcpLocalProcess):
         self._output_hosts_file()
         self._output_opts_file()
         cmd = ['kill', '-HUP', self.pid]
-        ip_wrapper = ip_lib.IPWrapper(self.root_helper,
-                                      namespace=self.network.id)
-        ip_wrapper.netns.execute(cmd)
+
+        if self.conf.use_namespaces:
+            ip_wrapper = ip_lib.IPWrapper(self.root_helper,
+                                          namespace=self.network.id)
+            ip_wrapper.netns.execute(cmd)
+        else:
+            utils.execute(cmd, self.root_helper)
         LOG.debug(_('Reloading allocations for network: %s') % self.network.id)
 
     def _output_hosts_file(self):
index b1c822f800e75c1329c04ee463e9bf00dc0f8209..d42b9373037bd1d340e10998a3d54a963e6a5e1f 100644 (file)
@@ -378,6 +378,7 @@ class TestDeviceManager(unittest.TestCase):
         self.conf.set_override('interface_driver',
                                'quantum.agent.linux.interface.NullDriver')
         self.conf.root_helper = 'sudo'
+        self.conf.use_namespaces = True
 
         self.client_cls_p = mock.patch('quantumclient.v2_0.client.Client')
         client_cls = self.client_cls_p.start()
index 2686253812fb0810ee72b97baaa3355b739ab75c..effdfe8df65fbd458f9477616b41b5551c962725 100644 (file)
@@ -168,6 +168,7 @@ class TestBase(unittest.TestCase):
         self.conf.register_opts(dhcp.OPTS)
         self.conf(args=args)
         self.conf.set_override('state_path', '')
+        self.conf.use_namespaces = True
 
         self.replace_p = mock.patch('quantum.agent.linux.dhcp.replace_file')
         self.execute_p = mock.patch('quantum.agent.linux.utils.execute')