diff --git a/lib/polar/machines.ex b/lib/polar/machines.ex index 303fe5b..1e2ef74 100644 --- a/lib/polar/machines.ex +++ b/lib/polar/machines.ex @@ -21,7 +21,7 @@ defmodule Polar.Machines do alias __MODULE__.Assessment - defdelegate create_assessment(version, params), + defdelegate get_or_create_assessment(version, params), to: Assessment.Manager, - as: :create + as: :get_or_create end diff --git a/lib/polar/machines/assessment.ex b/lib/polar/machines/assessment.ex index aac62e8..a896bda 100644 --- a/lib/polar/machines/assessment.ex +++ b/lib/polar/machines/assessment.ex @@ -17,19 +17,19 @@ defmodule Polar.Machines.Assessment do @valid_attrs ~w( check_id cluster_id - machine_type + instance_type )a @required_attrs ~w( check_id cluster_id - machine_type + instance_type )a schema "assessments" do field :current_state, :string, default: "created" - field :machine_type, :string + field :instance_type, :string belongs_to :check, Check belongs_to :cluster, Cluster @@ -44,6 +44,6 @@ defmodule Polar.Machines.Assessment do assessment |> cast(attrs, @valid_attrs) |> validate_required(@required_attrs) - |> validate_inclusion(:machine_type, ["container", "vm"]) + |> validate_inclusion(:instance_type, ["container", "vm"]) end end diff --git a/lib/polar/machines/assessment/manager.ex b/lib/polar/machines/assessment/manager.ex index 621f840..e46e548 100644 --- a/lib/polar/machines/assessment/manager.ex +++ b/lib/polar/machines/assessment/manager.ex @@ -2,6 +2,25 @@ defmodule Polar.Machines.Assessment.Manager do alias Polar.Repo alias Polar.Machines.Assessment + def get_or_create(version, params) do + check_id = Map.get(params, "check_id") || params.check_id + instance_type = Map.get(params, "instance_type") || params.instance_type + + Assessment + |> Repo.get_by( + version_id: version.id, + check_id: check_id, + instance_type: instance_type + ) + |> case do + %Assessment{} = assessment -> + assessment + + nil -> + create(version, params) + end + end + def create(version, params) do %Assessment{version_id: version.id} |> Assessment.changeset(params) diff --git a/lib/polar_web/controllers/publish/testing/assessment_controller.ex b/lib/polar_web/controllers/publish/testing/assessment_controller.ex index 27694e1..2cb4738 100644 --- a/lib/polar_web/controllers/publish/testing/assessment_controller.ex +++ b/lib/polar_web/controllers/publish/testing/assessment_controller.ex @@ -11,7 +11,7 @@ defmodule PolarWeb.Publish.Testing.AssessmentController do "assessment" => assessment_params }) do with %Version{} = check <- Repo.get(Version, version_id), - {:ok, assessment} <- Machines.create_assessment(check, assessment_params) do + {:ok, assessment} <- Machines.get_or_create_assessment(check, assessment_params) do assessment = Repo.preload(assessment, [:check]) conn diff --git a/priv/repo/migrations/20240628092615_add_instance_type_to_assessments.exs b/priv/repo/migrations/20240628092615_add_instance_type_to_assessments.exs new file mode 100644 index 0000000..dada87b --- /dev/null +++ b/priv/repo/migrations/20240628092615_add_instance_type_to_assessments.exs @@ -0,0 +1,12 @@ +defmodule Polar.Repo.Migrations.AddInstanceTypeToAssessments do + use Ecto.Migration + + def change do + alter table(:assessments) do + add :instance_type, :string, null: false + end + + drop index(:assessments, [:check_id, :version_id], unique: true) + create index(:assessments, [:check_id, :version_id, :instance_type], unique: true) + end +end diff --git a/priv/repo/migrations/20240628092615_add_machine_type_to_assessments.exs b/priv/repo/migrations/20240628092615_add_machine_type_to_assessments.exs deleted file mode 100644 index d6690f2..0000000 --- a/priv/repo/migrations/20240628092615_add_machine_type_to_assessments.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule Polar.Repo.Migrations.AddMachineTypeToAssessments do - use Ecto.Migration - - def change do - alter table(:assessments) do - add :machine_type, :string, null: false - end - - drop index(:assessments, [:check_id, :version_id], unique: true) - create index(:assessments, [:check_id, :version_id, :machine_type], unique: true) - end -end diff --git a/test/polar/machines/assessment/manager_test.exs b/test/polar/machines/assessment/manager_test.exs index c6f872d..a38ed69 100644 --- a/test/polar/machines/assessment/manager_test.exs +++ b/test/polar/machines/assessment/manager_test.exs @@ -45,9 +45,10 @@ defmodule Polar.Machines.Assessment.ManagerTest do describe "create assessment" do test "successfully create assessment", %{check: check, cluster: cluster, version: version} do assert {:ok, assessment} = - Machines.create_assessment(version, %{ + Machines.get_or_create_assessment(version, %{ check_id: check.id, - cluster_id: cluster.id + cluster_id: cluster.id, + instance_type: "container" }) assert assessment.current_state == "created" diff --git a/test/polar/machines/assessment/transitions_test.exs b/test/polar/machines/assessment/transitions_test.exs index 8dc081f..830998f 100644 --- a/test/polar/machines/assessment/transitions_test.exs +++ b/test/polar/machines/assessment/transitions_test.exs @@ -43,9 +43,10 @@ defmodule Polar.Machines.Assessment.TransitionsTest do Streams.create_version(product, valid_version_attributes(2)) {:ok, assessment} = - Machines.create_assessment(version, %{ + Machines.get_or_create_assessment(version, %{ check_id: check.id, - cluster_id: cluster.id + cluster_id: cluster.id, + instance_type: "container" }) {:ok, assessment: assessment, user: user} diff --git a/test/polar_web/controllers/publish/event_controller_test.exs b/test/polar_web/controllers/publish/event_controller_test.exs index 8e1c440..3f17d83 100644 --- a/test/polar_web/controllers/publish/event_controller_test.exs +++ b/test/polar_web/controllers/publish/event_controller_test.exs @@ -68,7 +68,11 @@ defmodule PolarWeb.Publish.EventControllerTest do }) {:ok, assessment} = - Machines.create_assessment(version, %{check_id: check.id, cluster_id: cluster.id}) + Machines.get_or_create_assessment(version, %{ + check_id: check.id, + cluster_id: cluster.id, + instance_type: "container" + }) {:ok, assessment: assessment} end diff --git a/test/polar_web/controllers/publish/testing/assessment_controller_test.exs b/test/polar_web/controllers/publish/testing/assessment_controller_test.exs index eb412a8..cf9b304 100644 --- a/test/polar_web/controllers/publish/testing/assessment_controller_test.exs +++ b/test/polar_web/controllers/publish/testing/assessment_controller_test.exs @@ -69,7 +69,8 @@ defmodule PolarWeb.Publish.Testing.AssessmentControllerTest do post(conn, ~p"/publish/testing/versions/#{version.id}/assessments", %{ "assessment" => %{ "check_id" => check.id, - "cluster_id" => cluster.id + "cluster_id" => cluster.id, + "instance_type" => "container" } })