¡@

Home 

OpenStack Study: exception.py

OpenStack Index

**** CubicPower OpenStack Study ****

# Copyright 2010 United States Government as represented by the

# Administrator of the National Aeronautics and Space Administration.

# All Rights Reserved.

#

# Licensed under the Apache License, Version 2.0 (the "License"); you may

# not use this file except in compliance with the License. You may obtain

# a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

# License for the specific language governing permissions and limitations

# under the License.

"""Cinder base exception handling.

Includes decorator for re-raising Cinder-type exceptions.

SHOULD include dedicated exception logging.

"""

import sys

from oslo.config import cfg

import webob.exc

from cinder.openstack.common.gettextutils import _

from cinder.openstack.common import log as logging

LOG = logging.getLogger(__name__)

exc_log_opts = [

cfg.BoolOpt('fatal_exception_format_errors',

default=False,

help='make exception message format errors fatal'),

]

CONF = cfg.CONF

CONF.register_opts(exc_log_opts)

**** CubicPower OpenStack Study ****

class ConvertedException(webob.exc.WSGIHTTPException):

**** CubicPower OpenStack Study ****

    def __init__(self, code=0, title="", explanation=""):

        self.code = code

        self.title = title

        self.explanation = explanation

        super(ConvertedException, self).__init__()

**** CubicPower OpenStack Study ****

class Error(Exception):

pass

**** CubicPower OpenStack Study ****

class CinderException(Exception):

