aboutsummaryrefslogtreecommitdiff
path: root/plugin/kubernetes/controller.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/kubernetes/controller.go')
-rw-r--r--plugin/kubernetes/controller.go35
1 files changed, 29 insertions, 6 deletions
diff --git a/plugin/kubernetes/controller.go b/plugin/kubernetes/controller.go
index 2964f80bb..01cce28f2 100644
--- a/plugin/kubernetes/controller.go
+++ b/plugin/kubernetes/controller.go
@@ -141,11 +141,14 @@ func newdnsController(ctx context.Context, kubeClient kubernetes.Interface, opts
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:
+ apiEndpoints, ok := d.Object.(*api.Endpoints)
+ if !ok {
+ return errors.New("got non-endpoint add/update")
+ }
+ obj := object.ToEndpoints(apiEndpoints)
+
if old, exists, err := clientState.Get(obj); err == nil && exists {
if err := clientState.Update(obj); err != nil {
return err
@@ -163,17 +166,37 @@ func newdnsController(ctx context.Context, kubeClient kubernetes.Interface, opts
h.OnAdd(d.Object)
dns.updateModifed()
recordDNSProgrammingLatency(dns.getServices(obj), apiEndpoints)
+ if !opts.skipAPIObjectsCleanup {
+ *apiEndpoints = api.Endpoints{}
+ }
}
case cache.Deleted:
+ apiEndpoints, ok := d.Object.(*api.Endpoints)
+ if !ok {
+ // Assume that the object must be a cache.DeletedFinalStateUnknown.
+ // This is essentially an indicator that the Endpoint was deleted, without a containing a
+ // up-to date copy of the Endpoints object. We need to use cache.DeletedFinalStateUnknown
+ // object so it can be properly deleted by store.Delete() below, which knows how to handle it.
+ tombstone, ok := d.Object.(cache.DeletedFinalStateUnknown)
+ if !ok {
+ return errors.New("expected tombstone")
+ }
+ apiEndpoints, ok = tombstone.Obj.(*api.Endpoints)
+ if !ok {
+ return errors.New("got non-endpoint tombstone")
+ }
+ }
+ obj := object.ToEndpoints(apiEndpoints)
+
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{}
+ if !opts.skipAPIObjectsCleanup {
+ *apiEndpoints = api.Endpoints{}
+ }
}
}
return nil