**** 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.")