Beispiel #1
0
    def _validate_and_return_az_dict(self, lock_session, driver, lb_dict):

        az_dict = {}
        if 'availability_zone' in lb_dict:
            try:
                az = self.repositories.availability_zone.get(
                    lock_session, name=lb_dict['availability_zone'])
                az_dict = (
                    self.repositories.availability_zone
                    .get_availability_zone_metadata_dict(lock_session, az.name)
                )
            except sa_exception.NoResultFound:
                raise exceptions.ValidationException(
                    detail=_("Invalid availability_zone."))

        # Make sure the driver will still accept the availability zone metadata
        if az_dict:
            try:
                driver_utils.call_provider(driver.name,
                                           driver.validate_availability_zone,
                                           az_dict)
            except NotImplementedError:
                raise exceptions.ProviderNotImplementedError(
                    prov=driver.name, user_msg="This provider does not support"
                                               " availability zones.")

        return az_dict
Beispiel #2
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)
Beispiel #3
0
    def get_all(self, fields=None):
        context = pecan.request.context.get('octavia_context')
        self._auth_validate_action(context, context.project_id,
                                   constants.RBAC_GET_ALL)
        self.driver = driver_factory.get_driver(self.provider)
        try:
            metadata_dict = (
                self.driver.get_supported_availability_zone_metadata())
        except driver_except.NotImplementedError as e:
            LOG.warning(
                'Provider %s get_supported_availability_zone_metadata() '
                'reported: %s', self.provider, e.operator_fault_string)
            raise exceptions.ProviderNotImplementedError(
                prov=self.provider, user_msg=e.user_fault_string)

        # Apply any valid filters provided as URL parameters
        name_filter = None
        description_filter = None
        pagination_helper = pecan.request.context.get(
            constants.PAGINATION_HELPER)
        if pagination_helper:
            name_filter = pagination_helper.params.get(constants.NAME)
            description_filter = pagination_helper.params.get(
                constants.DESCRIPTION)
        if name_filter:
            metadata_dict = {
                key: value
                for key, value in six.iteritems(metadata_dict)
                if key == name_filter
            }
        if description_filter:
            metadata_dict = {
                key: value
                for key, value in six.iteritems(metadata_dict)
                if value == description_filter
            }

        response_list = [
            provider_types.ProviderResponse(name=key, description=value)
            for key, value in six.iteritems(metadata_dict)
        ]
        if fields is not None:
            response_list = self._filter_fields(response_list, fields)
        return provider_types.AvailabilityZoneCapabilitiesResponse(
            availability_zone_capabilities=response_list)
Beispiel #4
0
 def get_all(self, fields=None):
     context = pecan.request.context.get('octavia_context')
     self._auth_validate_action(context, context.project_id,
                                constants.RBAC_GET_ALL)
     self.driver = driver_factory.get_driver(self.provider)
     try:
         metadata_dict = self.driver.get_supported_flavor_metadata()
     except driver_except.NotImplementedError as e:
         LOG.warning('Provider %s get_supported_flavor_metadata() '
                     'reported: %s', self.provider, e.operator_fault_string)
         raise exceptions.ProviderNotImplementedError(
             prov=self.provider, user_msg=e.user_fault_string)
     response_list = [
         provider_types.ProviderResponse(name=key, description=value) for
         key, value in six.iteritems(metadata_dict)]
     if fields is not None:
         response_list = self._filter_fields(response_list, fields)
     return provider_types.FlavorCapabilitiesResponse(
         flavor_capabilities=response_list)