Packages
dagger
0.12.1
0.21.7
0.21.6
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.8
0.20.7
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.11
0.19.10
0.19.9
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.19
0.18.18
0.18.17
0.18.16
0.18.15
0.18.14
0.18.13
0.18.12
0.18.11
0.18.10
0.18.9
0.18.8
0.18.7
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.2
0.17.1
0.17.0
0.16.3
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.2
0.0.0
retired
Dagger SDK for Elixir
Current section
Files
Jump to
Current section
Files
lib/dagger/core/engine_conn.ex
defmodule Dagger.Core.EngineConn do
@moduledoc false
alias Dagger.Core.Engine.Downloader
defstruct [:port, :token, :session_pid]
@dagger_cli_version "0.12.1"
@doc false
def get(opts) do
case from_session_env(opts) do
{:ok, conn} ->
{:ok, conn}
{:error, :workdir_configure_on_session} = error ->
error
_otherwise ->
case from_local_cli(opts) do
{:ok, conn} -> {:ok, conn}
{:error, :no_executable} -> from_remote_cli(opts)
otherwise -> otherwise
end
end
end
@doc false
def from_session_env(opts) do
with {:ok, port} <- System.fetch_env("DAGGER_SESSION_PORT"),
{:ok, token} <- System.fetch_env("DAGGER_SESSION_TOKEN"),
false <- Keyword.has_key?(opts, :workdir) do
{:ok,
%__MODULE__{
port: port,
token: token
}}
else
true -> {:error, :workdir_configure_on_session}
:error -> {:error, :no_session}
end
end
@doc false
def from_local_cli(opts) do
with {:ok, bin} <- System.fetch_env("_EXPERIMENTAL_DAGGER_CLI_BIN"),
bin = Path.expand(bin),
bin_path when is_binary(bin_path) <- System.find_executable(bin) do
start_cli_session(bin_path, opts)
else
:error -> {:error, :no_executable}
nil -> {:error, :no_executable}
otherwise -> otherwise
end
end
@doc false
def from_remote_cli(opts) do
case Downloader.download(@dagger_cli_version) do
{:ok, bin_path} ->
start_cli_session(bin_path, opts)
error ->
error
end
end
defp start_cli_session(bin_path, opts) do
connect_timeout = opts[:connect_timeout]
session_pid = spawn_link(Dagger.Session, :start, [bin_path, self(), opts])
receive do
{^session_pid, %{"port" => port, "session_token" => token}} ->
{:ok, %__MODULE__{port: port, token: token, session_pid: session_pid}}
after
connect_timeout -> {:error, :session_timeout}
end
end
# Constructing host connection.
@doc false
def host(%__MODULE__{port: port}), do: "127.0.0.1:#{port}"
# Get the token.
@doc false
def token(%__MODULE__{token: token}), do: token
# Disconnecting from Dagger session.
@doc false
def disconnect(%__MODULE__{session_pid: nil}) do
:ok
end
def disconnect(%__MODULE__{session_pid: pid}) do
Dagger.Session.stop(pid)
end
def engine_version(), do: @dagger_cli_version
end