Move APIs used by Hubs to Livebook.Hubs.Team (#2339)

This commit is contained in:
José Valim 2023-11-13 14:33:25 +01:00 committed by GitHub
parent a9b818c374
commit 4d809ec0d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 294 additions and 312 deletions

View file

@ -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

View file

@ -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

View file

@ -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}"

View file

@ -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}}

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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__"}}