Skip to content

Commit 1859406

Browse files
authored
Broadcast that a device has been updated when setting and clearing deployment (#1846)
The device channel needs to be notified when a device's deployment changes so it can resubscribe to the proper deployment channel and send an update if available.
1 parent fd6ea67 commit 1859406

File tree

4 files changed

+71
-10
lines changed

4 files changed

+71
-10
lines changed

lib/nerves_hub/devices.ex

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -719,20 +719,28 @@ defmodule NervesHub.Devices do
719719

720720
@spec update_deployment(Device.t(), Deployment.t()) :: Device.t()
721721
def update_deployment(device, deployment) do
722-
device
723-
|> Ecto.Changeset.change()
724-
|> Ecto.Changeset.put_change(:deployment_id, deployment.id)
725-
|> Repo.update!()
726-
|> Repo.preload(:deployment, force: true)
722+
device =
723+
device
724+
|> Ecto.Changeset.change()
725+
|> Ecto.Changeset.put_change(:deployment_id, deployment.id)
726+
|> Repo.update!()
727+
728+
_ = broadcast(device, "devices/updated")
729+
730+
Map.put(device, :deployment, deployment)
727731
end
728732

729733
@spec clear_deployment(Device.t()) :: Device.t()
730734
def clear_deployment(device) do
731-
device
732-
|> Ecto.Changeset.change()
733-
|> Ecto.Changeset.put_change(:deployment_id, nil)
734-
|> Repo.update!()
735-
|> Repo.preload(:deployment, force: true)
735+
device =
736+
device
737+
|> Ecto.Changeset.change()
738+
|> Ecto.Changeset.put_change(:deployment_id, nil)
739+
|> Repo.update!()
740+
741+
_ = broadcast(device, "devices/updated")
742+
743+
Map.put(device, :deployment, nil)
736744
end
737745

738746
@spec failure_threshold_met?(Device.t(), Deployment.t()) :: boolean()
@@ -1022,6 +1030,8 @@ defmodule NervesHub.Devices do
10221030
|> where([d], d.firmware_metadata["architecture"] == ^firmware.architecture)
10231031
|> Repo.update_all(set: [deployment_id: deployment_id])
10241032

1033+
:ok = Enum.each(device_ids, &broadcast(%Device{id: &1}, "devices/updated"))
1034+
10251035
{:ok, %{updated: devices_updated_count, ignored: length(device_ids) - devices_updated_count}}
10261036
end
10271037

test/nerves_hub/devices_test.exs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,4 +785,34 @@ defmodule NervesHub.DevicesTest do
785785
assert 7 = Enum.count(healths)
786786
end
787787
end
788+
789+
describe "update_deployment/2" do
790+
test "updates deployment and broadcasts 'devices/updated'", %{
791+
device: device,
792+
deployment: deployment
793+
} do
794+
refute device.deployment_id
795+
796+
NervesHubWeb.Endpoint.subscribe("device:#{device.id}")
797+
device = Devices.update_deployment(device, deployment)
798+
799+
assert device.deployment_id == deployment.id
800+
assert_receive %{event: "devices/updated"}
801+
end
802+
end
803+
804+
describe "clear_deployment1/2" do
805+
test "clears deployment and broadcasts 'devices/updated'", %{
806+
device: device,
807+
deployment: deployment
808+
} do
809+
device = Devices.update_deployment(device, deployment)
810+
811+
NervesHubWeb.Endpoint.subscribe("device:#{device.id}")
812+
device = Devices.clear_deployment(device)
813+
814+
refute device.deployment_id
815+
assert_receive %{event: "devices/updated"}
816+
end
817+
end
788818
end

test/nerves_hub_web/live/devices/index_test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ defmodule NervesHubWeb.Live.Devices.IndexTest do
294294
} = fixture
295295

296296
device2 = Fixtures.device_fixture(org, product, firmware)
297+
Endpoint.subscribe("device:#{device2.id}")
297298

298299
refute device.deployment_id
299300
refute device2.deployment_id
@@ -310,6 +311,9 @@ defmodule NervesHubWeb.Live.Devices.IndexTest do
310311
|> click_button("#move-deployment-submit", "Move")
311312
|> assert_has("div", text: "2 devices added to deployment")
312313

314+
assert_receive %{event: "devices/updated"}
315+
assert_receive %{event: "devices/updated"}
316+
313317
assert Repo.reload(device) |> Map.get(:deployment_id)
314318
assert Repo.reload(device2) |> Map.get(:deployment_id)
315319
end

test/nerves_hub_web/live/devices/show_test.exs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,23 @@ defmodule NervesHubWeb.Live.Devices.ShowTest do
648648
|> visit("/org/#{org.name}/#{product.name}/devices/#{device.identifier}")
649649
|> assert_has("div", text: "No Eligible Deployments")
650650
end
651+
652+
test "broadcasts to devices channel", %{
653+
conn: conn,
654+
org: org,
655+
product: product,
656+
device: device,
657+
deployment: deployment
658+
} do
659+
conn
660+
|> visit("/org/#{org.name}/#{product.name}/devices/#{device.identifier}")
661+
|> assert_has("div", text: "Product Deployments")
662+
|> unwrap(fn view ->
663+
render_change(view, "set-deployment", %{"deployment_id" => deployment.id})
664+
end)
665+
666+
assert_receive %Phoenix.Socket.Broadcast{event: "devices/updated"}
667+
end
651668
end
652669

653670
def device_show_path(%{device: device, org: org, product: product}) do

0 commit comments

Comments
 (0)