From 622d19a474ba872a2689e00848b5298ca0e35e83 Mon Sep 17 00:00:00 2001 From: Artyom Lukianov Date: Mon, 29 Apr 2019 15:04:03 +0300 Subject: [PATCH] Vendor controller-runtime from the fork Make possible to call to object List with label selector. We should revert it back to https://github.com/kubernetes-sigs/controller-runtime/tree/release-0.1 once https://github.com/kubernetes-sigs/controller-runtime/pull/410 merged --- Gopkg.lock | 8 ++-- Gopkg.toml | 4 +- .../pkg/cache/internal/cache_reader.go | 30 +++++++------ .../pkg/client/fake/client.go | 27 +++++++++++- .../pkg/internal/objectutil/filter.go | 42 +++++++++++++++++++ 5 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go diff --git a/Gopkg.lock b/Gopkg.lock index aefd3b46e..664f49da5 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1238,7 +1238,8 @@ revision = "66066c83e385e385ccc3c964b44fd7dcd413d0ed" [[projects]] - digest = "1:f9536a0685b75eef97e368e810d124641afc4185d7c619a67e3ac2f5af2fe9a1" + branch = "release-0.1-backport-311" + digest = "1:9d69922a2016ff99548b9cf4ffaa3a838dfb9b9d2ac4af4a1fc0f17b3a896de1" name = "sigs.k8s.io/controller-runtime" packages = [ "pkg/cache", @@ -1252,6 +1253,7 @@ "pkg/handler", "pkg/internal/controller", "pkg/internal/controller/metrics", + "pkg/internal/objectutil", "pkg/internal/recorder", "pkg/leaderelection", "pkg/manager", @@ -1272,8 +1274,8 @@ "pkg/webhook/types", ] pruneopts = "NUT" - revision = "12d98582e72927b6cd0123e2b4e819f9341ce62c" - version = "v0.1.10" + revision = "e1ec14f3eef685c574a46202d1d5d4c4e95c82a0" + source = "github.com/ingvagabund/controller-runtime" [[projects]] digest = "1:77a19ea61ca4e01817ad2bc3e91689c5097b4b439668127d1fb5d8b95c3aca03" diff --git a/Gopkg.toml b/Gopkg.toml index bee16e0a4..e34972a68 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -76,8 +76,10 @@ required = [ source = "github.com/openshift/kubernetes-client-go" [[override]] + # TODO: roll back to use https://github.com/kubernetes-sigs/controller-runtime/tree/release-0.1 once https://github.com/kubernetes-sigs/controller-runtime/pull/410 merged name = "sigs.k8s.io/controller-runtime" - version = "v0.1.10" + source = "github.com/ingvagabund/controller-runtime" + branch = "release-0.1-backport-311" [[constraint]] name = "github.com/operator-framework/operator-sdk" diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go index 62a16eb1a..a5bac8038 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/selection" "k8s.io/client-go/tools/cache" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" ) // CacheReader is a CacheReader @@ -115,33 +116,30 @@ func (c *CacheReader) List(_ context.Context, opts *client.ListOptions, out runt labelSel = opts.LabelSelector } - outItems, err := c.getListItems(objs, labelSel) + filteredItems, err := c.filterListItems(objs, labelSel) if err != nil { return err } - return apimeta.SetList(out, outItems) + + return apimeta.SetList(out, filteredItems) } -func (c *CacheReader) getListItems(objs []interface{}, labelSel labels.Selector) ([]runtime.Object, error) { - outItems := make([]runtime.Object, 0, len(objs)) +func (c *CacheReader) filterListItems(objs []interface{}, labelSel labels.Selector) ([]runtime.Object, error) { + runtimeObjs := make([]runtime.Object, 0, len(objs)) for _, item := range objs { obj, isObj := item.(runtime.Object) if !isObj { return nil, fmt.Errorf("cache contained %T, which is not an Object", obj) } - meta, err := apimeta.Accessor(obj) - if err != nil { - return nil, err - } - if labelSel != nil { - lbls := labels.Set(meta.GetLabels()) - if !labelSel.Matches(lbls) { - continue - } - } - outItems = append(outItems, obj.DeepCopyObject()) + runtimeObjs = append(runtimeObjs, obj) } - return outItems, nil + + filteredItems, err := objectutil.FilterWithLabels(runtimeObjs, labelSel) + if err != nil { + return nil, err + } + + return filteredItems, nil } // objectKeyToStorageKey converts an object key to store key. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go index 09055a5ba..1d730940c 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go @@ -24,6 +24,7 @@ import ( "strings" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/scheme" @@ -31,6 +32,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" ) @@ -110,7 +112,30 @@ func (c *fakeClient) List(ctx context.Context, opts *client.ListOptions, list ru } decoder := scheme.Codecs.UniversalDecoder() _, _, err = decoder.Decode(j, nil, list) - return err + if err != nil { + return err + } + + if opts.LabelSelector != nil { + return filterListItems(list, opts.LabelSelector) + } + return nil +} + +func filterListItems(list runtime.Object, labSel labels.Selector) error { + objs, err := meta.ExtractList(list) + if err != nil { + return err + } + filteredObjs, err := objectutil.FilterWithLabels(objs, labSel) + if err != nil { + return err + } + err = meta.SetList(list, filteredObjs) + if err != nil { + return err + } + return nil } func (c *fakeClient) Create(ctx context.Context, obj runtime.Object) error { diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go new file mode 100644 index 000000000..8513846e2 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go @@ -0,0 +1,42 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package objectutil + +import ( + apimeta "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" +) + +// FilterWithLabels returns a copy of the items in objs matching labelSel +func FilterWithLabels(objs []runtime.Object, labelSel labels.Selector) ([]runtime.Object, error) { + outItems := make([]runtime.Object, 0, len(objs)) + for _, obj := range objs { + meta, err := apimeta.Accessor(obj) + if err != nil { + return nil, err + } + if labelSel != nil { + lbls := labels.Set(meta.GetLabels()) + if !labelSel.Matches(lbls) { + continue + } + } + outItems = append(outItems, obj.DeepCopyObject()) + } + return outItems, nil +}