TerrariumDaytona

Hex.pmHexDocsCI

A Daytona provider for Terrarium sandbox environments.

Installation

Add terrarium_daytona to your list of dependencies in mix.exs:

def deps do
  [
    {:terrarium, "~> 0.1.0"},
    {:terrarium_daytona, "~> 0.1.0"}
  ]
end

Configuration

# config/runtime.exs
config :terrarium,
  default: :daytona,
  providers: [
    daytona: {Terrarium.Providers.Daytona,
      api_key: System.fetch_env!("DAYTONA_API_KEY")
    }
  ]

Options

Usage

# Create a sandbox using the configured default
{:ok, sandbox} = Terrarium.create(image: "debian:12")

# Or specify the provider explicitly
{:ok, sandbox} = Terrarium.create(:daytona, snapshot: "ubuntu-4vcpu-8ram-100gb")

# Execute commands
{:ok, result} = Terrarium.exec(sandbox, "echo hello")
IO.puts(result.stdout)

# File operations
:ok = Terrarium.write_file(sandbox, "/home/daytona/hello.txt", "Hello from Terrarium!")
{:ok, content} = Terrarium.read_file(sandbox, "/home/daytona/hello.txt")

# Clean up
:ok = Terrarium.destroy(sandbox)

Telemetry

This provider emits the following :telemetry events, in addition to the generic events from Terrarium.Telemetry:

Event Measurements Metadata
[:terrarium, :daytona, :api_request, :start]%{system_time: integer}%{method: atom, url: String.t()}
[:terrarium, :daytona, :api_request, :stop]%{duration: integer}%{method: atom, url: String.t(), status: integer} (success) or %{method: atom, url: String.t(), error: term()} (failure)
[:terrarium, :daytona, :api_request, :exception]%{duration: integer}%{method: atom, url: String.t()}
[:terrarium, :daytona, :poll]%{remaining_timeout: integer}%{sandbox_id: String.t(), poll_interval: integer}

Example

:telemetry.attach_many(
  "daytona-logger",
  [
    [:terrarium, :daytona, :api_request, :stop],
    [:terrarium, :daytona, :poll]
  ],
  fn event, measurements, metadata, _config ->
    Logger.info("#{inspect(event)}: #{inspect(measurements)} #{inspect(metadata)}")
  end,
  nil
)

License

This project is licensed under the MIT License.