defmodule MemcachedDiscovery.DNS do @moduledoc """ Discovers memcached nodes via a DNS query against an A-record (for example against a kubernetes headless service) """ @behaviour Herd.Discovery require Logger def nodes() do service = service_name() case :inet_res.getbyname(service, :a) do {:ok, {:hostent, _fqdn, [], :inet, _value, addresses}} -> addresses |> Enum.map(&:inet_parse.ntoa(&1)) |> Memcachir.Util.parse_hostname() {:error, reason} -> Logger.error("lookup against #{service} failed: #{inspect(reason)}") [] end end def service_name(), do: Application.get_env(:memcachir, __MODULE__)[:dns] end