Packages
livebook
0.8.0
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
Security advisory:
This version has known vulnerabilities.
View advisories
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 flex flex-col space-y-5">
<h3 class="text-2xl font-semibold text-gray-800">
Add file system
</h3>
<p class="text-gray-700">
Configure an AWS S3 bucket as a Livebook file system.
Many storage services offer an S3-compatible API and
those work as well.
</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>
<.with_password_toggle id="access-key-password-toggle">
<%= text_input(f, :access_key_id,
value: @data["access_key_id"],
class: "input",
type: "password"
) %>
</.with_password_toggle>
</div>
<div>
<div class="input-label">Secret Access Key</div>
<.with_password_toggle id="secret-access-key-password-toggle">
<%= text_input(f, :secret_access_key,
value: @data["secret_access_key"],
class: "input",
type: "password"
) %>
</.with_password_toggle>
</div>
<div class="flex space-x-2">
<button class="button-base button-blue" type="submit" disabled={not data_valid?(@data)}>
Add
</button>
<%= live_patch("Cancel", to: @return_to, class: "button-base button-outlined-gray") %>
</div>
</div>
</.form>
</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, _} ->
Livebook.Settings.save_filesystem(file_system)
send(self(), {:file_systems_updated, Livebook.Settings.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