Make 4th octet of mac_range configurable.
Fix bug 1022739. To get OUI per cluster is not realistic. So This commit make 4th octet of mac_range configurable. By this commit, the cloud provider can allocate OUI (3 octets) + 1 extra octet range (4 octets) for each cluster. Change-Id: Ibbd27e6e7f16d73dfd3045ed60f63a38b23ea1ed
This commit is contained in:
parent
f785cf44a0
commit
894f9808ab
@ -28,9 +28,13 @@ api_paste_config = api-paste.ini
|
|||||||
# Supported values are 'keystone'(default), 'noauth'.
|
# Supported values are 'keystone'(default), 'noauth'.
|
||||||
# auth_strategy = keystone
|
# auth_strategy = keystone
|
||||||
|
|
||||||
# Base MAC address. The first 3 bytes will remain unchanged. The
|
# Base MAC address. The first 3 octets will remain unchanged. If the
|
||||||
# lower 3 bytes will be randomly generated.
|
# 4h octet is not 00, it will also used. The others will be
|
||||||
|
# randomly generated.
|
||||||
|
# 3 octet
|
||||||
# base_mac = fa:16:3e:00:00:00
|
# base_mac = fa:16:3e:00:00:00
|
||||||
|
# 4 octet
|
||||||
|
# base_mac = fa:16:3e:4f:00:00
|
||||||
|
|
||||||
# Maximum amount of retries to generate a unique MAC address
|
# Maximum amount of retries to generate a unique MAC address
|
||||||
# mac_generation_retries = 16
|
# mac_generation_retries = 16
|
||||||
|
@ -49,6 +49,12 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
|||||||
sql_connection = 'sqlite:///:memory:'
|
sql_connection = 'sqlite:///:memory:'
|
||||||
db.configure_db({'sql_connection': sql_connection,
|
db.configure_db({'sql_connection': sql_connection,
|
||||||
'base': models_v2.model_base.BASEV2})
|
'base': models_v2.model_base.BASEV2})
|
||||||
|
self._check_base_mac_format()
|
||||||
|
|
||||||
|
def _check_base_mac_format(self):
|
||||||
|
base_mac = cfg.CONF.base_mac.split(':')
|
||||||
|
if len(base_mac) != 6:
|
||||||
|
raise Exception("illegal base_mac format %s", cfg.CONF.base_mac)
|
||||||
|
|
||||||
def _get_tenant_id_for_create(self, context, resource):
|
def _get_tenant_id_for_create(self, context, resource):
|
||||||
if context.is_admin and 'tenant_id' in resource:
|
if context.is_admin and 'tenant_id' in resource:
|
||||||
@ -138,8 +144,10 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
|
|||||||
max_retries = cfg.CONF.mac_generation_retries
|
max_retries = cfg.CONF.mac_generation_retries
|
||||||
for i in range(max_retries):
|
for i in range(max_retries):
|
||||||
mac = [int(base_mac[0], 16), int(base_mac[1], 16),
|
mac = [int(base_mac[0], 16), int(base_mac[1], 16),
|
||||||
int(base_mac[2], 16), random.randint(0x00, 0x7f),
|
int(base_mac[2], 16), random.randint(0x00, 0xff),
|
||||||
random.randint(0x00, 0xff), random.randint(0x00, 0xff)]
|
random.randint(0x00, 0xff), random.randint(0x00, 0xff)]
|
||||||
|
if base_mac[3] != '00':
|
||||||
|
mac[3] = int(base_mac[3], 16)
|
||||||
mac_address = ':'.join(map(lambda x: "%02x" % x, mac))
|
mac_address = ':'.join(map(lambda x: "%02x" % x, mac))
|
||||||
if QuantumDbPluginV2._check_unique_mac(context, network_id,
|
if QuantumDbPluginV2._check_unique_mac(context, network_id,
|
||||||
mac_address):
|
mac_address):
|
||||||
|
@ -498,6 +498,30 @@ class TestPortsV2(QuantumDbPluginV2TestCase):
|
|||||||
port2 = self.deserialize(fmt, res)
|
port2 = self.deserialize(fmt, res)
|
||||||
self.assertEquals(res.status_int, 409)
|
self.assertEquals(res.status_int, 409)
|
||||||
|
|
||||||
|
def test_mac_generation(self):
|
||||||
|
cfg.CONF.set_override('base_mac', "12:34:56:00:00:00")
|
||||||
|
with self.port() as port:
|
||||||
|
mac = port['port']['mac_address']
|
||||||
|
# check that MAC address matches base MAC
|
||||||
|
base_mac = cfg.CONF.base_mac
|
||||||
|
self.assertTrue(mac.startswith("12:34:56"))
|
||||||
|
|
||||||
|
def test_mac_generation_4octet(self):
|
||||||
|
cfg.CONF.set_override('base_mac', "12:34:56:78:00:00")
|
||||||
|
with self.port() as port:
|
||||||
|
mac = port['port']['mac_address']
|
||||||
|
# check that MAC address matches base MAC
|
||||||
|
base_mac = cfg.CONF.base_mac
|
||||||
|
self.assertTrue(mac.startswith("12:34:56:78"))
|
||||||
|
|
||||||
|
def test_bad_mac_format(self):
|
||||||
|
cfg.CONF.set_override('base_mac', "bad_mac")
|
||||||
|
try:
|
||||||
|
self.plugin._check_base_mac_format()
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
self.fail("No exception for illegal base_mac format")
|
||||||
|
|
||||||
def test_mac_exhaustion(self):
|
def test_mac_exhaustion(self):
|
||||||
# rather than actually consuming all MAC (would take a LONG time)
|
# rather than actually consuming all MAC (would take a LONG time)
|
||||||
# we just raise the exception that would result.
|
# we just raise the exception that would result.
|
||||||
|
Loading…
Reference in New Issue
Block a user