Currently interface_exists_on_bridge[1] lists all files in a folder and
searchs for the file associated to the interface.
This change proposes to look for the file existence directly.
[1] neutron.plugins.ml2.drivers.linuxbridge.agent.linuxbridge_neutron_agent
Closes-Bug: #
1509890
Change-Id: I23cd1edc92912b35bdc23ba0af2318b86f2cfd48
# NOTE(toabctl): Don't use /sys/devices/virtual/net here because not all tap
# devices are listed here (i.e. when using Xen)
BRIDGE_FS = "/sys/class/net/"
+BRIDGE_INTERFACE_FS = BRIDGE_FS + "%(bridge)s/brif/%(interface)s"
BRIDGE_INTERFACES_FS = BRIDGE_FS + "%s/brif/"
BRIDGE_PORT_FS_FOR_DEVICE = BRIDGE_FS + "%s/brport"
VXLAN_INTERFACE_PREFIX = "vxlan-"
sys.exit(1)
return device
- def interface_exists_on_bridge(self, bridge, interface):
- directory = '/sys/class/net/%s/brif' % bridge
- for filename in os.listdir(directory):
- if filename == interface:
- return True
- return False
+ @staticmethod
+ def interface_exists_on_bridge(bridge, interface):
+ return os.path.exists(
+ BRIDGE_INTERFACE_FS % {'bridge': bridge, 'interface': interface})
def get_existing_bridge_name(self, physical_network):
if not physical_network:
from neutron.tests.common import base as common_base
from neutron.tests import tools
+UNDEFINED = object()
+
NS_PREFIX = 'test-'
BR_PREFIX = 'test-br'
PORT_PREFIX = 'test-port'
:type namespace: str
"""
- def __init__(self, prefix=BR_PREFIX):
+ def __init__(self, prefix=BR_PREFIX, namespace=UNDEFINED):
super(LinuxBridgeFixture, self).__init__()
self.prefix = prefix
+ self.namespace = namespace
def _setUp(self):
- self.namespace = self.useFixture(NamespaceFixture()).name
+ if self.namespace is UNDEFINED:
+ self.namespace = self.useFixture(NamespaceFixture()).name
self.bridge = common_base.create_resource(
self.prefix,
bridge_lib.BridgeDevice.addbr,
from neutron.plugins.ml2.drivers.linuxbridge.agent import \
linuxbridge_neutron_agent
+from neutron.tests.common import net_helpers
from neutron.tests.functional.agent.linux import test_ip_lib
LOG = logging.getLogger(__name__)
mock.patch('neutron.agent.rpc.PluginReportStateAPI').start()
cfg.CONF.set_override('enable_vxlan', False, 'VXLAN')
+ def create_bridge_port_fixture(self):
+ bridge = self.useFixture(
+ net_helpers.LinuxBridgeFixture(namespace=None)).bridge
+ port_fixture = self.useFixture(
+ net_helpers.LinuxBridgePortFixture(bridge))
+ return port_fixture
+
def test_validate_interface_mappings(self):
mappings = {'physnet1': 'int1', 'physnet2': 'int2'}
with testtools.ExpectedException(SystemExit):
self.generate_device_details()._replace(namespace=None,
name='br-eth1'))
lba.LinuxBridgeManager(mappings, {})
+
+ def test_interface_exists_on_bridge(self):
+ port_fixture = self.create_bridge_port_fixture()
+ self.assertTrue(
+ lba.LinuxBridgeManager.interface_exists_on_bridge(
+ port_fixture.bridge.name, port_fixture.br_port.name))
+
+ def test_interface_exists_not_on_bridge(self):
+ port_fixture = self.create_bridge_port_fixture()
+ self.assertFalse(
+ lba.LinuxBridgeManager.interface_exists_on_bridge(
+ port_fixture.bridge.name, port_fixture.port.name))
exit.assert_called_once_with(1)
def test_interface_exists_on_bridge(self):
- with mock.patch.object(os, 'listdir') as listdir_fn:
- listdir_fn.return_value = ["abc"]
+ with mock.patch.object(os.path, 'exists') as exists_fn:
+ exists_fn.side_effect = (
+ lambda p: p == '/sys/class/net/br-int/brif/abc')
self.assertTrue(
self.lbm.interface_exists_on_bridge("br-int", "abc")
)