diff --git a/.gitignore b/.gitignore index 25fb772f42d..57d35630694 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 4cde3d73fbe..44c49f2bdeb 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 00000000000..40690ee9546 --- /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 00000000000..13a0de18234 --- /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 00000000000..82bf2ca683c --- /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 00000000000..060346b6827 --- /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 00000000000..5c27309a6ca --- /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 00000000000..9c00d30efec --- /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 00000000000..ab97bd486bd --- /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 00000000000..ed03c789e6c --- /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 00000000000..f55a562ecc1 --- /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 00000000000..3fab70d3921 --- /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 00000000000..29864f57813 --- /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 fcb063d0687..233cf622a57 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 41ce3993bf1..08f3bb094dc 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 a6c00b9e17f..0331755f060 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 78cd6eb3b3c..8831b310ef8 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 83b8e741dd3..13ff3c9078c 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 67e5e1eb8db..0d34c9045fc 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 f5aad9ef8e1..c711ac224da 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 c4bd2cb7e94..8133c0c03dd 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 a0ac9ed3c6f..0f5c5d7ae40 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 5f0515462ad..3358e371a9c 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 0bf0ae228a0..f3f3de4e707 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 9125062fcfc..525d3a53129 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 f13611c7eb9..fd482c6fe30 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 6919224ff13..5b436162c71 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 00a8622edde..eca65d1f993 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 00000000000..70529b674b1 --- /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 94a0fda065d..0c16368fc01 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 72750e97ce3..83c6203e52a 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 07e42462f4b..947eb9cadab 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 f904cc655f0..4859ddabbbf 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 94c1b823940..11f22b73092 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 d8f430aafd2..54da70914fc 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 c6f9dbf1073..1a4aae92e6e 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 1f9cb17354e..33125741034 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 00000000000..d93745268b0 --- /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 f88a79b5939..c9cffb8511c 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 00000000000..6b0f4ec2e4f --- /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 2be0b20128c..3889b04449a 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