Support interface drivers that don't support mtu parameter for plug_new
The method signature before Mitaka did not have the mtu= parameter. We should continue supporting the old signature, since it can be used in out of tree interface drivers. The class is part of public neutron API, so we should make an effort to not break out of tree code. Change-Id: I8e0c07c76fd0b4c55b66c20ebe29cdb7c07d6f27 Closes-Bug: #1570392
This commit is contained in:
parent
81c61a9939
commit
8a86ba1d01
|
@ -18,6 +18,7 @@ import abc
|
||||||
import netaddr
|
import netaddr
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
from oslo_log import versionutils
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from neutron._i18n import _, _LE, _LI, _LW
|
from neutron._i18n import _, _LE, _LI, _LW
|
||||||
|
@ -245,8 +246,16 @@ class LinuxInterfaceDriver(object):
|
||||||
bridge=None, namespace=None, prefix=None, mtu=None):
|
bridge=None, namespace=None, prefix=None, mtu=None):
|
||||||
if not ip_lib.device_exists(device_name,
|
if not ip_lib.device_exists(device_name,
|
||||||
namespace=namespace):
|
namespace=namespace):
|
||||||
self.plug_new(network_id, port_id, device_name, mac_address,
|
try:
|
||||||
bridge, namespace, prefix, mtu)
|
self.plug_new(network_id, port_id, device_name, mac_address,
|
||||||
|
bridge, namespace, prefix, mtu)
|
||||||
|
except TypeError:
|
||||||
|
versionutils.report_deprecated_feature(
|
||||||
|
LOG,
|
||||||
|
_LW('Interface driver does not support MTU parameter. '
|
||||||
|
'This may not work in future releases.'))
|
||||||
|
self.plug_new(network_id, port_id, device_name, mac_address,
|
||||||
|
bridge, namespace, prefix)
|
||||||
else:
|
else:
|
||||||
LOG.info(_LI("Device %s already exists"), device_name)
|
LOG.info(_LI("Device %s already exists"), device_name)
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
|
from oslo_log import versionutils
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from neutron.agent.common import config
|
from neutron.agent.common import config
|
||||||
|
@ -55,6 +56,23 @@ class FakePort(object):
|
||||||
network_id = network.id
|
network_id = network.id
|
||||||
|
|
||||||
|
|
||||||
|
class FakeInterfaceDriverNoMtu(interface.LinuxInterfaceDriver):
|
||||||
|
# NOTE(ihrachys) this method intentially omit mtu= parameter, since that
|
||||||
|
# was the method signature before Mitaka. We should make sure the old
|
||||||
|
# signature still works.
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(FakeInterfaceDriverNoMtu, self).__init__(*args, **kwargs)
|
||||||
|
self.plug_called = False
|
||||||
|
|
||||||
|
def plug_new(self, network_id, port_id, device_name, mac_address,
|
||||||
|
bridge=None, namespace=None, prefix=None):
|
||||||
|
self.plug_called = True
|
||||||
|
|
||||||
|
def unplug(self, device_name, bridge=None, namespace=None, prefix=None):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestBase(base.BaseTestCase):
|
class TestBase(base.BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestBase, self).setUp()
|
super(TestBase, self).setUp()
|
||||||
|
@ -68,6 +86,19 @@ class TestBase(base.BaseTestCase):
|
||||||
self.device_exists = self.device_exists_p.start()
|
self.device_exists = self.device_exists_p.start()
|
||||||
|
|
||||||
|
|
||||||
|
class TestABCDriverNoMtu(TestBase):
|
||||||
|
|
||||||
|
def test_plug_with_no_mtu_works(self):
|
||||||
|
driver = FakeInterfaceDriverNoMtu(self.conf)
|
||||||
|
self.device_exists.return_value = False
|
||||||
|
with mock.patch.object(
|
||||||
|
versionutils, 'report_deprecated_feature') as report:
|
||||||
|
driver.plug(
|
||||||
|
mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), mtu=9000)
|
||||||
|
self.assertTrue(driver.plug_called)
|
||||||
|
self.assertTrue(report.called)
|
||||||
|
|
||||||
|
|
||||||
class TestABCDriver(TestBase):
|
class TestABCDriver(TestBase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestABCDriver, self).setUp()
|
super(TestABCDriver, self).setUp()
|
||||||
|
|
Loading…
Reference in New Issue