Make bootup sequence wait for farmware installion

feature/sequence-on-boot
connor rigby 2019-11-07 14:47:01 -08:00 committed by Connor Rigby
parent f23eb81616
commit 3f06afdccb
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
3 changed files with 40 additions and 10 deletions

View File

@ -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}}

View File

@ -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")

View File

@ -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