Skip to content

Commit

Permalink
Merge pull request #1222 from zhang-shengping/V2memberToMember
Browse files Browse the repository at this point in the history
fix bulk create and delete to fit the input args
  • Loading branch information
zhang-shengping committed Nov 18, 2023
2 parents 9304ebc + 0c36fc9 commit 45ff8a4
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 10 deletions.
78 changes: 68 additions & 10 deletions f5lbaasdriver/v2/bigip/driver_v2.py
Expand Up @@ -17,7 +17,7 @@
import os
import random
import sys
from time import sleep
import time

from oslo_db import exception as db_exc
from oslo_log import helpers as log_helpers
Expand Down Expand Up @@ -62,7 +62,7 @@ def _sem_down():
sem = sem - 1
break
else:
sleep(0)
time.sleep(0)


def _sem_up():
Expand Down Expand Up @@ -354,7 +354,7 @@ def _schedule_agent_and_device(self, context, loadbalancer,
# Wait up to 1 second
wait += interval
attempt += 1
sleep(interval)
time.sleep(interval)
else:
LOG.debug("Cannot get db lock after %s attempts", attempt)
raise device_scheduler.DeviceSchedulerBusy(
Expand Down Expand Up @@ -1000,11 +1000,24 @@ def append_pools_monitors(context, loadbalancer, service):
loadbalancer_id=lb.id)
raise e

def _append_bulk_members(self, members):
dict_members = members

# TODO(x): network_map and subnet_map never used for ng. remove
# them.
def set_delta_members_for_service(
context, loadbalancer, service, network_map, subnet_map):
service['members'] = dict_members
return set_delta_members_for_service

@log_helpers.log_method_call
def create_bulk(self, context, members):
# NOTE(x): when bulk create the members argument type is
# models.MemberV2 type, when bulk delete the members type is
# models.MemberV2.to_api_dict

self._log_entity(members)
if len(members) == 0:
LOG.info("bulk of members create: no member found %s" % members)
return

# all members are belong to one subnet
Expand All @@ -1013,6 +1026,33 @@ def create_bulk(self, context, members):
member = members[0]

lb = member.pool.loadbalancer
if isinstance(lb, models.LoadBalancer):
lb = lb._as_dict()
lb['tenant_id'] = lb.pop('project_id')
lb = data_models.LoadBalancer(**lb)

member_objs = []
api_dict = []
for mb in members:
if isinstance(mb, models.MemberV2):
pool = mb.pool

mb = mb._as_dict()
mb['tenant_id'] = mb.pop('project_id')
mb = data_models.Member(**mb)

if pool:
pool = pool._as_dict()
pool['tenant_id'] = pool.pop('project_id')
mb.pool = data_models.Pool(**pool)
member_objs.append(mb)
api_dict.append(mb.to_dict(pool=False))

members = member_objs
member = members[0]

self._log_entity(members)

driver = self.driver

# Refuse to create member along with another tenant's subnet
Expand All @@ -1028,7 +1068,7 @@ def create_bulk(self, context, members):
raise Exception(
"Member and subnet are not belong to the same tenant"
)
api_dict = [mb.to_dict(pool=False) for mb in members]
append_bulk_members = self._append_bulk_members(api_dict)

def append_pools_monitors(context, loadbalancer, service):
self._append_pools_monitors(context, service, member.pool)
Expand All @@ -1039,6 +1079,7 @@ def append_pools_monitors(context, loadbalancer, service):
self._call_rpc(
context, lb, member, api_dict, 'create_bulk_member',
append_listeners=lambda *args: None,
append_members=append_bulk_members,
append_pools_monitors=append_pools_monitors,
append_l7policies_rules=lambda *args: None,
)
Expand All @@ -1049,26 +1090,42 @@ def append_pools_monitors(context, loadbalancer, service):
except Exception as e:
LOG.error("Exception: bulk of members create: %s" % e.message)

ids = [mb.id for mb in members]
ids = [m.id for m in members]
self._handle_entity_error(
context, id=ids, loadbalancer_id=lb.id)
raise e

@log_helpers.log_method_call
def delete_bulk(self, context, members):

self._log_entity(members)
# NOTE(x): when bulk create the members argument type is
# models.MemberV2 type, when bulk delete the members type is
# models.MemberV2.to_api_dict

if len(members) == 0:
LOG.info("bulk of members delete: no member found %s" % members)
return

member_objs = []
api_dict = []
for mb in members:
if isinstance(mb, dict):
mb = data_models.Member(**mb)
member_objs.append(mb)
api_dict.append(mb.to_dict(pool=False))

members = member_objs

self._log_entity(members)

driver = self.driver
# all members are belong to one subnet
# NOTE: this member is a sample, use it to check tenant and
# build service body
member = members[0]
member.pool = driver.plugin.db.get_pool(context, member.pool_id)

lb = member.pool.loadbalancer
api_dict = [mb.to_dict(pool=False) for mb in members]
append_bulk_members = self._append_bulk_members(api_dict)

def append_pools_monitors(context, loadbalancer, service):
self._append_pools_monitors(context, service, member.pool)
Expand All @@ -1078,6 +1135,7 @@ def append_pools_monitors(context, loadbalancer, service):
# Utilize default behavior to append all members
self._call_rpc(
context, lb, member, api_dict, 'delete_bulk_member',
append_members=append_bulk_members,
append_listeners=lambda *args: None,
append_pools_monitors=append_pools_monitors,
append_l7policies_rules=lambda *args: None,
Expand All @@ -1089,7 +1147,7 @@ def append_pools_monitors(context, loadbalancer, service):
except Exception as e:
LOG.error("Exception: bulk of members delete: %s" % e.message)

ids = [mb.id for mb in members]
ids = [m.id for m in members]
self._handle_entity_error(
context, id=ids, loadbalancer_id=lb.id)
raise e
Expand Down
6 changes: 6 additions & 0 deletions f5lbaasdriver/v2/bigip/service_builder.py
Expand Up @@ -159,6 +159,8 @@ def _append_pools_monitors(self, context, loadbalancer, service):
service['pools'], service['healthmonitors'] = \
self._get_pools_and_healthmonitors(context, loadbalancer)

# TODO(x): why do we set network_map and subnet_map for service again?
# _get_members never use these two arguments
@log_helpers.log_method_call
def _append_members(self, context, loadbalancer, service,
network_map, subnet_map):
Expand Down Expand Up @@ -462,12 +464,16 @@ def get_db_healthmonitor():

return pools, healthmonitors

# TODO(x) subnet_map and network_map are never used in ng.
@log_helpers.log_method_call
def _get_members(self, context, loadbalancer, pools,
subnet_map, network_map):
pool_members = []

def get_db_members():
# NOTE(x): normally, there is only one pending updated pool in
# 'pools' list.

if cfg.CONF.f5_driver_perf_mode in (1, 3):
members = []
for p1 in loadbalancer.pools:
Expand Down

0 comments on commit 45ff8a4

Please sign in to comment.