Final decomposition of opendaylight driver

It's all in networking-odl now.

Closes-Bug: #1514823

Depends-On: Ibc6fa46b9bae73c045bec71894ebe3cad570edcc

Change-Id: I76ae1a5078e4a47ee901150d4832f06c1d1ab093
This commit is contained in:
Henry Gessau 2015-11-10 08:31:25 -05:00
parent 31f4c878cd
commit a29fe4a30a
7 changed files with 0 additions and 246 deletions

View File

@ -1,46 +0,0 @@
OpenDaylight ML2 MechanismDriver
================================
OpenDaylight is an Open Source SDN Controller developed by a plethora of
companies and hosted by the Linux Foundation. The OpenDaylight website
contains more information on the capabilities OpenDaylight provides:
http://www.opendaylight.org
The networking-odl project provides a thin layer sitting between this
driver and OpenDaylight. The code can be downloaded from:
https://git.openstack.org/cgit/openstack/networking-odl
Theory of operation
===================
The OpenStack Neutron integration with OpenDaylight consists of the ML2
MechanismDriver which acts as a REST proxy and passes all Neutron API
calls into OpenDaylight. OpenDaylight contains a NB REST service (called
the NeutronAPIService) which caches data from these proxied API calls and
makes it available to other services inside of OpenDaylight. One current
user of the SB side of the NeutronAPIService is the OVSDB code in
OpenDaylight. OVSDB uses the neutron information to isolate tenant networks
using GRE or VXLAN tunnels.
How to use the OpenDaylight ML2 MechanismDriver
===============================================
To use the ML2 MechanismDriver, you need to ensure you have it configured
as one of the "mechanism_drivers" in ML2:
mechanism_drivers=opendaylight
The next step is to setup the "[ml2_odl]" section in either the ml2_conf.ini
file or in a separate ml2_conf_odl.ini file. An example is shown below:
[ml2_odl]
password = admin
username = admin
url = http://192.168.100.1:8080/controller/nb/v2/neutron
When starting OpenDaylight, ensure you have the SimpleForwarding application
disabled or remove the .jar file from the plugins directory. Also ensure you
start OpenDaylight before you start OpenStack Neutron.
There is devstack support for this which will automatically pull down OpenDaylight
and start it as part of devstack as well. The patch for this will likely merge
around the same time as this patch merges.

View File

@ -1,92 +0,0 @@
# Copyright (c) 2013-2014 OpenStack Foundation
# 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 networking_odl.common import constants as odl_const
from networking_odl.ml2 import mech_driver
from oslo_config import cfg
from oslo_log import log
from neutron.plugins.ml2 import driver_api as api
LOG = log.getLogger(__name__)
odl_opts = [
cfg.StrOpt('url',
help=_("HTTP URL of OpenDaylight REST interface.")),
cfg.StrOpt('username',
help=_("HTTP username for authentication")),
cfg.StrOpt('password', secret=True,
help=_("HTTP password for authentication")),
cfg.IntOpt('timeout', default=10,
help=_("HTTP timeout in seconds.")),
cfg.IntOpt('session_timeout', default=30,
help=_("Tomcat session timeout in minutes.")),
]
cfg.CONF.register_opts(odl_opts, "ml2_odl")
class OpenDaylightMechanismDriver(api.MechanismDriver):
"""Mechanism Driver for OpenDaylight.
This driver was a port from the NCS MechanismDriver. The API
exposed by ODL is slightly different from the API exposed by NCS,
but the general concepts are the same.
"""
def initialize(self):
self.url = cfg.CONF.ml2_odl.url
self.timeout = cfg.CONF.ml2_odl.timeout
self.username = cfg.CONF.ml2_odl.username
self.password = cfg.CONF.ml2_odl.password
required_opts = ('url', 'username', 'password')
for opt in required_opts:
if not getattr(self, opt):
raise cfg.RequiredOptError(opt, 'ml2_odl')
self.odl_drv = mech_driver.OpenDaylightDriver()
# Postcommit hooks are used to trigger synchronization.
def create_network_postcommit(self, context):
self.odl_drv.synchronize('create', odl_const.ODL_NETWORKS, context)
def update_network_postcommit(self, context):
self.odl_drv.synchronize('update', odl_const.ODL_NETWORKS, context)
def delete_network_postcommit(self, context):
self.odl_drv.synchronize('delete', odl_const.ODL_NETWORKS, context)
def create_subnet_postcommit(self, context):
self.odl_drv.synchronize('create', odl_const.ODL_SUBNETS, context)
def update_subnet_postcommit(self, context):
self.odl_drv.synchronize('update', odl_const.ODL_SUBNETS, context)
def delete_subnet_postcommit(self, context):
self.odl_drv.synchronize('delete', odl_const.ODL_SUBNETS, context)
def create_port_postcommit(self, context):
self.odl_drv.synchronize('create', odl_const.ODL_PORTS, context)
def update_port_postcommit(self, context):
self.odl_drv.synchronize('update', odl_const.ODL_PORTS, context)
def delete_port_postcommit(self, context):
self.odl_drv.synchronize('delete', odl_const.ODL_PORTS, context)
def bind_port(self, context):
self.odl_drv.bind_port(context)

