# 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
#
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):
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)
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)
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
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))
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') %
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."""
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):
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()
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')