yahoo-eng-team team mailing list archive
-
yahoo-eng-team team
-
Mailing list archive
-
Message #84090
[Bug 1898657] [NEW] LB health monitor deletion fails with exception "Server-side error: "'NoneType' object has no attribute 'load_balancer_id'"
Public bug reported:
Failure statement : LB health monitor deletion fails with exception
"Server-side error: "'NoneType' object has no attribute
'load_balancer_id'"
Test executed : 1) Create LB, Virtual servers (HTTP & HTTPS), Pool, Members & Health monitors
2) Delete LB objects randomly
3) If there is a dependency to a object while its deleting, then handle exception
BadRequestException, ConflictException
Below is the HM tried to delete:
DELETE /v2.0/lbaas/healthmonitors/50ffba87-3e85-4d59-8c46-d782a8cbe8eb
octavia log trace:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:01.801 1 DEBUG vmware_nsx.services.lbaas.octavia.octavia_driver [req-
9c7ab75f-3922-4cb7-81c0-a82b9f645a0c - a0a882c114b741c6a50e2fddc68a67db - default default] vmware_nsx.services.lbaas.octavia.octavia_driver.NS
XOctaviaDriver method __init__ called with arguments () {} wrapper /usr/lib/python3.7/site-packages/oslo_log/helpers.py:66
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:01.802 1 DEBUG vmware_nsx.services.lbaas.octavia.octavia_driver [req-
9c7ab75f-3922-4cb7-81c0-a82b9f645a0c - a0a882c114b741c6a50e2fddc68a67db - default default] vmware_nsx.services.lbaas.octavia.octavia_driver.NS
XOctaviaDriver method _init_rpc_messaging called with arguments () {} wrapper /usr/lib/python3.7/site-packages/oslo_log/helpers.py:66
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:01.808 1 ERROR wsme.api [req-9c7ab75f-3922-4cb7-81c0-a82b9f645a0c - a0a882c114b741c6a50e2fddc68a67db - default default] Server-side error: "'NoneType' object has no attribute 'load_balancer_id'". Detail:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: Traceback (most recent call last):
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: File "/usr/lib/python3.7/site-packages/wsmeext/pecan.py", line 85, in callfunction
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: result = f(self, *args, **kwargs)
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: File
"/usr/lib/python3.7/sitepackages/octavia/api/v2/controllers/health_monitor.py", line 413, in delete
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: self._test_lb_and_listener_and_pool_statuses(lock_session, db_hm)
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: File "/usr/lib/python3.7/site-packages/octavia/api/v2/controllers/health_monitor.py"
, line 94, in _test_lb_and_listener_and_pool_statuses
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: load_balancer_id = pool.load_balancer_id
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: AttributeError: 'NoneType' object has no attribute 'load_balancer_id'
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:23 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:23.215 1 DEBUG vmware_nsx.services.lbaas.octavia.octavia_driver [req-
b2a8b23c-485c-4257-9f00-5a8f581a5387 - a0a882c114b741c6a50e2fddc68a67db - default default] vmware_nsx.services.lbaas.octavia.octavia_driver.NS
XOctaviaDriver method __init__ called with arguments () {} wrapper /usr/lib/python3.7/site packages/oslo_log/helpers.py:66
Test executed:
@pytest.mark.esxitest
@pytest.mark.usefixtures("do_cleanup")
def test_lb_and_delete_in_random_order_TC27(lb, nsxvc, cloud):
''' As part of this test case a LB topology will be brought up.
Different components of the LB will be tried to be deleted
in random order '''
_test_case = inspect.stack()[0][3].split("_")[-1]
router, network, subnet =\
ru.create_net_subnet_rtr_lb(cloud, _test_case)
lb, lsnr, pool, hm, lbfip, mem1, mem2 =\
create_general_roundrobin_lb_topo(_test_case,
network, subnet, router, cloud, nsxvc)
# Creating a dictionary of the LB resources
# Format of dictionary is same as clenaup.py since we are going to
# use delete functions of cleanup.py
clean_lb_res = Clean(cloud, _test_case)
clean_lb_res.resources = {"lbs": [lb],
"listeners": [lsnr],
"pools": [pool],
"health_monitors": [hm],
"pool_members": [{pool.id: [mem1, mem2]}]}
# Below loop will try for 5 mins to randomly delete lb resources.
# After 5 mins the test case will fail.
lb_keys = clean_lb_res.resources.keys()
start_time = time.time()
while lb_keys and time.time() - start_time < 300:
# Randomly select one lb resource
indx = randrange(0, len(lb_keys))
lb_res = lb_keys[indx]
# Start deleting the resource
try:
func_name = "delete_%s" % (lb_res)
getattr(clean_lb_res, func_name)()
# removing element from list since successfully deleted
lb_keys.remove(lb_res)
except AttributeError as e:
log.exception(e)
assert False, "Function with name %s doesn't exist" % (func_name)
except (exc.BadRequestException, exc.ConflictException) as e:
log.info("Message=%s, Response=%s, Details=%s, request_id=%s" % \
(e.message, e.response, e.details, e.request_id))
log.info("%s didn't work, selecting some other lb resource to"
" delete" % (func_name))
assert not lb_keys, "Still some resources left to be cleaned"
Test failure:
getattr(clean_lb_res, func_name)()
tests/test_load_balancer.py:1126:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cleanup.py:205: in delete_health_monitors
self.cloud.delete_health_monitor(hm)
resources.py:619: in delete_health_monitor
return self.conn.load_balancer.delete_health_monitor(healthmonitor)
systest_env/local/lib/python2.7/site-packages/openstack/load_balancer/v2/_proxy.py:471: in delete_health_monitor
ignore_missing=ignore_missing)
systest_env/local/lib/python2.7/site-packages/openstack/proxy.py:41: in check
return method(self, expected, actual, *args, **kwargs)
systest_env/local/lib/python2.7/site-packages/openstack/proxy.py:144: in _delete
rv = res.delete(self)
systest_env/local/lib/python2.7/site-packages/openstack/resource.py:876: in delete
self._translate_response(response, has_body=False, **kwargs)
systest_env/local/lib/python2.7/site-packages/openstack/resource.py:695: in _translate_response
exceptions.raise_from_response(response, error_message=error_message)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
response = <Response [500]>, error_message = None
def raise_from_response(response, error_message=None):
"""Raise an instance of an HTTPException based on keystoneauth response."""
if response.status_code < 400:
return
if response.status_code == 409:
cls = ConflictException
elif response.status_code == 404:
cls = NotFoundException
elif response.status_code == 400:
cls = BadRequestException
else:
cls = HttpException
details = None
content_type = response.headers.get('content-type', '')
if response.content and 'application/json' in content_type:
# Iterate over the nested objects to retrieve "message" attribute.
# TODO(shade) Add exception handling for times when the content type
# is lying.
try:
content = response.json()
messages = [obj.get('message') for obj in content.values()
if isinstance(obj, dict)]
# Join all of the messages together nicely and filter out any
# objects that don't have a "message" attr.
details = '\n'.join(msg for msg in messages if msg)
except Exception:
details = response.text
elif response.content and 'text/html' in content_type:
# Split the lines, strip whitespace and inline HTML from the response.
details = [re.sub(r'<.+?>', '', i.strip())
for i in response.text.splitlines()]
details = list(set([msg for msg in details if msg]))
# Return joined string separated by colons.
details = ': '.join(details)
if not details and response.reason:
details = response.reason
else:
details = response.text
http_status = response.status_code
request_id = response.headers.get('x-openstack-request-id')
raise cls(
message=error_message, response=response, details=details,
http_status=http_status, request_id=request_id
)
E HttpException: HttpException: 500: Server Error for url: https://172.18.150.100:9876/v2.0/lbaas/healthmonitors/50ffba87-3e85-4d59-8c46-d782a8cbe8eb, Internal Server Error
** Affects: neutron
Importance: Undecided
Status: New
--
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to neutron.
https://bugs.launchpad.net/bugs/1898657
Title:
LB health monitor deletion fails with exception "Server-side error:
"'NoneType' object has no attribute 'load_balancer_id'"
Status in neutron:
New
Bug description:
Failure statement : LB health monitor deletion fails with exception
"Server-side error: "'NoneType' object has no attribute
'load_balancer_id'"
Test executed : 1) Create LB, Virtual servers (HTTP & HTTPS), Pool, Members & Health monitors
2) Delete LB objects randomly
3) If there is a dependency to a object while its deleting, then handle exception
BadRequestException, ConflictException
Below is the HM tried to delete:
DELETE /v2.0/lbaas/healthmonitors/50ffba87-3e85-4d59-8c46-d782a8cbe8eb
octavia log trace:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:01.801 1 DEBUG vmware_nsx.services.lbaas.octavia.octavia_driver [req-
9c7ab75f-3922-4cb7-81c0-a82b9f645a0c - a0a882c114b741c6a50e2fddc68a67db - default default] vmware_nsx.services.lbaas.octavia.octavia_driver.NS
XOctaviaDriver method __init__ called with arguments () {} wrapper /usr/lib/python3.7/site-packages/oslo_log/helpers.py:66
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:01.802 1 DEBUG vmware_nsx.services.lbaas.octavia.octavia_driver [req-
9c7ab75f-3922-4cb7-81c0-a82b9f645a0c - a0a882c114b741c6a50e2fddc68a67db - default default] vmware_nsx.services.lbaas.octavia.octavia_driver.NS
XOctaviaDriver method _init_rpc_messaging called with arguments () {} wrapper /usr/lib/python3.7/site-packages/oslo_log/helpers.py:66
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:01.808 1 ERROR wsme.api [req-9c7ab75f-3922-4cb7-81c0-a82b9f645a0c - a0a882c114b741c6a50e2fddc68a67db - default default] Server-side error: "'NoneType' object has no attribute 'load_balancer_id'". Detail:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: Traceback (most recent call last):
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: File "/usr/lib/python3.7/site-packages/wsmeext/pecan.py", line 85, in callfunction
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: result = f(self, *args, **kwargs)
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: File
"/usr/lib/python3.7/sitepackages/octavia/api/v2/controllers/health_monitor.py", line 413, in delete
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: self._test_lb_and_listener_and_pool_statuses(lock_session, db_hm)
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: File "/usr/lib/python3.7/site-packages/octavia/api/v2/controllers/health_monitor.py"
, line 94, in _test_lb_and_listener_and_pool_statuses
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: load_balancer_id = pool.load_balancer_id
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]: AttributeError: 'NoneType' object has no attribute 'load_balancer_id'
Oct 04 01:29:01 controller-ch9q6cgc8v octavia-api[805]:
Oct 04 01:29:23 controller-ch9q6cgc8v octavia-api[805]: 2020-10-04 01:29:23.215 1 DEBUG vmware_nsx.services.lbaas.octavia.octavia_driver [req-
b2a8b23c-485c-4257-9f00-5a8f581a5387 - a0a882c114b741c6a50e2fddc68a67db - default default] vmware_nsx.services.lbaas.octavia.octavia_driver.NS
XOctaviaDriver method __init__ called with arguments () {} wrapper /usr/lib/python3.7/site packages/oslo_log/helpers.py:66
Test executed:
@pytest.mark.esxitest
@pytest.mark.usefixtures("do_cleanup")
def test_lb_and_delete_in_random_order_TC27(lb, nsxvc, cloud):
''' As part of this test case a LB topology will be brought up.
Different components of the LB will be tried to be deleted
in random order '''
_test_case = inspect.stack()[0][3].split("_")[-1]
router, network, subnet =\
ru.create_net_subnet_rtr_lb(cloud, _test_case)
lb, lsnr, pool, hm, lbfip, mem1, mem2 =\
create_general_roundrobin_lb_topo(_test_case,
network, subnet, router, cloud, nsxvc)
# Creating a dictionary of the LB resources
# Format of dictionary is same as clenaup.py since we are going to
# use delete functions of cleanup.py
clean_lb_res = Clean(cloud, _test_case)
clean_lb_res.resources = {"lbs": [lb],
"listeners": [lsnr],
"pools": [pool],
"health_monitors": [hm],
"pool_members": [{pool.id: [mem1, mem2]}]}
# Below loop will try for 5 mins to randomly delete lb resources.
# After 5 mins the test case will fail.
lb_keys = clean_lb_res.resources.keys()
start_time = time.time()
while lb_keys and time.time() - start_time < 300:
# Randomly select one lb resource
indx = randrange(0, len(lb_keys))
lb_res = lb_keys[indx]
# Start deleting the resource
try:
func_name = "delete_%s" % (lb_res)
getattr(clean_lb_res, func_name)()
# removing element from list since successfully deleted
lb_keys.remove(lb_res)
except AttributeError as e:
log.exception(e)
assert False, "Function with name %s doesn't exist" % (func_name)
except (exc.BadRequestException, exc.ConflictException) as e:
log.info("Message=%s, Response=%s, Details=%s, request_id=%s" % \
(e.message, e.response, e.details, e.request_id))
log.info("%s didn't work, selecting some other lb resource to"
" delete" % (func_name))
assert not lb_keys, "Still some resources left to be cleaned"
Test failure:
getattr(clean_lb_res, func_name)()
tests/test_load_balancer.py:1126:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cleanup.py:205: in delete_health_monitors
self.cloud.delete_health_monitor(hm)
resources.py:619: in delete_health_monitor
return self.conn.load_balancer.delete_health_monitor(healthmonitor)
systest_env/local/lib/python2.7/site-packages/openstack/load_balancer/v2/_proxy.py:471: in delete_health_monitor
ignore_missing=ignore_missing)
systest_env/local/lib/python2.7/site-packages/openstack/proxy.py:41: in check
return method(self, expected, actual, *args, **kwargs)
systest_env/local/lib/python2.7/site-packages/openstack/proxy.py:144: in _delete
rv = res.delete(self)
systest_env/local/lib/python2.7/site-packages/openstack/resource.py:876: in delete
self._translate_response(response, has_body=False, **kwargs)
systest_env/local/lib/python2.7/site-packages/openstack/resource.py:695: in _translate_response
exceptions.raise_from_response(response, error_message=error_message)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
response = <Response [500]>, error_message = None
def raise_from_response(response, error_message=None):
"""Raise an instance of an HTTPException based on keystoneauth response."""
if response.status_code < 400:
return
if response.status_code == 409:
cls = ConflictException
elif response.status_code == 404:
cls = NotFoundException
elif response.status_code == 400:
cls = BadRequestException
else:
cls = HttpException
details = None
content_type = response.headers.get('content-type', '')
if response.content and 'application/json' in content_type:
# Iterate over the nested objects to retrieve "message" attribute.
# TODO(shade) Add exception handling for times when the content type
# is lying.
try:
content = response.json()
messages = [obj.get('message') for obj in content.values()
if isinstance(obj, dict)]
# Join all of the messages together nicely and filter out any
# objects that don't have a "message" attr.
details = '\n'.join(msg for msg in messages if msg)
except Exception:
details = response.text
elif response.content and 'text/html' in content_type:
# Split the lines, strip whitespace and inline HTML from the response.
details = [re.sub(r'<.+?>', '', i.strip())
for i in response.text.splitlines()]
details = list(set([msg for msg in details if msg]))
# Return joined string separated by colons.
details = ': '.join(details)
if not details and response.reason:
details = response.reason
else:
details = response.text
http_status = response.status_code
request_id = response.headers.get('x-openstack-request-id')
raise cls(
message=error_message, response=response, details=details,
http_status=http_status, request_id=request_id
)
E HttpException: HttpException: 500: Server Error for url: https://172.18.150.100:9876/v2.0/lbaas/healthmonitors/50ffba87-3e85-4d59-8c46-d782a8cbe8eb, Internal Server Error
To manage notifications about this bug go to:
https://bugs.launchpad.net/neutron/+bug/1898657/+subscriptions
Follow ups