Fix duplicate object error messages

Fixed an issue where creation of duplicate listeners or members may have
not returned the correct error message to users.
The API would traceback with AttributeError: 'NoneType' object has no attribute 'to_dict'

 Conflicts:
	octavia/api/v2/controllers/member.py
	octavia/api/v2/controllers/listener.py

Story: 2009128
Task: 43045
Change-Id: Ibbccda5859c8c6129d43e0742b28b319b49ddd1f
(cherry picked from commit f166bb1481)
(cherry picked from commit e69899824c)
(cherry picked from commit 5647db94c9)
(cherry picked from commit ca66aac375)
(cherry picked from commit a1e22d89a4)
This commit is contained in:
Michael Johnson 2022-04-12 21:08:24 +00:00 committed by Tom Weininger
parent efeb4da03e
commit 04647d4502
2 changed files with 8 additions and 20 deletions

View File

@ -297,16 +297,10 @@ class ListenersController(base.BaseController):
lock_session, id=db_listener.id)
return db_listener
except odb_exceptions.DBDuplicateEntry as de:
column_list = ['load_balancer_id', 'protocol', 'protocol_port']
constraint_list = ['uq_listener_load_balancer_id_protocol_port']
if ['id'] == de.columns:
raise exceptions.IDAlreadyExists()
if (set(column_list) == set(de.columns) or
set(constraint_list) == set(de.columns)):
raise exceptions.DuplicateListenerEntry(
protocol=listener_dict.get('protocol'),
port=listener_dict.get('protocol_port'))
except odb_exceptions.DBDuplicateEntry as e:
raise exceptions.DuplicateListenerEntry(
protocol=listener_dict.get('protocol'),
port=listener_dict.get('protocol_port')) from e
except odb_exceptions.DBError:
raise exceptions.InvalidOption(value=listener_dict.get('protocol'),
option='protocol')

View File

@ -119,16 +119,10 @@ class MemberController(base.BaseController):
"""Validate creating member on pool."""
try:
return self.repositories.member.create(lock_session, **member_dict)
except odb_exceptions.DBDuplicateEntry as de:
column_list = ['pool_id', 'ip_address', 'protocol_port']
constraint_list = ['uq_member_pool_id_address_protocol_port']
if ['id'] == de.columns:
raise exceptions.IDAlreadyExists()
if (set(column_list) == set(de.columns) or
set(constraint_list) == set(de.columns)):
raise exceptions.DuplicateMemberEntry(
ip_address=member_dict.get('ip_address'),
port=member_dict.get('protocol_port'))
except odb_exceptions.DBDuplicateEntry as e:
raise exceptions.DuplicateMemberEntry(
ip_address=member_dict.get('ip_address'),
port=member_dict.get('protocol_port')) from e
except odb_exceptions.DBError:
# TODO(blogan): will have to do separate validation protocol
# before creation or update since the exception messages