From 6fd1ff2fb0bb481d3a5fbd7382842cdff244e42a Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Tue, 17 Sep 2019 17:52:28 +0200 Subject: [PATCH] Require exact match when calling Get method within fake clientset `Get` method within the fake clientset returns an object that would not be normally returned when using the real clientset. Reproducer: ```go package main import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" ) func main () { cm := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: "cm"}, } client := fake.NewSimpleClientset(cm) obj, err := client.CoreV1().ConfigMaps("").Get("", metav1.GetOptions{}) if err != nil { panic(err) } fmt.Printf("obj: %#v\n", obj) } ``` stored under `test.go` of `github.com/kubernetes/kubernetes` (master HEAD) root directory and ran: ```sh $ go run test.go obj: &v1.ConfigMap{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"cm", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, Data:map[string]string(nil), BinaryData:map[string][]uint8(nil)} ``` As you can see fake clientset with a "test" configmap is created. When getting the object through the clientset back, I intentionally set the object name to an empty string. I would expect to get an error saying config map "" was not found. However, I get "test" configmap instead. Reason for that is inside implementation of `filterByNamespaceAndName` private function: ```go func filterByNamespaceAndName(objs []runtime.Object, ns, name string) ([]runtime.Object, error) { var res []runtime.Object for _, obj := range objs { acc, err := meta.Accessor(obj) if err != nil { return nil, err } if ns != "" && acc.GetNamespace() != ns { continue } if name != "" && acc.GetName() != name { continue } res = append(res, obj) } return res, nil } ``` When `name` is empty, `name != "" && acc.GetName() != name` condition is false and thus `obj` is consider as a fit. [1] https://github.com/kubernetes/client-go/blob/master/testing/fixture.go#L481-L493 Kubernetes-commit: d32c76fc03381784516c47cb1bf62ef932189afa --- pkg/describe/versioned/describe_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/describe/versioned/describe_test.go b/pkg/describe/versioned/describe_test.go index 6204a66f..f14a7519 100644 --- a/pkg/describe/versioned/describe_test.go +++ b/pkg/describe/versioned/describe_test.go @@ -3133,7 +3133,7 @@ Spec: }, }) d := NetworkPolicyDescriber{versionedFake} - out, err := d.Describe("", "network-policy-1", describe.DescriberSettings{}) + out, err := d.Describe("default", "network-policy-1", describe.DescriberSettings{}) if err != nil { t.Errorf("unexpected error: %s", err) }