Packages
livebook
0.3.1
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.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook_web/live/settings_live/add_file_system_component.ex
defmodule LivebookWeb.SettingsLive.AddFileSystemComponent do
use LivebookWeb, :live_component
alias Livebook.FileSystem
@impl true
def mount(socket) do
{:ok, assign(socket, data: empty_data(), error_message: nil)}
end
@impl true
def render(assigns) do
~H"""
<div class="p-6 pb-4 max-w-4xl flex flex-col space-y-3">
<h3 class="text-2xl font-semibold text-gray-800">
Add file system
</h3>
<div class="w-full flex-col space-y-5">
<p class="text-gray-700">
Configure an AWS S3 bucket as a drop in replacement of the regular
file system. Many storage services offer an S3-compatible API, so
you can use those as well. One such service is
<a class="link" href="https://www.storj.io" rel="noreferrer noopener">Storj</a>
and they offer free storage.
</p>
<p class="text-gray-700">
Note that any other user of your Livebook could theoretically extract
the credentials, so make sure to properly limit their access to this
specific bucket.
</p>
<%= if @error_message do %>
<div class="error-box">
<%= @error_message %>
</div>
<% end %>
<.form let={f} for={:data}
phx-target={@myself}
phx-submit="add"
phx-change="validate"
autocomplete="off"
spellcheck="false">
<div class="flex flex-col space-y-4">
<div>
<div class="input-label">Bucket URL</div>
<%= text_input f, :bucket_url, value: @data["bucket_url"], class: "input", placeholder: "https://s3.[region].amazonaws.com/[bucket]" %>
</div>
<div>
<div class="input-label">Access Key ID</div>
<%= text_input f, :access_key_id, value: @data["access_key_id"], class: "input", type: "password" %>
</div>
<div>
<div class="input-label">Secret Access Key</div>
<%= text_input f, :secret_access_key, value: @data["secret_access_key"], class: "input", type: "password" %>
</div>
</div>
<div class="mt-5 flex justify-end space-x-2">
<%= live_patch "Cancel", to: @return_to, class: "button button-outlined-gray" %>
<button class="button button-blue"
type="submit"
disabled={not data_valid?(@data)}>
Add
</button>
</div>
</.form>
</div>
</div>
"""
end
@impl true
def handle_event("validate", %{"data" => data}, socket) do
{:noreply, assign(socket, :data, data)}
end
def handle_event("add", %{"data" => data}, socket) do
file_system = data_to_file_system(data)
default_dir = FileSystem.File.new(file_system)
case FileSystem.File.list(default_dir) do
{:ok, _} ->
file_systems = Livebook.Config.append_file_system(file_system)
send(self(), {:file_systems_updated, file_systems})
{:noreply, push_patch(socket, to: socket.assigns.return_to)}
{:error, message} ->
{:noreply, assign(socket, error_message: "Connection test failed: " <> message)}
end
end
defp empty_data() do
%{"bucket_url" => "", "access_key_id" => "", "secret_access_key" => ""}
end
defp data_valid?(data) do
Livebook.Utils.valid_url?(data["bucket_url"]) and data["access_key_id"] != "" and
data["secret_access_key"] != ""
end
defp data_to_file_system(data) do
FileSystem.S3.new(data["bucket_url"], data["access_key_id"], data["secret_access_key"])
end
end