| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | package kubernetes
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	"errors"
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	"fmt"
 | 
					
						
							| 
									
										
										
										
											2016-11-07 11:21:24 -05:00
										 |  |  | 	"log"
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	"sync"
 | 
					
						
							|  |  |  | 	"time"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 15:43:27 +00:00
										 |  |  | 	"k8s.io/client-go/1.5/kubernetes"
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 	"k8s.io/client-go/1.5/pkg/api"
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 	unversionedapi "k8s.io/client-go/1.5/pkg/api/unversioned"
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 	"k8s.io/client-go/1.5/pkg/api/v1"
 | 
					
						
							|  |  |  | 	"k8s.io/client-go/1.5/pkg/labels"
 | 
					
						
							|  |  |  | 	"k8s.io/client-go/1.5/pkg/runtime"
 | 
					
						
							|  |  |  | 	"k8s.io/client-go/1.5/pkg/watch"
 | 
					
						
							| 
									
										
										
										
											2016-11-05 15:43:27 +00:00
										 |  |  | 	"k8s.io/client-go/1.5/tools/cache"
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var (
 | 
					
						
							|  |  |  | 	namespace = api.NamespaceAll
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 09:48:11 -03:00
										 |  |  | // storeToNamespaceLister makes a Store that lists Namespaces.
 | 
					
						
							|  |  |  | type storeToNamespaceLister struct {
 | 
					
						
							|  |  |  | 	cache.Store
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | const podIPIndex = "PodIP"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 09:48:11 -03:00
										 |  |  | // List lists all Namespaces in the store.
 | 
					
						
							|  |  |  | func (s *storeToNamespaceLister) List() (ns api.NamespaceList, err error) {
 | 
					
						
							|  |  |  | 	for _, m := range s.Store.List() {
 | 
					
						
							|  |  |  | 		ns.Items = append(ns.Items, *(m.(*api.Namespace)))
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return ns, nil
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | type dnsController interface {
 | 
					
						
							|  |  |  | 	ServiceList() []*api.Service
 | 
					
						
							|  |  |  | 	PodIndex(string) []interface{}
 | 
					
						
							|  |  |  | 	EndpointsList() api.EndpointsList
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	GetNodeByName(string) (api.Node, error)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 	Run()
 | 
					
						
							|  |  |  | 	Stop() error
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type dnsControl struct {
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 	client *kubernetes.Clientset
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 	selector *labels.Selector
 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-06 05:54:24 -07:00
										 |  |  | 	svcController *cache.Controller
 | 
					
						
							|  |  |  | 	podController *cache.Controller
 | 
					
						
							|  |  |  | 	nsController  *cache.Controller
 | 
					
						
							|  |  |  | 	epController  *cache.Controller
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 15:43:27 +00:00
										 |  |  | 	svcLister cache.StoreToServiceLister
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	podLister cache.StoreToPodLister
 | 
					
						
							| 
									
										
										
										
											2016-11-05 15:43:27 +00:00
										 |  |  | 	nsLister  storeToNamespaceLister
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 	epLister  cache.StoreToEndpointsLister
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// stopLock is used to enforce only a single call to Stop is active.
 | 
					
						
							|  |  |  | 	// Needed because we allow stopping through an http endpoint and
 | 
					
						
							|  |  |  | 	// allowing concurrent stoppers leads to stack traces.
 | 
					
						
							|  |  |  | 	stopLock sync.Mutex
 | 
					
						
							|  |  |  | 	shutdown bool
 | 
					
						
							|  |  |  | 	stopCh   chan struct{}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | type dnsControlOpts struct {
 | 
					
						
							|  |  |  | 	initPodCache bool
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 	resyncPeriod time.Duration
 | 
					
						
							|  |  |  | 	// Label handling.
 | 
					
						
							|  |  |  | 	labelSelector *unversionedapi.LabelSelector
 | 
					
						
							|  |  |  | 	selector      *labels.Selector
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 12:46:35 +01:00
										 |  |  | // newDNSController creates a controller for CoreDNS.
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | func newdnsController(kubeClient *kubernetes.Clientset, opts dnsControlOpts) *dnsControl {
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 	dns := dnsControl{
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		client:   kubeClient,
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 		selector: opts.selector,
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		stopCh:   make(chan struct{}),
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 	dns.svcLister.Indexer, dns.svcController = cache.NewIndexerInformer(
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		&cache.ListWatch{
 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 			ListFunc:  serviceListFunc(dns.client, namespace, dns.selector),
 | 
					
						
							|  |  |  | 			WatchFunc: serviceWatchFunc(dns.client, namespace, dns.selector),
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		},
 | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 		&api.Service{},
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 		opts.resyncPeriod,
 | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 		cache.ResourceEventHandlerFuncs{},
 | 
					
						
							|  |  |  | 		cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc})
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 	if opts.initPodCache {
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 		dns.podLister.Indexer, dns.podController = cache.NewIndexerInformer(
 | 
					
						
							|  |  |  | 			&cache.ListWatch{
 | 
					
						
							|  |  |  | 				ListFunc:  podListFunc(dns.client, namespace, dns.selector),
 | 
					
						
							|  |  |  | 				WatchFunc: podWatchFunc(dns.client, namespace, dns.selector),
 | 
					
						
							|  |  |  | 			},
 | 
					
						
							|  |  |  | 			&api.Pod{}, // TODO replace with a lighter-weight custom struct
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 			opts.resyncPeriod,
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 			cache.ResourceEventHandlerFuncs{},
 | 
					
						
							|  |  |  | 			cache.Indexers{podIPIndex: podIPIndexFunc})
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-16 08:31:23 -07:00
										 |  |  | 	dns.nsLister.Store, dns.nsController = cache.NewInformer(
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		&cache.ListWatch{
 | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 			ListFunc:  namespaceListFunc(dns.client, dns.selector),
 | 
					
						
							|  |  |  | 			WatchFunc: namespaceWatchFunc(dns.client, dns.selector),
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		},
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 		&api.Namespace{},
 | 
					
						
							|  |  |  | 		opts.resyncPeriod,
 | 
					
						
							|  |  |  | 		cache.ResourceEventHandlerFuncs{})
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 	dns.epLister.Store, dns.epController = cache.NewInformer(
 | 
					
						
							|  |  |  | 		&cache.ListWatch{
 | 
					
						
							|  |  |  | 			ListFunc:  endpointsListFunc(dns.client, namespace, dns.selector),
 | 
					
						
							|  |  |  | 			WatchFunc: endpointsWatchFunc(dns.client, namespace, dns.selector),
 | 
					
						
							|  |  |  | 		},
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 		&api.Endpoints{},
 | 
					
						
							|  |  |  | 		opts.resyncPeriod,
 | 
					
						
							|  |  |  | 		cache.ResourceEventHandlerFuncs{})
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	return &dns
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | func podIPIndexFunc(obj interface{}) ([]string, error) {
 | 
					
						
							|  |  |  | 	p, ok := obj.(*api.Pod)
 | 
					
						
							|  |  |  | 	if !ok {
 | 
					
						
							|  |  |  | 		return nil, errors.New("obj was not an *api.Pod")
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return []string{p.Status.PodIP}, nil
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | func serviceListFunc(c *kubernetes.Clientset, ns string, s *labels.Selector) func(api.ListOptions) (runtime.Object, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	return func(opts api.ListOptions) (runtime.Object, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			opts.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 07:43:38 +00:00
										 |  |  | 		listV1, err := c.Core().Services(ns).List(opts)
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 07:43:38 +00:00
										 |  |  | 		var listAPI api.ServiceList
 | 
					
						
							|  |  |  | 		err = v1.Convert_v1_ServiceList_To_api_ServiceList(listV1, &listAPI, nil)
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 10:33:48 +00:00
										 |  |  | 		return &listAPI, err
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | func podListFunc(c *kubernetes.Clientset, ns string, s *labels.Selector) func(api.ListOptions) (runtime.Object, error) {
 | 
					
						
							|  |  |  | 	return func(opts api.ListOptions) (runtime.Object, error) {
 | 
					
						
							|  |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			opts.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		listV1, err := c.Core().Pods(ns).List(opts)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		var listAPI api.PodList
 | 
					
						
							|  |  |  | 		err = v1.Convert_v1_PodList_To_api_PodList(listV1, &listAPI, nil)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return &listAPI, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-07 19:15:21 +00:00
										 |  |  | func v1ToAPIFilter(in watch.Event) (out watch.Event, keep bool) {
 | 
					
						
							| 
									
										
										
										
											2016-11-07 11:21:24 -05:00
										 |  |  | 	if in.Type == watch.Error {
 | 
					
						
							|  |  |  | 		return in, true
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch v1Obj := in.Object.(type) {
 | 
					
						
							| 
									
										
										
										
											2016-11-07 19:15:21 +00:00
										 |  |  | 	case *v1.Service:
 | 
					
						
							|  |  |  | 		var apiObj api.Service
 | 
					
						
							|  |  |  | 		err := v1.Convert_v1_Service_To_api_Service(v1Obj, &apiObj, nil)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			log.Printf("[ERROR] Could not convert v1.Service: %s", err)
 | 
					
						
							|  |  |  | 			return in, true
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return watch.Event{Type: in.Type, Object: &apiObj}, true
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	case *v1.Pod:
 | 
					
						
							|  |  |  | 		var apiObj api.Pod
 | 
					
						
							|  |  |  | 		err := v1.Convert_v1_Pod_To_api_Pod(v1Obj, &apiObj, nil)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			log.Printf("[ERROR] Could not convert v1.Pod: %s", err)
 | 
					
						
							|  |  |  | 			return in, true
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return watch.Event{Type: in.Type, Object: &apiObj}, true
 | 
					
						
							| 
									
										
										
										
											2016-11-07 19:15:21 +00:00
										 |  |  | 	case *v1.Namespace:
 | 
					
						
							|  |  |  | 		var apiObj api.Namespace
 | 
					
						
							|  |  |  | 		err := v1.Convert_v1_Namespace_To_api_Namespace(v1Obj, &apiObj, nil)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			log.Printf("[ERROR] Could not convert v1.Namespace: %s", err)
 | 
					
						
							|  |  |  | 			return in, true
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return watch.Event{Type: in.Type, Object: &apiObj}, true
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 	case *v1.Endpoints:
 | 
					
						
							|  |  |  | 		var apiObj api.Endpoints
 | 
					
						
							|  |  |  | 		err := v1.Convert_v1_Endpoints_To_api_Endpoints(v1Obj, &apiObj, nil)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			log.Printf("[ERROR] Could not convert v1.Endpoint: %s", err)
 | 
					
						
							|  |  |  | 			return in, true
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return watch.Event{Type: in.Type, Object: &apiObj}, true
 | 
					
						
							| 
									
										
										
										
											2016-11-07 11:21:24 -05:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	log.Printf("[WARN] Unhandled v1 type in event: %v", in)
 | 
					
						
							|  |  |  | 	return in, true
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | func serviceWatchFunc(c *kubernetes.Clientset, ns string, s *labels.Selector) func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	return func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			options.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 11:21:24 -05:00
										 |  |  | 		w, err := c.Core().Services(ns).Watch(options)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 19:15:21 +00:00
										 |  |  | 		return watch.Filter(w, v1ToAPIFilter), nil
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | func podWatchFunc(c *kubernetes.Clientset, ns string, s *labels.Selector) func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							|  |  |  | 	return func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							|  |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			options.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		w, err := c.Core().Pods(ns).Watch(options)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return watch.Filter(w, v1ToAPIFilter), nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | func namespaceListFunc(c *kubernetes.Clientset, s *labels.Selector) func(api.ListOptions) (runtime.Object, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	return func(opts api.ListOptions) (runtime.Object, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			opts.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 07:43:38 +00:00
										 |  |  | 		listV1, err := c.Core().Namespaces().List(opts)
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 07:43:38 +00:00
										 |  |  | 		var listAPI api.NamespaceList
 | 
					
						
							|  |  |  | 		err = v1.Convert_v1_NamespaceList_To_api_NamespaceList(listV1, &listAPI, nil)
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 10:33:48 +00:00
										 |  |  | 		return &listAPI, err
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-05 07:57:08 -04:00
										 |  |  | func namespaceWatchFunc(c *kubernetes.Clientset, s *labels.Selector) func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	return func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			options.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 11:21:24 -05:00
										 |  |  | 		w, err := c.Core().Namespaces().Watch(options)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2016-11-07 19:15:21 +00:00
										 |  |  | 		return watch.Filter(w, v1ToAPIFilter), nil
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | func endpointsListFunc(c *kubernetes.Clientset, ns string, s *labels.Selector) func(api.ListOptions) (runtime.Object, error) {
 | 
					
						
							|  |  |  | 	return func(opts api.ListOptions) (runtime.Object, error) {
 | 
					
						
							|  |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			opts.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		listV1, err := c.Core().Endpoints(ns).List(opts)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		var listAPI api.EndpointsList
 | 
					
						
							|  |  |  | 		err = v1.Convert_v1_EndpointsList_To_api_EndpointsList(listV1, &listAPI, nil)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return &listAPI, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func endpointsWatchFunc(c *kubernetes.Clientset, ns string, s *labels.Selector) func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							|  |  |  | 	return func(options api.ListOptions) (watch.Interface, error) {
 | 
					
						
							|  |  |  | 		if s != nil {
 | 
					
						
							|  |  |  | 			options.LabelSelector = *s
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		w, err := c.Core().Endpoints(ns).Watch(options)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			return nil, err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return watch.Filter(w, v1ToAPIFilter), nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | func (dns *dnsControl) controllersInSync() bool {
 | 
					
						
							| 
									
										
										
										
											2017-05-25 15:08:44 -04:00
										 |  |  | 	hs := dns.svcController.HasSynced() &&
 | 
					
						
							|  |  |  | 		dns.nsController.HasSynced() &&
 | 
					
						
							|  |  |  | 		dns.epController.HasSynced()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if dns.podController != nil {
 | 
					
						
							|  |  |  | 		hs = hs && dns.podController.HasSynced()
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return hs
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Stop stops the  controller.
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | func (dns *dnsControl) Stop() error {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	dns.stopLock.Lock()
 | 
					
						
							|  |  |  | 	defer dns.stopLock.Unlock()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Only try draining the workqueue if we haven't already.
 | 
					
						
							|  |  |  | 	if !dns.shutdown {
 | 
					
						
							|  |  |  | 		close(dns.stopCh)
 | 
					
						
							|  |  |  | 		dns.shutdown = true
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return fmt.Errorf("shutdown already in progress")
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Run starts the controller.
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | func (dns *dnsControl) Run() {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	go dns.svcController.Run(dns.stopCh)
 | 
					
						
							|  |  |  | 	go dns.nsController.Run(dns.stopCh)
 | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 	go dns.epController.Run(dns.stopCh)
 | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	if dns.podController != nil {
 | 
					
						
							|  |  |  | 		go dns.podController.Run(dns.stopCh)
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	<-dns.stopCh
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | func (dns *dnsControl) NamespaceList() *api.NamespaceList {
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	nsList, err := dns.nsLister.List()
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return &api.NamespaceList{}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &nsList
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | func (dns *dnsControl) ServiceList() []*api.Service {
 | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 	svcs, err := dns.svcLister.List(labels.Everything())
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	if err != nil {
 | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 		return []*api.Service{}
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2016-09-22 08:29:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 	return svcs
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | func (dns *dnsControl) PodIndex(ip string) []interface{} {
 | 
					
						
							|  |  |  | 	pods, err := dns.podLister.Indexer.ByIndex(podIPIndex, ip)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return nil
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return pods
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (dns *dnsControl) EndpointsList() api.EndpointsList {
 | 
					
						
							|  |  |  | 	epl, err := dns.epLister.List()
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return api.EndpointsList{}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return epl
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (dns *dnsControl) GetNodeByName(name string) (api.Node, error) {
 | 
					
						
							|  |  |  | 	v1node, err := dns.client.Core().Nodes().Get(name)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return api.Node{}, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	var apinode api.Node
 | 
					
						
							|  |  |  | 	err = v1.Convert_v1_Node_To_api_Node(v1node, &apinode, nil)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							|  |  |  | 		return api.Node{}, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return apinode, nil
 | 
					
						
							|  |  |  | }
 |