Current section
Files
Jump to
Current section
Files
lib/client.ex
defmodule Kaper.Client do
defmacro __using__(config) do
quote do
@conf unquote(config)
def conf, do: @conf
def list_tasks(opts \\ %{}) do
unquote(__MODULE__).list_tasks(conf(), opts)
end
def define_task(type, dbrps, script, status \\ :enabled, vars \\ %{}, id \\ "", template_id \\ "") do
unquote(__MODULE__).define_task(conf(), type, dbrps, script, status, vars, id, template_id)
end
def get_task(id, dot_view \\ "attributes", script_format \\ "formatted") do
unquote(__MODULE__).get_task(conf(), id)
end
def delete_task(id) do
unquote(__MODULE__).delete_task(conf(), id)
end
def enable_task(id) do
unquote(__MODULE__).enable_task(conf(), id)
end
def disable_task(id) do
unquote(__MODULE__).disable_task(conf(), id)
end
def define_template(type, script, id \\ "") do
unquote(__MODULE__).define_template(conf(), type, script, id)
end
end
end
def list_tasks(conf, opts \\ %{}) do
do_list_tasks(conf, opts)
end
defp do_list_tasks(conf, opts) do
attrs = remove_empty_values(%{
"pattern": Dict.get(opts, :pattern),
"fields": Dict.get(opts, :fields),
"dot-view": Dict.get(opts, :dotview),
"script-format": Dict.get(opts, :scriptformat),
"offset": Dict.get(opts, :offset),
"limit": Dict.get(opts, :limit),
})
query = URI.encode_query(attrs)
req_url = add_query(url("/kapacitor/v1/tasks", conf[:url]), query)
request conf, :get, req_url, [], "", ""
end
def define_task(conf, type, dbrps, script, status \\ :enabled, vars \\ %{}, id \\ nil, template_id \\ nil) do
do_define_task(conf, type, dbrps, script, status, vars, id, template_id)
end
defp do_define_task(conf, type, dbrps, script, status, vars, id , template_id) do
attrs = %{
"type": type,
"dbrps": dbrps,
"script": script,
"status": status,
"vars": vars,
"id": id,
"template_id": template_id,
}
req_url = url("/kapacitor/v1/tasks", conf[:url])
body = Poison.encode!(attrs)
request conf, :post, req_url, [], "application/json", body
end
def enable_task(conf, id) do
do_update_task_status(conf, id, "enabled")
end
def disable_task(conf, id) do
do_update_task_status(conf, id, "disabled")
end
defp do_update_task_status(conf, id, status) do
attrs = %{
"status": status,
}
req_url = url(Path.join("/kapacitor/v1/tasks/", id), conf[:url])
body = Poison.encode!(attrs)
request conf, :patch, req_url, [], "application/json", body
end
def delete_task(conf, id) do
do_delete_task(conf, id)
end
defp do_delete_task(conf, id) do
req_url = url(Path.join("/kapacitor/v1/tasks/", id), conf[:url])
request conf, :delete, req_url, [], "", ""
end
def get_task(conf, id, dot_view \\ "attributes", script_format \\ "formatted") do
do_get_task(conf, id, dot_view, script_format)
end
defp do_get_task(conf, id, dot_view, script_format) do
attrs = remove_empty_values(%{
"dot-view": dot_view,
"script-format": script_format,
})
query = URI.encode_query(attrs)
req_url = add_query(url(Path.join("/kapacitor/v1/tasks/", id), conf[:url]), query)
request conf, :get, req_url, [], "", ""
end
defp remove_empty_values(map) do
map
|> Enum.filter(fn {_, v} -> v != nil && v != "" end)
|> Enum.into(%{})
end
defp url(path, domain), do: Path.join([domain, path])
defp request(conf, method, url, headers, ctype, body) do
options = case conf[:basic_auth_username] != "" && conf[:basic_auth_password] != "" do
true ->
[{:hackney, [basic_auth: {conf[:basic_auth_username], conf[:basic_auth_password]}]}]
_ ->
[]
end
case method do
:get ->
HTTPoison.get(url, [], options)
_ ->
headers = headers ++ [{'Content-Type', ctype}]
HTTPoison.request(
method,
url,
body,
headers,
options
)
end
|> normalize_response
end
defp normalize_response(response) do
case response do
{:ok, %HTTPoison.Response{body: body, status_code: 200}} ->
{:ok, Poison.decode!(body) |> Enum.map(fn({k, v}) -> {String.to_atom(k), v} end) }
{:ok, %HTTPoison.Response{status_code: 204}} ->
{:ok, %{}}
{:ok, %HTTPoison.Response{body: body}} ->
{:error, body }
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, reason}
end
end
defp add_query(url, ""), do: url
defp add_query(url, query), do: url <> "?" <> query
end