Add dnsmasq-flags to charm-neutron-openvswitch

Add a new option to provide the ability to specify flags in the
dnsmasq.conf file. This allows users to configure the dnsmasq
processes used by the neutron-dhcp-agent when local dhcp and
metadata are enabled for provider networks.

Change-Id: I2bab8a00322afb0f81986001c86f0ef4fc535651
Closes-Bug: #1684231
This commit is contained in:
Billy Olsen 2017-05-02 15:36:12 -07:00
parent 0fb6c60db4
commit 9ce4995205
7 changed files with 52 additions and 2 deletions

View File

@ -142,6 +142,13 @@ options:
which do not include a neutron-gateway (do not require l3, lbaas or vpnaas
services) and should only be used in-conjunction with flat or VLAN provider
networks configurations.
dnsmasq-flags:
type: string
default:
description: |
Comma-separated list of key=value config flags with the additional
dhcp options for neutron dnsmasq. Note, this option is only valid when
enable-local-dhcp-and-metadata option is set to True.
prevent-arp-spoofing:
type: boolean
default: true

View File

@ -30,6 +30,7 @@ from charmhelpers.core.host import (
)
from charmhelpers.contrib.openstack import context
from charmhelpers.contrib.openstack.utils import get_host_ip
from charmhelpers.contrib.openstack.utils import config_flags_parser
from charmhelpers.contrib.network.ip import get_address_in_network
from charmhelpers.contrib.openstack.context import (
OSContextGenerator,
@ -164,6 +165,7 @@ class DHCPAgentContext(OSContextGenerator):
# its principal charm. Thus we can take the 1st (only) element in each
# list.
rids = relation_ids('neutron-plugin')
ctxt = {}
if rids:
rid = rids[0]
units = related_units(rid)
@ -173,8 +175,13 @@ class DHCPAgentContext(OSContextGenerator):
rid=rid,
unit=units[0])
if availability_zone:
return {'availability_zone': availability_zone}
return {}
ctxt['availability_zone'] = availability_zone
dnsmasq_flags = config('dnsmasq-flags')
if dnsmasq_flags:
ctxt['dnsmasq_flags'] = config_flags_parser(dnsmasq_flags)
return ctxt
class L3AgentContext(OSContextGenerator):

View File

@ -127,6 +127,7 @@ GIT_PACKAGE_BLACKLIST = [
VERSION_PACKAGE = 'neutron-common'
NOVA_CONF_DIR = "/etc/nova"
NEUTRON_DHCP_AGENT_CONF = "/etc/neutron/dhcp_agent.ini"
NEUTRON_DNSMASQ_CONF = "/etc/neutron/dnsmasq.conf"
NEUTRON_CONF_DIR = "/etc/neutron"
NEUTRON_CONF = '%s/neutron.conf' % NEUTRON_CONF_DIR
NEUTRON_DEFAULT = '/etc/default/neutron-server'
@ -191,6 +192,10 @@ DHCP_RESOURCE_MAP = OrderedDict([
'services': ['neutron-dhcp-agent'],
'contexts': [neutron_ovs_context.DHCPAgentContext()],
}),
(NEUTRON_DNSMASQ_CONF, {
'services': ['neutron-dhcp-agent'],
'contexts': [neutron_ovs_context.DHCPAgentContext()],
}),
])
DVR_RESOURCE_MAP = OrderedDict([
(NEUTRON_L3_AGENT_CONF, {

5
templates/dnsmasq.conf Normal file
View File

@ -0,0 +1,5 @@
{% if dnsmasq_flags -%}
{% for key, value in dnsmasq_flags.iteritems() -%}
{{ key }} = {{ value }}
{% endfor -%}
{% endif -%}

View File

@ -10,6 +10,10 @@ interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
{% if dnsmasq_flags -%}
dnsmasq_config_file = /etc/neutron/dnsmasq.conf
{% endif -%}
enable_metadata_network = True
enable_isolated_metadata = True

View File

@ -11,6 +11,10 @@ interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
{% if dnsmasq_flags -%}
dnsmasq_config_file = /etc/neutron/dnsmasq.conf
{% endif -%}
enable_metadata_network = True
enable_isolated_metadata = True

View File

@ -283,6 +283,24 @@ class DHCPAgentContextTest(CharmTestCase):
rid='rid1',
unit='nova-compute/0')
def test_dnsmasq_flags(self):
self.relation_ids.return_value = ['rid1']
self.related_units.return_value = ['nova-compute/0']
self.relation_get.return_value = None
self.test_config.set('dnsmasq-flags', 'dhcp-userclass=set:ipxe,iPXE,'
'dhcp-match=set:ipxe,175,'
'server=1.2.3.4')
self.assertEqual(
context.DHCPAgentContext()(),
{
'dnsmasq_flags': {
'dhcp-userclass': 'set:ipxe,iPXE',
'dhcp-match': 'set:ipxe,175',
'server': '1.2.3.4',
}
}
)
class L3AgentContextTest(CharmTestCase):