diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index ca28222fca0..9b6b18b3d07 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -27,7 +27,6 @@ OPTS = [ ] -VETH_MAX_NAME_LENGTH = 15 LOOPBACK_DEVNAME = 'lo' # NOTE(ethuleau): depend of the version of iproute2, the vlan # interface details vary. diff --git a/neutron/agent/linux/utils.py b/neutron/agent/linux/utils.py index cae4e6e4e8f..f7cdaf2f600 100644 --- a/neutron/agent/linux/utils.py +++ b/neutron/agent/linux/utils.py @@ -25,6 +25,7 @@ import tempfile from eventlet.green import subprocess from eventlet import greenthread +from neutron.common import constants from neutron.common import utils from neutron.openstack.common import excutils from neutron.openstack.common import log as logging @@ -85,12 +86,11 @@ def execute(cmd, root_helper=None, process_input=None, addl_env=None, def get_interface_mac(interface): - DEVICE_NAME_LEN = 15 MAC_START = 18 MAC_END = 24 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) info = fcntl.ioctl(s.fileno(), 0x8927, - struct.pack('256s', interface[:DEVICE_NAME_LEN])) + struct.pack('256s', interface[:constants.DEVICE_NAME_MAX_LEN])) return ''.join(['%02x:' % ord(char) for char in info[MAC_START:MAC_END]])[:-1] diff --git a/neutron/common/constants.py b/neutron/common/constants.py index cf3fb6025bc..7500cede134 100644 --- a/neutron/common/constants.py +++ b/neutron/common/constants.py @@ -119,3 +119,6 @@ IPV6_SLAAC = 'slaac' IPV6_MODES = [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC] IPV6_LLA_PREFIX = 'fe80::/64' + +# Linux interface max length +DEVICE_NAME_MAX_LEN = 15 diff --git a/neutron/plugins/common/constants.py b/neutron/plugins/common/constants.py index 438b5e34738..4cd1440996a 100644 --- a/neutron/plugins/common/constants.py +++ b/neutron/plugins/common/constants.py @@ -78,6 +78,3 @@ TYPE_LOCAL = 'local' TYPE_VXLAN = 'vxlan' TYPE_VLAN = 'vlan' TYPE_NONE = 'none' - -# The maximum length of an interface name (in Linux) -MAX_DEV_NAME_LEN = 16 diff --git a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py index a45c59a938a..ccc5ff246ac 100644 --- a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py @@ -857,20 +857,20 @@ class OVSNeutronAgent(n_rpc.RpcCallback, exceed the maximum length allowed for a linux device. Longer names are hashed to help ensure uniqueness. """ - if len(prefix + name) <= ip_lib.VETH_MAX_NAME_LENGTH: + if len(prefix + name) <= q_const.DEVICE_NAME_MAX_LEN: return prefix + name # We can't just truncate because bridges may be distinguished # by an ident at the end. A hash over the name should be unique. # Leave part of the bridge name on for easier identification hashlen = 6 - namelen = ip_lib.VETH_MAX_NAME_LENGTH - len(prefix) - hashlen + namelen = q_const.DEVICE_NAME_MAX_LEN - len(prefix) - hashlen new_name = ('%(prefix)s%(truncated)s%(hash)s' % {'prefix': prefix, 'truncated': name[0:namelen], 'hash': hashlib.sha1(name).hexdigest()[0:hashlen]}) LOG.warning(_("Creating an interface named %(name)s exceeds the " "%(limit)d character limitation. It was shortened to " "%(new_name)s to fit."), - {'name': name, 'limit': ip_lib.VETH_MAX_NAME_LENGTH, + {'name': name, 'limit': q_const.DEVICE_NAME_MAX_LEN, 'new_name': new_name}) return new_name diff --git a/neutron/tests/functional/agent/linux/base.py b/neutron/tests/functional/agent/linux/base.py index c5ea717f7f7..e8c069750ac 100644 --- a/neutron/tests/functional/agent/linux/base.py +++ b/neutron/tests/functional/agent/linux/base.py @@ -17,7 +17,7 @@ import random from neutron.agent.linux import ovs_lib from neutron.agent.linux import utils -from neutron.plugins.common import constants as q_const +from neutron.common import constants as n_const from neutron.tests import base @@ -56,7 +56,7 @@ class BaseLinuxTestCase(base.BaseTestCase): :param *args *kwargs: These will be passed to the create function. """ while True: - name = self.get_rand_name(q_const.MAX_DEV_NAME_LEN, name_prefix) + name = self.get_rand_name(n_const.DEV_NAME_MAX_LEN, name_prefix) try: return creation_func(name, *args, **kwargs) except RuntimeError: diff --git a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py index f05043da087..df49b3ce712 100644 --- a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py @@ -488,9 +488,9 @@ class TestOvsNeutronAgent(base.BaseTestCase): bridge1 = "A_REALLY_LONG_BRIDGE_NAME1" bridge2 = "A_REALLY_LONG_BRIDGE_NAME2" self.assertEqual(len(self.agent.get_veth_name('int-', bridge1)), - ip_lib.VETH_MAX_NAME_LENGTH) + n_const.DEVICE_NAME_MAX_LEN) self.assertEqual(len(self.agent.get_veth_name('int-', bridge2)), - ip_lib.VETH_MAX_NAME_LENGTH) + n_const.DEVICE_NAME_MAX_LEN) self.assertNotEqual(self.agent.get_veth_name('int-', bridge1), self.agent.get_veth_name('int-', bridge2))