Update vendor

This commit is contained in:
Darren Shepherd 2020-03-21 07:52:11 -07:00
parent 4c13c6bd95
commit 7395e5b8c4
28 changed files with 373 additions and 81 deletions

4
go.mod
View File

@ -12,8 +12,8 @@ require (
github.com/json-iterator/go v1.1.9 // indirect github.com/json-iterator/go v1.1.9 // indirect
github.com/pkg/errors v0.8.1 github.com/pkg/errors v0.8.1
github.com/rancher/dynamiclistener v0.2.1-0.20200213165308-111c5b43e932 github.com/rancher/dynamiclistener v0.2.1-0.20200213165308-111c5b43e932
github.com/rancher/wrangler v0.5.1-0.20200312201919-371ff2551072 github.com/rancher/wrangler v0.5.1
github.com/rancher/wrangler-api v0.4.1 github.com/rancher/wrangler-api v0.5.0
github.com/sirupsen/logrus v1.4.2 github.com/sirupsen/logrus v1.4.2
github.com/stretchr/testify v1.4.0 github.com/stretchr/testify v1.4.0
github.com/urfave/cli v1.22.2 github.com/urfave/cli v1.22.2

11
go.sum
View File

@ -402,13 +402,12 @@ github.com/rancher/dynamiclistener v0.2.1-0.20200213165308-111c5b43e932 h1:W+guy
github.com/rancher/dynamiclistener v0.2.1-0.20200213165308-111c5b43e932/go.mod h1:9WusTANoiRr8cDWCTtf5txieulezHbpv4vhLADPp0zU= github.com/rancher/dynamiclistener v0.2.1-0.20200213165308-111c5b43e932/go.mod h1:9WusTANoiRr8cDWCTtf5txieulezHbpv4vhLADPp0zU=
github.com/rancher/wrangler v0.1.4 h1:bdzBw4H9JKQhXPBPNp4eHbmrkA24+VII865VLiVWcw8= github.com/rancher/wrangler v0.1.4 h1:bdzBw4H9JKQhXPBPNp4eHbmrkA24+VII865VLiVWcw8=
github.com/rancher/wrangler v0.1.4/go.mod h1:EYP7cqpg42YqElaCm+U9ieSrGQKAXxUH5xsr+XGpWyE= github.com/rancher/wrangler v0.1.4/go.mod h1:EYP7cqpg42YqElaCm+U9ieSrGQKAXxUH5xsr+XGpWyE=
github.com/rancher/wrangler v0.4.0 h1:iLvuJcZkd38E3RGG74dFMMNEju0PeTzfT1PQiv5okVU= github.com/rancher/wrangler v0.5.0/go.mod h1:txHSBkPtVgNH/0pUCvdP0Ak0HptAOc9ffBmFxQnL4z4=
github.com/rancher/wrangler v0.4.0/go.mod h1:1cR91WLhZgkZ+U4fV9nVuXqKurWbgXcIReU4wnQvTN8= github.com/rancher/wrangler v0.5.1 h1:1H3jnVjpXzOxzuYPcn7PJ60KXGkaC0iWMhVqHliwfcQ=
github.com/rancher/wrangler v0.5.1-0.20200312201919-371ff2551072 h1:QkoQGlzVB9LasBERP+RQ/BC+3ANtjn9Qlc2+PpwFrYc= github.com/rancher/wrangler v0.5.1/go.mod h1:txHSBkPtVgNH/0pUCvdP0Ak0HptAOc9ffBmFxQnL4z4=
github.com/rancher/wrangler v0.5.1-0.20200312201919-371ff2551072/go.mod h1:txHSBkPtVgNH/0pUCvdP0Ak0HptAOc9ffBmFxQnL4z4=
github.com/rancher/wrangler-api v0.2.0/go.mod h1:zTPdNLZO07KvRaVOx6XQbKBSV55Fnn4s7nqmrMPJqd8= github.com/rancher/wrangler-api v0.2.0/go.mod h1:zTPdNLZO07KvRaVOx6XQbKBSV55Fnn4s7nqmrMPJqd8=
github.com/rancher/wrangler-api v0.4.1 h1:bwy6BbdCEq+zQrWmy9L8XXcGEQ/mbeuQ2q1kfk8fo3M= github.com/rancher/wrangler-api v0.5.0 h1:ScVozf5SjRLW0UzOka9xzdlTJ99vLR/Gbk4/kIY49GY=
github.com/rancher/wrangler-api v0.4.1/go.mod h1:X+dwYUrZe9q7u9manPJf2ZF8OvP0L7AQ0CuFaqtZO0s= github.com/rancher/wrangler-api v0.5.0/go.mod h1:Ne7fjNRBDdUYPqltLUCW8eiaQwuKXIyAJH6wsuGK80w=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=

View File

@ -233,6 +233,7 @@ func (c *customResourceDefinitionCache) GetByIndex(indexName, key string) (resul
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1beta1.CustomResourceDefinition, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1beta1.CustomResourceDefinition)) result = append(result, obj.(*v1beta1.CustomResourceDefinition))
} }

