mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-11-09 21:51:42 +08:00
Move APIs used by Hubs to Livebook.Hubs.Team (#2339)
This commit is contained in:
parent
a9b818c374
commit
4d809ec0d6
8 changed files with 294 additions and 312 deletions
|
|
@ -102,10 +102,12 @@ defmodule Livebook.Hubs.Team do
|
|||
end
|
||||
|
||||
defimpl Livebook.Hubs.Provider, for: Livebook.Hubs.Team do
|
||||
alias Livebook.Hubs.TeamClient
|
||||
alias Livebook.Teams
|
||||
alias Livebook.Hubs.{Team, TeamClient}
|
||||
alias Livebook.Teams.Requests
|
||||
alias Livebook.FileSystem
|
||||
alias Livebook.Secrets.Secret
|
||||
|
||||
@teams_key_prefix Teams.Org.teams_key_prefix()
|
||||
@teams_key_prefix Livebook.Teams.Org.teams_key_prefix()
|
||||
@public_key_prefix Livebook.Hubs.Team.public_key_prefix()
|
||||
|
||||
def load(team, fields) do
|
||||
|
|
@ -137,14 +139,6 @@ defimpl Livebook.Hubs.Provider, for: Livebook.Hubs.Team do
|
|||
|
||||
def disconnect(team), do: TeamClient.stop(team.id)
|
||||
|
||||
def get_secrets(team), do: TeamClient.get_secrets(team.id)
|
||||
|
||||
def create_secret(team, secret), do: Teams.create_secret(team, secret)
|
||||
|
||||
def update_secret(team, secret), do: Teams.update_secret(team, secret)
|
||||
|
||||
def delete_secret(team, secret), do: Teams.delete_secret(team, secret)
|
||||
|
||||
def connection_error(team) do
|
||||
cond do
|
||||
team.offline ->
|
||||
|
|
@ -209,13 +203,89 @@ defimpl Livebook.Hubs.Provider, for: Livebook.Hubs.Team do
|
|||
|> Map.put(:offline?, team.offline != nil)
|
||||
end
|
||||
|
||||
def get_file_systems(team) do
|
||||
TeamClient.get_file_systems(team.id)
|
||||
def get_secrets(team), do: TeamClient.get_secrets(team.id)
|
||||
|
||||
@spec create_secret(Team.t(), Secret.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def create_secret(%Team{} = team, %Secret{} = secret) do
|
||||
case Requests.create_secret(team, secret) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
def create_file_system(team, file_system), do: Teams.create_file_system(team, file_system)
|
||||
@spec update_secret(Team.t(), Secret.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def update_secret(%Team{} = team, %Secret{} = secret) do
|
||||
case Requests.update_secret(team, secret) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
def update_file_system(team, file_system), do: Teams.update_file_system(team, file_system)
|
||||
@spec delete_secret(Team.t(), Secret.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def delete_secret(%Team{} = team, %Secret{} = secret) do
|
||||
case Requests.delete_secret(team, secret) do
|
||||
{:ok, _} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
def delete_file_system(team, file_system), do: Teams.delete_file_system(team, file_system)
|
||||
def get_file_systems(team), do: TeamClient.get_file_systems(team.id)
|
||||
|
||||
@spec create_file_system(Team.t(), FileSystem.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def create_file_system(%Team{} = team, file_system) do
|
||||
case Requests.create_file_system(team, file_system) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@spec update_file_system(Team.t(), FileSystem.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def update_file_system(%Team{} = team, file_system) do
|
||||
case Requests.update_file_system(team, file_system) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@spec delete_file_system(Team.t(), FileSystem.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def delete_file_system(%Team{} = team, file_system) do
|
||||
case Requests.delete_file_system(team, file_system) do
|
||||
{:ok, _} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
defp add_secret_errors(%Secret{} = secret, errors_map) do
|
||||
Requests.add_errors(secret, errors_map)
|
||||
end
|
||||
|
||||
defp add_file_system_errors(file_system, errors_map) do
|
||||
%{error_field: field} = FileSystem.external_metadata(file_system)
|
||||
errors_map = Map.new(errors_map, fn {_key, values} -> {field, values} end)
|
||||
Requests.add_errors(file_system, errors_map)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
defmodule Livebook.Teams do
|
||||
alias Livebook.{FileSystem, Hubs}
|
||||
# This is the Livebook Teams interface which is not part of Hubs.
|
||||
|
||||
alias Livebook.Hubs
|
||||
alias Livebook.Hubs.Team
|
||||
alias Livebook.Secrets.Secret
|
||||
alias Livebook.Teams.{Requests, Org}
|
||||
|
||||
import Ecto.Changeset,
|
||||
only: [add_error: 3, apply_action: 2, apply_action!: 2, get_field: 2, change: 1]
|
||||
only: [add_error: 3, apply_action: 2, apply_action!: 2, get_field: 2]
|
||||
|
||||
@prefix Org.teams_key_prefix()
|
||||
|
||||
|
|
@ -97,96 +98,6 @@ defmodule Livebook.Teams do
|
|||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a Secret.
|
||||
"""
|
||||
@spec create_secret(Team.t(), Secret.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def create_secret(%Team{} = team, %Secret{} = secret) do
|
||||
case Requests.create_secret(team, secret) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a Secret.
|
||||
"""
|
||||
@spec update_secret(Team.t(), Secret.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def update_secret(%Team{} = team, %Secret{} = secret) do
|
||||
case Requests.update_secret(team, secret) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a Secret.
|
||||
"""
|
||||
@spec delete_secret(Team.t(), Secret.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def delete_secret(%Team{} = team, %Secret{} = secret) do
|
||||
case Requests.delete_secret(team, secret) do
|
||||
{:ok, _} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_secret_errors(secret, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates a File System.
|
||||
"""
|
||||
@spec create_file_system(Team.t(), FileSystem.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def create_file_system(%Team{} = team, file_system) do
|
||||
case Requests.create_file_system(team, file_system) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Updates a File System.
|
||||
"""
|
||||
@spec update_file_system(Team.t(), FileSystem.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def update_file_system(%Team{} = team, file_system) do
|
||||
case Requests.update_file_system(team, file_system) do
|
||||
{:ok, %{"id" => _}} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Deletes a File System.
|
||||
"""
|
||||
@spec delete_file_system(Team.t(), FileSystem.t()) ::
|
||||
:ok
|
||||
| {:error, Ecto.Changeset.t()}
|
||||
| {:transport_error, String.t()}
|
||||
def delete_file_system(%Team{} = team, file_system) do
|
||||
case Requests.delete_file_system(team, file_system) do
|
||||
{:ok, _} -> :ok
|
||||
{:error, %{"errors" => errors}} -> {:error, add_file_system_errors(file_system, errors)}
|
||||
any -> any
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Returns an `%Ecto.Changeset{}` for tracking hub changes.
|
||||
"""
|
||||
|
|
@ -258,26 +169,6 @@ defmodule Livebook.Teams do
|
|||
end
|
||||
|
||||
defp add_org_errors(%Ecto.Changeset{} = changeset, errors_map) do
|
||||
add_errors(changeset, Org.__schema__(:fields), errors_map)
|
||||
end
|
||||
|
||||
defp add_secret_errors(%Secret{} = secret, errors_map) do
|
||||
add_errors(change(secret), Secret.__schema__(:fields), errors_map)
|
||||
end
|
||||
|
||||
defp add_file_system_errors(%struct{} = file_system, errors_map) do
|
||||
%{error_field: field} = FileSystem.external_metadata(file_system)
|
||||
errors_map = Map.new(errors_map, fn {_key, values} -> {field, values} end)
|
||||
|
||||
add_errors(change(file_system), struct.__schema__(:fields), errors_map)
|
||||
end
|
||||
|
||||
defp add_errors(%Ecto.Changeset{} = changeset, fields, errors_map) do
|
||||
for {key, errors} <- errors_map,
|
||||
field = String.to_atom(key),
|
||||
field in fields,
|
||||
error <- errors,
|
||||
reduce: changeset,
|
||||
do: (acc -> add_error(acc, field, error))
|
||||
Requests.add_errors(changeset, Org.__schema__(:fields), errors_map)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -145,6 +145,25 @@ defmodule Livebook.Teams.Requests do
|
|||
delete("/api/v1/org/file-systems", params, headers)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Add requests errors to a `changeset` for the given `fields`.
|
||||
"""
|
||||
def add_errors(%Ecto.Changeset{} = changeset, fields, errors_map) do
|
||||
for {key, errors} <- errors_map,
|
||||
field = String.to_atom(key),
|
||||
field in fields,
|
||||
error <- errors,
|
||||
reduce: changeset,
|
||||
do: (acc -> Ecto.Changeset.add_error(acc, field, error))
|
||||
end
|
||||
|
||||
@doc """
|
||||
Add requests errors to a struct.
|
||||
"""
|
||||
def add_errors(%struct{} = value, errors_map) do
|
||||
value |> Ecto.Changeset.change() |> add_errors(struct.__schema__(:fields), errors_map)
|
||||
end
|
||||
|
||||
defp auth_headers(team) do
|
||||
token = "#{team.user_id}:#{team.org_id}:#{team.org_key_id}:#{team.session_token}"
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
assert_receive {:hub_connected, ^id}
|
||||
|
||||
secret = build(:secret, name: "SECRET_CREATED_FOO", value: "BAR")
|
||||
assert Livebook.Teams.create_secret(team, secret) == :ok
|
||||
assert Livebook.Hubs.create_secret(team, secret) == :ok
|
||||
|
||||
name = secret.name
|
||||
value = secret.value
|
||||
|
|
@ -69,7 +69,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
assert_receive {:hub_connected, ^id}
|
||||
|
||||
secret = build(:secret, name: "SECRET_UPDATED_FOO", value: "BAR")
|
||||
assert Livebook.Teams.create_secret(team, secret) == :ok
|
||||
assert Livebook.Hubs.create_secret(team, secret) == :ok
|
||||
|
||||
name = secret.name
|
||||
value = secret.value
|
||||
|
|
@ -79,7 +79,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
|
||||
# updates the secret
|
||||
update_secret = Map.replace!(secret, :value, "BAZ")
|
||||
assert Livebook.Teams.update_secret(team, update_secret) == :ok
|
||||
assert Livebook.Hubs.update_secret(team, update_secret) == :ok
|
||||
|
||||
new_value = update_secret.value
|
||||
|
||||
|
|
@ -95,7 +95,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
assert_receive {:hub_connected, ^id}
|
||||
|
||||
secret = build(:secret, name: "SECRET_DELETED_FOO", value: "BAR")
|
||||
assert Livebook.Teams.create_secret(team, secret) == :ok
|
||||
assert Livebook.Hubs.create_secret(team, secret) == :ok
|
||||
|
||||
name = secret.name
|
||||
value = secret.value
|
||||
|
|
@ -104,7 +104,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
assert_receive {:secret_created, %{name: ^name, value: ^value}}
|
||||
|
||||
# deletes the secret
|
||||
assert Livebook.Teams.delete_secret(team, secret) == :ok
|
||||
assert Livebook.Hubs.delete_secret(team, secret) == :ok
|
||||
|
||||
# receives `{:secret_deleted, secret_deleted}` event
|
||||
assert_receive {:secret_deleted, %{name: ^name, value: ^value}}
|
||||
|
|
@ -117,7 +117,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
assert_receive {:hub_connected, ^id}
|
||||
|
||||
file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com")
|
||||
assert Livebook.Teams.create_file_system(team, file_system) == :ok
|
||||
assert Livebook.Hubs.create_file_system(team, file_system) == :ok
|
||||
|
||||
bucket_url = file_system.bucket_url
|
||||
|
||||
|
|
@ -137,7 +137,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
region: "us-east-1"
|
||||
)
|
||||
|
||||
assert Livebook.Teams.create_file_system(team, file_system) == :ok
|
||||
assert Livebook.Hubs.create_file_system(team, file_system) == :ok
|
||||
|
||||
bucket_url = file_system.bucket_url
|
||||
region = file_system.region
|
||||
|
|
@ -148,7 +148,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
|
||||
# updates the file system
|
||||
update_file_system = %{file_system | region: "eu-central-1", external_id: id}
|
||||
assert Livebook.Teams.update_file_system(team, update_file_system) == :ok
|
||||
assert Livebook.Hubs.update_file_system(team, update_file_system) == :ok
|
||||
|
||||
new_region = update_file_system.region
|
||||
|
||||
|
|
@ -164,7 +164,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
assert_receive {:hub_connected, ^id}
|
||||
|
||||
file_system = build(:fs_s3, bucket_url: "https://file_system_deleted.s3.amazonaws.com")
|
||||
assert Livebook.Teams.create_file_system(team, file_system) == :ok
|
||||
assert Livebook.Hubs.create_file_system(team, file_system) == :ok
|
||||
|
||||
bucket_url = file_system.bucket_url
|
||||
|
||||
|
|
@ -173,7 +173,7 @@ defmodule Livebook.Hubs.TeamClientTest do
|
|||
|
||||
# deletes the file system
|
||||
delete_file_system = %{file_system | external_id: id}
|
||||
assert Livebook.Teams.delete_file_system(team, delete_file_system) == :ok
|
||||
assert Livebook.Hubs.delete_file_system(team, delete_file_system) == :ok
|
||||
|
||||
# receives `{:file_system_deleted, file_system_deleted}` event
|
||||
assert_receive {:file_system_deleted, %{external_id: ^id, bucket_url: ^bucket_url}}
|
||||
|
|
|
|||
|
|
@ -40,17 +40,179 @@ defmodule Livebook.HubsTest do
|
|||
assert Hubs.hub_exists?(team.id)
|
||||
end
|
||||
|
||||
test "save_hub/1 persists hub", %{user: user, node: node} do
|
||||
team = build_team_hub(user, node)
|
||||
Hubs.save_hub(team)
|
||||
describe "save_hub/1" do
|
||||
test "persists hub", %{user: user, node: node} do
|
||||
team = build_team_hub(user, node)
|
||||
Hubs.save_hub(team)
|
||||
|
||||
assert Hubs.fetch_hub!(team.id) == team
|
||||
assert Hubs.fetch_hub!(team.id) == team
|
||||
end
|
||||
|
||||
test "updates hub", %{user: user, node: node} do
|
||||
team = create_team_hub(user, node)
|
||||
Hubs.save_hub(%{team | hub_emoji: "🐈"})
|
||||
|
||||
assert Hubs.fetch_hub!(team.id).hub_emoji == "🐈"
|
||||
end
|
||||
end
|
||||
|
||||
test "save_hub/1 updates hub", %{user: user, node: node} do
|
||||
team = create_team_hub(user, node)
|
||||
Hubs.save_hub(%{team | hub_emoji: "🐈"})
|
||||
describe "create_secret/2" do
|
||||
test "creates a new secret", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "FOO", value: "BAR")
|
||||
|
||||
assert Hubs.fetch_hub!(team.id).hub_emoji == "🐈"
|
||||
assert Hubs.create_secret(hub, secret) == :ok
|
||||
|
||||
# Guarantee uniqueness
|
||||
assert {:error, changeset} = Hubs.create_secret(hub, secret)
|
||||
assert "has already been taken" in errors_on(changeset).name
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "LB_FOO", value: "BAR")
|
||||
|
||||
assert {:error, changeset} = Hubs.create_secret(hub, secret)
|
||||
assert "cannot start with the LB_ prefix" in errors_on(changeset).name
|
||||
end
|
||||
end
|
||||
|
||||
describe "update_secret/2" do
|
||||
test "updates a secret", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "UPDATE_ME", value: "BAR")
|
||||
|
||||
assert Hubs.create_secret(hub, secret) == :ok
|
||||
|
||||
update_secret = Map.replace!(secret, :value, "BAZ")
|
||||
assert Hubs.update_secret(hub, update_secret) == :ok
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "FIX_ME", value: "BAR")
|
||||
|
||||
assert Hubs.create_secret(hub, secret) == :ok
|
||||
|
||||
update_secret = Map.replace!(secret, :value, "")
|
||||
|
||||
assert {:error, changeset} = Hubs.update_secret(hub, update_secret)
|
||||
assert "can't be blank" in errors_on(changeset).value
|
||||
end
|
||||
end
|
||||
|
||||
describe "delete_secret/2" do
|
||||
test "deletes a secret", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "DELETE_ME", value: "BAR")
|
||||
|
||||
assert Hubs.create_secret(hub, secret) == :ok
|
||||
assert Hubs.delete_secret(hub, secret) == :ok
|
||||
|
||||
# Guarantee it's been removed and will return HTTP status 404
|
||||
assert Hubs.delete_secret(hub, secret) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
|
||||
test "returns transport errors when secret doesn't exists", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "I_CANT_EXIST", value: "BAR")
|
||||
|
||||
# Guarantee it doesn't exists and will return HTTP status 404
|
||||
assert Hubs.delete_secret(hub, secret) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
end
|
||||
|
||||
describe "create_file_system/2" do
|
||||
test "creates a new file system", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com")
|
||||
|
||||
assert Hubs.create_file_system(hub, file_system) == :ok
|
||||
|
||||
# Guarantee uniqueness
|
||||
assert {:error, changeset} = Hubs.create_file_system(hub, file_system)
|
||||
assert "has already been taken" in errors_on(changeset).bucket_url
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
file_system = build(:fs_s3, bucket_url: nil)
|
||||
|
||||
assert {:error, changeset} = Hubs.create_file_system(hub, file_system)
|
||||
assert "can't be blank" in errors_on(changeset).bucket_url
|
||||
end
|
||||
end
|
||||
|
||||
describe "update_file_system/2" do
|
||||
test "updates a file system", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
teams_file_system = create_teams_file_system(hub, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: teams_file_system.name,
|
||||
region: "us-east-1",
|
||||
external_id: to_string(teams_file_system.id)
|
||||
)
|
||||
|
||||
update_file_system = Map.replace!(file_system, :region, "eu-central-1")
|
||||
assert Hubs.update_file_system(hub, update_file_system) == :ok
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
teams_file_system = create_teams_file_system(hub, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: "https://fix_me.s3.amazonaws.com",
|
||||
external_id: to_string(teams_file_system.id)
|
||||
)
|
||||
|
||||
update_file_system = Map.replace!(file_system, :bucket_url, "")
|
||||
|
||||
assert {:error, changeset} = Hubs.update_file_system(hub, update_file_system)
|
||||
assert "can't be blank" in errors_on(changeset).bucket_url
|
||||
end
|
||||
end
|
||||
|
||||
describe "delete_file_system/2" do
|
||||
test "deletes a file system", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
teams_file_system = create_teams_file_system(hub, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: teams_file_system.name,
|
||||
region: "us-east-1",
|
||||
external_id: to_string(teams_file_system.id)
|
||||
)
|
||||
|
||||
assert Hubs.delete_file_system(hub, file_system) == :ok
|
||||
|
||||
# Guarantee it's been removed and will return HTTP status 404
|
||||
assert Hubs.delete_file_system(hub, file_system) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
|
||||
test "returns transport errors when file system doesn't exists", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: "https://i_cant_exist.s3.amazonaws.com",
|
||||
external_id: "123456789"
|
||||
)
|
||||
|
||||
# Guarantee it doesn't exists and will return HTTP status 404
|
||||
assert Hubs.delete_file_system(hub, file_system) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ defmodule Livebook.Teams.ConnectionTest do
|
|||
|
||||
# creates a new secret
|
||||
secret = build(:secret, name: "FOO", value: "BAR")
|
||||
assert Livebook.Teams.create_secret(hub, secret) == :ok
|
||||
assert Livebook.Hubs.create_secret(hub, secret) == :ok
|
||||
|
||||
# receives `{:event, :secret_created, secret_created}` event
|
||||
# without decrypting the value
|
||||
|
|
@ -60,7 +60,7 @@ defmodule Livebook.Teams.ConnectionTest do
|
|||
|
||||
# creates a new file system
|
||||
file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com")
|
||||
assert Livebook.Teams.create_file_system(hub, file_system) == :ok
|
||||
assert Livebook.Hubs.create_file_system(hub, file_system) == :ok
|
||||
type = Livebook.FileSystems.type(file_system)
|
||||
%{name: name} = FileSystem.external_metadata(file_system)
|
||||
|
||||
|
|
|
|||
|
|
@ -148,164 +148,4 @@ defmodule Livebook.TeamsTest do
|
|||
{:error, :expired}
|
||||
end
|
||||
end
|
||||
|
||||
describe "create_secret/2" do
|
||||
test "creates a new secret", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "FOO", value: "BAR")
|
||||
|
||||
assert Teams.create_secret(hub, secret) == :ok
|
||||
|
||||
# Guarantee uniqueness
|
||||
assert {:error, changeset} = Teams.create_secret(hub, secret)
|
||||
assert "has already been taken" in errors_on(changeset).name
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "LB_FOO", value: "BAR")
|
||||
|
||||
assert {:error, changeset} = Teams.create_secret(hub, secret)
|
||||
assert "cannot start with the LB_ prefix" in errors_on(changeset).name
|
||||
end
|
||||
end
|
||||
|
||||
describe "update_secret/2" do
|
||||
test "updates a secret", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "UPDATE_ME", value: "BAR")
|
||||
|
||||
assert Teams.create_secret(hub, secret) == :ok
|
||||
|
||||
update_secret = Map.replace!(secret, :value, "BAZ")
|
||||
assert Teams.update_secret(hub, update_secret) == :ok
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "FIX_ME", value: "BAR")
|
||||
|
||||
assert Teams.create_secret(hub, secret) == :ok
|
||||
|
||||
update_secret = Map.replace!(secret, :value, "")
|
||||
|
||||
assert {:error, changeset} = Teams.update_secret(hub, update_secret)
|
||||
assert "can't be blank" in errors_on(changeset).value
|
||||
end
|
||||
end
|
||||
|
||||
describe "delete_secret/2" do
|
||||
test "deletes a secret", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "DELETE_ME", value: "BAR")
|
||||
|
||||
assert Teams.create_secret(hub, secret) == :ok
|
||||
assert Teams.delete_secret(hub, secret) == :ok
|
||||
|
||||
# Guarantee it's been removed and will return HTTP status 404
|
||||
assert Teams.delete_secret(hub, secret) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
|
||||
test "returns transport errors when secret doesn't exists", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
secret = build(:secret, name: "I_CANT_EXIST", value: "BAR")
|
||||
|
||||
# Guarantee it doesn't exists and will return HTTP status 404
|
||||
assert Teams.delete_secret(hub, secret) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
end
|
||||
|
||||
describe "create_file_system/2" do
|
||||
test "creates a new file system", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
file_system = build(:fs_s3, bucket_url: "https://file_system_created.s3.amazonaws.com")
|
||||
|
||||
assert Teams.create_file_system(hub, file_system) == :ok
|
||||
|
||||
# Guarantee uniqueness
|
||||
assert {:error, changeset} = Teams.create_file_system(hub, file_system)
|
||||
assert "has already been taken" in errors_on(changeset).bucket_url
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
file_system = build(:fs_s3, bucket_url: nil)
|
||||
|
||||
assert {:error, changeset} = Teams.create_file_system(hub, file_system)
|
||||
assert "can't be blank" in errors_on(changeset).bucket_url
|
||||
end
|
||||
end
|
||||
|
||||
describe "update_file_system/2" do
|
||||
test "updates a file system", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
teams_file_system = create_teams_file_system(hub, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: teams_file_system.name,
|
||||
region: "us-east-1",
|
||||
external_id: to_string(teams_file_system.id)
|
||||
)
|
||||
|
||||
update_file_system = Map.replace!(file_system, :region, "eu-central-1")
|
||||
assert Teams.update_file_system(hub, update_file_system) == :ok
|
||||
end
|
||||
|
||||
test "returns changeset errors when data is invalid", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
teams_file_system = create_teams_file_system(hub, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: "https://fix_me.s3.amazonaws.com",
|
||||
external_id: to_string(teams_file_system.id)
|
||||
)
|
||||
|
||||
update_file_system = Map.replace!(file_system, :bucket_url, "")
|
||||
|
||||
assert {:error, changeset} = Teams.update_file_system(hub, update_file_system)
|
||||
assert "can't be blank" in errors_on(changeset).bucket_url
|
||||
end
|
||||
end
|
||||
|
||||
describe "delete_file_system/2" do
|
||||
test "deletes a file system", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
teams_file_system = create_teams_file_system(hub, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: teams_file_system.name,
|
||||
region: "us-east-1",
|
||||
external_id: to_string(teams_file_system.id)
|
||||
)
|
||||
|
||||
assert Teams.delete_file_system(hub, file_system) == :ok
|
||||
|
||||
# Guarantee it's been removed and will return HTTP status 404
|
||||
assert Teams.delete_file_system(hub, file_system) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
|
||||
test "returns transport errors when file system doesn't exists", %{user: user, node: node} do
|
||||
hub = create_team_hub(user, node)
|
||||
|
||||
file_system =
|
||||
build(:fs_s3,
|
||||
bucket_url: "https://i_cant_exist.s3.amazonaws.com",
|
||||
external_id: "123456789"
|
||||
)
|
||||
|
||||
# Guarantee it doesn't exists and will return HTTP status 404
|
||||
assert Teams.delete_file_system(hub, file_system) ==
|
||||
{:transport_error,
|
||||
"Something went wrong, try again later or please file a bug if it persists"}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ defmodule LivebookWeb.Integration.SessionLiveTest do
|
|||
hub_id: team.id
|
||||
)
|
||||
|
||||
assert Livebook.Teams.create_secret(team, secret) == :ok
|
||||
assert Livebook.Hubs.create_secret(team, secret) == :ok
|
||||
|
||||
# receives the operation event
|
||||
assert_receive {:operation, {:sync_hub_secrets, "__server__"}}
|
||||
|
|
@ -240,7 +240,7 @@ defmodule LivebookWeb.Integration.SessionLiveTest do
|
|||
assert has_element?(add_secret_button)
|
||||
|
||||
# creates the secret
|
||||
assert Livebook.Teams.create_secret(team, secret) == :ok
|
||||
assert Livebook.Hubs.create_secret(team, secret) == :ok
|
||||
|
||||
# receives the operation event
|
||||
assert_receive {:operation, {:sync_hub_secrets, "__server__"}}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue