Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
nodejs 16.18.1
python 3.10.13
elixir 1.18.3-otp-27
erlang 27.3.3
elixir 1.19.0
erlang 28.1
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ARG ELIXIR_VERSION=1.18.3
ARG OTP_VERSION=27.3.3
ARG ELIXIR_VERSION=1.19.0
ARG OTP_VERSION=28.1
ARG DISTRO=noble-20250404
ARG NODE_VERSION=16.20.2

Expand Down
9 changes: 3 additions & 6 deletions lib/nerves_hub/firmwares.ex
Original file line number Diff line number Diff line change
Expand Up @@ -224,19 +224,16 @@ defmodule NervesHub.Firmwares do

@spec create_firmware(
org :: Org.t(),
filepath :: Path.t(),
opts :: [{:upload_file_2, upload_file_2()}]
filepath :: Path.t()
) ::
{:ok, Firmware.t()}
| {:error, Changeset.t() | :no_public_keys | :invalid_signature | any}
def create_firmware(org, filepath, opts \\ []) do
upload_file_2 = opts[:upload_file_2] || (&firmware_upload_config().upload_file/2)

def create_firmware(org, filepath) do
Repo.transaction(
fn ->
with {:ok, params} <- build_firmware_params(org, filepath),
{:ok, firmware} <- insert_firmware(params),
:ok <- upload_file_2.(filepath, firmware.upload_metadata) do
:ok <- firmware_upload_config().upload_file(filepath, firmware.upload_metadata) do
_ = NervesHubWeb.Endpoint.broadcast("firmware", "created", %{firmware: firmware})
firmware
else
Expand Down
6 changes: 2 additions & 4 deletions lib/nerves_hub/managed_deployments.ex
Original file line number Diff line number Diff line change
Expand Up @@ -272,14 +272,12 @@ defmodule NervesHub.ManagedDeployments do
defp maybe_trigger_delta_generation(
%{delta_updatable: true} = deployment_group,
%{changes: %{firmware_id: _}} = _changeset
),
do: trigger_delta_generation_for_deployment_group(deployment_group)
), do: trigger_delta_generation_for_deployment_group(deployment_group)

defp maybe_trigger_delta_generation(
%{delta_updatable: true} = deployment_group,
%{changes: %{is_active: true}} = _changeset
),
do: trigger_delta_generation_for_deployment_group(deployment_group)
), do: trigger_delta_generation_for_deployment_group(deployment_group)

defp maybe_trigger_delta_generation(deployment_group, %{changes: %{delta_updatable: true}} = _changeset),
do: trigger_delta_generation_for_deployment_group(deployment_group)
Expand Down
11 changes: 5 additions & 6 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,8 @@ defmodule NervesHub.MixProject do
start_permanent: Mix.env() == :prod,
deps: deps(),
aliases: aliases(),
preferred_cli_env: [
docs: :docs,
coveralls: :test,
"coveralls.html": :test
],
elixirc_paths: elixirc_paths(Mix.env()),
elixir: "~> 1.18.0",
elixir: "~> 1.19.0-rc.2",
listeners: listeners(Mix.env()),
releases: [
nerves_hub: [
Expand Down Expand Up @@ -57,6 +52,10 @@ defmodule NervesHub.MixProject do
]
end

def cli() do
[preferred_envs: [docs: :docs, coveralls: :test, "coveralls.html": :test]]
end

defp build() do
cmd = "git rev-parse --short=8 HEAD"

Expand Down
18 changes: 10 additions & 8 deletions test/nerves_hub/firmwares_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,26 @@ defmodule NervesHub.FirmwaresTest do
end

describe "create_firmware/2" do
test "enforces uuid uniqueness within a product",
%{firmware: %{upload_metadata: %{local_path: filepath}}, org: org} do
assert {:error, %Ecto.Changeset{errors: [uuid: {"has already been taken", [_ | _]}]}} =
Firmwares.create_firmware(org, filepath)
end

test "remote creation failure triggers transaction rollback", %{
org: org,
org_key: org_key,
product: product
} do
firmwares = Firmwares.get_firmwares_by_product(product.id)
upload_file_2 = fn _, _ -> {:error, :nope} end

filepath = Fixtures.firmware_file_fixture(org_key, product)

assert {:error, _} = Firmwares.create_firmware(org, filepath, upload_file_2: upload_file_2)
stub(NervesHub.Firmwares.Upload.File, :upload_file, fn _, _ -> {:error, :nope} end)

assert ^firmwares = Firmwares.get_firmwares_by_product(product.id)
end
assert {:error, _} = Firmwares.create_firmware(org, filepath)

test "enforces uuid uniqueness within a product",
%{firmware: %{upload_metadata: %{local_path: filepath}}, org: org} do
assert {:error, %Ecto.Changeset{errors: [uuid: {"has already been taken", [_ | _]}]}} =
Firmwares.create_firmware(org, filepath)
assert ^firmwares = Firmwares.get_firmwares_by_product(product.id)
end
end

Expand Down
21 changes: 12 additions & 9 deletions test/nerves_hub_web/live/devices/health_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,18 @@ defmodule NervesHubWeb.Devices.HealthTest do
|> DeviceMetric.save_with_timestamp()
|> Repo.insert()

{:ok, _view, html} =
live(conn, "/org/#{org.name}/#{product.name}/devices/#{device.identifier}/health")

organized_metrics =
~s([{"y":#{value},"x":"#{now}"}])
|> html_escape()
|> safe_to_string()

assert html =~ ~s(data-metrics="#{organized_metrics}")
{:ok, _view, html} = live(conn, "/org/#{org.name}/#{product.name}/devices/#{device.identifier}/health")

metrics =
html
|> LazyHTML.from_document()
|> LazyHTML.query("canvas")
|> LazyHTML.attributes()
|> List.first()
|> Enum.find(fn {key, _} -> key == "data-metrics" end)
|> elem(1)

assert metrics == ~s([{"x":"#{now}","y":#{value}}])
end

defp save_metrics_with_timestamp(device_id, timestamp) do
Expand Down
21 changes: 12 additions & 9 deletions test/nerves_hub_web/live/new_ui/devices/health_tab_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -167,15 +167,18 @@ defmodule NervesHubWeb.Live.NewUi.Devices.HealthTabTest do
|> DeviceMetric.save_with_timestamp()
|> Repo.insert()

{:ok, _view, html} =
live(conn, "/org/#{org.name}/#{product.name}/devices/#{device.identifier}/health")

organized_metrics =
~s([{"y":#{value},"x":"#{now}"}])
|> html_escape()
|> safe_to_string()

assert html =~ ~s(data-metrics="#{organized_metrics}")
{:ok, _view, html} = live(conn, "/org/#{org.name}/#{product.name}/devices/#{device.identifier}/health")

metrics =
html
|> LazyHTML.from_document()
|> LazyHTML.query("canvas")
|> LazyHTML.attributes()
|> List.first()
|> Enum.find(fn {key, _} -> key == "data-metrics" end)
|> elem(1)

assert metrics == ~s([{"x":"#{now}","y":#{value}}])
end

defp save_metrics_with_timestamp(device_id, timestamp) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ defmodule NervesHubWeb.Live.Org.SigningKeysTest do
|> assert_has("div", text: "Signing Key created successfully.")
|> assert_has("h3", text: "my amazing key")
|> assert_has(".key-value", text: "wouldn't you like to know!")
|> assert_has("div", text: "Created by: #{user.username}")
|> assert_has("div", text: "Created by: #{user.name}")
end

test "name is trimmed if there is extra space", %{conn: conn, org: org} do
Expand Down
Loading