From 86f6b657e27fdbf89b9e0a2e082d3df946ef6e68 Mon Sep 17 00:00:00 2001 From: Alexander Matyushentsev Date: Thu, 4 Apr 2019 17:52:30 -0700 Subject: [PATCH] Issue #1374 - Add k8s objects circular dependency protection to getApp method (#1379) --- controller/cache/cluster_test.go | 5 +++++ controller/cache/node.go | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/controller/cache/cluster_test.go b/controller/cache/cluster_test.go index d66a51a45b..a33d0e3abd 100644 --- a/controller/cache/cluster_test.go +++ b/controller/cache/cluster_test.go @@ -375,6 +375,11 @@ func TestCircularReference(t *testing.T) { children := getChildren(cluster, dep) assert.Len(t, children, 2) + + node := cluster.nodes[kube.GetResourceKey(dep)] + assert.NotNil(t, node) + app := node.getApp(cluster.nodes) + assert.Equal(t, "", app) } func TestWatchCacheUpdated(t *testing.T) { diff --git a/controller/cache/node.go b/controller/cache/node.go index bb347b92e4..eef5b1c4f8 100644 --- a/controller/cache/node.go +++ b/controller/cache/node.go @@ -53,13 +53,24 @@ func ownerRefGV(ownerRef metav1.OwnerReference) schema.GroupVersion { } func (n *node) getApp(ns map[kube.ResourceKey]*node) string { + return n.getAppRecursive(ns, map[kube.ResourceKey]bool{}) +} + +func (n *node) getAppRecursive(ns map[kube.ResourceKey]*node, visited map[kube.ResourceKey]bool) string { + if !visited[n.resourceKey()] { + visited[n.resourceKey()] = true + } else { + log.Warnf("Circular dependency detected: %v.", visited) + return n.appName + } + if n.appName != "" { return n.appName } for _, ownerRef := range n.ownerRefs { gv := ownerRefGV(ownerRef) if parent, ok := ns[kube.NewResourceKey(gv.Group, ownerRef.Kind, n.ref.Namespace, ownerRef.Name)]; ok { - app := parent.getApp(ns) + app := parent.getAppRecursive(ns, visited) if app != "" { return app }