lib/k8s/conn/auth/basic_auth.ex

defmodule K8s.Conn.Auth.BasicAuth do
  @moduledoc """
  basic auth cluster authentication
  """

  @behaviour K8s.Conn.Auth

  defstruct [:token]
  @type t :: %__MODULE__{token: binary}

  @impl true
  @spec create(map(), String.t()) :: {:ok, t()} | :skip
  def create(%{"username" => username, "password" => password}, _) do
    {:ok, %__MODULE__{token: Base.encode64("#{username}:#{password}")}}
  end

  def create(_, _), do: :skip

  defimpl K8s.Conn.RequestOptions, for: K8s.Conn.Auth.BasicAuth do
    @doc "Generates HTTP Authorization options for basic auth authentication"
    @spec generate(K8s.Conn.Auth.BasicAuth.t()) :: K8s.Conn.RequestOptions.generate_t()
    def generate(%K8s.Conn.Auth.BasicAuth{token: token}) do
      {:ok,
       %K8s.Conn.RequestOptions{
         headers: [{:Authorization, "Basic #{token}"}],
         ssl_options: []
       }}
    end
  end
end