From 04647d4502aa63b8de1e1e4acb7282da9cf8026b 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' Conflicts: octavia/api/v2/controllers/member.py octavia/api/v2/controllers/listener.py Story: 2009128 Task: 43045 Change-Id: Ibbccda5859c8c6129d43e0742b28b319b49ddd1f (cherry picked from commit f166bb1481fb58acd7e7329ec394f43249001718) (cherry picked from commit e69899824ce09b8eb72c294562fdae5ad7ad5c13) (cherry picked from commit 5647db94c941f582bb8292599379a3693b470cbe) (cherry picked from commit ca66aac3750d7e2ff005111ade5212a2092e25a8) (cherry picked from commit a1e22d89a4852a28a3e60b31b4b293199daac0ab) --- 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 e0a2baabce..1d358369e6 100644 --- a/octavia/api/v2/controllers/listener.py +++ b/octavia/api/v2/controllers/listener.py @@ -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') diff --git a/octavia/api/v2/controllers/member.py b/octavia/api/v2/controllers/member.py index 6d112e0db4..92d07e93b2 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: # TODO(blogan): will have to do separate validation protocol # before creation or update since the exception messages