+-------------------------------+-----------------------+
| networking-l2gw_ | l2 |
+-------------------------------+-----------------------+
-| networking-metaplugin_ | core |
-+-------------------------------+-----------------------+
| networking-midonet_ | core,lb |
+-------------------------------+-----------------------+
| networking-mlnx_ | ml2 |
* Git: https://git.openstack.org/cgit/openstack/networking-l2gw
* Launchpad: https://launchpad.net/networking-l2gw
-.. _networking-metaplugin:
-
-Metaplugin
-----------
-
-* Git: https://github.com/ntt-sic/networking-metaplugin
-
.. _networking-midonet:
MidoNet
+++ /dev/null
-# Config file for Metaplugin
-
-[meta]
-# Comma separated list of flavor:neutron_plugin for plugins to load.
-# Extension method is searched in the list order and the first one is used.
-plugin_list = 'ml2:neutron.plugins.ml2.plugin.Ml2Plugin,nvp:neutron.plugins.vmware.plugin.NsxPluginV2'
-
-# Comma separated list of flavor:neutron_plugin for L3 service plugins
-# to load.
-# This is intended for specifying L2 plugins which support L3 functions.
-# If you use a router service plugin, set this blank.
-l3_plugin_list =
-
-# Default flavor to use, when flavor:network is not specified at network
-# creation.
-default_flavor = 'nvp'
-
-# Default L3 flavor to use, when flavor:router is not specified at router
-# creation.
-# Ignored if 'l3_plugin_list' is blank.
-default_l3_flavor =
-
-# Comma separated list of supported extension aliases.
-supported_extension_aliases = 'provider,binding,agent,dhcp_agent_scheduler'
-
-# Comma separated list of method:flavor to select specific plugin for a method.
-# This has priority over method search order based on 'plugin_list'.
-extension_map = 'get_port_stats:nvp'
-
-# Specifies flavor for plugin to handle 'q-plugin' RPC requests.
-rpc_flavor = 'ml2'
import netaddr
from oslo_config import cfg
from oslo_log import log as logging
-from oslo_utils import importutils
import six
from neutron.agent.common import ovs_lib
from neutron.agent.linux import utils
from neutron.common import constants as n_const
from neutron.common import exceptions
-from neutron.extensions import flavor
from neutron.i18n import _LE, _LI
help=_('Uses veth for an interface or not')),
cfg.IntOpt('network_device_mtu',
help=_('MTU setting for device.')),
- cfg.StrOpt('meta_flavor_driver_mappings',
- help=_('Mapping between flavor and LinuxInterfaceDriver. '
- 'It is specific to MetaInterfaceDriver used with '
- 'admin_user, admin_password, admin_tenant_name, '
- 'admin_url, auth_strategy, auth_region and '
- 'endpoint_type.')),
- cfg.StrOpt('admin_user',
- help=_("Admin username")),
- cfg.StrOpt('admin_password',
- help=_("Admin password"),
- secret=True),
- cfg.StrOpt('admin_tenant_name',
- help=_("Admin tenant name")),
- cfg.StrOpt('auth_url',
- help=_("Authentication URL")),
- cfg.StrOpt('auth_strategy', default='keystone',
- help=_("The type of authentication to use")),
- cfg.StrOpt('auth_region',
- help=_("Authentication region")),
- cfg.StrOpt('endpoint_type',
- default='publicURL',
- help=_("Network service endpoint type to pull from "
- "the keystone catalog")),
]
except RuntimeError:
LOG.error(_LE("Failed unplugging interface '%s'"),
device_name)
-
-
-class MetaInterfaceDriver(LinuxInterfaceDriver):
- def __init__(self, conf):
- super(MetaInterfaceDriver, self).__init__(conf)
- from neutronclient.v2_0 import client
- self.neutron = client.Client(
- username=self.conf.admin_user,
- password=self.conf.admin_password,
- tenant_name=self.conf.admin_tenant_name,
- auth_url=self.conf.auth_url,
- auth_strategy=self.conf.auth_strategy,
- region_name=self.conf.auth_region,
- endpoint_type=self.conf.endpoint_type
- )
- self.flavor_driver_map = {}
- for net_flavor, driver_name in [
- driver_set.split(':')
- for driver_set in
- self.conf.meta_flavor_driver_mappings.split(',')]:
- self.flavor_driver_map[net_flavor] = self._load_driver(driver_name)
-
- def _get_flavor_by_network_id(self, network_id):
- network = self.neutron.show_network(network_id)
- return network['network'][flavor.FLAVOR_NETWORK]
-
- def _get_driver_by_network_id(self, network_id):
- net_flavor = self._get_flavor_by_network_id(network_id)
- return self.flavor_driver_map[net_flavor]
-
- def _set_device_plugin_tag(self, network_id, device_name, namespace=None):
- plugin_tag = self._get_flavor_by_network_id(network_id)
- device = ip_lib.IPDevice(device_name, namespace=namespace)
- device.link.set_alias(plugin_tag)
-
- def _get_device_plugin_tag(self, device_name, namespace=None):
- device = ip_lib.IPDevice(device_name, namespace=namespace)
- return device.link.alias
-
- def get_device_name(self, port):
- driver = self._get_driver_by_network_id(port.network_id)
- return driver.get_device_name(port)
-
- def plug_new(self, network_id, port_id, device_name, mac_address,
- bridge=None, namespace=None, prefix=None):
- driver = self._get_driver_by_network_id(network_id)
- ret = driver.plug(network_id, port_id, device_name, mac_address,
- bridge=bridge, namespace=namespace, prefix=prefix)
- self._set_device_plugin_tag(network_id, device_name, namespace)
- return ret
-
- def unplug(self, device_name, bridge=None, namespace=None, prefix=None):
- plugin_tag = self._get_device_plugin_tag(device_name, namespace)
- driver = self.flavor_driver_map[plugin_tag]
- return driver.unplug(device_name, bridge, namespace, prefix)
-
- def _load_driver(self, driver_provider):
- LOG.debug("Driver location: %s", driver_provider)
- plugin_klass = importutils.import_class(driver_provider)
- return plugin_klass(self.conf)
-5498d17be016
+2a16083502f3
8675309a5c4f
kilo
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
+# Copyright 2015 OpenStack Foundation
#
# 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
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
+#
+
+"""Metaplugin removal
+
+Revision ID: 2a16083502f3
+Revises: 5498d17be016
+Create Date: 2015-06-16 09:11:10.488566
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '2a16083502f3'
+down_revision = '5498d17be016'
-from metaplugin.plugin import proxy_neutron_plugin
+from alembic import op
-ProxyPluginV2 = proxy_neutron_plugin.ProxyPluginV2
+def upgrade():
+ op.drop_table('networkflavors')
+ op.drop_table('routerflavors')
from neutron.plugins.cisco.db.l3 import l3_models # noqa
from neutron.plugins.cisco.db import n1kv_models_v2 # noqa
from neutron.plugins.cisco.db import network_models_v2 # noqa
-from neutron.plugins.metaplugin import meta_models_v2 # noqa
from neutron.plugins.ml2.drivers.arista import db # noqa
from neutron.plugins.ml2.drivers.brocade.db import ( # noqa
models as ml2_brocade_models)
+++ /dev/null
-# Copyright 2012 Nachi Ueno, NTT MCL, Inc.
-# 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.
-
-from oslo_log import log as logging
-
-from neutron.api import extensions
-from neutron.api.v2 import attributes
-
-
-LOG = logging.getLogger(__name__)
-
-FLAVOR_NETWORK = 'flavor:network'
-FLAVOR_ROUTER = 'flavor:router'
-
-FLAVOR_ATTRIBUTE = {
- 'networks': {
- FLAVOR_NETWORK: {'allow_post': True,
- 'allow_put': False,
- 'is_visible': True,
- 'default': attributes.ATTR_NOT_SPECIFIED}
- },
- 'routers': {
- FLAVOR_ROUTER: {'allow_post': True,
- 'allow_put': False,
- 'is_visible': True,
- 'default': attributes.ATTR_NOT_SPECIFIED}
- }
-}
-
-
-class Flavor(extensions.ExtensionDescriptor):
- @classmethod
- def get_name(cls):
- return "Flavor support for network and router"
-
- @classmethod
- def get_alias(cls):
- return "flavor"
-
- @classmethod
- def get_description(cls):
- return "Flavor"
-
- @classmethod
- def get_updated(cls):
- return "2012-07-20T10:00:00-00:00"
-
- def get_extended_resources(self, version):
- if version == "2.0":
- return FLAVOR_ATTRIBUTE
- else:
- return {}
+++ /dev/null
-# NOTE
-
-The main source codes of Metaplugin is now in https://github.com/ntt-sic/networking-metaplugin.
-They were moved from Neutron tree to there according to core-vendor-decomposition.
-Defining config and DB are still here according to the decomposition policy.
-Codes of 'flavor' extension and interface driver used by *-agent remain in Neutron tree too.
+++ /dev/null
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# 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.
-
-from oslo_config import cfg
-
-
-meta_plugin_opts = [
- cfg.StrOpt(
- 'plugin_list',
- default='',
- help=_("Comma separated list of flavor:neutron_plugin for "
- "plugins to load. Extension method is searched in the "
- "list order and the first one is used.")),
- cfg.StrOpt(
- 'l3_plugin_list',
- default='',
- help=_("Comma separated list of flavor:neutron_plugin for L3 "
- "service plugins to load. This is intended for specifying "
- "L2 plugins which support L3 functions. If you use a router "
- "service plugin, set this blank.")),
- cfg.StrOpt(
- 'default_flavor',
- default='',
- help=_("Default flavor to use, when flavor:network is not "
- "specified at network creation.")),
- cfg.StrOpt(
- 'default_l3_flavor',
- default='',
- help=_("Default L3 flavor to use, when flavor:router is not "
- "specified at router creation. Ignored if 'l3_plugin_list' "
- "is blank.")),
- cfg.StrOpt(
- 'supported_extension_aliases',
- default='',
- help=_("Comma separated list of supported extension aliases.")),
- cfg.StrOpt(
- 'extension_map',
- default='',
- help=_("Comma separated list of method:flavor to select specific "
- "plugin for a method. This has priority over method search "
- "order based on 'plugin_list'.")),
- cfg.StrOpt(
- 'rpc_flavor',
- default='',
- help=_("Specifies flavor for plugin to handle 'q-plugin' RPC "
- "requests.")),
-]
-
-proxy_plugin_opts = [
- cfg.StrOpt('admin_user',
- help=_("Admin user")),
- cfg.StrOpt('admin_password',
- help=_("Admin password"),
- secret=True),
- cfg.StrOpt('admin_tenant_name',
- help=_("Admin tenant name")),
- cfg.StrOpt('auth_url',
- help=_("Authentication URL")),
- cfg.StrOpt('auth_strategy', default='keystone',
- help=_("The type of authentication to use")),
- cfg.StrOpt('auth_region',
- help=_("Authentication region")),
-]
-
-cfg.CONF.register_opts(meta_plugin_opts, "META")
-cfg.CONF.register_opts(proxy_plugin_opts, "PROXY")
+++ /dev/null
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# 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.
-
-import sqlalchemy as sa
-from sqlalchemy import Column, String
-
-from neutron.db import models_v2
-
-
-class NetworkFlavor(models_v2.model_base.BASEV2):
- """Represents a binding of network_id to flavor."""
- flavor = Column(String(255))
- network_id = sa.Column(sa.String(36), sa.ForeignKey('networks.id',
- ondelete="CASCADE"),
- primary_key=True)
-
- def __repr__(self):
- return "<NetworkFlavor(%s,%s)>" % (self.flavor, self.network_id)
-
-
-class RouterFlavor(models_v2.model_base.BASEV2):
- """Represents a binding of router_id to flavor."""
- flavor = Column(String(255))
- router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id',
- ondelete="CASCADE"),
- primary_key=True)
-
- def __repr__(self):
- return "<RouterFlavor(%s,%s)>" % (self.flavor, self.router_id)
+++ /dev/null
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# 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.
-
-from metaplugin.plugin import meta_neutron_plugin
-
-
-MetaPluginV2 = meta_neutron_plugin.MetaPluginV2
with the ML2 core plugin.
Drivers within ML2 implement separately extensible sets of network
-types and of mechanisms for accessing networks of those types. Unlike
-with the metaplugin, multiple mechanisms can be used simultaneously to
-access different ports of the same virtual network. Mechanisms can
-utilize L2 agents via RPC and/or interact with external devices or
+types and of mechanisms for accessing networks of those
+types. Multiple mechanisms can be used simultaneously to access
+different ports of the same virtual network. Mechanisms can utilize L2
+agents via RPC and/or interact with external devices or
controllers. By utilizing the multiprovidernet extension, virtual
networks can be composed of multiple segments of the same or different
types. Type and mechanism drivers are loaded as python entrypoints
from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.common import constants
-from neutron.extensions import flavor
from neutron.tests import base
mock.call().link.delete()])
-class TestMetaInterfaceDriver(TestBase):
- def setUp(self):
- super(TestMetaInterfaceDriver, self).setUp()
- config.register_interface_driver_opts_helper(self.conf)
- self.client_cls_p = mock.patch('neutronclient.v2_0.client.Client')
- client_cls = self.client_cls_p.start()
- self.client_inst = mock.Mock()
- client_cls.return_value = self.client_inst
-
- fake_network = {'network': {flavor.FLAVOR_NETWORK: 'fake1'}}
- fake_port = {'ports':
- [{'mac_address':
- 'aa:bb:cc:dd:ee:ffa', 'network_id': 'test'}]}
-
- self.client_inst.list_ports.return_value = fake_port
- self.client_inst.show_network.return_value = fake_network
-
- self.conf.set_override('auth_url', 'http://localhost:35357/v2.0')
- self.conf.set_override('auth_region', 'RegionOne')
- self.conf.set_override('admin_user', 'neutron')
- self.conf.set_override('admin_password', 'password')
- self.conf.set_override('admin_tenant_name', 'service')
- self.conf.set_override(
- 'meta_flavor_driver_mappings',
- 'fake1:neutron.agent.linux.interface.OVSInterfaceDriver,'
- 'fake2:neutron.agent.linux.interface.BridgeInterfaceDriver')
- self.conf.set_override('endpoint_type', 'internalURL')
-
- def test_get_driver_by_network_id(self):
- meta_interface = interface.MetaInterfaceDriver(self.conf)
- driver = meta_interface._get_driver_by_network_id('test')
- self.assertIsInstance(driver, interface.OVSInterfaceDriver)
-
- def test_set_device_plugin_tag(self):
- meta_interface = interface.MetaInterfaceDriver(self.conf)
- driver = meta_interface._get_driver_by_network_id('test')
- meta_interface._set_device_plugin_tag(driver,
- 'tap0',
- namespace=None)
- expected = [mock.call('tap0', namespace=None),
- mock.call().link.set_alias('fake1')]
- self.ip_dev.assert_has_calls(expected)
- namespace = '01234567-1234-1234-99'
- meta_interface._set_device_plugin_tag(driver,
- 'tap1',
- namespace=namespace)
- expected = [mock.call('tap1', namespace='01234567-1234-1234-99'),
- mock.call().link.set_alias('fake1')]
- self.ip_dev.assert_has_calls(expected)
-
- def test_get_device_plugin_tag(self):
- meta_interface = interface.MetaInterfaceDriver(self.conf)
- self.ip_dev().link.alias = 'fake1'
- plugin_tag0 = meta_interface._get_device_plugin_tag('tap0',
- namespace=None)
- expected = [mock.call('tap0', namespace=None)]
- self.ip_dev.assert_has_calls(expected)
- self.assertEqual('fake1', plugin_tag0)
- namespace = '01234567-1234-1234-99'
- expected = [mock.call('tap1', namespace='01234567-1234-1234-99')]
- plugin_tag1 = meta_interface._get_device_plugin_tag(
- 'tap1',
- namespace=namespace)
- self.ip_dev.assert_has_calls(expected)
- self.assertEqual('fake1', plugin_tag1)
-
-
class TestIVSInterfaceDriver(TestBase):
def setUp(self):
etc/neutron/plugins/cisco/cisco_vpn_agent.ini
etc/neutron/plugins/embrane = etc/neutron/plugins/embrane/heleos_conf.ini
etc/neutron/plugins/ibm = etc/neutron/plugins/ibm/sdnve_neutron_plugin.ini
- etc/neutron/plugins/metaplugin = etc/neutron/plugins/metaplugin/metaplugin.ini
etc/neutron/plugins/midonet = etc/neutron/plugins/midonet/midonet.ini
etc/neutron/plugins/ml2 =
etc/neutron/plugins/bigswitch/restproxy.ini
ml2 = neutron.plugins.ml2.plugin:Ml2Plugin
nec = neutron.plugins.nec.nec_plugin:NECPluginV2
nuage = neutron.plugins.nuage.plugin:NuagePlugin
- metaplugin = neutron.plugins.metaplugin.meta_neutron_plugin:MetaPluginV2
oneconvergence = neutron.plugins.oneconvergence.plugin:OneConvergencePluginV2
plumgrid = neutron.plugins.plumgrid.plumgrid_plugin.plumgrid_plugin:NeutronPluginPLUMgridV2
vmware = neutron.plugins.vmware.plugin:NsxMhPlugin