From 9a59e9ac280f41e4b2d27d4a7c885041734556c6 Mon Sep 17 00:00:00 2001 From: Alexander Matyushentsev Date: Fri, 9 Aug 2019 10:05:54 -0700 Subject: [PATCH] Issue #2060 - Enpoint incorrectly considered top level managed resource (#2129) --- controller/cache/cluster.go | 8 ++++++++ controller/cache/cluster_test.go | 2 ++ controller/cache/node.go | 13 ++++++++----- controller/cache/node_test.go | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/controller/cache/cluster.go b/controller/cache/cluster.go index c887e8c75b..08ee377782 100644 --- a/controller/cache/cluster.go +++ b/controller/cache/cluster.go @@ -87,6 +87,14 @@ func (c *clusterInfo) replaceResourceCache(gk schema.GroupKind, resourceVersion func (c *clusterInfo) createObjInfo(un *unstructured.Unstructured, appInstanceLabel string) *node { ownerRefs := un.GetOwnerReferences() + // Special case for endpoint. Remove after https://github.com/kubernetes/kubernetes/issues/28483 is fixed + if un.GroupVersionKind().Group == "" && un.GetKind() == kube.EndpointsKind && len(un.GetOwnerReferences()) == 0 { + ownerRefs = append(ownerRefs, metav1.OwnerReference{ + Name: un.GetName(), + Kind: kube.ServiceKind, + APIVersion: "v1", + }) + } nodeInfo := &node{ resourceVersion: un.GetResourceVersion(), ref: kube.GetObjectRef(un), diff --git a/controller/cache/cluster_test.go b/controller/cache/cluster_test.go index f9bed600e6..122d1fe5b2 100644 --- a/controller/cache/cluster_test.go +++ b/controller/cache/cluster_test.go @@ -87,6 +87,7 @@ var ( name: helm-guestbook namespace: default resourceVersion: "123" + uid: "4" spec: selector: app: guestbook @@ -102,6 +103,7 @@ var ( metadata: name: helm-guestbook namespace: default + uid: "4" spec: backend: serviceName: not-found-service diff --git a/controller/cache/node.go b/controller/cache/node.go index 56b709cfc4..3998143454 100644 --- a/controller/cache/node.go +++ b/controller/cache/node.go @@ -35,12 +35,15 @@ func (n *node) resourceKey() kube.ResourceKey { } func (n *node) isParentOf(child *node) bool { - // Special case for endpoint. Remove after https://github.com/kubernetes/kubernetes/issues/28483 is fixed - if len(child.ownerRefs) == 0 && child.ref.APIVersion == "v1" && child.ref.Kind == kube.EndpointsKind && n.ref.APIVersion == "v1" && n.ref.Kind == kube.ServiceKind && n.ref.Name == child.ref.Name { - child.ownerRefs = []metav1.OwnerReference{{Name: n.ref.Name, Kind: n.ref.Kind, APIVersion: n.ref.APIVersion, UID: n.ref.UID}} - } + for i, ownerRef := range child.ownerRefs { + + // backfill UID of inferred owner child references + if ownerRef.UID == "" && n.ref.Kind == ownerRef.Kind && n.ref.APIVersion == ownerRef.APIVersion && n.ref.Name == ownerRef.Name { + ownerRef.UID = n.ref.UID + child.ownerRefs[i] = ownerRef + return true + } - for _, ownerRef := range child.ownerRefs { if n.ref.UID == ownerRef.UID { return true } diff --git a/controller/cache/node_test.go b/controller/cache/node_test.go index 67a6d268eb..a38781f5a8 100644 --- a/controller/cache/node_test.go +++ b/controller/cache/node_test.go @@ -51,5 +51,6 @@ metadata: parent := c.createObjInfo(testService, "") assert.True(t, parent.isParentOf(matchingNameEndPoint)) + assert.Equal(t, parent.ref.UID, matchingNameEndPoint.ownerRefs[0].UID) assert.False(t, parent.isParentOf(nonMatchingNameEndPoint)) }