defmodule Elastix.Snapshot.Snapshot do @moduledoc """ Functions for working with snapshots. [Elastic documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html) """ import Elastix.HTTP, only: [prepare_url: 2] alias Elastix.{HTTP, JSON} @doc """ Creates a snapshot. """ @spec create(String.t(), String.t(), String.t(), Map.t(), [tuple()], Keyword.t()) :: {:ok, %HTTPoison.Response{}} def create(elastic_url, repo_name, snapshot_name, data \\ %{}, query_params \\ [], options \\ []) do elastic_url |> prepare_url(make_path(repo_name, snapshot_name, query_params)) |> HTTP.put(JSON.encode!(data), [], _make_httpoison_options(options)) end @doc """ Restores a previously created snapshot. """ @spec restore(String.t(), String.t(), String.t(), Map.t(), Keyword.t()) :: {:ok, %HTTPoison.Response{}} def restore(elastic_url, repo_name, snapshot_name, data \\ %{}, options \\ []) do elastic_url |> prepare_url([make_path(repo_name, snapshot_name), "_restore"]) |> HTTP.post(JSON.encode!(data), [], _make_httpoison_options(options)) end @doc """ If repo_name and snapshot_name is specified, will retrieve the status of that snapsot. If repo_name is specified, will retrieve the status of all snapshots in that repository. Otherwise, will retrieve the status of all snapshots. """ @spec status(String.t(), String.t(), String.t(), Keyword.t()) :: {:ok, %HTTPoison.Response{}} def status(elastic_url, repo_name \\ "", snapshot_name \\ "", options \\ []) do elastic_url |> prepare_url([make_path(repo_name, snapshot_name), "_status"]) |> HTTP.get([], _make_httpoison_options(options)) end @doc """ If repo_name and snapshot_name is specified, will retrieve information about that snapshot. If repo_name is specified, will retrieve information about all snapshots in that repository. Otherwise, will retrieve information about all snapshots. """ @spec get(String.t(), String.t(), String.t(), Keyword.t()) :: {:ok, %HTTPoison.Response{}} def get(elastic_url, repo_name \\ "", snapshot_name \\ "_all", options \\ []) do elastic_url |> prepare_url(make_path(repo_name, snapshot_name)) |> HTTP.get([], _make_httpoison_options(options)) end @doc """ Deletes a snapshot from a repository. This can also be used to stop currently running snapshot and restore operations. Snapshot deletes can be slow, so you can pass in HTTPoison/Hackney options in an `httpoison_options` keyword argument like `:recv_timeout` to wait longer. ## Examples iex> Elastix.Snapshot.Snapshot.delete("http://localhost:9200", "backups", "snapshot_123", httpoison_options: [recv_timeout: 30_000]) {:ok, %HTTPoison.Response{...}} """ @spec delete(String.t(), String.t(), String.t(), Keyword.t()) :: {:ok, %HTTPoison.Response{}} def delete(elastic_url, repo_name, snapshot_name, options \\ []) do elastic_url |> prepare_url(make_path(repo_name, snapshot_name)) |> HTTP.delete([], _make_httpoison_options(options)) end @doc false @spec make_path(String.t(), [tuple()]) :: String.t() def make_path(repo_name, snapshot_name, query_params \\ []) do path = _make_base_path(repo_name, snapshot_name) case query_params do [] -> path _ -> _add_query_params(path, query_params) end end defp _make_httpoison_options(options), do: Keyword.get(options, :httpoison_options, []) defp _make_base_path(nil, nil), do: "/_snapshot" defp _make_base_path(repo_name, nil), do: "/_snapshot/#{repo_name}" defp _make_base_path(repo_name, snapshot_name), do: "/_snapshot/#{repo_name}/#{snapshot_name}" defp _add_query_params(path, query_params) do query_string = query_params |> Enum.map_join("&", fn param -> "#{elem(param, 0)}=#{elem(param, 1)}" end) "#{path}?#{query_string}" end end