Improve Enterprise integration with real data (#1548)

This commit is contained in:
Alexandre de Souza 2022-11-28 20:47:25 -03:00 committed by GitHub
parent 3385e20f9c
commit 60bc7194ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 54 additions and 34 deletions

View file

@ -10,7 +10,7 @@ defmodule Livebook.Hubs.Enterprise do
id: String.t() | nil,
url: String.t() | nil,
token: String.t() | nil,
external_id: String.t() | nil,
external_id: pos_integer() | nil,
hub_name: String.t() | nil,
hub_color: String.t() | nil
}

View file

@ -2,6 +2,6 @@ defmodule LivebookProto.User do
@moduledoc false
use Protobuf, protoc_gen_elixir_version: "0.11.0", syntax: :proto3
field :id, 1, type: :string
field :id, 1, type: :int32
field :email, 2, type: :string
end

View file

@ -1,7 +1,7 @@
syntax = "proto3";
message User {
string id = 1;
int32 id = 1;
string email = 2;
}

View file

@ -27,7 +27,7 @@ defmodule Livebook.WebSocketTest do
end
describe "send_request/2" do
test "receives the session response from server", %{url: url, token: token} do
test "receives the session response from server", %{url: url, token: token, user: user} do
headers = [{"X-Auth-Token", token}]
assert {:ok, %WebSocket.Connection{} = connection, :connected} =
@ -43,7 +43,8 @@ defmodule Livebook.WebSocketTest do
assert WebSocket.disconnect(connection) == :ok
assert session_response.user.email == "jake.peralta@mail.com"
assert session_response.user.id == user.id
assert session_response.user.email == user.email
end
end
end

View file

@ -6,8 +6,8 @@ defmodule LivebookWeb.Hub.New.EnterpriseComponentTest do
alias Livebook.Hubs
describe "enterprise" do
test "persists new hub", %{conn: conn, url: url, token: token} do
Livebook.Hubs.delete_hub("enterprise-bf1587a3-4501-4729-9f53-43679381e28b")
test "persists new hub", %{conn: conn, url: url, token: token, user: user} do
Livebook.Hubs.delete_hub("enterprise-#{user.id}")
{:ok, view, _html} = live(conn, Routes.hub_path(conn, :new))
@ -28,7 +28,7 @@ defmodule LivebookWeb.Hub.New.EnterpriseComponentTest do
|> element("#connect")
|> render_click()
assert render(view) =~ "bf1587a3-4501-4729-9f53-43679381e28b"
assert render(view) =~ to_string(user.id)
attrs = %{
"url" => url,
@ -56,7 +56,7 @@ defmodule LivebookWeb.Hub.New.EnterpriseComponentTest do
hubs_html = view |> element("#hubs") |> render()
assert hubs_html =~ ~s/style="color: #FF00FF"/
assert hubs_html =~ "/hub/enterprise-bf1587a3-4501-4729-9f53-43679381e28b"
assert hubs_html =~ "/hub/enterprise-#{user.id}"
assert hubs_html =~ "Enterprise"
end
@ -85,11 +85,11 @@ defmodule LivebookWeb.Hub.New.EnterpriseComponentTest do
refute render(view) =~ "enterprise[hub_name]"
end
test "fails to create existing hub", %{conn: conn, url: url, token: token} do
test "fails to create existing hub", %{conn: conn, url: url, token: token, user: user} do
hub =
insert_hub(:enterprise,
id: "enterprise-bf1587a3-4501-4729-9f53-43679381e28b",
external_id: "bf1587a3-4501-4729-9f53-43679381e28b",
id: "enterprise-#{user.id}",
external_id: user.id,
url: url,
token: token
)
@ -113,7 +113,7 @@ defmodule LivebookWeb.Hub.New.EnterpriseComponentTest do
|> element("#connect")
|> render_click()
assert render(view) =~ "bf1587a3-4501-4729-9f53-43679381e28b"
assert render(view) =~ to_string(user.id)
attrs = %{
"url" => url,

View file

@ -16,6 +16,7 @@ defmodule Livebook.EnterpriseIntegrationCase do
setup_all do
EnterpriseServer.start()
{:ok, url: EnterpriseServer.url(), token: EnterpriseServer.token()}
{:ok,
url: EnterpriseServer.url(), token: EnterpriseServer.token(), user: EnterpriseServer.user()}
end
end

View file

@ -10,12 +10,7 @@ defmodule Livebook.Factory do
end
def build(:fly_metadata) do
%Livebook.Hubs.Metadata{
id: "fly-foo-bar-baz",
name: "My Personal Hub",
color: "#FF00FF",
provider: build(:fly)
}
:fly |> build() |> Livebook.Hubs.Provider.normalize()
end
def build(:fly) do
@ -32,18 +27,11 @@ defmodule Livebook.Factory do
end
def build(:enterprise_metadata) do
id = Livebook.Utils.random_short_id()
%Livebook.Hubs.Metadata{
id: "enterprise-#{id}",
name: "Enterprise",
color: "#FF00FF",
provider: build(:enterprise)
}
:enterprise |> build() |> Livebook.Hubs.Provider.normalize()
end
def build(:enterprise) do
id = Livebook.Utils.random_short_id()
id = :erlang.phash2(Livebook.Utils.random_short_id())
%Livebook.Hubs.Enterprise{
id: "enterprise-#{id}",

View file

@ -2,6 +2,8 @@ defmodule Livebook.EnterpriseServer do
@moduledoc false
use GenServer
defstruct [:token, :user, :node, :port]
@name __MODULE__
def start do
@ -16,11 +18,16 @@ defmodule Livebook.EnterpriseServer do
GenServer.call(@name, :fetch_token)
end
def user do
GenServer.call(@name, :fetch_user)
end
# GenServer Callbacks
@impl true
def init(_opts) do
{:ok, %{token: nil, node: enterprise_node(), port: nil}, {:continue, :start_enterprise}}
state = %__MODULE__{node: enterprise_node()}
{:ok, state, {:continue, :start_enterprise}}
end
@impl true
@ -30,9 +37,16 @@ defmodule Livebook.EnterpriseServer do
@impl true
def handle_call(:fetch_token, _from, state) do
token = state.token || fetch_token_from_enterprise(state)
state = if _ = state.token, do: state, else: create_enterprise_token(state)
{:reply, token, %{state | token: token}}
{:reply, state.token, state}
end
@impl true
def handle_call(:fetch_user, _from, state) do
state = if _ = state.user, do: state, else: create_enterprise_user(state)
{:reply, state.user, state}
end
# Port Callbacks
@ -50,8 +64,24 @@ defmodule Livebook.EnterpriseServer do
# Private
defp fetch_token_from_enterprise(state) do
:erpc.call(state.node, Enterprise.Integration, :fetch_token, [])
defp create_enterprise_token(state) do
if user = state.user do
token = call_erpc_function(state.node, :generate_user_session_token!, [user])
%{state | token: token}
else
user = call_erpc_function(state.node, :create_user)
token = call_erpc_function(state.node, :generate_user_session_token!, [user])
%{state | user: user, token: token}
end
end
defp create_enterprise_user(state) do
%{state | user: call_erpc_function(state.node, :create_user)}
end
defp call_erpc_function(node, function, args \\ []) do
:erpc.call(node, Enterprise.Integration, function, args)
end
defp start_enterprise(state) do