Merge "Add provider network resources filter for "network"" into stable/2025.1

This commit is contained in:
Zuul
2025-06-06 17:20:33 +00:00
committed by Gerrit Code Review
3 changed files with 36 additions and 24 deletions

View File

@@ -21,6 +21,7 @@ from neutron_lib.api.definitions import external_net as extnet_def
from neutron_lib.api.definitions import ip_allocation as ipalloc_apidef
from neutron_lib.api.definitions import port as port_def
from neutron_lib.api.definitions import portbindings as portbindings_def
from neutron_lib.api.definitions import provider_net as pnet_def
from neutron_lib.api.definitions import subnetpool as subnetpool_def
from neutron_lib.api import validators
from neutron_lib.callbacks import events
@@ -57,6 +58,7 @@ from neutron.common import utils
from neutron.conf import experimental as c_exp
from neutron.db import db_base_plugin_common
from neutron.db import ipam_pluggable_backend
from neutron.db.models import segment as segment_db
from neutron.db import models_v2
from neutron.db import rbac_db_mixin as rbac_mixin
from neutron.db import rbac_db_models
@@ -130,6 +132,33 @@ def _port_filter_hook(context, original_model, conditions):
return conditions
def _network_result_filter_hook(query, filters):
# This filter matches the provider network attributes, defined in
# ``neutron_lib.api.definitions.provider_net.ATTRIBUTES``.
attr_to_field = {
pnet_def.NETWORK_TYPE: segment_db.NetworkSegment.network_type,
pnet_def.PHYSICAL_NETWORK: segment_db.NetworkSegment.physical_network,
pnet_def.SEGMENTATION_ID: segment_db.NetworkSegment.segmentation_id
}
if any(attr for attr in pnet_def.ATTRIBUTES if attr in filters):
query = query.join(
segment_db.NetworkSegment,
segment_db.NetworkSegment.network_id == models_v2.Network.id)
for attr in pnet_def.ATTRIBUTES:
if attr not in filters:
continue
value = filters[attr]
field = attr_to_field[attr]
if utils.is_iterable_not_string(value):
query = query.filter(field.in_(value))
else:
query = query.filter(field == value)
return query
@registry.has_registry_receivers
class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
neutron_plugin_base_v2.NeutronPluginBaseV2,
@@ -164,6 +193,12 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
query_hook=_port_query_hook,
filter_hook=_port_filter_hook,
result_filters=None)
model_query.register_hook(
models_v2.Network,
'network',
query_hook=None,
filter_hook=None,
result_filters=_network_result_filter_hook)
return super().__new__(cls, *args, **kwargs)
@staticmethod

View File

@@ -122,10 +122,6 @@ class TypeManager(stevedore.named.NamedExtensionManager):
self.is_partial_segment)
return segments
def _match_segment(self, segment, filters):
return all(not filters.get(attr) or segment.get(attr) in filters[attr]
for attr in provider.ATTRIBUTES)
def _get_provider_segment(self, network):
# TODO(manishg): Placeholder method
# Code intended for operating on a provider segment should use
@@ -135,18 +131,6 @@ class TypeManager(stevedore.named.NamedExtensionManager):
# here we will do the job of extracting the segment information.
return network
def network_matches_filters(self, network, filters):
if not filters:
return True
if any(validators.is_attr_set(network.get(attr))
for attr in provider.ATTRIBUTES):
segments = [self._get_provider_segment(network)]
elif validators.is_attr_set(network.get(mpnet_apidef.SEGMENTS)):
segments = self._get_attribute(network, mpnet_apidef.SEGMENTS)
else:
return True
return any(self._match_segment(s, filters) for s in segments)
def _get_attribute(self, attrs, key):
value = attrs.get(key)
if value is constants.ATTR_NOT_SPECIFIED:

View File

@@ -469,12 +469,6 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
if workers:
self.add_workers(workers)
def _filter_nets_provider(self, context, networks, filters):
return [network
for network in networks
if self.type_manager.network_matches_filters(network, filters)
]
def _check_mac_update_allowed(self, orig_port, port, binding):
new_mac = port.get('mac_address')
mac_change = (new_mac is not None and
@@ -1363,8 +1357,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
net_data.append(self._make_network_dict(net, context=context))
self.type_manager.extend_networks_dict_provider(context, net_data)
nets = self._filter_nets_provider(context, net_data, filters)
return [db_utils.resource_fields(net, fields) for net in nets]
return [db_utils.resource_fields(net, fields) for net in net_data]
def get_network_contexts(self, context, network_ids):
"""Return a map of network_id to NetworkContext for network_ids."""