View File

@ -1 +0,0 @@
networking-odl

View File

@ -1,106 +0,0 @@
# Copyright (c) 2013-2015 OpenStack Foundation
# 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 sys
import mock
from neutron import context
from neutron.tests.unit.plugins.ml2 import test_plugin
with mock.patch.dict(sys.modules,
{'networking_odl': mock.Mock(),
'networking_odl.common': mock.Mock(),
'networking_odl.ml2': mock.Mock()}):
from networking_odl.common import constants as const
from neutron.plugins.ml2.drivers.opendaylight import driver
class TestODLShim(test_plugin.Ml2PluginV2TestCase):
def setUp(self):
super(TestODLShim, self).setUp()
self.context = context.get_admin_context()
self.plugin = mock.Mock()
self.driver = driver.OpenDaylightMechanismDriver()
self.driver.odl_drv = mock.Mock()
def test_create_network_postcommit(self):
self.driver.create_network_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('create',
const.ODL_NETWORKS,
self.context)
def test_update_network_postcommit(self):
self.driver.update_network_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('update',
const.ODL_NETWORKS,
self.context)
def test_delete_network_postcommit(self):
self.driver.delete_network_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('delete',
const.ODL_NETWORKS,
self.context)
def test_create_subnet_postcommit(self):
self.driver.create_subnet_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('create',
const.ODL_SUBNETS,
self.context)
def test_update_subnet_postcommit(self):
self.driver.update_subnet_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('update',
const.ODL_SUBNETS,
self.context)
def test_delete_subnet_postcommit(self):
self.driver.delete_subnet_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('delete',
const.ODL_SUBNETS,
self.context)
def test_create_port_postcommit(self):
self.driver.create_port_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('create',
const.ODL_PORTS,
self.context)
def test_update_port_postcommit(self):
self.driver.update_port_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('update',
const.ODL_PORTS,
self.context)
def test_delete_port_postcommit(self):
self.driver.delete_port_postcommit(self.context)
self.driver.odl_drv.synchronize.assert_called_with('delete',
const.ODL_PORTS,
self.context)
def test_bind_port_delegation(self):
# given front-end with attached back-end
front_end = self.driver
front_end.odl_drv = back_end = mock.MagicMock(
spec=driver.OpenDaylightMechanismDriver)
# given PortContext to be forwarded to back-end without using
context = object()
# when binding port
front_end.bind_port(context)
# then port is bound by back-end
back_end.bind_port.assert_called_once_with(context)

View File

@ -126,7 +126,6 @@ neutron.ml2.type_drivers =
gre = neutron.plugins.ml2.drivers.type_gre:GreTypeDriver
vxlan = neutron.plugins.ml2.drivers.type_vxlan:VxlanTypeDriver
neutron.ml2.mechanism_drivers =
opendaylight = neutron.plugins.ml2.drivers.opendaylight.driver:OpenDaylightMechanismDriver
logger = neutron.tests.unit.plugins.ml2.drivers.mechanism_logger:LoggerMechanismDriver
test = neutron.tests.unit.plugins.ml2.drivers.mechanism_test:TestMechanismDriver
linuxbridge = neutron.plugins.ml2.drivers.linuxbridge.mech_driver.mech_linuxbridge:LinuxbridgeMechanismDriver