View File

@ -233,6 +233,7 @@ func (c *aPIServiceCache) GetByIndex(indexName, key string) (result []*v1.APISer
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.APIService, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.APIService)) result = append(result, obj.(*v1.APIService))
} }

View File

@ -226,6 +226,7 @@ func (c *configMapCache) GetByIndex(indexName, key string) (result []*v1.ConfigM
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.ConfigMap, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.ConfigMap)) result = append(result, obj.(*v1.ConfigMap))
} }

View File

@ -226,6 +226,7 @@ func (c *endpointsCache) GetByIndex(indexName, key string) (result []*v1.Endpoin
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Endpoints, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Endpoints)) result = append(result, obj.(*v1.Endpoints))
} }

View File

@ -226,6 +226,7 @@ func (c *eventCache) GetByIndex(indexName, key string) (result []*v1.Event, err
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Event, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Event)) result = append(result, obj.(*v1.Event))
} }

View File

@ -233,6 +233,7 @@ func (c *namespaceCache) GetByIndex(indexName, key string) (result []*v1.Namespa
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Namespace, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Namespace)) result = append(result, obj.(*v1.Namespace))
} }

View File

@ -233,6 +233,7 @@ func (c *nodeCache) GetByIndex(indexName, key string) (result []*v1.Node, err er
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Node, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Node)) result = append(result, obj.(*v1.Node))
} }

View File

@ -233,6 +233,7 @@ func (c *persistentVolumeClaimCache) GetByIndex(indexName, key string) (result [
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.PersistentVolumeClaim, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.PersistentVolumeClaim)) result = append(result, obj.(*v1.PersistentVolumeClaim))
} }

View File

@ -233,6 +233,7 @@ func (c *podCache) GetByIndex(indexName, key string) (result []*v1.Pod, err erro
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Pod, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Pod)) result = append(result, obj.(*v1.Pod))
} }

View File

@ -226,6 +226,7 @@ func (c *secretCache) GetByIndex(indexName, key string) (result []*v1.Secret, er
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Secret, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Secret)) result = append(result, obj.(*v1.Secret))
} }

View File

@ -233,6 +233,7 @@ func (c *serviceCache) GetByIndex(indexName, key string) (result []*v1.Service,
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Service, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Service)) result = append(result, obj.(*v1.Service))
} }

View File

@ -226,6 +226,7 @@ func (c *serviceAccountCache) GetByIndex(indexName, key string) (result []*v1.Se
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.ServiceAccount, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.ServiceAccount)) result = append(result, obj.(*v1.ServiceAccount))
} }

View File

@ -226,6 +226,7 @@ func (c *clusterRoleCache) GetByIndex(indexName, key string) (result []*v1.Clust
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.ClusterRole, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.ClusterRole)) result = append(result, obj.(*v1.ClusterRole))
} }

View File

@ -226,6 +226,7 @@ func (c *clusterRoleBindingCache) GetByIndex(indexName, key string) (result []*v
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.ClusterRoleBinding, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.ClusterRoleBinding)) result = append(result, obj.(*v1.ClusterRoleBinding))
} }

View File

@ -226,6 +226,7 @@ func (c *roleCache) GetByIndex(indexName, key string) (result []*v1.Role, err er
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.Role, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.Role)) result = append(result, obj.(*v1.Role))
} }

View File

