diff --git a/neutron/db/l3_hamode_db.py b/neutron/db/l3_hamode_db.py index fbe57dc7ec1..6be57e4d8d9 100644 --- a/neutron/db/l3_hamode_db.py +++ b/neutron/db/l3_hamode_db.py @@ -14,6 +14,7 @@ # import functools +import random import netaddr from neutron_lib.api.definitions import port as port_def @@ -103,6 +104,16 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin, allocated_vr_ids = set(a.vr_id for a in vr_id_objs) - set([0]) return allocated_vr_ids + def _get_vr_id(self, context, network_id): + allocated_vr_ids = self._get_allocated_vr_id(context, + network_id) + available_vr_ids = VR_ID_RANGE - allocated_vr_ids + + if not available_vr_ids: + return None + + return random.choice(list(available_vr_ids)) + @db_api.retry_if_session_inactive() def _ensure_vr_id(self, context, router_db, ha_network): router_id = router_db.id @@ -123,16 +134,12 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin, 'ha_vr_id': router_db.extra_attributes.ha_vr_id}) return - allocated_vr_ids = self._get_allocated_vr_id(context, - network_id) - available_vr_ids = VR_ID_RANGE - allocated_vr_ids - - if not available_vr_ids: + vr_id = self._get_vr_id(context, network_id) + if vr_id is None: raise l3ha_exc.NoVRIDAvailable(router_id=router_id) allocation = l3_hamode.L3HARouterVRIdAllocation( - context, network_id=network_id, - vr_id=available_vr_ids.pop()) + context, network_id=network_id, vr_id=vr_id) allocation.create() router_db.extra_attributes.ha_vr_id = allocation.vr_id