blob: 328dcca4e480259403755d83cbdf20df7b09f934 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright (C) 2016 Codethink Limited
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
from enum import Enum
# The last raised exception, this is used in test cases only
_last_exception = None
def _get_last_exception():
global _last_exception
le = _last_exception
_last_exception = None
return le
# BstError is an internal base exception class for BuildSream
# exceptions.
#
# The sole purpose of using the base class is to add additional
# context to exceptions raised by plugins in child tasks, this
# context can then be communicated back to the main process.
#
class BstError(Exception):
def __init__(self, message):
global _last_exception
super(BstError, self).__init__(message)
# The build sandbox in which the error occurred, if the
# error occurred at element assembly time.
#
self.sandbox = None
# Hold on to the last raised exception for testing purposes
_last_exception = self
# PluginError
#
# Raised on plugin related errors.
#
# This exception is raised either by the plugin loading process,
# or by the base :class:`.Plugin` element itself.
#
class PluginError(BstError):
pass
# LoadErrorReason
#
# Describes the reason why a :class:`.LoadError` was raised.
#
class LoadErrorReason(Enum):
# A file was not found.
MISSING_FILE = 1
# The parsed data was not valid YAML.
INVALID_YAML = 2
# Data was malformed, a value was not of the expected type, etc
INVALID_DATA = 3
# An error occurred during YAML dictionary composition.
#
# This can happen by overriding a value with a new differently typed
# value, or by overwriting some named value when that was not allowed.
ILLEGAL_COMPOSITE = 4
# An circular dependency chain was detected
CIRCULAR_DEPENDENCY = 5
# A variable could not be resolved. This can happen if your project
# has cyclic dependencies in variable declarations, or, when substituting
# a string which refers to an undefined variable.
UNRESOLVED_VARIABLE = 6
# BuildStream does not support the required project format version
UNSUPPORTED_PROJECT = 7
# A conditional expression failed to resolve
EXPRESSION_FAILED = 8
# An assertion was intentionally encoded into project YAML
USER_ASSERTION = 9
# A list composition directive did not apply to any underlying list
TRAILING_LIST_DIRECTIVE = 10
# LoadError
#
# Raised while loading some YAML.
#
# This exception is raised when loading or parsing YAML, or when
# interpreting project YAML
#
class LoadError(BstError):
def __init__(self, reason, message):
super(LoadError, self).__init__(message)
# The :class:`.LoadErrorReason` for which this exception was raised
#
self.reason = reason
# ImplError
#
# Raised when a :class:`.Source` or :class:`.Element` plugin fails to
# implement a mandatory method
#
class ImplError(BstError):
pass
# ProgramNotFoundError
#
# Raised if a required program is not found
#
# BuildStream requires various software to exist on the host for
# it to work correctly. This exception is thrown if that software
# can not be found. E.g. The :class:`.Sandbox` class expects that
# bubblewrap is installed for it to work.
#
class ProgramNotFoundError(BstError):
pass
# PlatformError
#
# Raised if the current platform is not supported.
class PlatformError(BstError):
pass
# SandboxError
#
# Raised when errors are encountered by the sandbox implementation
#
class SandboxError(BstError):
pass
# ArtifactError
#
# Raised when errors are encountered in the artifact caches
#
class ArtifactError(BstError):
pass
# PipelineError
#
# Raised when a pipeline fails
#
class PipelineError(BstError):
def __init__(self, message=None):
# The empty string should never appear to a user,
# this only allows us to treat this internal error as
# a BstError from the frontend.
if message is None:
message = ""
super(PipelineError, self).__init__(message)