def call_provider(provider, driver_method, *args, **kwargs): """Wrap calls to the provider driver to handle driver errors. This allows Octavia to return user friendly errors when a provider driver has an issue. :param driver_method: Method in the driver to call. :raises ProviderDriverError: Catch all driver error. :raises ProviderNotImplementedError: The driver doesn't support this action. :raises ProviderUnsupportedOptionError: The driver doesn't support a provided option. """ try: return driver_method(*args, **kwargs) except driver_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: LOG.info("Provider '%s' raised a not implemented error: %s", provider, e.operator_fault_string) raise exceptions.ProviderNotImplementedError( prov=provider, user_msg=e.user_fault_string) except driver_exceptions.UnsupportedOptionError as e: LOG.info("Provider '%s' raised an unsupported option error: " "%s", provider, e.operator_fault_string) raise exceptions.ProviderUnsupportedOptionError( prov=provider, user_msg=e.user_fault_string) except Exception as e: LOG.exception("Provider '%s' raised an unknown error: %s", provider, e) raise exceptions.ProviderDriverError(prov=provider, user_msg=e)
def test_create_with_bad_provider(self, mock_provider): mock_provider.side_effect = exceptions.ProviderDriverError( prov='bad_driver', user_msg='broken') l7rule = {'compare_type': 'REGEX', 'invert': False, 'type': 'PATH', 'value': '/images*', 'admin_state_up': True} response = self.post(self.l7rules_path, self._build_body(l7rule), status=500) self.assertIn('Provider \'bad_driver\' reports error: broken', response.json.get('faultstring'))
def test_update_with_bad_provider(self, mock_provider): api_l7rule = self.create_l7rule( self.l7policy_id, constants.L7RULE_TYPE_PATH, constants.L7RULE_COMPARE_TYPE_STARTS_WITH, '/api').get(self.root_tag) self.set_lb_status(self.lb_id) new_l7rule = {'value': '/images'} mock_provider.side_effect = exceptions.ProviderDriverError( prov='bad_driver', user_msg='broken') response = self.put( self.l7rule_path.format(l7rule_id=api_l7rule.get('id')), self._build_body(new_l7rule), status=500) self.assertIn('Provider \'bad_driver\' reports error: broken', response.json.get('faultstring'))
def test_delete_with_bad_provider(self, mock_provider): api_l7rule = self.create_l7rule( self.l7policy_id, constants.L7RULE_TYPE_PATH, constants.L7RULE_COMPARE_TYPE_STARTS_WITH, '/api').get(self.root_tag) self.set_lb_status(self.lb_id) # Set status to ACTIVE/ONLINE because set_lb_status did it in the db api_l7rule['provisioning_status'] = constants.ACTIVE api_l7rule['operating_status'] = constants.ONLINE response = self.get(self.l7rule_path.format( l7rule_id=api_l7rule.get('id'))).json.get(self.root_tag) self.assertIsNone(api_l7rule.pop('updated_at')) self.assertIsNotNone(response.pop('updated_at')) self.assertEqual(api_l7rule, response) mock_provider.side_effect = exceptions.ProviderDriverError( prov='bad_driver', user_msg='broken') self.delete(self.l7rule_path.format(l7rule_id=api_l7rule.get('id')), status=500)