dotfiles/app/lib/prymn/agents.ex

58 lines
1.6 KiB
Elixir
Raw Normal View History

defmodule Prymn.Agents do
@moduledoc ~S"""
Prymn Agents are programs that manage a remote client machine. Prymn backend
communicates with them using GRPC calls. GRPC connections are started using
the Prymn.Agents.ConnectionSupervisor and are book-kept using the
Prymn.Agents.Registry.
"""
alias Prymn.Agents.Connection
alias Prymn.Agents.Health
def start_connection(host_address) do
spec = {Connection, host_address}
case DynamicSupervisor.start_child(Prymn.Agents.ConnectionSupervisor, spec) do
{:ok, _pid} -> :ok
{:error, {:already_started, _pid}} -> :ok
{:error, error} -> {:error, error}
end
end
@doc """
Subscribe to the host's Health using Phoenix.PubSub Broadcasted messages are
the Health struct:
%Prymn.Agents.Health{}
"""
def subscribe_to_health(host_address) do
:ok = Health.subscribe(host_address)
end
@doc """
Return the last known health status of the Agent, or `nil` if it doesn't
exist.
"""
def get_health(host_address) do
Health.lookup(host_address)
end
# TODO: We should not expose this api, instead wrap every GRPC call in this
# module GRPC is an "internal implementation detail" (although it probably
# wont ever change)
#
# E.g.
# def get_sys_info(agent) do
# PrymnProto.Prymn.Agent.Stub.get_sys_info(agent.channel, %Google.Protobuf.Empty{})
# end
def get_channel(host_address) do
with [{pid, _}] <- Registry.lookup(Prymn.Agents.Registry, host_address),
channel when channel != nil <- Connection.get_channel(pid) do
{:ok, channel}
else
_ -> {:error, :not_found}
end
end
end