diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex index e428ba21..3954c2d8 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex @@ -2,7 +2,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do use GenServer require FarmbotCore.Logger - alias FarmbotCore.{Asset.Repo, BotState, JSON} + alias FarmbotCore.{Asset.Repo, BotState, DepTracker, JSON} alias FarmbotCore.Asset.FarmwareInstallation, as: FWI alias FarmbotCore.Asset.FarmwareInstallation.Manifest @@ -21,6 +21,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do end def init(fwi) do + :ok = DepTracker.register_asset(fwi, :init) {:ok, %{fwi: fwi, backoff: 0}, 0} end @@ -39,6 +40,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do :ok <- install_zip(updated, zip_binary), :ok <- install_farmware_tools(updated), :ok <- write_manifest(updated) do + :ok = DepTracker.register_asset(fwi, :complete) FarmbotCore.Logger.success(1, "Installed Farmware: #{updated.manifest.package}") # TODO(Connor) -> No reason to keep this process alive? BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) @@ -80,6 +82,8 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do {:noreply, %{state | fwi: updated}, 0} error -> + :ok = DepTracker.register_asset(fwi, :complete) + BotState.report_farmware_installed(fwi.manifest.package, Manifest.view(fwi.manifest)) backoff = state.backoff + @back_off_time_ms timeout = @error_retry_time_ms + backoff error_log(fwi, "failed to check for updates. Trying again in #{timeout}ms #{inspect(error)}") @@ -92,6 +96,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do # Installed is newer than remote. :gt -> success_log(updated, "up to date.") + :ok = DepTracker.register_asset(updated, :complete) BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) {:noreply, %{state | fwi: updated}} @@ -99,6 +104,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do # No difference between installed and remote. :eq -> success_log(updated, "up to date.") + :ok = DepTracker.register_asset(updated, :complete) BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) {:noreply, %{state | fwi: updated}} @@ -111,6 +117,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do :ok <- install_zip(updated, zip_binary), :ok <- install_farmware_tools(updated), :ok <- write_manifest(updated) do + :ok = DepTracker.register_asset(updated, :complete) BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) {:noreply, %{state | fwi: updated, backoff: 0}} diff --git a/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex b/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex index 6b6fd320..bda6cb16 100644 --- a/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex +++ b/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex @@ -66,7 +66,7 @@ defmodule FarmbotExt.API.EagerLoader do * a remote `id` field. """ def cache(%Changeset{data: %module{}} = changeset) do - Logger.info("Caching #{inspect(changeset)}") + # Logger.info("Caching #{inspect(changeset)}") id = Changeset.get_field(changeset, :id) updated_at = Changeset.get_field(changeset, :updated_at) id || change_error(changeset, "Can't cache a changeset with no :id attribute") diff --git a/farmbot_os/lib/farmbot_os/bootup_sequence_worker.ex b/farmbot_os/lib/farmbot_os/bootup_sequence_worker.ex index 08014c5f..4a8f5081 100644 --- a/farmbot_os/lib/farmbot_os/bootup_sequence_worker.ex +++ b/farmbot_os/lib/farmbot_os/bootup_sequence_worker.ex @@ -3,7 +3,12 @@ defmodule FarmbotOS.BootupSequenceWorker do require Logger require FarmbotCore.Logger alias FarmbotCore.{Asset, BotState, DepTracker} - alias FarmbotCore.Asset.Peripheral + + alias FarmbotCore.Asset.{ + FarmwareInstalation, + Peripheral + } + alias FarmbotCeleryScript.AST def start_link(args) do @@ -125,13 +130,7 @@ defmodule FarmbotOS.BootupSequenceWorker do state %{boot_sequence_id: id} -> - peripherals_loaded? = - Enum.all?(DepTracker.get_asset(Peripheral), fn - {{Peripheral, _}, :complete} -> true - _ -> false - end) - - peripherals_loaded? && send(self(), :start_sequence) + dependency_assets_loaded?() && send(self(), :start_sequence) %{state | sequence_id: id} end end @@ -141,4 +140,28 @@ defmodule FarmbotOS.BootupSequenceWorker do |> AST.Factory.rpc_request("fbos_config.bootup_sequence") |> AST.Factory.execute(sequence_id) end + + defp dependency_assets_loaded?() do + peripherals = + Enum.all?(DepTracker.get_asset(Peripheral), fn + {{Peripheral, _}, :complete} -> + true + + {{kind, id}, status} -> + Logger.debug("bootup sequence still waiting on: #{kind}.#{id} status=#{status}") + false + end) + + farmware = + Enum.all?(DepTracker.get_asset(FarmwareInstalation), fn + {{FarmwareInstalation, _}, :complete} -> + true + + {{kind, id}, status} -> + Logger.debug("bootup sequence still waiting on: #{kind}.#{id} status=#{status}") + false + end) + + peripherals && farmware + end end