diff --git a/octavia/api/drivers/utils.py b/octavia/api/drivers/utils.py index c7ac522222..fcaac2f717 100644 --- a/octavia/api/drivers/utils.py +++ b/octavia/api/drivers/utils.py @@ -16,6 +16,7 @@ import copy import six +from octavia_lib.api.drivers import exceptions as lib_exceptions from oslo_config import cfg from oslo_context import context as oslo_context from oslo_log import log as logging @@ -48,17 +49,28 @@ def call_provider(provider, driver_method, *args, **kwargs): try: return driver_method(*args, **kwargs) - except driver_exceptions.DriverError as e: + except (driver_exceptions.DriverError, lib_exceptions.DriverError) as e: LOG.exception("Provider '%s' raised a driver error: %s", provider, e.operator_fault_string) raise exceptions.ProviderDriverError(prov=provider, user_msg=e.user_fault_string) - except (driver_exceptions.NotImplementedError, NotImplementedError) as e: + except (driver_exceptions.NotImplementedError, + lib_exceptions.NotImplementedError, + NotImplementedError) as e: + op_fault_string = ( + e.operator_fault_string + if hasattr(e, "operator_fault_string") + else _("This feature is not implemented by this provider.")) + usr_fault_string = ( + e.user_fault_string + if hasattr(e, "user_fault_string") + else _("This feature is not implemented by the provider.")) LOG.info("Provider '%s' raised a not implemented error: %s", - provider, e.operator_fault_string) + provider, op_fault_string) raise exceptions.ProviderNotImplementedError( - prov=provider, user_msg=e.user_fault_string) - except driver_exceptions.UnsupportedOptionError as e: + prov=provider, user_msg=usr_fault_string) + except (driver_exceptions.UnsupportedOptionError, + lib_exceptions.UnsupportedOptionError) as e: LOG.info("Provider '%s' raised an unsupported option error: " "%s", provider, e.operator_fault_string) raise exceptions.ProviderUnsupportedOptionError( diff --git a/octavia/tests/unit/api/drivers/test_utils.py b/octavia/tests/unit/api/drivers/test_utils.py index d921a52dfd..70a93a9328 100644 --- a/octavia/tests/unit/api/drivers/test_utils.py +++ b/octavia/tests/unit/api/drivers/test_utils.py @@ -16,6 +16,8 @@ import copy import mock +from octavia_lib.api.drivers import exceptions as lib_exceptions + from octavia.api.drivers import data_models as driver_dm from octavia.api.drivers import exceptions as driver_exceptions from octavia.api.drivers import utils @@ -39,24 +41,41 @@ class TestUtils(base.TestCase): "arg1", foo="arg2") mock_driver_method.assert_called_with("arg1", foo="arg2") - # Test driver raising DriverError + # Test driver raising different types of DriverError mock_driver_method.side_effect = driver_exceptions.DriverError + self.assertRaises(exceptions.ProviderDriverError, + utils.call_provider, "provider_name", + mock_driver_method) + mock_driver_method.side_effect = lib_exceptions.DriverError self.assertRaises(exceptions.ProviderDriverError, utils.call_provider, "provider_name", mock_driver_method) - # Test driver raising NotImplementedError + # Test driver raising different types of NotImplementedError mock_driver_method.side_effect = driver_exceptions.NotImplementedError + self.assertRaises(exceptions.ProviderNotImplementedError, + utils.call_provider, "provider_name", + mock_driver_method) + mock_driver_method.side_effect = NotImplementedError + self.assertRaises(exceptions.ProviderNotImplementedError, + utils.call_provider, "provider_name", + mock_driver_method) + mock_driver_method.side_effect = lib_exceptions.NotImplementedError self.assertRaises(exceptions.ProviderNotImplementedError, utils.call_provider, "provider_name", mock_driver_method) - # Test driver raising UnsupportedOptionError + # Test driver raising different types of UnsupportedOptionError mock_driver_method.side_effect = ( driver_exceptions.UnsupportedOptionError) self.assertRaises(exceptions.ProviderUnsupportedOptionError, utils.call_provider, "provider_name", mock_driver_method) + mock_driver_method.side_effect = ( + lib_exceptions.UnsupportedOptionError) + self.assertRaises(exceptions.ProviderUnsupportedOptionError, + utils.call_provider, "provider_name", + mock_driver_method) # Test driver raising DriverError mock_driver_method.side_effect = Exception diff --git a/releasenotes/notes/fix-driver-errors-81d33948288bf8cf.yaml b/releasenotes/notes/fix-driver-errors-81d33948288bf8cf.yaml new file mode 100644 index 0000000000..3976eea566 --- /dev/null +++ b/releasenotes/notes/fix-driver-errors-81d33948288bf8cf.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Fixed an issue where the driver errors were not caught.