Current section
Files
Jump to
Current section
Files
lib/ttl/worker.ex
defmodule MeshxConsul.Ttl.Worker do
@moduledoc false
use GenServer
alias MeshxConsul.Service.Reg
defstruct [:id, status: "passing", ttl: 10_000]
@allowed_status ["passing", "warning", "critical"]
def start_link([id, ttl_opts]), do: GenServer.start_link(__MODULE__, ttl_opts, name: id)
def get_status(id), do: GenServer.call(id, :get_status)
def set_status(id, status) when status in @allowed_status, do: GenServer.cast(id, {:set_status, status})
def cleanup(id), do: GenServer.cast(id, :cleanup)
@impl true
def init(ttl_args) do
Process.send_after(self(), :run_check, 100, [])
{:ok, Map.merge(%__MODULE__{}, ttl_args)}
end
@impl true
def handle_info(:run_check, %__MODULE__{} = state) do
Reg.update_check(state.id, state.status)
Process.send_after(self(), :run_check, state.ttl, [])
{:noreply, state}
end
@impl true
def handle_call(:get_status, _from, %__MODULE__{} = state), do: {:reply, state.status, state}
@impl true
def handle_cast({:set_status, status}, %__MODULE__{} = state) when status in @allowed_status do
Reg.update_check(state.id, status)
{:noreply, %__MODULE__{state | status: status}}
end
@impl true
def handle_cast(:cleanup, %__MODULE__{} = state) do
Reg.deregister_check(state.id)
{:noreply, state}
end
@impl true
def terminate(_reason, %__MODULE__{} = state), do: Reg.deregister_check(state.id)
end