Incorporate capability for multiple mac generation
The bulk port creation scenario requires the ability to generate multiple MAC addresses for the bulk added ports. This change leverages the code added in [1] to make bulk MAC creation available. [1] https://review.openstack.org/510830 Implements: blueprint speed-up-neutron-bulk-creation Depends-On: https://review.openstack.org/613149 Change-Id: Ia769dadf69781ba511a19c52998949b668963a19
This commit is contained in:
parent
ca904b254a
commit
6098fc7430
|
@ -15,6 +15,8 @@
|
|||
|
||||
import functools
|
||||
|
||||
import six
|
||||
|
||||
from neutron_lib.api.definitions import network as net_def
|
||||
from neutron_lib.api.definitions import port as port_def
|
||||
from neutron_lib.api.definitions import subnet as subnet_def
|
||||
|
@ -88,8 +90,9 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin):
|
|||
"""
|
||||
|
||||
@staticmethod
|
||||
def _generate_mac():
|
||||
return net.get_random_mac(cfg.CONF.base_mac.split(':'))
|
||||
def _generate_macs(mac_count=1):
|
||||
mac_maker = net.random_mac_generator(cfg.CONF.base_mac.split(':'))
|
||||
return [six.next(mac_maker) for x in range(mac_count)]
|
||||
|
||||
@db_api.CONTEXT_READER
|
||||
def _is_mac_in_use(self, context, network_id, mac_address):
|
||||
|
|
|
@ -1274,7 +1274,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
|
|||
raise exc.MacAddressInUse(net_id=port_data['network_id'],
|
||||
mac=mac_address)
|
||||
else:
|
||||
mac_address = self._generate_mac()
|
||||
mac_address = self._generate_macs()[0]
|
||||
db_port = models_v2.Port(mac_address=mac_address, **port_data)
|
||||
context.session.add(db_port)
|
||||
return db_port
|
||||
|
|
|
@ -41,7 +41,7 @@ from neutron.agent.linux import iptables_firewall
|
|||
from neutron.agent.linux import utils
|
||||
from neutron.common import utils as common_utils
|
||||
from neutron.conf.agent import common as config
|
||||
from neutron.db import db_base_plugin_common
|
||||
from neutron.db import db_base_plugin_common as db_base
|
||||
from neutron.plugins.ml2.drivers.linuxbridge.agent import \
|
||||
linuxbridge_neutron_agent as linuxbridge_agent
|
||||
from neutron.tests.common import base as common_base
|
||||
|
@ -687,8 +687,8 @@ class PortFixture(fixtures.Fixture):
|
|||
super(PortFixture, self).__init__()
|
||||
self.bridge = bridge
|
||||
self.namespace = namespace
|
||||
self.mac = (
|
||||
mac or db_base_plugin_common.DbBasePluginCommon._generate_mac())
|
||||
self.mac = (mac or
|
||||
db_base.DbBasePluginCommon._generate_macs()[0])
|
||||
self.port_id = port_id or uuidutils.generate_uuid()
|
||||
|
||||
@abc.abstractmethod
|
||||
|
|
|
@ -1782,8 +1782,8 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s
|
|||
# simulate duplicate mac generation to make sure DBDuplicate is retried
|
||||
responses = ['12:34:56:78:00:00', '12:34:56:78:00:00',
|
||||
'12:34:56:78:00:01']
|
||||
with mock.patch.object(net, 'get_random_mac',
|
||||
side_effect=responses) as grand_mac:
|
||||
with mock.patch.object(net, 'random_mac_generator',
|
||||
return_value=itertools.cycle(responses)) as grand_mac:
|
||||
with self.subnet() as s:
|
||||
with self.port(subnet=s) as p1, self.port(subnet=s) as p2:
|
||||
self.assertEqual('12:34:56:78:00:00',
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import re
|
||||
import warnings
|
||||
|
||||
import mock
|
||||
|
@ -50,7 +51,7 @@ class Ml2DBTestCase(testlib_api.SqlTestCase):
|
|||
network_obj.Network(self.ctx, id=network_id).create()
|
||||
|
||||
def _setup_neutron_port(self, network_id, port_id):
|
||||
mac_address = db_base_plugin_v2.NeutronDbPluginV2._generate_mac()
|
||||
mac_address = db_base_plugin_v2.NeutronDbPluginV2._generate_macs()[0]
|
||||
port = port_obj.Port(self.ctx,
|
||||
id=port_id,
|
||||
network_id=network_id,
|
||||
|
@ -287,6 +288,18 @@ class Ml2DBTestCase(testlib_api.SqlTestCase):
|
|||
port['mac_address'])
|
||||
self.assertEqual(port_id, observed_port.id)
|
||||
|
||||
def test_generating_multiple_mac_addresses(self):
|
||||
mac_regex = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"
|
||||
|
||||
macs = db_base_plugin_v2.NeutronDbPluginV2._generate_macs()
|
||||
self.assertEqual(1, len(macs))
|
||||
self.assertIsNotNone(re.search(mac_regex, macs[0]))
|
||||
|
||||
macs = db_base_plugin_v2.NeutronDbPluginV2._generate_macs(5)
|
||||
self.assertEqual(5, len(macs))
|
||||
for mac in macs:
|
||||
self.assertIsNotNone(re.search(mac_regex, mac))
|
||||
|
||||
|
||||
class Ml2DvrDBTestCase(testlib_api.SqlTestCase):
|
||||
|
||||
|
@ -301,7 +314,7 @@ class Ml2DvrDBTestCase(testlib_api.SqlTestCase):
|
|||
ports = []
|
||||
for port_id in port_ids:
|
||||
mac_address = (db_base_plugin_v2.NeutronDbPluginV2.
|
||||
_generate_mac())
|
||||
_generate_macs()[0])
|
||||
port = port_obj.Port(self.ctx,
|
||||
id=port_id,
|
||||
network_id=network_id,
|
||||
|
|
Loading…
Reference in New Issue