diff --git a/cli/ingress-controller/flags.go b/cli/ingress-controller/flags.go index fa90ce07d3..ec2c789a6f 100644 --- a/cli/ingress-controller/flags.go +++ b/cli/ingress-controller/flags.go @@ -63,9 +63,10 @@ type cliConfig struct { UpdateStatus bool UpdateStatusOnShutdown bool - // Rutnime behavior - SyncPeriod time.Duration - SyncRateLimit float32 + // Runtime behavior + SyncPeriod time.Duration + SyncRateLimit float32 + EnableReverseSync bool // k8s connection details APIServerHost string @@ -182,6 +183,7 @@ IP/hostname when the controller is being stopped.`) `Relist and confirm cloud resources this often.`) flags.Float32("sync-rate-limit", 0.3, `Define the sync frequency upper limit`) + flag.Bool("enable-reverse-sync", false, `Enable reverse checks from Kong to Kubernetes`) // k8s connection details flags.String("apiserver-host", "", @@ -293,6 +295,7 @@ func parseFlags() (cliConfig, error) { // Rutnime behavior config.SyncPeriod = viper.GetDuration("sync-period") config.SyncRateLimit = (float32)(viper.GetFloat64("sync-rate-limit")) + config.EnableReverseSync = viper.GetBool("enable-reverse-sync") // k8s connection details config.APIServerHost = viper.GetString("apiserver-host") diff --git a/cli/ingress-controller/main.go b/cli/ingress-controller/main.go index bbbb90690e..ccedad7fc4 100644 --- a/cli/ingress-controller/main.go +++ b/cli/ingress-controller/main.go @@ -69,8 +69,9 @@ func controllerConfigFromCLIConfig(cliConfig cliConfig) controller.Configuration Concurrency: cliConfig.KongAdminConcurrency, }, - ResyncPeriod: cliConfig.SyncPeriod, - SyncRateLimit: cliConfig.SyncRateLimit, + ResyncPeriod: cliConfig.SyncPeriod, + SyncRateLimit: cliConfig.SyncRateLimit, + EnableReverseSync: cliConfig.EnableReverseSync, Namespace: cliConfig.WatchNamespace, diff --git a/internal/ingress/controller/controller.go b/internal/ingress/controller/controller.go index 54cf781721..e515a7581f 100644 --- a/internal/ingress/controller/controller.go +++ b/internal/ingress/controller/controller.go @@ -72,8 +72,9 @@ type Configuration struct { KongConfigClient configurationClientSet.Interface KnativeClient knativeClientSet.Interface - ResyncPeriod time.Duration - SyncRateLimit float32 + ResyncPeriod time.Duration + SyncRateLimit float32 + EnableReverseSync bool Namespace string @@ -219,7 +220,7 @@ type KongController struct { // backgroundGroup tracks running background goroutines, on which we'll wait to stop in Stop. backgroundGroup errgroup.Group - runningConfigHash [32]byte + runningConfigHash []byte isShuttingDown uint32 diff --git a/internal/ingress/controller/kong.go b/internal/ingress/controller/kong.go index 6d091e8c9d..9e808c5c5d 100644 --- a/internal/ingress/controller/kong.go +++ b/internal/ingress/controller/kong.go @@ -47,26 +47,39 @@ func (n *KongController) OnUpdate(state *parser.KongState) error { return err } - jsonConfig, err := json.Marshal(targetContent) - if err != nil { - return errors.Wrap(err, - "marshaling Kong declarative configuration to JSON") - } - shaSum := sha256.Sum256(jsonConfig) - if reflect.DeepEqual(n.runningConfigHash, shaSum) { - glog.Info("no configuration change, skipping sync to Kong") - return nil + var shaSum []byte + // disable optimization if reverse sync is enabled + if !n.cfg.EnableReverseSync { + shaSum, err = generateSHA(targetContent) + if err != nil { + return err + } + if reflect.DeepEqual(n.runningConfigHash, shaSum) { + glog.Info("no configuration change, skipping sync to Kong") + return nil + } } if n.cfg.InMemory { err = n.onUpdateInMemoryMode(targetContent) } else { err = n.onUpdateDBMode(targetContent) } - if err == nil { - glog.Info("successfully synced configuration to Kong") - n.runningConfigHash = shaSum + if err != nil { + return err + } + n.runningConfigHash = shaSum + glog.Info("successfully synced configuration to Kong") + return nil +} + +func generateSHA(targetContent *file.Content) ([]byte, error) { + jsonConfig, err := json.Marshal(targetContent) + if err != nil { + return nil, errors.Wrap(err, + "marshaling Kong declarative configuration to JSON") } - return err + shaSum := sha256.Sum256(jsonConfig) + return shaSum[:], nil } func cleanUpNullsInPluginConfigs(state *file.Content) {