# Copyright 2023 Canonical Ltd.
# Licensed under the Apache V2, see LICENCE file for details.
[docs]class JujuError(Exception):
def __init__(self, *args, **kwargs):
self.message = ''
self.errors = []
if args:
self.message = str(args[0])
if isinstance(args[0], (list, tuple)):
self.errors = args[0]
elif len(args) > 1:
self.errors = list(args)
else:
self.errors = [self.message]
super().__init__(*args, **kwargs)
[docs]class JujuAPIError(JujuError):
def __init__(self, result):
self.result = result
self.message = result['error']
self.error_code = result.get('error-code')
self.response = result['response']
self.request_id = result['request-id']
self.error_info = result['error-info'] if 'error-info' in result else None
super().__init__(self.message)
[docs]class JujuConnectionError(ConnectionError, JujuError):
pass
[docs]class JujuAuthError(JujuConnectionError):
pass
[docs]class JujuRedirectException(Exception):
"""Exception indicating that a redirection was requested"""
def __init__(self, redirect_info, follow_redirect=True):
self.redirect_info = redirect_info
self.follow_redirect = follow_redirect
@property
def ca_cert(self):
return self.redirect_info['ca-cert']
@property
def endpoints(self):
return [
('{value}:{port}'.format(**s), self.ca_cert)
for servers in self.redirect_info['servers']
for s in servers if s['scope'] == 'public' or not self.follow_redirect
]
[docs]class JujuEntityNotFoundError(JujuError):
"""Exception indicating that an entity was not found in the state. It was
expected that the entity was found in state and this is a terminal
condition.
To fix this condition, you should disconnect and reconnect to ensure that
any missing entities are correctly picked up."""
def __init__(self, entity_name, entity_types=None):
self.entity_name = entity_name
self.entity_types = entity_types
super().__init__("Entity not found: {}".format(entity_name))
[docs]class JujuModelError(JujuError):
pass
[docs]class JujuMachineError(JujuError):
pass
[docs]class JujuAgentError(JujuError):
pass
[docs]class JujuAppError(JujuError):
pass
[docs]class JujuUnitError(JujuError):
pass
[docs]class JujuPermissionError(JujuError):
pass
[docs]class JujuBackupError(JujuError):
pass
[docs]class PylibjujuProgrammingError(Exception):
pass
[docs]class JujuNotSupportedError(JujuError):
pass
[docs]class JujuNotValid(JujuError):
def __init__(self, entity_type, entity_name):
self.entity_type = entity_type
self.entity_name = entity_name
super().__init__(f'Invalid {entity_type} : {entity_name}')
[docs]class JujuConfigError(JujuError):
"""Exception raised during processing a configuration key-value pair
in a config set for an application.
"""
def __init__(self, config, config_pair, message=None):
self.config = config
self.config_pair = config_pair
if message is None:
self.message = "Couldn't process the value of a config pair : %s, value of type %s" % (self.config_pair, type(self.config_pair[1]))
else:
self.message = message
super().__init__(self.message)
[docs]class JujuApplicationConfigError(JujuConfigError):
pass
[docs]class JujuModelConfigError(JujuConfigError):
pass
[docs]class JujuControllerNotFoundError(JujuError):
pass
[docs]class AbstractMethodError(Exception):
pass
[docs]class PylibjujuError(JujuError):
pass
[docs]class JujuUnknownVersion(PylibjujuError):
pass