Source code for podman.errors.exceptions
"""Podman API Errors."""
from typing import Iterable, List, Optional, Union, TYPE_CHECKING
from requests import Response
from requests.exceptions import HTTPError
# Break circular import
if TYPE_CHECKING:
from podman.domain.containers import Container
from podman.api.client import APIResponse
[docs]
class APIError(HTTPError):
"""Wraps HTTP errors for processing by the API and clients."""
def __init__(
self,
message: str,
response: Union[Response, "APIResponse", None] = None,
explanation: Optional[str] = None,
):
"""Initialize APIError.
Args:
message: Message from service. Default: response.text, may be enhanced or wrapped by
bindings
response: HTTP Response from service.
explanation: An enhanced or wrapped version of message with additional context.
"""
super().__init__(message, response=response)
self.explanation = explanation
def __str__(self):
msg = super().__str__()
if self.response is not None:
msg = self.response.reason
if self.is_client_error():
msg = f"{self.status_code} Client Error: {msg}"
elif self.is_server_error():
msg = f"{self.status_code} Server Error: {msg}"
if self.explanation:
msg = f"{msg} ({self.explanation})"
return msg
@property
def status_code(self):
"""Optional[int]: HTTP status code from response."""
if self.response is not None:
return self.response.status_code
return None
[docs]
def is_error(self) -> bool:
"""Returns True when HTTP operation resulted in an error."""
return self.is_client_error() or self.is_server_error()
[docs]
def is_client_error(self) -> bool:
"""Returns True when request is incorrect."""
return 400 <= (self.status_code or 0) < 500
[docs]
def is_server_error(self) -> bool:
"""Returns True when error occurred in service."""
return 500 <= (self.status_code or 0) < 600
[docs]
class NotFound(APIError):
"""Resource not found on Podman service.
Named for compatibility.
"""
[docs]
class ImageNotFound(APIError):
"""Image not found on Podman service."""
class DockerException(Exception):
"""Base class for exception hierarchy.
Provided for compatibility.
"""
[docs]
class PodmanError(DockerException):
"""Base class for PodmanPy exceptions."""
[docs]
class BuildError(PodmanError):
"""Error occurred during build operation."""
def __init__(self, reason: str, build_log: Iterable[str]) -> None:
"""Initialize BuildError.
Args:
reason: describes the error
build_log: build log output
"""
super().__init__(reason)
self.msg = reason
self.build_log = build_log
[docs]
class ContainerError(PodmanError):
"""Represents a container that has exited with a non-zero exit code."""
def __init__(
self,
container: "Container",
exit_status: int,
command: Union[str, List[str]],
image: str,
stderr: Optional[Iterable[str]] = None,
):
"""Initialize ContainerError.
Args:
container: Container that reported error.
exit_status: Non-zero status code from Container exit.
command: Command passed to container when created.
image: Name of image that was used to create container.
stderr: Errors reported by Container.
"""
err = f": {stderr}" if stderr is not None else ""
msg = (
f"Command '{command}' in image '{image}' returned non-zero exit "
f"status {exit_status}{err}"
)
super().__init__(msg)
self.container = container
self.exit_status: int = exit_status
self.command = command
self.image = image
self.stderr = stderr
[docs]
class InvalidArgument(PodmanError):
"""Parameter to method/function was not valid."""