lib/k8s/client/api_error.ex

defmodule K8s.Client.APIError do
  @moduledoc """
  Kubernetes API Error

  Any HTTP Error with JSON error payload
  """

  defexception message: nil, reason: nil
  @type t :: %__MODULE__{message: String.t(), reason: String.t()}
  @spec message(__MODULE__.t()) :: String.t()
  def message(%__MODULE__{message: message}), do: message

  # Kubernetes specific errors are typically wrapped in a JSON body
  # see: https://github.com/kubernetes/apimachinery/blob/master/pkg/api/errors/errors.go
  # so one must differentiate between e.g ordinary 404s and kubernetes 404
  @spec from_kubernetes_error(map) :: {:error, __MODULE__.t()}
  def from_kubernetes_error(%{"reason" => reason, "message" => message}) do
    err = %__MODULE__{message: message, reason: reason}
    {:error, err}
  end

  def from_kubernetes_error(%{"status" => "Failure", "message" => message}) do
    err = %__MODULE__{message: message, reason: "Failure"}
    {:error, err}
  end
end