Closed
Description
Hi folks,
I have code that uses PartialObjectMetadata
to potentially send two patch requests for one specific object. The second request fails when using the fake client in test suite because after the first Patch
the object loses its TypeMeta
even though it was explicitly set. The same requests succeed when ran through the regular client. I managed to reproduce in a minimal test and it seems that the same is true at least for Get
requests as well. Here is a reproducer:
package tt_test
import (
"context"
"testing"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)
func TestGetPreserveTypeMeta(t *testing.T) {
var (
fakeClient client.Client = fake.NewClientBuilder().WithScheme(scheme.Scheme).Build()
ctx = context.TODO()
)
partialObjMeta := &metav1.PartialObjectMetadata{
ObjectMeta: metav1.ObjectMeta{
Name: "foo",
Namespace: "bar",
},
}
partialObjMeta.SetGroupVersionKind(corev1.SchemeGroupVersion.WithKind("Secret"))
err := fakeClient.Create(ctx, &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "foo",
Namespace: "bar",
Labels: map[string]string{
"one": "two",
},
},
})
if err != nil {
t.Errorf("create was not successful: %v", err)
}
err = fakeClient.Get(ctx, client.ObjectKeyFromObject(partialObjMeta), partialObjMeta)
if err != nil {
t.Errorf("get was not successful: %v", err)
}
if partialObjMeta.Kind != "Secret" {
t.Errorf("got kind: %s, want Secret", partialObjMeta.Kind)
}
}
I am not sure if this is intended behaviour but I would expect that partialObjMeta.Kind == "Secret"
at the end of the test.