Deployment and lifecycle management for Nix
0
fork

Configure Feed

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

agent: skip reboot logic for non-nixos

+122 -45
+64 -45
apps/sower_agent/lib/sower_agent/deployer.ex
··· 211 211 Storage.read().subscriptions |> Enum.find(&(&1.sid == sid)) 212 212 end 213 213 214 - def maybe_reboot(%Deployment{} = _deployment, result) when result != :success do 214 + def maybe_reboot(%Deployment{} = deployment, result) do 215 + maybe_reboot(deployment, result, []) 216 + end 217 + 218 + def maybe_reboot(%Deployment{} = _deployment, result, _opts) when result != :success do 215 219 Logger.debug(msg: "Skipping reboot due to unsuccesful deployment", result: result) 216 220 :ok 217 221 end 218 222 219 - def maybe_reboot(%Deployment{} = deployment, :success) do 220 - case reboot_reason(deployment.seed_deployments) do 221 - nil -> 222 - :ok 223 + def maybe_reboot(%Deployment{} = deployment, :success, opts) do 224 + reboot_reason_fun = Keyword.get(opts, :reboot_reason_fun, &reboot_reason/1) 225 + reboot_fun = Keyword.get(opts, :reboot_fun, &Activator.reboot/1) 223 226 224 - reason -> 225 - if Application.get_env(:sower_agent, :enable_activation, true) do 226 - Logger.info( 227 - msg: "Reboot required by deployment policy", 228 - deployment_sid: deployment.sid, 229 - reason: reason 230 - ) 227 + activation_enabled_fun = 228 + Keyword.get(opts, :activation_enabled_fun, fn -> 229 + Application.get_env(:sower_agent, :enable_activation, true) 230 + end) 231 + 232 + if Enum.any?(deployment.seed_deployments, &(get_in(&1.seed.seed_type) == "nixos")) do 233 + case reboot_reason_fun.(deployment.seed_deployments) do 234 + nil -> 235 + :ok 236 + 237 + reason -> 238 + if activation_enabled_fun.() do 239 + Logger.info( 240 + msg: "Reboot required by deployment policy", 241 + deployment_sid: deployment.sid, 242 + reason: reason 243 + ) 231 244 232 - case Activator.reboot(reason: reason) do 233 - {:ok, output} -> 234 - Logger.info( 235 - msg: "Reboot request completed", 236 - deployment_sid: deployment.sid, 237 - reason: reason, 238 - output: output 239 - ) 245 + case reboot_fun.(reason: reason) do 246 + {:ok, output} -> 247 + Logger.info( 248 + msg: "Reboot request completed", 249 + deployment_sid: deployment.sid, 250 + reason: reason, 251 + output: output 252 + ) 240 253 241 - {:error, code, output} -> 242 - Logger.error( 243 - msg: "Reboot request failed", 244 - deployment_sid: deployment.sid, 245 - reason: reason, 246 - code: code, 247 - output: output 248 - ) 254 + {:error, code, output} -> 255 + Logger.error( 256 + msg: "Reboot request failed", 257 + deployment_sid: deployment.sid, 258 + reason: reason, 259 + code: code, 260 + output: output 261 + ) 249 262 250 - {:error, reboot_error} -> 251 - Logger.error( 252 - msg: "Reboot request failed", 253 - deployment_sid: deployment.sid, 254 - reason: reason, 255 - error: inspect(reboot_error) 256 - ) 263 + {:error, reboot_error} -> 264 + Logger.error( 265 + msg: "Reboot request failed", 266 + deployment_sid: deployment.sid, 267 + reason: reason, 268 + error: inspect(reboot_error) 269 + ) 270 + end 271 + else 272 + Logger.debug( 273 + msg: "Reboot run in noop", 274 + deployment_sid: deployment.sid, 275 + reason: reason 276 + ) 257 277 end 258 - else 259 - Logger.debug( 260 - msg: "Reboot run in noop", 261 - deployment_sid: deployment.sid, 262 - reason: reason 263 - ) 264 - end 278 + end 279 + else 280 + Logger.debug( 281 + msg: "Skipping reboot for non-nixos deployment", 282 + deployment_sid: deployment.sid 283 + ) 284 + 285 + :ok 265 286 end 266 287 end 267 288 ··· 272 293 ) do 273 294 profiles = 274 295 seed_deployments 275 - |> Enum.filter(fn %SeedDeployment{seed: seed} -> 276 - seed.seed_type == "nixos" 277 - end) 296 + |> Enum.filter(&(get_in(&1.seed.seed_type) == "nixos")) 278 297 |> Enum.map(fn %SeedDeployment{subscription_sid: subscription_sid} -> 279 298 get_profile.(subscription_sid) || %DeploymentProfile{} 280 299 end)
+58
apps/sower_agent/test/sower_agent/deployer_test.exs
··· 4 4 import ExUnit.CaptureLog 5 5 6 6 alias SowerAgent.Deployer 7 + alias SowerClient.Orchestration.Deployment 7 8 alias SowerClient.Orchestration.SeedDeployment 8 9 alias SowerClient.Orchestration.DeploymentProfile 9 10 alias SowerClient.Orchestration.Subscription ··· 116 117 test "returns :failure when all seed activations fail" do 117 118 result = [{:ok, {:error, 1, ["failed"]}}, {:error, :failed_to_realize, %{}}] 118 119 assert Deployer.deployment_result(result) == :failure 120 + end 121 + end 122 + 123 + describe "maybe_reboot/3" do 124 + test "skips reboot logic when deployment has no nixos seeds" do 125 + deployment = %Deployment{ 126 + sid: "dep_non_nixos", 127 + seed_deployments: [seed_deploy("sub1", "service")] 128 + } 129 + 130 + assert Deployer.maybe_reboot(deployment, :success, 131 + reboot_reason_fun: fn _ -> 132 + send(self(), :reboot_reason_called) 133 + nil 134 + end, 135 + reboot_fun: fn _ -> 136 + send(self(), :reboot_called) 137 + {:ok, []} 138 + end, 139 + activation_enabled_fun: fn -> true end 140 + ) == :ok 141 + 142 + refute_received :reboot_reason_called 143 + refute_received :reboot_called 144 + end 145 + 146 + test "evaluates reboot logic when deployment includes nixos seeds" do 147 + deployment = %Deployment{sid: "dep_nixos", seed_deployments: [seed_deploy("sub1", "nixos")]} 148 + 149 + assert Deployer.maybe_reboot(deployment, :success, 150 + reboot_reason_fun: fn _ -> 151 + send(self(), :reboot_reason_called) 152 + nil 153 + end, 154 + reboot_fun: fn _ -> flunk("reboot should not be requested") end, 155 + activation_enabled_fun: fn -> true end 156 + ) == :ok 157 + 158 + assert_received :reboot_reason_called 159 + end 160 + 161 + test "requests reboot when nixos deployment requires it" do 162 + deployment = %Deployment{ 163 + sid: "dep_reboot", 164 + seed_deployments: [seed_deploy("sub1", "nixos")] 165 + } 166 + 167 + assert Deployer.maybe_reboot(deployment, :success, 168 + reboot_reason_fun: fn _ -> "policy_always" end, 169 + reboot_fun: fn opts -> 170 + send(self(), {:reboot_called, opts}) 171 + {:ok, ["ok"]} 172 + end, 173 + activation_enabled_fun: fn -> true end 174 + ) == :ok 175 + 176 + assert_received {:reboot_called, [reason: "policy_always"]} 119 177 end 120 178 end 121 179