Merge "Remove get_ports_by_attrs by simply use args in query ports."

This commit is contained in:
Zuul 2020-01-26 11:52:16 +00:00 committed by Gerrit Code Review
commit 0388766386
3 changed files with 222 additions and 277 deletions

View File

@ -553,9 +553,3 @@ def get_port_annot_pci_info(nodename, neutron_port):
LOG.exception('Exception when reading annotations '
'%s and converting from json', annot_name)
return pci_info
def get_ports_by_attrs(**attrs):
neutron = clients.get_neutron_client()
ports = neutron.list_ports(**attrs)
return ports['ports']

View File

@ -384,6 +384,7 @@ class BaseVIFPool(base.VIFPoolDriver):
# precreated subports. For instance by shutting down and up a
# kubernetes Worker VM with subports already attached, and the
# controller is restarted in between.
os_net = clients.get_network_client()
parent_ports = {}
subports = {}
subnets = {}
@ -392,70 +393,67 @@ class BaseVIFPool(base.VIFPoolDriver):
tags = config.CONF.neutron_defaults.resource_tags
if tags:
attrs['tags'] = tags
# TODO(gryf): look out for the object type in list when c_utils will
# be migrated to OpenstackSDK
all_active_ports = c_utils.get_ports_by_attrs(**attrs)
all_active_ports = os_net.ports(**attrs)
in_use_ports = self._get_in_use_ports()
for port in all_active_ports:
trunk_details = port.get('trunk_details')
# Parent port
if trunk_details:
parent_ports[trunk_details['trunk_id']] = {
'ip': port['fixed_ips'][0]['ip_address'],
'subports': trunk_details['sub_ports']}
if port.trunk_details:
parent_ports[port.trunk_details['trunk_id']] = {
'ip': port.fixed_ips[0]['ip_address'],
'subports': port.trunk_details['sub_ports']}
else:
# Filter to only get subports that are not in use
if (port['id'] not in in_use_ports and
port['device_owner'] in ['trunk:subport',
kl_const.DEVICE_OWNER]):
subports[port['id']] = port
if (port.id not in in_use_ports and
port.device_owner in ['trunk:subport',
kl_const.DEVICE_OWNER]):
subports[port.id] = port
# NOTE(ltomasbo): _get_subnet can be costly as it
# needs to call neutron to get network and subnet
# information. This ensures it is only called once
# per subnet in use
subnet_id = port['fixed_ips'][0]['subnet_id']
subnet_id = port.fixed_ips[0]['subnet_id']
if not subnets.get(subnet_id):
subnets[subnet_id] = {subnet_id:
utils.get_subnet(
subnet_id)}
utils.get_subnet(subnet_id)}
return parent_ports, subports, subnets
def _cleanup_leftover_ports(self):
os_net = clients.get_network_client()
attrs = {'device_owner': kl_const.DEVICE_OWNER, 'status': 'DOWN'}
existing_ports = c_utils.get_ports_by_attrs(**attrs)
existing_ports = os_net.ports(device_owner=kl_const.DEVICE_OWNER,
status='DOWN')
tags = config.CONF.neutron_defaults.resource_tags
if tags:
nets = os_net.networks(tags=tags)
nets_ids = [n.id for n in nets]
for port in existing_ports:
net_id = port['network_id']
net_id = port.network_id
if net_id in nets_ids:
if port.get('binding:host_id'):
if set(tags).difference(set(port.get('tags', []))):
if port.binding_host_id:
if set(tags).difference(set(port.tags)):
# delete the port if it has binding details, it
# belongs to the deployment subnet and it does not
# have the right tags
try:
os_net.delete_port(port['id'])
os_net.delete_port(port.id)
except os_exc.SDKException:
LOG.debug("Problem deleting leftover port %s. "
"Skipping.", port['id'])
"Skipping.", port.id)
else:
# delete port if they have no binding but belong to the
# deployment networks, regardless of their tagging
try:
os_net.delete_port(port['id'])
os_net.delete_port(port.id)
except os_exc.SDKException:
LOG.debug("Problem deleting leftover port %s. "
"Skipping.", port['id'])
"Skipping.", port.id)
continue
else:
for port in existing_ports:
if not port.get('binding:host_id'):
os_net.delete_port(port['id'])
if not port.binding_host_id:
os_net.delete_port(port.id)
class NeutronVIFPool(BaseVIFPool):
@ -536,11 +534,11 @@ class NeutronVIFPool(BaseVIFPool):
tags = config.CONF.neutron_defaults.resource_tags
if tags:
attrs['tags'] = tags
kuryr_ports = c_utils.get_ports_by_attrs(**attrs)
for port in kuryr_ports:
if port['id'] in self._recyclable_ports:
sg_current[port['id']] = tuple(sorted(
port['security_groups']))
for port in os_net.ports(**attrs):
if port.id in self._recyclable_ports:
sg_current[port.id] = tuple(sorted(
port.security_group_ids))
for port_id, pool_key in list(self._recyclable_ports.items()):
if (not oslo_cfg.CONF.vif_pool.ports_pool_max or
@ -581,6 +579,7 @@ class NeutronVIFPool(BaseVIFPool):
self._recovered_pools = True
def _recover_precreated_ports(self):
os_net = clients.get_network_client()
attrs = {'device_owner': kl_const.DEVICE_OWNER}
tags = config.CONF.neutron_defaults.resource_tags
if tags:
@ -588,42 +587,39 @@ class NeutronVIFPool(BaseVIFPool):
if config.CONF.kubernetes.port_debug:
attrs['name'] = constants.KURYR_PORT_NAME
available_ports = c_utils.get_ports_by_attrs(**attrs)
available_ports = os_net.ports(**attrs)
else:
kuryr_ports = c_utils.get_ports_by_attrs(**attrs)
kuryr_ports = os_net.ports(**attrs)
in_use_ports = self._get_in_use_ports()
available_ports = [port for port in kuryr_ports
if port['id'] not in in_use_ports]
if port.id not in in_use_ports]
_, available_subports, _ = self._get_trunks_info()
for port in available_ports:
# NOTE(ltomasbo): ensure subports are not considered for
# recovering in the case of multi pools
if available_subports.get(port['id']):
if available_subports.get(port.id):
continue
vif_plugin = port.get('binding:vif_type')
port_host = port['binding:host_id']
if not vif_plugin or not port_host:
if not port.binding_vif_type or not port.binding_host_id:
# NOTE(ltomasbo): kuryr-controller is running without the
# rights to get the needed information to recover the ports.
# Thus, removing the port instead
os_net = clients.get_network_client()
os_net.delete_port(port['id'])
os_net.delete_port(port.id)
continue
subnet_id = port['fixed_ips'][0]['subnet_id']
subnet_id = port.fixed_ips[0]['subnet_id']
subnet = {
subnet_id: utils.get_subnet(subnet_id)}
vif = ovu.neutron_to_osvif_vif(vif_plugin, port, subnet)
vif = ovu.neutron_to_osvif_vif(port.binding_vif_type, port, subnet)
net_obj = subnet[subnet_id]
pool_key = self._get_pool_key(port_host,
port['project_id'],
pool_key = self._get_pool_key(port.binding_host_id,
port.project_id,
net_obj.id, None)
self._existing_vifs[port['id']] = vif
self._existing_vifs[port.id] = vif
self._available_ports_pools.setdefault(
pool_key, {}).setdefault(
tuple(sorted(port['security_groups'])), []).append(
port['id'])
tuple(sorted(port.security_group_ids)), []).append(port.id)
LOG.info("PORTS POOL: pools updated with pre-created ports")
self._create_healthcheck_file()
@ -788,11 +784,11 @@ class NestedVIFPool(BaseVIFPool):
tags = config.CONF.neutron_defaults.resource_tags
if tags:
attrs['tags'] = tags
kuryr_subports = c_utils.get_ports_by_attrs(**attrs)
kuryr_subports = os_net.ports(**attrs)
for subport in kuryr_subports:
if subport['id'] in self._recyclable_ports:
sg_current[subport['id']] = tuple(sorted(
subport['security_groups']))
if subport.id in self._recyclable_ports:
sg_current[subport.id] = tuple(sorted(
subport.security_group_ids))
for port_id, pool_key in list(self._recyclable_ports.items()):
if (not oslo_cfg.CONF.vif_pool.ports_pool_max or
@ -885,7 +881,7 @@ class NestedVIFPool(BaseVIFPool):
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()
port_ids_to_delete = [p_id for p_id in available_subports
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)
@ -901,44 +897,46 @@ class NestedVIFPool(BaseVIFPool):
for subport in parent_port.get('subports'):
kuryr_subport = available_subports.get(subport['port_id'])
if kuryr_subport:
subnet_id = kuryr_subport['fixed_ips'][0]['subnet_id']
subnet = subnets[subnet_id]
net_obj = subnet[subnet_id]
pool_key = self._get_pool_key(host_addr,
kuryr_subport['project_id'],
net_obj.id, None)
if not kuryr_subport:
continue
if action == 'recover':
vif = ovu.neutron_to_osvif_vif_nested_vlan(
kuryr_subport, subnet, subport['segmentation_id'])
subnet_id = kuryr_subport.fixed_ips[0]['subnet_id']
subnet = subnets[subnet_id]
net_obj = subnet[subnet_id]
pool_key = self._get_pool_key(host_addr,
kuryr_subport.project_id,
net_obj.id, None)
self._existing_vifs[kuryr_subport['id']] = vif
self._available_ports_pools.setdefault(
pool_key, {}).setdefault(tuple(sorted(
kuryr_subport['security_groups'])),
[]).append(kuryr_subport['id'])
if action == 'recover':
vif = ovu.neutron_to_osvif_vif_nested_vlan(
kuryr_subport, subnet, subport['segmentation_id'])
elif action == 'free':
try:
self._drv_vif._remove_subport(trunk_id,
kuryr_subport['id'])
os_net.delete_port(kuryr_subport['id'])
self._drv_vif._release_vlan_id(
subport['segmentation_id'])
del self._existing_vifs[kuryr_subport['id']]
self._available_ports_pools[pool_key][
tuple(sorted(kuryr_subport['security_groups']
))].remove(kuryr_subport['id'])
except KeyError:
LOG.debug('Port %s is not in the ports list.',
kuryr_subport['id'])
except (os_exc.SDKException, os_exc.HttpException):
LOG.warning('Error removing the subport %s',
kuryr_subport['id'])
except ValueError:
LOG.debug('Port %s is not in the available ports '
'pool.', kuryr_subport['id'])
self._existing_vifs[kuryr_subport.id] = vif
self._available_ports_pools.setdefault(
pool_key, {}).setdefault(tuple(sorted(
kuryr_subport.security_group_ids)),
[]).append(kuryr_subport.id)
elif action == 'free':
try:
self._drv_vif._remove_subport(trunk_id,
kuryr_subport.id)
os_net.delete_port(kuryr_subport.id)
self._drv_vif._release_vlan_id(
subport['segmentation_id'])
del self._existing_vifs[kuryr_subport.id]
self._available_ports_pools[pool_key][
tuple(sorted(kuryr_subport.security_group_ids
))].remove(kuryr_subport.id)
except KeyError:
LOG.debug('Port %s is not in the ports list.',
kuryr_subport.id)
except (os_exc.SDKException, os_exc.HttpException):
LOG.warning('Error removing the subport %s',
kuryr_subport.id)
except ValueError:
LOG.debug('Port %s is not in the available ports '
'pool.', kuryr_subport.id)
@lockutils.synchronized('return_to_pool_nested')
def populate_pool(self, trunk_ip, project_id, subnets, security_groups):

View File

@ -68,48 +68,6 @@ def get_pod_name(pod):
return "%(namespace)s/%(name)s" % pod['metadata']
def get_neutron_port(port_id=None, device_owner=None, ip_address=None):
port_obj = {
'allowed_address_pairs': [],
'extra_dhcp_opts': [],
'device_owner': 'compute:kuryr',
'revision_number': 9,
'port_security_enabled': True,
'binding:profile': {},
'fixed_ips': [
{'subnet_id': 'e1942bb1-5f51-4646-9885-365b66215592',
'ip_address': '10.10.0.5'},
{'subnet_id': '4894baaf-df06-4a54-9885-9cd99d1cc245',
'ip_address': 'fd35:7db5:e3fc:0:f816:3eff:fe80:d421'}],
'id': '07cfe856-11cc-43d9-9200-ff4dc02d3620',
'security_groups': ['cfb3dfc4-7a43-4ba1-b92d-b8b2650d7f88'],
'binding:vif_details': {'port_filter': True,
'ovs_hybrid_plug': False},
'binding:vif_type': 'ovs',
'mac_address': 'fa:16:3e:80:d4:21',
'project_id': 'b6e8fb2bde594673923afc19cf168f3a',
'status': 'DOWN',
'binding:host_id': 'kuryr-devstack',
'description': '',
'tags': [],
'device_id': '',
'name': constants.KURYR_PORT_NAME,
'admin_state_up': True,
'network_id': 'ba44f957-c467-412b-b985-ae720514bc46',
'tenant_id': 'b6e8fb2bde594673923afc19cf168f3a',
'created_at': '2017-06-09T13:23:24Z',
'binding:vnic_type': 'normal'}
if ip_address:
port_obj['fixed_ips'][0].ip_address = ip_address
if port_id:
port_obj['id'] = port_id
if device_owner:
port_obj['device_owner'] = device_owner
return port_obj
@ddt.ddt
class BaseVIFPool(test_base.TestCase):
@ -363,19 +321,18 @@ class BaseVIFPool(test_base.TestCase):
self.assertEqual(resp, [])
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test_cleanup_leftover_ports(self, m_get_ports):
def test_cleanup_leftover_ports(self):
cls = vif_pool.BaseVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
net_id = port['network_id']
port = fake.get_port_obj(port_id=port_id)
net_id = port.network_id
tags = 'clusterTest'
port['tags'] = [tags]
m_get_ports.return_value = [port]
port.tags = [tags]
os_net.ports.return_value = [port]
oslo_cfg.CONF.set_override('resource_tags',
tags,
group='neutron_defaults')
@ -388,18 +345,17 @@ class BaseVIFPool(test_base.TestCase):
os_net.networks.assert_called()
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test_cleanup_leftover_ports_different_network(self, m_get_ports):
def test_cleanup_leftover_ports_different_network(self):
cls = vif_pool.BaseVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
port = fake.get_port_obj(port_id=port_id)
tags = 'clusterTest'
port['tags'] = [tags]
m_get_ports.return_value = [port]
port.tags = [tags]
os_net.ports.return_value = [port]
oslo_cfg.CONF.set_override('resource_tags',
tags,
group='neutron_defaults')
@ -411,20 +367,19 @@ class BaseVIFPool(test_base.TestCase):
os_net.networks.assert_called()
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test_cleanup_leftover_ports_no_binding(self, m_get_ports):
def test_cleanup_leftover_ports_no_binding(self):
cls = vif_pool.BaseVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
net_id = port['network_id']
port = fake.get_port_obj(port_id=port_id)
net_id = port.network_id
tags = 'clusterTest'
port['tags'] = [tags]
port['binding:host_id'] = None
m_get_ports.return_value = [port]
port.tags = [tags]
port.binding_host_id = None
os_net.ports.return_value = [port]
oslo_cfg.CONF.set_override('resource_tags',
tags,
group='neutron_defaults')
@ -435,20 +390,19 @@ class BaseVIFPool(test_base.TestCase):
cls._cleanup_leftover_ports(m_driver)
os_net.networks.assert_called()
os_net.delete_port.assert_called_once_with(port['id'])
os_net.delete_port.assert_called_once_with(port.id)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test_cleanup_leftover_ports_no_tags(self, m_get_ports):
def test_cleanup_leftover_ports_no_tags(self):
cls = vif_pool.BaseVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
net_id = port['network_id']
port = fake.get_port_obj(port_id=port_id)
net_id = port.network_id
tags = 'clusterTest'
m_get_ports.return_value = [port]
os_net.ports.return_value = [port]
oslo_cfg.CONF.set_override('resource_tags',
tags,
group='neutron_defaults')
@ -459,38 +413,36 @@ class BaseVIFPool(test_base.TestCase):
cls._cleanup_leftover_ports(m_driver)
os_net.networks.assert_called()
os_net.delete_port.assert_called_once_with(port['id'])
os_net.delete_port.assert_called_once_with(port.id)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test_cleanup_leftover_ports_no_tagging(self, m_get_ports):
def test_cleanup_leftover_ports_no_tagging(self):
cls = vif_pool.BaseVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
m_get_ports.return_value = [port]
port = fake.get_port_obj(port_id=port_id)
os_net.ports.return_value = [port]
cls._cleanup_leftover_ports(m_driver)
os_net.networks.assert_not_called()
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test_cleanup_leftover_ports_no_tagging_no_binding(self, m_get_ports):
def test_cleanup_leftover_ports_no_tagging_no_binding(self):
cls = vif_pool.BaseVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
port['binding:host_id'] = None
m_get_ports.return_value = [port]
port = fake.get_port_obj(port_id=port_id)
port.binding_host_id = None
os_net.ports.return_value = [port]
cls._cleanup_leftover_ports(m_driver)
os_net.networks.assert_not_called()
os_net.delete_port.assert_called_once_with(port['id'])
os_net.delete_port.assert_called_once_with(port.id)
@ddt.ddt
@ -697,9 +649,8 @@ class NeutronVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@ddt.data((0), (10))
def test__trigger_return_to_pool(self, max_pool, m_get_ports):
def test__trigger_return_to_pool(self, max_pool):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -717,8 +668,9 @@ class NeutronVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('port_debug',
True,
group='kubernetes')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
os_net.ports.return_value = [
munch.Munch({'id': port_id,
'security_group_ids': ['security_group_modified']})]
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -727,9 +679,8 @@ class NeutronVIFPool(test_base.TestCase):
port_id, name=constants.KURYR_PORT_NAME, device_id='')
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@ddt.data((0), (10))
def test__trigger_return_to_pool_no_update(self, max_pool, m_get_ports):
def test__trigger_return_to_pool_no_update(self, max_pool):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -747,8 +698,10 @@ class NeutronVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('port_debug',
False,
group='kubernetes')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group']}]
port = fake.get_port_obj(port_id=port_id)
port.security_group_ids = ['security_group']
os_net.ports.return_value = (p for p in [port])
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -756,8 +709,7 @@ class NeutronVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_delete_port(self, m_get_ports):
def test__trigger_return_to_pool_delete_port(self):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -774,8 +726,9 @@ class NeutronVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('ports_pool_max',
10,
group='vif_pool')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
os_net.ports.return_value = [
munch.Munch({'id': port_id,
'security_group_ids': ['security_group_modified']})]
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -783,8 +736,7 @@ class NeutronVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
os_net.delete_port.assert_called_once_with(port_id)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_update_exception(self, m_get_ports):
def test__trigger_return_to_pool_update_exception(self):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -805,8 +757,9 @@ class NeutronVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('port_debug',
True,
group='kubernetes')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
os_net.ports.return_value = [
munch.Munch({'id': port_id,
'security_group_ids': ['security_group_modified']})]
m_driver._get_pool_size.return_value = pool_length
os_net.update_port.side_effect = os_exc.SDKException
@ -816,8 +769,7 @@ class NeutronVIFPool(test_base.TestCase):
port_id, name=constants.KURYR_PORT_NAME, device_id='')
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_delete_exception(self, m_get_ports):
def test__trigger_return_to_pool_delete_exception(self):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -834,8 +786,9 @@ class NeutronVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('ports_pool_max',
5,
group='vif_pool')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
os_net.ports.return_value = [
munch.Munch({'id': port_id,
'security_group_ids': ['security_group_modified']})]
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -843,8 +796,7 @@ class NeutronVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
os_net.delete_port.assert_called_once_with(port_id)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_delete_key_error(self, m_get_ports):
def test__trigger_return_to_pool_delete_key_error(self):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -860,8 +812,9 @@ class NeutronVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('ports_pool_max',
5,
group='vif_pool')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
os_net.ports.return_value = [
munch.Munch({'id': port_id,
'security_group_ids': ['security_group_modified']})]
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -869,13 +822,12 @@ class NeutronVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_vif')
@mock.patch('kuryr_kubernetes.utils.get_subnet')
def test__recover_precreated_ports(self, m_get_subnet, m_to_osvif,
m_get_ports):
def test__recover_precreated_ports(self, m_get_subnet, m_to_osvif):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
cls_vif_driver = neutron_vif.NeutronPodVIFDriver
vif_driver = mock.MagicMock(spec=cls_vif_driver)
@ -885,17 +837,17 @@ class NeutronVIFPool(test_base.TestCase):
m_driver._available_ports_pools = {}
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id)
port = fake.get_port_obj(port_id=port_id)
filtered_ports = [port]
m_get_ports.return_value = filtered_ports
os_net.ports.return_value = filtered_ports
vif_plugin = mock.sentinel.plugin
port['binding:vif_type'] = vif_plugin
port.binding_vif_type = vif_plugin
oslo_cfg.CONF.set_override('port_debug',
False,
group='kubernetes')
subnet_id = port['fixed_ips'][0]['subnet_id']
subnet_id = port.fixed_ips[0]['subnet_id']
net_id = str(uuid.uuid4())
_net = munch.Munch({'id': net_id,
'name': None,
@ -907,30 +859,29 @@ class NeutronVIFPool(test_base.TestCase):
vif = mock.sentinel.vif
m_to_osvif.return_value = vif
pool_key = (port['binding:host_id'], port['project_id'], net_id)
pool_key = (port.binding_host_id, port.project_id, net_id)
m_driver._get_pool_key.return_value = pool_key
m_driver._get_trunks_info.return_value = ({}, {}, {})
cls._recover_precreated_ports(m_driver)
m_get_ports.assert_called_once()
os_net.ports.assert_called_once()
m_get_subnet.assert_called_with(subnet_id)
m_to_osvif.assert_called_once_with(vif_plugin, port, subnet)
self.assertEqual(m_driver._existing_vifs[port_id], vif)
self.assertEqual(m_driver._available_ports_pools[pool_key],
{tuple(port['security_groups']): [port_id]})
{tuple(port.security_group_ids): [port_id]})
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@mock.patch('kuryr_kubernetes.os_vif_util.neutron_to_osvif_vif')
@mock.patch('kuryr_kubernetes.utils.get_subnet')
def test__recover_precreated_ports_empty(self, m_get_subnet, m_to_osvif,
m_get_ports):
def test__recover_precreated_ports_empty(self, m_get_subnet, m_to_osvif):
cls = vif_pool.NeutronVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
filtered_ports = []
m_get_ports.return_value = filtered_ports
os_net.ports.return_value = filtered_ports
m_driver._get_trunks_info.return_value = ({}, {}, {})
oslo_cfg.CONF.set_override('port_debug',
@ -939,7 +890,7 @@ class NeutronVIFPool(test_base.TestCase):
cls._recover_precreated_ports(m_driver)
m_get_ports.assert_called_once()
os_net.ports.assert_called_once()
m_get_subnet.assert_not_called()
m_to_osvif.assert_not_called()
@ -1239,9 +1190,8 @@ class NestedVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@ddt.data((0), (10))
def test__trigger_return_to_pool(self, max_pool, m_get_ports):
def test__trigger_return_to_pool(self, max_pool):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -1259,8 +1209,9 @@ class NestedVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('port_debug',
True,
group='kubernetes')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
os_net.ports.return_value = [
munch.Munch({'id': port_id,
'security_group_ids': ['security_group_modified']})]
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -1270,9 +1221,8 @@ class NestedVIFPool(test_base.TestCase):
name=constants.KURYR_PORT_NAME))
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@ddt.data((0), (10))
def test__trigger_return_to_pool_no_update(self, max_pool, m_get_ports):
def test__trigger_return_to_pool_no_update(self, max_pool):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -1290,8 +1240,9 @@ class NestedVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('port_debug',
False,
group='kubernetes')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group']}]
port = fake.get_port_obj(port_id=port_id)
port.security_group_ids = ['security_group']
os_net.ports.return_value = [port]
m_driver._get_pool_size.return_value = pool_length
cls._trigger_return_to_pool(m_driver)
@ -1299,8 +1250,7 @@ class NestedVIFPool(test_base.TestCase):
os_net.update_port.assert_not_called()
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_delete_port(self, m_get_ports):
def test__trigger_return_to_pool_delete_port(self):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -1323,8 +1273,9 @@ class NestedVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('ports_pool_max',
10,
group='vif_pool')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
port = fake.get_port_obj(port_id=port_id)
port.security_group_ids = ['security_group_modified']
os_net.ports.return_value = [port]
m_driver._get_pool_size.return_value = pool_length
m_driver._get_trunk_id.return_value = trunk_id
m_driver._known_trunk_ids = {}
@ -1337,8 +1288,7 @@ class NestedVIFPool(test_base.TestCase):
m_driver._drv_vif._remove_subport.assert_called_once_with(trunk_id,
port_id)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_update_exception(self, m_get_ports):
def test__trigger_return_to_pool_update_exception(self):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
@ -1356,8 +1306,9 @@ class NestedVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('port_debug',
True,
group='kubernetes')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
port = fake.get_port_obj(port_id=port_id)
port.security_group_ids = ['security_group_modified']
os_net.ports.return_value = [port]
m_driver._get_pool_size.return_value = pool_length
os_net.update_port.side_effect = os_exc.SDKException
@ -1367,8 +1318,7 @@ class NestedVIFPool(test_base.TestCase):
port_id, name=constants.KURYR_PORT_NAME)
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_delete_exception(self, m_get_ports):
def test__trigger_return_to_pool_delete_exception(self):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
@ -1389,8 +1339,9 @@ class NestedVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('ports_pool_max',
5,
group='vif_pool')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
port = fake.get_port_obj(port_id=port_id)
port.security_group_ids = ['security_group_modified']
os_net.ports.return_value = [port]
m_driver._get_pool_size.return_value = pool_length
m_driver._get_trunk_id.return_value = trunk_id
m_driver._known_trunk_ids = {}
@ -1403,8 +1354,7 @@ class NestedVIFPool(test_base.TestCase):
port_id)
os_net.delete_port.assert_called_once_with(port_id)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__trigger_return_to_pool_delete_key_error(self, m_get_ports):
def test__trigger_return_to_pool_delete_key_error(self):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
@ -1423,8 +1373,9 @@ class NestedVIFPool(test_base.TestCase):
oslo_cfg.CONF.set_override('ports_pool_max',
5,
group='vif_pool')
m_get_ports.return_value = [
{'id': port_id, 'security_groups': ['security_group_modified']}]
port = fake.get_port_obj(port_id=port_id)
port.security_group_ids = ['security_group_modified']
os_net.ports.return_value = [port]
m_driver._get_pool_size.return_value = pool_length
m_driver._known_trunk_ids = {}
m_driver._get_trunk_id.return_value = trunk_id
@ -1452,14 +1403,14 @@ class NestedVIFPool(test_base.TestCase):
self.assertEqual(ip_address, cls._get_parent_port_ip(m_driver,
port_id))
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
@mock.patch('kuryr_kubernetes.utils.get_subnet')
def test__get_trunk_info(self, m_get_subnet, m_get_ports):
def test__get_trunk_info(self, m_get_subnet):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
trunk_port = get_neutron_port(port_id=port_id)
trunk_port = fake.get_port_obj(port_id=port_id)
trunk_id = str(uuid.uuid4())
trunk_details = {
'trunk_id': trunk_id,
@ -1467,34 +1418,35 @@ class NestedVIFPool(test_base.TestCase):
'port_id': '85104e7d-8597-4bf7-94e7-a447ef0b50f1',
'segmentation_type': 'vlan',
'segmentation_id': 4056}]}
trunk_port['trunk_details'] = trunk_details
trunk_port.trunk_details = trunk_details
subport_id = str(uuid.uuid4())
subport = get_neutron_port(port_id=subport_id,
device_owner='trunk:subport')
m_get_ports.return_value = [trunk_port, subport]
subport = fake.get_port_obj(port_id=subport_id,
device_owner='trunk:subport')
os_net.ports.return_value = [trunk_port, subport]
m_driver._get_in_use_ports.return_value = []
subnet = mock.sentinel.subnet
m_get_subnet.return_value = subnet
exp_p_ports = {trunk_id: {
'ip': trunk_port['fixed_ips'][0]['ip_address'],
'ip': trunk_port.fixed_ips[0]['ip_address'],
'subports': trunk_details['sub_ports']}}
exp_subnets = {subport['fixed_ips'][0]['subnet_id']:
{subport['fixed_ips'][0]['subnet_id']: subnet}}
exp_subnets = {subport.fixed_ips[0]['subnet_id']:
{subport.fixed_ips[0]['subnet_id']: subnet}}
r_p_ports, r_subports, r_subnets = cls._get_trunks_info(m_driver)
self.assertEqual(r_p_ports, exp_p_ports)
self.assertEqual(r_subports, {subport_id: subport})
self.assertDictEqual(r_subports[subport_id].to_dict(),
subport.to_dict())
self.assertEqual(r_subnets, exp_subnets)
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__get_trunk_info_empty(self, m_get_ports):
def test__get_trunk_info_empty(self):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
m_get_ports.return_value = []
os_net.ports.return_value = []
m_driver._get_in_use_ports.return_value = []
r_p_ports, r_subports, r_subnets = cls._get_trunks_info(m_driver)
@ -1503,14 +1455,14 @@ class NestedVIFPool(test_base.TestCase):
self.assertEqual(r_subports, {})
self.assertEqual(r_subnets, {})
@mock.patch('kuryr_kubernetes.controller.drivers.utils.get_ports_by_attrs')
def test__get_trunk_info_no_trunk_details(self, m_get_ports):
def test__get_trunk_info_no_trunk_details(self):
cls = vif_pool.NestedVIFPool
m_driver = mock.MagicMock(spec=cls)
os_net = self.useFixture(k_fix.MockNetworkClient()).client
port_id = str(uuid.uuid4())
port = get_neutron_port(port_id=port_id, device_owner='compute:nova')
m_get_ports.return_value = [port]
port = fake.get_port_obj(port_id=port_id, device_owner='compute:nova')
os_net.ports.return_value = [port]
m_driver._get_in_use_ports.return_value = []
r_p_ports, r_subports, r_subnets = cls._get_trunks_info(m_driver)
@ -1536,11 +1488,11 @@ class NestedVIFPool(test_base.TestCase):
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_neutron_port(port_id=port_id, device_owner='trunk:subport')
port = fake.get_port_obj(port_id=port_id, device_owner='trunk:subport')
p_ports = self._get_parent_ports([trunk_obj])
a_subports = {port_id: port}
subnet_id = port['fixed_ips'][0]['subnet_id']
subnet_id = port.fixed_ips[0]['subnet_id']
net_id = str(uuid.uuid4())
_net = munch.Munch({'id': net_id,
'name': None,
@ -1554,7 +1506,7 @@ class NestedVIFPool(test_base.TestCase):
vif = mock.sentinel.vif
m_to_osvif.return_value = vif
pool_key = (port['binding:host_id'], port['project_id'], net_id)
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')
@ -1562,7 +1514,7 @@ class NestedVIFPool(test_base.TestCase):
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]})
{tuple(port.security_group_ids): [port_id]})
os_net.delete_port.assert_not_called()
@mock.patch('kuryr_kubernetes.os_vif_util.'
@ -1582,14 +1534,14 @@ class NestedVIFPool(test_base.TestCase):
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_neutron_port(port_id=port_id, device_owner='trunk:subport')
port = fake.get_port_obj(port_id=port_id, device_owner='trunk:subport')
port_to_delete_id = str(uuid.uuid4())
port_to_delete = get_neutron_port(port_id=port_to_delete_id,
device_owner='trunk:subport')
port_to_delete = fake.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']
subnet_id = port.fixed_ips[0]['subnet_id']
net_id = str(uuid.uuid4())
_net = munch.Munch({'id': net_id,
'name': None,
@ -1603,7 +1555,7 @@ class NestedVIFPool(test_base.TestCase):
vif = mock.sentinel.vif
m_to_osvif.return_value = vif
pool_key = (port['binding:host_id'], port['project_id'], net_id)
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')
@ -1611,7 +1563,7 @@ class NestedVIFPool(test_base.TestCase):
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]})
{tuple(port.security_group_ids): [port_id]})
os_net.delete_port.assert_called_with(port_to_delete_id)
def test__precreated_ports_free(self):
@ -1629,11 +1581,12 @@ class NestedVIFPool(test_base.TestCase):
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_neutron_port(port_id=port_id, device_owner='trunk:subport')
port = fake.get_port_obj(port_id=port_id,
device_owner='trunk:subport')
p_ports = self._get_parent_ports([trunk_obj])
a_subports = {port_id: port}
subnet_id = port['fixed_ips'][0]['subnet_id']
subnet_id = port.fixed_ips[0]['subnet_id']
net_id = str(uuid.uuid4())
_net = munch.Munch({'id': net_id,
'name': None,
@ -1644,10 +1597,10 @@ class NestedVIFPool(test_base.TestCase):
m_driver._get_trunks_info.return_value = (p_ports, a_subports,
subnets)
pool_key = (port['binding:host_id'], port['project_id'], net_id)
pool_key = (port.binding_host_id, port.project_id, net_id)
m_driver._get_pool_key.return_value = pool_key
m_driver._available_ports_pools = {
pool_key: {tuple(port['security_groups']): [port_id]}}
pool_key: {tuple(port.security_group_ids): [port_id]}}
m_driver._existing_vifs = {port_id: mock.sentinel.vif}
cls._precreated_ports(m_driver, 'free')
@ -1659,7 +1612,7 @@ class NestedVIFPool(test_base.TestCase):
self.assertEqual(m_driver._existing_vifs, {})
self.assertEqual(m_driver._available_ports_pools[pool_key][tuple(
port['security_groups'])], [])
port.security_group_ids)], [])
@mock.patch('kuryr_kubernetes.os_vif_util.'
'neutron_to_osvif_vif_nested_vlan')
@ -1688,14 +1641,14 @@ class NestedVIFPool(test_base.TestCase):
subport_id=port_id2,
trunk_id=str(uuid.uuid4()))
port1 = get_neutron_port(port_id=port_id1,
device_owner='trunk:subport')
port2 = get_neutron_port(port_id=port_id2,
device_owner='trunk:subport')
port1 = fake.get_port_obj(port_id=port_id1,
device_owner='trunk:subport')
port2 = fake.get_port_obj(port_id=port_id2,
device_owner='trunk:subport')
p_ports = self._get_parent_ports([trunk_obj1, trunk_obj2])
a_subports = {port_id1: port1, port_id2: port2}
subnet_id = port1['fixed_ips'][0]['subnet_id']
subnet_id = port1.fixed_ips[0]['subnet_id']
net_id = str(uuid.uuid4())
_net = munch.Munch({'id': net_id,
'name': None,
@ -1739,14 +1692,14 @@ class NestedVIFPool(test_base.TestCase):
trunk_obj['sub_ports'].append({'port_id': port_id2,
'segmentation_type': 'vlan',
'segmentation_id': 101})
port1 = get_neutron_port(port_id=port_id1,
device_owner='trunk:subport')
port2 = get_neutron_port(port_id=port_id2,
device_owner='trunk:subport')
port1 = fake.get_port_obj(port_id=port_id1,
device_owner='trunk:subport')
port2 = fake.get_port_obj(port_id=port_id2,
device_owner='trunk:subport')
p_ports = self._get_parent_ports([trunk_obj])
a_subports = {port_id1: port1, port_id2: port2}
subnet_id = port1['fixed_ips'][0]['subnet_id']
subnet_id = port1.fixed_ips[0]['subnet_id']
net_id = str(uuid.uuid4())
_net = munch.Munch({'id': net_id,
'name': None,
@ -1761,7 +1714,7 @@ class NestedVIFPool(test_base.TestCase):
vif = mock.sentinel.vif
m_to_osvif.return_value = vif
pool_key = (port1['binding:host_id'], port1['project_id'], net_id)
pool_key = (port1.binding_host_id, port1.project_id, net_id)
m_driver._get_pool_key.return_value = pool_key
cls._precreated_ports(m_driver, 'recover')
@ -1769,7 +1722,7 @@ class NestedVIFPool(test_base.TestCase):
self.assertEqual(m_driver._existing_vifs, {port_id1: vif,
port_id2: vif})
self.assertEqual(m_driver._available_ports_pools[pool_key],
{tuple(port1['security_groups']): [port_id1,
{tuple(port1.security_group_ids): [port_id1,
port_id2]})
os_net.delete_port.assert_not_called()