Merge "Add provider network resources filter for "network"" into stable/2025.1
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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."""
|
||||
|
||||
Reference in New Issue
Block a user