defmodule NodeManager do def all_nodes do [Node.self | Node.list] end def list, do: all_nodes def app_nodes(app_name) do filter_nodes(app_name) end def random_app_node(app_name) do app_nodes(app_name) |> Enum.random end def send_request(app_name, module, function, params) do rpc_node = random_app_node(app_name) case result = :rpc.call(rpc_node, module, function, params) do {:badrpc, reason} -> {:error, "Unable to contact #{app_name} node: #{reason}"} _ -> result end end def connect do for tmp <- app_list do {name, host} = tmp Node.connect :"#{name}@#{host}" end end defp app_list do Application.get_env(:node_manager, :app_list) end defp filter_nodes(app_name) do all_nodes |> Enum.filter(fn(x) -> node_name = x |> Atom.to_string Regex.match?(~r/#{app_name}@/, node_name) end) end end