示例#1
0
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)
示例#2
0
 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'))
示例#3
0
 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'))
示例#4
0
    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)