Skip to content

Commit

Permalink
feat(containers): deployer state machine
Browse files Browse the repository at this point in the history
The deployment of a release on a device is handled trough a state
machine, responsible for creating the cache resources and running the
ready actions once all the nested resources are available

Moving the delpoyment loginc into a `GenStateMachine`.
- States for deploying the resources named as `:deploy_{resource}`
- Uses pubsub to update the deployment status when a message with a
  relevant resource as topic is published.

Signed-off-by: Luca Zaninotto <luca.zaninotto@secomind.com>
  • Loading branch information
lusergit committed Feb 18, 2025
1 parent 1a4d842 commit d0dbd1b
Show file tree
Hide file tree
Showing 14 changed files with 703 additions and 371 deletions.
2 changes: 2 additions & 0 deletions backend/lib/edgehog/application.ex
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ defmodule Edgehog.Application do
{Finch, name: EdgehogFinch},
# Start the UpdateCampaigns supervisor
Edgehog.UpdateCampaigns.Supervisor,
# Start the Deployer supervisor
Edgehog.Containers.Deployment.Supervisor,
# Start the Tenant Reconciler Supervisor
{Edgehog.Tenants.Reconciler.Supervisor, tenant_to_trigger_url_fun: tenant_to_trigger_url_fun},
# Start the Endpoint (http/https)
Expand Down
13 changes: 9 additions & 4 deletions backend/lib/edgehog/containers/containers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,11 @@ defmodule Edgehog.Containers do

resource Edgehog.Containers.Deployment do
define :deploy, action: :deploy, args: [:release_id, :device_id]
define :send_deploy_request, action: :send_deploy_request, args: [:deployment]
# define :send_deploy_request, action: :send_deploy_request, args: [:deployment]
define :fetch_deployment, action: :read, get_by: [:id]
define :fetch_deployment_by_identity, action: :read, get_by_identity: :release_instance
define :delete_deployment, action: :destroy
define :deployment_update_resources_state, action: :update_resources_state
# define :deployment_update_resources_state, action: :update_resources_state
define :deployments_with_release, action: :filter_by_release, args: [:release_id]
define :run_ready_actions, action: :run_ready_actions

Expand Down Expand Up @@ -150,7 +151,9 @@ defmodule Edgehog.Containers do
args: [:container_id]
end

resource Edgehog.Containers.Network
resource Edgehog.Containers.Network do
define :fetch_network, action: :read, get_by: [:id]
end

resource Edgehog.Containers.Network.Deployment do
define :deploy_network, action: :deploy, args: [:network, :device]
Expand All @@ -161,7 +164,9 @@ defmodule Edgehog.Containers do
define :mark_network_deployment_as_errored, action: :mark_as_errored, args: [:message]
end

resource Edgehog.Containers.Volume
resource Edgehog.Containers.Volume do
define :fetch_volume, action: :read, get_by: [:id]
end

resource Edgehog.Containers.Volume.Deployment do
define :deploy_volume, action: :deploy, args: [:volume, :device]
Expand Down
21 changes: 1 addition & 20 deletions backend/lib/edgehog/containers/deployment.ex
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ defmodule Edgehog.Containers.Deployment do

change manage_relationship(:device_id, :device, type: :append)

change Changes.CreateDeploymentOnDevice
change Changes.StartDeployer
end

update :start do
Expand Down Expand Up @@ -92,15 +92,6 @@ defmodule Edgehog.Containers.Deployment do
manual ManualActions.RunReadyActions
end

action :send_deploy_request do
argument :deployment, :struct do
constraints instance_of: __MODULE__
allow_nil? false
end

run ManualActions.SendDeployRequest
end

update :upgrade_release do
argument :target, :uuid do
allow_nil? false
Expand Down Expand Up @@ -149,16 +140,6 @@ defmodule Edgehog.Containers.Deployment do
change set_attribute(:state, :deleting)
end

update :update_resources_state do
change Changes.CheckImages
change Changes.CheckNetworks
change Changes.CheckVolumes
change Changes.CheckContainers
change Changes.CheckDeployment

require_atomic? false
end

read :filter_by_release do
argument :release_id, :uuid

Expand Down

This file was deleted.

This file was deleted.

52 changes: 0 additions & 52 deletions backend/lib/edgehog/containers/deployment/changes/check_images.ex

This file was deleted.

This file was deleted.

55 changes: 0 additions & 55 deletions backend/lib/edgehog/containers/deployment/changes/check_volumes.ex

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,18 @@
# SPDX-License-Identifier: Apache-2.0
#

defmodule Edgehog.Containers.Deployment.Changes.CreateDeploymentOnDevice do
defmodule Edgehog.Containers.Deployment.Changes.StartDeployer do
@moduledoc false
use Ash.Resource.Change

alias Edgehog.Containers
alias Edgehog.Containers.Deployment.DeployerSupervisor

@impl Ash.Resource.Change
def change(changeset, _opts, _context) do
Ash.Changeset.after_action(changeset, fn _changeset, deployment ->
with :ok <- Containers.send_deploy_request(deployment, tenant: deployment.tenant_id) do
Ash.Changeset.after_transaction(changeset, fn _changeset, result ->
with {:ok, deployment} <- result do
_pid = DeployerSupervisor.start_deployer!(deployment)

{:ok, deployment}
end
end)
Expand Down
Loading

0 comments on commit d0dbd1b

Please sign in to comment.