Skip to content

Fake client does not preserve TypeMeta for PartialObjectMetadata after request #2923

Closed
@dimityrmirchev

Description

@dimityrmirchev

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugCategorizes issue or PR as related to a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions