Merge "Optimize return_to_pool actions at Pool drivers"
This commit is contained in:
commit
49689a553b
|
@ -221,15 +221,23 @@ class NeutronVIFPool(BaseVIFPool):
|
|||
"""Recycle ports to be reused by future pods.
|
||||
|
||||
For each port in the recyclable_ports dict it reaplies
|
||||
security group and changes the port name to available_port.
|
||||
Upon successful port update, the port_id is included in the dict
|
||||
with the available_ports.
|
||||
security group if they have been changed and it changes the port
|
||||
name to available_port if the port_debug option is enabled.
|
||||
Then the port_id is included in the dict with the available_ports.
|
||||
|
||||
If a maximun number of port per pool is set, the port will be
|
||||
deleted if the maximun has been already reached.
|
||||
"""
|
||||
neutron = clients.get_neutron_client()
|
||||
while True:
|
||||
sg_current = {}
|
||||
if not config.CONF.kubernetes.port_debug:
|
||||
kuryr_ports = self._get_ports_by_attrs(
|
||||
device_owner=kl_const.DEVICE_OWNER)
|
||||
for port in kuryr_ports:
|
||||
if port['id'] in self._recyclable_ports.keys():
|
||||
sg_current[port['id']] = port['security_groups']
|
||||
|
||||
for port_id, pool_key in self._recyclable_ports.copy().items():
|
||||
if (not oslo_cfg.CONF.vif_pool.ports_pool_max or
|
||||
self._get_pool_size(pool_key) <
|
||||
|
@ -237,20 +245,23 @@ class NeutronVIFPool(BaseVIFPool):
|
|||
port_name = (constants.KURYR_PORT_NAME
|
||||
if config.CONF.kubernetes.port_debug
|
||||
else '')
|
||||
try:
|
||||
neutron.update_port(
|
||||
port_id,
|
||||
{
|
||||
"port": {
|
||||
'name': port_name,
|
||||
'device_id': '',
|
||||
'security_groups': list(pool_key[2])
|
||||
}
|
||||
})
|
||||
except n_exc.NeutronClientException:
|
||||
LOG.warning("Error preparing port %s to be reused, put"
|
||||
" back on the cleanable pool.", port_id)
|
||||
continue
|
||||
if (config.CONF.kubernetes.port_debug or
|
||||
list(pool_key[2]) != sg_current.get(port_id)):
|
||||
try:
|
||||
neutron.update_port(
|
||||
port_id,
|
||||
{
|
||||
"port": {
|
||||
'name': port_name,
|
||||
'device_id': '',
|
||||
'security_groups': list(pool_key[2])
|
||||
}
|
||||
})
|
||||
except n_exc.NeutronClientException:
|
||||
LOG.warning("Error preparing port %s to be "
|
||||
"reused, put back on the cleanable "
|
||||
"pool.", port_id)
|
||||
continue
|
||||
self._available_ports_pools.setdefault(
|
||||
pool_key, []).append(port_id)
|
||||
else:
|
||||
|
@ -327,15 +338,23 @@ class NestedVIFPool(BaseVIFPool):
|
|||
"""Recycle ports to be reused by future pods.
|
||||
|
||||
For each port in the recyclable_ports dict it reaplies
|
||||
security group and changes the port name to available_port.
|
||||
Upon successful port update, the port_id is included in the dict
|
||||
with the available_ports.
|
||||
security group if they have been changed and it changes the port
|
||||
name to available_port if the port_debug option is enabled.
|
||||
Then the port_id is included in the dict with the available_ports.
|
||||
|
||||
If a maximun number of ports per pool is set, the port will be
|
||||
deleted if the maximun has been already reached.
|
||||
"""
|
||||
neutron = clients.get_neutron_client()
|
||||
while True:
|
||||
sg_current = {}
|
||||
if not config.CONF.kubernetes.port_debug:
|
||||
kuryr_subports = self._get_ports_by_attrs(
|
||||
device_owner=['trunk:subport', kl_const.DEVICE_OWNER])
|
||||
for subport in kuryr_subports:
|
||||
if subport['id'] in self._recyclable_ports.keys():
|
||||
sg_current[subport['id']] = subport['security_groups']
|
||||
|
||||
for port_id, pool_key in self._recyclable_ports.copy().items():
|
||||
if (not oslo_cfg.CONF.vif_pool.ports_pool_max or
|
||||
self._get_pool_size(pool_key) <
|
||||
|
@ -343,19 +362,22 @@ class NestedVIFPool(BaseVIFPool):
|
|||
port_name = (constants.KURYR_PORT_NAME
|
||||
if config.CONF.kubernetes.port_debug
|
||||
else '')
|
||||
try:
|
||||
neutron.update_port(
|
||||
port_id,
|
||||
{
|
||||
"port": {
|
||||
'name': port_name,
|
||||
'security_groups': list(pool_key[2])
|
||||
}
|
||||
})
|
||||
except n_exc.NeutronClientException:
|
||||
LOG.warning("Error preparing port %s to be reused, put"
|
||||
" back on the cleanable pool.", port_id)
|
||||
continue
|
||||
if (config.CONF.kubernetes.port_debug or
|
||||
list(pool_key[2]) != sg_current.get(port_id)):
|
||||
try:
|
||||
neutron.update_port(
|
||||
port_id,
|
||||
{
|
||||
"port": {
|
||||
'name': port_name,
|
||||
'security_groups': list(pool_key[2])
|
||||
}
|
||||
})
|
||||
except n_exc.NeutronClientException:
|
||||
LOG.warning("Error preparing port %s to be "
|
||||
"reused, put back on the cleanable "
|
||||
"pool.", port_id)
|
||||
continue
|
||||
self._available_ports_pools.setdefault(
|
||||
pool_key, []).append(port_id)
|
||||
else:
|
||||
|
|
|
@ -372,6 +372,8 @@ class NeutronVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('port_debug',
|
||||
True,
|
||||
group='kubernetes')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
|
||||
self.assertRaises(SystemExit, cls._return_ports_to_pool, m_driver)
|
||||
|
@ -387,6 +389,34 @@ class NeutronVIFPool(test_base.TestCase):
|
|||
})
|
||||
neutron.delete_port.assert_not_called()
|
||||
|
||||
@mock.patch('eventlet.sleep', side_effect=SystemExit)
|
||||
@ddt.data((0), (10))
|
||||
def test__return_ports_to_pool_no_update(self, max_pool, m_sleep):
|
||||
cls = vif_pool.NeutronVIFPool
|
||||
m_driver = mock.MagicMock(spec=cls)
|
||||
neutron = self.useFixture(k_fix.MockNeutronClient()).client
|
||||
|
||||
pool_key = ('node_ip', 'project_id', tuple(['security_group']))
|
||||
port_id = mock.sentinel.port_id
|
||||
pool_length = 5
|
||||
|
||||
m_driver._recyclable_ports = {port_id: pool_key}
|
||||
m_driver._available_ports_pools = {}
|
||||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
max_pool,
|
||||
group='vif_pool')
|
||||
oslo_cfg.CONF.set_override('port_debug',
|
||||
False,
|
||||
group='kubernetes')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
|
||||
self.assertRaises(SystemExit, cls._return_ports_to_pool, m_driver)
|
||||
|
||||
neutron.update_port.assert_not_called()
|
||||
neutron.delete_port.assert_not_called()
|
||||
|
||||
@mock.patch('eventlet.sleep', side_effect=SystemExit)
|
||||
def test__return_ports_to_pool_delete_port(self, m_sleep):
|
||||
cls = vif_pool.NeutronVIFPool
|
||||
|
@ -404,6 +434,8 @@ class NeutronVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
10,
|
||||
group='vif_pool')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
|
||||
self.assertRaises(SystemExit, cls._return_ports_to_pool, m_driver)
|
||||
|
@ -432,6 +464,8 @@ class NeutronVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('port_debug',
|
||||
True,
|
||||
group='kubernetes')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
neutron.update_port.side_effect = n_exc.NeutronClientException
|
||||
|
||||
|
@ -465,6 +499,8 @@ class NeutronVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
5,
|
||||
group='vif_pool')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
neutron.delete_port.side_effect = n_exc.PortNotFoundClient
|
||||
|
||||
|
@ -489,6 +525,8 @@ class NeutronVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
5,
|
||||
group='vif_pool')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
|
||||
self.assertRaises(SystemExit, cls._return_ports_to_pool, m_driver)
|
||||
|
@ -849,6 +887,8 @@ class NestedVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('port_debug',
|
||||
True,
|
||||
group='kubernetes')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
|
||||
self.assertRaises(SystemExit, cls._return_ports_to_pool, m_driver)
|
||||
|
@ -863,6 +903,34 @@ class NestedVIFPool(test_base.TestCase):
|
|||
})
|
||||
neutron.delete_port.assert_not_called()
|
||||
|
||||
@mock.patch('eventlet.sleep', side_effect=SystemExit)
|
||||
@ddt.data((0), (10))
|
||||
def test__return_ports_to_pool_no_update(self, max_pool, m_sleep):
|
||||
cls = vif_pool.NestedVIFPool
|
||||
m_driver = mock.MagicMock(spec=cls)
|
||||
neutron = self.useFixture(k_fix.MockNeutronClient()).client
|
||||
|
||||
pool_key = ('node_ip', 'project_id', tuple(['security_group']))
|
||||
port_id = mock.sentinel.port_id
|
||||
pool_length = 5
|
||||
|
||||
m_driver._recyclable_ports = {port_id: pool_key}
|
||||
m_driver._available_ports_pools = {}
|
||||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
max_pool,
|
||||
group='vif_pool')
|
||||
oslo_cfg.CONF.set_override('port_debug',
|
||||
False,
|
||||
group='kubernetes')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
|
||||
self.assertRaises(SystemExit, cls._return_ports_to_pool, m_driver)
|
||||
|
||||
neutron.update_port.assert_not_called()
|
||||
neutron.delete_port.assert_not_called()
|
||||
|
||||
@mock.patch('eventlet.sleep', side_effect=SystemExit)
|
||||
def test__return_ports_to_pool_delete_port(self, m_sleep):
|
||||
cls = vif_pool.NestedVIFPool
|
||||
|
@ -886,6 +954,8 @@ class NestedVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
10,
|
||||
group='vif_pool')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
m_driver._known_trunk_ids = {}
|
||||
m_driver._drv_vif._get_parent_port_by_host_ip.return_value = p_port
|
||||
|
@ -919,6 +989,8 @@ class NestedVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('port_debug',
|
||||
True,
|
||||
group='kubernetes')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
neutron.update_port.side_effect = n_exc.NeutronClientException
|
||||
|
||||
|
@ -957,6 +1029,8 @@ class NestedVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
5,
|
||||
group='vif_pool')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
neutron.delete_port.side_effect = n_exc.PortNotFoundClient
|
||||
m_driver._known_trunk_ids = {}
|
||||
|
@ -994,6 +1068,8 @@ class NestedVIFPool(test_base.TestCase):
|
|||
oslo_cfg.CONF.set_override('ports_pool_max',
|
||||
5,
|
||||
group='vif_pool')
|
||||
m_driver._get_ports_by_attrs.return_value = [
|
||||
{'id': port_id, 'security_groups': ['security_group_modified']}]
|
||||
m_driver._get_pool_size.return_value = pool_length
|
||||
m_driver._known_trunk_ids = {}
|
||||
m_driver._drv_vif._get_parent_port_by_host_ip.return_value = p_port
|
||||
|
|
Loading…
Reference in New Issue