--- ovn_octavia_provider/helper.py.orig 2024-03-27 20:17:00.000000000 +0000 +++ ovn_octavia_provider/helper.py 2024-03-31 23:19:13.747183391 +0000 @@ -2046,20 +2046,33 @@ class OvnProviderHelper(): user_fault_string=msg, operator_fault_string=msg) + def _members_in_subnet(self, ovn_lb, subnet_id): + members = [] + for key, value in ovn_lb.external_ids.items(): + if key.startswith(ovn_const.LB_EXT_IDS_MEMBER_PREFIX): + mem_id, mem_ip_port, mem_subnet = key.split('_')[1:] + #mem_ip, mem_port = mem_ip_port.split(':') + if mem_subnet == subnet_id: + members.append(mem_id) + return members + def member_delete(self, member): error_deleting_member = False try: - pool_key, ovn_lb = self._find_ovn_lb_by_pool_id( - member[constants.POOL_ID]) + pool_id = member[constants.POOL_ID] + pool_key, ovn_lb = self._find_ovn_lb_by_pool_id(pool_id) pool_status = self._remove_member(member, ovn_lb, pool_key) - if ovn_lb.health_check and pool_status == constants.OFFLINE: - # NOTE(froyo): if the pool status is OFFLINE there are no more - # members. So we should ensure the hm-port is deleted if no - # more LB are using it. We need to do this call after the - # cleaning of the ip_port_mappings for the ovn LB. - self._clean_up_hm_port(member[constants.SUBNET_ID]) + if ovn_lb.health_check: + mem_subnet = member[constants.SUBNET_ID] + member_list = self._members_in_subnet(ovn_lb, mem_subnet) + if not member_list: + # NOTE(garloff): if we were the last member in the subnet + # we should clean up the hm-port. + # (froyo) We need to do this call after the cleaning of the + # ip_port_mappings for the ovn LB. + self._clean_up_hm_port(member[constants.SUBNET_ID]) except Exception: LOG.exception(ovn_const.EXCEPTION_MSG, "deletion of member") error_deleting_member = True