PersistentRegimen => RegimenInstance

pull/974/head
Rick Carlino 2019-03-26 16:48:05 -05:00 committed by Connor Rigby
parent 295cb45d49
commit 399ddf50c8
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
19 changed files with 73 additions and 65 deletions

View File

@ -9,7 +9,7 @@ alias FarmbotCore.Asset.{
FirmwareConfig,
PinBinding,
Regimen,
PersistentRegimen,
RegimenInstance,
Sequence
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
defmodule FarmbotCore.Asset.Repo.Migrations.CreatePersistentRegimensTable do
defmodule FarmbotCore.Asset.Repo.Migrations.CreateRegimenInstancesTable do
use Ecto.Migration
def change do

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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