|
20 | 20 | from neutron_understack.undersync import Undersync
|
21 | 21 |
|
22 | 22 | from .ml2_type_annotations import NetworkContext
|
| 23 | +from .ml2_type_annotations import NetworkSegmentDict |
23 | 24 | from .ml2_type_annotations import PortContext
|
24 | 25 |
|
25 | 26 | LOG = logging.getLogger(__name__)
|
@@ -369,7 +370,8 @@ def _bind_port_segment(self, context: PortContext, segment):
|
369 | 370 | vlan_group_name,
|
370 | 371 | )
|
371 | 372 |
|
372 |
| - dynamic_segment = context.allocate_dynamic_segment( |
| 373 | + current_vlan_segment = self._vlan_segment_for_physnet(context, vlan_group_name) |
| 374 | + dynamic_segment = current_vlan_segment or context.allocate_dynamic_segment( |
373 | 375 | segment={
|
374 | 376 | "network_type": p_const.TYPE_VLAN,
|
375 | 377 | "physical_network": vlan_group_name,
|
@@ -399,6 +401,21 @@ def _bind_port_segment(self, context: PortContext, segment):
|
399 | 401 | status=p_const.PORT_STATUS_ACTIVE,
|
400 | 402 | )
|
401 | 403 |
|
| 404 | + def _vlan_segment_for_physnet( |
| 405 | + self, context: PortContext, physnet: str |
| 406 | + ) -> NetworkSegmentDict | None: |
| 407 | + for segment in context.network.network_segments: |
| 408 | + if ( |
| 409 | + segment[api.NETWORK_TYPE] == p_const.TYPE_VLAN |
| 410 | + and segment[api.PHYSICAL_NETWORK] == physnet |
| 411 | + ): |
| 412 | + LOG.info( |
| 413 | + "vlan segment: %(segment)s already preset for physnet: " |
| 414 | + "%(physnet)s", |
| 415 | + {"segment": segment, "physnet": physnet}, |
| 416 | + ) |
| 417 | + return segment |
| 418 | + |
402 | 419 | def invoke_undersync(self, vlan_group_name: str):
|
403 | 420 | self.undersync.sync_devices(
|
404 | 421 | vlan_group=vlan_group_name,
|
|
0 commit comments