// Iterate through all pods in desired state of world, and remove if they no // longer exist in the informer func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { for dswPodUID, dswPodToAdd := range dswp.desiredStateOfWorld.GetPodToAdd() { dswPodKey, err := kcache.MetaNamespaceKeyFunc(dswPodToAdd.Pod) if err != nil { glog.Errorf("MetaNamespaceKeyFunc failed for pod %q (UID %q) with: %v", dswPodKey, dswPodUID, err) continue } // retrieve the pod object from pod informer with the namespace key informerPodObj, exists, err := dswp.podInformer.GetStore().GetByKey(dswPodKey) if err != nil || informerPodObj == nil { glog.Errorf("podInformer GetByKey failed for pod %q (UID %q) with %v", dswPodKey, dswPodUID, err) continue } if exists { informerPod, ok := informerPodObj.(*api.Pod) if !ok { glog.Errorf("Failed to cast obj %#v to pod object for pod %q (UID %q)", informerPod, dswPodKey, dswPodUID) continue } informerPodUID := volumehelper.GetUniquePodName(informerPod) // Check whether the unique idenfier of the pod from dsw matches the one retrived from pod informer if informerPodUID == dswPodUID { glog.V(10).Infof( "Verified pod %q (UID %q) from dsw exists in pod informer.", dswPodKey, dswPodUID) continue } } // the pod from dsw does not exist in pod informer, or it does not match the unique idenfier retrieved // from the informer, delete it from dsw glog.V(1).Infof( "Removing pod %q (UID %q) from dsw because it does not exist in pod informer.", dswPodKey, dswPodUID) dswp.desiredStateOfWorld.DeletePod(dswPodUID, dswPodToAdd.VolumeName, dswPodToAdd.NodeName) } }
func (kd *KubeDNS) getServiceFromEndpoints(e *kapi.Endpoints) (*kapi.Service, error) { key, err := kcache.MetaNamespaceKeyFunc(e) if err != nil { return nil, err } obj, exists, err := kd.servicesStore.GetByKey(key) if err != nil { return nil, fmt.Errorf("failed to get service object from services store - %v", err) } if !exists { glog.V(1).Infof("could not find service for endpoint %q in namespace %q", e.Name, e.Namespace) return nil, nil } if svc, ok := assertIsService(obj); ok { return svc, nil } return nil, fmt.Errorf("got a non service object in services store %v", obj) }
// Returns true if the service corresponding to the given message has endpoints. // Note: Works only for services with ClusterIP. Will return an error for headless service (service without a clusterIP). // Important: Assumes that we already have the cacheLock. Callers responsibility to acquire it. // This is because the code will panic, if we try to acquire it again if we already have it. func (kd *KubeDNS) serviceWithClusterIPHasEndpoints(msg *skymsg.Service) (bool, error) { svc, ok := kd.clusterIPServiceMap[msg.Host] if !ok { // It is a headless service. return false, fmt.Errorf("method not expected to be called for headless service") } key, err := kcache.MetaNamespaceKeyFunc(svc) if err != nil { return false, err } e, exists, err := kd.endpointsStore.GetByKey(key) if err != nil { return false, fmt.Errorf("failed to get endpoints object from endpoints store - %v", err) } if !exists { return false, nil } if e, ok := e.(*kapi.Endpoints); ok { return len(e.Subsets) > 0, nil } return false, fmt.Errorf("unexpected: found non-endpoint object in endpoint store: %v", e) }
// Generates skydns records for a headless service. func (kd *KubeDNS) newHeadlessService(service *kapi.Service) error { // Create an A record for every pod in the service. // This record must be periodically updated. // Format is as follows: // For a service x, with pods a and b create DNS records, // a.x.ns.domain. and, b.x.ns.domain. key, err := kcache.MetaNamespaceKeyFunc(service) if err != nil { return err } e, exists, err := kd.endpointsStore.GetByKey(key) if err != nil { return fmt.Errorf("failed to get endpoints object from endpoints store - %v", err) } if !exists { glog.V(1).Infof("Could not find endpoints for service %q in namespace %q. DNS records will be created once endpoints show up.", service.Name, service.Namespace) return nil } if e, ok := e.(*kapi.Endpoints); ok { return kd.generateRecordsForHeadlessService(e, service) } return nil }