Browse Source

Automatically generate neutron core configuration files

This adds a new tox environment, genconfig, which generates sample
neutron core configuration file using oslo-config-generator.

Updates to some configuration option help messages to reflect useful
details that were missing in the code but were present in config files.

It also adds details to devref on how to update config files.

Partially-Implements: blueprint autogen-neutron-conf-file

DocImpact

Change-Id: I1c6dc4e7d479f1b7c755597caded24a0f018c712
Closes-bug: #1199963
Co-Authored-By: Louis Taylor <louis@kragniz.eu>
changes/06/204206/23
Martin Hickey 6 years ago
parent
commit
71190773e1
  1. 2
      .gitignore
  2. 15
      doc/source/devref/contribute.rst
  3. 9
      etc/README.txt
  4. 7
      etc/oslo-config-generator/dhcp_agent.ini
  5. 7
      etc/oslo-config-generator/l3_agent.ini
  6. 6
      etc/oslo-config-generator/linuxbridge_agent.ini
  7. 6
      etc/oslo-config-generator/metadata_agent.ini
  8. 6
      etc/oslo-config-generator/metering_agent.ini
  9. 6
      etc/oslo-config-generator/ml2_conf.ini
  10. 6
      etc/oslo-config-generator/ml2_conf_sriov.ini
  11. 18
      etc/oslo-config-generator/neutron.conf
  12. 6
      etc/oslo-config-generator/openvswitch_agent.ini
  13. 6
      etc/oslo-config-generator/sriov_agent.ini
  14. 30
      neutron/agent/common/config.py
  15. 4
      neutron/agent/common/ovs_lib.py
  16. 37
      neutron/agent/dhcp/config.py
  17. 23
      neutron/agent/l3/config.py
  18. 5
      neutron/agent/linux/interface.py
  19. 7
      neutron/agent/metadata/config.py
  20. 4
      neutron/agent/ovsdb/api.py
  21. 7
      neutron/agent/ovsdb/impl_idl.py
  22. 4
      neutron/agent/securitygroups_rpc.py
  23. 62
      neutron/common/config.py
  24. 2
      neutron/db/extraroute_db.py
  25. 10
      neutron/db/l3_hamode_db.py
  26. 7
      neutron/db/migration/cli.py
  27. 10
      neutron/debug/debug_agent.py
  28. 2
      neutron/debug/shell.py
  29. 287
      neutron/opts.py
  30. 15
      neutron/plugins/ml2/config.py
  31. 14
      neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py
  32. 30
      neutron/plugins/ml2/drivers/mech_sriov/agent/common/config.py
  33. 8
      neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py
  34. 31
      neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py
  35. 9
      neutron/plugins/ml2/drivers/type_geneve.py
  36. 6
      neutron/plugins/ml2/drivers/type_vxlan.py
  37. 2
      neutron/tests/unit/debug/test_commands.py
  38. 7
      releasenotes/notes/config-file-generation-2eafc6602d57178e.yaml
  39. 17
      setup.cfg
  40. 28
      tools/generate_config_file_samples.sh
  41. 5
      tox.ini

2
.gitignore

@ -6,6 +6,8 @@ cover/
covhtml/
dist/
doc/build
etc/*.sample
etc/neutron/plugins/ml2/*.sample
*.DS_Store
*.pyc
neutron.egg-info/

15
doc/source/devref/contribute.rst

@ -367,6 +367,21 @@ section of the third-party repo's own ``setup.cfg`` file.
config files, duplicate settings will collide. It is therefore recommended to
prefix section names with a third-party string, e.g. [vendor_foo].
Since Mitaka, configuration files are not maintained in the git repository but
should be generated as follows::
``tox -e genconfig``
If a 'tox' environment is unavailable, then you can run the following script
instead to generate the configuration files::
./tools/generate_config_file_samples.sh
It is advised that subprojects do not keep their configuration files in their
respective trees and instead generate them using a similar approach as Neutron
does.
Liberty Steps
+++++++++++++

9
etc/README.txt

@ -0,0 +1,9 @@
To generate the sample neutron configuration files, run the following
command from the top level of the neutron directory:
tox -e genconfig
If a 'tox' environment is unavailable, then you can run the following script
instead to generate the configuration files:
./tools/generate_config_file_samples.sh

7
etc/oslo-config-generator/dhcp_agent.ini

@ -0,0 +1,7 @@
[DEFAULT]
output_file = etc/dhcp_agent.ini.sample
wrap_width = 79
namespace = neutron.base.agent
namespace = neutron.dhcp.agent
namespace = oslo.log

7
etc/oslo-config-generator/l3_agent.ini

@ -0,0 +1,7 @@
[DEFAULT]
output_file = etc/l3_agent.ini.sample
wrap_width = 79
namespace = neutron.base.agent
namespace = neutron.l3.agent
namespace = oslo.log

6
etc/oslo-config-generator/linuxbridge_agent.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/neutron/plugins/ml2/linuxbridge_agent.ini.sample
wrap_width = 79
namespace = neutron.ml2.linuxbridge.agent
namespace = oslo.log

6
etc/oslo-config-generator/metadata_agent.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/metadata_agent.ini.sample
wrap_width = 79
namespace = neutron.metadata.agent
namespace = oslo.log

6
etc/oslo-config-generator/metering_agent.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/metering_agent.ini.sample
wrap_width = 79
namespace = neutron.metering.agent
namespace = oslo.log

6
etc/oslo-config-generator/ml2_conf.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/neutron/plugins/ml2/ml2_conf.ini.sample
wrap_width = 79
namespace = neutron.ml2
namespace = oslo.log

6
etc/oslo-config-generator/ml2_conf_sriov.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/neutron/plugins/ml2/ml2_conf_sriov.ini.sample
wrap_width = 79
namespace = neutron.ml2.sriov
namespace = oslo.log

18
etc/oslo-config-generator/neutron.conf

@ -0,0 +1,18 @@
[DEFAULT]
output_file = etc/neutron.conf.sample
wrap_width = 79
namespace = neutron
namespace = neutron.agent
namespace = neutron.db
namespace = neutron.extensions
namespace = neutron.qos
namespace = nova.auth
namespace = oslo.log
namespace = oslo.db
namespace = oslo.policy
namespace = oslo.concurrency
namespace = oslo.messaging
namespace = oslo.service.sslutils
namespace = oslo.service.wsgi
namespace = keystonemiddleware.auth_token

6
etc/oslo-config-generator/openvswitch_agent.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/neutron/plugins/ml2/openvswitch_agent.ini.sample
wrap_width = 79
namespace = neutron.ml2.ovs.agent
namespace = oslo.log

6
etc/oslo-config-generator/sriov_agent.ini

@ -0,0 +1,6 @@
[DEFAULT]
output_file = etc/neutron/plugins/ml2/sriov_agent.ini.sample
wrap_width = 79
namespace = neutron.ml2.sriov.agent
namespace = oslo.log

30
neutron/agent/common/config.py

@ -26,11 +26,18 @@ LOG = logging.getLogger(__name__)
ROOT_HELPER_OPTS = [
cfg.StrOpt('root_helper', default='sudo',
help=_('Root helper application.')),
help=_("Root helper application. "
"Use 'sudo neutron-rootwrap /etc/neutron/rootwrap.conf' "
"to use the real root filter facility. Change to 'sudo' "
"to skip the filtering and just run the command "
"directly.")),
cfg.BoolOpt('use_helper_for_ns_read',
default=True,
help=_('Use the root helper to read the namespaces from '
'the operating system.')),
help=_("Use the root helper when listing the namespaces on a "
"system. This may not be required depending on the "
"security configuration. If the root helper is "
"not required, set this to False for a performance "
"improvement.")),
# We can't just use root_helper=sudo neutron-rootwrap-daemon $cfg because
# it isn't appropriate for long-lived processes spawned with create_process
# Having a bool use_rootwrap_daemon option precludes specifying the
@ -55,7 +62,11 @@ INTERFACE_DRIVER_OPTS = [
IPTABLES_OPTS = [
cfg.BoolOpt('comment_iptables_rules', default=True,
help=_("Add comments to iptables rules.")),
help=_("Add comments to iptables rules. "
"Set to false to disallow the addition of comments to "
"generated iptables rules that describe each rule's "
"purpose. System must support the iptables comments "
"module for addition of comments.")),
]
PROCESS_MONITOR_OPTS = [
@ -74,6 +85,17 @@ AVAILABILITY_ZONE_OPTS = [
help=_("Availability zone of this node")),
]
EXT_NET_BRIDGE_OPTS = [
cfg.StrOpt('external_network_bridge', default='br-ex',
deprecated_for_removal=True,
help=_("Name of bridge used for external network "
"traffic. This should be set to an empty value for the "
"Linux Bridge. When this parameter is set, each L3 "
"agent can be associated with no more than one external "
"network. This option is deprecated and will be removed "
"in the M release.")),
]
def get_log_args(conf, log_file_name, **kwargs):
cmd_args = []

4
neutron/agent/common/ovs_lib.py

@ -47,7 +47,9 @@ FAILMODE_STANDALONE = 'standalone'
OPTS = [
cfg.IntOpt('ovs_vsctl_timeout',
default=DEFAULT_OVS_VSCTL_TIMEOUT,
help=_('Timeout in seconds for ovs-vsctl commands')),
help=_('Timeout in seconds for ovs-vsctl commands. '
'If the timeout expires, ovs commands will fail with '
'ALARMCLOCK error.')),
]
cfg.CONF.register_opts(OPTS)

37
neutron/agent/dhcp/config.py

@ -18,20 +18,43 @@ from oslo_config import cfg
DHCP_AGENT_OPTS = [
cfg.IntOpt('resync_interval', default=5,
help=_("Interval to resync.")),
help=_("The DHCP agent will resync its state with Neutron to "
"recover from any transient notification or RPC errors. "
"The interval is number of seconds between attempts.")),
cfg.StrOpt('dhcp_driver',
default='neutron.agent.linux.dhcp.Dnsmasq',
help=_("The driver used to manage the DHCP server.")),
cfg.BoolOpt('enable_isolated_metadata', default=False,
help=_("Support Metadata requests on isolated networks.")),
help=_("The DHCP server can assist with providing metadata "
"support on isolated networks. Setting this value to "
"True will cause the DHCP server to append specific "
"host routes to the DHCP request. The metadata service "
"will only be activated when the subnet does not "
"contain any router port. The guest instance must be "
"configured to request host routes via DHCP (Option "
"121). This option doesn't have any effect when "
"force_metadata is set to True.")),
cfg.BoolOpt('force_metadata', default=False,
help=_("Force to use DHCP to get Metadata on all networks.")),
help=_("In some cases the Neutron router is not present to "
"provide the metadata IP but the DHCP server can be "
"used to provide this info. Setting this value will "
"force the DHCP server to append specific host routes "
"to the DHCP request. If this option is set, then the "
"metadata service will be activated for all the "
"networks.")),
cfg.BoolOpt('enable_metadata_network', default=False,
help=_("Allows for serving metadata requests from a "
"dedicated network. Requires "
"enable_isolated_metadata = True")),
help=_("Allows for serving metadata requests coming from a "
"dedicated metadata access network whose CIDR is "
"169.254.169.254/16 (or larger prefix), and is "
"connected to a Neutron router from which the VMs send "
"metadata:1 request. In this case DHCP Option 121 will "
"not be injected in VMs, as they will be able to reach "
"169.254.169.254 through a router. This option "
"requires enable_isolated_metadata = True.")),
cfg.IntOpt('num_sync_threads', default=4,
help=_('Number of threads to use during sync process.'))
help=_('Number of threads to use during sync process. '
'Should not exceed connection pool size configured on '
'server.'))
]
DHCP_OPTS = [

23
neutron/agent/l3/config.py

@ -16,6 +16,7 @@
from oslo_config import cfg
from neutron.agent.common import config
from neutron.common import constants
@ -36,11 +37,6 @@ OPTS = [
"with DVR. This mode must be used for an L3 agent "
"running on a centralized node (or in single-host "
"deployments, e.g. devstack)")),
cfg.StrOpt('external_network_bridge', default='br-ex',
deprecated_for_removal=True,
help=_("Name of bridge used for external network "
"traffic. This option is deprecated and will be removed "
"in the M release.")),
cfg.PortOpt('metadata_port',
default=9697,
help=_("TCP Port used by Neutron metadata namespace proxy.")),
@ -54,10 +50,19 @@ OPTS = [
"that has the matching router ID.")),
cfg.BoolOpt('handle_internal_only_routers',
default=True,
help=_("Agent should implement routers with no gateway")),
help=_("Indicates that this L3 agent should also handle "
"routers that do not have an external network gateway "
"configured. This option should be True only for a "
"single agent in a Neutron deployment, and may be "
"False for all agents if all routers must have an "
"external network gateway.")),
cfg.StrOpt('gateway_external_network_id', default='',
help=_("UUID of external network for routers implemented "
"by the agents.")),
help=_("When external_network_bridge is set, each L3 agent can "
"be associated with no more than one external network. "
"This value should be set to the UUID of that external "
"network. To allow L3 agent support multiple external "
"networks, both the external_network_bridge and "
"gateway_external_network_id must be left empty.")),
cfg.StrOpt('ipv6_gateway', default='',
help=_("With IPv6, the network used for the external gateway "
"does not need to have an associated subnet, since the "
@ -95,3 +100,5 @@ OPTS = [
'external network. This mark will be masked with '
'0xffff so that only the lower 16 bits will be used.')),
]
OPTS += config.EXT_NET_BRIDGE_OPTS

5
neutron/agent/linux/interface.py

@ -37,7 +37,10 @@ OPTS = [
help=_('Name of Open vSwitch bridge to use')),
cfg.BoolOpt('ovs_use_veth',
default=False,
help=_('Uses veth for an interface or not')),
help=_('Uses veth for an OVS interface or not. '
'Support kernels with limited namespace support '
'(e.g. RHEL 6.5) so long as ovs_use_veth is set to '
'True.')),
cfg.IntOpt('network_device_mtu',
help=_('MTU setting for device.')),
]

7
neutron/agent/metadata/config.py

@ -59,7 +59,12 @@ METADATA_PROXY_HANDLER_OPTS = [
help=_("TCP Port used by Nova metadata server.")),
cfg.StrOpt('metadata_proxy_shared_secret',
default='',
help=_('Shared secret to sign instance-id request'),
help=_('When proxying metadata requests, Neutron signs the '
'Instance-ID header with a shared secret to prevent '
'spoofing. You may select any string for a secret, '
'but it must match here and in the configuration used '
'by the Nova Metadata Server. NOTE: Nova uses the same '
'config key, but in [neutron] section.'),
secret=True),
cfg.StrOpt('nova_metadata_protocol',
default='http',

4
neutron/agent/ovsdb/api.py

@ -30,6 +30,10 @@ OPTS = [
choices=interface_map.keys(),
default='vsctl',
help=_('The interface for interacting with the OVSDB')),
cfg.StrOpt('ovsdb_connection',
default='tcp:127.0.0.1:6640',
help=_('The connection string for the native OVSDB backend. '
'Requires the native ovsdb_interface to be enabled.'))
]
cfg.CONF.register_opts(OPTS, 'OVS')

7
neutron/agent/ovsdb/impl_idl.py

@ -26,13 +26,6 @@ from neutron.agent.ovsdb.native import connection
from neutron.agent.ovsdb.native import idlutils
OPTS = [
cfg.StrOpt('ovsdb_connection',
default='tcp:127.0.0.1:6640',
help=_('The connection string for the native OVSDB backend')),
]
cfg.CONF.register_opts(OPTS, 'OVS')
# TODO(twilson) DEFAULT.ovs_vsctl_timeout should be OVS.vsctl_timeout
cfg.CONF.import_opt('ovs_vsctl_timeout', 'neutron.agent.common.ovs_lib')
LOG = logging.getLogger(__name__)

4
neutron/agent/securitygroups_rpc.py

@ -42,7 +42,9 @@ security_group_opts = [
cfg.BoolOpt(
'enable_ipset',
default=True,
help=_('Use ipset to speed-up the iptables based security groups.'))
help=_('Use ipset to speed-up the iptables based security groups. '
'Enabling ipset support requires that ipset is installed on L2 '
'agent node.'))
]
cfg.CONF.register_opts(security_group_opts, 'SECURITYGROUP')

62
neutron/common/config.py

@ -42,7 +42,13 @@ core_opts = [
cfg.PortOpt('bind_port', default=9696,
help=_("The port to bind to")),
cfg.StrOpt('api_extensions_path', default="",
help=_("The path for API extensions")),
help=_("The path for API extensions. "
"Note that this can be a colon-separated list of paths. "
"For example: api_extensions_path = "
"extensions:/path/to/more/exts:/even/more/exts. "
"The __path__ of neutron.extensions is appended to "
"this, so if your extensions are in there you don't "
"need to specify them here.")),
cfg.StrOpt('auth_strategy', default='keystone',
help=_("The type of authentication to use")),
cfg.StrOpt('core_plugin',
@ -50,7 +56,10 @@ core_opts = [
cfg.ListOpt('service_plugins', default=[],
help=_("The service plugins Neutron will use")),
cfg.StrOpt('base_mac', default="fa:16:3e:00:00:00",
help=_("The base MAC address Neutron will use for VIFs")),
help=_("The base MAC address Neutron will use for VIFs. "
"The first 3 octets will remain unchanged. If the 4th "
"octet is not 00, it will also be used. The others "
"will be randomly generated.")),
cfg.IntOpt('mac_generation_retries', default=16,
help=_("How many times Neutron will retry MAC generation")),
cfg.BoolOpt('allow_bulk', default=True,
@ -74,7 +83,7 @@ core_opts = [
"considered for high availability while scheduling "
"the resource.")),
cfg.IntOpt('max_dns_nameservers', default=5,
help=_("Maximum number of DNS nameservers")),
help=_("Maximum number of DNS nameservers per subnet")),
cfg.IntOpt('max_subnet_host_routes', default=20,
help=_("Maximum number of host routes per subnet")),
cfg.IntOpt('max_fixed_ips_per_port', default=5,
@ -83,16 +92,35 @@ core_opts = [
"is deprecated and will be removed in the N "
"release.")),
cfg.StrOpt('default_ipv4_subnet_pool', deprecated_for_removal=True,
help=_("Default IPv4 subnet-pool to be used for automatic "
"subnet CIDR allocation. This option is deprecated for "
"removal in the N release.")),
help=_("Default IPv4 subnet pool to be used for automatic "
"subnet CIDR allocation. "
"Specifies by UUID the pool to be used in case where "
"creation of a subnet is being called without a "
"subnet pool ID. If not set then no pool "
"will be used unless passed explicitly to the subnet "
"create. If no pool is used, then a CIDR must be passed "
"to create a subnet and that subnet will not be "
"allocated from any pool; it will be considered part of "
"the tenant's private address space. This option is "
"deprecated for removal in the N release.")),
cfg.StrOpt('default_ipv6_subnet_pool', deprecated_for_removal=True,
help=_("Default IPv6 subnet-pool to be used for automatic "
"subnet CIDR allocation. This option is deprecated for "
"removal in the N release.")),
help=_("Default IPv6 subnet pool to be used for automatic "
"subnet CIDR allocation. "
"Specifies by UUID the pool to be used in case where "
"creation of a subnet is being called without a "
"subnet pool ID. See the description for "
"default_ipv4_subnet_pool for more information. This "
"option is deprecated for removal in the N release.")),
cfg.BoolOpt('ipv6_pd_enabled', default=False,
help=_("Enables IPv6 Prefix Delegation for automatic subnet "
"CIDR allocation")),
"CIDR allocation. "
"Set to True to enable IPv6 Prefix Delegation for "
"subnet allocation in a PD-capable environment. Users "
"making subnet creation requests for IPv6 subnets "
"without providing a CIDR or subnetpool ID will be "
"given a CIDR via the Prefix Delegation mechanism. "
"Note that enabling PD will override the behavior of "
"the default IPv6 subnetpool.")),
cfg.IntOpt('dhcp_lease_duration', default=86400,
deprecated_name='dhcp_lease_time',
help=_("DHCP lease duration (in seconds). Use -1 to tell "
@ -104,9 +132,13 @@ core_opts = [
help=_("Allow sending resource operation"
" notification to DHCP agent")),
cfg.BoolOpt('allow_overlapping_ips', default=False,
help=_("Allow overlapping IP support in Neutron")),
help=_("Allow overlapping IP support in Neutron. "
"Attention: the following parameter MUST be set to "
"False if Neutron is being used in conjunction with "
"Nova security groups.")),
cfg.StrOpt('host', default=utils.get_hostname(),
help=_("Hostname to be used by the neutron server, agents and "
sample_default='example.domain',
help=_("Hostname to be used by the Neutron server, agents and "
"services running on this machine. All the agents and "
"services running on this machine must use the same "
"host value.")),
@ -127,7 +159,11 @@ core_opts = [
'to VMs via network methods (DHCP and RA MTU options) '
'when the network\'s preferred MTU is known.')),
cfg.StrOpt('ipam_driver',
help=_('IPAM driver to use.')),
help=_("Neutron IPAM (IP address management) driver to use. "
"If ipam_driver is not set (default behavior), no IPAM "
"driver is used. In order to use the reference "
"implementation of Neutron IPAM driver, "
"use 'internal'.")),
cfg.BoolOpt('vlan_transparent', default=False,
help=_('If True, then allow plugins that support it to '
'create VLAN transparent networks.')),

2
neutron/db/extraroute_db.py

@ -33,7 +33,7 @@ LOG = logging.getLogger(__name__)
extra_route_opts = [
#TODO(nati): use quota framework when it support quota for attributes
cfg.IntOpt('max_routes', default=30,
help=_("Maximum number of routes")),
help=_("Maximum number of routes per router")),
]
cfg.CONF.register_opts(extra_route_opts)

10
neutron/db/l3_hamode_db.py

@ -50,12 +50,14 @@ L3_HA_OPTS = [
help=_('Enable HA mode for virtual routers.')),
cfg.IntOpt('max_l3_agents_per_router',
default=3,
help=_('Maximum number of agents on which a router will be '
'scheduled.')),
help=_("Maximum number of L3 agents which a HA router will be "
"scheduled on. If it is set to 0 then the router will "
"be scheduled on every agent.")),
cfg.IntOpt('min_l3_agents_per_router',
default=constants.MINIMUM_AGENTS_FOR_HA,
help=_('Minimum number of agents on which a router will be '
'scheduled.')),
help=_("Minimum number of L3 agents which a HA router will be "
"scheduled on. If it is set to 0 then the router will "
"be scheduled on every agent.")),
cfg.StrOpt('l3_ha_net_cidr',
default='169.254.192.0/18',
help=_('Subnet used for the l3 HA admin network.')),

7
neutron/db/migration/cli.py

@ -98,7 +98,8 @@ _db_opts = [
help=_('URL to database')),
cfg.StrOpt('engine',
default='',
help=_('Database engine')),
help=_('Database engine for which script will be generated '
'when using offline migration.')),
]
CONF = cfg.ConfigOpts()
@ -679,6 +680,10 @@ def validate_cli_options():
alembic_util.err(_("Cannot specify both --service and --subproject."))
def get_engine_config():
return [obj for obj in _db_opts if obj.name == 'engine']
def main():
CONF(project='neutron')
validate_cli_options()

10
neutron/debug/debug_agent.py

@ -17,7 +17,6 @@ import shlex
import socket
import netaddr
from oslo_config import cfg
from oslo_log import log as logging
from neutron.agent.linux import dhcp
@ -35,15 +34,6 @@ DEVICE_OWNER_COMPUTE_PROBE = constants.DEVICE_OWNER_COMPUTE_PREFIX + 'probe'
class NeutronDebugAgent(object):
OPTS = [
# Needed for drivers
cfg.StrOpt('external_network_bridge', default='br-ex',
deprecated_for_removal=True,
help=_("Name of bridge used for external network "
"traffic. This option is deprecated and will be "
"removed in the M release.")),
]
def __init__(self, conf, client, driver):
self.conf = conf
self.client = client

2
neutron/debug/shell.py

@ -71,7 +71,7 @@ class NeutronDebugShell(shell.NeutronShell):
" either --config-file or env[NEUTRON_TEST_CONFIG_FILE]"))
client = self.client_manager.neutron
cfg.CONF.register_opts(interface.OPTS)
cfg.CONF.register_opts(debug_agent.NeutronDebugAgent.OPTS)
cfg.CONF.register_opts(config.EXT_NET_BRIDGE_OPTS)
config.register_interface_driver_opts_helper(cfg.CONF)
cfg.CONF(['--config-file', self.options.config_file])
config.setup_logging()

287
neutron/opts.py

@ -0,0 +1,287 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
import itertools
import operator
from keystoneclient import auth
from keystoneclient import session
from oslo_config import cfg
import neutron.agent.common.config
import neutron.agent.common.ovs_lib
import neutron.agent.dhcp.config
import neutron.agent.l2.extensions.manager
import neutron.agent.l3.config
import neutron.agent.l3.ha
import neutron.agent.linux.interface
import neutron.agent.metadata.config
import neutron.agent.ovsdb.api
import neutron.agent.securitygroups_rpc
import neutron.db.agents_db
import neutron.db.agentschedulers_db
import neutron.db.dvr_mac_db
import neutron.db.extraroute_db
import neutron.db.l3_agentschedulers_db
import neutron.db.l3_dvr_db
import neutron.db.l3_gwmode_db
import neutron.db.l3_hamode_db
import neutron.db.migration.cli
import neutron.extensions.allowedaddresspairs
import neutron.extensions.l3
import neutron.extensions.securitygroup
import neutron.openstack.common.cache.cache
import neutron.plugins.ml2.config
import neutron.plugins.ml2.drivers.linuxbridge.agent.common.config
import neutron.plugins.ml2.drivers.mech_sriov.agent.common.config
import neutron.plugins.ml2.drivers.mech_sriov.mech_driver.mech_driver
import neutron.plugins.ml2.drivers.openvswitch.agent.common.config
import neutron.plugins.ml2.drivers.type_flat
import neutron.plugins.ml2.drivers.type_geneve
import neutron.plugins.ml2.drivers.type_gre
import neutron.plugins.ml2.drivers.type_vlan
import neutron.plugins.ml2.drivers.type_vxlan
import neutron.quota
import neutron.service
import neutron.services.metering.agents.metering_agent
import neutron.services.qos.notification_drivers.manager
import neutron.wsgi
NOVA_GROUP = 'nova'
CONF = cfg.CONF
deprecations = {'nova.cafile': [cfg.DeprecatedOpt('ca_certificates_file',
group=NOVA_GROUP)],
'nova.insecure': [cfg.DeprecatedOpt('api_insecure',
group=NOVA_GROUP)],
'nova.timeout': [cfg.DeprecatedOpt('url_timeout',
group=NOVA_GROUP)]}
_nova_options = session.Session.register_conf_options(
CONF, NOVA_GROUP, deprecated_opts=deprecations)
def list_agent_opts():
return [
('agent',
itertools.chain(
neutron.agent.common.config.ROOT_HELPER_OPTS,
neutron.agent.common.config.AGENT_STATE_OPTS,
neutron.agent.common.config.IPTABLES_OPTS,
neutron.agent.common.config.PROCESS_MONITOR_OPTS,
neutron.agent.common.config.AVAILABILITY_ZONE_OPTS)
),
('DEFAULT',
itertools.chain(
neutron.agent.common.config.INTERFACE_DRIVER_OPTS,
neutron.agent.metadata.config.SHARED_OPTS,
neutron.agent.metadata.config.DRIVER_OPTS)
)
]
def list_extension_opts():
return [
('DEFAULT',
neutron.extensions.allowedaddresspairs.allowed_address_pair_opts),
('quotas',
itertools.chain(
neutron.extensions.l3.l3_quota_opts,
neutron.extensions.securitygroup.security_group_quota_opts)
)
]
def list_db_opts():
return [
('DEFAULT',
itertools.chain(
neutron.db.agents_db.AGENT_OPTS,
neutron.db.extraroute_db.extra_route_opts,
neutron.db.l3_gwmode_db.OPTS,
neutron.db.agentschedulers_db.AGENTS_SCHEDULER_OPTS,
neutron.db.dvr_mac_db.dvr_mac_address_opts,
neutron.db.l3_dvr_db.router_distributed_opts,
neutron.db.l3_agentschedulers_db.L3_AGENTS_SCHEDULER_OPTS,
neutron.db.l3_hamode_db.L3_HA_OPTS)
),
('database',
neutron.db.migration.cli.get_engine_config())
]
def list_opts():
return [
('DEFAULT',
itertools.chain(
neutron.common.config.core_cli_opts,
neutron.common.config.core_opts,
neutron.wsgi.socket_opts,
neutron.service.service_opts)
),
(neutron.common.config.NOVA_CONF_SECTION,
itertools.chain(
neutron.common.config.nova_opts)
),
('quotas', neutron.quota.quota_opts)
]
def list_qos_opts():
return [
('DEFAULT',
neutron.services.qos.notification_drivers.manager.QOS_PLUGIN_OPTS)
]
def list_base_agent_opts():
return [
('DEFAULT',
itertools.chain(
neutron.agent.linux.interface.OPTS,
neutron.agent.common.config.INTERFACE_DRIVER_OPTS,
neutron.agent.common.ovs_lib.OPTS)
),
('AGENT', neutron.agent.common.config.AGENT_STATE_OPTS)
]
def list_dhcp_agent_opts():
return [
('DEFAULT',
itertools.chain(
neutron.agent.dhcp.config.DHCP_AGENT_OPTS,
neutron.agent.dhcp.config.DHCP_OPTS,
neutron.agent.dhcp.config.DNSMASQ_OPTS)
)
]
def list_linux_bridge_opts():
return [
('linux_bridge',
neutron.plugins.ml2.drivers.linuxbridge.agent.common.config.
bridge_opts),
('vxlan',
neutron.plugins.ml2.drivers.linuxbridge.agent.common.config.
vxlan_opts),
('agent',
neutron.plugins.ml2.drivers.linuxbridge.agent.common.config.
agent_opts),
('securitygroup',
neutron.agent.securitygroups_rpc.security_group_opts)
]
def list_l3_agent_opts():
return [
('DEFAULT',
itertools.chain(
neutron.agent.l3.config.OPTS,
neutron.service.service_opts,
neutron.agent.l3.ha.OPTS)
)
]
def list_metadata_agent_opts():
return [
('DEFAULT',
itertools.chain(
neutron.agent.metadata.config.SHARED_OPTS,
neutron.agent.metadata.config.METADATA_PROXY_HANDLER_OPTS,
neutron.agent.metadata.config.UNIX_DOMAIN_METADATA_PROXY_OPTS,
neutron.openstack.common.cache.cache._get_oslo_configs())
),
('AGENT', neutron.agent.common.config.AGENT_STATE_OPTS)
]
def list_metering_agent_opts():
return [
('DEFAULT',
itertools.chain(
neutron.services.metering.agents.metering_agent.MeteringAgent.
Opts,
neutron.agent.common.config.INTERFACE_DRIVER_OPTS)
)
]
def list_ml2_conf_opts():
return [
('ml2',
neutron.plugins.ml2.config.ml2_opts),
('ml2_type_flat',
neutron.plugins.ml2.drivers.type_flat.flat_opts),
('ml2_type_vlan',
neutron.plugins.ml2.drivers.type_vlan.vlan_opts),
('ml2_type_gre',
neutron.plugins.ml2.drivers.type_gre.gre_opts),
('ml2_type_vxlan',
neutron.plugins.ml2.drivers.type_vxlan.vxlan_opts),
('ml2_type_geneve',
neutron.plugins.ml2.drivers.type_geneve.geneve_opts),
('securitygroup',
neutron.agent.securitygroups_rpc.security_group_opts)
]
def list_ml2_conf_sriov_opts():
return [
('ml2_sriov',
neutron.plugins.ml2.drivers.mech_sriov.mech_driver.mech_driver.
sriov_opts)
]
def list_ovs_opts():
return [
('ovs',
itertools.chain(
neutron.plugins.ml2.drivers.openvswitch.agent.common.config.
ovs_opts,
neutron.agent.ovsdb.api.OPTS)
),
('agent',
neutron.plugins.ml2.drivers.openvswitch.agent.common.config.
agent_opts),
('securitygroup',
neutron.agent.securitygroups_rpc.security_group_opts)
]
def list_sriov_agent_opts():
return [
('ml2_sriov',
neutron.plugins.ml2.drivers.mech_sriov.agent.common.config.
sriov_nic_opts),
('agent',
neutron.agent.l2.extensions.manager.L2_AGENT_EXT_MANAGER_OPTS)
]
def list_auth_opts():
opt_list = copy.deepcopy(_nova_options)
opt_list.insert(0, auth.get_common_conf_options()[0])
# NOTE(mhickey): There are a lot of auth plugins, we just generate
# the config options for a few common ones
plugins = ['password', 'v2password', 'v3password']
for name in plugins:
for plugin_option in auth.get_plugin_class(name).get_options():
if all(option.name != plugin_option.name for option in opt_list):
opt_list.append(plugin_option)
opt_list.sort(key=operator.attrgetter('name'))
return [(NOVA_GROUP, opt_list)]

15
neutron/plugins/ml2/config.py

@ -24,7 +24,9 @@ ml2_opts = [
cfg.ListOpt('tenant_network_types',
default=['local'],
help=_("Ordered list of network_types to allocate as tenant "
"networks.")),
"networks. The default value 'local' is useful for "
"single-box testing but provides no connectivity "
"between hosts.")),
cfg.ListOpt('mechanism_drivers',
default=[],
help=_("An ordered list of networking mechanism driver "
@ -39,12 +41,17 @@ ml2_opts = [
cfg.IntOpt('path_mtu', default=0,
help=_('The maximum permissible size of an unfragmented '
'packet travelling from and to addresses where '
'encapsulated Neutron traffic is sent. If <= 0, '
'the path MTU is indeterminate.')),
'encapsulated Neutron traffic is sent. '
'Drivers calculate maximum viable MTU for validating '
'tenant requests based on this value (typically, '
'path_mtu - maxmum encapsulation header size). If <= 0, '
'the path MTU is indeterminate and no calculation '
'takes place.')),
cfg.IntOpt('segment_mtu', default=0,
help=_('The maximum permissible size of an unfragmented '
'packet travelling a L2 network segment. If <= 0, the '
'segment MTU is indeterminate.')),
'segment MTU is indeterminate and no calculation takes '
'place.')),
cfg.ListOpt('physical_network_mtus',
default=[],
help=_("A list of mappings of physical networks to MTU "

14
neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py

@ -33,7 +33,10 @@ vxlan_opts = [
cfg.StrOpt('vxlan_group', default=DEFAULT_VXLAN_GROUP,
help=_("Multicast group(s) for vxlan interface. A range of "
"group addresses may be specified by using CIDR "
"notation. To reserve a unique group for each possible "
"notation. Specifying a range allows different VNIs to "
"use different group addresses, reducing or eliminating "
"spurious broadcast traffic to the tunnel endpoints. "
"To reserve a unique group for each possible "
"(24-bit) VNI, use a /8 such as 239.0.0.0/8. This "
"setting must be the same on all the agents.")),
cfg.IPOpt('local_ip', version=4,
@ -47,7 +50,14 @@ vxlan_opts = [
bridge_opts = [
cfg.ListOpt('physical_interface_mappings',
default=DEFAULT_INTERFACE_MAPPINGS,
help=_("List of <physical_network>:<physical_interface>")),
help=_("Comma-separated list of "
"<physical_network>:<physical_interface> tuples "
"mapping physical network names to the agent's "
"node-specific physical network interfaces to be used "
"for flat and VLAN networks. All physical networks "
"listed in network_vlan_ranges on the server should "
"have mappings to appropriate interfaces on each "
"agent.")),
cfg.ListOpt('bridge_mappings',
default=DEFAULT_BRIDGE_MAPPINGS,
help=_("List of <physical_network>:<physical_bridge>")),

30
neutron/plugins/ml2/drivers/mech_sriov/agent/common/config.py

@ -62,23 +62,25 @@ agent_opts = [
sriov_nic_opts = [
cfg.ListOpt('physical_device_mappings',
default=DEFAULT_DEVICE_MAPPINGS,
help=_("List of <physical_network>:<network_device> mapping "
help=_("Comma-separated list of "
"<physical_network>:<network_device> tuples mapping "
"physical network names to the agent's node-specific "
"physical network device of SR-IOV physical "
"function to be used for VLAN networks. "
"All physical networks listed in network_vlan_ranges "
"on the server should have mappings to appropriate "
"interfaces on each agent")),
"physical network device interfaces of SR-IOV physical "
"function to be used for VLAN networks. All physical "
"networks listed in network_vlan_ranges on the server "
"should have mappings to appropriate interfaces on "
"each agent.")),
cfg.ListOpt('exclude_devices',
default=DEFAULT_EXCLUDE_DEVICES,
help=_("List of <network_device>:<excluded_devices> "
"mapping network_device to the agent's node-specific "
"list of virtual functions that should not be used "
"for virtual networking. excluded_devices is a "
"semicolon separated list of virtual functions "
"(BDF format).to exclude from network_device. "
"The network_device in the mapping should appear in "
"the physical_device_mappings list.")),
help=_("Comma-separated list of "
"<network_device>:<vfs_to_exclude> tuples, mapping "
"network_device to the agent's node-specific list of "
"virtual functions that should not be used for virtual "
"networking. vfs_to_exclude is a semicolon-separated "
"list of virtual functions to exclude from "
"network_device. The network_device in the mapping "
"should appear in the physical_device_mappings "
"list.")),
]

8
neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py

@ -34,10 +34,10 @@ FLAT_VLAN = 0
sriov_opts = [
cfg.ListOpt('supported_pci_vendor_devs',
default=['15b3:1004', '8086:10ca'],
help=_("Supported PCI vendor devices, defined by "
"vendor_id:product_id according to the PCI ID "
"Repository. Default enables support for Intel "
"and Mellanox SR-IOV capable NICs")),
help=_("Comma-separated list of supported PCI vendor devices, "
"as defined by vendor_id:product_id according to the "
"PCI ID Repository. Default enables support for Intel "
"and Mellanox SR-IOV capable NICs.")),
]
cfg.CONF.register_opts(sriov_opts, "ml2_sriov")

31
neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py

@ -28,7 +28,13 @@ DEFAULT_TUNNEL_TYPES = []
ovs_opts = [
cfg.StrOpt('integration_bridge', default='br-int',
help=_("Integration bridge to use.")),
help=_("Integration bridge to use. "
"Do not change this parameter unless you have a good "
"reason to. This is the name of the OVS integration "
"bridge. There is one per hypervisor. The integration "
"bridge acts as a virtual 'patch bay'. All VM VIFs are "
"attached to this bridge and then 'patched' according "
"to their network connectivity.")),
cfg.StrOpt('tunnel_bridge', default='br-tun',
help=_("Tunnel bridge to use.")),
cfg.StrOpt('int_peer_patch_port', default='patch-tun',
@ -41,18 +47,33 @@ ovs_opts = [
help=_("Local IP address of tunnel endpoint.")),
cfg.ListOpt('bridge_mappings',
default=DEFAULT_BRIDGE_MAPPINGS,
help=_("List of <physical_network>:<bridge>. "
"Deprecated for ofagent.")),
help=_("Comma-separated list of <physical_network>:<bridge> "
"tuples mapping physical network names to the agent's "
"node-specific Open vSwitch bridge names to be used "
"for flat and VLAN networks. The length of bridge "
"names should be no more than 11. Each bridge must "
"exist, and should have a physical network interface "
"configured as a port. All physical networks "
"configured on the server should have mappings to "
"appropriate bridges on each agent. "
"Note: If you remove a bridge from this "
"mapping, make sure to disconnect it from the "
"integration bridge as it won't be managed by the "
"agent anymore. Deprecated for ofagent.")),
cfg.BoolOpt('use_veth_interconnection', default=False,
help=_("Use veths instead of patch ports to interconnect the "
"integration bridge to physical bridges.")),
"integration bridge to physical networks. "
"Support kernel without Open vSwitch patch port "
"support so long as it is set to True.")),
cfg.StrOpt('of_interface', default='ovs-ofctl',
choices=['ovs-ofctl', 'native'],
help=_("OpenFlow interface to use.")),
cfg.StrOpt('datapath_type', default=constants.OVS_DATAPATH_SYSTEM,
choices=[constants.OVS_DATAPATH_SYSTEM,
constants.OVS_DATAPATH_NETDEV],
help=_("OVS datapath to use.")),
help=_("OVS datapath to use. 'system' is the default value and "
"corresponds to the kernel datapath. To enable the "
"userspace datapath set this value to 'netdev'.")),
cfg.StrOpt('vhostuser_socket_dir', default=constants.VHOST_USER_SOCKET_DIR,
help=_("OVS vhost-user socket directory.")),
cfg.IPOpt('of_listen_address', default='127.0.0.1',

9
neutron/plugins/ml2/drivers/type_geneve.py

@ -36,9 +36,12 @@ geneve_opts = [
default=p_const.GENEVE_ENCAP_MIN_OVERHEAD,
help=_("Geneve encapsulation header size is dynamic, this "
"value is used to calculate the maximum MTU "
"for the driver."
"this is the sum of the sizes of the outer "
"ETH + IP + UDP + GENEVE header sizes")),
"for the driver. "
"This is the sum of the sizes of the outer "
"ETH + IP + UDP + GENEVE header sizes. "
"The default size for this field is 50, which is the "
"size of the Geneve header without any additional "
"option headers.")),
]
cfg.CONF.register_opts(geneve_opts, "ml2_type_geneve")

6
neutron/plugins/ml2/drivers/type_vxlan.py

@ -33,8 +33,10 @@ vxlan_opts = [
"enumerating ranges of VXLAN VNI IDs that are "
"available for tenant network allocation")),
cfg.StrOpt('vxlan_group',
help=_("Multicast group for VXLAN. If unset, disables VXLAN "
"multicast mode.")),
help=_("Multicast group for VXLAN. When configured, will "
"enable sending all broadcast traffic to this multicast "
"group. When left unconfigured, will disable multicast "
"VXLAN mode.")),
]
cfg.CONF.register_opts(vxlan_opts, "ml2_type_vxlan")

2
neutron/tests/unit/debug/test_commands.py

@ -35,7 +35,7 @@ class TestDebugCommands(base.BaseTestCase):
def setUp(self):
super(TestDebugCommands, self).setUp()
cfg.CONF.register_opts(interface.OPTS)
cfg.CONF.register_opts(debug_agent.NeutronDebugAgent.OPTS)
cfg.CONF.register_opts(config.EXT_NET_BRIDGE_OPTS)
common_config.init([])
config.register_interface_driver_opts_helper(cfg.CONF)

7
releasenotes/notes/config-file-generation-2eafc6602d57178e.yaml

@ -0,0 +1,7 @@
---
prelude: >
Generation of sample Neutron core configuration files.
features:
- Neutron no longer includes static example configuration files. Instead,
use tools/generate_config_file_samples.sh to generate them. The files are
generated with a .sample extension.

17
setup.cfg

@ -149,6 +149,23 @@ oslo.messaging.notify.drivers =
neutron.openstack.common.notifier.test_notifier = oslo_messaging.notify._impl_test:TestDriver
neutron.openstack.common.notifier.rpc_notifier2 = oslo_messaging.notify.messaging:MessagingV2Driver
neutron.openstack.common.notifier.rpc_notifier = oslo_messaging.notify.messaging:MessagingDriver
oslo.config.opts =
neutron = neutron.opts:list_opts
neutron.agent = neutron.opts:list_agent_opts
neutron.base.agent = neutron.opts:list_base_agent_opts
neutron.db = neutron.opts:list_db_opts
neutron.dhcp.agent = neutron.opts:list_dhcp_agent_opts
neutron.extensions = neutron.opts:list_extension_opts
neutron.l3.agent = neutron.opts:list_l3_agent_opts
neutron.metadata.agent = neutron.opts:list_metadata_agent_opts
neutron.metering.agent = neutron.opts:list_metering_agent_opts
neutron.ml2 = neutron.opts:list_ml2_conf_opts
neutron.ml2.linuxbridge.agent = neutron.opts:list_linux_bridge_opts
neutron.ml2.ovs.agent = neutron.opts:list_ovs_opts
neutron.ml2.sriov = neutron.opts:list_ml2_conf_sriov_opts
neutron.ml2.sriov.agent = neutron.opts:list_sriov_agent_opts
neutron.qos = neutron.opts:list_qos_opts
nova.auth = neutron.opts:list_auth_opts
neutron.db.alembic_migrations =
neutron = neutron.db.migration:alembic_migrations
neutron.interface_drivers =

28
tools/generate_config_file_samples.sh

@ -0,0 +1,28 @@
#!/bin/sh
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
set -e
GEN_CMD=oslo-config-generator
if ! type "$GEN_CMD" > /dev/null; then
echo "ERROR: $GEN_CMD not installed on the system."
exit 1
fi
for file in `ls etc/oslo-config-generator/*`; do
$GEN_CMD --config-file=$file
done
set -x

5
tox.ini

@ -108,6 +108,7 @@ commands=
flake8
sh ./tools/coding-checks.sh --pylint '{posargs}'
neutron-db-manage --config-file neutron/tests/etc/neutron.conf check_migration
{[testenv:genconfig]commands}
whitelist_externals =
sh
bash
@ -125,6 +126,7 @@ commands=
flake8
sh ./tools/coding-checks.sh --pylint '{posargs}'
neutron-db-manage --config-file neutron/tests/etc/neutron.conf check_migration
{[testenv:genconfig]commands}
whitelist_externals = {[testenv:pep8]whitelist_externals}
[testenv:cover]
@ -171,3 +173,6 @@ exclude = ./.*,build,dist,neutron/openstack/common/*,neutron/tests/tempest
[hacking]
import_exceptions = neutron.i18n
local-check-factory = neutron.hacking.checks.factory
[testenv:genconfig]
commands = {toxinidir}/tools/generate_config_file_samples.sh
Loading…
Cancel
Save