Skip to content

Commit

Permalink
Add testing for get controller
Browse files Browse the repository at this point in the history
  • Loading branch information
Bader Boland committed Oct 6, 2020
1 parent f5c3795 commit 19e848e
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 6 deletions.
5 changes: 5 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
Expand All @@ -46,6 +47,7 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
Expand All @@ -69,6 +71,7 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI=
github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
Expand Down Expand Up @@ -104,6 +107,7 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down Expand Up @@ -240,6 +244,7 @@ k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY=
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
Expand Down
13 changes: 7 additions & 6 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ import (
"github.com/fairwindsops/controller-utils/pkg/log"
)

var objectCache map[string]unstructured.Unstructured
var objectCache map[string]unstructured.Unstructured = make(map[string]unstructured.Unstructured)

func GetTopController(ctx context.Context, dynamicClient *dynamic.Interface, restMapper *meta.RESTMapper, unstructuredObject metav1.Object) (metav1.Object, error) {
func GetTopController(ctx context.Context, dynamicClient dynamic.Interface, restMapper meta.RESTMapper, unstructuredObject metav1.Object) (metav1.Object, error) {
owners := unstructuredObject.GetOwnerReferences()
if len(owners) > 0 {
if len(owners) > 1 {
Expand All @@ -38,7 +38,7 @@ func GetTopController(ctx context.Context, dynamicClient *dynamic.Interface, res
}
abstractObject, ok = objectCache[key]
if !ok {
return unstructuredObject, errors.New("the owner could not be found for this object")
return unstructuredObject, errors.New("the owner could not be found for this object " + key)
}
}
parentObject, err := meta.Accessor(&abstractObject)
Expand All @@ -50,21 +50,22 @@ func GetTopController(ctx context.Context, dynamicClient *dynamic.Interface, res
return unstructuredObject, nil
}

func cacheAllObjectsOfKind(ctx context.Context, apiVersion, kind string, dynamicClient *dynamic.Interface, restMapper *meta.RESTMapper, objectCache map[string]unstructured.Unstructured) error {
func cacheAllObjectsOfKind(ctx context.Context, apiVersion, kind string, dynamicClient dynamic.Interface, restMapper meta.RESTMapper, objectCache map[string]unstructured.Unstructured) error {
fqKind := schema.FromAPIVersionAndKind(apiVersion, kind)
mapping, err := (*restMapper).RESTMapping(fqKind.GroupKind(), fqKind.Version)
mapping, err := restMapper.RESTMapping(fqKind.GroupKind(), fqKind.Version)
if err != nil {
log.GetLogger().V(0).Info("Error retrieving mapping", apiVersion, kind, err)
return err
}

objects, err := (*dynamicClient).Resource(mapping.Resource).Namespace("").List(ctx, kubeAPIMetaV1.ListOptions{})
objects, err := dynamicClient.Resource(mapping.Resource).Namespace("").List(ctx, kubeAPIMetaV1.ListOptions{})
if err != nil {
log.GetLogger().V(0).Info("Error retrieving parent object", mapping.Resource.Version, mapping.Resource.Resource, err)
return err
}
for idx, object := range objects.Items {
key := fmt.Sprintf("%s/%s/%s", object.GetKind(), object.GetNamespace(), object.GetName())

objectCache[key] = objects.Items[idx]
}
return nil
Expand Down
101 changes: 101 additions & 0 deletions pkg/controller/controller_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package controller

import (
"context"
"testing"

testLog "github.com/go-logr/logr/testing"
"github.com/stretchr/testify/assert"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
k8sruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
dynamicFake "k8s.io/client-go/dynamic/fake"

"github.com/fairwindsops/controller-utils/pkg/log"
)

func TestGetTopController(t *testing.T) {
// TODO move to a centralized place
log.SetLogger(testLog.TestLogger{T: t})
dynamic := dynamicFake.NewSimpleDynamicClient(k8sruntime.NewScheme())
gv := schema.GroupVersion{Group: "apps", Version: "v1"}
gvpod := schema.GroupVersion{Group: "", Version: "v1"}
gvk := gv.WithKind("Deployment")
restMapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{gv, gvpod})
restMapper.Add(gvk, meta.RESTScopeNamespace)
gvk = gv.WithKind("ReplicaSet")
restMapper.Add(gvk, meta.RESTScopeNamespace)
gvk = gvpod.WithKind("Pod")
restMapper.Add(gvk, meta.RESTScopeNamespace)
pod := unstructured.Unstructured{
Object: map[string]interface{}{
"kind": "Pod",
"metadata": map[string]interface{}{
"ownerReferences": []interface{}{
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "ReplicaSet",
"name": "rs",
},
},
"name": "poddy",
"namespace": "test",
},
"spec": map[string]interface{}{},
},
}
rs := unstructured.Unstructured{
Object: map[string]interface{}{
"kind": "ReplicaSet",
"metadata": map[string]interface{}{
"ownerReferences": []interface{}{
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"name": "dep",
},
},
"name": "rs",
"namespace": "test",
},
},
}
dep := unstructured.Unstructured{
Object: map[string]interface{}{
"kind": "Deployment",
"metadata": map[string]interface{}{
"name": "dep",
"namespace": "test",
},
},
}
mapping, err := restMapper.RESTMapping(gvpod.WithKind("Pod").GroupKind())
assert.NoError(t, err)
_, err = dynamic.Resource(mapping.Resource).Namespace("test").Create(context.TODO(), &pod, metav1.CreateOptions{})
assert.NoError(t, err)
mapping, err = restMapper.RESTMapping(gv.WithKind("ReplicaSet").GroupKind())
assert.NoError(t, err)
_, err = dynamic.Resource(mapping.Resource).Namespace("test").Create(context.TODO(), &rs, metav1.CreateOptions{})
assert.NoError(t, err)
mapping, err = restMapper.RESTMapping(gv.WithKind("Deployment").GroupKind())
assert.NoError(t, err)
_, err = dynamic.Resource(mapping.Resource).Namespace("test").Create(context.TODO(), &dep, metav1.CreateOptions{})
assert.NoError(t, err)
podObj, err := meta.Accessor(&pod)
assert.NoError(t, err)
controller, err := GetTopController(context.TODO(), dynamic, restMapper, podObj)
assert.NoError(t, err)
assert.Equal(t, "dep", controller.GetName())
rsObj, err := meta.Accessor(&rs)
assert.NoError(t, err)
controller, err = GetTopController(context.TODO(), dynamic, restMapper, rsObj)
assert.NoError(t, err)
assert.Equal(t, "dep", controller.GetName())
depObj, err := meta.Accessor(&dep)
assert.NoError(t, err)
controller, err = GetTopController(context.TODO(), dynamic, restMapper, depObj)
assert.NoError(t, err)
assert.Equal(t, "dep", controller.GetName())
}

0 comments on commit 19e848e

Please sign in to comment.