Add `author` to enigma problem_tag format

pull/974/head
Connor Rigby 2019-04-11 08:33:04 -07:00
parent 92d8e4eae0
commit cc87c7e923
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
6 changed files with 41 additions and 12 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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