| 
									
										
										
										
											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" | 
					
						
							|  |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	"sync/atomic" | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	"github.com/coredns/coredns/plugin/kubernetes/object" | 
					
						
							| 
									
										
										
										
											2018-06-27 07:45:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-03 19:11:28 +08:00
										 |  |  | 	api "k8s.io/api/core/v1" | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	meta "k8s.io/apimachinery/pkg/apis/meta/v1" | 
					
						
							|  |  |  | 	"k8s.io/apimachinery/pkg/labels" | 
					
						
							|  |  |  | 	"k8s.io/apimachinery/pkg/runtime" | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	"k8s.io/client-go/kubernetes" | 
					
						
							|  |  |  | 	"k8s.io/client-go/tools/cache" | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	podIPIndex            = "PodIP" | 
					
						
							|  |  |  | 	svcNameNamespaceIndex = "NameNamespace" | 
					
						
							|  |  |  | 	svcIPIndex            = "ServiceIP" | 
					
						
							|  |  |  | 	epNameNamespaceIndex  = "EndpointNameNamespace" | 
					
						
							|  |  |  | 	epIPIndex             = "EndpointsIP" | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | type dnsController interface { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	ServiceList() []*object.Service | 
					
						
							|  |  |  | 	EndpointsList() []*object.Endpoints | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	SvcIndex(string) []*object.Service | 
					
						
							|  |  |  | 	SvcIndexReverse(string) []*object.Service | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	PodIndex(string) []*object.Pod | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	EpIndex(string) []*object.Endpoints | 
					
						
							|  |  |  | 	EpIndexReverse(string) []*object.Endpoints | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	GetNodeByName(string) (*api.Node, error) | 
					
						
							| 
									
										
										
										
											2017-11-13 21:51:51 +00:00
										 |  |  | 	GetNamespaceByName(string) (*api.Namespace, error) | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 	Run() | 
					
						
							| 
									
										
										
										
											2017-10-20 22:53:17 +01:00
										 |  |  | 	HasSynced() bool | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 	Stop() error | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Modified returns the timestamp of the most recent changes | 
					
						
							|  |  |  | 	Modified() int64 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type dnsControl struct { | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	// Modified tracks timestamp of the most recent changes | 
					
						
							| 
									
										
										
										
											2019-02-17 15:31:12 +07:00
										 |  |  | 	// It needs to be first because it is guaranteed to be 8-byte | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 	// aligned ( we use sync.LoadAtomic with this ) | 
					
						
							|  |  |  | 	modified int64 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-29 10:43:09 -05:00
										 |  |  | 	client kubernetes.Interface | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 11:13:46 +01:00
										 |  |  | 	selector          labels.Selector | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 	namespaceSelector labels.Selector | 
					
						
							| 
									
										
										
										
											2016-08-12 20:44:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	svcController cache.Controller | 
					
						
							|  |  |  | 	podController cache.Controller | 
					
						
							|  |  |  | 	epController  cache.Controller | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 	nsController  cache.Controller | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	svcLister cache.Indexer | 
					
						
							|  |  |  | 	podLister cache.Indexer | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	epLister  cache.Indexer | 
					
						
							| 
									
										
										
										
											2018-09-22 15:12:02 +01:00
										 |  |  | 	nsLister  cache.Store | 
					
						
							| 
									
										
										
										
											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{} | 
					
						
							| 
									
										
										
										
											2018-06-27 07:45:32 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	zones            []string | 
					
						
							|  |  |  | 	endpointNameMode bool | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | type dnsControlOpts struct { | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 	initPodCache       bool | 
					
						
							|  |  |  | 	initEndpointsCache bool | 
					
						
							| 
									
										
										
										
											2018-05-23 14:57:59 +02:00
										 |  |  | 	ignoreEmptyService bool | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:52:18 +01:00
										 |  |  | 	// Label handling. | 
					
						
							| 
									
										
										
										
											2019-04-08 11:13:46 +01:00
										 |  |  | 	labelSelector          *meta.LabelSelector | 
					
						
							|  |  |  | 	selector               labels.Selector | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 	namespaceLabelSelector *meta.LabelSelector | 
					
						
							| 
									
										
										
										
											2019-04-08 11:13:46 +01:00
										 |  |  | 	namespaceSelector      labels.Selector | 
					
						
							| 
									
										
										
										
											2018-06-27 07:45:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | 	zones                 []string | 
					
						
							|  |  |  | 	endpointNameMode      bool | 
					
						
							|  |  |  | 	skipAPIObjectsCleanup bool | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 12:46:35 +01:00
										 |  |  | // newDNSController creates a controller for CoreDNS. | 
					
						
							| 
									
										
										
										
											2018-09-29 10:43:09 -05:00
										 |  |  | func newdnsController(kubeClient kubernetes.Interface, opts dnsControlOpts) *dnsControl { | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 	dns := dnsControl{ | 
					
						
							| 
									
										
										
										
											2019-04-08 11:13:46 +01:00
										 |  |  | 		client:            kubeClient, | 
					
						
							|  |  |  | 		selector:          opts.selector, | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 		namespaceSelector: opts.namespaceSelector, | 
					
						
							| 
									
										
										
										
											2019-04-08 11:13:46 +01:00
										 |  |  | 		stopCh:            make(chan struct{}), | 
					
						
							|  |  |  | 		zones:             opts.zones, | 
					
						
							|  |  |  | 		endpointNameMode:  opts.endpointNameMode, | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	dns.svcLister, dns.svcController = object.NewIndexerInformer( | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		&cache.ListWatch{ | 
					
						
							| 
									
										
										
										
											2018-09-22 16:08:21 +01:00
										 |  |  | 			ListFunc:  serviceListFunc(dns.client, api.NamespaceAll, dns.selector), | 
					
						
							|  |  |  | 			WatchFunc: serviceWatchFunc(dns.client, api.NamespaceAll, dns.selector), | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-10-17 19:35:00 +01:00
										 |  |  | 		&api.Service{}, | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 		cache.ResourceEventHandlerFuncs{AddFunc: dns.Add, UpdateFunc: dns.Update, DeleteFunc: dns.Delete}, | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 		cache.Indexers{svcNameNamespaceIndex: svcNameNamespaceIndexFunc, svcIPIndex: svcIPIndexFunc}, | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | 		object.DefaultProcessor(object.ToService(opts.skipAPIObjectsCleanup)), | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	) | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | 	if opts.initPodCache { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		dns.podLister, dns.podController = object.NewIndexerInformer( | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 			&cache.ListWatch{ | 
					
						
							| 
									
										
										
										
											2018-09-22 16:08:21 +01:00
										 |  |  | 				ListFunc:  podListFunc(dns.client, api.NamespaceAll, dns.selector), | 
					
						
							|  |  |  | 				WatchFunc: podWatchFunc(dns.client, api.NamespaceAll, dns.selector), | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2018-10-17 19:35:00 +01:00
										 |  |  | 			&api.Pod{}, | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 			cache.ResourceEventHandlerFuncs{AddFunc: dns.Add, UpdateFunc: dns.Update, DeleteFunc: dns.Delete}, | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 			cache.Indexers{podIPIndex: podIPIndexFunc}, | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | 			object.DefaultProcessor(object.ToPod(opts.skipAPIObjectsCleanup)), | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		) | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 	if opts.initEndpointsCache { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		dns.epLister, dns.epController = object.NewIndexerInformer( | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 			&cache.ListWatch{ | 
					
						
							| 
									
										
										
										
											2018-09-22 16:08:21 +01:00
										 |  |  | 				ListFunc:  endpointsListFunc(dns.client, api.NamespaceAll, dns.selector), | 
					
						
							|  |  |  | 				WatchFunc: endpointsWatchFunc(dns.client, api.NamespaceAll, dns.selector), | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			&api.Endpoints{}, | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | 			cache.ResourceEventHandlerFuncs{}, | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 			cache.Indexers{epNameNamespaceIndex: epNameNamespaceIndexFunc, epIPIndex: epIPIndexFunc}, | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | 			func(clientState cache.Indexer, h cache.ResourceEventHandler) cache.ProcessFunc { | 
					
						
							|  |  |  | 				return func(obj interface{}) error { | 
					
						
							|  |  |  | 					for _, d := range obj.(cache.Deltas) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						apiEndpoints, obj := object.ToEndpoints(d.Object) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						switch d.Type { | 
					
						
							|  |  |  | 						case cache.Sync, cache.Added, cache.Updated: | 
					
						
							|  |  |  | 							if old, exists, err := clientState.Get(obj); err == nil && exists { | 
					
						
							|  |  |  | 								if err := clientState.Update(obj); err != nil { | 
					
						
							|  |  |  | 									return err | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 								h.OnUpdate(old, obj) | 
					
						
							|  |  |  | 								// endpoint updates can come frequently, make sure it's a change we care about | 
					
						
							|  |  |  | 								if !endpointsEquivalent(old.(*object.Endpoints), obj) { | 
					
						
							|  |  |  | 									dns.updateModifed() | 
					
						
							|  |  |  | 									recordDNSProgrammingLatency(dns.getServices(obj), apiEndpoints) | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} else { | 
					
						
							|  |  |  | 								if err := clientState.Add(obj); err != nil { | 
					
						
							|  |  |  | 									return err | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 								h.OnAdd(d.Object) | 
					
						
							|  |  |  | 								dns.updateModifed() | 
					
						
							|  |  |  | 								recordDNSProgrammingLatency(dns.getServices(obj), apiEndpoints) | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						case cache.Deleted: | 
					
						
							|  |  |  | 							if err := clientState.Delete(obj); err != nil { | 
					
						
							|  |  |  | 								return err | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							h.OnDelete(d.Object) | 
					
						
							|  |  |  | 							dns.updateModifed() | 
					
						
							|  |  |  | 							recordDNSProgrammingLatency(dns.getServices(obj), apiEndpoints) | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if !opts.skipAPIObjectsCleanup { | 
					
						
							|  |  |  | 							*apiEndpoints = api.Endpoints{} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					return nil | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-22 15:12:02 +01:00
										 |  |  | 	dns.nsLister, dns.nsController = cache.NewInformer( | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 		&cache.ListWatch{ | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 			ListFunc:  namespaceListFunc(dns.client, dns.namespaceSelector), | 
					
						
							|  |  |  | 			WatchFunc: namespaceWatchFunc(dns.client, dns.namespaceSelector), | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 		&api.Namespace{}, | 
					
						
							| 
									
										
										
										
											2019-07-04 01:09:12 +05:30
										 |  |  | 		defaultResyncPeriod, | 
					
						
							| 
									
										
										
										
											2019-03-22 08:32:40 -06:00
										 |  |  | 		cache.ResourceEventHandlerFuncs{}) | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -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) { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	p, ok := obj.(*object.Pod) | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2018-09-22 16:54:06 +01:00
										 |  |  | 		return nil, errObj | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	return []string{p.PodIP}, nil | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | func svcIPIndexFunc(obj interface{}) ([]string, error) { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	svc, ok := obj.(*object.Service) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2018-09-22 16:54:06 +01:00
										 |  |  | 		return nil, errObj | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-12-14 09:41:51 +00:00
										 |  |  | 	if len(svc.ExternalIPs) == 0 { | 
					
						
							|  |  |  | 		return []string{svc.ClusterIP}, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return append([]string{svc.ClusterIP}, svc.ExternalIPs...), nil | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | func svcNameNamespaceIndexFunc(obj interface{}) ([]string, error) { | 
					
						
							|  |  |  | 	s, ok := obj.(*object.Service) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return nil, errObj | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return []string{s.Index}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func epNameNamespaceIndexFunc(obj interface{}) ([]string, error) { | 
					
						
							|  |  |  | 	s, ok := obj.(*object.Endpoints) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return nil, errObj | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return []string{s.Index}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | func epIPIndexFunc(obj interface{}) ([]string, error) { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	ep, ok := obj.(*object.Endpoints) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2018-09-22 16:54:06 +01:00
										 |  |  | 		return nil, errObj | 
					
						
							| 
									
										
										
										
											2017-11-10 15:38:45 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	return ep.IndexIP, nil | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-29 10:43:09 -05:00
										 |  |  | func serviceListFunc(c kubernetes.Interface, ns string, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	return func(opts meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		if s != nil { | 
					
						
							| 
									
										
										
										
											2018-01-24 23:44:18 +03:00
										 |  |  | 			opts.LabelSelector = s.String() | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-01-03 19:11:28 +08:00
										 |  |  | 		listV1, err := c.CoreV1().Services(ns).List(opts) | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 		return listV1, err | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-29 10:43:09 -05:00
										 |  |  | func podListFunc(c kubernetes.Interface, ns string, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	return func(opts meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 		if s != nil { | 
					
						
							| 
									
										
										
										
											2018-01-24 23:44:18 +03:00
										 |  |  | 			opts.LabelSelector = s.String() | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-05-29 08:06:46 +01:00
										 |  |  | 		if len(opts.FieldSelector) > 0 { | 
					
						
							|  |  |  | 			opts.FieldSelector = opts.FieldSelector + "," | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		opts.FieldSelector = opts.FieldSelector + "status.phase!=Succeeded,status.phase!=Failed,status.phase!=Unknown" | 
					
						
							| 
									
										
										
										
											2018-01-03 19:11:28 +08:00
										 |  |  | 		listV1, err := c.CoreV1().Pods(ns).List(opts) | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 		return listV1, err | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-29 10:43:09 -05:00
										 |  |  | func endpointsListFunc(c kubernetes.Interface, ns string, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	return func(opts meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 		if s != nil { | 
					
						
							| 
									
										
										
										
											2018-01-24 23:44:18 +03:00
										 |  |  | 			opts.LabelSelector = s.String() | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-01-03 19:11:28 +08:00
										 |  |  | 		listV1, err := c.CoreV1().Endpoints(ns).List(opts) | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 		return listV1, err | 
					
						
							| 
									
										
										
										
											2016-12-02 17:50:01 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-29 10:43:09 -05:00
										 |  |  | func namespaceListFunc(c kubernetes.Interface, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 	return func(opts meta.ListOptions) (runtime.Object, error) { | 
					
						
							|  |  |  | 		if s != nil { | 
					
						
							|  |  |  | 			opts.LabelSelector = s.String() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		listV1, err := c.CoreV1().Namespaces().List(opts) | 
					
						
							|  |  |  | 		return listV1, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 	if dns.epController != nil { | 
					
						
							|  |  |  | 		go dns.epController.Run(dns.stopCh) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-20 02:22:11 -05:00
										 |  |  | 	if dns.podController != nil { | 
					
						
							|  |  |  | 		go dns.podController.Run(dns.stopCh) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 	go dns.nsController.Run(dns.stopCh) | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	<-dns.stopCh | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-20 22:53:17 +01:00
										 |  |  | // HasSynced calls on all controllers. | 
					
						
							|  |  |  | func (dns *dnsControl) HasSynced() bool { | 
					
						
							|  |  |  | 	a := dns.svcController.HasSynced() | 
					
						
							| 
									
										
										
										
											2018-02-16 11:05:52 -05:00
										 |  |  | 	b := true | 
					
						
							|  |  |  | 	if dns.epController != nil { | 
					
						
							|  |  |  | 		b = dns.epController.HasSynced() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-20 22:53:17 +01:00
										 |  |  | 	c := true | 
					
						
							|  |  |  | 	if dns.podController != nil { | 
					
						
							|  |  |  | 		c = dns.podController.HasSynced() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 	d := dns.nsController.HasSynced() | 
					
						
							|  |  |  | 	return a && b && c && d | 
					
						
							| 
									
										
										
										
											2017-10-20 22:53:17 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | func (dns *dnsControl) ServiceList() (svcs []*object.Service) { | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	os := dns.svcLister.List() | 
					
						
							|  |  |  | 	for _, o := range os { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		s, ok := o.(*object.Service) | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		svcs = append(svcs, s) | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-23 10:13:02 -03:00
										 |  |  | 	return svcs | 
					
						
							| 
									
										
										
										
											2016-08-05 18:19:51 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | func (dns *dnsControl) EndpointsList() (eps []*object.Endpoints) { | 
					
						
							|  |  |  | 	os := dns.epLister.List() | 
					
						
							|  |  |  | 	for _, o := range os { | 
					
						
							|  |  |  | 		ep, ok := o.(*object.Endpoints) | 
					
						
							|  |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		eps = append(eps, ep) | 
					
						
							| 
									
										
										
										
											2017-09-21 13:06:35 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 	return eps | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (dns *dnsControl) PodIndex(ip string) (pods []*object.Pod) { | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	os, err := dns.podLister.ByIndex(podIPIndex, ip) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	for _, o := range os { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		p, ok := o.(*object.Pod) | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 		pods = append(pods, p) | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	return pods | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | func (dns *dnsControl) SvcIndex(idx string) (svcs []*object.Service) { | 
					
						
							|  |  |  | 	os, err := dns.svcLister.ByIndex(svcNameNamespaceIndex, idx) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	for _, o := range os { | 
					
						
							|  |  |  | 		s, ok := o.(*object.Service) | 
					
						
							|  |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		svcs = append(svcs, s) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	return svcs | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | func (dns *dnsControl) SvcIndexReverse(ip string) (svcs []*object.Service) { | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	os, err := dns.svcLister.ByIndex(svcIPIndex, ip) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, o := range os { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		s, ok := o.(*object.Service) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 		svcs = append(svcs, s) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	return svcs | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | func (dns *dnsControl) EpIndex(idx string) (ep []*object.Endpoints) { | 
					
						
							|  |  |  | 	os, err := dns.epLister.ByIndex(epNameNamespaceIndex, idx) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	for _, o := range os { | 
					
						
							|  |  |  | 		e, ok := o.(*object.Endpoints) | 
					
						
							|  |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		ep = append(ep, e) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	return ep | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | func (dns *dnsControl) EpIndexReverse(ip string) (ep []*object.Endpoints) { | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	os, err := dns.epLister.ByIndex(epIPIndex, ip) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, o := range os { | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 		e, ok := o.(*object.Endpoints) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 		ep = append(ep, e) | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 	return ep | 
					
						
							| 
									
										
										
										
											2017-10-17 21:30:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-13 21:51:51 +00:00
										 |  |  | // GetNodeByName return the node by name. If nothing is found an error is | 
					
						
							|  |  |  | // returned. This query causes a roundtrip to the k8s API server, so use | 
					
						
							|  |  |  | // sparingly. Currently this is only used for Federation. | 
					
						
							| 
									
										
										
										
											2017-09-29 15:58:50 -04:00
										 |  |  | func (dns *dnsControl) GetNodeByName(name string) (*api.Node, error) { | 
					
						
							| 
									
										
										
										
											2018-01-03 19:11:28 +08:00
										 |  |  | 	v1node, err := dns.client.CoreV1().Nodes().Get(name, meta.GetOptions{}) | 
					
						
							| 
									
										
										
										
											2018-09-22 16:54:06 +01:00
										 |  |  | 	return v1node, err | 
					
						
							| 
									
										
										
										
											2017-06-14 09:38:00 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-11-13 21:51:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | // GetNamespaceByName returns the namespace by name. If nothing is found an error is returned. | 
					
						
							| 
									
										
										
										
											2017-11-13 21:51:51 +00:00
										 |  |  | func (dns *dnsControl) GetNamespaceByName(name string) (*api.Namespace, error) { | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 	os := dns.nsLister.List() | 
					
						
							|  |  |  | 	for _, o := range os { | 
					
						
							|  |  |  | 		ns, ok := o.(*api.Namespace) | 
					
						
							|  |  |  | 		if !ok { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | 		if name == ns.ObjectMeta.Name { | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 			return ns, nil | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-11-13 21:51:51 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-15 14:21:54 -05:00
										 |  |  | 	return nil, fmt.Errorf("namespace not found") | 
					
						
							| 
									
										
										
										
											2017-11-13 21:51:51 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | func (dns *dnsControl) Add(obj interface{})               { dns.detectChanges(nil, obj) } | 
					
						
							|  |  |  | func (dns *dnsControl) Delete(obj interface{})            { dns.detectChanges(obj, nil) } | 
					
						
							|  |  |  | func (dns *dnsControl) Update(oldObj, newObj interface{}) { dns.detectChanges(oldObj, newObj) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // detectChanges detects changes in objects, and updates the modified timestamp | 
					
						
							|  |  |  | func (dns *dnsControl) detectChanges(oldObj, newObj interface{}) { | 
					
						
							|  |  |  | 	// If both objects have the same resource version, they are identical. | 
					
						
							|  |  |  | 	if newObj != nil && oldObj != nil && (oldObj.(meta.Object).GetResourceVersion() == newObj.(meta.Object).GetResourceVersion()) { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	obj := newObj | 
					
						
							|  |  |  | 	if obj == nil { | 
					
						
							|  |  |  | 		obj = oldObj | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	switch ob := obj.(type) { | 
					
						
							|  |  |  | 	case *object.Service: | 
					
						
							|  |  |  | 		dns.updateModifed() | 
					
						
							|  |  |  | 	case *object.Pod: | 
					
						
							|  |  |  | 		dns.updateModifed() | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		log.Warningf("Updates for %T not supported.", ob) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | func (dns *dnsControl) getServices(endpoints *object.Endpoints) []*object.Service { | 
					
						
							|  |  |  | 	return dns.SvcIndex(object.EndpointsKey(endpoints.GetName(), endpoints.GetNamespace())) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | // subsetsEquivalent checks if two endpoint subsets are significantly equivalent | 
					
						
							|  |  |  | // I.e. that they have the same ready addresses, host names, ports (including protocol | 
					
						
							|  |  |  | // and service names for SRV) | 
					
						
							|  |  |  | func subsetsEquivalent(sa, sb object.EndpointSubset) bool { | 
					
						
							|  |  |  | 	if len(sa.Addresses) != len(sb.Addresses) { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(sa.Ports) != len(sb.Ports) { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// in Addresses and Ports, we should be able to rely on | 
					
						
							|  |  |  | 	// these being sorted and able to be compared | 
					
						
							|  |  |  | 	// they are supposed to be in a canonical format | 
					
						
							|  |  |  | 	for addr, aaddr := range sa.Addresses { | 
					
						
							|  |  |  | 		baddr := sb.Addresses[addr] | 
					
						
							|  |  |  | 		if aaddr.IP != baddr.IP { | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if aaddr.Hostname != baddr.Hostname { | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for port, aport := range sa.Ports { | 
					
						
							|  |  |  | 		bport := sb.Ports[port] | 
					
						
							|  |  |  | 		if aport.Name != bport.Name { | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if aport.Port != bport.Port { | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if aport.Protocol != bport.Protocol { | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // endpointsEquivalent checks if the update to an endpoint is something | 
					
						
							|  |  |  | // that matters to us or if they are effectively equivalent. | 
					
						
							|  |  |  | func endpointsEquivalent(a, b *object.Endpoints) bool { | 
					
						
							| 
									
										
										
										
											2019-10-04 17:48:43 +02:00
										 |  |  | 	if a == nil || b == nil { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-26 11:26:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if len(a.Subsets) != len(b.Subsets) { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// we should be able to rely on | 
					
						
							|  |  |  | 	// these being sorted and able to be compared | 
					
						
							|  |  |  | 	// they are supposed to be in a canonical format | 
					
						
							|  |  |  | 	for i, sa := range a.Subsets { | 
					
						
							|  |  |  | 		sb := b.Subsets[i] | 
					
						
							|  |  |  | 		if !subsetsEquivalent(sa, sb) { | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-08 10:11:04 -06:00
										 |  |  | func (dns *dnsControl) Modified() int64 { | 
					
						
							|  |  |  | 	unix := atomic.LoadInt64(&dns.modified) | 
					
						
							|  |  |  | 	return unix | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // updateModified set dns.modified to the current time. | 
					
						
							|  |  |  | func (dns *dnsControl) updateModifed() { | 
					
						
							|  |  |  | 	unix := time.Now().Unix() | 
					
						
							|  |  |  | 	atomic.StoreInt64(&dns.modified, unix) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-22 16:54:06 +01:00
										 |  |  | var errObj = errors.New("obj was not of the correct type") | 
					
						
							| 
									
										
										
										
											2019-07-04 01:09:12 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | const defaultResyncPeriod = 0 |