mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-09-11 15:34:37 +08:00
Final adjustments to env vars (#1418)
This commit is contained in:
parent
7cd7defa6c
commit
2766cf3256
13 changed files with 170 additions and 96 deletions
|
@ -218,7 +218,8 @@ defmodule Livebook.Runtime.ErlDist.RuntimeServer do
|
||||||
Keyword.get(opts, :smart_cell_definitions_module, Kino.SmartCell),
|
Keyword.get(opts, :smart_cell_definitions_module, Kino.SmartCell),
|
||||||
extra_smart_cell_definitions: Keyword.get(opts, :extra_smart_cell_definitions, []),
|
extra_smart_cell_definitions: Keyword.get(opts, :extra_smart_cell_definitions, []),
|
||||||
memory_timer_ref: nil,
|
memory_timer_ref: nil,
|
||||||
last_evaluator: nil
|
last_evaluator: nil,
|
||||||
|
initial_path: System.get_env("PATH", "")
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -477,13 +478,23 @@ defmodule Livebook.Runtime.ErlDist.RuntimeServer do
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_cast({:put_system_envs, envs}, state) do
|
def handle_cast({:put_system_envs, envs}, state) do
|
||||||
System.put_env(envs)
|
envs
|
||||||
|
|> Enum.map(fn
|
||||||
|
{"PATH", path} -> {"PATH", state.initial_path <> os_path_separator() <> path}
|
||||||
|
other -> other
|
||||||
|
end)
|
||||||
|
|> System.put_env()
|
||||||
|
|
||||||
{:noreply, state}
|
{:noreply, state}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_cast({:delete_system_envs, names}, state) do
|
def handle_cast({:delete_system_envs, names}, state) do
|
||||||
Enum.each(names, &System.delete_env/1)
|
names
|
||||||
|
|> Enum.map(fn
|
||||||
|
"PATH" -> {"PATH", state.initial_path}
|
||||||
|
name -> {name, nil}
|
||||||
|
end)
|
||||||
|
|> System.put_env()
|
||||||
|
|
||||||
{:noreply, state}
|
{:noreply, state}
|
||||||
end
|
end
|
||||||
|
@ -644,4 +655,11 @@ defmodule Livebook.Runtime.ErlDist.RuntimeServer do
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp os_path_separator() do
|
||||||
|
case :os.type() do
|
||||||
|
{:win32, _} -> ";"
|
||||||
|
_ -> ":"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1125,7 +1125,7 @@ defmodule Livebook.Session do
|
||||||
|
|
||||||
def handle_info({:env_var_set, env_var}, state) do
|
def handle_info({:env_var_set, env_var}, state) do
|
||||||
if Runtime.connected?(state.data.runtime) do
|
if Runtime.connected?(state.data.runtime) do
|
||||||
Runtime.put_system_envs(state.data.runtime, %{env_var.key => env_var.value})
|
Runtime.put_system_envs(state.data.runtime, [{env_var.name, env_var.value}])
|
||||||
end
|
end
|
||||||
|
|
||||||
{:noreply, state}
|
{:noreply, state}
|
||||||
|
@ -1133,7 +1133,7 @@ defmodule Livebook.Session do
|
||||||
|
|
||||||
def handle_info({:env_var_unset, env_var}, state) do
|
def handle_info({:env_var_unset, env_var}, state) do
|
||||||
if Runtime.connected?(state.data.runtime) do
|
if Runtime.connected?(state.data.runtime) do
|
||||||
Runtime.delete_system_envs(state.data.runtime, [env_var.key])
|
Runtime.delete_system_envs(state.data.runtime, [env_var.name])
|
||||||
end
|
end
|
||||||
|
|
||||||
{:noreply, state}
|
{:noreply, state}
|
||||||
|
@ -1576,7 +1576,7 @@ defmodule Livebook.Session do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp set_runtime_env_vars(state) do
|
defp set_runtime_env_vars(state) do
|
||||||
env_vars = Enum.map(Livebook.Settings.fetch_env_vars(), &{&1.key, &1.value})
|
env_vars = Enum.map(Livebook.Settings.fetch_env_vars(), &{&1.name, &1.value})
|
||||||
Runtime.put_system_envs(state.data.runtime, env_vars)
|
Runtime.put_system_envs(state.data.runtime, env_vars)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -181,7 +181,7 @@ defmodule Livebook.Settings do
|
||||||
defp save_env_var(env_var) do
|
defp save_env_var(env_var) do
|
||||||
attributes = env_var |> Map.from_struct() |> Map.to_list()
|
attributes = env_var |> Map.from_struct() |> Map.to_list()
|
||||||
|
|
||||||
with :ok <- storage().insert(:env_vars, env_var.key, attributes),
|
with :ok <- storage().insert(:env_vars, env_var.name, attributes),
|
||||||
:ok <- broadcast_env_vars_change({:env_var_set, env_var}) do
|
:ok <- broadcast_env_vars_change({:env_var_set, env_var}) do
|
||||||
{:ok, env_var}
|
{:ok, env_var}
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,20 +4,20 @@ defmodule Livebook.Settings.EnvVar do
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
|
|
||||||
@type t :: %__MODULE__{
|
@type t :: %__MODULE__{
|
||||||
key: String.t(),
|
name: String.t(),
|
||||||
value: String.t()
|
value: String.t()
|
||||||
}
|
}
|
||||||
|
|
||||||
@primary_key {:key, :string, autogenerate: false}
|
@primary_key {:name, :string, autogenerate: false}
|
||||||
embedded_schema do
|
embedded_schema do
|
||||||
field :value, :string
|
field :value, :string
|
||||||
end
|
end
|
||||||
|
|
||||||
def changeset(env_var, attrs \\ %{}) do
|
def changeset(env_var, attrs \\ %{}) do
|
||||||
env_var
|
env_var
|
||||||
|> cast(attrs, [:key, :value])
|
|> cast(attrs, [:name, :value])
|
||||||
|> update_change(:key, &String.upcase/1)
|
|> update_change(:name, &String.upcase/1)
|
||||||
|> validate_format(:key, ~r/^(?!LB_)\w+$/, message: "cannot start with the LB_ prefix")
|
|> validate_format(:name, ~r/^(?!LB_)\w+$/, message: "cannot start with the LB_ prefix")
|
||||||
|> validate_required([:key, :value])
|
|> validate_required([:name, :value])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,11 +41,11 @@ defmodule LivebookWeb.EnvVarComponent do
|
||||||
spellcheck="false"
|
spellcheck="false"
|
||||||
>
|
>
|
||||||
<div class="flex flex-col space-y-4">
|
<div class="flex flex-col space-y-4">
|
||||||
<.input_wrapper form={f} field={:key} class="flex flex-col space-y-1">
|
<.input_wrapper form={f} field={:name} class="flex flex-col space-y-1">
|
||||||
<div class="input-label">
|
<div class="input-label">
|
||||||
Key <span class="text-xs text-gray-500">(alphanumeric and underscore)</span>
|
Name <span class="text-xs text-gray-500">(alphanumeric and underscore)</span>
|
||||||
</div>
|
</div>
|
||||||
<%= text_input(f, :key, class: "input", autofocus: @operation == :new) %>
|
<%= text_input(f, :name, class: "input", autofocus: @operation == :new) %>
|
||||||
</.input_wrapper>
|
</.input_wrapper>
|
||||||
<.input_wrapper form={f} field={:value} class="flex flex-col space-y-1">
|
<.input_wrapper form={f} field={:value} class="flex flex-col space-y-1">
|
||||||
<div class="input-label">Value</div>
|
<div class="input-label">Value</div>
|
||||||
|
|
|
@ -3,14 +3,22 @@ defmodule LivebookWeb.EnvVarsComponent do
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
assigns = assign_new(assigns, :target, fn -> nil end)
|
assigns =
|
||||||
|
assigns
|
||||||
|
|> assign_new(:target, fn -> nil end)
|
||||||
|
|> assign_new(:edit_label, fn -> "Edit" end)
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div id={@id} class="flex flex-col space-y-4">
|
<div id={@id} class="flex flex-col space-y-4">
|
||||||
<div class="flex flex-col space-y-4">
|
<div class="flex flex-col space-y-4">
|
||||||
<%= for env_var <- @env_vars do %>
|
<%= for env_var <- @env_vars do %>
|
||||||
<div class="flex items-center justify-between border border-gray-200 rounded-lg p-4">
|
<div class="flex items-center justify-between border border-gray-200 rounded-lg p-4">
|
||||||
<.env_var_info socket={@socket} env_var={env_var} target={@target} />
|
<.env_var_info
|
||||||
|
socket={@socket}
|
||||||
|
env_var={env_var}
|
||||||
|
edit_label={@edit_label}
|
||||||
|
target={@target}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,13 +37,13 @@ defmodule LivebookWeb.EnvVarsComponent do
|
||||||
~H"""
|
~H"""
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 w-full">
|
<div class="grid grid-cols-1 md:grid-cols-2 w-full">
|
||||||
<div class="place-content-start">
|
<div class="place-content-start">
|
||||||
<.labeled_text label="Key">
|
<.labeled_text label="Name">
|
||||||
<%= @env_var.key %>
|
<%= @env_var.name %>
|
||||||
</.labeled_text>
|
</.labeled_text>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center place-content-end">
|
<div class="flex items-center place-content-end">
|
||||||
<.menu id={"env-var-#{@env_var.key}-menu"}>
|
<.menu id={"env-var-#{@env_var.name}-menu"}>
|
||||||
<:toggle>
|
<:toggle>
|
||||||
<button class="icon-button" aria-label="open session menu" type="button">
|
<button class="icon-button" aria-label="open session menu" type="button">
|
||||||
<.remix_icon icon="more-2-fill" class="text-xl" />
|
<.remix_icon icon="more-2-fill" class="text-xl" />
|
||||||
|
@ -43,23 +51,23 @@ defmodule LivebookWeb.EnvVarsComponent do
|
||||||
</:toggle>
|
</:toggle>
|
||||||
<:content>
|
<:content>
|
||||||
<button
|
<button
|
||||||
id={"env-var-#{@env_var.key}-edit"}
|
id={"env-var-#{@env_var.name}-edit"}
|
||||||
type="button"
|
type="button"
|
||||||
phx-click={JS.push("edit_env_var", value: %{env_var: @env_var.key})}
|
phx-click={JS.push("edit_env_var", value: %{env_var: @env_var.name})}
|
||||||
phx-target={@target}
|
phx-target={@target}
|
||||||
role="menuitem"
|
role="menuitem"
|
||||||
class="menu-item text-gray-600"
|
class="menu-item text-gray-600"
|
||||||
>
|
>
|
||||||
<.remix_icon icon="file-edit-line" />
|
<.remix_icon icon="file-edit-line" />
|
||||||
<span class="font-medium">Edit</span>
|
<span class="font-medium"><%= @edit_label %></span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
id={"env-var-#{@env_var.key}-delete"}
|
id={"env-var-#{@env_var.name}-delete"}
|
||||||
type="button"
|
type="button"
|
||||||
phx-click={
|
phx-click={
|
||||||
with_confirm(
|
with_confirm(
|
||||||
JS.push("delete_env_var", value: %{env_var: @env_var.key}),
|
JS.push("delete_env_var", value: %{env_var: @env_var.name}),
|
||||||
title: "Delete #{@env_var.key}",
|
title: "Delete #{@env_var.name}",
|
||||||
description: "Are you sure you want to delete environment variable?",
|
description: "Are you sure you want to delete environment variable?",
|
||||||
confirm_text: "Delete",
|
confirm_text: "Delete",
|
||||||
confirm_icon: "delete-bin-6-line"
|
confirm_icon: "delete-bin-6-line"
|
||||||
|
|
|
@ -11,8 +11,8 @@ defmodule LivebookWeb.Hub.Edit.FlyComponent do
|
||||||
env_vars = env_vars_from_secrets(app["secrets"])
|
env_vars = env_vars_from_secrets(app["secrets"])
|
||||||
|
|
||||||
env_var =
|
env_var =
|
||||||
if key = assigns.env_var_id do
|
if name = assigns.env_var_id do
|
||||||
Enum.find(env_vars, &(&1.key == key))
|
Enum.find(env_vars, &(&1.name == name))
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok,
|
{:ok,
|
||||||
|
@ -28,7 +28,7 @@ defmodule LivebookWeb.Hub.Edit.FlyComponent do
|
||||||
|
|
||||||
defp env_vars_from_secrets(secrets) do
|
defp env_vars_from_secrets(secrets) do
|
||||||
for secret <- secrets do
|
for secret <- secrets do
|
||||||
%Livebook.Settings.EnvVar{key: secret["name"]}
|
%Livebook.Settings.EnvVar{name: secret["name"]}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -105,6 +105,7 @@ defmodule LivebookWeb.Hub.Edit.FlyComponent do
|
||||||
env_vars={@env_vars}
|
env_vars={@env_vars}
|
||||||
return_to={Routes.hub_path(@socket, :edit, @hub.id)}
|
return_to={Routes.hub_path(@socket, :edit, @hub.id)}
|
||||||
add_env_var_path={Routes.hub_path(@socket, :add_env_var, @hub.id)}
|
add_env_var_path={Routes.hub_path(@socket, :add_env_var, @hub.id)}
|
||||||
|
edit_label="Replace"
|
||||||
target={@myself}
|
target={@myself}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -157,7 +158,8 @@ defmodule LivebookWeb.Hub.Edit.FlyComponent do
|
||||||
# EnvVar component callbacks
|
# EnvVar component callbacks
|
||||||
|
|
||||||
def handle_event("save_env_var", %{"env_var" => attrs}, socket) do
|
def handle_event("save_env_var", %{"env_var" => attrs}, socket) do
|
||||||
{env_operation, attrs} = Map.pop!(attrs, "operation")
|
env_operation = attrs["operation"]
|
||||||
|
attrs = %{"key" => attrs["name"], "value" => attrs["value"]}
|
||||||
|
|
||||||
case FlyClient.put_secrets(socket.assigns.hub, [attrs]) do
|
case FlyClient.put_secrets(socket.assigns.hub, [attrs]) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
|
|
|
@ -357,7 +357,7 @@ defmodule LivebookWeb.SettingsLive do
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_info({:env_var_set, env_var}, socket) do
|
def handle_info({:env_var_set, env_var}, socket) do
|
||||||
idx = Enum.find_index(socket.assigns.env_vars, &(&1.key == env_var.key))
|
idx = Enum.find_index(socket.assigns.env_vars, &(&1.name == env_var.name))
|
||||||
|
|
||||||
env_vars =
|
env_vars =
|
||||||
if idx,
|
if idx,
|
||||||
|
@ -368,7 +368,7 @@ defmodule LivebookWeb.SettingsLive do
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_info({:env_var_unset, env_var}, socket) do
|
def handle_info({:env_var_unset, env_var}, socket) do
|
||||||
env_vars = Enum.reject(socket.assigns.env_vars, &(&1.key == env_var.key))
|
env_vars = Enum.reject(socket.assigns.env_vars, &(&1.name == env_var.name))
|
||||||
|
|
||||||
{:noreply, assign(socket, env_vars: env_vars, env_var: nil)}
|
{:noreply, assign(socket, env_vars: env_vars, env_var: nil)}
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,7 @@ defmodule Livebook.SettingsTest do
|
||||||
env_var = insert_env_var(:env_var)
|
env_var = insert_env_var(:env_var)
|
||||||
assert env_var in Settings.fetch_env_vars()
|
assert env_var in Settings.fetch_env_vars()
|
||||||
|
|
||||||
Settings.unset_env_var(env_var.key)
|
Settings.unset_env_var(env_var.name)
|
||||||
refute env_var in Settings.fetch_env_vars()
|
refute env_var in Settings.fetch_env_vars()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ defmodule Livebook.SettingsTest do
|
||||||
Settings.fetch_env_var!("123456")
|
Settings.fetch_env_var!("123456")
|
||||||
end
|
end
|
||||||
|
|
||||||
env_var = insert_env_var(:env_var, key: "123456")
|
env_var = insert_env_var(:env_var, name: "123456")
|
||||||
assert Settings.fetch_env_var!("123456") == env_var
|
assert Settings.fetch_env_var!("123456") == env_var
|
||||||
|
|
||||||
Settings.unset_env_var("123456")
|
Settings.unset_env_var("123456")
|
||||||
|
@ -26,7 +26,7 @@ defmodule Livebook.SettingsTest do
|
||||||
|
|
||||||
test "env_var_exists?/1" do
|
test "env_var_exists?/1" do
|
||||||
refute Settings.env_var_exists?("FOO")
|
refute Settings.env_var_exists?("FOO")
|
||||||
insert_env_var(:env_var, key: "FOO")
|
insert_env_var(:env_var, name: "FOO")
|
||||||
assert Settings.env_var_exists?("FOO")
|
assert Settings.env_var_exists?("FOO")
|
||||||
|
|
||||||
Settings.unset_env_var("FOO")
|
Settings.unset_env_var("FOO")
|
||||||
|
@ -34,13 +34,13 @@ defmodule Livebook.SettingsTest do
|
||||||
|
|
||||||
describe "set_env_var/1" do
|
describe "set_env_var/1" do
|
||||||
test "creates an environment variable" do
|
test "creates an environment variable" do
|
||||||
attrs = params_for(:env_var, key: "FOO_BAR_BAZ")
|
attrs = params_for(:env_var, name: "FOO_BAR_BAZ")
|
||||||
assert {:ok, env_var} = Settings.set_env_var(attrs)
|
assert {:ok, env_var} = Settings.set_env_var(attrs)
|
||||||
|
|
||||||
assert attrs.key == env_var.key
|
assert attrs.name == env_var.name
|
||||||
assert attrs.value == env_var.value
|
assert attrs.value == env_var.value
|
||||||
|
|
||||||
Settings.unset_env_var(env_var.key)
|
Settings.unset_env_var(env_var.name)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates an environment variable" do
|
test "updates an environment variable" do
|
||||||
|
@ -48,19 +48,19 @@ defmodule Livebook.SettingsTest do
|
||||||
attrs = %{value: "FOO"}
|
attrs = %{value: "FOO"}
|
||||||
assert {:ok, updated_env_var} = Settings.set_env_var(env_var, attrs)
|
assert {:ok, updated_env_var} = Settings.set_env_var(env_var, attrs)
|
||||||
|
|
||||||
assert env_var.key == updated_env_var.key
|
assert env_var.name == updated_env_var.name
|
||||||
assert updated_env_var.value == attrs.value
|
assert updated_env_var.value == attrs.value
|
||||||
|
|
||||||
Settings.unset_env_var(env_var.key)
|
Settings.unset_env_var(env_var.name)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns changeset error" do
|
test "returns changeset error" do
|
||||||
attrs = params_for(:env_var, key: nil)
|
attrs = params_for(:env_var, name: nil)
|
||||||
assert {:error, changeset} = Settings.set_env_var(attrs)
|
assert {:error, changeset} = Settings.set_env_var(attrs)
|
||||||
assert "can't be blank" in errors_on(changeset).key
|
assert "can't be blank" in errors_on(changeset).name
|
||||||
|
|
||||||
assert {:error, changeset} = Settings.set_env_var(%{attrs | key: "LB_FOO"})
|
assert {:error, changeset} = Settings.set_env_var(%{attrs | name: "LB_FOO"})
|
||||||
assert "cannot start with the LB_ prefix" in errors_on(changeset).key
|
assert "cannot start with the LB_ prefix" in errors_on(changeset).name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -94,9 +94,11 @@ defmodule LivebookWeb.Hub.EditLiveTest do
|
||||||
assert_patch(view, Routes.hub_path(conn, :add_env_var, hub.id))
|
assert_patch(view, Routes.hub_path(conn, :add_env_var, hub.id))
|
||||||
assert render(view) =~ "Add environment variable"
|
assert render(view) =~ "Add environment variable"
|
||||||
|
|
||||||
|
attrs = params_for(:env_var, name: "FOO_ENV_VAR")
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element("#env-var-form")
|
|> element("#env-var-form")
|
||||||
|> render_change(%{"env_var" => %{"key" => "FOO_ENV_VAR", "value" => "12345"}})
|
|> render_change(%{"env_var" => attrs})
|
||||||
|
|
||||||
refute view
|
refute view
|
||||||
|> element("#env-var-form button[disabled]")
|
|> element("#env-var-form button[disabled]")
|
||||||
|
@ -107,7 +109,7 @@ defmodule LivebookWeb.Hub.EditLiveTest do
|
||||||
assert {:ok, _view, html} =
|
assert {:ok, _view, html} =
|
||||||
view
|
view
|
||||||
|> element("#env-var-form")
|
|> element("#env-var-form")
|
||||||
|> render_submit(%{"env_var" => %{"key" => "FOO_ENV_VAR", "value" => "12345"}})
|
|> render_submit(%{"env_var" => attrs})
|
||||||
|> follow_redirect(conn)
|
|> follow_redirect(conn)
|
||||||
|
|
||||||
assert html =~ "Environment variable added"
|
assert html =~ "Environment variable added"
|
||||||
|
@ -139,9 +141,11 @@ defmodule LivebookWeb.Hub.EditLiveTest do
|
||||||
assert_patch(view, Routes.hub_path(conn, :edit_env_var, hub.id, "FOO_ENV_VAR"))
|
assert_patch(view, Routes.hub_path(conn, :edit_env_var, hub.id, "FOO_ENV_VAR"))
|
||||||
assert render(view) =~ "Edit environment variable"
|
assert render(view) =~ "Edit environment variable"
|
||||||
|
|
||||||
|
attrs = params_for(:env_var, name: "FOO_ENV_VAR")
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element("#env-var-form")
|
|> element("#env-var-form")
|
||||||
|> render_change(%{"env_var" => %{"key" => "FOO_ENV_VAR", "value" => "12345"}})
|
|> render_change(%{"env_var" => attrs})
|
||||||
|
|
||||||
refute view
|
refute view
|
||||||
|> element("#env-var-form button[disabled]")
|
|> element("#env-var-form button[disabled]")
|
||||||
|
@ -152,7 +156,7 @@ defmodule LivebookWeb.Hub.EditLiveTest do
|
||||||
assert {:ok, _view, html} =
|
assert {:ok, _view, html} =
|
||||||
view
|
view
|
||||||
|> element("#env-var-form")
|
|> element("#env-var-form")
|
||||||
|> render_submit(%{"env_var" => %{"key" => "FOO_ENV_VAR", "value" => "12345"}})
|
|> render_submit(%{"env_var" => attrs})
|
||||||
|> follow_redirect(conn)
|
|> follow_redirect(conn)
|
||||||
|
|
||||||
assert html =~ "Environment variable updated"
|
assert html =~ "Environment variable updated"
|
||||||
|
|
|
@ -942,51 +942,93 @@ defmodule LivebookWeb.SessionLiveTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "outputs persisted env var from ets", %{conn: conn, session: session} do
|
describe "environment variables" do
|
||||||
Session.subscribe(session.id)
|
test "outputs persisted env var from ets", %{conn: conn, session: session} do
|
||||||
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
Session.subscribe(session.id)
|
||||||
|
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
||||||
|
|
||||||
section_id = insert_section(session.pid)
|
section_id = insert_section(session.pid)
|
||||||
|
|
||||||
cell_id =
|
cell_id =
|
||||||
insert_text_cell(session.pid, section_id, :code, ~s{System.get_env("MY_AWESOME_ENV")})
|
insert_text_cell(session.pid, section_id, :code, ~s{System.get_env("MY_AWESOME_ENV")})
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s{[data-el-session]})
|
|> element(~s{[data-el-session]})
|
||||||
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
||||||
|
|
||||||
assert_receive {:operation,
|
assert_receive {:operation,
|
||||||
{:add_cell_evaluation_response, _, ^cell_id, {:text, "\e[35mnil\e[0m"}, _}}
|
{:add_cell_evaluation_response, _, ^cell_id, {:text, "\e[35mnil\e[0m"}, _}}
|
||||||
|
|
||||||
attrs = params_for(:env_var, key: "MY_AWESOME_ENV", value: "MyEnvVarValue")
|
attrs = params_for(:env_var, name: "MY_AWESOME_ENV", value: "MyEnvVarValue")
|
||||||
Settings.set_env_var(attrs)
|
Settings.set_env_var(attrs)
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s{[data-el-session]})
|
|> element(~s{[data-el-session]})
|
||||||
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
||||||
|
|
||||||
assert_receive {:operation,
|
assert_receive {:operation,
|
||||||
{:add_cell_evaluation_response, _, ^cell_id,
|
{:add_cell_evaluation_response, _, ^cell_id,
|
||||||
{:text, "\e[32m\"MyEnvVarValue\"\e[0m"}, _}}
|
{:text, "\e[32m\"MyEnvVarValue\"\e[0m"}, _}}
|
||||||
|
|
||||||
Settings.set_env_var(%{attrs | value: "OTHER_VALUE"})
|
Settings.set_env_var(%{attrs | value: "OTHER_VALUE"})
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s{[data-el-session]})
|
|> element(~s{[data-el-session]})
|
||||||
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
||||||
|
|
||||||
assert_receive {:operation,
|
assert_receive {:operation,
|
||||||
{:add_cell_evaluation_response, _, ^cell_id,
|
{:add_cell_evaluation_response, _, ^cell_id,
|
||||||
{:text, "\e[32m\"OTHER_VALUE\"\e[0m"}, _}}
|
{:text, "\e[32m\"OTHER_VALUE\"\e[0m"}, _}}
|
||||||
|
|
||||||
Settings.unset_env_var("MY_AWESOME_ENV")
|
Settings.unset_env_var("MY_AWESOME_ENV")
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element(~s{[data-el-session]})
|
|> element(~s{[data-el-session]})
|
||||||
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
||||||
|
|
||||||
assert_receive {:operation,
|
assert_receive {:operation,
|
||||||
{:add_cell_evaluation_response, _, ^cell_id, {:text, "\e[35mnil\e[0m"}, _}}
|
{:add_cell_evaluation_response, _, ^cell_id, {:text, "\e[35mnil\e[0m"}, _}}
|
||||||
|
end
|
||||||
|
|
||||||
|
@tag :tmp_dir
|
||||||
|
test "outputs persisted PATH delimited with os PATH env var",
|
||||||
|
%{conn: conn, session: session, tmp_dir: tmp_dir} do
|
||||||
|
separator =
|
||||||
|
case :os.type() do
|
||||||
|
{:win32, _} -> ";"
|
||||||
|
_ -> ":"
|
||||||
|
end
|
||||||
|
|
||||||
|
os_path = System.get_env("PATH", "")
|
||||||
|
old_expected_path = ~s/\e[32m"#{os_path}"\e[0m/
|
||||||
|
expected_path = ~s/\e[32m"#{os_path}#{separator}#{tmp_dir}"\e[0m/
|
||||||
|
|
||||||
|
attrs = params_for(:env_var, name: "PATH", value: tmp_dir)
|
||||||
|
Settings.set_env_var(attrs)
|
||||||
|
|
||||||
|
Session.subscribe(session.id)
|
||||||
|
{:ok, view, _} = live(conn, "/sessions/#{session.id}")
|
||||||
|
|
||||||
|
section_id = insert_section(session.pid)
|
||||||
|
|
||||||
|
cell_id = insert_text_cell(session.pid, section_id, :code, ~s{System.get_env("PATH")})
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(~s{[data-el-session]})
|
||||||
|
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
||||||
|
|
||||||
|
assert_receive {:operation,
|
||||||
|
{:add_cell_evaluation_response, _, ^cell_id, {:text, ^expected_path}, _}}
|
||||||
|
|
||||||
|
Settings.unset_env_var("PATH")
|
||||||
|
|
||||||
|
view
|
||||||
|
|> element(~s{[data-el-session]})
|
||||||
|
|> render_hook("queue_cell_evaluation", %{"cell_id" => cell_id})
|
||||||
|
|
||||||
|
assert_receive {:operation,
|
||||||
|
{:add_cell_evaluation_response, _, ^cell_id, {:text, ^old_expected_path}, _}}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Helpers
|
# Helpers
|
||||||
|
|
|
@ -8,19 +8,19 @@ defmodule LivebookWeb.SettingsLiveTest do
|
||||||
|
|
||||||
describe "environment variables configuration" do
|
describe "environment variables configuration" do
|
||||||
test "list persisted environment variables", %{conn: conn} do
|
test "list persisted environment variables", %{conn: conn} do
|
||||||
insert_env_var(:env_var, key: "MY_ENVIRONMENT_VAR")
|
insert_env_var(:env_var, name: "MY_ENVIRONMENT_VAR")
|
||||||
{:ok, _view, html} = live(conn, Routes.settings_path(conn, :page))
|
{:ok, _view, html} = live(conn, Routes.settings_path(conn, :page))
|
||||||
|
|
||||||
assert html =~ "MY_ENVIRONMENT_VAR"
|
assert html =~ "MY_ENVIRONMENT_VAR"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "adds an environment variable", %{conn: conn} do
|
test "adds an environment variable", %{conn: conn} do
|
||||||
attrs = params_for(:env_var, key: "JAKE_PERALTA_ENV_VAR")
|
attrs = params_for(:env_var, name: "JAKE_PERALTA_ENV_VAR")
|
||||||
|
|
||||||
{:ok, view, html} = live(conn, Routes.settings_path(conn, :add_env_var))
|
{:ok, view, html} = live(conn, Routes.settings_path(conn, :add_env_var))
|
||||||
|
|
||||||
assert html =~ "Add environment variable"
|
assert html =~ "Add environment variable"
|
||||||
refute html =~ attrs.key
|
refute html =~ attrs.name
|
||||||
|
|
||||||
view
|
view
|
||||||
|> element("#env-var-form")
|
|> element("#env-var-form")
|
||||||
|
@ -36,19 +36,19 @@ defmodule LivebookWeb.SettingsLiveTest do
|
||||||
|
|
||||||
assert_patch(view, Routes.settings_path(conn, :page))
|
assert_patch(view, Routes.settings_path(conn, :page))
|
||||||
|
|
||||||
assert render(view) =~ attrs.key
|
assert render(view) =~ attrs.name
|
||||||
end
|
end
|
||||||
|
|
||||||
test "updates an environment variable", %{conn: conn} do
|
test "updates an environment variable", %{conn: conn} do
|
||||||
env_var = insert_env_var(:env_var, key: "UPDATE_ME")
|
env_var = insert_env_var(:env_var, name: "UPDATE_ME")
|
||||||
|
|
||||||
{:ok, view, html} = live(conn, Routes.settings_path(conn, :page))
|
{:ok, view, html} = live(conn, Routes.settings_path(conn, :page))
|
||||||
|
|
||||||
assert html =~ env_var.key
|
assert html =~ env_var.name
|
||||||
|
|
||||||
render_click(view, "edit_env_var", %{"env_var" => env_var.key})
|
render_click(view, "edit_env_var", %{"env_var" => env_var.name})
|
||||||
|
|
||||||
assert_patch(view, Routes.settings_path(conn, :edit_env_var, env_var.key))
|
assert_patch(view, Routes.settings_path(conn, :edit_env_var, env_var.name))
|
||||||
assert render(view) =~ "Edit environment variable"
|
assert render(view) =~ "Edit environment variable"
|
||||||
|
|
||||||
form = element(view, "#env-var-form")
|
form = element(view, "#env-var-form")
|
||||||
|
@ -63,9 +63,9 @@ defmodule LivebookWeb.SettingsLiveTest do
|
||||||
render_submit(form, %{"env_var" => %{"value" => "123456"}})
|
render_submit(form, %{"env_var" => %{"value" => "123456"}})
|
||||||
assert_patch(view, Routes.settings_path(conn, :page))
|
assert_patch(view, Routes.settings_path(conn, :page))
|
||||||
|
|
||||||
updated_env_var = Settings.fetch_env_var!(env_var.key)
|
updated_env_var = Settings.fetch_env_var!(env_var.name)
|
||||||
|
|
||||||
assert updated_env_var.key == env_var.key
|
assert updated_env_var.name == env_var.name
|
||||||
refute updated_env_var.value == env_var.value
|
refute updated_env_var.value == env_var.value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -73,11 +73,11 @@ defmodule LivebookWeb.SettingsLiveTest do
|
||||||
env_var = insert_env_var(:env_var)
|
env_var = insert_env_var(:env_var)
|
||||||
{:ok, view, html} = live(conn, Routes.settings_path(conn, :page))
|
{:ok, view, html} = live(conn, Routes.settings_path(conn, :page))
|
||||||
|
|
||||||
assert html =~ env_var.key
|
assert html =~ env_var.name
|
||||||
|
|
||||||
render_click(view, "delete_env_var", %{"env_var" => env_var.key})
|
render_click(view, "delete_env_var", %{"env_var" => env_var.name})
|
||||||
|
|
||||||
refute render(view) =~ env_var.key
|
refute render(view) =~ env_var.name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -33,7 +33,7 @@ defmodule Livebook.Factory do
|
||||||
|
|
||||||
def build(:env_var) do
|
def build(:env_var) do
|
||||||
%Livebook.Settings.EnvVar{
|
%Livebook.Settings.EnvVar{
|
||||||
key: "BAR",
|
name: "BAR",
|
||||||
value: "foo"
|
value: "foo"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -55,7 +55,7 @@ defmodule Livebook.Factory do
|
||||||
def insert_env_var(factory_name, attrs \\ %{}) do
|
def insert_env_var(factory_name, attrs \\ %{}) do
|
||||||
env_var = build(factory_name, attrs)
|
env_var = build(factory_name, attrs)
|
||||||
attributes = env_var |> Map.from_struct() |> Map.to_list()
|
attributes = env_var |> Map.from_struct() |> Map.to_list()
|
||||||
Livebook.Storage.current().insert(:env_vars, env_var.key, attributes)
|
Livebook.Storage.current().insert(:env_vars, env_var.name, attributes)
|
||||||
|
|
||||||
env_var
|
env_var
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue