From f166bb1481fb58acd7e7329ec394f43249001718 Mon Sep 17 00:00:00 2001 From: Michael Johnson Date: Tue, 12 Apr 2022 21:08:24 +0000 Subject: [PATCH] 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' Story: 2009128 Task: 43045 Change-Id: Ibbccda5859c8c6129d43e0742b28b319b49ddd1f --- octavia/api/v2/controllers/listener.py | 14 ++++---------- octavia/api/v2/controllers/member.py | 14 ++++---------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/octavia/api/v2/controllers/listener.py b/octavia/api/v2/controllers/listener.py index d0216a707b..0bca3b2c6e 100644 --- a/octavia/api/v2/controllers/listener.py +++ b/octavia/api/v2/controllers/listener.py @@ -333,16 +333,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 as e: raise exceptions.InvalidOption(value=listener_dict.get('protocol'), option='protocol') from e diff --git a/octavia/api/v2/controllers/member.py b/octavia/api/v2/controllers/member.py index f0c2e2ba9e..b57ea3e547 100644 --- a/octavia/api/v2/controllers/member.py +++ b/octavia/api/v2/controllers/member.py @@ -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 as e: # TODO(blogan): will have to do separate validation protocol # before creation or update since the exception messages