Skip to content

Commit 2739e10

Browse files
aleDszjonatanklosko
authored andcommitted
Improve the usage of app deployments within the UI (#3151)
1 parent 844f6d3 commit 2739e10

12 files changed

Lines changed: 134 additions & 33 deletions

File tree

lib/livebook/hubs/team_client.ex

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,14 @@ defmodule Livebook.Hubs.TeamClient do
104104
GenServer.call(registry_name(id), :get_app_deployments)
105105
end
106106

107+
@doc """
108+
Returns an app deployment from given data.
109+
"""
110+
@spec get_app_deployment(String.t(), String.t(), String.t()) :: Teams.AppDeployment.t() | nil
111+
def get_app_deployment(id, slug, deployment_group_id) do
112+
GenServer.call(registry_name(id), {:get_app_deployment, slug, deployment_group_id})
113+
end
114+
107115
@doc """
108116
Returns a list of cached app deployments that should be deployed on
109117
this instance.
@@ -279,6 +287,13 @@ defmodule Livebook.Hubs.TeamClient do
279287
{:reply, state.app_deployments, state}
280288
end
281289

290+
def handle_call({:get_app_deployment, slug, deployment_group_id}, _caller, state) do
291+
case fetch_app_deployment_from_slug(slug, deployment_group_id, state) do
292+
{:ok, app_deployment} -> {:reply, app_deployment, state}
293+
state -> {:reply, nil, state}
294+
end
295+
end
296+
282297
def handle_call(:get_agent_app_deployments, _caller, state) do
283298
if state.deployment_group_id do
284299
app_deployments =
@@ -341,7 +356,8 @@ defmodule Livebook.Hubs.TeamClient do
341356
def handle_call({:check_app_access, groups, slug}, _caller, state) do
342357
if id = state.deployment_group_id do
343358
with {:ok, deployment_group} <- fetch_deployment_group(id, state),
344-
{:ok, app_deployment} <- fetch_app_deployment_from_slug(slug, state) do
359+
{:ok, app_deployment} <-
360+
fetch_app_deployment_from_slug(slug, deployment_group.id, state) do
345361
app_access? =
346362
not deployment_group.teams_auth or
347363
not deployment_group.groups_auth or
@@ -568,7 +584,8 @@ defmodule Livebook.Hubs.TeamClient do
568584
groups_auth: deployment_group.groups_auth,
569585
deploy_auth: deployment_group.deploy_auth,
570586
authorization_groups: authorization_groups,
571-
deployment_users: deployment_users
587+
deployment_users: deployment_users,
588+
deployed_apps_counter: deployment_group.deployed_apps_counter
572589
}
573590
end
574591

@@ -587,7 +604,8 @@ defmodule Livebook.Hubs.TeamClient do
587604
url: nullify(deployment_group_created.url),
588605
teams_auth: deployment_group_created.teams_auth,
589606
authorization_groups: [],
590-
deployment_users: []
607+
deployment_users: [],
608+
deployed_apps_counter: 0
591609
}
592610
end
593611

@@ -966,6 +984,15 @@ defmodule Livebook.Hubs.TeamClient do
966984
end
967985
end
968986

987+
defp handle_event(:deployment_status_updated, %{id: id, deployed_apps_counter: counter}, state) do
988+
with {:ok, deployment_group} <- fetch_deployment_group(id, state) do
989+
deployment_group = %{deployment_group | deployed_apps_counter: counter}
990+
991+
Teams.Broadcasts.deployment_group_updated(deployment_group)
992+
put_deployment_group(state, deployment_group)
993+
end
994+
end
995+
969996
defp dispatch_secrets(state, %{secrets: secrets}) do
970997
decrypted_secrets = Enum.map(secrets, &build_secret(state, &1))
971998

@@ -1167,8 +1194,13 @@ defmodule Livebook.Hubs.TeamClient do
11671194
defp fetch_app_deployment(id, state),
11681195
do: fetch_entry(state.app_deployments, &(&1.id == id), state)
11691196

1170-
defp fetch_app_deployment_from_slug(slug, state),
1171-
do: fetch_entry(state.app_deployments, &(&1.slug == slug), state)
1197+
defp fetch_app_deployment_from_slug(slug, deployment_group_id, state) do
1198+
fetch_entry(
1199+
state.app_deployments,
1200+
&(&1.slug == slug && &1.deployment_group_id == deployment_group_id),
1201+
state
1202+
)
1203+
end
11721204

11731205
defp fetch_app_folder(id, state), do: fetch_entry(state.app_folders, &(&1.id == id), state)
11741206

lib/livebook/teams.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,14 @@ defmodule Livebook.Teams do
219219
TeamClient.get_app_deployments(team.id)
220220
end
221221

222+
@doc """
223+
Gets an app deployment for a given Hub.
224+
"""
225+
@spec get_app_deployment(Team.t(), String.t(), String.t()) :: Teams.AppDeployment.t() | nil
226+
def get_app_deployment(team, slug, deployment_group_id) do
227+
TeamClient.get_app_deployment(team.id, slug, deployment_group_id)
228+
end
229+
222230
@doc """
223231
Gets a list of agents for a given Hub.
224232
"""
@@ -230,7 +238,7 @@ defmodule Livebook.Teams do
230238
@doc """
231239
Gets a list of environment variables for a given Hub.
232240
"""
233-
@spec get_environment_variables(Team.t()) :: list(Teams.Agent.t())
241+
@spec get_environment_variables(Team.t()) :: list(Teams.EnvironmentVariable.t())
234242
def get_environment_variables(team) do
235243
TeamClient.get_environment_variables(team.id)
236244
end

lib/livebook/teams/deployment_group.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ defmodule Livebook.Teams.DeploymentGroup do
1414
hub_id: String.t() | nil,
1515
teams_auth: boolean(),
1616
groups_auth: boolean(),
17+
deployed_apps_counter: non_neg_integer(),
1718
authorization_groups: Ecto.Schema.embeds_many(Teams.AuthorizationGroup.t()),
1819
deployment_users: Ecto.Schema.embeds_many(Teams.DeploymentUser.t()),
1920
secrets: Ecto.Schema.has_many(Secrets.Secret.t()),
@@ -31,6 +32,7 @@ defmodule Livebook.Teams.DeploymentGroup do
3132
field :teams_auth, :boolean, default: true
3233
field :groups_auth, :boolean, default: false
3334
field :deploy_auth, :boolean, default: false
35+
field :deployed_apps_counter, :integer, default: 0
3436

3537
has_many :secrets, Secrets.Secret
3638
has_many :agent_keys, Teams.AgentKey

lib/livebook_web/live/hub/edit/team_component.ex

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
1515
secrets = Hubs.get_secrets(assigns.hub)
1616
file_systems = Hubs.get_file_systems(assigns.hub, hub_only: true)
1717
deployment_groups = Teams.get_deployment_groups(assigns.hub)
18-
app_deployments = Teams.get_app_deployments(assigns.hub)
1918
agents = Teams.get_agents(assigns.hub)
2019
environment_variables = Teams.get_environment_variables(assigns.hub)
2120
secret_name = assigns.params["secret_name"]
@@ -42,7 +41,6 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
4241
file_system_id: file_system_id,
4342
file_systems: file_systems,
4443
deployment_groups: Enum.sort_by(deployment_groups, & &1.name),
45-
app_deployments: Enum.frequencies_by(app_deployments, & &1.deployment_group_id),
4644
agents: Enum.frequencies_by(agents, & &1.deployment_group_id),
4745
environment_variables:
4846
Enum.frequencies_by(environment_variables, & &1.deployment_group_id),
@@ -250,7 +248,7 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
250248
id={"hub-deployment-group-#{deployment_group.id}"}
251249
hub={@hub}
252250
deployment_group={deployment_group}
253-
app_deployments_count={Map.get(@app_deployments, deployment_group.id, 0)}
251+
app_deployments_count={deployment_group.deployed_apps_counter}
254252
environment_variables_count={
255253
Map.get(@environment_variables, deployment_group.id, 0)
256254
}

lib/livebook_web/live/hub/edit_live.ex

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ defmodule LivebookWeb.Hub.EditLive do
1111
def mount(_params, _session, socket) do
1212
if connected?(socket) do
1313
Hubs.Broadcasts.subscribe([:connection])
14-
15-
Livebook.Teams.Broadcasts.subscribe([:deployment_groups, :app_deployments, :agents])
14+
Livebook.Teams.Broadcasts.subscribe([:deployment_groups, :agents])
1615
end
1716

1817
{:ok,

lib/livebook_web/live/session_live/app_teams_live.ex

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
4242
action: :deployment_groups
4343
)
4444
|> assign_deployment_groups()
45-
|> assign_app_deployments()
4645
|> assign_agents()
4746
|> assign_deployment_group(deployment_group_id)
4847
|> assign_app_deployment()
@@ -75,7 +74,6 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
7574
app_deployment={@app_deployment}
7675
deployment_groups={@deployment_groups}
7776
num_agents={@num_agents}
78-
num_app_deployments={@num_app_deployments}
7977
deployment_group={@deployment_group}
8078
session={@session}
8179
messages={@messages}
@@ -203,7 +201,6 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
203201
<.deployment_group_entry
204202
deployment_group={@deployment_group}
205203
num_agents={@num_agents}
206-
num_app_deployments={@num_app_deployments}
207204
authorized={@authorized[@deployment_group.id]}
208205
active
209206
/>
@@ -265,7 +262,6 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
265262
:for={deployment_group <- @deployment_groups}
266263
deployment_group={deployment_group}
267264
num_agents={@num_agents}
268-
num_app_deployments={@num_app_deployments}
269265
authorized={@authorized[deployment_group.id]}
270266
selectable
271267
/>
@@ -322,7 +318,6 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
322318
attr :authorized, :boolean, default: true
323319
attr :deployment_group, :map, required: true
324320
attr :num_agents, :map, required: true
325-
attr :num_app_deployments, :map, required: true
326321
attr :rest, :global
327322

328323
defp deployment_group_entry(assigns) do
@@ -368,7 +363,7 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
368363
else: "border-gray-300 text-gray-500"
369364
)
370365
]}>
371-
Apps deployed: {@num_app_deployments[@deployment_group.id] || 0}
366+
Apps deployed: {@deployment_group.deployed_apps_counter}
372367
</div>
373368
</div>
374369
</div>
@@ -472,10 +467,10 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
472467
{:noreply, assign_agents(socket)}
473468
end
474469

475-
def handle_info({event, app_deployment}, socket)
470+
def handle_info({event, %{slug: slug, hub_id: hub_id}}, socket)
476471
when event in [:app_deployment_started, :app_deployment_stopped] and
477-
app_deployment.hub_id == socket.assigns.hub.id do
478-
{:noreply, socket |> assign_app_deployments() |> assign_app_deployment()}
472+
slug == socket.assigns.slug and hub_id == socket.assigns.hub.id do
473+
{:noreply, assign_app_deployment(socket)}
479474
end
480475

481476
def handle_info({:deployment_users_updated, deployment_group}, socket)
@@ -512,12 +507,6 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
512507
assign(socket, deployment_groups: deployment_groups, authorized: authorized)
513508
end
514509

515-
defp assign_app_deployments(socket) do
516-
app_deployments = Teams.get_app_deployments(socket.assigns.hub)
517-
num_app_deployments = Enum.frequencies_by(app_deployments, & &1.deployment_group_id)
518-
assign(socket, app_deployments: app_deployments, num_app_deployments: num_app_deployments)
519-
end
520-
521510
defp assign_agents(socket) do
522511
agents = Teams.get_agents(socket.assigns.hub)
523512
num_agents = Enum.frequencies_by(agents, & &1.deployment_group_id)
@@ -536,10 +525,7 @@ defmodule LivebookWeb.SessionLive.AppTeamsLive do
536525
defp assign_app_deployment(socket) do
537526
app_deployment =
538527
if deployment_group = socket.assigns.deployment_group do
539-
Enum.find(
540-
socket.assigns.app_deployments,
541-
&(&1.slug == socket.assigns.slug and &1.deployment_group_id == deployment_group.id)
542-
)
528+
Teams.get_app_deployment(socket.assigns.hub, socket.assigns.slug, deployment_group.id)
543529
end
544530

545531
assign(socket, app_deployment: app_deployment)

proto/lib/livebook_proto/deployment_group.pb.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,6 @@ defmodule LivebookProto.DeploymentGroup do
3030
repeated: true,
3131
type: LivebookProto.DeploymentUser,
3232
json_name: "deploymentUsers"
33+
34+
field :deployed_apps_counter, 16, type: :int32, json_name: "deployedAppsCounter"
3335
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule LivebookProto.DeploymentStatusUpdated do
2+
use Protobuf,
3+
full_name: "DeploymentStatusUpdated",
4+
protoc_gen_elixir_version: "0.16.0",
5+
syntax: :proto3
6+
7+
field :id, 1, type: :string
8+
field :deployed_apps_counter, 2, type: :int32, json_name: "deployedAppsCounter"
9+
end

proto/lib/livebook_proto/event.pb.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,9 @@ defmodule LivebookProto.Event do
9393
type: LivebookProto.AppFolderDeleted,
9494
json_name: "appFolderDeleted",
9595
oneof: 0
96+
97+
field :deployment_status_updated, 22,
98+
type: LivebookProto.DeploymentStatusUpdated,
99+
json_name: "deploymentStatusUpdated",
100+
oneof: 0
96101
end

proto/messages.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ message DeploymentGroup {
7070
bool groups_auth = 13;
7171
bool deploy_auth = 14;
7272
repeated DeploymentUser deployment_users = 15;
73+
int32 deployed_apps_counter = 16;
7374
}
7475

7576
message DeploymentGroupCreated {
@@ -105,6 +106,11 @@ message DeploymentGroupDeleted {
105106
string id = 1;
106107
}
107108

109+
message DeploymentStatusUpdated {
110+
string id = 1;
111+
int32 deployed_apps_counter = 2;
112+
}
113+
108114
message AgentKey {
109115
string id = 1;
110116
string key = 2;
@@ -266,6 +272,7 @@ message Event {
266272
AppFolderCreated app_folder_created = 19;
267273
AppFolderUpdated app_folder_updated = 20;
268274
AppFolderDeleted app_folder_deleted = 21;
275+
DeploymentStatusUpdated deployment_status_updated = 22;
269276
}
270277
}
271278

0 commit comments

Comments
 (0)