From 8b71781c350b2ecb9fdec3396292dfe437f63ffd Mon Sep 17 00:00:00 2001 From: Jorres Tarasov Date: Wed, 7 May 2025 14:29:00 +0200 Subject: [PATCH 1/3] fix: operatorSync --- api/v1alpha1/storage_webhook.go | 38 +++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/api/v1alpha1/storage_webhook.go b/api/v1alpha1/storage_webhook.go index d6be5085..3ef37227 100644 --- a/api/v1alpha1/storage_webhook.go +++ b/api/v1alpha1/storage_webhook.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/rand" + "reflect" "github.com/golang-jwt/jwt/v4" "github.com/google/go-cmp/cmp" @@ -116,10 +117,6 @@ func (r *StorageDefaulter) Default(ctx context.Context, obj runtime.Object) erro storage := obj.(*Storage) storagelog.Info("default", "name", storage.Name) - if !storage.Spec.OperatorSync { - return nil - } - if storage.Spec.OperatorConnection != nil { if storage.Spec.OperatorConnection.Oauth2TokenExchange != nil { if storage.Spec.OperatorConnection.Oauth2TokenExchange.SignAlg == "" { @@ -311,9 +308,38 @@ func hasUpdatesBesidesFrozen(oldStorage, newStorage *Storage) (bool, string) { oldStorageCopy.Spec.OperatorSync = false newStorageCopy.Spec.OperatorSync = false - ignoreNonSpecFields := cmpopts.IgnoreFields(Storage{}, "Status", "ObjectMeta", "TypeMeta") + // We will allow configuration diffs if they are limited to + // formatting, order of keys in the map etc. If two maps are + // meaningfully different (not deep-equal), we still disallow + // the diff of course. + configurationCompareOpt := cmp.FilterPath( + func(path cmp.Path) bool { + if sf, ok := path.Last().(cmp.StructField); ok { + return sf.Name() == "Configuration" + } + return false + }, + cmp.Comparer(func(a, b string) bool { + var o1, o2 any - diff := cmp.Diff(oldStorageCopy, newStorageCopy, ignoreNonSpecFields) + if err := yaml.Unmarshal([]byte(a), &o1); err != nil { + return false + } + if err := yaml.Unmarshal([]byte(b), &o2); err != nil { + return false + } + + return reflect.DeepEqual(o1, o2) + }), + ) + + ignoreNonSpecFields := cmpopts.IgnoreFields(Storage{}, "Status", "ObjectMeta", "TypeMeta") + diff := cmp.Diff( + oldStorageCopy, + newStorageCopy, + ignoreNonSpecFields, + configurationCompareOpt, + ) return diff != "", diff } From 186f7e04dbe007e92fb27dc65e7599716c260ebc Mon Sep 17 00:00:00 2001 From: Jorres Tarasov Date: Wed, 7 May 2025 17:11:51 +0200 Subject: [PATCH 2/3] wip --- api/v1alpha1/storage_webhook.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/api/v1alpha1/storage_webhook.go b/api/v1alpha1/storage_webhook.go index 3ef37227..119c15a2 100644 --- a/api/v1alpha1/storage_webhook.go +++ b/api/v1alpha1/storage_webhook.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "math/rand" - "reflect" "github.com/golang-jwt/jwt/v4" "github.com/google/go-cmp/cmp" @@ -117,6 +116,10 @@ func (r *StorageDefaulter) Default(ctx context.Context, obj runtime.Object) erro storage := obj.(*Storage) storagelog.Info("default", "name", storage.Name) + if !storage.Spec.OperatorSync { + return nil + } + if storage.Spec.OperatorConnection != nil { if storage.Spec.OperatorConnection.Oauth2TokenExchange != nil { if storage.Spec.OperatorConnection.Oauth2TokenExchange.SignAlg == "" { @@ -329,7 +332,12 @@ func hasUpdatesBesidesFrozen(oldStorage, newStorage *Storage) (bool, string) { return false } - return reflect.DeepEqual(o1, o2) + diff := cmp.Diff(o1, o2) + if diff != "" { + storagelog.Info(fmt.Sprintf("Configurations are different:\n%v\n%v", o1, o2)) + } + + return diff == "" }), ) From fb87254453da66c9b8b206e243c9baba4b5dbff2 Mon Sep 17 00:00:00 2001 From: Jorres Tarasov Date: Wed, 7 May 2025 17:59:23 +0200 Subject: [PATCH 3/3] wip --- api/v1alpha1/storage_webhook.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/api/v1alpha1/storage_webhook.go b/api/v1alpha1/storage_webhook.go index 119c15a2..816f4ba4 100644 --- a/api/v1alpha1/storage_webhook.go +++ b/api/v1alpha1/storage_webhook.go @@ -116,10 +116,6 @@ func (r *StorageDefaulter) Default(ctx context.Context, obj runtime.Object) erro storage := obj.(*Storage) storagelog.Info("default", "name", storage.Name) - if !storage.Spec.OperatorSync { - return nil - } - if storage.Spec.OperatorConnection != nil { if storage.Spec.OperatorConnection.Oauth2TokenExchange != nil { if storage.Spec.OperatorConnection.Oauth2TokenExchange.SignAlg == "" {