// List lists all Pods associated with a Build. func (lw *buildPodDeleteLW) List() (runtime.Object, error) { glog.V(5).Info("Checking for deleted build pods") buildList, err := lw.Client.Builds(kapi.NamespaceAll).List(labels.Everything(), fields.Everything()) if err != nil { glog.V(4).Infof("Failed to find any builds due to error %v", err) return nil, err } for _, build := range buildList.Items { glog.V(5).Infof("Found build %s/%s", build.Namespace, build.Name) if buildutil.IsBuildComplete(&build) { glog.V(5).Infof("Ignoring build %s/%s because it is complete", build.Namespace, build.Name) continue } pod, err := lw.KubeClient.Pods(build.Namespace).Get(buildutil.GetBuildPodName(&build)) if err != nil { if !kerrors.IsNotFound(err) { glog.V(4).Infof("Error getting pod for build %s/%s: %v", build.Namespace, build.Name, err) return nil, err } else { pod = nil } } else { if buildName, _ := buildutil.GetBuildLabel(pod); buildName != build.Name { pod = nil } } if pod == nil { deletedPod := &kapi.Pod{ ObjectMeta: kapi.ObjectMeta{ Name: buildutil.GetBuildPodName(&build), Namespace: build.Namespace, }, } glog.V(4).Infof("No build pod found for build %s/%s, sending delete event for build pod", build.Namespace, build.Name) err := lw.store.Delete(deletedPod) if err != nil { glog.V(4).Infof("Error queuing delete event: %v", err) } } else { glog.V(5).Infof("Found build pod %s/%s for build %s", pod.Namespace, pod.Name, build.Name) } } return &kapi.PodList{}, nil }
// List returns an empty list but adds delete events to the store for all Builds that have been deleted but still have pods. func (lw *buildDeleteLW) List() (runtime.Object, error) { glog.V(5).Info("Checking for deleted builds") podList, err := listPods(lw.KubeClient) if err != nil { glog.V(4).Infof("Failed to find any pods due to error %v", err) return nil, err } for _, pod := range podList.Items { buildName, exists := buildutil.GetBuildLabel(&pod) if !exists { continue } glog.V(5).Infof("Found build pod %s/%s", pod.Namespace, pod.Name) build, err := lw.Client.Builds(pod.Namespace).Get(buildName) if err != nil && !kerrors.IsNotFound(err) { glog.V(4).Infof("Error getting build for pod %s/%s: %v", pod.Namespace, pod.Name, err) return nil, err } if err != nil && kerrors.IsNotFound(err) { build = nil } if build == nil { deletedBuild := &buildapi.Build{ ObjectMeta: kapi.ObjectMeta{ Name: buildName, Namespace: pod.Namespace, }, } glog.V(4).Infof("No build found for build pod %s/%s, deleting pod", pod.Namespace, pod.Name) err := lw.store.Delete(deletedBuild) if err != nil { glog.V(4).Infof("Error queuing delete event: %v", err) } } else { glog.V(5).Infof("Found build %s/%s for pod %s", build.Namespace, build.Name, pod.Name) } } return &buildapi.BuildList{}, nil }
// HandleBuildDeletion deletes a build pod if the corresponding build has been deleted func (bc *BuildDeleteController) HandleBuildDeletion(build *buildapi.Build) error { glog.V(4).Infof("Handling deletion of build %s", build.Name) podName := buildutil.GetBuildPodName(build) pod, err := bc.PodManager.GetPod(build.Namespace, podName) if err != nil && !errors.IsNotFound(err) { glog.V(2).Infof("Failed to find pod with name %s for Build %s in namespace %s due to error: %v", podName, build.Name, build.Namespace, err) return err } if pod == nil { glog.V(2).Infof("Did not find pod with name %s for Build %s in namespace %s", podName, build.Name, build.Namespace) return nil } if buildName, _ := buildutil.GetBuildLabel(pod); buildName != build.Name { glog.V(2).Infof("Not deleting pod %s/%s because the build label %s does not match the build name %s", pod.Namespace, podName, buildName, build.Name) return nil } err = bc.PodManager.DeletePod(build.Namespace, pod) if err != nil && !errors.IsNotFound(err) { glog.V(2).Infof("Failed to delete pod %s/%s for Build %s due to error: %v", build.Namespace, podName, build.Name, err) return err } return nil }