Packages

Kubernetes integration for and in pure Elixir.

Current section

Files

Jump to
kubex lib kubex.ex
Raw

lib/kubex.ex

defmodule Kubex do
def server(address, username, password, query \\ nil) do
%{ ensure_query(query) | server: {address, username, password} }
end
def server_from_environment(username \\ nil, password \\ nil, query \\ nil) do
env_server = Application.get_env(:kubex, :server)
address = case env_server[:address] do
nil -> "https://" <> System.get_env("KUBERNETES_SERVICE_HOST") <> ":" <> System.get_env("KUBERNETES_SERVICE_PORT")
address -> address
end
case {username, password, env_server[:username], env_server[:password]} do
{nil, nil, nil, nil} -> Kubex.server(address, "no", "user", query)
{u, p, _, _} when not is_nil(u) and not is_nil(p) -> Kubex.server(address, u, p, query)
{_, _, u, p} when not is_nil(u) and not is_nil(p) -> Kubex.server(address, u, p, query)
end
end
def query(:label_selector, label_selector) do
query(nil, :label_selector, label_selector)
end
def query(q, :label_selector, label_selector) do
%{ensure_query(q) | label_selector: label_selector}
end
def get_pods(q \\ nil) do
%{ensure_query(q) | type: :pods}
|> execute_get
end
def execute_get(query) do
if is_nil(query.server), do: query = server_from_environment(nil,nil,query)
url = generate_url query
result = get(query.server, url)
result["items"]
end
defp generate_url(%Kubex.Query{} = query) do
%Kubex.Query{type: type, label_selector: label_selector} = query
args = []
if not is_nil(label_selector) do
args = args ++ ["labelSelector=#{label_selector}"]
end
base = case type do
:pods -> "pods"
end
"#{base}?#{Enum.join(args, "&")}"
end
defp get({address, username, password}, url) do
auth = Base.encode64("#{username}:#{password}")
%HTTPoison.Response{ body: result } = HTTPoison.get! "#{address}/api/v1/#{url}", [{:Authorization, "Basic #{auth}"}], hackney: [insecure: true]
Poison.decode! result
end
def start_pinger(query, id) do
Kubex.Pinger.add_query(Kubex.Pinger, id, query)
end
defp ensure_query(nil) do
%Kubex.Query{}
end
defp ensure_query(%Kubex.Query{} = q) do
q
end
end