Deployment and lifecycle management for Nix
0
fork

Configure Feed

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

agent: deploy_profile -> deployment_profile. successful reboot

+32 -26
+19 -13
apps/sower_agent/lib/sower_agent/deployer.ex
··· 93 93 end) 94 94 |> async_stream(fn 95 95 {:ok, {:ok, %SeedDeployment{seed: seed} = seed_deploy}} -> 96 - profile = get_deploy_profile(seed_deploy.subscription_sid) 96 + profile = get_deployment_profile(seed_deploy.subscription_sid) 97 97 98 98 Logger.info( 99 99 msg: "Activating seed", ··· 149 149 ) 150 150 end 151 151 152 - def get_deploy_profile(nil), do: nil 152 + def get_deployment_profile(nil), do: nil 153 153 154 - def get_deploy_profile( 154 + def get_deployment_profile( 155 155 subscription_sid, 156 156 find_sub \\ &find_subscription/1, 157 - find_profile \\ &find_deploy_profile/1 157 + find_profile \\ &find_deployment_profile/1 158 158 ) do 159 159 sub = find_sub.(subscription_sid) 160 160 ··· 162 162 case get_in(sub.deployment_profile) do 163 163 nil -> 164 164 Logger.warning( 165 - msg: "Subscription not found, using defaults", 166 - deploy_subscription_sid: subscription_sid 165 + msg: "Subscription deployment profile not found, using default", 166 + deploy_subscription_sid: subscription_sid, 167 + subscription_seed_name: sub.seed_name, 168 + subscription_seed_type: sub.seed_type 167 169 ) 168 170 169 - %{} 171 + Map.get(Config.get(), :default_deployment_profile, "default") 170 172 171 173 profile_name -> 172 - find_profile.(profile_name) || %{} 174 + profile_name 173 175 end 176 + |> find_profile.() 174 177 175 178 %DeploymentProfile{} 176 179 |> Map.merge(subscription_overrides) 177 180 end 178 181 179 - defp find_deploy_profile(name) do 182 + defp find_deployment_profile(name) do 180 183 config = Config.get() 181 - get_in(config.deploy_profiles[name]) 184 + get_in(config.deployment_profiles[name]) 182 185 end 183 186 184 187 defp find_subscription(sid) do 185 188 Storage.read().subscriptions |> Enum.find(&(&1.sid == sid)) 186 189 end 187 190 188 - def maybe_reboot(%Deployment{} = _deployment, result) when result != :success, do: :ok 191 + def maybe_reboot(%Deployment{} = _deployment, result) when result != :success do 192 + Logger.debug(msg: "Skipping reboot due to unsuccesful deployment", result: result) 193 + :ok 194 + end 189 195 190 196 def maybe_reboot(%Deployment{} = deployment, :success) do 191 197 case reboot_reason(deployment.seed_deployments) do ··· 238 244 239 245 def reboot_reason( 240 246 seed_deployments, 241 - get_profile \\ &get_deploy_profile/1, 247 + get_profile \\ &get_deployment_profile/1, 242 248 read_link \\ &:file.read_link_all/1 243 249 ) do 244 250 profiles = ··· 299 305 Regex.replace(~r/\x1b\[[0-9;]*[a-zA-Z]/, text, "") 300 306 end 301 307 302 - defp detect_boot_critical_change_reason(read_link) do 308 + def detect_boot_critical_change_reason(read_link \\ &:file.read_link_all/1) do 303 309 with {:ok, profile_store_path} <- resolved_symlink("/nix/var/nix/profiles/system", read_link), 304 310 {:ok, current_store_path} <- resolved_symlink("/run/current-system", read_link), 305 311 {:ok, booted_store_path} <- resolved_symlink("/run/booted-system", read_link) do
+6 -6
apps/sower_agent/test/sower_agent/deployer_test.exs
··· 9 9 alias SowerClient.Orchestration.Subscription 10 10 alias SowerClient.Seed 11 11 12 - describe "get_deploy_profile/3" do 12 + describe "get_deployment_profile/3" do 13 13 test "returns nil for nil subscription sid" do 14 - assert Deployer.get_deploy_profile(nil) == nil 14 + assert Deployer.get_deployment_profile(nil) == nil 15 15 end 16 16 17 17 test "returns defaults and logs warning when subscription is missing" do 18 18 logs = 19 19 capture_log(fn -> 20 - assert Deployer.get_deploy_profile("sub_missing", fn _sid -> nil end, fn _name -> 20 + assert Deployer.get_deployment_profile("sub_missing", fn _sid -> nil end, fn _name -> 21 21 %{} 22 22 end) == 23 23 %DeploymentProfile{} ··· 45 45 _ -> %{} 46 46 end 47 47 48 - assert Deployer.get_deploy_profile(sid, find_sub, find_profile) == %DeploymentProfile{ 48 + assert Deployer.get_deployment_profile(sid, find_sub, find_profile) == %DeploymentProfile{ 49 49 activation_args: ["boot"], 50 50 reboot_policy: "always" 51 51 } ··· 59 59 deployment_profile: "partial_profile" 60 60 } 61 61 62 - assert Deployer.get_deploy_profile( 62 + assert Deployer.get_deployment_profile( 63 63 sid, 64 64 fn _ -> sub end, 65 65 fn _ -> %{activation_args: ["boot"]} end ··· 77 77 deployment_profile: "missing_profile" 78 78 } 79 79 80 - assert Deployer.get_deploy_profile( 80 + assert Deployer.get_deployment_profile( 81 81 sid, 82 82 fn _ -> sub end, 83 83 fn _ -> nil end
+2 -2
apps/sower_client/lib/sower_client/config.ex
··· 48 48 type: :string, 49 49 description: "Directory where state files are written (agent-only)" 50 50 }, 51 - default_deploy_profile: %Schema{ 51 + default_deployment_profile: %Schema{ 52 52 type: :string, 53 53 description: "Name of default deployment profile", 54 54 nullable: true 55 55 }, 56 - deploy_profiles: %Schema{ 56 + deployment_profiles: %Schema{ 57 57 type: :object, 58 58 additionalProperties: SowerClient.Orchestration.DeploymentProfile, 59 59 nullable: true,
+5 -5
apps/sower_client/test/sower_client/config_test.exs
··· 136 136 assert config.endpoint == "https://default.com" 137 137 end 138 138 139 - test "casts deploy_profiles additionalProperties into deployment profiles", %{ 139 + test "casts deployment_profiles additionalProperties into deployment profiles", %{ 140 140 config_file: config_file 141 141 } do 142 142 config_data = %{ 143 143 "endpoint" => "https://my.sower.dev", 144 - "deploy_profiles" => %{ 144 + "deployment_profiles" => %{ 145 145 "default" => %{"reboot_policy" => "when-required"} 146 146 } 147 147 } ··· 151 151 config = Config.load(config_path: config_file) 152 152 153 153 assert %Config{} = config 154 - assert %DeploymentProfile{} = config.deploy_profiles["default"] 155 - assert config.deploy_profiles["default"].reboot_policy == "when-required" 156 - assert config.deploy_profiles["default"].activation_args == [] 154 + assert %DeploymentProfile{} = config.deployment_profiles["default"] 155 + assert config.deployment_profiles["default"].reboot_policy == "when-required" 156 + assert config.deployment_profiles["default"].activation_args == [] 157 157 end 158 158 end 159 159