PersistentRegimen => RegimenInstance
parent
295cb45d49
commit
399ddf50c8
|
@ -9,7 +9,7 @@ alias FarmbotCore.Asset.{
|
|||
FirmwareConfig,
|
||||
PinBinding,
|
||||
Regimen,
|
||||
PersistentRegimen,
|
||||
RegimenInstance,
|
||||
Sequence
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ use Mix.Config
|
|||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmEvent, checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.RegimenInstance,
|
||||
checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.Private.Enigma,
|
||||
|
|
|
@ -6,7 +6,7 @@ config :farmbot_core, FarmbotCore.AssetMonitor, checkup_time_ms: 500
|
|||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmEvent, checkup_time_ms: 1000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.RegimenInstance,
|
||||
checkup_time_ms: 1000
|
||||
|
||||
config :farmbot_celery_script, FarmbotCeleryScript.SysCalls,
|
||||
|
|
|
@ -19,7 +19,7 @@ defmodule FarmbotCore.Asset do
|
|||
PinBinding,
|
||||
Point,
|
||||
Regimen,
|
||||
PersistentRegimen,
|
||||
RegimenInstance,
|
||||
Sequence
|
||||
}
|
||||
|
||||
|
@ -83,31 +83,31 @@ defmodule FarmbotCore.Asset do
|
|||
|
||||
## End FirmwareConfig
|
||||
|
||||
## Begin PersistentRegimen
|
||||
## Begin RegimenInstance
|
||||
|
||||
def upsert_persistent_regimen!(%Regimen{} = regimen, %FarmEvent{} = farm_event, params \\ %{}) do
|
||||
def upsert_regimen_instance!(%Regimen{} = regimen, %FarmEvent{} = farm_event, params \\ %{}) do
|
||||
q =
|
||||
from(pr in PersistentRegimen,
|
||||
from(pr in RegimenInstance,
|
||||
where: pr.regimen_id == ^regimen.local_id and pr.farm_event_id == ^farm_event.local_id
|
||||
)
|
||||
|
||||
pr = Repo.one(q) || %PersistentRegimen{}
|
||||
pr = Repo.one(q) || %RegimenInstance{}
|
||||
|
||||
pr
|
||||
|> Repo.preload([:regimen, :farm_event])
|
||||
|> PersistentRegimen.changeset(params)
|
||||
|> RegimenInstance.changeset(params)
|
||||
|> Ecto.Changeset.put_assoc(:regimen, regimen)
|
||||
|> Ecto.Changeset.put_assoc(:farm_event, farm_event)
|
||||
|> Repo.insert_or_update!()
|
||||
end
|
||||
|
||||
def update_persistent_regimen!(%PersistentRegimen{} = pr, params \\ %{}) do
|
||||
def update_regimen_instance!(%RegimenInstance{} = pr, params \\ %{}) do
|
||||
pr
|
||||
|> PersistentRegimen.changeset(params)
|
||||
|> RegimenInstance.changeset(params)
|
||||
|> Repo.update!()
|
||||
end
|
||||
|
||||
## End PersistentRegimen
|
||||
## End RegimenInstance
|
||||
|
||||
## Begin PinBinding
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
defmodule FarmbotCore.Asset.PersistentRegimen do
|
||||
defmodule FarmbotCore.Asset.RegimenInstance do
|
||||
use Ecto.Schema
|
||||
import Ecto.Changeset
|
||||
@primary_key {:local_id, :binary_id, autogenerate: true}
|
||||
@timestamps_opts inserted_at: :created_at, type: :utc_datetime
|
||||
|
||||
schema "persistent_regimens" do
|
||||
schema "regimen_instances" do
|
||||
belongs_to(:regimen, FarmbotCore.Asset.Regimen, references: :local_id, type: :binary_id)
|
||||
belongs_to(:farm_event, FarmbotCore.Asset.FarmEvent, references: :local_id, type: :binary_id)
|
||||
field(:epoch, :utc_datetime)
|
||||
|
@ -16,8 +16,8 @@ defmodule FarmbotCore.Asset.PersistentRegimen do
|
|||
timestamps()
|
||||
end
|
||||
|
||||
def changeset(persistent_regimen, params \\ %{}) do
|
||||
persistent_regimen
|
||||
def changeset(regimen_instance, params \\ %{}) do
|
||||
regimen_instance
|
||||
|> cast(params, [:started_at, :next, :next_sequence_id, :monitor])
|
||||
|> put_epoch()
|
||||
|> cast_assoc(:regimen)
|
|
@ -12,7 +12,7 @@ defmodule FarmbotCore.Asset.Supervisor do
|
|||
FbosConfig,
|
||||
PinBinding,
|
||||
Peripheral,
|
||||
PersistentRegimen
|
||||
RegimenInstance
|
||||
}
|
||||
|
||||
def start_link(args) do
|
||||
|
@ -24,7 +24,7 @@ defmodule FarmbotCore.Asset.Supervisor do
|
|||
Repo,
|
||||
{AssetSupervisor, module: FbosConfig},
|
||||
{AssetSupervisor, module: Device},
|
||||
{AssetSupervisor, module: PersistentRegimen},
|
||||
{AssetSupervisor, module: RegimenInstance},
|
||||
{AssetSupervisor, module: FarmEvent},
|
||||
{AssetSupervisor, module: PinBinding},
|
||||
{AssetSupervisor, module: Peripheral},
|
||||
|
|
|
@ -15,7 +15,7 @@ defmodule FarmbotCore.AssetMonitor do
|
|||
FarmwareInstallation,
|
||||
FarmwareEnv,
|
||||
Peripheral,
|
||||
PersistentRegimen,
|
||||
RegimenInstance,
|
||||
PinBinding,
|
||||
}
|
||||
|
||||
|
@ -119,7 +119,7 @@ defmodule FarmbotCore.AssetMonitor do
|
|||
FbosConfig,
|
||||
FarmEvent,
|
||||
Peripheral,
|
||||
PersistentRegimen,
|
||||
RegimenInstance,
|
||||
PinBinding,
|
||||
FarmwareInstallation,
|
||||
FarmwareEnv
|
||||
|
|
|
@ -177,6 +177,6 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmEvent do
|
|||
|
||||
@doc false
|
||||
def handle_regimen(exe, event, params) do
|
||||
Asset.upsert_persistent_regimen!(exe, event, params)
|
||||
Asset.upsert_regimen_instance!(exe, event, params)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PersistentRegimen do
|
||||
defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do
|
||||
@moduledoc """
|
||||
An instance of a running Regimen. Asset.Regimen is the blueprint by which a
|
||||
Regimen "instance" is created.
|
||||
|
@ -9,8 +9,9 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PersistentRegimen do
|
|||
require FarmbotCore.Logger
|
||||
|
||||
alias FarmbotCore.Asset
|
||||
alias FarmbotCore.Asset.{PersistentRegimen, FarmEvent, Regimen}
|
||||
alias FarmbotCore.Asset.{RegimenInstance, FarmEvent, Regimen}
|
||||
alias FarmbotCeleryScript.{Scheduler, AST, Compiler}
|
||||
alias FarmbotCeleryScript.Scheduler
|
||||
|
||||
@checkup_time_ms Application.get_env(:farmbot_core, __MODULE__)[:checkup_time_ms]
|
||||
@checkup_time_ms ||
|
||||
|
@ -18,33 +19,33 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PersistentRegimen do
|
|||
config :farmbot_core, #{__MODULE__}, checkup_time_ms: 10_000
|
||||
""")
|
||||
|
||||
def preload(%PersistentRegimen{}), do: [:farm_event, :regimen]
|
||||
def preload(%RegimenInstance{}), do: [:farm_event, :regimen]
|
||||
|
||||
def start_link(persistent_regimen, args) do
|
||||
GenServer.start_link(__MODULE__, [persistent_regimen, args])
|
||||
def start_link(regimen_instance, args) do
|
||||
GenServer.start_link(__MODULE__, [regimen_instance, args])
|
||||
end
|
||||
|
||||
def init([persistent_regimen, args]) do
|
||||
def init([regimen_instance, args]) do
|
||||
apply_sequence = Keyword.get(args, :apply_sequence, &apply_sequence/2)
|
||||
unless is_function(apply_sequence, 2) do
|
||||
raise "PersistentRegimen Sequence handler should be a 2 arity function"
|
||||
raise "RegimenInstance Sequence handler should be a 2 arity function"
|
||||
end
|
||||
Process.put(:apply_sequence, apply_sequence)
|
||||
|
||||
with %Regimen{} <- persistent_regimen.regimen,
|
||||
%FarmEvent{} <- persistent_regimen.farm_event do
|
||||
{:ok, filter_items(persistent_regimen), 0}
|
||||
with %Regimen{} <- regimen_instance.regimen,
|
||||
%FarmEvent{} <- regimen_instance.farm_event do
|
||||
{:ok, filter_items(regimen_instance), 0}
|
||||
else
|
||||
_ -> {:stop, "Persistent Regimen not preloaded."}
|
||||
_ -> {:stop, "Regimen instance not preloaded."}
|
||||
end
|
||||
end
|
||||
|
||||
def handle_info(:timeout, %PersistentRegimen{next: nil} = pr) do
|
||||
persistent_regimen = filter_items(pr)
|
||||
calculate_next(persistent_regimen, 0)
|
||||
def handle_info(:timeout, %RegimenInstance{next: nil} = pr) do
|
||||
regimen_instance = filter_items(pr)
|
||||
calculate_next(regimen_instance, 0)
|
||||
end
|
||||
|
||||
def handle_info(:timeout, %PersistentRegimen{} = pr) do
|
||||
def handle_info(:timeout, %RegimenInstance{} = pr) do
|
||||
# Check if pr.next is around 2 minutes in the past
|
||||
# positive if the first date/time comes after the second.
|
||||
comp = Timex.diff(DateTime.utc_now(), pr.next, :minutes)
|
||||
|
@ -77,7 +78,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PersistentRegimen do
|
|||
params = %{next: next_dt, next_sequence_id: next.sequence_id}
|
||||
# TODO(Connor) - This causes the active GenServer to be
|
||||
# Restarted due to the `AssetMonitor`
|
||||
pr = Asset.update_persistent_regimen!(pr, params)
|
||||
pr = Asset.update_regimen_instance!(pr, params)
|
||||
|
||||
pr = %{
|
||||
pr
|
||||
|
@ -92,7 +93,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PersistentRegimen do
|
|||
{:noreply, pr, :hibernate}
|
||||
end
|
||||
|
||||
defp filter_items(%PersistentRegimen{regimen: %Regimen{} = reg} = pr) do
|
||||
defp filter_items(%RegimenInstance{regimen: %Regimen{} = reg} = pr) do
|
||||
items =
|
||||
reg.regimen_items
|
||||
|> Enum.sort(&(&1.time_offset <= &2.time_offset))
|
|
@ -1,4 +1,4 @@
|
|||
defmodule FarmbotCore.Asset.Repo.Migrations.CreatePersistentRegimensTable do
|
||||
defmodule FarmbotCore.Asset.Repo.Migrations.CreateRegimenInstancesTable do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
defmodule FarmbotCore.Asset.Repo.Migrations.RenamePersistentRegimensToRegimenInstances do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
rename(table(:persistent_regimens), to: table(:regimen_instances))
|
||||
end
|
||||
end
|
|
@ -3,8 +3,8 @@ defmodule FarmbotCore.AssetMonitorTest do
|
|||
alias FarmbotCore.{Asset.Repo, AssetMonitor, AssetSupervisor}
|
||||
import Farmbot.TestSupport.AssetFixtures
|
||||
|
||||
describe "persistent regimens" do
|
||||
test "adding a persistent regimen starts a process" do
|
||||
describe "regimen instances" do
|
||||
test "adding a regimen instance starts a process" do
|
||||
farm_event_params = %{
|
||||
start_time: DateTime.utc_now(),
|
||||
end_time: DateTime.utc_now(),
|
||||
|
@ -12,7 +12,7 @@ defmodule FarmbotCore.AssetMonitorTest do
|
|||
time_unit: "never"
|
||||
}
|
||||
|
||||
pr = persistent_regimen(%{}, farm_event_params, %{monitor: true})
|
||||
pr = regimen_instance(%{}, farm_event_params, %{monitor: true})
|
||||
|
||||
AssetMonitor.force_checkup()
|
||||
|
||||
|
|
|
@ -1,25 +1,25 @@
|
|||
defmodule FarmbotCore.AssetTest do
|
||||
use ExUnit.Case, async: true
|
||||
alias FarmbotCore.Asset.{Repo, Regimen, PersistentRegimen}
|
||||
alias FarmbotCore.Asset.{Repo, Regimen, RegimenInstance}
|
||||
alias FarmbotCore.Asset
|
||||
import Farmbot.TestSupport.AssetFixtures
|
||||
|
||||
describe "persistent regimens" do
|
||||
test "creates a persistent regimen" do
|
||||
describe "regimen instances" do
|
||||
test "creates a regimen instance" do
|
||||
seq = sequence()
|
||||
reg = regimen(%{regimen_items: [%{time_offset: 100, sequence_id: seq.id}]})
|
||||
event = regimen_event(reg)
|
||||
assert %PersistentRegimen{} = Asset.upsert_persistent_regimen!(reg, event)
|
||||
assert %RegimenInstance{} = Asset.upsert_regimen_instance!(reg, event)
|
||||
end
|
||||
|
||||
test "updates a persisten regimen" do
|
||||
seq = sequence()
|
||||
reg = regimen(%{name: "old", regimen_items: [%{time_offset: 100, sequence_id: seq.id}]})
|
||||
event = regimen_event(reg)
|
||||
pr = Asset.upsert_persistent_regimen!(reg, event)
|
||||
pr = Asset.upsert_regimen_instance!(reg, event)
|
||||
assert pr.regimen.name == "old"
|
||||
reg = Regimen.changeset(reg, %{name: "new"}) |> Repo.update!()
|
||||
pr = Asset.upsert_persistent_regimen!(reg, event)
|
||||
pr = Asset.upsert_regimen_instance!(reg, event)
|
||||
assert pr.regimen.name == "new"
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,7 +4,7 @@ defmodule FarmbotCore.FarmEventWorkerTest do
|
|||
|
||||
import Farmbot.TestSupport.AssetFixtures
|
||||
|
||||
# Regimen tests are in the PersistentRegimeWorker test
|
||||
# Regimen tests are in the RegimenInstanceWorker test
|
||||
|
||||
describe "sequences" do
|
||||
test "doesn't execute a sequence more than 2 mintues late" do
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
||||
defmodule FarmbotCore.RegimenInstanceWorkerTest do
|
||||
use ExUnit.Case, async: false
|
||||
|
||||
alias FarmbotCeleryScript.Scheduler
|
||||
|
||||
alias FarmbotCore.Asset.PersistentRegimen
|
||||
alias FarmbotCore.Asset.RegimenInstance
|
||||
|
||||
import Farmbot.TestSupport.AssetFixtures
|
||||
|
||||
|
@ -13,7 +13,7 @@ defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
|||
now = DateTime.utc_now()
|
||||
start_time = Timex.shift(now, minutes: -20)
|
||||
end_time = Timex.shift(now, minutes: 10)
|
||||
{:ok, epoch} = PersistentRegimen.build_epoch(now)
|
||||
{:ok, epoch} = RegimenInstance.build_epoch(now)
|
||||
offset = Timex.diff(now, epoch, :milliseconds) + 500
|
||||
|
||||
seq = sequence()
|
||||
|
@ -26,7 +26,7 @@ defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
|||
time_unit: "never"
|
||||
}
|
||||
|
||||
pr = persistent_regimen(regimen_params, farm_event_params)
|
||||
pr = regimen_instance(regimen_params, farm_event_params)
|
||||
|
||||
test_pid = self()
|
||||
|
||||
|
@ -36,7 +36,7 @@ defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
|||
end
|
||||
]
|
||||
|
||||
{:ok, _} = FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen.start_link(pr, args)
|
||||
{:ok, _} = FarmbotCore.AssetWorker.FarmbotCore.Asset.RegimenInstance.start_link(pr, args)
|
||||
assert_receive :executed
|
||||
end
|
||||
|
||||
|
@ -44,7 +44,7 @@ defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
|||
now = DateTime.utc_now()
|
||||
start_time = Timex.shift(now, minutes: -20)
|
||||
end_time = Timex.shift(now, minutes: 10)
|
||||
{:ok, epoch} = PersistentRegimen.build_epoch(now)
|
||||
{:ok, epoch} = RegimenInstance.build_epoch(now)
|
||||
offset = Timex.diff(now, epoch, :milliseconds) + 500
|
||||
|
||||
# Asset instances
|
||||
|
@ -161,7 +161,7 @@ defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
|||
# process instances
|
||||
# inject syscalls
|
||||
# inject celery_script scheduler
|
||||
# inject apply_sequence to PersistentRegimen
|
||||
# inject apply_sequence to RegimenInstance
|
||||
{:ok, shim} = TestSysCalls.checkout()
|
||||
that = self()
|
||||
|
||||
|
@ -181,9 +181,9 @@ defmodule FarmbotCore.PersistentRegimenWorkerTest do
|
|||
end)
|
||||
|
||||
{:ok, sch} = Scheduler.start_link([], [])
|
||||
pr = persistent_regimen(regimen_params, farm_event_params)
|
||||
pr = regimen_instance(regimen_params, farm_event_params)
|
||||
|
||||
{:ok, _} = FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen.start_link(pr, [])
|
||||
{:ok, _} = FarmbotCore.AssetWorker.FarmbotCore.Asset.RegimenInstance.start_link(pr, [])
|
||||
|
||||
expected_x = 9000
|
||||
expected_y = 9000
|
|
@ -1,7 +1,7 @@
|
|||
use Mix.Config
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmEvent, checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.RegimenInstance,
|
||||
checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, Elixir.FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding,
|
||||
|
|
|
@ -2,7 +2,7 @@ use Mix.Config
|
|||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmEvent, checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PersistentRegimen,
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.RegimenInstance,
|
||||
checkup_time_ms: 10_000
|
||||
|
||||
config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.Private.Enigma,
|
||||
|
|
|
@ -2,11 +2,11 @@ defmodule Farmbot.TestSupport.AssetFixtures do
|
|||
alias FarmbotCore.Asset
|
||||
alias FarmbotCore.Asset.{Repo, FarmEvent, FbosConfig, Regimen, Sequence, Private}
|
||||
|
||||
def persistent_regimen(regimen_params, farm_event_params, params \\ %{}) do
|
||||
def regimen_instance(regimen_params, farm_event_params, params \\ %{}) do
|
||||
regimen = regimen(regimen_params)
|
||||
farm_event = regimen_event(regimen, farm_event_params)
|
||||
params = Map.merge(%{id: :rand.uniform(10000), monitor: false}, params)
|
||||
Asset.upsert_persistent_regimen!(regimen, farm_event, params)
|
||||
Asset.upsert_regimen_instance!(regimen, farm_event, params)
|
||||
end
|
||||
|
||||
def fbos_config(params \\ %{}) do
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
defmodule Farmbot.TestSupport do
|
||||
alias FarmbotCore.AssetWorker.FarmbotCore.Asset.{FarmEvent, PersistentRegimen}
|
||||
alias FarmbotCore.AssetWorker.FarmbotCore.Asset.{FarmEvent, RegimenInstance}
|
||||
|
||||
def farm_event_timeout do
|
||||
Application.get_env(:farmbot_core, FarmEvent)[:checkup_time_ms]
|
||||
end
|
||||
|
||||
def persistent_regimen_timeout do
|
||||
Application.get_env(:farmbot_core, PersistentRegimen)[:checkup_time_ms]
|
||||
def regimen_instance_timeout do
|
||||
Application.get_env(:farmbot_core, RegimenInstance)[:checkup_time_ms]
|
||||
end
|
||||
|
||||
def asset_monitor_timeout do
|
||||
|
|
Loading…
Reference in New Issue