diff --git a/pkg/client/cache/listers.go b/pkg/client/cache/listers.go index e6e49b9b6b5..648372eb592 100644 --- a/pkg/client/cache/listers.go +++ b/pkg/client/cache/listers.go @@ -21,6 +21,7 @@ import ( "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apis/apps" @@ -28,6 +29,7 @@ import ( "k8s.io/kubernetes/pkg/apis/certificates" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/labels" ) @@ -450,3 +452,40 @@ func (s *StoreToPodDisruptionBudgetLister) GetPodPodDisruptionBudgets(pod *api.P } return } + +// StorageClassLister knows how to list storage classes +type StorageClassLister interface { + List(selector labels.Selector) (ret []*storage.StorageClass, err error) + Get(name string) (*storage.StorageClass, error) +} + +// storageClassLister implements StorageClassLister +type storageClassLister struct { + indexer Indexer +} + +// NewStorageClassLister returns a new lister. +func NewStorageClassLister(indexer Indexer) StorageClassLister { + return &storageClassLister{indexer: indexer} +} + +// List returns a list of storage classes +func (s *storageClassLister) List(selector labels.Selector) (ret []*storage.StorageClass, err error) { + err = ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*storage.StorageClass)) + }) + return ret, err +} + +// List returns a list of storage classes +func (s *storageClassLister) Get(name string) (*storage.StorageClass, error) { + key := &storage.StorageClass{ObjectMeta: api.ObjectMeta{Name: name}} + obj, exists, err := s.indexer.Get(key) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(storage.Resource("storageclass"), name) + } + return obj.(*storage.StorageClass), nil +} diff --git a/pkg/controller/informers/factory.go b/pkg/controller/informers/factory.go index 1b0e5775977..04483aab592 100644 --- a/pkg/controller/informers/factory.go +++ b/pkg/controller/informers/factory.go @@ -48,6 +48,8 @@ type SharedInformerFactory interface { RoleBindings() RoleBindingInformer LimitRanges() LimitRangeInformer + + StorageClasses() StorageClassInformer } type sharedInformerFactory struct { @@ -72,14 +74,14 @@ func NewSharedInformerFactory(client clientset.Interface, defaultResync time.Dur } // Start initializes all requested informers. -func (s *sharedInformerFactory) Start(stopCh <-chan struct{}) { - s.lock.Lock() - defer s.lock.Unlock() +func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { + f.lock.Lock() + defer f.lock.Unlock() - for informerType, informer := range s.informers { - if !s.startedInformers[informerType] { + for informerType, informer := range f.informers { + if !f.startedInformers[informerType] { go informer.Run(stopCh) - s.startedInformers[informerType] = true + f.startedInformers[informerType] = true } } } @@ -147,3 +149,8 @@ func (f *sharedInformerFactory) RoleBindings() RoleBindingInformer { func (f *sharedInformerFactory) LimitRanges() LimitRangeInformer { return &limitRangeInformer{sharedInformerFactory: f} } + +// StorageClasses returns a SharedIndexInformer that lists and watches all storage classes +func (f *sharedInformerFactory) StorageClasses() StorageClassInformer { + return &storageClassInformer{sharedInformerFactory: f} +} diff --git a/pkg/controller/informers/storage.go b/pkg/controller/informers/storage.go new file mode 100644 index 00000000000..32f6ef8938b --- /dev/null +++ b/pkg/controller/informers/storage.go @@ -0,0 +1,70 @@ +/* +Copyright 2016 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 informers + +import ( + "reflect" + + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/client/cache" + "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/watch" +) + +// StorageClassInformer is type of SharedIndexInformer which watches and lists all storage classes. +// Interface provides constructor for informer and lister for storage classes +type StorageClassInformer interface { + Informer() cache.SharedIndexInformer + Lister() cache.StorageClassLister +} + +type storageClassInformer struct { + *sharedInformerFactory +} + +func (f *storageClassInformer) Informer() cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informerType := reflect.TypeOf(&storage.StorageClass{}) + informer, exists := f.informers[informerType] + if exists { + return informer + } + informer = cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options api.ListOptions) (runtime.Object, error) { + return f.client.Storage().StorageClasses().List(options) + }, + WatchFunc: func(options api.ListOptions) (watch.Interface, error) { + return f.client.Storage().StorageClasses().Watch(options) + }, + }, + &storage.StorageClass{}, + f.defaultResync, + cache.Indexers{}, + ) + f.informers[informerType] = informer + + return informer +} + +func (f *storageClassInformer) Lister() cache.StorageClassLister { + informer := f.Informer() + return cache.NewStorageClassLister(informer.GetIndexer()) +}