Add `author` to enigma problem_tag format
parent
92d8e4eae0
commit
cc87c7e923
|
@ -4,9 +4,19 @@ defmodule FarmbotCore.Asset.Private.Enigma do
|
|||
it represents data that has two conflicting
|
||||
forms in two different systems (eg: API vs. Bot)
|
||||
and requires human intervention to rectify.
|
||||
|
||||
## `problem_tag`
|
||||
Problem tag should follow a format of: `"author.noun.verb"`
|
||||
So for example a fbos enigma would could look like:
|
||||
* `"farmbot_os.firmware.stalled"`
|
||||
* `"farmbot_os.farm_event.conflicted"`
|
||||
etc.
|
||||
"""
|
||||
use FarmbotCore.Asset.Schema, path: false
|
||||
|
||||
@author "farmbot_os"
|
||||
@known_enigmas %{"firmware" => %{"missing" => true}}
|
||||
|
||||
schema "enigmas" do
|
||||
field(:priority, :integer)
|
||||
field(:problem_tag, :string)
|
||||
|
@ -20,6 +30,7 @@ defmodule FarmbotCore.Asset.Private.Enigma do
|
|||
enigma
|
||||
|> cast(params, [:priority, :problem_tag, :status, :monitor])
|
||||
|> validate_required([:priority, :problem_tag])
|
||||
|> validate_problem_tag_format()
|
||||
|> validate_inclusion(:status, ~w(unresolved resolved))
|
||||
end
|
||||
|
||||
|
@ -34,4 +45,21 @@ defmodule FarmbotCore.Asset.Private.Enigma do
|
|||
created_at: DateTime.to_unix(enigma.created_at)
|
||||
}
|
||||
end
|
||||
|
||||
def validate_problem_tag_format(changeset) do
|
||||
{_, tag} = Ecto.Changeset.fetch_field(changeset, :problem_tag)
|
||||
case String.split(tag, ".") do
|
||||
[@author, noun, verb] ->
|
||||
if @known_enigmas[noun][verb] do
|
||||
changeset
|
||||
else
|
||||
Ecto.Changeset.add_error(changeset, :problem_tag, "unknown noun verb combo", noun: noun, verb: verb)
|
||||
end
|
||||
_ ->
|
||||
Ecto.Changeset.add_error(changeset, :problem_tag, "invalid format")
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
def firmware_missing, do: Enum.join([@author, "firmware", "missing"], ".")
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@ defmodule FarmbotCore.Asset.PrivateTest do
|
|||
test "create_or_update_enigma!() returns :ok" do
|
||||
result = enigma()
|
||||
assert result.priority == 100
|
||||
assert result.problem_tag == "firmware.missing"
|
||||
assert result.problem_tag == "farmbot_os.firmware.missing"
|
||||
assert result.created_at
|
||||
|
||||
result2 =
|
||||
|
|
|
@ -15,7 +15,7 @@ defmodule FarmbotCore.EnigmaHandlerTest do
|
|||
|
||||
e = enigma()
|
||||
|
||||
:ok = EnigmaHandler.register_up(handler, "firmware.missing", foo)
|
||||
:ok = EnigmaHandler.register_up(handler, "farmbot_os.firmware.missing", foo)
|
||||
EnigmaHandler.handle_up(handler, e)
|
||||
assert_received ^e
|
||||
end
|
||||
|
@ -32,10 +32,10 @@ defmodule FarmbotCore.EnigmaHandlerTest do
|
|||
e = %Enigma{
|
||||
priority: 0,
|
||||
local_id: Ecto.UUID.generate(),
|
||||
problem_tag: "firmware.missing"
|
||||
problem_tag: "farmbot_os.firmware.missing"
|
||||
}
|
||||
|
||||
:ok = EnigmaHandler.register_down(handler, "firmware.missing", foo)
|
||||
:ok = EnigmaHandler.register_down(handler, "farmbot_os.firmware.missing", foo)
|
||||
EnigmaHandler.handle_down(handler, e)
|
||||
assert_received ^e
|
||||
end
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
defmodule FarmbotOS.Init.EnigmaFirmwareMissing do
|
||||
alias FarmbotCore.{Asset, Asset.Private, Config}
|
||||
alias FarmbotCore.{Asset, Asset.Private, Asset.Private.Enigma, Config}
|
||||
alias FarmbotCore.EnigmaHandler
|
||||
alias FarmbotFirmware.UARTTransport
|
||||
|
||||
|
@ -20,8 +20,8 @@ defmodule FarmbotOS.Init.EnigmaFirmwareMissing do
|
|||
end
|
||||
|
||||
def setup() do
|
||||
EnigmaHandler.register_up("firmware.missing", &enigma_up/1)
|
||||
EnigmaHandler.register_down("firmware.missing", &enigma_down/1)
|
||||
EnigmaHandler.register_up(Enigma.firmware_missing(), &enigma_up/1)
|
||||
EnigmaHandler.register_down(Enigma.firmware_missing(), &enigma_down/1)
|
||||
|
||||
needs_flash? = Config.get_config_value(:bool, "settings", "firmware_needs_flash")
|
||||
|
||||
|
@ -32,7 +32,7 @@ defmodule FarmbotOS.Init.EnigmaFirmwareMissing do
|
|||
case situation do
|
||||
{true, firmware_hardware} when is_binary(firmware_hardware) ->
|
||||
FarmbotCore.Logger.warn(1, "firmware needs flashed creating `firmware.missing` enigma")
|
||||
Private.create_or_update_enigma!(%{priority: 100, problem_tag: "firmware.missing"})
|
||||
Private.create_or_update_enigma!(%{priority: 100, problem_tag: Enigma.firmware_missing()})
|
||||
# Ignore fw/hw
|
||||
%{firmware_hardware: nil, firmware_path: nil}
|
||||
|> Asset.update_fbos_config!()
|
||||
|
@ -46,7 +46,7 @@ defmodule FarmbotOS.Init.EnigmaFirmwareMissing do
|
|||
|
||||
{_, nil} ->
|
||||
FarmbotCore.Logger.warn(1, "firmware needs flashed- creating `firmware.missing` enigma")
|
||||
Private.create_or_update_enigma!(%{priority: 100, problem_tag: "firmware.missing"})
|
||||
Private.create_or_update_enigma!(%{priority: 100, problem_tag: Enigma.firmware_missing()})
|
||||
:ok
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
defmodule FarmbotOS.SysCalls.FlashFirmware do
|
||||
alias FarmbotCore.{Asset, Asset.Private}
|
||||
alias FarmbotCore.{Asset, Asset.Private, Asset.Private.Enigma}
|
||||
alias FarmbotFirmware
|
||||
alias FarmbotOS.FirmwareTTYDetector
|
||||
require Logger
|
||||
|
@ -12,7 +12,7 @@ defmodule FarmbotOS.SysCalls.FlashFirmware do
|
|||
|> Asset.update_fbos_config!()
|
||||
|> Private.mark_dirty!(%{})
|
||||
|
||||
:ok = Private.clear_enigma!("firmware.missing")
|
||||
:ok = Private.clear_enigma!(Enigma.firmware_missing())
|
||||
:ok
|
||||
else
|
||||
{:error, reason} when is_binary(reason) ->
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
defmodule Farmbot.TestSupport.AssetFixtures do
|
||||
alias FarmbotCore.Asset
|
||||
alias FarmbotCore.Asset.{Repo, FarmEvent, FbosConfig, Regimen, Sequence, Private}
|
||||
alias Private.Enigma
|
||||
|
||||
def regimen_instance(regimen_params, farm_event_params, params \\ %{}) do
|
||||
regimen = regimen(regimen_params)
|
||||
|
@ -95,7 +96,7 @@ defmodule Farmbot.TestSupport.AssetFixtures do
|
|||
|
||||
def enigma() do
|
||||
Private.create_or_update_enigma!(%{
|
||||
problem_tag: "firmware.missing",
|
||||
problem_tag: Enigma.firmware_missing(),
|
||||
priority: 100,
|
||||
monitor: false
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue