@@ -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,31 @@ defmodule NervesHub.ManagedDeployments do
193195 Update a deployment
194196
195197 - Records audit logs depending on changes
198+ - Creates deployment release record if firmware_id or archive_id changed
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
203+ deployment_group = Repo . preload ( deployment_group , :firmware )
204+
200205 result =
201- Repo . transaction ( fn ->
206+ Repo . transact ( fn ->
202207 changeset =
203208 deployment_group
204- |> Repo . preload ( :firmware )
205209 |> DeploymentGroup . update_changeset ( params )
206210
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 )
211+ create_deployment_release? =
212+ Map . has_key? ( changeset . changes , :firmware_id ) or
213+ Map . has_key? ( changeset . changes , :archive_id )
214+
215+ with { :ok , deployment_group } <- Repo . update ( changeset ) ,
216+ :ok <- create_audit_logs! ( deployment_group , changeset ) ,
217+ { :ok , _deployment_group } <-
218+ if ( create_deployment_release? ,
219+ do: create_deployment_release ( deployment_group , user . id ) ,
220+ else: { :ok , nil }
221+ ) do
222+ { :ok , { deployment_group , changeset } }
217223 end
218224 end )
219225
@@ -237,7 +243,18 @@ defmodule NervesHub.ManagedDeployments do
237243 end
238244 end
239245
240- defp audit_changes! ( deployment_group , changeset ) do
246+ defp create_deployment_release ( deployment_group , user_id ) do
247+ % DeploymentRelease { }
248+ |> DeploymentRelease . changeset ( % {
249+ deployment_group_id: deployment_group . id ,
250+ firmware_id: deployment_group . firmware_id ,
251+ archive_id: deployment_group . archive_id ,
252+ created_by_id: user_id
253+ } )
254+ |> Repo . insert ( )
255+ end
256+
257+ defp create_audit_logs! ( deployment_group , changeset ) do
241258 Enum . each ( changeset . changes , fn
242259 { :archive_id , archive_id } ->
243260 # Trigger the new archive to get downloaded by devices
@@ -330,11 +347,17 @@ defmodule NervesHub.ManagedDeployments do
330347 Ecto.Changeset . change ( % DeploymentGroup { } )
331348 end
332349
333- @ spec create_deployment_group ( map ( ) , Product . t ( ) ) ::
350+ @ spec create_deployment_group ( map ( ) , Product . t ( ) , User . t ( ) ) ::
334351 { :ok , DeploymentGroup . t ( ) } | { :error , Changeset . t ( ) }
335- def create_deployment_group ( params , % Product { } = product ) do
336- DeploymentGroup . create_changeset ( params , product )
337- |> Repo . insert ( )
352+ def create_deployment_group ( params , % Product { } = product , user ) do
353+ Repo . transact ( fn ->
354+ changeset = DeploymentGroup . create_changeset ( params , product )
355+
356+ with { :ok , deployment_group } <- Repo . insert ( changeset ) ,
357+ { :ok , _release } <- create_deployment_release ( deployment_group , user . id ) do
358+ { :ok , deployment_group }
359+ end
360+ end )
338361 |> case do
339362 { :ok , deployment_group } ->
340363 deployment_created_event ( deployment_group )
@@ -346,6 +369,21 @@ defmodule NervesHub.ManagedDeployments do
346369 end
347370 end
348371
372+ @ doc """
373+ List all deployment releases for a deployment group, ordered by most recent first.
374+ """
375+ @ spec list_deployment_releases ( DeploymentGroup . t ( ) ) :: [ DeploymentRelease . t ( ) ]
376+ def list_deployment_releases ( % DeploymentGroup { id: deployment_group_id } ) do
377+ DeploymentRelease
378+ |> where ( [ r ] , r . deployment_group_id == ^ deployment_group_id )
379+ |> join ( :inner , [ r ] , f in assoc ( r , :firmware ) )
380+ |> join ( :inner , [ r ] , u in assoc ( r , :user ) )
381+ |> join ( :left , [ r ] , a in assoc ( r , :archive ) )
382+ |> preload ( [ r , f , u , a ] , firmware: f , user: u , archive: a )
383+ |> order_by ( [ r ] , desc: r . inserted_at , desc: r . id )
384+ |> Repo . all ( )
385+ end
386+
349387 @ spec broadcast ( DeploymentGroup . t ( ) | atom ( ) , String . t ( ) , map ( ) ) :: :ok | { :error , term ( ) }
350388 def broadcast ( deployment_group , event , payload \\ % { } )
351389
0 commit comments