From eb2d98cbf03373cbd4f2c6aca2a4f453d1cd086d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Fri, 27 Nov 2020 18:15:25 +0100 Subject: [PATCH] Allow simple interaction with record encoder Mainly used for record importer; might rework/remove at a later point. --- pkg/envoy/store/compose_record.go | 31 +++++++++++++++++++++---------- pkg/envoy/store/encoder.go | 8 ++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/pkg/envoy/store/compose_record.go b/pkg/envoy/store/compose_record.go index 3313758ff..ff415f926 100644 --- a/pkg/envoy/store/compose_record.go +++ b/pkg/envoy/store/compose_record.go @@ -129,6 +129,24 @@ func (n *composeRecordState) Encode(ctx context.Context, s store.Storer, state * im := n.res.IDMap return n.res.Walker(func(r *resource.ComposeRecordRaw) error { + // Simple wrapper to do some post-processing steps + dfr := func(err error) error { + if n.cfg.Defer != nil { + n.cfg.Defer() + } + + if err != nil { + if n.cfg.DeferNok != nil { + return n.cfg.DeferNok(err) + } + return err + } else if n.cfg.DeferOk != nil { + n.cfg.DeferOk() + } + + return nil + } + rec := &types.Record{ ID: im[r.ID], NamespaceID: nsID, @@ -170,24 +188,17 @@ func (n *composeRecordState) Encode(ctx context.Context, s store.Storer, state * rec.Values = rvSanitizer.Run(mod, rvs) rve := rvValidator.Run(ctx, s, mod, rec) if !rve.IsValid() { - return rve + return dfr(rve) } // Create a new record if !exists { err = store.CreateComposeRecord(ctx, s, mod, rec) - if err != nil { - return err - } - return nil + return dfr(err) } // Update existing err = store.UpdateComposeRecord(ctx, s, mod, rec) - if err != nil { - return err - } - - return nil + return dfr(err) }) } diff --git a/pkg/envoy/store/encoder.go b/pkg/envoy/store/encoder.go index 39613682d..40ac00a8d 100644 --- a/pkg/envoy/store/encoder.go +++ b/pkg/envoy/store/encoder.go @@ -38,6 +38,14 @@ type ( // EncoderConfig allows us to configure the resource encoding process EncoderConfig struct { OnExisting mergeAlg + // Defer is called after the resource is encoded, regardles of the result + Defer func() + // DeferOk is called after the resource is encoded, only when successful + DeferOk func() + // DeferNok is called after the resource is encoded, only when failed + // If you return an error, the encoding will terminate. + // If you return nil (ignore the error), the encoding will continue. + DeferNok func(error) error } // resourceState allows each conforming struct to be initialized and encoded