"""Base Cinder Exception

To correctly use this class, inherit from it and

**** CubicPower OpenStack Study ****

    def __init__(self, message=None, **kwargs):

        self.kwargs = kwargs

        if 'code' not in self.kwargs:

            try:

                self.kwargs['code'] = self.code

            except AttributeError:

                pass

        if not message:

            try:

                message = self.message % kwargs

            except Exception:

                exc_info = sys.exc_info()

                # kwargs doesn't match a variable in the message

                # log the issue and the kwargs

                LOG.exception(_('Exception in string format operation'))

                for name, value in kwargs.iteritems():

                    LOG.error("%s: %s" % (name, value))

                if CONF.fatal_exception_format_errors:

                    raise exc_info[0], exc_info[1], exc_info[2]

                # at least get the core message out if something happened

                message = self.message

        # NOTE(luisg): We put the actual message in 'msg' so that we can access

        # it, because if we try to access the message via 'message' it will be

        # overshadowed by the class' message attribute

        self.msg = message

        super(CinderException, self).__init__(message)

**** CubicPower OpenStack Study ****

    def __unicode__(self):

        return unicode(self.msg)

**** CubicPower OpenStack Study ****

class VolumeBackendAPIException(CinderException):

message = _("Bad or unexpected response from the storage volume "

"backend API: %(data)s")

**** CubicPower OpenStack Study ****

class VolumeDriverException(CinderException):

message = _("Volume driver reported an error: %(message)s")

**** CubicPower OpenStack Study ****

class BackupDriverException(CinderException):

message = _("Backup driver reported an error: %(message)s")

**** CubicPower OpenStack Study ****

class GlanceConnectionFailed(CinderException):

message = _("Connection to glance failed: %(reason)s")

**** CubicPower OpenStack Study ****

class NotAuthorized(CinderException):

message = _("Not authorized.")

code = 403

**** CubicPower OpenStack Study ****

class AdminRequired(NotAuthorized):

message = _("User does not have admin privileges")

**** CubicPower OpenStack Study ****

class PolicyNotAuthorized(NotAuthorized):

message = _("Policy doesn't allow %(action)s to be performed.")

**** CubicPower OpenStack Study ****

class ImageNotAuthorized(CinderException):

message = _("Not authorized for image %(image_id)s.")

**** CubicPower OpenStack Study ****

class DriverNotInitialized(CinderException):

message = _("Volume driver not ready.")

**** CubicPower OpenStack Study ****

class Invalid(CinderException):

message = _("Unacceptable parameters.")

code = 400

**** CubicPower OpenStack Study ****

class InvalidSnapshot(Invalid):

message = _("Invalid snapshot: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidVolumeAttachMode(Invalid):

message = _("Invalid attaching mode '%(mode)s' for "

"volume %(volume_id)s.")

**** CubicPower OpenStack Study ****

class VolumeAttached(Invalid):

message = _("Volume %(volume_id)s is still attached, detach volume first.")

**** CubicPower OpenStack Study ****

class SfJsonEncodeFailure(CinderException):

message = _("Failed to load data into json format")

**** CubicPower OpenStack Study ****

class InvalidResults(Invalid):

message = _("The results are invalid.")

**** CubicPower OpenStack Study ****

class InvalidInput(Invalid):

message = _("Invalid input received: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidVolumeType(Invalid):

message = _("Invalid volume type: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidVolume(Invalid):

message = _("Invalid volume: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidContentType(Invalid):

message = _("Invalid content type %(content_type)s.")

**** CubicPower OpenStack Study ****

class InvalidHost(Invalid):

message = _("Invalid host: %(reason)s")

# Cannot be templated as the error syntax varies.

# msg needs to be constructed when raised.

**** CubicPower OpenStack Study ****

class InvalidParameterValue(Invalid):

message = _("%(err)s")

**** CubicPower OpenStack Study ****

class InvalidAuthKey(Invalid):

message = _("Invalid auth key: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidConfigurationValue(Invalid):

message = _('Value "%(value)s" is not valid for '

'configuration option "%(option)s"')

**** CubicPower OpenStack Study ****

class ServiceUnavailable(Invalid):

message = _("Service is unavailable at this time.")

**** CubicPower OpenStack Study ****

class ImageUnacceptable(Invalid):

message = _("Image %(image_id)s is unacceptable: %(reason)s")

**** CubicPower OpenStack Study ****

class DeviceUnavailable(Invalid):

message = _("The device in the path %(path)s is unavailable: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidUUID(Invalid):

message = _("Expected a uuid but received %(uuid)s.")

**** CubicPower OpenStack Study ****

class NotFound(CinderException):

message = _("Resource could not be found.")

code = 404

safe = True

**** CubicPower OpenStack Study ****

class VolumeNotFound(NotFound):

message = _("Volume %(volume_id)s could not be found.")

**** CubicPower OpenStack Study ****

class VolumeMetadataNotFound(NotFound):

message = _("Volume %(volume_id)s has no metadata with "

"key %(metadata_key)s.")

**** CubicPower OpenStack Study ****

class VolumeAdminMetadataNotFound(NotFound):

message = _("Volume %(volume_id)s has no administration metadata with "

"key %(metadata_key)s.")

**** CubicPower OpenStack Study ****

class InvalidVolumeMetadata(Invalid):

message = _("Invalid metadata: %(reason)s")

**** CubicPower OpenStack Study ****

class InvalidVolumeMetadataSize(Invalid):

message = _("Invalid metadata size: %(reason)s")

**** CubicPower OpenStack Study ****

class SnapshotMetadataNotFound(NotFound):

message = _("Snapshot %(snapshot_id)s has no metadata with "

"key %(metadata_key)s.")

**** CubicPower OpenStack Study ****

class VolumeTypeNotFound(NotFound):

message = _("Volume type %(volume_type_id)s could not be found.")

**** CubicPower OpenStack Study ****

class VolumeTypeNotFoundByName(VolumeTypeNotFound):

message = _("Volume type with name %(volume_type_name)s "

"could not be found.")

**** CubicPower OpenStack Study ****

class VolumeTypeExtraSpecsNotFound(NotFound):

message = _("Volume Type %(volume_type_id)s has no extra specs with "

"key %(extra_specs_key)s.")

**** CubicPower OpenStack Study ****

class VolumeTypeInUse(CinderException):

message = _("Volume Type %(volume_type_id)s deletion is not allowed with "

"volumes present with the type.")

**** CubicPower OpenStack Study ****

class SnapshotNotFound(NotFound):

message = _("Snapshot %(snapshot_id)s could not be found.")

**** CubicPower OpenStack Study ****

class VolumeIsBusy(CinderException):

message = _("deleting volume %(volume_name)s that has snapshot")

**** CubicPower OpenStack Study ****

class SnapshotIsBusy(CinderException):

message = _("deleting snapshot %(snapshot_name)s that has "

"dependent volumes")

**** CubicPower OpenStack Study ****

class ISCSITargetNotFoundForVolume(NotFound):

message = _("No target id found for volume %(volume_id)s.")

**** CubicPower OpenStack Study ****

class InvalidImageRef(Invalid):

message = _("Invalid image href %(image_href)s.")

**** CubicPower OpenStack Study ****

class ImageNotFound(NotFound):

message = _("Image %(image_id)s could not be found.")

**** CubicPower OpenStack Study ****

class ServiceNotFound(NotFound):

message = _("Service %(service_id)s could not be found.")

**** CubicPower OpenStack Study ****

class HostNotFound(NotFound):

message = _("Host %(host)s could not be found.")

**** CubicPower OpenStack Study ****

class SchedulerHostFilterNotFound(NotFound):

message = _("Scheduler Host Filter %(filter_name)s could not be found.")

**** CubicPower OpenStack Study ****

class SchedulerHostWeigherNotFound(NotFound):

message = _("Scheduler Host Weigher %(weigher_name)s could not be found.")

**** CubicPower OpenStack Study ****

class HostBinaryNotFound(NotFound):

message = _("Could not find binary %(binary)s on host %(host)s.")

**** CubicPower OpenStack Study ****

class InvalidReservationExpiration(Invalid):

message = _("Invalid reservation expiration %(expire)s.")

**** CubicPower OpenStack Study ****

class InvalidQuotaValue(Invalid):

message = _("Change would make usage less than 0 for the following "

"resources: %(unders)s")

**** CubicPower OpenStack Study ****

class QuotaNotFound(NotFound):

message = _("Quota could not be found")

**** CubicPower OpenStack Study ****

class QuotaResourceUnknown(QuotaNotFound):

message = _("Unknown quota resources %(unknown)s.")

**** CubicPower OpenStack Study ****

class ProjectQuotaNotFound(QuotaNotFound):

message = _("Quota for project %(project_id)s could not be found.")

**** CubicPower OpenStack Study ****

class QuotaClassNotFound(QuotaNotFound):

message = _("Quota class %(class_name)s could not be found.")

**** CubicPower OpenStack Study ****

class QuotaUsageNotFound(QuotaNotFound):

message = _("Quota usage for project %(project_id)s could not be found.")

**** CubicPower OpenStack Study ****

class ReservationNotFound(QuotaNotFound):

message = _("Quota reservation %(uuid)s could not be found.")

**** CubicPower OpenStack Study ****

class OverQuota(CinderException):

message = _("Quota exceeded for resources: %(overs)s")

**** CubicPower OpenStack Study ****

class FileNotFound(NotFound):

message = _("File %(file_path)s could not be found.")

#TODO(bcwaldon): EOL this exception!

**** CubicPower OpenStack Study ****

class Duplicate(CinderException):

pass

**** CubicPower OpenStack Study ****

class VolumeTypeExists(Duplicate):

message = _("Volume Type %(id)s already exists.")

**** CubicPower OpenStack Study ****

class VolumeTypeEncryptionExists(Invalid):

message = _("Volume type encryption for type %(type_id)s already exists.")

**** CubicPower OpenStack Study ****

class VolumeTypeEncryptionNotFound(NotFound):

message = _("Volume type encryption for type %(type_id)s does not exist.")

**** CubicPower OpenStack Study ****

class MalformedRequestBody(CinderException):

message = _("Malformed message body: %(reason)s")

**** CubicPower OpenStack Study ****

class ConfigNotFound(NotFound):

message = _("Could not find config at %(path)s")

**** CubicPower OpenStack Study ****

class ParameterNotFound(NotFound):

message = _("Could not find parameter %(param)s")

**** CubicPower OpenStack Study ****

class PasteAppNotFound(NotFound):

message = _("Could not load paste app '%(name)s' from %(path)s")

**** CubicPower OpenStack Study ****

class NoValidHost(CinderException):

message = _("No valid host was found. %(reason)s")

**** CubicPower OpenStack Study ****

class NoMoreTargets(CinderException):

"""No more available targets."""

pass

**** CubicPower OpenStack Study ****

class QuotaError(CinderException):

message = _("Quota exceeded: code=%(code)s")

code = 413

headers = {'Retry-After': 0}

safe = True

**** CubicPower OpenStack Study ****

class VolumeSizeExceedsAvailableQuota(QuotaError):

message = _("Requested volume or snapshot exceeds allowed Gigabytes "

"quota. Requested %(requested)sG, quota is %(quota)sG and "

"%(consumed)sG has been consumed.")

**** CubicPower OpenStack Study ****

class VolumeLimitExceeded(QuotaError):

message = _("Maximum number of volumes allowed (%(allowed)d) exceeded")

**** CubicPower OpenStack Study ****

class SnapshotLimitExceeded(QuotaError):

message = _("Maximum number of snapshots allowed (%(allowed)d) exceeded")

**** CubicPower OpenStack Study ****

class DuplicateSfVolumeNames(Duplicate):

message = _("Detected more than one volume with name %(vol_name)s")

**** CubicPower OpenStack Study ****

class VolumeTypeCreateFailed(CinderException):

message = _("Cannot create volume_type with "

"name %(name)s and specs %(extra_specs)s")

**** CubicPower OpenStack Study ****

class UnknownCmd(VolumeDriverException):

message = _("Unknown or unsupported command %(cmd)s")

**** CubicPower OpenStack Study ****

class MalformedResponse(VolumeDriverException):

message = _("Malformed response to command %(cmd)s: %(reason)s")

**** CubicPower OpenStack Study ****

class FailedCmdWithDump(VolumeDriverException):

message = _("Operation failed with status=%(status)s. Full dump: %(data)s")

**** CubicPower OpenStack Study ****

class GlanceMetadataExists(Invalid):

message = _("Glance metadata cannot be updated, key %(key)s"

" exists for volume id %(volume_id)s")

**** CubicPower OpenStack Study ****

class GlanceMetadataNotFound(NotFound):

message = _("Glance metadata for volume/snapshot %(id)s cannot be found.")

**** CubicPower OpenStack Study ****

class ExportFailure(Invalid):

message = _("Failed to export for volume: %(reason)s")

**** CubicPower OpenStack Study ****

class MetadataCreateFailure(Invalid):

message = _("Failed to create metadata for volume: %(reason)s")

**** CubicPower OpenStack Study ****

class MetadataUpdateFailure(Invalid):

message = _("Failed to update metadata for volume: %(reason)s")

**** CubicPower OpenStack Study ****

class MetadataCopyFailure(Invalid):

message = _("Failed to copy metadata to volume: %(reason)s")

**** CubicPower OpenStack Study ****

class ImageCopyFailure(Invalid):

message = _("Failed to copy image to volume: %(reason)s")

**** CubicPower OpenStack Study ****

class BackupInvalidCephArgs(BackupDriverException):

message = _("Invalid Ceph args provided for backup rbd operation")

**** CubicPower OpenStack Study ****

class BackupOperationError(Invalid):

message = _("An error has occurred during backup operation")

**** CubicPower OpenStack Study ****

class BackupMetadataUnsupportedVersion(BackupDriverException):

message = _("Unsupported backup metadata version requested")

**** CubicPower OpenStack Study ****

class VolumeMetadataBackupExists(BackupDriverException):

message = _("Metadata backup already exists for this volume")

**** CubicPower OpenStack Study ****

class BackupRBDOperationFailed(BackupDriverException):

message = _("Backup RBD operation failed")

**** CubicPower OpenStack Study ****

class BackupNotFound(NotFound):

message = _("Backup %(backup_id)s could not be found.")

**** CubicPower OpenStack Study ****

class BackupFailedToGetVolumeBackend(NotFound):

message = _("Failed to identify volume backend.")

**** CubicPower OpenStack Study ****

class InvalidBackup(Invalid):

message = _("Invalid backup: %(reason)s")

**** CubicPower OpenStack Study ****

class SwiftConnectionFailed(BackupDriverException):

message = _("Connection to swift failed: %(reason)s")

**** CubicPower OpenStack Study ****

class TransferNotFound(NotFound):

message = _("Transfer %(transfer_id)s could not be found.")

**** CubicPower OpenStack Study ****

class VolumeMigrationFailed(CinderException):

message = _("Volume migration failed: %(reason)s")

**** CubicPower OpenStack Study ****

class SSHInjectionThreat(CinderException):

message = _("SSH command injection detected: %(command)s")

**** CubicPower OpenStack Study ****

class QoSSpecsExists(Duplicate):

message = _("QoS Specs %(specs_id)s already exists.")

**** CubicPower OpenStack Study ****

class QoSSpecsCreateFailed(CinderException):

message = _("Failed to create qos_specs: "

"%(name)s with specs %(qos_specs)s.")

**** CubicPower OpenStack Study ****

class QoSSpecsUpdateFailed(CinderException):

message = _("Failed to update qos_specs: "

"%(specs_id)s with specs %(qos_specs)s.")

**** CubicPower OpenStack Study ****

class QoSSpecsNotFound(NotFound):

message = _("No such QoS spec %(specs_id)s.")

**** CubicPower OpenStack Study ****

class QoSSpecsAssociateFailed(CinderException):

message = _("Failed to associate qos_specs: "

"%(specs_id)s with type %(type_id)s.")

**** CubicPower OpenStack Study ****

class QoSSpecsDisassociateFailed(CinderException):

message = _("Failed to disassociate qos_specs: "

"%(specs_id)s with type %(type_id)s.")

**** CubicPower OpenStack Study ****

class QoSSpecsKeyNotFound(NotFound):

message = _("QoS spec %(specs_id)s has no spec with "

"key %(specs_key)s.")

**** CubicPower OpenStack Study ****

class InvalidQoSSpecs(Invalid):

message = _("Invalid qos specs: %(reason)s")

**** CubicPower OpenStack Study ****

class QoSSpecsInUse(CinderException):

message = _("QoS Specs %(specs_id)s is still associated with entities.")

**** CubicPower OpenStack Study ****

class KeyManagerError(CinderException):

msg_fmt = _("key manager error: %(reason)s")

**** CubicPower OpenStack Study ****

class ManageExistingInvalidReference(CinderException):

message = _("Manage existing volume failed due to invalid backend "

"reference %(existing_ref)s: %(reason)s")

**** CubicPower OpenStack Study ****

class ManageExistingVolumeTypeMismatch(CinderException):

message = _("Manage existing volume failed due to volume type mismatch: "

"%(reason)s")

# Driver specific exceptions

# Coraid

**** CubicPower OpenStack Study ****

class CoraidException(VolumeDriverException):

message = _('Coraid Cinder Driver exception.')

**** CubicPower OpenStack Study ****

class CoraidJsonEncodeFailure(CoraidException):

message = _('Failed to encode json data.')

**** CubicPower OpenStack Study ****

class CoraidESMBadCredentials(CoraidException):

message = _('Login on ESM failed.')

**** CubicPower OpenStack Study ****

class CoraidESMReloginFailed(CoraidException):

message = _('Relogin on ESM failed.')

**** CubicPower OpenStack Study ****

class CoraidESMBadGroup(CoraidException):

message = _('Group with name "%(group_name)s" not found.')

**** CubicPower OpenStack Study ****

class CoraidESMConfigureError(CoraidException):

message = _('ESM configure request failed: %(reason)s')

**** CubicPower OpenStack Study ****

class CoraidESMNotAvailable(CoraidException):

message = _('Coraid ESM not available with reason: %(reason)s')

# Zadara

**** CubicPower OpenStack Study ****

class ZadaraException(VolumeDriverException):

message = _('Zadara Cinder Driver exception.')

**** CubicPower OpenStack Study ****

class ZadaraServerCreateFailure(ZadaraException):

message = _("Unable to create server object for initiator %(name)s")

**** CubicPower OpenStack Study ****

class ZadaraServerNotFound(ZadaraException):

message = _("Unable to find server object for initiator %(name)s")

**** CubicPower OpenStack Study ****

class ZadaraVPSANoActiveController(ZadaraException):

message = _("Unable to find any active VPSA controller")

**** CubicPower OpenStack Study ****

class ZadaraAttachmentsNotFound(ZadaraException):

message = _("Failed to retrieve attachments for volume %(name)s")

**** CubicPower OpenStack Study ****

class ZadaraInvalidAttachmentInfo(ZadaraException):

message = _("Invalid attachment info for volume %(name)s: %(reason)s")

**** CubicPower OpenStack Study ****

class BadHTTPResponseStatus(ZadaraException):

message = _("Bad HTTP response status %(status)s")

#SolidFire

**** CubicPower OpenStack Study ****

class SolidFireAPIException(VolumeBackendAPIException):

message = _("Bad response from SolidFire API")

**** CubicPower OpenStack Study ****

class SolidFireDriverException(VolumeDriverException):

message = _("SolidFire Cinder Driver exception")

**** CubicPower OpenStack Study ****

class SolidFireAPIDataException(SolidFireAPIException):

message = _("Error in SolidFire API response: data=%(data)s")

**** CubicPower OpenStack Study ****

class SolidFireAccountNotFound(SolidFireDriverException):

message = _("Unable to locate account %(account_name)s on "

"Solidfire device")

# HP 3Par

**** CubicPower OpenStack Study ****

class Invalid3PARDomain(VolumeDriverException):

message = _("Invalid 3PAR Domain: %(err)s")

# NFS driver

**** CubicPower OpenStack Study ****

class NfsException(VolumeDriverException):

message = _("Unknown NFS exception")

**** CubicPower OpenStack Study ****

class NfsNoSharesMounted(VolumeDriverException):

message = _("No mounted NFS shares found")

**** CubicPower OpenStack Study ****

class NfsNoSuitableShareFound(VolumeDriverException):

message = _("There is no share which can host %(volume_size)sG")

# Gluster driver

**** CubicPower OpenStack Study ****

class GlusterfsException(VolumeDriverException):

message = _("Unknown Gluster exception")

**** CubicPower OpenStack Study ****

class GlusterfsNoSharesMounted(VolumeDriverException):

message = _("No mounted Gluster shares found")

**** CubicPower OpenStack Study ****

class GlusterfsNoSuitableShareFound(VolumeDriverException):

message = _("There is no share which can host %(volume_size)sG")

**** CubicPower OpenStack Study ****

class RemoveExportException(VolumeDriverException):

message = _("Failed to remove export for volume %(volume)s: %(reason)s")

# HP MSA

**** CubicPower OpenStack Study ****

class HPMSAVolumeDriverException(VolumeDriverException):

message = _("HP MSA Volume Driver exception")

**** CubicPower OpenStack Study ****

class HPMSAInvalidVDisk(HPMSAVolumeDriverException):

message = _("VDisk doesn't exist (%(vdisk)s)")

**** CubicPower OpenStack Study ****

class HPMSAConnectionError(HPMSAVolumeDriverException):

message = _("Unable to connect to MSA array")

**** CubicPower OpenStack Study ****

class HPMSANotEnoughSpace(HPMSAVolumeDriverException):

message = _("Not enough space on VDisk (%(vdisk)s)")

# Fibre Channel Zone Manager

**** CubicPower OpenStack Study ****

class ZoneManagerException(CinderException):

message = _("Fibre Channel connection control failure: %(reason)s")

**** CubicPower OpenStack Study ****

class FCZoneDriverException(CinderException):

message = _("Fibre Channel Zone operation failed: %(reason)s")

**** CubicPower OpenStack Study ****

class FCSanLookupServiceException(CinderException):

message = _("Fibre Channel SAN Lookup failure: %(reason)s")

**** CubicPower OpenStack Study ****

class BrocadeZoningCliException(CinderException):

message = _("Fibre Channel Zoning CLI error: %(reason)s")

**** CubicPower OpenStack Study ****

class NetAppDriverException(VolumeDriverException):

message = _("NetApp Cinder Driver exception.")