Remove last parts of Quantum compatibility shim

Goodbye Quantum!

Change-Id: Idbd0384a892beaff3a937444f04cfc433cb805eb
Closes-Bug:1299046
This commit is contained in:
Dan Wendlandt 2014-03-31 23:31:00 -07:00
parent e02e9e5b9d
commit 973fc25f7b
21 changed files with 5 additions and 322 deletions

View File

@ -1 +0,0 @@
neutron

View File

@ -4,7 +4,7 @@
[DEFAULT] [DEFAULT]
# List of directories to load filter definitions from (separated by ','). # List of directories to load filter definitions from (separated by ',').
# These directories MUST all be only writeable by root ! # These directories MUST all be only writeable by root !
filters_path=/etc/neutron/rootwrap.d,/usr/share/neutron/rootwrap,/etc/quantum/rootwrap.d,/usr/share/quantum/rootwrap filters_path=/etc/neutron/rootwrap.d,/usr/share/neutron/rootwrap
# List of directories to search executables in, in case filters do not # List of directories to search executables in, in case filters do not
# explicitely specify a full path (separated by ',') # explicitely specify a full path (separated by ',')

View File

@ -29,7 +29,6 @@ from neutron.agent.linux import ovs_lib # noqa
from neutron.agent import rpc as agent_rpc from neutron.agent import rpc as agent_rpc
from neutron.common import constants from neutron.common import constants
from neutron.common import exceptions from neutron.common import exceptions
from neutron.common import legacy
from neutron.common import topics from neutron.common import topics
from neutron.common import utils from neutron.common import utils
from neutron import context from neutron import context
@ -600,7 +599,6 @@ def main():
register_options() register_options()
cfg.CONF(project='neutron') cfg.CONF(project='neutron')
config.setup_logging(cfg.CONF) config.setup_logging(cfg.CONF)
legacy.modernize_quantum_config(cfg.CONF)
server = neutron_service.Service.create( server = neutron_service.Service.create(
binary='neutron-dhcp-agent', binary='neutron-dhcp-agent',
topic=topics.DHCP_AGENT, topic=topics.DHCP_AGENT,

View File

@ -25,7 +25,6 @@ from neutron.agent.linux import iptables_manager
from neutron.agent.linux import ovs_lib # noqa from neutron.agent.linux import ovs_lib # noqa
from neutron.agent import rpc as agent_rpc from neutron.agent import rpc as agent_rpc
from neutron.common import constants as l3_constants from neutron.common import constants as l3_constants
from neutron.common import legacy
from neutron.common import topics from neutron.common import topics
from neutron.common import utils as common_utils from neutron.common import utils as common_utils
from neutron import context from neutron import context
@ -963,7 +962,6 @@ def main(manager='neutron.agent.l3_agent.L3NATAgentWithStateReport'):
conf.register_opts(external_process.OPTS) conf.register_opts(external_process.OPTS)
conf(project='neutron') conf(project='neutron')
config.setup_logging(conf) config.setup_logging(conf)
legacy.modernize_quantum_config(conf)
server = neutron_service.Service.create( server = neutron_service.Service.create(
binary='neutron-l3-agent', binary='neutron-l3-agent',
topic=topics.L3_AGENT, topic=topics.L3_AGENT,

View File

@ -1,95 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 New Dream Network, LLC (DreamHost)
# All Rights Reserved.
#
# 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.
# @author Mark McClain (DreamHost)
from oslo.config import cfg
from neutron.openstack.common import log as logging
LOG = logging.getLogger(__name__)
def scrub_class_path(cls_path):
"""Scrub from Quantum from old class_path references."""
if isinstance(cls_path, basestring):
if cls_path.startswith('quantum'):
new_path = cls_path.replace('quantum', 'neutron')
new_path = new_path.replace('Quantum', 'Neutron')
LOG.warn(
_("Old class module path in use. Please change '%(old)s' "
"to '%(new)s'."),
{'old': cls_path, 'new': new_path}
)
cls_path = new_path
return cls_path
def override_config(config, config_keys=None):
"""Attempt to override config_key with Neutron compatible values."""
for key in config_keys:
group = None
if not isinstance(key, basestring):
try:
group, key, module_str = key
old_value = getattr(getattr(config, group), key, None)
except AttributeError:
try:
config.import_opt(key, module_str, group)
old_value = getattr(getattr(config, group), key, None)
except (cfg.NoSuchOptError,
cfg.NoSuchGroupError,
AttributeError):
LOG.warn(_('Key %(key)s in group %(group)s is unknown. '
'It may not be defined or needed by this '
'service.') % {'key': key, 'group': group})
continue
else:
old_value = getattr(config, key, None)
if not old_value:
continue
elif isinstance(old_value, list):
new_value = [scrub_class_path(v) for v in old_value]
else:
new_value = scrub_class_path(old_value)
if new_value != old_value:
config.set_override(key, new_value, group=group)
def modernize_quantum_config(config):
"""Updates keys from old Quantum configurations for Neutron."""
config_keys = [
'allowed_rpc_exception_modules',
'core_plugin',
'device_driver',
'dhcp_driver',
'driver_fqn',
'interface_driver',
'network_scheduler_driver',
'notification_driver',
'router_scheduler_driver',
'rpc_backend',
'service_plugins',
('SECURITYGROUP',
'firewall_driver',
'neutron.agent.securitygroups_rpc'),
]
override_config(config, config_keys)

View File

@ -22,7 +22,6 @@ from alembic import script as alembic_script
from alembic import util as alembic_util from alembic import util as alembic_util
from oslo.config import cfg from oslo.config import cfg
from neutron.common import legacy
HEAD_FILENAME = 'HEAD' HEAD_FILENAME = 'HEAD'
@ -165,5 +164,4 @@ def main():
CONF() CONF()
#TODO(gongysh) enable logging #TODO(gongysh) enable logging
legacy.modernize_quantum_config(CONF)
CONF.command.func(config, CONF.command.name) CONF.command.func(config, CONF.command.name)

View File

@ -21,7 +21,6 @@ from oslo.config import cfg
from neutron.agent.common import config from neutron.agent.common import config
from neutron.agent.linux import interface from neutron.agent.linux import interface
from neutron.common import legacy
from neutron.debug.debug_agent import NeutronDebugAgent from neutron.debug.debug_agent import NeutronDebugAgent
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutronclient.common import exceptions as exc from neutronclient.common import exceptions as exc
@ -79,7 +78,6 @@ class NeutronDebugShell(NeutronShell):
config.register_root_helper(cfg.CONF) config.register_root_helper(cfg.CONF)
cfg.CONF(['--config-file', self.options.config_file]) cfg.CONF(['--config-file', self.options.config_file])
config.setup_logging(cfg.CONF) config.setup_logging(cfg.CONF)
legacy.modernize_quantum_config(cfg.CONF)
driver = importutils.import_object(cfg.CONF.interface_driver, cfg.CONF) driver = importutils.import_object(cfg.CONF.interface_driver, cfg.CONF)
self.debug_agent = NeutronDebugAgent(cfg.CONF, client, driver) self.debug_agent = NeutronDebugAgent(cfg.CONF, client, driver)

View File

@ -15,7 +15,6 @@
from oslo.config import cfg from oslo.config import cfg
from neutron.common import legacy
from neutron.common import utils from neutron.common import utils
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -110,8 +109,6 @@ class NeutronManager(object):
LOG.info(_("Loading core plugin: %s"), plugin_provider) LOG.info(_("Loading core plugin: %s"), plugin_provider)
self.plugin = self._get_plugin_instance('neutron.core_plugins', self.plugin = self._get_plugin_instance('neutron.core_plugins',
plugin_provider) plugin_provider)
legacy.modernize_quantum_config(cfg.CONF)
msg = validate_post_plugin_load() msg = validate_post_plugin_load()
if msg: if msg:
LOG.critical(msg) LOG.critical(msg)

View File

@ -100,7 +100,7 @@ http://wiki.openstack.org/brocade-neutron-plugin
In order to use Brocade Neutron Plugin, add the following lines in localrc, if localrc file doe In order to use Brocade Neutron Plugin, add the following lines in localrc, if localrc file doe
not exist create one: not exist create one:
ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit,quantum,q-svc,q-agt ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit,neutron,q-svc,q-agt
Q_PLUGIN=brocade Q_PLUGIN=brocade
As part of running devstack/stack.sh, the configuration files is copied as: As part of running devstack/stack.sh, the configuration files is copied as:

View File

@ -28,7 +28,6 @@ from neutron.agent.linux import ovs_lib
from neutron.agent import rpc as agent_rpc from neutron.agent import rpc as agent_rpc
from neutron.common import config as logging_config from neutron.common import config as logging_config
from neutron.common import constants as n_const from neutron.common import constants as n_const
from neutron.common import legacy
from neutron.common import topics from neutron.common import topics
from neutron.common import utils as n_utils from neutron.common import utils as n_utils
from neutron import context from neutron import context
@ -257,7 +256,6 @@ def main():
cfg.CONF.register_opts(ip_lib.OPTS) cfg.CONF.register_opts(ip_lib.OPTS)
cfg.CONF(project='neutron') cfg.CONF(project='neutron')
logging_config.setup_logging(cfg.CONF) logging_config.setup_logging(cfg.CONF)
legacy.modernize_quantum_config(cfg.CONF)
try: try:
agent_config = create_agent_config_map(cfg.CONF) agent_config = create_agent_config_map(cfg.CONF)

View File

@ -3,7 +3,7 @@ Quantum NEC OpenFlow Plugin
# -- What's this? # -- What's this?
http://wiki.openstack.org/Quantum-NEC-OpenFlow-Plugin https://wiki.openstack.org/wiki/Neutron/NEC_OpenFlow_Plugin
# -- Installation # -- Installation

View File

@ -32,7 +32,6 @@ from neutron.agent import rpc as agent_rpc
from neutron.agent import securitygroups_rpc as sg_rpc from neutron.agent import securitygroups_rpc as sg_rpc
from neutron.common import config as logging_config from neutron.common import config as logging_config
from neutron.common import constants as q_const from neutron.common import constants as q_const
from neutron.common import legacy
from neutron.common import topics from neutron.common import topics
from neutron.common import utils as q_utils from neutron.common import utils as q_utils
from neutron import context from neutron import context
@ -1343,7 +1342,6 @@ def main():
cfg.CONF(project='neutron') cfg.CONF(project='neutron')
logging_config.setup_logging(cfg.CONF) logging_config.setup_logging(cfg.CONF)
q_utils.log_opt_values(LOG) q_utils.log_opt_values(LOG)
legacy.modernize_quantum_config(cfg.CONF)
try: try:
agent_config = create_agent_config_map(cfg.CONF) agent_config = create_agent_config_map(cfg.CONF)

View File

@ -22,7 +22,6 @@ from oslo.config import cfg
import webob import webob
from neutron.common import exceptions from neutron.common import exceptions
from neutron.common import legacy
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -58,7 +57,6 @@ quota_opts = [
] ]
# Register the configuration options # Register the configuration options
cfg.CONF.register_opts(quota_opts, 'QUOTAS') cfg.CONF.register_opts(quota_opts, 'QUOTAS')
legacy.override_config(cfg.CONF, [('QUOTAS', 'quota_driver', 'neutron.quota')])
class ConfDriver(object): class ConfDriver(object):

View File

@ -22,7 +22,6 @@ import random
from oslo.config import cfg from oslo.config import cfg
from neutron.common import config from neutron.common import config
from neutron.common import legacy
from neutron import context from neutron import context
from neutron import manager from neutron import manager
from neutron import neutron_plugin_base_v2 from neutron import neutron_plugin_base_v2
@ -91,7 +90,6 @@ class NeutronApiService(WsgiService):
# Log the options used when starting if we're in debug mode... # Log the options used when starting if we're in debug mode...
config.setup_logging(cfg.CONF) config.setup_logging(cfg.CONF)
legacy.modernize_quantum_config(cfg.CONF)
# Dump the initial option values # Dump the initial option values
cfg.CONF.log_opt_values(LOG, std_logging.DEBUG) cfg.CONF.log_opt_values(LOG, std_logging.DEBUG)
service = cls(app_name) service = cls(app_name)
@ -100,14 +98,9 @@ class NeutronApiService(WsgiService):
def serve_wsgi(cls): def serve_wsgi(cls):
try:
try: try:
service = cls.create() service = cls.create()
service.start() service.start()
except RuntimeError:
LOG.exception(_('Error occurred: trying old api-paste.ini.'))
service = cls.create('quantum')
service.start()
except Exception: except Exception:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.exception(_('Unrecoverable error: please check log ' LOG.exception(_('Unrecoverable error: please check log '

View File

@ -28,7 +28,6 @@ from neutron.agent.linux import external_process
from neutron.agent.linux import interface from neutron.agent.linux import interface
from neutron.agent.linux import ip_lib from neutron.agent.linux import ip_lib
from neutron.common import constants as l3_constants from neutron.common import constants as l3_constants
from neutron.common import legacy
from neutron.common import topics from neutron.common import topics
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import service from neutron.openstack.common import service
@ -339,7 +338,6 @@ def main():
conf.register_opts(external_process.OPTS) conf.register_opts(external_process.OPTS)
conf(project='neutron') conf(project='neutron')
config.setup_logging(conf) config.setup_logging(conf)
legacy.modernize_quantum_config(conf)
server = neutron_service.Service.create( server = neutron_service.Service.create(
binary='neutron-l3-agent', binary='neutron-l3-agent',
topic=topics.L3_AGENT, topic=topics.L3_AGENT,

View File

@ -21,7 +21,6 @@ from oslo.config import cfg
from neutron.agent.common import config from neutron.agent.common import config
from neutron.agent.linux import interface from neutron.agent.linux import interface
from neutron.common import legacy
from neutron.common import topics from neutron.common import topics
from neutron.openstack.common.rpc import service as rpc_service from neutron.openstack.common.rpc import service as rpc_service
from neutron.openstack.common import service from neutron.openstack.common import service
@ -59,7 +58,6 @@ def main():
cfg.CONF(project='neutron') cfg.CONF(project='neutron')
config.setup_logging(cfg.CONF) config.setup_logging(cfg.CONF)
legacy.modernize_quantum_config(cfg.CONF)
mgr = manager.LbaasAgentManager(cfg.CONF) mgr = manager.LbaasAgentManager(cfg.CONF)
svc = LbaasAgentService( svc = LbaasAgentService(

View File

@ -1,83 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 New Dream Network, LLC (DreamHost)
# All Rights Reserved.
#
# 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.
# @author Mark McClain (DreamHost)
import mock
from oslo.config import cfg
from neutron.common import legacy
from neutron.tests import base
class TestLegacyScrubPath(base.BaseTestCase):
def test_neutron_path(self):
self.assertEqual(
'neutron.foo.NeutronPlugin',
legacy.scrub_class_path('neutron.foo.NeutronPlugin')
)
def test_quantum_path(self):
with mock.patch.object(legacy, 'LOG') as log:
self.assertEqual(
'neutron.foo.NeutronPlugin',
legacy.scrub_class_path('quantum.foo.QuantumPlugin')
)
log.assert_has_calls([mock.call.warn(mock.ANY, mock.ANY)])
def test_third_party_path(self):
self.assertEqual(
'third.party.quantum.QuantumPlugin',
legacy.scrub_class_path('third.party.quantum.QuantumPlugin')
)
class TestLegacyConfigOverride(base.BaseTestCase):
def setUp(self):
super(TestLegacyConfigOverride, self).setUp()
self.cfg = cfg.ConfigOpts()
self.cfg.register_cli_opts([cfg.StrOpt('foo'), cfg.ListOpt('thelist')])
self.cfg.register_cli_opts([cfg.StrOpt('baz')], group='bar')
def test_override_config_simple_key(self):
self.cfg(args=['--foo=quantum'])
legacy.override_config(self.cfg, ['foo'])
self.assertEqual(self.cfg.foo, 'neutron')
def test_override_config_simple_key_unchanged(self):
self.cfg(args=['--foo=something.else'])
legacy.override_config(self.cfg, ['foo'])
self.assertEqual(self.cfg.foo, 'something.else')
def test_override_config_missing_key(self):
self.cfg(args=[])
legacy.override_config(self.cfg, ['foo'])
self.assertIsNone(self.cfg.foo)
def test_override_config_group_key(self):
self.cfg(args=['--bar-baz=quantum'])
legacy.override_config(self.cfg, [('bar', 'baz', 'mod')])
self.assertEqual(self.cfg.bar.baz, 'neutron')
def test_override_config_list_value(self):
self.cfg(args=['--thelist=quantum,neutron,quantum.Quantum'])
legacy.override_config(self.cfg, ['thelist'])
self.assertEqual(
self.cfg.thelist,
['neutron', 'neutron', 'neutron.Neutron']
)

View File

@ -1,18 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 New Dream Network, LLC (DreamHost)
# All Rights Reserved.
#
# 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.
# @author Mark McClain (DreamHost)

View File

@ -1,36 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 New Dream Network, LLC (DreamHost)
# All Rights Reserved.
#
# 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.
# @author Mark McClain (DreamHost)
import sys
import warnings
from neutron import api
from neutron.api import extensions
from neutron.api import v2
warnings.warn(
_('You are using old configuration values for the api-paste config. '
'Please update for Neutron.')
)
sys.modules['quantum.api.extensions'] = extensions
sys.modules['quantum.api.v2'] = v2
# The following assigment must be performed at the end of the module.
# Otherwise local variables will be overwritten.
sys.modules['quantum.api'] = api

View File

@ -1,32 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 New Dream Network, LLC (DreamHost)
# All Rights Reserved.
#
# 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.
# @author Mark McClain (DreamHost)
import warnings
from neutron import auth
warnings.warn(
_('You are using old configuration values for the api-paste config. '
'Please update for Neutron.')
)
# For compatibility with old configurations
QuantumKeystoneContext = auth.NeutronKeystoneContext
pipeline_factory = auth.pipeline_factory

View File

@ -21,7 +21,6 @@ classifier =
[files] [files]
packages = packages =
neutron neutron
quantum
data_files = data_files =
etc/neutron = etc/neutron =
etc/api-paste.ini etc/api-paste.ini
@ -75,9 +74,7 @@ data_files =
etc/neutron/plugins/ryu = etc/neutron/plugins/ryu/ryu.ini etc/neutron/plugins/ryu = etc/neutron/plugins/ryu/ryu.ini
etc/neutron/plugins/vmware = etc/neutron/plugins/vmware/nsx.ini etc/neutron/plugins/vmware = etc/neutron/plugins/vmware/nsx.ini
scripts = scripts =
bin/quantum-rootwrap
bin/neutron-rootwrap bin/neutron-rootwrap
bin/quantum-rootwrap-xen-dom0
bin/neutron-rootwrap-xen-dom0 bin/neutron-rootwrap-xen-dom0
[global] [global]
@ -111,28 +108,7 @@ console_scripts =
neutron-server = neutron.server:main neutron-server = neutron.server:main
neutron-rootwrap = oslo.rootwrap.cmd:main neutron-rootwrap = oslo.rootwrap.cmd:main
neutron-usage-audit = neutron.cmd.usage_audit:main neutron-usage-audit = neutron.cmd.usage_audit:main
quantum-check-nvp-config = neutron.plugins.vmware.check_nsx_config:main
quantum-db-manage = neutron.db.migration.cli:main
neutron-vpn-agent = neutron.services.vpn.agent:main neutron-vpn-agent = neutron.services.vpn.agent:main
quantum-debug = neutron.debug.shell:main
quantum-dhcp-agent = neutron.agent.dhcp_agent:main
quantum-hyperv-agent = neutron.plugins.hyperv.agent.hyperv_neutron_agent:main
quantum-ibm-agent = neutron.plugins.ibm.agent.sdnve_neutron_agent:main
quantum-l3-agent = neutron.agent.l3_agent:main
quantum-lbaas-agent = neutron.services.loadbalancer.agent.agent:main
quantum-linuxbridge-agent = neutron.plugins.linuxbridge.agent.linuxbridge_neutron_agent:main
quantum-metadata-agent = neutron.agent.metadata.agent:main
quantum-mlnx-agent = neutron.plugins.mlnx.agent.eswitch_neutron_agent:main
quantum-nec-agent = neutron.plugins.nec.agent.nec_neutron_agent:main
quantum-netns-cleanup = neutron.agent.netns_cleanup_util:main
quantum-ns-metadata-proxy = neutron.agent.metadata.namespace_proxy:main
quantum-nvsd-agent = neutron.plugins.oneconvergence.agent.nvsd_neutron_agent:main
quantum-openvswitch-agent = neutron.plugins.openvswitch.agent.ovs_neutron_agent:main
quantum-ovs-cleanup = neutron.agent.ovs_cleanup_util:main
quantum-ryu-agent = neutron.plugins.ryu.agent.ryu_neutron_agent:main
quantum-server = neutron.server:main
quantum-rootwrap = oslo.rootwrap.cmd:main
quantum-usage-audit = neutron.cmd.usage_audit:main
neutron-metering-agent = neutron.services.metering.agents.metering_agent:main neutron-metering-agent = neutron.services.metering.agents.metering_agent:main
neutron-ofagent-agent = ryu.cmd.ofa_neutron_agent:main neutron-ofagent-agent = ryu.cmd.ofa_neutron_agent:main
neutron.core_plugins = neutron.core_plugins =