Skip to content

Commit 34d6ded

Browse files
Use patch helper to remove fields with patch
Signed-off-by: Danil-Grigorev <danil.grigorev@suse.com>
1 parent b5d6a60 commit 34d6ded

File tree

6 files changed

+24
-19
lines changed

6 files changed

+24
-19
lines changed

internal/sync/client.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ import (
2020
"context"
2121
"fmt"
2222

23-
apierrors "k8s.io/apimachinery/pkg/api/errors"
2423
"sigs.k8s.io/controller-runtime/pkg/client"
2524
"sigs.k8s.io/controller-runtime/pkg/log"
25+
26+
"sigs.k8s.io/cluster-api/util/patch"
2627
)
2728

2829
const fieldOwner = "capi-provider-operator"
@@ -39,28 +40,20 @@ func setKind(cl client.Client, obj client.Object) error {
3940
}
4041

4142
// Patch will only patch mirror object in the cluster.
42-
func Patch(ctx context.Context, cl client.Client, obj client.Object, options ...client.PatchOption) error {
43+
func Patch(ctx context.Context, cl client.Client, helper *patch.Helper, obj client.Object) error {
4344
log := log.FromContext(ctx)
4445

45-
obj.SetManagedFields(nil)
46-
4746
if err := setKind(cl, obj); err != nil {
4847
return err
4948
}
5049

5150
log.Info(fmt.Sprintf("Updating %s: %s", obj.GetObjectKind().GroupVersionKind().Kind, client.ObjectKeyFromObject(obj)))
5251

53-
patchOptions := []client.PatchOption{
54-
client.FieldOwner(fieldOwner),
55-
}
56-
patchOptions = append(patchOptions, options...)
57-
58-
err := cl.Patch(ctx, obj, client.Merge, patchOptions...)
59-
if apierrors.IsNotFound(err) {
52+
if helper == nil {
6053
return cl.Create(ctx, obj, []client.CreateOption{client.FieldOwner(fieldOwner)}...)
6154
}
6255

63-
return err
56+
return helper.Patch(ctx, obj)
6457
}
6558

6659
// PatchStatus will only patch the status subresource of the provided object.

internal/sync/client_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/rancher/turtles/internal/sync"
2424
corev1 "k8s.io/api/core/v1"
2525

26+
"sigs.k8s.io/cluster-api/util/patch"
2627
. "sigs.k8s.io/controller-runtime/pkg/envtest/komega"
2728

2829
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -67,10 +68,13 @@ var _ = Describe("Core provider", func() {
6768
})
6869

6970
It("Regular patch only updates the spec of the resource", func() {
71+
helper, err := patch.NewHelper(capiProvider, testEnv.Client)
72+
Expect(err).ToNot(HaveOccurred())
73+
7074
capiProvider.Spec.Name = "rke2"
7175
capiProvider.Status.Phase = turtlesv1.Ready
7276

73-
Expect(sync.Patch(ctx, testEnv, capiProvider)).To(Succeed())
77+
Expect(sync.Patch(ctx, testEnv, helper, capiProvider)).To(Succeed())
7478
Eventually(Object(capiProvider)).Should(HaveField("Spec.Name", Equal("rke2")))
7579
Eventually(Object(capiProvider)).Should(HaveField("Status.Phase", Equal(turtlesv1.Pending)))
7680
})

internal/sync/core.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
"sigs.k8s.io/controller-runtime/pkg/client"
2727
"sigs.k8s.io/controller-runtime/pkg/log"
2828

29+
"sigs.k8s.io/cluster-api/util/patch"
30+
2931
turtlesv1 "github.com/rancher/turtles/api/v1alpha1"
3032
)
3133

@@ -34,6 +36,7 @@ type DefaultSynchronizer struct {
3436
client client.Client
3537
Source *turtlesv1.CAPIProvider
3638
Destination client.Object
39+
patcher *patch.Helper
3740
}
3841

3942
// NewDefaultSynchronizer returns a new instance of DefaultSynchronizer.
@@ -52,20 +55,25 @@ func (s *DefaultSynchronizer) Get(ctx context.Context) error {
5255
objKey := client.ObjectKeyFromObject(s.Destination)
5356
if err := s.client.Get(ctx, objKey, s.Destination); client.IgnoreNotFound(err) != nil {
5457
log.Error(err, "Unable to get mirrored manifest: "+objKey.String())
58+
} else if err == nil {
59+
s.patcher, err = patch.NewHelper(s.Destination, s.client)
60+
if err != nil {
61+
return err
62+
}
5563
}
5664

5765
return nil
5866
}
5967

6068
// Apply applies the destination object to the cluster.
61-
func (s *DefaultSynchronizer) Apply(ctx context.Context, reterr *error, options ...client.PatchOption) {
69+
func (s *DefaultSynchronizer) Apply(ctx context.Context, reterr *error) {
6270
log := log.FromContext(ctx)
6371
uid := s.Destination.GetUID()
6472

6573
setFinalizers(s.Destination)
6674
setOwnerReference(s.Source, s.Destination)
6775

68-
if err := Patch(ctx, s.client, s.Destination, options...); err != nil {
76+
if err := Patch(ctx, s.client, s.patcher, s.Destination); err != nil {
6977
*reterr = kerrors.NewAggregate([]error{*reterr, err})
7078
log.Error(*reterr, fmt.Sprintf("Unable to patch object: %s", *reterr))
7179
}

internal/sync/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type Sync interface {
3131
Template(source *turtlesv1.CAPIProvider) client.Object
3232
Get(ctx context.Context) error
3333
Sync(ctx context.Context) error
34-
Apply(ctx context.Context, reterr *error, options ...client.PatchOption)
34+
Apply(ctx context.Context, reterr *error)
3535
}
3636

3737
// List contains a list of syncers to apply the syncing logic.

internal/sync/interface_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (m *MockSynchronizer) Sync(ctx context.Context) error {
4242
return m.syncronizerr
4343
}
4444

45-
func (m *MockSynchronizer) Apply(ctx context.Context, reterr *error, options ...client.PatchOption) {
45+
func (m *MockSynchronizer) Apply(ctx context.Context, reterr *error) {
4646
*reterr = m.applyErr
4747
}
4848

internal/sync/secret_mapper_sync.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,8 @@ func (s *SecretMapperSync) Sync(ctx context.Context) error {
318318

319319
// Apply performs SSA patch of the secret mapper resources, using different FieldOwner from default
320320
// to avoid collisions with patches performed by variable syncer on the same secret resource.
321-
func (s *SecretMapperSync) Apply(ctx context.Context, reterr *error, options ...client.PatchOption) {
322-
s.DefaultSynchronizer.Apply(ctx, reterr, append(options, client.FieldOwner("secret-mapper-sync"))...)
321+
func (s *SecretMapperSync) Apply(ctx context.Context, reterr *error) {
322+
s.DefaultSynchronizer.Apply(ctx, reterr)
323323
}
324324

325325
// Into maps the secret keys from source secret data according to credentials map.

0 commit comments

Comments
 (0)