@ -226,6 +226,7 @@ func (c *roleBindingCache) GetByIndex(indexName, key string) (result []*v1.RoleB
if err != nil { if err != nil {
return nil, err return nil, err
} }
result = make([]*v1.RoleBinding, 0, len(objs))
for _, obj := range objs { for _, obj := range objs {
result = append(result, obj.(*v1.RoleBinding)) result = append(result, obj.(*v1.RoleBinding))
} }

View File

@ -0,0 +1,22 @@
package client
import (
"github.com/rancher/wrangler/pkg/summary"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/watch"
)
type Interface interface {
Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface
}
type ResourceInterface interface {
List(opts metav1.ListOptions) (*summary.SummarizedObjectList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error)
}
type NamespaceableResourceInterface interface {
Namespace(string) ResourceInterface
ResourceInterface
}

View File

@ -0,0 +1,109 @@
package client
import (
"github.com/rancher/wrangler/pkg/summary"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/dynamic"
)
type summaryClient struct {
client dynamic.Interface
}
var _ Interface = &summaryClient{}
func NewForDynamicClient(client dynamic.Interface) Interface {
return &summaryClient{client: client}
}
type summaryResourceClient struct {
client dynamic.Interface
namespace string
resource schema.GroupVersionResource
}
func (c *summaryClient) Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface {
return &summaryResourceClient{client: c.client, resource: resource}
}
func (c *summaryResourceClient) Namespace(ns string) ResourceInterface {
ret := *c
ret.namespace = ns
return &ret
}
func (c *summaryResourceClient) List(opts metav1.ListOptions) (*summary.SummarizedObjectList, error) {
var (
u *unstructured.UnstructuredList
err error
)
if c.namespace == "" {
u, err = c.client.Resource(c.resource).List(opts)
} else {
u, err = c.client.Resource(c.resource).Namespace(c.namespace).List(opts)
}
if err != nil {
return nil, err
}
list := &summary.SummarizedObjectList{
TypeMeta: metav1.TypeMeta{
Kind: u.GetKind(),
APIVersion: u.GetAPIVersion(),
},
ListMeta: metav1.ListMeta{
ResourceVersion: u.GetResourceVersion(),
Continue: u.GetContinue(),
RemainingItemCount: u.GetRemainingItemCount(),
},
}
for _, obj := range u.Items {
list.Items = append(list.Items, *summary.Summarized(&obj))
}
return list, nil
}
func (c *summaryResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
var (
resp watch.Interface
err error
)
eventChan := make(chan watch.Event)
if c.namespace == "" {
resp, err = c.client.Resource(c.resource).Watch(opts)
} else {
resp, err = c.client.Resource(c.resource).Namespace(c.namespace).Watch(opts)
}
if err != nil {
return nil, err
}
go func() {
for event := range resp.ResultChan() {
event.Object = summary.Summarized(event.Object)
eventChan <- event
}
}()
return &watcher{
Interface: resp,
eventChan: eventChan,
}, nil
}
type watcher struct {
watch.Interface
eventChan chan watch.Event
}
func (w watcher) ResultChan() <-chan watch.Event {
return w.eventChan
}

View File

@ -14,32 +14,32 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package dynamicinformer package informer
import ( import (
"sync" "sync"
"time" "time"
"github.com/rancher/wrangler/pkg/summary"
"github.com/rancher/wrangler/pkg/summary/client"
"github.com/rancher/wrangler/pkg/summary/lister"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/dynamic/dynamiclister"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
) )
// NewDynamicSharedInformerFactory constructs a new instance of dynamicSharedInformerFactory for all namespaces. // NewSummarySharedInformerFactory constructs a new instance of summarySharedInformerFactory for all namespaces.
func NewDynamicSharedInformerFactory(client dynamic.Interface, defaultResync time.Duration) DynamicSharedInformerFactory { func NewSummarySharedInformerFactory(client client.Interface, defaultResync time.Duration) SummarySharedInformerFactory {
return NewFilteredDynamicSharedInformerFactory(client, defaultResync, metav1.NamespaceAll, nil) return NewFilteredSummarySharedInformerFactory(client, defaultResync, metav1.NamespaceAll, nil)
} }
// NewFilteredDynamicSharedInformerFactory constructs a new instance of dynamicSharedInformerFactory. // NewFilteredSummarySharedInformerFactory constructs a new instance of summarySharedInformerFactory.
// Listers obtained via this factory will be subject to the same filters as specified here. // Listers obtained via this factory will be subject to the same filters as specified here.
func NewFilteredDynamicSharedInformerFactory(client dynamic.Interface, defaultResync time.Duration, namespace string, tweakListOptions TweakListOptionsFunc) DynamicSharedInformerFactory { func NewFilteredSummarySharedInformerFactory(client client.Interface, defaultResync time.Duration, namespace string, tweakListOptions TweakListOptionsFunc) SummarySharedInformerFactory {
return &dynamicSharedInformerFactory{ return &summarySharedInformerFactory{
client: client, client: client,
defaultResync: defaultResync, defaultResync: defaultResync,
namespace: namespace, namespace: namespace,
@ -49,8 +49,8 @@ func NewFilteredDynamicSharedInformerFactory(client dynamic.Interface, defaultRe
} }
} }
type dynamicSharedInformerFactory struct { type summarySharedInformerFactory struct {
client dynamic.Interface client client.Interface
defaultResync time.Duration defaultResync time.Duration
namespace string namespace string
@ -62,9 +62,9 @@ type dynamicSharedInformerFactory struct {
tweakListOptions TweakListOptionsFunc tweakListOptions TweakListOptionsFunc
} }
var _ DynamicSharedInformerFactory = &dynamicSharedInformerFactory{} var _ SummarySharedInformerFactory = &summarySharedInformerFactory{}
func (f *dynamicSharedInformerFactory) ForResource(gvr schema.GroupVersionResource) informers.GenericInformer { func (f *summarySharedInformerFactory) ForResource(gvr schema.GroupVersionResource) informers.GenericInformer {
f.lock.Lock() f.lock.Lock()
defer f.lock.Unlock() defer f.lock.Unlock()
@ -74,14 +74,14 @@ func (f *dynamicSharedInformerFactory) ForResource(gvr schema.GroupVersionResour
return informer return informer
} }
informer = NewFilteredDynamicInformer(f.client, gvr, f.namespace, f.defaultResync, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) informer = NewFilteredSummaryInformer(f.client, gvr, f.namespace, f.defaultResync, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
f.informers[key] = informer f.informers[key] = informer
return informer return informer
} }
// Start initializes all requested informers. // Start initializes all requested informers.
func (f *dynamicSharedInformerFactory) Start(stopCh <-chan struct{}) { func (f *summarySharedInformerFactory) Start(stopCh <-chan struct{}) {
f.lock.Lock() f.lock.Lock()
defer f.lock.Unlock() defer f.lock.Unlock()
@ -94,7 +94,7 @@ func (f *dynamicSharedInformerFactory) Start(stopCh <-chan struct{}) {
} }
// WaitForCacheSync waits for all started informers' cache were synced. // WaitForCacheSync waits for all started informers' cache were synced.
func (f *dynamicSharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[schema.GroupVersionResource]bool { func (f *summarySharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[schema.GroupVersionResource]bool {
informers := func() map[schema.GroupVersionResource]cache.SharedIndexInformer { informers := func() map[schema.GroupVersionResource]cache.SharedIndexInformer {
f.lock.Lock() f.lock.Lock()
defer f.lock.Unlock() defer f.lock.Unlock()
@ -115,9 +115,9 @@ func (f *dynamicSharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{})
return res return res
} }
// NewFilteredDynamicInformer constructs a new informer for a dynamic type. // NewFilteredSummaryInformer constructs a new informer for a summary type.
func NewFilteredDynamicInformer(client dynamic.Interface, gvr schema.GroupVersionResource, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions TweakListOptionsFunc) informers.GenericInformer { func NewFilteredSummaryInformer(client client.Interface, gvr schema.GroupVersionResource, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions TweakListOptionsFunc) informers.GenericInformer {
return &dynamicInformer{ return &summaryInformer{
gvr: gvr, gvr: gvr,
informer: cache.NewSharedIndexInformer( informer: cache.NewSharedIndexInformer(
&cache.ListWatch{ &cache.ListWatch{
@ -134,24 +134,24 @@ func NewFilteredDynamicInformer(client dynamic.Interface, gvr schema.GroupVersio
return client.Resource(gvr).Namespace(namespace).Watch(options) return client.Resource(gvr).Namespace(namespace).Watch(options)
}, },
}, },
&unstructured.Unstructured{}, &summary.SummarizedObject{},
resyncPeriod, resyncPeriod,
indexers, indexers,
), ),
} }
} }
type dynamicInformer struct { type summaryInformer struct {
informer cache.SharedIndexInformer informer cache.SharedIndexInformer
gvr schema.GroupVersionResource gvr schema.GroupVersionResource
} }
var _ informers.GenericInformer = &dynamicInformer{} var _ informers.GenericInformer = &summaryInformer{}
func (d *dynamicInformer) Informer() cache.SharedIndexInformer { func (d *summaryInformer) Informer() cache.SharedIndexInformer {
return d.informer return d.informer
} }
func (d *dynamicInformer) Lister() cache.GenericLister { func (d *summaryInformer) Lister() cache.GenericLister {
return dynamiclister.NewRuntimeObjectShim(dynamiclister.New(d.informer.GetIndexer(), d.gvr)) return lister.NewRuntimeObjectShim(lister.New(d.informer.GetIndexer(), d.gvr))
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package dynamicinformer package informer
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -22,8 +22,8 @@ import (
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
) )
// DynamicSharedInformerFactory provides access to a shared informer and lister for dynamic client // SummarySharedInformerFactory provides access to a shared informer and lister for dynamic client
type DynamicSharedInformerFactory interface { type SummarySharedInformerFactory interface {
Start(stopCh <-chan struct{}) Start(stopCh <-chan struct{})
ForResource(gvr schema.GroupVersionResource) informers.GenericInformer ForResource(gvr schema.GroupVersionResource) informers.GenericInformer
WaitForCacheSync(stopCh <-chan struct{}) map[schema.GroupVersionResource]bool WaitForCacheSync(stopCh <-chan struct{}) map[schema.GroupVersionResource]bool

View File

@ -14,19 +14,19 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package dynamiclister package lister
import ( import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/rancher/wrangler/pkg/summary"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
) )
// Lister helps list resources. // Lister helps list resources.
type Lister interface { type Lister interface {
// List lists all resources in the indexer. // List lists all resources in the indexer.
List(selector labels.Selector) (ret []*unstructured.Unstructured, err error) List(selector labels.Selector) (ret []*summary.SummarizedObject, err error)
// Get retrieves a resource from the indexer with the given name // Get retrieves a resource from the indexer with the given name
Get(name string) (*unstructured.Unstructured, error) Get(name string) (*summary.SummarizedObject, error)
// Namespace returns an object that can list and get resources in a given namespace. // Namespace returns an object that can list and get resources in a given namespace.
Namespace(namespace string) NamespaceLister Namespace(namespace string) NamespaceLister
} }
@ -34,7 +34,7 @@ type Lister interface {
// NamespaceLister helps list and get resources. // NamespaceLister helps list and get resources.
type NamespaceLister interface { type NamespaceLister interface {
// List lists all resources in the indexer for a given namespace. // List lists all resources in the indexer for a given namespace.
List(selector labels.Selector) (ret []*unstructured.Unstructured, err error) List(selector labels.Selector) (ret []*summary.SummarizedObject, err error)
// Get retrieves a resource from the indexer for a given namespace and name. // Get retrieves a resource from the indexer for a given namespace and name.
Get(name string) (*unstructured.Unstructured, error) Get(name string) (*summary.SummarizedObject, error)
} }

View File

@ -14,40 +14,40 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package dynamiclister package lister
import ( import (
"github.com/rancher/wrangler/pkg/summary"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
) )
var _ Lister = &dynamicLister{} var _ Lister = &summaryLister{}
var _ NamespaceLister = &dynamicNamespaceLister{} var _ NamespaceLister = &summaryNamespaceLister{}
// dynamicLister implements the Lister interface. // summaryLister implements the Lister interface.
type dynamicLister struct { type summaryLister struct {
indexer cache.Indexer indexer cache.Indexer
gvr schema.GroupVersionResource gvr schema.GroupVersionResource
} }
// New returns a new Lister. // New returns a new Lister.
func New(indexer cache.Indexer, gvr schema.GroupVersionResource) Lister { func New(indexer cache.Indexer, gvr schema.GroupVersionResource) Lister {
return &dynamicLister{indexer: indexer, gvr: gvr} return &summaryLister{indexer: indexer, gvr: gvr}
} }
// List lists all resources in the indexer. // List lists all resources in the indexer.
func (l *dynamicLister) List(selector labels.Selector) (ret []*unstructured.Unstructured, err error) { func (l *summaryLister) List(selector labels.Selector) (ret []*summary.SummarizedObject, err error) {
err = cache.ListAll(l.indexer, selector, func(m interface{}) { err = cache.ListAll(l.indexer, selector, func(m interface{}) {
ret = append(ret, m.(*unstructured.Unstructured)) ret = append(ret, m.(*summary.SummarizedObject))
}) })
return ret, err return ret, err
} }
// Get retrieves a resource from the indexer with the given name // Get retrieves a resource from the indexer with the given name
func (l *dynamicLister) Get(name string) (*unstructured.Unstructured, error) { func (l *summaryLister) Get(name string) (*summary.SummarizedObject, error) {
obj, exists, err := l.indexer.GetByKey(name) obj, exists, err := l.indexer.GetByKey(name)
if err != nil { if err != nil {
return nil, err return nil, err
@ -55,31 +55,31 @@ func (l *dynamicLister) Get(name string) (*unstructured.Unstructured, error) {
if !exists { if !exists {
return nil, errors.NewNotFound(l.gvr.GroupResource(), name) return nil, errors.NewNotFound(l.gvr.GroupResource(), name)
} }
return obj.(*unstructured.Unstructured), nil return obj.(*summary.SummarizedObject), nil
} }
// Namespace returns an object that can list and get resources from a given namespace. // Namespace returns an object that can list and get resources from a given namespace.
func (l *dynamicLister) Namespace(namespace string) NamespaceLister { func (l *summaryLister) Namespace(namespace string) NamespaceLister {
return &dynamicNamespaceLister{indexer: l.indexer, namespace: namespace, gvr: l.gvr} return &summaryNamespaceLister{indexer: l.indexer, namespace: namespace, gvr: l.gvr}
} }
// dynamicNamespaceLister implements the NamespaceLister interface. // summaryNamespaceLister implements the NamespaceLister interface.
type dynamicNamespaceLister struct { type summaryNamespaceLister struct {
indexer cache.Indexer indexer cache.Indexer
namespace string namespace string
gvr schema.GroupVersionResource gvr schema.GroupVersionResource
} }
// List lists all resources in the indexer for a given namespace. // List lists all resources in the indexer for a given namespace.
func (l *dynamicNamespaceLister) List(selector labels.Selector) (ret []*unstructured.Unstructured, err error) { func (l *summaryNamespaceLister) List(selector labels.Selector) (ret []*summary.SummarizedObject, err error) {
err = cache.ListAllByNamespace(l.indexer, l.namespace, selector, func(m interface{}) { err = cache.ListAllByNamespace(l.indexer, l.namespace, selector, func(m interface{}) {
ret = append(ret, m.(*unstructured.Unstructured)) ret = append(ret, m.(*summary.SummarizedObject))
}) })
return ret, err return ret, err
} }
// Get retrieves a resource from the indexer for a given namespace and name. // Get retrieves a resource from the indexer for a given namespace and name.
func (l *dynamicNamespaceLister) Get(name string) (*unstructured.Unstructured, error) { func (l *summaryNamespaceLister) Get(name string) (*summary.SummarizedObject, error) {
obj, exists, err := l.indexer.GetByKey(l.namespace + "/" + name) obj, exists, err := l.indexer.GetByKey(l.namespace + "/" + name)
if err != nil { if err != nil {
return nil, err return nil, err
@ -87,5 +87,5 @@ func (l *dynamicNamespaceLister) Get(name string) (*unstructured.Unstructured, e
if !exists { if !exists {
return nil, errors.NewNotFound(l.gvr.GroupResource(), name) return nil, errors.NewNotFound(l.gvr.GroupResource(), name)
} }
return obj.(*unstructured.Unstructured), nil return obj.(*summary.SummarizedObject), nil
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package dynamiclister package lister
import ( import (
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
@ -22,22 +22,22 @@ import (
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
) )
var _ cache.GenericLister = &dynamicListerShim{} var _ cache.GenericLister = &summaryListerShim{}
var _ cache.GenericNamespaceLister = &dynamicNamespaceListerShim{} var _ cache.GenericNamespaceLister = &summaryNamespaceListerShim{}
// dynamicListerShim implements the cache.GenericLister interface. // summaryListerShim implements the cache.GenericLister interface.
type dynamicListerShim struct { type summaryListerShim struct {
lister Lister lister Lister
} }
// NewRuntimeObjectShim returns a new shim for Lister. // NewRuntimeObjectShim returns a new shim for Lister.
// It wraps Lister so that it implements cache.GenericLister interface // It wraps Lister so that it implements cache.GenericLister interface
func NewRuntimeObjectShim(lister Lister) cache.GenericLister { func NewRuntimeObjectShim(lister Lister) cache.GenericLister {
return &dynamicListerShim{lister: lister} return &summaryListerShim{lister: lister}
} }
// List will return all objects across namespaces // List will return all objects across namespaces
func (s *dynamicListerShim) List(selector labels.Selector) (ret []runtime.Object, err error) { func (s *summaryListerShim) List(selector labels.Selector) (ret []runtime.Object, err error) {
objs, err := s.lister.List(selector) objs, err := s.lister.List(selector)
if err != nil { if err != nil {
return nil, err return nil, err
@ -51,24 +51,24 @@ func (s *dynamicListerShim) List(selector labels.Selector) (ret []runtime.Object
} }
// Get will attempt to retrieve assuming that name==key // Get will attempt to retrieve assuming that name==key
func (s *dynamicListerShim) Get(name string) (runtime.Object, error) { func (s *summaryListerShim) Get(name string) (runtime.Object, error) {
return s.lister.Get(name) return s.lister.Get(name)
} }
func (s *dynamicListerShim) ByNamespace(namespace string) cache.GenericNamespaceLister { func (s *summaryListerShim) ByNamespace(namespace string) cache.GenericNamespaceLister {
return &dynamicNamespaceListerShim{ return &summaryNamespaceListerShim{
namespaceLister: s.lister.Namespace(namespace), namespaceLister: s.lister.Namespace(namespace),
} }
} }
// dynamicNamespaceListerShim implements the NamespaceLister interface. // summaryNamespaceListerShim implements the NamespaceLister interface.
// It wraps NamespaceLister so that it implements cache.GenericNamespaceLister interface // It wraps NamespaceLister so that it implements cache.GenericNamespaceLister interface
type dynamicNamespaceListerShim struct { type summaryNamespaceListerShim struct {
namespaceLister NamespaceLister namespaceLister NamespaceLister
} }
// List will return all objects in this namespace // List will return all objects in this namespace
func (ns *dynamicNamespaceListerShim) List(selector labels.Selector) (ret []runtime.Object, err error) { func (ns *summaryNamespaceListerShim) List(selector labels.Selector) (ret []runtime.Object, err error) {
objs, err := ns.namespaceLister.List(selector) objs, err := ns.namespaceLister.List(selector)
if err != nil { if err != nil {
return nil, err return nil, err
@ -82,6 +82,6 @@ func (ns *dynamicNamespaceListerShim) List(selector labels.Selector) (ret []runt
} }
// Get will attempt to retrieve by namespace and name // Get will attempt to retrieve by namespace and name
func (ns *dynamicNamespaceListerShim) Get(name string) (runtime.Object, error) { func (ns *summaryNamespaceListerShim) Get(name string) (runtime.Object, error) {
return ns.namespaceLister.Get(name) return ns.namespaceLister.Get(name)
} }

View File

@ -0,0 +1,98 @@
package summary
import (
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
type SummarizedObject struct {
metav1.PartialObjectMetadata
Summary
}
type SummarizedObjectList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
Items []SummarizedObject `json:"items" protobuf:"bytes,2,rep,name=items"`
}
func Summarized(u runtime.Object) *SummarizedObject {
if s, ok := u.(*SummarizedObject); ok {
return s
}
s := &SummarizedObject{
Summary: Summarize(u),
}
s.APIVersion, s.Kind = u.GetObjectKind().GroupVersionKind().ToAPIVersionAndKind()
meta, err := meta.Accessor(u)
if err == nil {
s.Name = meta.GetName()
s.Namespace = meta.GetNamespace()
s.Generation = meta.GetGeneration()
s.UID = meta.GetUID()
s.ResourceVersion = meta.GetResourceVersion()
s.CreationTimestamp = meta.GetCreationTimestamp()
s.DeletionTimestamp = meta.GetDeletionTimestamp()
s.Labels = meta.GetLabels()
s.Annotations = meta.GetAnnotations()
}
return s
}
func (in *SummarizedObjectList) DeepCopyInto(out *SummarizedObjectList) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]SummarizedObject, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
func (in *SummarizedObjectList) DeepCopy() *SummarizedObjectList {
if in == nil {
return nil
}
out := new(SummarizedObjectList)
in.DeepCopyInto(out)
return out
}
func (in *SummarizedObjectList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
func (in *SummarizedObject) DeepCopyInto(out *SummarizedObject) {
*out = *in
out.TypeMeta = in.TypeMeta
out.ObjectMeta = *in.ObjectMeta.DeepCopy()
out.Summary = *in.Summary.DeepCopy()
return
}
func (in *SummarizedObject) DeepCopy() *SummarizedObject {
if in == nil {
return nil
}
out := new(SummarizedObject)
in.DeepCopyInto(out)
return out
}
func (in *SummarizedObject) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}

View File

@ -3,6 +3,8 @@ package summary
import ( import (
"strings" "strings"
"k8s.io/apimachinery/pkg/runtime"
"github.com/rancher/wrangler/pkg/data" "github.com/rancher/wrangler/pkg/data"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
) )
@ -14,6 +16,42 @@ type Summary struct {
Message []string Message []string
} }
func (s Summary) String() string {
if !s.Transitioning && !s.Error {
return s.State
}
var msg string
if s.Transitioning {
msg = "[progressing"
}
if s.Error {
if len(msg) > 0 {
msg += ",error]"
} else {
msg = "error]"
}
} else {
msg += "]"
}
if len(s.Message) > 0 {
msg = msg + " " + s.Message[0]
}
return msg
}
func (s Summary) IsReady() bool {
return !s.Error && !s.Transitioning
}
func (s *Summary) DeepCopy() *Summary {
v := *s
return &v
}
func (s *Summary) DeepCopyInto(v *Summary) {
*v = *s
}
func dedupMessage(messages []string) []string { func dedupMessage(messages []string) []string {
if len(messages) <= 1 { if len(messages) <= 1 {
return messages return messages
@ -33,12 +71,21 @@ func dedupMessage(messages []string) []string {
return result return result
} }
func Summarize(unstr *unstructured.Unstructured) Summary { func Summarize(runtimeObj runtime.Object) Summary {
var ( var (
obj data.Object obj data.Object
summary Summary summary Summary
) )
if s, ok := runtimeObj.(*SummarizedObject); ok {
return s.Summary
}
unstr, ok := runtimeObj.(*unstructured.Unstructured)
if !ok {
return summary
}
if unstr != nil { if unstr != nil {
obj = unstr.Object obj = unstr.Object
} }

9
vendor/modules.txt vendored
View File

@ -60,7 +60,7 @@ github.com/rancher/dynamiclistener/server
github.com/rancher/dynamiclistener/storage/file github.com/rancher/dynamiclistener/storage/file
github.com/rancher/dynamiclistener/storage/kubernetes github.com/rancher/dynamiclistener/storage/kubernetes
github.com/rancher/dynamiclistener/storage/memory github.com/rancher/dynamiclistener/storage/memory
# github.com/rancher/wrangler v0.5.1-0.20200312201919-371ff2551072 # github.com/rancher/wrangler v0.5.1
github.com/rancher/wrangler/pkg/apply github.com/rancher/wrangler/pkg/apply
github.com/rancher/wrangler/pkg/apply/injectors github.com/rancher/wrangler/pkg/apply/injectors
github.com/rancher/wrangler/pkg/broadcast github.com/rancher/wrangler/pkg/broadcast
@ -85,7 +85,10 @@ github.com/rancher/wrangler/pkg/signals
github.com/rancher/wrangler/pkg/slice github.com/rancher/wrangler/pkg/slice
github.com/rancher/wrangler/pkg/start github.com/rancher/wrangler/pkg/start
github.com/rancher/wrangler/pkg/summary github.com/rancher/wrangler/pkg/summary
# github.com/rancher/wrangler-api v0.4.1 github.com/rancher/wrangler/pkg/summary/client
github.com/rancher/wrangler/pkg/summary/informer
github.com/rancher/wrangler/pkg/summary/lister
# github.com/rancher/wrangler-api v0.5.0
github.com/rancher/wrangler-api/pkg/generated/controllers/apiextensions.k8s.io github.com/rancher/wrangler-api/pkg/generated/controllers/apiextensions.k8s.io
github.com/rancher/wrangler-api/pkg/generated/controllers/apiextensions.k8s.io/v1beta1 github.com/rancher/wrangler-api/pkg/generated/controllers/apiextensions.k8s.io/v1beta1
github.com/rancher/wrangler-api/pkg/generated/controllers/apiregistration.k8s.io github.com/rancher/wrangler-api/pkg/generated/controllers/apiregistration.k8s.io
@ -266,8 +269,6 @@ k8s.io/apiserver/plugin/pkg/authenticator/token/webhook
# k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible => k8s.io/client-go v0.17.2 # k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible => k8s.io/client-go v0.17.2
k8s.io/client-go/discovery k8s.io/client-go/discovery
k8s.io/client-go/dynamic k8s.io/client-go/dynamic
k8s.io/client-go/dynamic/dynamicinformer
k8s.io/client-go/dynamic/dynamiclister
k8s.io/client-go/informers k8s.io/client-go/informers
k8s.io/client-go/informers/admissionregistration k8s.io/client-go/informers/admissionregistration
k8s.io/client-go/informers/admissionregistration/v1 k8s.io/client-go/informers/admissionregistration/v1