Neutron server behavior is to load service providers from neutron.conf or neutron_*aas.conf but not both. [1]
If we have a case of a service provider that does not belong to any of neutron_(lbaas|fwaas|vpnaas).conf (e.g. bgpvpn from networking-bgpvpn project) we would enable it through neutron.conf. But of course we want to be able to enable both bgpvpn and other services defined through neutron_*aas.conf at the same time.
Example error where both neutron.conf and neutron_lbaas.conf are used:
root@devstack-juno-compute02:/etc/neutron# grep service_provider neutron*.conf |grep -v :#
neutron.conf:[service_providers]
neutron.conf:service_provider=BGPVPN:BaGPipe:networking_bgpvpn.neutron.services.bgpvpn.service_drivers.bagpipe.bagpipe.BaGPipeBGPVPNDriver:default
neutron_lbaas.conf:[service_providers]
neutron_lbaas.conf:service_provider=LOADBALANCER:Haproxy:neutron_lbaas.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
2015-07-09 16:56:39.778 INFO neutron.manager [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] Loading Plugin: networking_bgpvpn.neutron.services.bgpvpn.plugin.BGPVPNPlugin
2015-07-09 16:56:39.992 WARNING neutron.services.provider_configuration [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] Reading service_providers from legacy location in neutron.conf, and ignoring values in neutron_*aas.conf files; this override will be going away soon.
2015-07-09 16:56:39.993 DEBUG neutron.services.provider_configuration [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] Service providers = ['BGPVPN:BaGPipe:networking_bgpvpn.neutron.services.bgpvpn.service_drivers.bagpipe.bagpipe.BaGPipeBGPVPNDriver:default'] parse_service_provider_opt /opt/stack/neutron/neutron/services/provider_configuration.py:93
2015-07-09 16:56:39.998 DEBUG neutron.services.service_base [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] Loaded 'networking_bgpvpn.neutron.services.bgpvpn.service_drivers.bagpipe.bagpipe.BaGPipeBGPVPNDriver' provider for service BGPVPN load_drivers /opt/stack/neutron/neutron/services/service_base.py:85
2015-07-09 16:56:39.999 INFO networking_bgpvpn.neutron.services.bgpvpn.plugin [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] BGP VPN Service Plugin using Service Driver: bagpipe
2015-07-09 16:56:40.000 DEBUG neutron.manager [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] Successfully loaded BGPVPN plugin. Description: Neutron BGP VPN connection Service Plugin _load_service_plugins /opt/stack/neutron/neutron/manager.py:196
2015-07-09 16:56:40.001 INFO neutron.manager [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] Loading Plugin: neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPlugin
2015-07-09 16:56:40.536 ERROR neutron.services.service_base [req-0d5c679c-d9de-42eb-8aa3-c889869486d4 None None] No providers specified for 'LOADBALANCER' service, exiting
The solution could consist in extending the harcoded list of neutron_*.conf files that neutron reads to load service_providers [2], but this may or may not be the most sensible approach.
[1] https://review.openstack.org/gitweb?p=openstack%2Fneutron.git;a=commitdiff;h=fb3138c8d718be67505f247ca776abf15ba1504a
[2] https://github.com/openstack/neutron/blob/master/neutron/common/repos.py#L80
I vote for killing repos.py and provider_ configuration. py and the whole idea that neutron should reimplement INI parser (the job that oslo.config does better) and allow interested parties to meld in their service_provider values by passing additional configuration files with --config-file.
The repos.py mechanism could be a temporary measure for the time of split, but since Kilo is there and has all services split, I don't think we should maitain the hack indefinitely.