From c932de3bb1362bba1a17fe954b0fd58c26d483ad Mon Sep 17 00:00:00 2001 From: Zack Siri Date: Thu, 4 Jul 2024 12:16:55 +0700 Subject: [PATCH] Add instance wait times to cluster --- lib/polar/machines/cluster.ex | 4 ++++ lib/polar/machines/cluster/wait_time.ex | 18 ++++++++++++++++++ .../publish/testing/cluster_json.ex | 3 ++- ...3522_add_instance_wait_time_to_clusters.exs | 9 +++++++++ test/polar/machines/cluster/manager_test.exs | 8 +++++++- .../testing/cluster_controller_test.exs | 18 ++++++++++++++++-- 6 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 lib/polar/machines/cluster/wait_time.ex create mode 100644 priv/repo/migrations/20240704043522_add_instance_wait_time_to_clusters.exs diff --git a/lib/polar/machines/cluster.ex b/lib/polar/machines/cluster.ex index 5098d38..02edfeb 100644 --- a/lib/polar/machines/cluster.ex +++ b/lib/polar/machines/cluster.ex @@ -41,6 +41,8 @@ defmodule Polar.Machines.Cluster do field :credential_password_confirmation, :string, virtual: true field :credential, Polar.Encrypted.Map + embeds_many :instance_wait_times, __MODULE__.WaitTime, on_replace: :delete + timestamps(type: :utc_datetime_usec) end @@ -51,12 +53,14 @@ defmodule Polar.Machines.Cluster do |> validate_required(@required_attrs) |> validate_inclusion(:type, ["lxd", "incus"]) |> validate_inclusion(:arch, ["amd64", "arm64"]) + |> cast_embed(:instance_wait_times) |> process_credential() end def update_changeset(cluster, attrs) do cluster |> cast(attrs, [:credential_endpoint]) + |> cast_embed(:instance_wait_times) |> maybe_update_credential() end diff --git a/lib/polar/machines/cluster/wait_time.ex b/lib/polar/machines/cluster/wait_time.ex new file mode 100644 index 0000000..80eaaf5 --- /dev/null +++ b/lib/polar/machines/cluster/wait_time.ex @@ -0,0 +1,18 @@ +defmodule Polar.Machines.Cluster.WaitTime do + use Ecto.Schema + import Ecto.Changeset + + @derive Jason.Encoder + + @primary_key false + embedded_schema do + field :type, :string + field :duration, :integer + end + + def changeset(wait_time, params) do + wait_time + |> cast(params, [:type, :duration]) + |> validate_inclusion(:type, ["container", "vm"]) + end +end diff --git a/lib/polar_web/controllers/publish/testing/cluster_json.ex b/lib/polar_web/controllers/publish/testing/cluster_json.ex index 016d847..aa29e3a 100644 --- a/lib/polar_web/controllers/publish/testing/cluster_json.ex +++ b/lib/polar_web/controllers/publish/testing/cluster_json.ex @@ -13,7 +13,8 @@ defmodule PolarWeb.Publish.Testing.ClusterJSON do type: cluster.type, arch: cluster.arch, credential: cluster.credential, - current_state: cluster.current_state + current_state: cluster.current_state, + instance_wait_times: cluster.instance_wait_times } end end diff --git a/priv/repo/migrations/20240704043522_add_instance_wait_time_to_clusters.exs b/priv/repo/migrations/20240704043522_add_instance_wait_time_to_clusters.exs new file mode 100644 index 0000000..f25fe01 --- /dev/null +++ b/priv/repo/migrations/20240704043522_add_instance_wait_time_to_clusters.exs @@ -0,0 +1,9 @@ +defmodule Polar.Repo.Migrations.AddInstanceWaitTimeToClusters do + use Ecto.Migration + + def change do + alter table(:clusters) do + add :instance_wait_times, {:array, :map}, default: [] + end + end +end diff --git a/test/polar/machines/cluster/manager_test.exs b/test/polar/machines/cluster/manager_test.exs index 2ee82e5..24cd0bf 100644 --- a/test/polar/machines/cluster/manager_test.exs +++ b/test/polar/machines/cluster/manager_test.exs @@ -12,11 +12,17 @@ defmodule Polar.Machines.Cluster.ManagerTest do arch: "amd64", credential_endpoint: "some.cluster.com:8443", credential_password: "sometoken", - credential_password_confirmation: "sometoken" + credential_password_confirmation: "sometoken", + instance_wait_times: [ + %{type: "vm", duration: 10_000}, + %{type: "container", duration: 5_000} + ] }) assert %Machines.Cluster.Credential{private_key: _private_key, certificate: _certificate} = cluster.credential + + assert Enum.count(cluster.instance_wait_times) == 2 end end end diff --git a/test/polar_web/controllers/publish/testing/cluster_controller_test.exs b/test/polar_web/controllers/publish/testing/cluster_controller_test.exs index 58edc96..9c473eb 100644 --- a/test/polar_web/controllers/publish/testing/cluster_controller_test.exs +++ b/test/polar_web/controllers/publish/testing/cluster_controller_test.exs @@ -28,7 +28,11 @@ defmodule PolarWeb.Publish.Testing.ClusterControllerTest do arch: "amd64", credential_endpoint: "some.cluster.com:8443", credential_password: "sometoken", - credential_password_confirmation: "sometoken" + credential_password_confirmation: "sometoken", + instance_wait_times: [ + %{type: "vm", duration: 10_000}, + %{type: "container", duration: 5_000} + ] }) {:ok, _created_cluster} = @@ -38,7 +42,11 @@ defmodule PolarWeb.Publish.Testing.ClusterControllerTest do arch: "amd64", credential_endpoint: "some.cluster.com:8443", credential_password: "sometoken", - credential_password_confirmation: "sometoken" + credential_password_confirmation: "sometoken", + instance_wait_times: [ + %{type: "vm", duration: 10_000}, + %{type: "container", duration: 5_000} + ] }) {:ok, conn: conn, cluster: cluster, user: user} @@ -62,6 +70,12 @@ defmodule PolarWeb.Publish.Testing.ClusterControllerTest do assert %{"data" => data} = json_response(conn, 200) assert cluster.id in Enum.map(data, & &1["id"]) + + cluster = List.first(data) + + assert %{"instance_wait_times" => instance_wait_times} = cluster + + assert Enum.count(instance_wait_times) == 2 end end end