Skip to content

Commit

Permalink
Merge pull request #11 from upmaru/feature/endpoint-update-for-icepak…
Browse files Browse the repository at this point in the history
…-integration

Feature/endpoint update for icepak integration
  • Loading branch information
zacksiri committed Jul 2, 2024
2 parents 9f0b547 + 9980b74 commit 5426213
Show file tree
Hide file tree
Showing 19 changed files with 166 additions and 12 deletions.
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

0 comments on commit 5426213

Please sign in to comment.