From 7bcd5294126fc79063ce3d9dbdf28a70aeaeb1a5 Mon Sep 17 00:00:00 2001 From: Yi Tao Date: Tue, 14 Feb 2023 18:30:11 +0800 Subject: [PATCH] address comments Again --- internal/dataplane/kong_client.go | 20 ++++++++++++-------- internal/konnect/node_agent.go | 14 +++++++++----- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/internal/dataplane/kong_client.go b/internal/dataplane/kong_client.go index 7554bf99c8..cbe96b17b8 100644 --- a/internal/dataplane/kong_client.go +++ b/internal/dataplane/kong_client.go @@ -413,19 +413,12 @@ func (c *KongClient) Update(ctx context.Context) error { formatVersion = "3.0" } - configStatus := new(ConfigStatus) - *configStatus = ConfigStatusOK - defer func(status *ConfigStatus) { - c.configStatusNotifier.NotifyConfigStatus(*status) - }(configStatus) - // parse the Kubernetes objects from the storer into Kong configuration kongstate, translationFailures := p.Build() if failuresCount := len(translationFailures); failuresCount > 0 { c.prometheusMetrics.RecordTranslationFailure() c.recordResourceFailureEvents(translationFailures, KongConfigurationTranslationFailedEventReason) c.logger.Debugf("%d translation failures have occurred when building data-plane configuration", failuresCount) - *configStatus = ConfigStatusTranslationErrorHappened } else { c.prometheusMetrics.RecordTranslationSuccess() c.logger.Debug("successfully built data-plane configuration") @@ -433,10 +426,19 @@ func (c *KongClient) Update(ctx context.Context) error { shas, err := c.sendOutToClients(ctx, kongstate, formatVersion, c.kongConfig) if err != nil { - *configStatus = ConfigStatusApplyFailed + c.configStatusNotifier.NotifyConfigStatus(ConfigStatusApplyFailed) return err } + // secceeded to apply configuration to Kong gateway. + // notify the receiver of config status that translation error happened when there are translation errors, + // otherwise notify that config status is OK. + if len(translationFailures) > 0 { + c.configStatusNotifier.NotifyConfigStatus(ConfigStatusTranslationErrorHappened) + } else { + c.configStatusNotifier.NotifyConfigStatus(ConfigStatusOK) + } + // report on configured Kubernetes objects if enabled if c.AreKubernetesObjectReportsEnabled() { // if the configuration SHAs that have just been pushed are different than @@ -535,6 +537,8 @@ func handleSendToClientResult(client sendconfig.KonnectAwareClient, logger logru return newSHA, nil } +// SetConfigStatusNotifier sets a notifier notifies configurations to subscribers +// Currently it is used for uploading the node status to konnect runtime group. func (c *KongClient) SetConfigStatusNotifier(n ConfigStatusNotifier) { c.lock.Lock() defer c.lock.Unlock() diff --git a/internal/konnect/node_agent.go b/internal/konnect/node_agent.go index aa306d9949..6898f3a401 100644 --- a/internal/konnect/node_agent.go +++ b/internal/konnect/node_agent.go @@ -3,6 +3,7 @@ package konnect import ( "context" "fmt" + "sync/atomic" "time" "github.com/go-logr/logr" @@ -27,7 +28,7 @@ type NodeAgent struct { konnectClient *NodeAPIClient refreshPeriod time.Duration - configStatus dataplane.ConfigStatus + configStatus atomic.Uint32 configStatusSubscriber dataplane.ConfigStatusSubscriber } @@ -42,16 +43,17 @@ func NewNodeAgent( if refreshPeriod < MinRefreshNodePeriod { refreshPeriod = MinRefreshNodePeriod } - return &NodeAgent{ + a := &NodeAgent{ Hostname: hostname, Version: version, Logger: logger. WithName("konnect-node").WithValues("runtime_group_id", client.RuntimeGroupID), konnectClient: client, refreshPeriod: refreshPeriod, - configStatus: dataplane.ConfigStatusOK, configStatusSubscriber: configStatusSubscriber, } + a.configStatus.Store(uint32(dataplane.ConfigStatusOK)) + return a } func (a *NodeAgent) createNode() error { @@ -112,7 +114,8 @@ func (a *NodeAgent) subscribeConfigStatus(ctx context.Context) { err := ctx.Err() a.Logger.Info("subscribe loop stopped", "message", err.Error()) return - case a.configStatus = <-a.configStatusSubscriber.SubscribeConfigStatus(): + case configStatus := <-a.configStatusSubscriber.SubscribeConfigStatus(): + a.configStatus.Store(uint32(configStatus)) } } } @@ -125,7 +128,8 @@ func (a *NodeAgent) updateNode() error { } var ingressControllerStatus IngressControllerState - switch a.configStatus { + configStatus := int(a.configStatus.Load()) + switch dataplane.ConfigStatus(configStatus) { case dataplane.ConfigStatusOK: ingressControllerStatus = IngressControllerStateOperational case dataplane.ConfigStatusTranslationErrorHappened: