func TestFilteredBy(t *testing.T) { all := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { return true }) none := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { return false }) onlyV2 := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { return strings.HasSuffix(gv, "/v2") || gv == "v2" }) onlyBar := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { return r.Kind == "Bar" }) foo := []*metav1.APIResourceList{ { GroupVersion: "foo/v1", APIResources: []metav1.APIResource{ {Name: "bar", Kind: "Bar"}, {Name: "test", Kind: "Test"}, }, }, { GroupVersion: "foo/v2", APIResources: []metav1.APIResource{ {Name: "bar", Kind: "Bar"}, {Name: "test", Kind: "Test"}, }, }, { GroupVersion: "foo/v3", APIResources: []metav1.APIResource{}, }, } tests := []struct { input []*metav1.APIResourceList pred discovery.ResourcePredicate expectedResources []string }{ {nil, all, []string{}}, {[]*metav1.APIResourceList{ {GroupVersion: "foo/v1"}, }, all, []string{}}, {foo, all, []string{"foo/v1.bar", "foo/v1.test", "foo/v2.bar", "foo/v2.test"}}, {foo, onlyV2, []string{"foo/v2.bar", "foo/v2.test"}}, {foo, onlyBar, []string{"foo/v1.bar", "foo/v2.bar"}}, {foo, none, []string{}}, } for i, test := range tests { filtered := discovery.FilteredBy(test.pred, test.input) if expected, got := sets.NewString(test.expectedResources...), sets.NewString(stringify(filtered)...); !expected.Equal(got) { t.Errorf("[%d] unexpected group versions: expected=%v, got=%v", i, test.expectedResources, stringify(filtered)) } } }
// TODO turn this into reusable method checking available resources func contains(resourcesList []*metav1.APIResourceList, resource schema.GroupVersionResource) bool { resources := discovery.FilteredBy(discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { return resource.GroupVersion().String() == gv && resource.Resource == r.Name }), resourcesList) return len(resources) != 0 }