Kolla: Include bridge name for host's ipv4s.
Sometime we need to know if a domu's interface is conneted to a same bridge (network) as dom0's interface. This commit is to add bridge name for each ipv4 entry in the xenapi facts. Change-Id: I8a6e1507cfa2c935b18e2fed04abaa06df9b0e51
This commit is contained in:
parent
ad90523b23
commit
15f56c9f9c
@ -33,17 +33,58 @@ class CommonUtilFuncTestCase(base.TestCase):
|
||||
self.assertEqual(hostname, 'Fake_host_name')
|
||||
mock_client.ssh.assert_called_with('hostname')
|
||||
|
||||
def test_get_host_ipv4s(self):
|
||||
def test_get_iface_bridge(self):
|
||||
mock_client = mock.Mock()
|
||||
bridge = 'xapi1'
|
||||
mock_client.ssh.return_value = (0, '\n%s\n' % bridge, '')
|
||||
|
||||
ret = common_function.get_iface_bridge('fake_iface',
|
||||
mock_client)
|
||||
|
||||
self.assertEqual(ret, bridge)
|
||||
|
||||
def test_get_iface_bridge_internal(self):
|
||||
mock_client = mock.Mock()
|
||||
bridge = 'xapi1'
|
||||
err = 'ovs-vsctl: no interface named %s' % bridge
|
||||
mock_client.ssh.side_effect = [(1, '', err), # iface-to-br
|
||||
(0, '', ''), # br-exists
|
||||
]
|
||||
|
||||
ret = common_function.get_iface_bridge(bridge,
|
||||
mock_client)
|
||||
|
||||
self.assertEqual(ret, bridge)
|
||||
self.assertEqual(mock_client.ssh.call_count, 2)
|
||||
|
||||
def test_get_iface_bridge_none(self):
|
||||
mock_client = mock.Mock()
|
||||
iface = 'eth9'
|
||||
err = 'ovs-vsctl: no interface named %s' % iface
|
||||
mock_client.ssh.side_effect = [(1, '', err), # iface-to-br
|
||||
(2, '', ''), # br-exists
|
||||
]
|
||||
|
||||
ret = common_function.get_iface_bridge(iface,
|
||||
mock_client)
|
||||
|
||||
self.assertEqual(ret, None)
|
||||
self.assertEqual(mock_client.ssh.call_count, 2)
|
||||
|
||||
@mock.patch.object(common_function, 'get_iface_bridge')
|
||||
def test_get_host_ipv4s(self, mock_br):
|
||||
mock_client = mock.Mock()
|
||||
out = u'xenbr0 10.71.64.118/20\n'
|
||||
out += 'xenapi 169.254.0.1/16\n'
|
||||
mock_client.ssh.return_value = (0, out, '')
|
||||
mock_br.side_effect = ['xenbr0', 'xenapi']
|
||||
|
||||
ipv4s = common_function.get_host_ipv4s(mock_client)
|
||||
|
||||
expect = [
|
||||
{
|
||||
"address": "10.71.64.118",
|
||||
"bridge": "xenbr0",
|
||||
"broadcast": "10.71.79.255",
|
||||
"interface": "xenbr0",
|
||||
"netmask": "255.255.240.0",
|
||||
@ -51,6 +92,7 @@ class CommonUtilFuncTestCase(base.TestCase):
|
||||
},
|
||||
{
|
||||
"address": "169.254.0.1",
|
||||
"bridge": "xenapi",
|
||||
"broadcast": "169.254.255.255",
|
||||
"interface": "xenapi",
|
||||
"netmask": "255.255.0.0",
|
||||
|
@ -102,6 +102,28 @@ def get_remote_hostname(host_client):
|
||||
return hostname
|
||||
|
||||
|
||||
def get_iface_bridge(iface, host_client):
|
||||
# Get bridge name for interface in the host
|
||||
|
||||
# return 1 means that it doesn't find a bridge for this interface.
|
||||
ret, out, _ = host_client.ssh('ovs-vsctl iface-to-br %s' % iface,
|
||||
allowed_return_codes=[0, 1])
|
||||
if ret == 0:
|
||||
return out.strip()
|
||||
|
||||
# Get no bridge for this interface; check if it's the internal
|
||||
# interface for a bridge. The return code 2 means bridge with
|
||||
# this name doesn't exist.
|
||||
bridge = iface
|
||||
ret, _, _ = host_client.ssh('ovs-vsctl br-exists %s' % bridge,
|
||||
allowed_return_codes=[0, 2])
|
||||
if ret == 0:
|
||||
return bridge
|
||||
|
||||
# Reaching here, means this interface doesn't belong to any bridge.
|
||||
return None
|
||||
|
||||
|
||||
def get_host_ipv4s(host_client):
|
||||
# Get host's IPs (v4 only) via the host_client connected to the host.
|
||||
ipv4s = []
|
||||
@ -115,6 +137,7 @@ def get_host_ipv4s(host_client):
|
||||
network = net_if.network
|
||||
ipv4 = {}
|
||||
ipv4['interface'] = interface
|
||||
ipv4['bridge'] = get_iface_bridge(interface, host_client)
|
||||
ipv4['address'], _ = ipv4_address.split('/')
|
||||
ipv4['broadcast'] = str(network.broadcast_address)
|
||||
ipv4['network'] = str(network.network_address)
|
||||
|
Loading…
Reference in New Issue
Block a user