]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Make 4th octet of mac_range configurable.
authorNachi Ueno <nachi@nttmcl.com>
Fri, 3 Aug 2012 01:37:34 +0000 (01:37 +0000)
committerNachi Ueno <nachi@nttmcl.com>
Sun, 5 Aug 2012 14:06:59 +0000 (14:06 +0000)
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

etc/quantum.conf
quantum/db/db_base_plugin_v2.py
quantum/tests/unit/test_db_plugin.py

index 247bdf96eb7c9c0cb9b1d421b9b969245f8a922e..92afe415552e9c87f295f06500e201c0e8f89b01 100644 (file)
@@ -28,9 +28,13 @@ api_paste_config = api-paste.ini
 # Supported values are 'keystone'(default), 'noauth'.
 # auth_strategy = keystone
 
-# Base MAC address. The first 3 bytes will remain unchanged. The
-# lower 3 bytes will be randomly generated.
+# Base MAC address. The first 3 octets will remain unchanged. If the
+# 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
+# 4 octet
+# base_mac = fa:16:3e:4f:00:00
 
 # Maximum amount of retries to generate a unique MAC address
 # mac_generation_retries = 16
index 438ba090c28c24d849b7ec034c668425eaf3cf42..9ad7aa37d3dbdce0bc41cb2a71f3dd0508b9ada6 100644 (file)
@@ -49,6 +49,12 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
         sql_connection = 'sqlite:///:memory:'
         db.configure_db({'sql_connection': sql_connection,
                          '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):
         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
         for i in range(max_retries):
             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)]
+            if base_mac[3] != '00':
+                mac[3] = int(base_mac[3], 16)
             mac_address = ':'.join(map(lambda x: "%02x" % x, mac))
             if QuantumDbPluginV2._check_unique_mac(context, network_id,
                                                    mac_address):
index b23523e7629630af0b525534f4d0ac4594a2065e..45f9fc243a32576b221c9ef768efd313bbf9ab7e 100644 (file)
@@ -498,6 +498,30 @@ class TestPortsV2(QuantumDbPluginV2TestCase):
             port2 = self.deserialize(fmt, res)
             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):
         # rather than actually consuming all MAC (would take a LONG time)
         # we just raise the exception that would result.