@@ -3,6 +3,7 @@ defmodule NervesHub.ManagedDeployments do
33
44 require Logger
55
6+ alias NervesHub.Accounts.User
67 alias NervesHub.AuditLogs.DeploymentGroupTemplates
78 alias NervesHub.AuditLogs.DeviceTemplates
89 alias NervesHub.Devices
@@ -11,6 +12,7 @@ defmodule NervesHub.ManagedDeployments do
1112 alias NervesHub.Firmwares
1213 alias NervesHub.Firmwares.FirmwareDelta
1314 alias NervesHub.ManagedDeployments.DeploymentGroup
15+ alias NervesHub.ManagedDeployments.DeploymentRelease
1416 alias NervesHub.ManagedDeployments.Distributed.Orchestrator , as: DistributedOrchestrator
1517 alias NervesHub.Products.Product
1618 alias Phoenix.Channel.Server , as: PhoenixChannelServer
@@ -193,27 +195,28 @@ defmodule NervesHub.ManagedDeployments do
193195 Update a deployment
194196
195197 - Records audit logs depending on changes
198+ - Creates deployment release record if firmware_id changed (requires user_id in params)
196199 """
197- @ spec update_deployment_group ( DeploymentGroup . t ( ) , map ) ::
200+ @ spec update_deployment_group ( DeploymentGroup . t ( ) , map , User . t ( ) ) ::
198201 { :ok , DeploymentGroup . t ( ) } | { :error , Changeset . t ( ) }
199- def update_deployment_group ( deployment_group , params ) do
202+ def update_deployment_group ( deployment_group , params , user ) do
200203 result =
201- Repo . transaction ( fn ->
204+ Repo . transact ( fn ->
202205 changeset =
203206 deployment_group
204207 |> Repo . preload ( :firmware )
205208 |> DeploymentGroup . update_changeset ( params )
206209
207- case Repo . update ( changeset ) do
208- { :ok , deployment_group } ->
209- deployment_group = Repo . preload ( deployment_group , [ :firmware ] , force: true )
210-
211- audit_changes! ( deployment_group , changeset )
212-
213- { deployment_group , changeset }
214-
215- { :error , changeset } ->
216- Repo . rollback ( changeset )
210+ with { :ok , deployment_group } <- Repo . update ( changeset ) ,
211+ deployment_group = Repo . preload ( deployment_group , [ :firmware ] , force: true ) ,
212+ :ok <- create_audit_logs! ( deployment_group , changeset ) ,
213+ { :ok , _deployment_group } <-
214+ maybe_create_deployment_release (
215+ deployment_group ,
216+ changeset . changes ,
217+ user . id
218+ ) do
219+ { :ok , { deployment_group , changeset } }
217220 end
218221 end )
219222
@@ -237,7 +240,22 @@ defmodule NervesHub.ManagedDeployments do
237240 end
238241 end
239242
240- defp audit_changes! ( deployment_group , changeset ) do
243+ # Create deployment release if firmware or archive changed
244+ defp maybe_create_deployment_release ( deployment_group , changes , user_id )
245+ when is_map_key ( changes , :firmware_id ) or is_map_key ( changes , :archive_id ) do
246+ % DeploymentRelease { }
247+ |> DeploymentRelease . changeset ( % {
248+ deployment_group_id: deployment_group . id ,
249+ firmware_id: deployment_group . firmware_id ,
250+ archive_id: deployment_group . archive_id ,
251+ created_by_id: user_id
252+ } )
253+ |> Repo . insert ( )
254+ end
255+
256+ defp maybe_create_deployment_release ( _deployment_group , _changes , _user_id ) , do: { :ok , nil }
257+
258+ defp create_audit_logs! ( deployment_group , changeset ) do
241259 Enum . each ( changeset . changes , fn
242260 { :archive_id , archive_id } ->
243261 # Trigger the new archive to get downloaded by devices
@@ -346,6 +364,21 @@ defmodule NervesHub.ManagedDeployments do
346364 end
347365 end
348366
367+ @ doc """
368+ List all deployment releases for a deployment group, ordered by most recent first.
369+ """
370+ @ spec list_deployment_releases ( DeploymentGroup . t ( ) ) :: [ DeploymentRelease . t ( ) ]
371+ def list_deployment_releases ( % DeploymentGroup { id: deployment_group_id } ) do
372+ DeploymentRelease
373+ |> where ( [ r ] , r . deployment_group_id == ^ deployment_group_id )
374+ |> join ( :inner , [ r ] , f in assoc ( r , :firmware ) )
375+ |> join ( :inner , [ r ] , u in assoc ( r , :user ) )
376+ |> join ( :left , [ r ] , a in assoc ( r , :archive ) )
377+ |> preload ( [ r , f , u , a ] , firmware: f , user: u , archive: a )
378+ |> order_by ( [ r ] , desc: r . inserted_at , desc: r . id )
379+ |> Repo . all ( )
380+ end
381+
349382 @ spec broadcast ( DeploymentGroup . t ( ) | atom ( ) , String . t ( ) , map ( ) ) :: :ok | { :error , term ( ) }
350383 def broadcast ( deployment_group , event , payload \\ % { } )
351384
0 commit comments