@@ -127,10 +127,12 @@ defmodule LivebookWeb.SettingsLive do
application and is accessible only to the current machine.
<.live_component
- module={LivebookWeb.SettingsLive.EnvVarsComponent}
+ module={LivebookWeb.EnvVarsComponent}
id="env-vars"
env_vars={@env_vars}
return_to={Routes.settings_path(@socket, :page)}
+ add_env_var_path={Routes.settings_path(@socket, :add_env_var)}
+ target={@socket.view}
/>
@@ -205,9 +207,10 @@ defmodule LivebookWeb.SettingsLive do
patch={Routes.settings_path(@socket, :page)}
>
<.live_component
- module={LivebookWeb.SettingsLive.EnvVarComponent}
+ module={LivebookWeb.EnvVarComponent}
id="env-var"
env_var={@env_var}
+ headline="Configure your application global environment variables."
return_to={Routes.settings_path(@socket, :page)}
/>
@@ -269,7 +272,7 @@ defmodule LivebookWeb.SettingsLive do
{:noreply, assign(socket, file_system_id: file_system_id)}
end
- def handle_params(_params, _url, socket), do: {:noreply, socket}
+ def handle_params(_params, _url, socket), do: {:noreply, assign(socket, env_var: nil)}
@impl true
def handle_event("cancel_autosave_path", %{}, socket) do
@@ -320,8 +323,25 @@ defmodule LivebookWeb.SettingsLive do
{:noreply, assign(socket, :update_check_enabled, enabled)}
end
- def handle_event("clear_env_var", _, socket) do
- {:noreply, assign(socket, env_var: nil)}
+ def handle_event("save", %{"env_var" => attrs}, socket) do
+ env_var = %Livebook.Settings.EnvVar{}
+
+ case Livebook.Settings.set_env_var(socket.assigns.env_var || env_var, attrs) do
+ {:ok, _} ->
+ {:noreply, push_patch(socket, to: Routes.settings_path(socket, :page))}
+
+ {:error, _changeset} ->
+ {:noreply, socket}
+ end
+ end
+
+ def handle_event("edit_env_var", %{"env_var" => key}, socket) do
+ {:noreply, push_patch(socket, to: Routes.settings_path(socket, :edit_env_var, key))}
+ end
+
+ def handle_event("delete_env_var", %{"env_var" => key}, socket) do
+ Livebook.Settings.delete_env_var(key)
+ {:noreply, socket}
end
@impl true
@@ -338,7 +358,7 @@ defmodule LivebookWeb.SettingsLive do
end
def handle_info({:env_vars_changed, env_vars}, socket) do
- {:noreply, assign(socket, env_vars: env_vars)}
+ {:noreply, assign(socket, env_vars: env_vars, env_var: nil)}
end
def handle_info(_message, socket), do: {:noreply, socket}
diff --git a/lib/livebook_web/router.ex b/lib/livebook_web/router.ex
index c63148241..44efd6b20 100644
--- a/lib/livebook_web/router.ex
+++ b/lib/livebook_web/router.ex
@@ -59,6 +59,8 @@ defmodule LivebookWeb.Router do
live "/hub", Hub.NewLive, :new, as: :hub
live "/hub/:id", Hub.EditLive, :edit, as: :hub
+ live "/hub/:id/env-var/new", Hub.EditLive, :add_env_var, as: :hub
+ live "/hub/:id/env-var/edit/:env_var_id", Hub.EditLive, :edit_env_var, as: :hub
live "/sessions/:id", SessionLive, :page
live "/sessions/:id/shortcuts", SessionLive, :shortcuts
diff --git a/test/livebook_web/live/hub/edit_live_test.exs b/test/livebook_web/live/hub/edit_live_test.exs
index 54fcb217c..001ef3c16 100644
--- a/test/livebook_web/live/hub/edit_live_test.exs
+++ b/test/livebook_web/live/hub/edit_live_test.exs
@@ -17,7 +17,7 @@ defmodule LivebookWeb.Hub.EditLiveTest do
end
describe "fly" do
- test "updates fly", %{conn: conn, bypass: bypass} do
+ test "updates hub", %{conn: conn, bypass: bypass} do
{:ok, pid} = Agent.start(fn -> %{fun: &fetch_app_response/2, type: :mount} end)
app_id = Livebook.Utils.random_short_id()
@@ -70,7 +70,7 @@ defmodule LivebookWeb.Hub.EditLiveTest do
refute Hubs.fetch_hub!(hub.id) == hub
end
- test "add secret", %{conn: conn, bypass: bypass} do
+ test "add env var", %{conn: conn, bypass: bypass} do
{:ok, pid} = Agent.start(fn -> %{fun: &fetch_app_response/2, type: :mount} end)
app_id = Livebook.Utils.random_short_id()
@@ -87,6 +87,13 @@ defmodule LivebookWeb.Hub.EditLiveTest do
assert html =~ "LIVEBOOK_PASSWORD"
assert html =~ "LIVEBOOK_SECRET_KEY_BASE"
+ view
+ |> element("#add-env-var")
+ |> render_click(%{})
+
+ assert_patch(view, Routes.hub_path(conn, :add_env_var, hub.id))
+ assert render(view) =~ "Add environment variable"
+
view
|> element("#env-var-form")
|> render_change(%{"env_var" => %{"key" => "FOO_ENV_VAR", "value" => "12345"}})
@@ -110,19 +117,9 @@ defmodule LivebookWeb.Hub.EditLiveTest do
assert html =~ "LIVEBOOK_SECRET_KEY_BASE"
end
- test "update secret", %{conn: conn, bypass: bypass} do
+ test "update env var", %{conn: conn, bypass: bypass} do
{:ok, pid} = Agent.start(fn -> %{fun: &fetch_app_response/2, type: :foo} end)
- old_env_var =
- :foo
- |> secrets()
- |> Enum.find(&(&1["name"] == "FOO_ENV_VAR"))
-
- new_env_var =
- :updated_foo
- |> secrets()
- |> Enum.find(&(&1["name"] == "FOO_ENV_VAR"))
-
app_id = Livebook.Utils.random_short_id()
hub = insert_hub(:fly, id: "fly-#{app_id}", application_id: app_id)
fly_bypass(bypass, app_id, pid)
@@ -134,11 +131,13 @@ defmodule LivebookWeb.Hub.EditLiveTest do
assert html =~ "Environment Variables"
assert html =~ "FOO_ENV_VAR"
- assert html =~ old_env_var["createdAt"]
view
- |> element("#env-var-#{old_env_var["id"]}-edit")
- |> render_click(%{"env_var" => old_env_var})
+ |> element("#env-var-FOO_ENV_VAR-edit")
+ |> render_click(%{"env_var" => "FOO_ENV_VAR"})
+
+ assert_patch(view, Routes.hub_path(conn, :edit_env_var, hub.id, "FOO_ENV_VAR"))
+ assert render(view) =~ "Edit environment variable"
view
|> element("#env-var-form")
@@ -159,18 +158,11 @@ defmodule LivebookWeb.Hub.EditLiveTest do
assert html =~ "Environment variable updated"
assert html =~ "Environment Variables"
assert html =~ "FOO_ENV_VAR"
- refute html =~ old_env_var["createdAt"]
- assert html =~ new_env_var["createdAt"]
end
- test "delete secret", %{conn: conn, bypass: bypass} do
+ test "delete env var", %{conn: conn, bypass: bypass} do
{:ok, pid} = Agent.start(fn -> %{fun: &fetch_app_response/2, type: :add} end)
- env_var =
- :add
- |> secrets()
- |> Enum.find(&(&1["name"] == "FOO_ENV_VAR"))
-
app_id = Livebook.Utils.random_short_id()
hub = insert_hub(:fly, id: "fly-#{app_id}", application_id: app_id)
fly_bypass(bypass, app_id, pid)
@@ -190,7 +182,7 @@ defmodule LivebookWeb.Hub.EditLiveTest do
assert {:ok, _view, html} =
view
|> with_target("#fly-form-component")
- |> render_click("delete", %{"env_var" => env_var})
+ |> render_click("delete_env_var", %{"env_var" => "FOO_ENV_VAR"})
|> follow_redirect(conn)
assert html =~ "Environment variable deleted"
diff --git a/test/livebook_web/live/settings_live_test.exs b/test/livebook_web/live/settings_live_test.exs
index 8f90fa247..9c6f9bc19 100644
--- a/test/livebook_web/live/settings_live_test.exs
+++ b/test/livebook_web/live/settings_live_test.exs
@@ -46,9 +46,7 @@ defmodule LivebookWeb.SettingsLiveTest do
assert html =~ env_var.key
- view
- |> with_target("#env-vars")
- |> render_click("edit_env_var", %{"env_var" => env_var.key})
+ render_click(view, "edit_env_var", %{"env_var" => env_var.key})
assert_patch(view, Routes.settings_path(conn, :edit_env_var, env_var.key))
assert render(view) =~ "Edit environment variable"
@@ -77,9 +75,7 @@ defmodule LivebookWeb.SettingsLiveTest do
assert html =~ env_var.key
- view
- |> with_target("#env-vars")
- |> render_click("delete_env_var", %{"env_var" => env_var.key})
+ render_click(view, "delete_env_var", %{"env_var" => env_var.key})
refute render(view) =~ env_var.key
end