Skip to content

Commit

Permalink
OPENSTACK-2925: fix bulk create and delete to fit the input args.
Browse files Browse the repository at this point in the history
when bulk create the members argument type is models.MemberV2 type
when bulk delete the members type is models.MemberV2.to_api_dict
  • Loading branch information
zhang-shengping committed Nov 18, 2023
1 parent dd21259 commit 0c36fc9
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 0c36fc9

Please sign in to comment.