Deployment and lifecycle management for Nix
0
fork

Configure Feed

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

refactor: gate all reboot logic on @rebootable_seed_types early

Move the seed type check before any reboot decision logic so
non-rebootable deployments skip the entire reboot path, including
the "reboot skipped" decision line for failed deployments.

sow-128

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+68 -56
+68 -56
apps/garden/lib/garden/deployer.ex
··· 236 236 maybe_reboot(deployment, result, []) 237 237 end 238 238 239 - def maybe_reboot(%Deployment{} = deployment, result, opts) when result != :success do 239 + def maybe_reboot(%Deployment{} = deployment, _result, _opts) 240 + when deployment.seed_deployments == [] do 241 + :ok 242 + end 243 + 244 + def maybe_reboot(%Deployment{} = deployment, result, opts) do 245 + has_rebootable_seeds = 246 + Enum.any?( 247 + deployment.seed_deployments, 248 + &(get_in(&1.seed.seed_type) in @rebootable_seed_types) 249 + ) 250 + 251 + if has_rebootable_seeds do 252 + maybe_reboot_seeds(deployment, result, opts) 253 + else 254 + Logger.debug( 255 + msg: "Skipping reboot for non-rebootable deployment", 256 + deployment_sid: deployment.sid 257 + ) 258 + 259 + :ok 260 + end 261 + end 262 + 263 + defp maybe_reboot_seeds(%Deployment{} = deployment, result, opts) when result != :success do 240 264 Logger.debug(msg: "Skipping reboot due to unsuccesful deployment", result: result) 241 265 write_reboot_decision(deployment, opts, "reboot skipped: deployment result was #{result}") 242 266 :ok 243 267 end 244 268 245 - def maybe_reboot(%Deployment{} = deployment, :success, opts) do 269 + defp maybe_reboot_seeds(%Deployment{} = deployment, :success, opts) do 246 270 reboot_reason_fun = Keyword.get(opts, :reboot_reason_fun, &reboot_reason/1) 247 271 reboot_fun = Keyword.get(opts, :reboot_fun, &Activator.reboot/1) 248 272 ··· 251 275 Application.get_env(:garden, :enable_activation, true) 252 276 end) 253 277 254 - if Enum.any?( 255 - deployment.seed_deployments, 256 - &(get_in(&1.seed.seed_type) in @rebootable_seed_types) 257 - ) do 258 - case reboot_reason_fun.(deployment.seed_deployments) do 259 - nil -> 260 - write_reboot_decision(deployment, opts, "no reboot required") 261 - :ok 278 + case reboot_reason_fun.(deployment.seed_deployments) do 279 + nil -> 280 + write_reboot_decision(deployment, opts, "no reboot required") 281 + :ok 262 282 263 - reason -> 264 - if activation_enabled_fun.() do 265 - Logger.info( 266 - msg: "Reboot required by deployment policy", 267 - deployment_sid: deployment.sid, 268 - reason: reason 269 - ) 283 + reason -> 284 + if activation_enabled_fun.() do 285 + Logger.info( 286 + msg: "Reboot required by deployment policy", 287 + deployment_sid: deployment.sid, 288 + reason: reason 289 + ) 270 290 271 - write_reboot_decision(deployment, opts, "reboot initiated: #{reason}") 291 + write_reboot_decision(deployment, opts, "reboot initiated: #{reason}") 272 292 273 - case reboot_fun.(reason: reason) do 274 - {:ok, output} -> 275 - Logger.info( 276 - msg: "Reboot request completed", 277 - deployment_sid: deployment.sid, 278 - reason: reason, 279 - output: output 280 - ) 293 + case reboot_fun.(reason: reason) do 294 + {:ok, output} -> 295 + Logger.info( 296 + msg: "Reboot request completed", 297 + deployment_sid: deployment.sid, 298 + reason: reason, 299 + output: output 300 + ) 281 301 282 - {:error, code, output} -> 283 - Logger.error( 284 - msg: "Reboot request failed", 285 - deployment_sid: deployment.sid, 286 - reason: reason, 287 - code: code, 288 - output: output 289 - ) 302 + {:error, code, output} -> 303 + Logger.error( 304 + msg: "Reboot request failed", 305 + deployment_sid: deployment.sid, 306 + reason: reason, 307 + code: code, 308 + output: output 309 + ) 290 310 291 - {:error, reboot_error} -> 292 - Logger.error( 293 - msg: "Reboot request failed", 294 - deployment_sid: deployment.sid, 295 - reason: reason, 296 - error: inspect(reboot_error) 297 - ) 298 - end 299 - else 300 - Logger.debug( 301 - msg: "Reboot run in noop", 302 - deployment_sid: deployment.sid, 303 - reason: reason 304 - ) 311 + {:error, reboot_error} -> 312 + Logger.error( 313 + msg: "Reboot request failed", 314 + deployment_sid: deployment.sid, 315 + reason: reason, 316 + error: inspect(reboot_error) 317 + ) 305 318 end 306 - end 307 - else 308 - Logger.debug( 309 - msg: "Skipping reboot for non-nixos deployment", 310 - deployment_sid: deployment.sid 311 - ) 312 - 313 - :ok 319 + else 320 + Logger.debug( 321 + msg: "Reboot run in noop", 322 + deployment_sid: deployment.sid, 323 + reason: reason 324 + ) 325 + end 314 326 end 315 327 end 316 328