Deployment and lifecycle management for Nix
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

sower: initial deployments view

+324
+5
apps/sower/lib/sower/orchestration.ex
··· 343 343 """ 344 344 def get_deployment!(id), do: Repo.get!(Deployment, id) 345 345 346 + def get_deployment_sid!(sid) do 347 + Deployment 348 + |> Repo.get_by!(sid: sid) 349 + end 350 + 346 351 def get_deployment_sid(sid) do 347 352 Deployment 348 353 |> Repo.get_by(sid: sid)
+95
apps/sower/lib/sower_web/live/deployment_live/form.ex
··· 1 + defmodule SowerWeb.DeploymentLive.Form do 2 + use SowerWeb, :live_view 3 + 4 + alias Sower.Orchestration 5 + alias Sower.Orchestration.Deployment 6 + 7 + @impl true 8 + def render(assigns) do 9 + ~H""" 10 + <Layouts.app flash={@flash}> 11 + <.header> 12 + {@page_title} 13 + <:subtitle>Use this form to manage deployment records in your database.</:subtitle> 14 + </.header> 15 + 16 + <.form for={@form} id="deployment-form" phx-change="validate" phx-submit="save"> 17 + <.input field={@form[:seed_name]} type="text" label="Seed name" /> 18 + <.input field={@form[:seed_type]} type="text" label="Seed type" /> 19 + <footer> 20 + <.button phx-disable-with="Saving..." variant="primary">Save Deployment</.button> 21 + <.button navigate={return_path(@return_to, @deployment)}>Cancel</.button> 22 + </footer> 23 + </.form> 24 + </Layouts.app> 25 + """ 26 + end 27 + 28 + @impl true 29 + def mount(params, _session, socket) do 30 + {:ok, 31 + socket 32 + |> assign(:return_to, return_to(params["return_to"])) 33 + |> apply_action(socket.assigns.live_action, params)} 34 + end 35 + 36 + defp return_to("show"), do: "show" 37 + defp return_to(_), do: "index" 38 + 39 + defp apply_action(socket, :edit, %{"id" => id}) do 40 + deployment = Orchestration.get_deployment!(id) 41 + 42 + socket 43 + |> assign(:page_title, "Edit Deployment") 44 + |> assign(:deployment, deployment) 45 + |> assign(:form, to_form(Orchestration.change_deployment(deployment))) 46 + end 47 + 48 + defp apply_action(socket, :new, _params) do 49 + deployment = %Deployment{} 50 + 51 + socket 52 + |> assign(:page_title, "New Deployment") 53 + |> assign(:deployment, deployment) 54 + |> assign(:form, to_form(Orchestration.change_deployment(deployment))) 55 + end 56 + 57 + @impl true 58 + def handle_event("validate", %{"deployment" => deployment_params}, socket) do 59 + changeset = Orchestration.change_deployment(socket.assigns.deployment, deployment_params) 60 + {:noreply, assign(socket, form: to_form(changeset, action: :validate))} 61 + end 62 + 63 + def handle_event("save", %{"deployment" => deployment_params}, socket) do 64 + save_deployment(socket, socket.assigns.live_action, deployment_params) 65 + end 66 + 67 + defp save_deployment(socket, :edit, deployment_params) do 68 + case Orchestration.update_deployment(socket.assigns.deployment, deployment_params) do 69 + {:ok, deployment} -> 70 + {:noreply, 71 + socket 72 + |> put_flash(:info, "Deployment updated successfully") 73 + |> push_navigate(to: return_path(socket.assigns.return_to, deployment))} 74 + 75 + {:error, %Ecto.Changeset{} = changeset} -> 76 + {:noreply, assign(socket, form: to_form(changeset))} 77 + end 78 + end 79 + 80 + defp save_deployment(socket, :new, deployment_params) do 81 + case Orchestration.create_deployment(deployment_params) do 82 + {:ok, deployment} -> 83 + {:noreply, 84 + socket 85 + |> put_flash(:info, "Deployment created successfully") 86 + |> push_navigate(to: return_path(socket.assigns.return_to, deployment))} 87 + 88 + {:error, %Ecto.Changeset{} = changeset} -> 89 + {:noreply, assign(socket, form: to_form(changeset))} 90 + end 91 + end 92 + 93 + defp return_path("index", _deployment), do: ~p"/deployments" 94 + defp return_path("show", deployment), do: ~p"/deployments/#{deployment}" 95 + end
+60
apps/sower/lib/sower_web/live/deployment_live/index.ex
··· 1 + defmodule SowerWeb.DeploymentLive.Index do 2 + use SowerWeb, :live_view 3 + 4 + alias Sower.Orchestration 5 + alias SowerWeb.Layouts 6 + 7 + @impl true 8 + def render(assigns) do 9 + ~H""" 10 + <Layouts.app flash={@flash}> 11 + <.header> 12 + Listing Deployments 13 + <:actions> 14 + <.button variant="primary" navigate={~p"/deployments/new"}> 15 + <.icon name="hero-plus" /> New Deployment 16 + </.button> 17 + </:actions> 18 + </.header> 19 + 20 + <.table 21 + id="deployments" 22 + rows={@streams.deployments} 23 + row_click={fn {_id, deployment} -> JS.navigate(~p"/deployments/#{deployment}") end} 24 + > 25 + <:col :let={{_id, deployment}} label="Seed type">{deployment.sid}</:col> 26 + <:action :let={{_id, deployment}}> 27 + <div class="sr-only"> 28 + <.link navigate={~p"/deployments/#{deployment}"}>Show</.link> 29 + </div> 30 + <.link navigate={~p"/deployments/#{deployment}/edit"}>Edit</.link> 31 + </:action> 32 + <:action :let={{id, deployment}}> 33 + <.link 34 + phx-click={JS.push("delete", value: %{id: deployment.id}) |> hide("##{id}")} 35 + data-confirm="Are you sure?" 36 + > 37 + Delete 38 + </.link> 39 + </:action> 40 + </.table> 41 + </Layouts.app> 42 + """ 43 + end 44 + 45 + @impl true 46 + def mount(_params, _session, socket) do 47 + {:ok, 48 + socket 49 + |> assign(:page_title, "Listing Deployments") 50 + |> stream(:deployments, Orchestration.list_deployments())} 51 + end 52 + 53 + @impl true 54 + def handle_event("delete", %{"id" => id}, socket) do 55 + deployment = Orchestration.get_deployment!(id) 56 + {:ok, _} = Orchestration.delete_deployment(deployment) 57 + 58 + {:noreply, stream_delete(socket, :deployments, deployment)} 59 + end 60 + end
+37
apps/sower/lib/sower_web/live/deployment_live/show.ex
··· 1 + defmodule SowerWeb.DeploymentLive.Show do 2 + use SowerWeb, :live_view 3 + 4 + alias Sower.Orchestration 5 + 6 + @impl true 7 + def render(assigns) do 8 + ~H""" 9 + <Layouts.app flash={@flash}> 10 + <.header> 11 + Deployment {@deployment.id} 12 + <:subtitle>This is a deployment record from your database.</:subtitle> 13 + <:actions> 14 + <.button navigate={~p"/deployments"}> 15 + <.icon name="hero-arrow-left" /> 16 + </.button> 17 + <.button variant="primary" navigate={~p"/deployments/#{@deployment}/edit?return_to=show"}> 18 + <.icon name="hero-pencil-square" /> Edit deployment 19 + </.button> 20 + </:actions> 21 + </.header> 22 + 23 + <.list> 24 + <:item title="sid">{@deployment.sid}</:item> 25 + </.list> 26 + </Layouts.app> 27 + """ 28 + end 29 + 30 + @impl true 31 + def mount(%{"sid" => sid}, _session, socket) do 32 + {:ok, 33 + socket 34 + |> assign(:page_title, "Show Deployment") 35 + |> assign(:deployment, Orchestration.get_deployment_sid!(sid))} 36 + end 37 + end
+5
apps/sower/lib/sower_web/router.ex
··· 47 47 live "/agents/:sid", AgentLive.Show, :show 48 48 live "/agents/:sid/show/edit", AgentLive.Show, :edit 49 49 50 + live "/deployments", DeploymentLive.Index, :index 51 + live "/deployments/new", DeploymentLive.Form, :new 52 + live "/deployments/:sid", DeploymentLive.Show, :show 53 + live "/deployments/:sid/edit", DeploymentLive.Form, :edit 54 + 50 55 get "/forges/:sid/login", Forge.OauthController, :login 51 56 get "/forges/oauth/callback", Forge.OauthController, :callback 52 57
+122
apps/sower/test/sower_web/live/deployment_live_test.exs
··· 1 + defmodule SowerWeb.DeploymentLiveTest do 2 + use SowerWeb.ConnCase 3 + 4 + import Phoenix.LiveViewTest 5 + import Sower.OrchestrationFixtures 6 + 7 + @create_attrs %{seed_name: "some seed_name", seed_type: "some seed_type"} 8 + @update_attrs %{seed_name: "some updated seed_name", seed_type: "some updated seed_type"} 9 + @invalid_attrs %{seed_name: nil, seed_type: nil} 10 + defp create_deployment(_) do 11 + deployment = deployment_fixture() 12 + 13 + %{deployment: deployment} 14 + end 15 + 16 + describe "Index" do 17 + setup [:create_deployment] 18 + 19 + test "lists all deployments", %{conn: conn, deployment: deployment} do 20 + {:ok, _index_live, html} = live(conn, ~p"/deployments") 21 + 22 + assert html =~ "Listing Deployments" 23 + assert html =~ deployment.seed_name 24 + end 25 + 26 + test "saves new deployment", %{conn: conn} do 27 + {:ok, index_live, _html} = live(conn, ~p"/deployments") 28 + 29 + assert {:ok, form_live, _} = 30 + index_live 31 + |> element("a", "New Deployment") 32 + |> render_click() 33 + |> follow_redirect(conn, ~p"/deployments/new") 34 + 35 + assert render(form_live) =~ "New Deployment" 36 + 37 + assert form_live 38 + |> form("#deployment-form", deployment: @invalid_attrs) 39 + |> render_change() =~ "can&#39;t be blank" 40 + 41 + assert {:ok, index_live, _html} = 42 + form_live 43 + |> form("#deployment-form", deployment: @create_attrs) 44 + |> render_submit() 45 + |> follow_redirect(conn, ~p"/deployments") 46 + 47 + html = render(index_live) 48 + assert html =~ "Deployment created successfully" 49 + assert html =~ "some seed_name" 50 + end 51 + 52 + test "updates deployment in listing", %{conn: conn, deployment: deployment} do 53 + {:ok, index_live, _html} = live(conn, ~p"/deployments") 54 + 55 + assert {:ok, form_live, _html} = 56 + index_live 57 + |> element("#deployments-#{deployment.id} a", "Edit") 58 + |> render_click() 59 + |> follow_redirect(conn, ~p"/deployments/#{deployment}/edit") 60 + 61 + assert render(form_live) =~ "Edit Deployment" 62 + 63 + assert form_live 64 + |> form("#deployment-form", deployment: @invalid_attrs) 65 + |> render_change() =~ "can&#39;t be blank" 66 + 67 + assert {:ok, index_live, _html} = 68 + form_live 69 + |> form("#deployment-form", deployment: @update_attrs) 70 + |> render_submit() 71 + |> follow_redirect(conn, ~p"/deployments") 72 + 73 + html = render(index_live) 74 + assert html =~ "Deployment updated successfully" 75 + assert html =~ "some updated seed_name" 76 + end 77 + 78 + test "deletes deployment in listing", %{conn: conn, deployment: deployment} do 79 + {:ok, index_live, _html} = live(conn, ~p"/deployments") 80 + 81 + assert index_live |> element("#deployments-#{deployment.id} a", "Delete") |> render_click() 82 + refute has_element?(index_live, "#deployments-#{deployment.id}") 83 + end 84 + end 85 + 86 + describe "Show" do 87 + setup [:create_deployment] 88 + 89 + test "displays deployment", %{conn: conn, deployment: deployment} do 90 + {:ok, _show_live, html} = live(conn, ~p"/deployments/#{deployment}") 91 + 92 + assert html =~ "Show Deployment" 93 + assert html =~ deployment.seed_name 94 + end 95 + 96 + test "updates deployment and returns to show", %{conn: conn, deployment: deployment} do 97 + {:ok, show_live, _html} = live(conn, ~p"/deployments/#{deployment}") 98 + 99 + assert {:ok, form_live, _} = 100 + show_live 101 + |> element("a", "Edit") 102 + |> render_click() 103 + |> follow_redirect(conn, ~p"/deployments/#{deployment}/edit?return_to=show") 104 + 105 + assert render(form_live) =~ "Edit Deployment" 106 + 107 + assert form_live 108 + |> form("#deployment-form", deployment: @invalid_attrs) 109 + |> render_change() =~ "can&#39;t be blank" 110 + 111 + assert {:ok, show_live, _html} = 112 + form_live 113 + |> form("#deployment-form", deployment: @update_attrs) 114 + |> render_submit() 115 + |> follow_redirect(conn, ~p"/deployments/#{deployment}") 116 + 117 + html = render(show_live) 118 + assert html =~ "Deployment updated successfully" 119 + assert html =~ "some updated seed_name" 120 + end 121 + end 122 + end