From: Martin Hickey Date: Mon, 9 Nov 2015 23:37:37 +0000 (+0000) Subject: Automatically generate neutron core configuration files X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=71190773e14260fab96e78e65a290356cdc08581;p=openstack-build%2Fneutron-build.git 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 --- diff --git a/.gitignore b/.gitignore index 25fb772f4..57d356306 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ cover/ covhtml/ dist/ doc/build +etc/*.sample +etc/neutron/plugins/ml2/*.sample *.DS_Store *.pyc neutron.egg-info/ diff --git a/doc/source/devref/contribute.rst b/doc/source/devref/contribute.rst index 4cde3d73f..44c49f2bd 100644 --- a/doc/source/devref/contribute.rst +++ b/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 +++++++++++++ diff --git a/etc/README.txt b/etc/README.txt new file mode 100644 index 000000000..40690ee95 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/dhcp_agent.ini b/etc/oslo-config-generator/dhcp_agent.ini new file mode 100644 index 000000000..13a0de182 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/l3_agent.ini b/etc/oslo-config-generator/l3_agent.ini new file mode 100644 index 000000000..82bf2ca68 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/linuxbridge_agent.ini b/etc/oslo-config-generator/linuxbridge_agent.ini new file mode 100644 index 000000000..060346b68 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/metadata_agent.ini b/etc/oslo-config-generator/metadata_agent.ini new file mode 100644 index 000000000..5c27309a6 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/metering_agent.ini b/etc/oslo-config-generator/metering_agent.ini new file mode 100644 index 000000000..9c00d30ef --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/ml2_conf.ini b/etc/oslo-config-generator/ml2_conf.ini new file mode 100644 index 000000000..ab97bd486 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/ml2_conf_sriov.ini b/etc/oslo-config-generator/ml2_conf_sriov.ini new file mode 100644 index 000000000..ed03c789e --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/neutron.conf b/etc/oslo-config-generator/neutron.conf new file mode 100644 index 000000000..f55a562ec --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/openvswitch_agent.ini b/etc/oslo-config-generator/openvswitch_agent.ini new file mode 100644 index 000000000..3fab70d39 --- /dev/null +++ b/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 diff --git a/etc/oslo-config-generator/sriov_agent.ini b/etc/oslo-config-generator/sriov_agent.ini new file mode 100644 index 000000000..29864f578 --- /dev/null +++ b/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 diff --git a/neutron/agent/common/config.py b/neutron/agent/common/config.py index fcb063d06..233cf622a 100644 --- a/neutron/agent/common/config.py +++ b/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 = [] diff --git a/neutron/agent/common/ovs_lib.py b/neutron/agent/common/ovs_lib.py index 41ce3993b..08f3bb094 100644 --- a/neutron/agent/common/ovs_lib.py +++ b/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) diff --git a/neutron/agent/dhcp/config.py b/neutron/agent/dhcp/config.py index a6c00b9e1..0331755f0 100644 --- a/neutron/agent/dhcp/config.py +++ b/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 = [ diff --git a/neutron/agent/l3/config.py b/neutron/agent/l3/config.py index 78cd6eb3b..8831b310e 100644 --- a/neutron/agent/l3/config.py +++ b/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 diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index 83b8e741d..13ff3c907 100644 --- a/neutron/agent/linux/interface.py +++ b/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.')), ] diff --git a/neutron/agent/metadata/config.py b/neutron/agent/metadata/config.py index 67e5e1eb8..0d34c9045 100644 --- a/neutron/agent/metadata/config.py +++ b/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', diff --git a/neutron/agent/ovsdb/api.py b/neutron/agent/ovsdb/api.py index f5aad9ef8..c711ac224 100644 --- a/neutron/agent/ovsdb/api.py +++ b/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') diff --git a/neutron/agent/ovsdb/impl_idl.py b/neutron/agent/ovsdb/impl_idl.py index c4bd2cb7e..8133c0c03 100644 --- a/neutron/agent/ovsdb/impl_idl.py +++ b/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__) diff --git a/neutron/agent/securitygroups_rpc.py b/neutron/agent/securitygroups_rpc.py index a0ac9ed3c..0f5c5d7ae 100644 --- a/neutron/agent/securitygroups_rpc.py +++ b/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') diff --git a/neutron/common/config.py b/neutron/common/config.py index 5f0515462..3358e371a 100644 --- a/neutron/common/config.py +++ b/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.')), diff --git a/neutron/db/extraroute_db.py b/neutron/db/extraroute_db.py index 0bf0ae228..f3f3de4e7 100644 --- a/neutron/db/extraroute_db.py +++ b/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) diff --git a/neutron/db/l3_hamode_db.py b/neutron/db/l3_hamode_db.py index 9125062fc..525d3a531 100644 --- a/neutron/db/l3_hamode_db.py +++ b/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.')), diff --git a/neutron/db/migration/cli.py b/neutron/db/migration/cli.py index f13611c7e..fd482c6fe 100644 --- a/neutron/db/migration/cli.py +++ b/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() diff --git a/neutron/debug/debug_agent.py b/neutron/debug/debug_agent.py index 6919224ff..5b436162c 100644 --- a/neutron/debug/debug_agent.py +++ b/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 diff --git a/neutron/debug/shell.py b/neutron/debug/shell.py index 00a8622ed..eca65d1f9 100644 --- a/neutron/debug/shell.py +++ b/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() diff --git a/neutron/opts.py b/neutron/opts.py new file mode 100644 index 000000000..70529b674 --- /dev/null +++ b/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)] diff --git a/neutron/plugins/ml2/config.py b/neutron/plugins/ml2/config.py index 94a0fda06..0c16368fc 100644 --- a/neutron/plugins/ml2/config.py +++ b/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 " diff --git a/neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py b/neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py index 72750e97c..83c6203e5 100644 --- a/neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py +++ b/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 :")), + help=_("Comma-separated list of " + ": 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 :")), diff --git a/neutron/plugins/ml2/drivers/mech_sriov/agent/common/config.py b/neutron/plugins/ml2/drivers/mech_sriov/agent/common/config.py index 07e42462f..947eb9cad 100644 --- a/neutron/plugins/ml2/drivers/mech_sriov/agent/common/config.py +++ b/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 : mapping " + help=_("Comma-separated list of " + ": 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 : " - "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 " + ": 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.")), ] diff --git a/neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py b/neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py index f904cc655..4859ddabb 100644 --- a/neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py +++ b/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") diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py b/neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py index 94c1b8239..11f22b730 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py +++ b/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 :. " - "Deprecated for ofagent.")), + help=_("Comma-separated list of : " + "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', diff --git a/neutron/plugins/ml2/drivers/type_geneve.py b/neutron/plugins/ml2/drivers/type_geneve.py index d8f430aaf..54da70914 100644 --- a/neutron/plugins/ml2/drivers/type_geneve.py +++ b/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") diff --git a/neutron/plugins/ml2/drivers/type_vxlan.py b/neutron/plugins/ml2/drivers/type_vxlan.py index c6f9dbf10..1a4aae92e 100644 --- a/neutron/plugins/ml2/drivers/type_vxlan.py +++ b/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") diff --git a/neutron/tests/unit/debug/test_commands.py b/neutron/tests/unit/debug/test_commands.py index 1f9cb1735..331257410 100644 --- a/neutron/tests/unit/debug/test_commands.py +++ b/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) diff --git a/releasenotes/notes/config-file-generation-2eafc6602d57178e.yaml b/releasenotes/notes/config-file-generation-2eafc6602d57178e.yaml new file mode 100644 index 000000000..d93745268 --- /dev/null +++ b/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. diff --git a/setup.cfg b/setup.cfg index f88a79b59..c9cffb851 100644 --- a/setup.cfg +++ b/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 = diff --git a/tools/generate_config_file_samples.sh b/tools/generate_config_file_samples.sh new file mode 100755 index 000000000..6b0f4ec2e --- /dev/null +++ b/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 diff --git a/tox.ini b/tox.ini index 2be0b2012..3889b0444 100644 --- a/tox.ini +++ b/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