fix tests and better async results
This commit is contained in:
parent
707cb0d636
commit
78051bb796
6 changed files with 44 additions and 34 deletions
|
@ -15,11 +15,19 @@
|
||||||
v<%= Application.spec(:prymn, :vsn) %>
|
v<%= Application.spec(:prymn, :vsn) %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center border-r border-l border-zinc-300 text-zinc-900 hover:bg-white">
|
<div class="flex items-center text-zinc-900">
|
||||||
<.link class="px-3 py-4" href={~p"/users/settings"}>
|
<.link class="border-r border-l px-3 py-4 hover:bg-white" href={~p"/users/settings"}>
|
||||||
<.icon name="hero-user" />
|
<.icon name="hero-user" />
|
||||||
<.icon name="hero-chevron-down" />
|
<.icon name="hero-chevron-down" />
|
||||||
</.link>
|
</.link>
|
||||||
|
<.link
|
||||||
|
title="Log out"
|
||||||
|
class="border-r px-3 py-4 hover:bg-white"
|
||||||
|
method="DELETE"
|
||||||
|
href={~p"/auth/log_out"}
|
||||||
|
>
|
||||||
|
<.icon name="hero-x-mark" />
|
||||||
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
|
@ -18,46 +18,48 @@ defmodule PrymnWeb.SystemInfo do
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
%{result: unwrapped_info} = assigns.sys_info
|
|
||||||
assigns = assign(assigns, unwrapped_info: unwrapped_info)
|
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div>
|
<div class="flex justify-between space-x-4 rounded bg-gray-800 p-5 text-white">
|
||||||
<div :if={@sys_info.ok?} class="flex justify-between rounded bg-gray-800 p-5 text-white">
|
<.async_result :let={sys_info} assign={@sys_info}>
|
||||||
|
<:loading>
|
||||||
|
<div>
|
||||||
|
<.spinner class="h-5 w-5" />
|
||||||
|
<p class="text-xl">Loading system statistics...</p>
|
||||||
|
</div>
|
||||||
|
</:loading>
|
||||||
<div>
|
<div>
|
||||||
<p class="text-xl"><%= @unwrapped_info.uptime || "" %>s</p>
|
<p class="text-xl"><%= sys_info.uptime || "" %>s</p>
|
||||||
<p class="text-sm">Uptime</p>
|
<p class="text-sm">Uptime</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4">
|
<div>
|
||||||
<p class="text-xl"><%= Enum.count(@unwrapped_info.cpus || []) %></p>
|
<p class="text-xl"><%= Enum.count(sys_info.cpus || []) %></p>
|
||||||
<p class="text-sm">CPUs</p>
|
<p class="text-sm">CPUs</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4">
|
<div>
|
||||||
<p class="text-xl"><%= calculate_cpu_usage(@unwrapped_info.cpus) %></p>
|
<p class="text-xl"><%= calculate_cpu_usage(sys_info.cpus) %></p>
|
||||||
<p class="text-sm">CPU%</p>
|
<p class="text-sm">CPU%</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4">
|
<div>
|
||||||
<p class="text-xl">
|
<p class="text-xl">
|
||||||
<%= bytes_to_gigabytes(@unwrapped_info.mem_total_bytes - @unwrapped_info.mem_avail_bytes) %>
|
<%= bytes_to_gigabytes(sys_info.mem_total_bytes - sys_info.mem_avail_bytes) %>
|
||||||
<span>/</span>
|
<span>/</span>
|
||||||
<%= bytes_to_gigabytes(@unwrapped_info.mem_total_bytes) %>
|
<%= bytes_to_gigabytes(sys_info.mem_total_bytes) %>
|
||||||
<span>GiB</span>
|
<span>GiB</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="text-sm">Memory</p>
|
<p class="text-sm">Memory</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-4">
|
<div>
|
||||||
<p class="text-xl">
|
<p class="text-xl">
|
||||||
<%= calculate_disk_used_percent(@unwrapped_info.disks) %>
|
<%= calculate_disk_used_percent(sys_info.disks) %>
|
||||||
<span>%</span>
|
<span>%</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="text-sm">Used Disk</p>
|
<p class="text-sm">Used Disk</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</.async_result>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def handle_async(:get_sys_info, {:ok, {:ok, sys_info}}, socket) do
|
def handle_async(:get_sys_info, {:ok, {:ok, sys_info}}, socket) do
|
||||||
%{sys_info: sys_info_result, ip: host_address} = socket.assigns
|
%{sys_info: sys_info_result, ip: host_address} = socket.assigns
|
||||||
|
|
||||||
|
@ -81,8 +83,7 @@ defmodule PrymnWeb.SystemInfo do
|
||||||
|> assign(:sys_info, AsyncResult.failed(sys_info_result, grpc_error))}
|
|> assign(:sys_info, AsyncResult.failed(sys_info_result, grpc_error))}
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_async(:get_sys_info, {:exit, reason}, socket) do
|
def handle_async(:get_sys_info, {:exit, _reason}, socket) do
|
||||||
# dbg(reason)
|
|
||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -9,25 +9,30 @@ defmodule PrymnWeb.DashboardLive do
|
||||||
<h1 class="text-3xl font-bold leading-snug">Good morning, <%= @current_user.email %>!</h1>
|
<h1 class="text-3xl font-bold leading-snug">Good morning, <%= @current_user.email %>!</h1>
|
||||||
<h2 class="text-lg font-medium">Your overview</h2>
|
<h2 class="text-lg font-medium">Your overview</h2>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex flex-wrap justify-around gap-2">
|
||||||
<div class="flex gap-2">
|
<div class="basis-4/12 rounded-lg p-3 shadow-md">
|
||||||
<div class="basis-6/12 rounded-lg p-3 shadow-md">
|
<span class="text-7xl font-medium">0</span>
|
||||||
|
<h2 class="mt-5 font-medium leading-snug text-gray-600">Projects</h2>
|
||||||
|
<.link class="text-sm text-blue-600">
|
||||||
|
<.icon class="h-3 w-4" name="hero-arrow-right" /> Manage your projects
|
||||||
|
</.link>
|
||||||
|
</div>
|
||||||
|
<div class="basis-4/12 rounded-lg p-3 shadow-md">
|
||||||
<span class="text-7xl font-medium">0</span>
|
<span class="text-7xl font-medium">0</span>
|
||||||
<h2 class="mt-5 font-medium leading-snug text-gray-600">Total Servers</h2>
|
<h2 class="mt-5 font-medium leading-snug text-gray-600">Total Servers</h2>
|
||||||
<.link class="text-sm text-blue-600" navigate={~p"/servers"}>
|
<.link class="text-sm text-blue-600" navigate={~p"/servers"}>
|
||||||
<.icon class="h-3 w-4" name="hero-arrow-right" /> View your servers
|
<.icon class="h-3 w-4" name="hero-arrow-right" /> View your servers
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
<div class="basis-6/12 rounded-lg p-3 shadow-md">
|
<div class="basis-3/12 rounded-lg p-3 shadow-md">
|
||||||
<span class="text-7xl font-medium">0</span>
|
<span class="text-7xl font-medium">0</span>
|
||||||
<h2 class="mt-5 font-medium leading-snug text-gray-600">Apps</h2>
|
<h2 class="mt-5 font-medium leading-snug text-gray-600">Apps</h2>
|
||||||
<.link class="text-sm text-blue-600">
|
<.link class="text-sm text-blue-600" navigate={~p"/apps"}>
|
||||||
<.icon class="h-3 w-4" name="hero-arrow-right" /> View your apps
|
<.icon class="h-3 w-4" name="hero-arrow-right" /> View your apps
|
||||||
</.link>
|
</.link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mx-auto mt-7 max-w-6xl">
|
<div class="mx-auto mt-7 max-w-6xl">
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<div class="space-x-6 text-sm text-blue-600">
|
<div class="space-x-6 text-sm text-blue-600">
|
||||||
|
|
|
@ -31,6 +31,7 @@ defmodule PrymnWeb.ServerLive.Show do
|
||||||
|> assign(:registration_command, Servers.create_setup_command(server))}
|
|> assign(:registration_command, Servers.create_setup_command(server))}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
def handle_info(%PrymnProto.Prymn.SysUpdateResponse{} = response, socket) do
|
def handle_info(%PrymnProto.Prymn.SysUpdateResponse{} = response, socket) do
|
||||||
output = String.split(response.output, "\n")
|
output = String.split(response.output, "\n")
|
||||||
socket = assign(socket, :update_output, output)
|
socket = assign(socket, :update_output, output)
|
||||||
|
|
|
@ -39,12 +39,6 @@ defmodule PrymnWeb.UserRegistrationLiveTest do
|
||||||
conn = follow_trigger_action(form, conn)
|
conn = follow_trigger_action(form, conn)
|
||||||
|
|
||||||
assert redirected_to(conn) == ~p"/"
|
assert redirected_to(conn) == ~p"/"
|
||||||
|
|
||||||
# Now do a logged in request and assert on the menu
|
|
||||||
conn = get(conn, "/")
|
|
||||||
response = html_response(conn, 200)
|
|
||||||
assert response =~ email
|
|
||||||
assert response =~ "Welcome"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "renders errors for duplicated email", %{conn: conn} do
|
test "renders errors for duplicated email", %{conn: conn} do
|
||||||
|
|
3
mix.exs
3
mix.exs
|
@ -9,6 +9,7 @@ defmodule Prymn.MixProject do
|
||||||
compilers: [:proto | Mix.compilers()],
|
compilers: [:proto | Mix.compilers()],
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
config_path: Path.expand("app/config/config.exs", __DIR__),
|
config_path: Path.expand("app/config/config.exs", __DIR__),
|
||||||
|
test_paths: ["app/test"],
|
||||||
start_permanent: Mix.env() == :prod,
|
start_permanent: Mix.env() == :prod,
|
||||||
aliases: aliases(),
|
aliases: aliases(),
|
||||||
deps: deps()
|
deps: deps()
|
||||||
|
@ -64,7 +65,7 @@ defmodule Prymn.MixProject do
|
||||||
{:tailwind_formatter, "~> 0.3.6", runtime: Mix.env() == :dev},
|
{:tailwind_formatter, "~> 0.3.6", runtime: Mix.env() == :dev},
|
||||||
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
||||||
{:dialyxir, "~> 1.4", only: [:dev], runtime: false},
|
{:dialyxir, "~> 1.4", only: [:dev], runtime: false},
|
||||||
{:prymn_proto_compiler, path: "./proto_compiler", only: :dev, runtime: false}
|
{:prymn_proto_compiler, path: "proto_compiler", runtime: false}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue