178 lines
5.5 KiB
Python
Raw Normal View History

# Copyright 2013 Rackspace, Inc.
#
# 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.
2013-12-21 17:22:09 -08:00
from ironic_python_agent import encoding
from ironic_python_agent import utils
2013-12-21 17:22:09 -08:00
class RESTError(Exception, encoding.Serializable):
"""Base class for errors generated in ironic-python-client."""
message = 'An error occurred'
details = 'An unexpected error occurred. Please try back later.'
status_code = 500
def serialize(self):
"""Turn a RESTError into a dict."""
2014-03-17 12:01:33 -07:00
return utils.get_ordereddict([
('type', self.__class__.__name__),
('code', self.status_code),
('message', self.message),
('details', self.details),
])
class InvalidContentError(RESTError):
"""Error which occurs when a user supplies invalid content, either
because that content cannot be parsed according to the advertised
`Content-Type`, or due to a content validation error.
"""
message = 'Invalid request body'
status_code = 400
def __init__(self, details):
self.details = details
2013-12-21 17:22:09 -08:00
class NotFound(RESTError):
"""Error which occurs when a user supplies invalid content, either
because that content cannot be parsed according to the advertised
`Content-Type`, or due to a content validation error.
"""
message = 'Not found'
status_code = 404
details = 'The requested URL was not found.'
2013-12-21 17:22:09 -08:00
class CommandExecutionError(RESTError):
"""Error raised when a command fails to execute."""
message = 'Command execution failed'
def __init__(self, details):
super(CommandExecutionError, self).__init__()
self.details = details
class InvalidCommandError(InvalidContentError):
2013-12-21 17:22:09 -08:00
"""Error which is raised when an unknown command is issued."""
2014-01-23 12:36:12 -08:00
messsage = 'Invalid command'
2013-12-21 17:22:09 -08:00
2014-01-23 12:36:12 -08:00
def __init__(self, details):
2013-12-21 17:22:09 -08:00
super(InvalidCommandError, self).__init__(details)
class InvalidCommandParamsError(InvalidContentError):
2013-12-21 17:22:09 -08:00
"""Error which is raised when command parameters are invalid."""
message = 'Invalid command parameters'
def __init__(self, details):
super(InvalidCommandParamsError, self).__init__(details)
2014-01-07 14:14:58 -08:00
class RequestedObjectNotFoundError(NotFound):
def __init__(self, type_descr, obj_id):
details = '{0} with id {1} not found.'.format(type_descr, obj_id)
super(RequestedObjectNotFoundError, self).__init__(details)
self.details = details
class IronicAPIError(RESTError):
2014-01-16 18:32:15 -08:00
"""Error raised when a call to the agent API fails."""
message = 'Error in call to ironic-api.'
2014-01-16 18:32:15 -08:00
def __init__(self, details):
super(IronicAPIError, self).__init__(details)
2014-01-16 18:32:15 -08:00
self.details = details
class HeartbeatError(IronicAPIError):
2014-01-07 14:14:58 -08:00
"""Error raised when a heartbeat to the agent API fails."""
message = 'Error heartbeating to agent API.'
def __init__(self, details):
2014-01-16 18:32:15 -08:00
super(HeartbeatError, self).__init__(details)
2014-01-14 12:39:08 -08:00
class LookupNodeError(IronicAPIError):
"""Error raised when the node configuration lookup to the Ironic API
fails.
"""
message = 'Error getting configuration from Ironic.'
def __init__(self, details):
super(LookupNodeError, self).__init__(details)
class ImageDownloadError(RESTError):
2014-01-14 12:39:08 -08:00
"""Error raised when an image cannot be downloaded."""
message = 'Error downloading image.'
2014-01-14 16:53:46 -08:00
def __init__(self, image_id):
2014-01-14 12:39:08 -08:00
super(ImageDownloadError, self).__init__()
self.details = 'Could not download image with id {0}.'.format(image_id)
2014-01-14 13:05:22 -08:00
class ImageChecksumError(RESTError):
2014-01-14 13:05:22 -08:00
"""Error raised when an image fails to verify against its checksum."""
message = 'Error verifying image checksum.'
def __init__(self, image_id):
super(ImageChecksumError, self).__init__()
self.details = 'Image with id {0} failed to verify against checksum.'
2014-01-15 16:23:06 -08:00
self.details = self.details.format(image_id)
2014-01-15 11:20:05 -08:00
class ImageWriteError(RESTError):
2014-01-15 11:20:05 -08:00
"""Error raised when an image cannot be written to a device."""
message = 'Error writing image to device.'
def __init__(self, exit_code, device):
super(ImageWriteError, self).__init__()
self.details = 'Writing image to device {0} failed with exit code {1}.'
2014-01-15 16:23:06 -08:00
self.details = self.details.format(device, exit_code)
2014-01-17 15:59:56 -08:00
class ConfigDriveWriteError(RESTError):
2014-01-28 15:54:24 -08:00
"""Error raised when a configdrive directory cannot be written to a
device.
"""
message = 'Error writing configdrive to device.'
def __init__(self, exit_code, device):
details = 'Writing configdrive to device {0} failed with exit code ' \
'{1}.'
2014-01-28 15:54:24 -08:00
details = details.format(device, exit_code)
super(ConfigDriveWriteError, self).__init__(details)
self.details = details
class SystemRebootError(RESTError):
2014-01-17 15:59:56 -08:00
"""Error raised when a system cannot reboot."""
message = 'Error rebooting system.'
def __init__(self, exit_code):
super(SystemRebootError, self).__init__()
self.details = 'Reboot script failed with exit code {0}.'
2014-01-17 15:59:56 -08:00
self.details = self.details.format(exit_code)