package cache import ( kapi "k8s.io/kubernetes/pkg/api" kapierrors "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/labels" deployapi "github.com/openshift/origin/pkg/deploy/api" deployutil "github.com/openshift/origin/pkg/deploy/util" imageapi "github.com/openshift/origin/pkg/image/api" ) // StoreToDeploymentConfigLister gives a store List and Exists methods. The store must contain only deploymentconfigs. type StoreToDeploymentConfigLister struct { cache.Indexer } // List all deploymentconfigs in the store. func (s *StoreToDeploymentConfigLister) List() ([]*deployapi.DeploymentConfig, error) { configs := []*deployapi.DeploymentConfig{} for _, c := range s.Indexer.List() { configs = append(configs, c.(*deployapi.DeploymentConfig)) } return configs, nil } // GetConfigForController returns the managing deployment config for the provided replication controller. func (s *StoreToDeploymentConfigLister) GetConfigForController(rc *kapi.ReplicationController) (*deployapi.DeploymentConfig, error) { dcName := deployutil.DeploymentConfigNameFor(rc) obj, exists, err := s.Indexer.GetByKey(rc.Namespace + "/" + dcName) if err != nil { return nil, err } if !exists { return nil, kapierrors.NewNotFound(deployapi.Resource("deploymentconfig"), dcName) } return obj.(*deployapi.DeploymentConfig), nil } // GetConfigForPod returns the managing deployment config for the provided pod. func (s *StoreToDeploymentConfigLister) GetConfigForPod(pod *kapi.Pod) (*deployapi.DeploymentConfig, error) { dcName := deployutil.DeploymentConfigNameFor(pod) obj, exists, err := s.Indexer.GetByKey(pod.Namespace + "/" + dcName) if err != nil { return nil, err } if !exists { return nil, kapierrors.NewNotFound(deployapi.Resource("deploymentconfig"), dcName) } return obj.(*deployapi.DeploymentConfig), nil } // GetConfigsForImageStream returns all the deployment configs that point to the provided image stream // by searching through using the ImageStreamReferenceIndex (deployment configs are indexed in the cache // by namespace and by image stream references). func (s *StoreToDeploymentConfigLister) GetConfigsForImageStream(stream *imageapi.ImageStream) ([]*deployapi.DeploymentConfig, error) { items, err := s.Indexer.ByIndex(ImageStreamReferenceIndex, stream.Namespace+"/"+stream.Name) if err != nil { return nil, err } var configs []*deployapi.DeploymentConfig for _, obj := range items { config := obj.(*deployapi.DeploymentConfig) configs = append(configs, config) } return configs, nil } func (s *StoreToDeploymentConfigLister) DeploymentConfigs(namespace string) storeDeploymentConfigsNamespacer { return storeDeploymentConfigsNamespacer{s.Indexer, namespace} } // storeDeploymentConfigsNamespacer provides a way to get and list DeploymentConfigs from a specific namespace. type storeDeploymentConfigsNamespacer struct { indexer cache.Indexer namespace string } // Get the deployment config matching the name from the cache. func (s storeDeploymentConfigsNamespacer) Get(name string) (*deployapi.DeploymentConfig, error) { obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) if err != nil { return nil, err } if !exists { return nil, kapierrors.NewNotFound(deployapi.Resource("deploymentconfig"), name) } return obj.(*deployapi.DeploymentConfig), nil } // List all the deploymentconfigs that match the provided selector using a namespace index. // If the indexed list fails then we will fallback to listing from all namespaces and filter // by the namespace we want. func (s storeDeploymentConfigsNamespacer) List(selector labels.Selector) ([]*deployapi.DeploymentConfig, error) { configs := []*deployapi.DeploymentConfig{} if s.namespace == kapi.NamespaceAll { for _, obj := range s.indexer.List() { dc := obj.(*deployapi.DeploymentConfig) if selector.Matches(labels.Set(dc.Labels)) { configs = append(configs, dc) } } return configs, nil } items, err := s.indexer.ByIndex(cache.NamespaceIndex, s.namespace) if err != nil { return nil, err } for _, obj := range items { dc := obj.(*deployapi.DeploymentConfig) if selector.Matches(labels.Set(dc.Labels)) { configs = append(configs, dc) } } return configs, nil }