Skip to content

Commit 58069c0

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add provider network resources filter for "network"" into stable/2025.1
2 parents 7b376c7 + bceb866 commit 58069c0

File tree

3 files changed

+36
-24
lines changed

3 files changed

+36
-24
lines changed

neutron/db/db_base_plugin_v2.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from neutron_lib.api.definitions import ip_allocation as ipalloc_apidef
2222
from neutron_lib.api.definitions import port as port_def
2323
from neutron_lib.api.definitions import portbindings as portbindings_def
24+
from neutron_lib.api.definitions import provider_net as pnet_def
2425
from neutron_lib.api.definitions import subnetpool as subnetpool_def
2526
from neutron_lib.api import validators
2627
from neutron_lib.callbacks import events
@@ -57,6 +58,7 @@
5758
from neutron.conf import experimental as c_exp
5859
from neutron.db import db_base_plugin_common
5960
from neutron.db import ipam_pluggable_backend
61+
from neutron.db.models import segment as segment_db
6062
from neutron.db import models_v2
6163
from neutron.db import rbac_db_mixin as rbac_mixin
6264
from neutron.db import rbac_db_models
@@ -130,6 +132,33 @@ def _port_filter_hook(context, original_model, conditions):
130132
return conditions
131133

132134

135+
def _network_result_filter_hook(query, filters):
136+
# This filter matches the provider network attributes, defined in
137+
# ``neutron_lib.api.definitions.provider_net.ATTRIBUTES``.
138+
attr_to_field = {
139+
pnet_def.NETWORK_TYPE: segment_db.NetworkSegment.network_type,
140+
pnet_def.PHYSICAL_NETWORK: segment_db.NetworkSegment.physical_network,
141+
pnet_def.SEGMENTATION_ID: segment_db.NetworkSegment.segmentation_id
142+
}
143+
144+
if any(attr for attr in pnet_def.ATTRIBUTES if attr in filters):
145+
query = query.join(
146+
segment_db.NetworkSegment,
147+
segment_db.NetworkSegment.network_id == models_v2.Network.id)
148+
for attr in pnet_def.ATTRIBUTES:
149+
if attr not in filters:
150+
continue
151+
152+
value = filters[attr]
153+
field = attr_to_field[attr]
154+
if utils.is_iterable_not_string(value):
155+
query = query.filter(field.in_(value))
156+
else:
157+
query = query.filter(field == value)
158+
159+
return query
160+
161+
133162
@registry.has_registry_receivers
134163
class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
135164
neutron_plugin_base_v2.NeutronPluginBaseV2,
@@ -164,6 +193,12 @@ def __new__(cls, *args, **kwargs):
164193
query_hook=_port_query_hook,
165194
filter_hook=_port_filter_hook,
166195
result_filters=None)
196+
model_query.register_hook(
197+
models_v2.Network,
198+
'network',
199+
query_hook=None,
200+
filter_hook=None,
201+
result_filters=_network_result_filter_hook)
167202
return super().__new__(cls, *args, **kwargs)
168203

169204
@staticmethod

neutron/plugins/ml2/managers.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,6 @@ def _process_provider_create(self, network):
122122
self.is_partial_segment)
123123
return segments
124124

125-
def _match_segment(self, segment, filters):
126-
return all(not filters.get(attr) or segment.get(attr) in filters[attr]
127-
for attr in provider.ATTRIBUTES)
128-
129125
def _get_provider_segment(self, network):
130126
# TODO(manishg): Placeholder method
131127
# Code intended for operating on a provider segment should use
@@ -135,18 +131,6 @@ def _get_provider_segment(self, network):
135131
# here we will do the job of extracting the segment information.
136132
return network
137133

138-
def network_matches_filters(self, network, filters):
139-
if not filters:
140-
return True
141-
if any(validators.is_attr_set(network.get(attr))
142-
for attr in provider.ATTRIBUTES):
143-
segments = [self._get_provider_segment(network)]
144-
elif validators.is_attr_set(network.get(mpnet_apidef.SEGMENTS)):
145-
segments = self._get_attribute(network, mpnet_apidef.SEGMENTS)
146-
else:
147-
return True
148-
return any(self._match_segment(s, filters) for s in segments)
149-
150134
def _get_attribute(self, attrs, key):
151135
value = attrs.get(key)
152136
if value is constants.ATTR_NOT_SPECIFIED:

neutron/plugins/ml2/plugin.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,12 +469,6 @@ def _quota_workers(self):
469469
if workers:
470470
self.add_workers(workers)
471471

472-
def _filter_nets_provider(self, context, networks, filters):
473-
return [network
474-
for network in networks
475-
if self.type_manager.network_matches_filters(network, filters)
476-
]
477-
478472
def _check_mac_update_allowed(self, orig_port, port, binding):
479473
new_mac = port.get('mac_address')
480474
mac_change = (new_mac is not None and
@@ -1363,8 +1357,7 @@ def get_networks(self, context, filters=None, fields=None,
13631357
net_data.append(self._make_network_dict(net, context=context))
13641358

13651359
self.type_manager.extend_networks_dict_provider(context, net_data)
1366-
nets = self._filter_nets_provider(context, net_data, filters)
1367-
return [db_utils.resource_fields(net, fields) for net in nets]
1360+
return [db_utils.resource_fields(net, fields) for net in net_data]
13681361

13691362
def get_network_contexts(self, context, network_ids):
13701363
"""Return a map of network_id to NetworkContext for network_ids."""

0 commit comments

Comments
 (0)