Improve vip extraction for the multi-cell

The multi-cell stacks don't have networks and only tag
the ports. The code now simply mixes ports of multiple
stacks together. To resolve this we filter for the
tags of stacks in the vip ports.

Co-authored-by: Daniel Bengtsson <dbengt@redhat.com>

Change-Id: Id3eacdb631a7a7102d28ca4b9963fed3d99f2414
(cherry picked from commit 685896e50c)
This commit is contained in:
Lukas Bezdicka 2023-01-11 12:48:05 +01:00 committed by Daniel Bengtsson
parent 1b90d9f3d1
commit 32acc044a7
2 changed files with 20 additions and 87 deletions

View File

@ -96,54 +96,25 @@ EXAMPLES = '''
'''
def update_vip_data(conn, network, vip_ports, vip_data):
try:
vip = next(vip_ports)
except StopIteration:
return
if not vip.fixed_ips:
return
subnet = conn.network.get_subnet(vip.fixed_ips[0]['subnet_id'])
if (vip.dns_name is not None):
vip_data.append(dict(name=vip.name,
network=network.name,
subnet=subnet.name,
ip_address=vip.fixed_ips[0]['ip_address'],
dns_name=vip.dns_name))
else:
vip_data.append(dict(name=vip.name,
network=network.name,
subnet=subnet.name,
ip_address=vip.fixed_ips[0]['ip_address']))
def find_net_vips(conn, net_resrcs, vip_data):
for net in net_resrcs:
for res in net_resrcs[net]:
if not net_resrcs[net][res]['resource_type'] == n_utils.TYPE_NET:
continue
network = conn.network.get_network(
net_resrcs[net][res][n_utils.RES_ID])
vip_ports = conn.network.ports(
network_id=network.id,
tags='tripleo_vip_net={}'.format(network.name))
update_vip_data(conn, network, vip_ports, vip_data)
def find_ctlplane_vip(conn, vip_data):
network = conn.network.find_network('ctlplane')
vip_ports = conn.network.ports(
network_id=network.id,
name='control{}'.format(n_utils.NET_VIP_SUFFIX))
update_vip_data(conn, network, vip_ports, vip_data)
def find_net_vips(conn, stack):
return [
(dict(name=vip.name,
network=conn.network.get_network(vip['network_id'])['name'],
subnet=conn.network.get_subnet(vip.fixed_ips[0]['subnet_id'])['name'],
ip_address=vip.fixed_ips[0]['ip_address'],
dns_name=vip.dns_name))
if vip.dns_name is not None else
(dict(name=vip.name,
network=conn.network.get_network(vip['network_id'])['name'],
subnet=conn.network.get_subnet(vip.fixed_ips[0]['subnet_id'])['name'],
ip_address=vip.fixed_ips[0]['ip_address']))
for vip in conn.network.ports(tags='tripleo_stack_name={}'.format(stack))
if [x for x in vip['tags'] if x.startswith('tripleo_vip_net=')]
]
def run_module():
result = dict(
success=False,
changed=False,
@ -165,10 +136,8 @@ def run_module():
try:
_, conn = openstack_cloud_from_module(module)
net_resources = n_utils.get_overcloud_network_resources(conn, stack)
find_net_vips(conn, net_resources, result['vip_data'])
find_ctlplane_vip(conn, result['vip_data'])
result['vip_data'] = find_net_vips(conn, stack)
result['changed'] = True if result['vip_data'] else False
result['success'] = True if result['vip_data'] else False
module.exit_json(**result)

View File

@ -37,16 +37,6 @@ class TestTripleoOvercloudVipExtract(tests_base.TestCase):
self.a2g = lambda x: (n for n in x)
def test_find_net_vips(self, mock_conn):
fake_net_resources = {
'StorageNetwork': {
'InternalApiNetwork': {'physical_resource_id': 'fake-id',
'resource_type': n_utils.TYPE_NET},
'StorageSubnet': {'physical_resource_id': 'fake-id',
'resource_type': n_utils.TYPE_SUBNET},
'StorageSubnet_leaf1': {'physical_resource_id': 'fake-id',
'resource_type': n_utils.TYPE_SUBNET}
}
}
fake_network = stubs.FakeNeutronNetwork(
id='internal_api_id',
name='internal_api')
@ -55,47 +45,21 @@ class TestTripleoOvercloudVipExtract(tests_base.TestCase):
name='internal_api_subnet')
fake_vip_port = stubs.FakeNeutronPort(
id='internal_api_vip_id',
network_id='internal_api_id',
name='internal_api_virtual_ip',
fixed_ips=[{'subnet_id': 'internal_api_subnet_id',
'ip_address': '1.2.3.4'}],
tags=['tripleo_stack_name=overcloud', 'tripleo_vip_net=internal_api'],
dns_name='internalapi.localdomain'
)
mock_conn.network.get_network.return_value = fake_network
mock_conn.network.get_subnet.return_value = fake_subnet
mock_conn.network.ports.return_value = self.a2g([fake_vip_port])
vip_data = list()
plugin.find_net_vips(mock_conn, fake_net_resources, vip_data)
vip_data = plugin.find_net_vips(mock_conn, 'overcloud')
self.assertEqual([{'name': 'internal_api_virtual_ip',
'network': 'internal_api',
'subnet': 'internal_api_subnet',
'ip_address': '1.2.3.4',
'dns_name': 'internalapi.localdomain'}],
vip_data)
def test_find_ctlplane_vip(self, mock_conn):
fake_network = stubs.FakeNeutronNetwork(
id='ctlplane_id',
name='ctlplane')
fake_subnet = stubs.FakeNeutronSubnet(
id='ctlplane_subnet_id',
name='ctlplane-subnet')
fake_vip_port = stubs.FakeNeutronPort(
id='ctlplane_vip_id',
name='control_virtual_ip',
fixed_ips=[{'subnet_id': 'ctlplane_subnet_id',
'ip_address': '4.3.2.1'}],
dns_name='ctlplane.localdomain'
)
mock_conn.network.find_network.return_value = fake_network
mock_conn.network.get_subnet.return_value = fake_subnet
mock_conn.network.ports.return_value = self.a2g([fake_vip_port])
vip_data = list()
plugin.find_ctlplane_vip(mock_conn, vip_data)
self.assertEqual([{'name': 'control_virtual_ip',
'network': 'ctlplane',
'subnet': 'ctlplane-subnet',
'ip_address': '4.3.2.1',
'dns_name': 'ctlplane.localdomain'}],
vip_data)