Merge "Protection from subport with wrong ACTIVE status"

This commit is contained in:
Zuul 2019-11-20 10:31:00 +00:00 committed by Gerrit Code Review
commit 30b63d9f92
2 changed files with 62 additions and 2 deletions

View File

@ -905,6 +905,22 @@ class NestedVIFPool(BaseVIFPool):
if not available_subports: if not available_subports:
return return
# FIXME(ltomasbo): Workaround for ports already detached from trunks
# whose status is ACTIVE
trunks_subports = [subport_id['port_id']
for p_port in parent_ports.values()
for subport_id in p_port['subports']]
port_ids_to_delete = [p_id for p_id in available_subports.keys()
if p_id not in trunks_subports]
for port_id in port_ids_to_delete:
LOG.debug("Deleting port with wrong status: %s", port_id)
try:
neutron.delete_port(port_id)
except n_exc.PortNotFoundClient:
LOG.debug('Port already deleted: %s', port_id)
except n_exc.NeutronClientException:
LOG.exception('Error removing the port %s', port_id)
for trunk_id, parent_port in parent_ports.items(): for trunk_id, parent_port in parent_ports.items():
host_addr = parent_port.get('ip') host_addr = parent_port.get('ip')
if trunk_ips and host_addr not in trunk_ips: if trunk_ips and host_addr not in trunk_ips:

View File

@ -1545,6 +1545,51 @@ class NestedVIFPool(test_base.TestCase):
{tuple(port['security_groups']): [port_id]}) {tuple(port['security_groups']): [port_id]})
neutron.delete_port.assert_not_called() neutron.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.os_vif_util.'
'neutron_to_osvif_vif_nested_vlan')
def test__precreated_ports_recover_plus_port_cleanup(self, m_to_osvif):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
neutron = self.useFixture(k_fix.MockNeutronClient()).client
m_driver._available_ports_pools = {}
m_driver._existing_vifs = {}
oslo_cfg.CONF.set_override('port_debug',
True,
group='kubernetes')
port_id = str(uuid.uuid4())
trunk_id = str(uuid.uuid4())
trunk_obj = self._get_trunk_obj(port_id=trunk_id, subport_id=port_id)
port = get_port_obj(port_id=port_id, device_owner='trunk:subport')
port_to_delete_id = str(uuid.uuid4())
port_to_delete = get_port_obj(port_id=port_to_delete_id,
device_owner='trunk:subport')
p_ports = self._get_parent_ports([trunk_obj])
a_subports = {port_id: port, port_to_delete_id: port_to_delete}
subnet_id = port['fixed_ips'][0]['subnet_id']
net_id = str(uuid.uuid4())
network = ovu.neutron_to_osvif_network({'id': net_id})
subnets = {subnet_id: {subnet_id: network}}
m_driver._get_trunks_info.return_value = (p_ports, a_subports,
subnets)
vif = mock.sentinel.vif
m_to_osvif.return_value = vif
pool_key = (port['binding:host_id'], port['project_id'], net_id)
m_driver._get_pool_key.return_value = pool_key
cls._precreated_ports(m_driver, 'recover')
m_driver._get_trunks_info.assert_called_once()
self.assertEqual(m_driver._existing_vifs[port_id], vif)
self.assertEqual(m_driver._available_ports_pools[pool_key],
{tuple(port['security_groups']): [port_id]})
neutron.delete_port.assert_called_with(port_to_delete_id)
def test__precreated_ports_free(self): def test__precreated_ports_free(self):
cls = vif_pool.NestedVIFPool cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls) m_driver = mock.MagicMock(spec=cls)
@ -1731,13 +1776,12 @@ class NestedVIFPool(test_base.TestCase):
port = get_port_obj(port_id=port_id, device_owner='trunk:subport') port = get_port_obj(port_id=port_id, device_owner='trunk:subport')
p_ports = {} p_ports = {}
a_subports = {port_id: port} a_subports = {}
subnet_id = port['fixed_ips'][0]['subnet_id'] subnet_id = port['fixed_ips'][0]['subnet_id']
subnet = mock.sentinel.subnet subnet = mock.sentinel.subnet
subnets = {subnet_id: {subnet_id: subnet}} subnets = {subnet_id: {subnet_id: subnet}}
m_driver._get_trunks_info.return_value = (p_ports, a_subports, m_driver._get_trunks_info.return_value = (p_ports, a_subports,
subnets) subnets)
cls._precreated_ports(m_driver, m_action) cls._precreated_ports(m_driver, m_action)
m_driver._get_trunks_info.assert_called_once() m_driver._get_trunks_info.assert_called_once()
self.assertEqual(m_driver._existing_vifs, {}) self.assertEqual(m_driver._existing_vifs, {})