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)) }