Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/endpoint update for icepak integration #11

Merged
merged 7 commits into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/polar/machines.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 5 additions & 0 deletions lib/polar/machines/assessment.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,20 @@ defmodule Polar.Machines.Assessment do
@valid_attrs ~w(
check_id
cluster_id
instance_type
)a

@required_attrs ~w(
check_id
cluster_id
instance_type
)a

schema "assessments" do
field :current_state, :string, default: "created"

field :instance_type, :string

belongs_to :check, Check
belongs_to :cluster, Cluster

Expand All @@ -40,5 +44,6 @@ defmodule Polar.Machines.Assessment do
assessment
|> cast(attrs, @valid_attrs)
|> validate_required(@required_attrs)
|> validate_inclusion(:instance_type, ["container", "vm"])
end
end
19 changes: 19 additions & 0 deletions lib/polar/machines/assessment/manager.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions lib/polar/machines/assessment/transitions.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ defmodule Polar.Machines.Assessment.Transitions do
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "failed", to: "running", via: "run"],
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "running", to: "running", via: "run"],
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "running", to: "passed", via: "pass"],
Expand Down
6 changes: 6 additions & 0 deletions lib/polar/streams/version/transitions.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ defmodule Polar.Streams.Version.Transitions do
fn changes -> transit(changes) end
)

Version
|> transition(
[from: "inactive", to: "testing", via: "test"],
fn changes -> transit(changes) end
)

Version
|> transition(
[from: "testing", to: "inactive", via: "deactivate"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,21 @@ defmodule PolarWeb.Publish.Testing.AssessmentController do

alias Polar.Streams.Version

alias PolarWeb.Params.Assessment

action_fallback PolarWeb.FallbackController

def create(conn, %{
"version_id" => version_id,
"assessment" => assessment_params
}) do
with %Version{} = check <- Repo.get(Version, version_id),
{:ok, assessment} <- Machines.create_assessment(check, assessment_params) do
{:ok, assessment_params} <- Assessment.parse(assessment_params),
{:ok, assessment} <-
Machines.get_or_create_assessment(check, Map.from_struct(assessment_params)) do
assessment = Repo.preload(assessment, [:check])

conn
|> put_status(:created)
|> render(:create, %{assessment: assessment})
end
end
Expand Down
2 changes: 2 additions & 0 deletions lib/polar_web/controllers/publish/testing/check_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ defmodule PolarWeb.Publish.Testing.CheckController do

alias Polar.Machines

action_fallback PolarWeb.FallbackController

def index(conn, _params) do
checks = Machines.list_checks()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ defmodule PolarWeb.Publish.Testing.ClusterController do

alias Polar.Machines

action_fallback PolarWeb.FallbackController

def index(conn, _params) do
clusters = Machines.list_clusters(:for_testing)

Expand Down
2 changes: 2 additions & 0 deletions lib/polar_web/controllers/publish/testing/cluster_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ defmodule PolarWeb.Publish.Testing.ClusterJSON do
def data(%Cluster{} = cluster) do
%{
id: cluster.id,
type: cluster.type,
arch: cluster.arch,
credential: cluster.credential,
current_state: cluster.current_state
}
Expand Down
9 changes: 9 additions & 0 deletions lib/polar_web/controllers/publish/version_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ defmodule PolarWeb.Publish.VersionController do
alias Polar.Repo
alias Polar.Streams
alias Polar.Streams.Product
alias Polar.Streams.Version

action_fallback PolarWeb.FallbackController

def show(conn, %{"product_id" => product_id, "id" => serial}) do
version = Repo.get_by(Version, product_id: product_id, serial: serial)

if version do
render(conn, :show, %{version: version})
end
end

def create(conn, %{"product_id" => product_id, "version" => version_params}) do
product = Repo.get(Product, product_id)

Expand Down
4 changes: 4 additions & 0 deletions lib/polar_web/controllers/publish/version_json.ex
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
defmodule PolarWeb.Publish.VersionJSON do
def show(%{version: version}) do
%{data: %{id: version.id}}
end

def create(%{version: version}) do
%{data: %{id: version.id}}
end
Expand Down
29 changes: 29 additions & 0 deletions lib/polar_web/params/assessment.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
defmodule PolarWeb.Params.Assessment do
use Ecto.Schema
import Ecto.Changeset

@required_attrs ~w(
check_id
cluster_id
instance_type
)a

@primary_key false
embedded_schema do
field :check_id, :integer
field :cluster_id, :integer
field :instance_type, :string
end

def parse(params) do
%__MODULE__{}
|> changeset(params)
|> apply_action(:insert)
end

def changeset(assessment, params) do
assessment
|> cast(params, @required_attrs)
|> validate_required(@required_attrs)
end
end
2 changes: 1 addition & 1 deletion lib/polar_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ defmodule PolarWeb.Router do
resources "/storage", StorageController, only: [:show], singleton: true

resources "/products", ProductController, only: [:show] do
resources "/versions", VersionController, only: [:create]
resources "/versions", VersionController, only: [:show, :create]
end

resources "/versions/:version_id/events", EventController, only: [:create]
Expand Down
Original file line number Diff line number Diff line change
@@ -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
5 changes: 3 additions & 2 deletions test/polar/machines/assessment/manager_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
5 changes: 3 additions & 2 deletions test/polar/machines/assessment/transitions_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
6 changes: 5 additions & 1 deletion test/polar_web/controllers/publish/event_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,31 @@ 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"
}
})

assert %{"data" => data} = json_response(conn, 201)
assert %{"data" => data} = json_response(conn, 200)

assert %{"id" => _id, "current_state" => "created", "check" => _check} = data
end

test "invalid parameter passed in", %{
version: version,
conn: conn,
check: check,
cluster: cluster
} do
conn =
post(conn, ~p"/publish/testing/versions/#{version.id}/assessments", %{
"assessment" => %{
"check_id" => check.id,
"cluster_id" => cluster.id
}
})

assert %{"errors" => _errors} = json_response(conn, 422)
end
end
end
23 changes: 23 additions & 0 deletions test/polar_web/controllers/publish/version_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ defmodule PolarWeb.Publish.VersionControllerTest do
alias Polar.Accounts
alias Polar.Streams

import Polar.StreamsFixtures

setup do
password = Accounts.generate_automation_password()

Expand All @@ -25,6 +27,27 @@ defmodule PolarWeb.Publish.VersionControllerTest do
{:ok, conn: conn}
end

describe "GET /publish/products/:product_id/versions/:id" do
setup do
product_attributes = valid_product_attributes("alpine:3.19:amd64:default")

{:ok, product} = Streams.create_product(product_attributes)

{:ok, version} =
Streams.create_version(product, valid_version_attributes(2))

{:ok, product: product, version: version}
end

test "can fetch existing version", %{conn: conn, product: product, version: version} do
conn = get(conn, "/publish/products/#{product.id}/versions/#{version.serial}")

assert %{"data" => data} = json_response(conn, 200)

assert %{"id" => _id} = data
end
end

describe "POST /publish/products/:product_id/versions" do
setup do
product_attributes = valid_product_attributes("alpine:3.19:amd64:default")
Expand Down