fixes broken neutron-netns-cleanup
Some configuration parameters used in neutron.agent.linux.utils
were missing. The namespace attribute in the FakeNetwork object
was missing, and used in neutron.agent.linux.dhcp. Also, the
plugin object was missing for release_dhcp_port operation.
We provide a fake plugin object to accept current and any future
plugin calls as this is meant to be an standalone tool that
should work without any RPC connectivity.
FakeNetwork was switched for neutron.agent.linux.dhcp.NetModel
to follow any future changes in NetModel.
Two wrong called_once_with_args calls without assert were fixed.
Change-Id: Ia51ea9bd4c8eea6b250858964ad5286c933702e0
Closes-Bug: #1291915
Partial-Bug: #1297875
(cherry picked from commit 907bf41afb
)
This commit is contained in:
parent
ac2718c4aa
commit
5417220fc5
@ -21,8 +21,10 @@ import eventlet
|
||||
from oslo.config import cfg
|
||||
|
||||
from neutron.agent.common import config as agent_config
|
||||
from neutron.agent import dhcp_agent
|
||||
from neutron.agent import l3_agent
|
||||
from neutron.agent.linux import dhcp
|
||||
from neutron.agent.linux import interface
|
||||
from neutron.agent.linux import ip_lib
|
||||
from neutron.agent.linux import ovs_lib
|
||||
from neutron.api.v2 import attributes
|
||||
@ -36,9 +38,12 @@ NS_MANGLING_PATTERN = ('(%s|%s)' % (dhcp.NS_PREFIX, l3_agent.NS_PREFIX) +
|
||||
attributes.UUID_PATTERN)
|
||||
|
||||
|
||||
class FakeNetwork(object):
|
||||
def __init__(self, id):
|
||||
self.id = id
|
||||
class FakeDhcpPlugin(object):
|
||||
"""Fake RPC plugin to bypass any RPC calls."""
|
||||
def __getattribute__(self, name):
|
||||
def fake_method(*args):
|
||||
pass
|
||||
return fake_method
|
||||
|
||||
|
||||
def setup_conf():
|
||||
@ -54,18 +59,14 @@ def setup_conf():
|
||||
help=_('Delete the namespace by removing all devices.')),
|
||||
]
|
||||
|
||||
opts = [
|
||||
cfg.StrOpt('dhcp_driver',
|
||||
default='neutron.agent.linux.dhcp.Dnsmasq',
|
||||
help=_("The driver used to manage the DHCP server.")),
|
||||
]
|
||||
|
||||
conf = cfg.CONF
|
||||
conf.register_cli_opts(cli_opts)
|
||||
conf.register_opts(opts)
|
||||
agent_config.register_interface_driver_opts_helper(conf)
|
||||
agent_config.register_use_namespaces_opts_helper(conf)
|
||||
agent_config.register_root_helper(conf)
|
||||
conf.register_opts(dhcp.OPTS)
|
||||
conf.register_opts(dhcp_agent.DhcpAgent.OPTS)
|
||||
conf.register_opts(interface.OPTS)
|
||||
return conf
|
||||
|
||||
|
||||
@ -76,9 +77,10 @@ def kill_dhcp(conf, namespace):
|
||||
|
||||
dhcp_driver = importutils.import_object(
|
||||
conf.dhcp_driver,
|
||||
conf,
|
||||
FakeNetwork(network_id),
|
||||
root_helper)
|
||||
conf=conf,
|
||||
network=dhcp.NetModel(conf.use_namespaces, {'id': network_id}),
|
||||
root_helper=root_helper,
|
||||
plugin=FakeDhcpPlugin())
|
||||
|
||||
if dhcp_driver.active:
|
||||
dhcp_driver.disable()
|
||||
|
@ -17,12 +17,18 @@
|
||||
|
||||
import mock
|
||||
|
||||
from neutron.agent.linux import interface
|
||||
from neutron.agent import netns_cleanup_util as util
|
||||
from neutron.tests import base
|
||||
|
||||
|
||||
class TestNetnsCleanup(base.BaseTestCase):
|
||||
|
||||
def test_setup_conf(self):
|
||||
expected_opts = interface.OPTS
|
||||
conf = util.setup_conf()
|
||||
self.assertTrue(all([opt.name in conf for opt in expected_opts]))
|
||||
|
||||
def test_kill_dhcp(self, dhcp_active=True):
|
||||
conf = mock.Mock()
|
||||
conf.AGENT.root_helper = 'sudo',
|
||||
@ -37,9 +43,10 @@ class TestNetnsCleanup(base.BaseTestCase):
|
||||
|
||||
util.kill_dhcp(conf, 'ns')
|
||||
|
||||
import_object.called_once_with('driver', conf, mock.ANY,
|
||||
conf.AGENT.root_helper,
|
||||
mock.ANY)
|
||||
expected_params = {'conf': conf, 'network': mock.ANY,
|
||||
'root_helper': conf.AGENT.root_helper,
|
||||
'plugin': mock.ANY}
|
||||
import_object.assert_called_once_with('driver', **expected_params)
|
||||
|
||||
if dhcp_active:
|
||||
driver.assert_has_calls([mock.call.disable()])
|
||||
@ -104,7 +111,8 @@ class TestNetnsCleanup(base.BaseTestCase):
|
||||
|
||||
mock_get_bridge_for_iface.assert_called_once_with(
|
||||
conf.AGENT.root_helper, 'tap1')
|
||||
ovs_br_cls.called_once_with('br-int', conf.AGENT.root_helper)
|
||||
ovs_br_cls.assert_called_once_with('br-int',
|
||||
conf.AGENT.root_helper)
|
||||
ovs_bridge.assert_has_calls(
|
||||
[mock.call.delete_port(device.name)])
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user