Set network bridge names manually
- libvirt bridge name generator allows to create only 256 names so this patch returns some logic for manual generation of bridge names. - Node network interface names are still generated by libvirt (and limited to 65536 names) Change-Id: Ife31acd300466f660f7525e8f4fd6927ae1e2158 Related-Bug: #1590419 Implements: blueprint fuel-devops-multiple-databases
This commit is contained in:
parent
0099af9c7d
commit
1955f25c4b
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
import datetime
|
import datetime
|
||||||
|
import itertools
|
||||||
import os
|
import os
|
||||||
from time import sleep
|
from time import sleep
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
|
@ -121,6 +122,8 @@ class Snapshot(object):
|
||||||
|
|
||||||
class DevopsDriver(object):
|
class DevopsDriver(object):
|
||||||
|
|
||||||
|
_device_name_generators = {}
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
connection_string="qemu:///system",
|
connection_string="qemu:///system",
|
||||||
storage_pool_name="default",
|
storage_pool_name="default",
|
||||||
|
@ -274,7 +277,7 @@ class DevopsDriver(object):
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@retry()
|
@retry(delay=3)
|
||||||
def network_define(self, network):
|
def network_define(self, network):
|
||||||
"""Define network
|
"""Define network
|
||||||
|
|
||||||
|
@ -1071,3 +1074,42 @@ class DevopsDriver(object):
|
||||||
else:
|
else:
|
||||||
logger.warning("Can't close tray: no cdrom devices "
|
logger.warning("Can't close tray: no cdrom devices "
|
||||||
"found for Node {!r}".format(node.name))
|
"found for Node {!r}".format(node.name))
|
||||||
|
|
||||||
|
def get_allocated_device_names(self):
|
||||||
|
"""Get list of existing bridge names and network devices
|
||||||
|
|
||||||
|
:rtype : List
|
||||||
|
"""
|
||||||
|
names = []
|
||||||
|
|
||||||
|
# Local Network Devices
|
||||||
|
for dev in self.conn.listAllDevices():
|
||||||
|
xml = ET.fromstring(dev.XMLDesc())
|
||||||
|
name_el = xml.find('./capability/interface')
|
||||||
|
if name_el is None:
|
||||||
|
continue
|
||||||
|
name = name_el.text
|
||||||
|
names.append(name)
|
||||||
|
|
||||||
|
# Network Bridges
|
||||||
|
for net in self.conn.listAllNetworks():
|
||||||
|
names.append(net.bridgeName())
|
||||||
|
|
||||||
|
return names
|
||||||
|
|
||||||
|
def get_available_device_name(self, prefix):
|
||||||
|
"""Get available name for bridge
|
||||||
|
|
||||||
|
:type prefix: str
|
||||||
|
:rtype : String
|
||||||
|
"""
|
||||||
|
allocated_names = self.get_allocated_device_names()
|
||||||
|
if prefix not in self._device_name_generators:
|
||||||
|
self._device_name_generators[prefix] = (
|
||||||
|
'{}{}'.format(prefix, i) for i in itertools.count())
|
||||||
|
all_names = self._device_name_generators[prefix]
|
||||||
|
|
||||||
|
for name in all_names:
|
||||||
|
if name in allocated_names:
|
||||||
|
continue
|
||||||
|
return name
|
||||||
|
|
|
@ -51,8 +51,9 @@ class LibvirtXMLBuilder(object):
|
||||||
stp_val = 'off'
|
stp_val = 'off'
|
||||||
if self.driver.stp:
|
if self.driver.stp:
|
||||||
stp_val = 'on'
|
stp_val = 'on'
|
||||||
# bridge_name will be generated by libvirt with prefix 'virbr'
|
|
||||||
network_xml.bridge(
|
network_xml.bridge(
|
||||||
|
name=self.driver.get_available_device_name(br_prefix),
|
||||||
stp=stp_val, delay="0")
|
stp=stp_val, delay="0")
|
||||||
|
|
||||||
if network.forward is not None:
|
if network.forward is not None:
|
||||||
|
|
|
@ -28,7 +28,8 @@ class BaseTestXMLBuilder(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# TODO(prmtl): make it fuzzy
|
# TODO(prmtl): make it fuzzy
|
||||||
self.volume_path = "volume_path_mock"
|
self.volume_path = "volume_path_mock"
|
||||||
self.xml_builder = LibvirtXMLBuilder(mock.Mock())
|
self.driver_mock = mock.Mock()
|
||||||
|
self.xml_builder = LibvirtXMLBuilder(self.driver_mock)
|
||||||
self.xml_builder.driver.volume_path = mock.Mock(
|
self.xml_builder.driver.volume_path = mock.Mock(
|
||||||
return_value=self.volume_path
|
return_value=self.volume_path
|
||||||
)
|
)
|
||||||
|
@ -104,12 +105,15 @@ class TestNetworkXml(BaseTestXMLBuilder):
|
||||||
self.net.has_dhcp_server = False
|
self.net.has_dhcp_server = False
|
||||||
|
|
||||||
def test_net_name_bridge_name(self):
|
def test_net_name_bridge_name(self):
|
||||||
|
self.driver_mock.get_available_device_name.return_value = 'fuelbr0'
|
||||||
xml = self.xml_builder.build_network_xml(self.net)
|
xml = self.xml_builder.build_network_xml(self.net)
|
||||||
self.assertXMLIn(
|
self.assertXMLIn(
|
||||||
'<name>{0}_{1}</name>'
|
'<name>{0}_{1}</name>'
|
||||||
''.format(self.net.environment.name, self.net.name),
|
''.format(self.net.environment.name, self.net.name),
|
||||||
xml)
|
xml)
|
||||||
self.assertXMLIn('<bridge delay="0" stp="on" />', xml)
|
self.assertXMLIn('<bridge delay="0" name="fuelbr0" stp="on" />', xml)
|
||||||
|
self.driver_mock.get_available_device_name.assert_called_once_with(
|
||||||
|
'fuelbr')
|
||||||
|
|
||||||
def test_forward(self):
|
def test_forward(self):
|
||||||
self.net.forward = "nat"
|
self.net.forward = "nat"
|
||||||
|
|
Loading…
Reference in New Issue