Deployment and lifecycle management for Nix
0
fork

Configure Feed

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

fix: preserve subscription identity across re-syncs

register_subscription was generating a random SID as the name fallback
when the garden didn't provide one. This defeated the upsert on
(garden_id, org_id, name), causing every re-sync to create a new
subscription record and orphan the subscriptions_deployments links.

Now falls through to create_subscription's existing default of
seed_name, which is stable across re-syncs.

sow-134

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

+16 -14
+16 -14
apps/sower/lib/sower/orchestration/subscription.ex
··· 201 201 end 202 202 203 203 def register_subscription(%SowerClient.Orchestration.Subscription{} = sub, garden_id) do 204 - name = sub.name || SowerClient.Sid.generate("sub") 204 + attrs = 205 + %{ 206 + garden_id: garden_id, 207 + seed_name: sub.seed_name, 208 + seed_type: sub.seed_type, 209 + rules: sub.rules, 210 + schedule: sub.schedule, 211 + timezone: sub.timezone, 212 + activation_args: sub.activation_args, 213 + reboot_policy: sub.reboot_policy, 214 + allow_realtime: sub.allow_realtime, 215 + window: sub.window 216 + } 205 217 206 - case create_subscription(%{ 207 - garden_id: garden_id, 208 - name: name, 209 - seed_name: sub.seed_name, 210 - seed_type: sub.seed_type, 211 - rules: sub.rules, 212 - schedule: sub.schedule, 213 - timezone: sub.timezone, 214 - activation_args: sub.activation_args, 215 - reboot_policy: sub.reboot_policy, 216 - allow_realtime: sub.allow_realtime, 217 - window: sub.window 218 - }) do 218 + attrs = if sub.name, do: Map.put(attrs, :name, sub.name), else: attrs 219 + 220 + case create_subscription(attrs) do 219 221 {:ok, subscription} -> 220 222 {:ok, SowerClient.Orchestration.Subscription.cast!(subscription)} 221 223