From 975e166da7e0597a361e257988e4d2d12e7a29a0 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Thu, 24 Aug 2023 14:34:00 +0000 Subject: [PATCH] zones: allow RingInfo.Merge() to enable, but not disable Signed-off-by: Alejandro Mery --- pkg/zones/rings.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pkg/zones/rings.go b/pkg/zones/rings.go index 7982694..134adc8 100644 --- a/pkg/zones/rings.go +++ b/pkg/zones/rings.go @@ -31,9 +31,9 @@ func (ri *RingInfo) Merge(alter *RingInfo) error { case ri.Ring != alter.Ring: // different ring return fmt.Errorf("invalid %s: %v ≠ %v", "ring", ri.Ring, alter.Ring) - case ri.Enabled != alter.Enabled: - // different state - return fmt.Errorf("invalid %s: %v ≠ %v", "enabled", ri.Enabled, alter.Enabled) + case ri.Enabled && !alter.Enabled: + // can't disable via Merge + return fmt.Errorf("invalid %s: %v → %v", "enabled", ri.Enabled, alter.Enabled) case !canMergeAddress(ri.Address, alter.Address): // different address return fmt.Errorf("invalid %s: %v ≠ %v", "address", ri.Address, alter.Address) @@ -42,6 +42,15 @@ func (ri *RingInfo) Merge(alter *RingInfo) error { return fmt.Errorf("invalid %s: %s ≠ %s", "keys", ri.Keys, alter.Keys) } + return ri.unsafeMerge(alter) +} + +func (ri *RingInfo) unsafeMerge(alter *RingInfo) error { + // enable via Merge + if alter.Enabled { + ri.Enabled = true + } + switch { case ri.Keys == nil: // assign keypair