From 783e5d3231b5663569fa2734ed99c89b3eaa603f Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Fri, 5 Feb 2021 11:52:36 -0500 Subject: [PATCH] Fix terminator patch to not update/clear peer data unless requested --- controller/db/terminator_store.go | 16 ++++++----- controller/db/terminator_store_test.go | 38 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/controller/db/terminator_store.go b/controller/db/terminator_store.go index 8fee4b214..98b7990b9 100644 --- a/controller/db/terminator_store.go +++ b/controller/db/terminator_store.go @@ -133,13 +133,15 @@ func (entity *Terminator) SetValues(ctx *boltz.PersistContext) { ctx.SetInt32(FieldTerminatorCost, int32(entity.Cost)) ctx.SetRequiredString(FieldTerminatorPrecedence, entity.Precedence) - _ = ctx.Bucket.DeleteBucket([]byte(FieldServerPeerData)) - if entity.PeerData != nil { - hostDataBucket := ctx.Bucket.GetOrCreateBucket(FieldServerPeerData) - for k, v := range entity.PeerData { - key := make([]byte, 4) - binary.LittleEndian.PutUint32(key, k) - hostDataBucket.PutValue(key, v) + if ctx.ProceedWithSet(FieldServerPeerData) { + _ = ctx.Bucket.DeleteBucket([]byte(FieldServerPeerData)) + if entity.PeerData != nil { + hostDataBucket := ctx.Bucket.GetOrCreateBucket(FieldServerPeerData) + for k, v := range entity.PeerData { + key := make([]byte, 4) + binary.LittleEndian.PutUint32(key, k) + hostDataBucket.PutValue(key, v) + } } } diff --git a/controller/db/terminator_store_test.go b/controller/db/terminator_store_test.go index d9ff0c6e6..c34864993 100644 --- a/controller/db/terminator_store_test.go +++ b/controller/db/terminator_store_test.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/google/uuid" "github.com/openziti/fabric/controller/xt" + "github.com/openziti/foundation/storage/boltz" "github.com/openziti/foundation/util/stringz" "go.etcd.io/bbolt" "math" @@ -38,6 +39,7 @@ func Test_TerminatorStore(t *testing.T) { t.Run("test create/delete terminators", ctx.testLoadQueryTerminators) t.Run("test update terminators", ctx.testUpdateTerminators) t.Run("test delete terminators", ctx.testDeleteTerminators) + t.Run("test patch terminators", ctx.testPatchTerminator) } func (ctx *TestContext) testCreateInvalidTerminators(t *testing.T) { @@ -229,6 +231,7 @@ func (ctx *TestContext) testUpdateTerminators(t *testing.T) { terminator.Service = e.service.Id // service should not be updated ctx.ValidateUpdated(terminator) + } func (ctx *TestContext) testDeleteTerminators(t *testing.T) { @@ -247,6 +250,41 @@ func (ctx *TestContext) testDeleteTerminators(t *testing.T) { ctx.ValidateDeleted(e.terminator.Id) } +func (ctx *TestContext) testPatchTerminator(t *testing.T) { + service := ctx.requireNewService() + router := ctx.requireNewRouter() + + terminator := &Terminator{} + terminator.Service = service.Id + terminator.Router = router.Id + terminator.Binding = uuid.New().String() + terminator.Address = uuid.New().String() + terminator.Cost = 0 + terminator.PeerData = map[uint32][]byte{ + 1: {1, 2, 3}, + 2: {3, 4, 5}, + } + ctx.RequireCreate(terminator) + ctx.ValidateBaseline(terminator) + + terminator.Cost = 100 + checker := boltz.MapFieldChecker{ + FieldTerminatorCost: struct{}{}, + } + ctx.RequirePatch(terminator, checker) + ctx.ValidateUpdated(terminator) + + terminator.PeerData = map[uint32][]byte{ + 1: {7, 8, 9}, + } + + checker = boltz.MapFieldChecker{ + FieldServerPeerData: struct{}{}, + } + ctx.RequirePatch(terminator, checker) + ctx.ValidateUpdated(terminator) +} + type testStrategyFactory struct{} func (t testStrategyFactory) GetStrategyName() string {