diff options
Diffstat (limited to 'ironic_python_agent/errors.py')
| -rw-r--r-- | ironic_python_agent/errors.py | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/ironic_python_agent/errors.py b/ironic_python_agent/errors.py new file mode 100644 index 00000000..ff4960dc --- /dev/null +++ b/ironic_python_agent/errors.py @@ -0,0 +1,179 @@ +""" +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. +""" + +from ironic_python_agent import encoding +from ironic_python_agent import utils + + +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.""" + 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 + + +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.' + + +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): + """Error which is raised when an unknown command is issued.""" + + messsage = 'Invalid command' + + def __init__(self, details): + super(InvalidCommandError, self).__init__(details) + + +class InvalidCommandParamsError(InvalidContentError): + """Error which is raised when command parameters are invalid.""" + + message = 'Invalid command parameters' + + def __init__(self, details): + super(InvalidCommandParamsError, self).__init__(details) + + +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): + """Error raised when a call to the agent API fails.""" + + message = 'Error in call to ironic-api.' + + def __init__(self, details): + super(IronicAPIError, self).__init__(details) + self.details = details + + +class HeartbeatError(IronicAPIError): + """Error raised when a heartbeat to the agent API fails.""" + + message = 'Error heartbeating to agent API.' + + def __init__(self, details): + super(HeartbeatError, self).__init__(details) + + +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): + """Error raised when an image cannot be downloaded.""" + + message = 'Error downloading image.' + + def __init__(self, image_id): + super(ImageDownloadError, self).__init__() + self.details = 'Could not download image with id {0}.'.format(image_id) + + +class ImageChecksumError(RESTError): + """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.' + self.details = self.details.format(image_id) + + +class ImageWriteError(RESTError): + """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}.' + self.details = self.details.format(device, exit_code) + + +class ConfigDriveWriteError(RESTError): + """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}.' + details = details.format(device, exit_code) + super(ConfigDriveWriteError, self).__init__(details) + self.details = details + + +class SystemRebootError(RESTError): + """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}.' + self.details = self.details.format(exit_code) |
