Remove get_ports_by_attrs by simply use args in query ports.

get_ports_by_attrs was using neutron client for obtaining ports with
specified attribites. OpenStackSDK have this OOTB, so that one can query
for ports simply by using os.network.ports(name=…, tags=[…], …), so,
there is no need for additional function.

Also, make use of previously added real port object in tests. By using
openstack.network.v2.port.Port objects we gain such confidence
that we are dealing with an port object, dict, tuple, or any other data
type, so that we can treat it accordingly in the code.

Implements: blueprint switch-to-openstacksdk
Change-Id: I7b597f7229113a598de631641bde04e083fea4b5
This commit is contained in:
Roman Dobosz 2019-12-02 16:37:55 +01:00
parent a4bc6e8c3a
commit 29e49616d1
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

@ -378,6 +378,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 = {}
@ -386,70 +387,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):
@ -530,11 +528,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
@ -575,6 +573,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:
@ -582,42 +581,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()
@ -782,11 +778,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
@ -879,7 +875,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)
@ -895,44 +891,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()