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
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 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)
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)