diff --git a/pkg/controller/controller_utils.go b/pkg/controller/controller_utils.go index a057ce7107a..2fe65a56900 100644 --- a/pkg/controller/controller_utils.go +++ b/pkg/controller/controller_utils.go @@ -231,7 +231,7 @@ type PodControlInterface interface { // CreatePodsOnNode creates a new pod accorting to the spec on the specified node. CreatePodsOnNode(nodeName, namespace string, template *api.PodTemplateSpec, object runtime.Object) error // DeletePod deletes the pod identified by podID. - DeletePod(namespace string, podID string) error + DeletePod(namespace string, podID string, object runtime.Object) error } // RealPodControl is the default implementation of PodControlInterface. @@ -324,8 +324,19 @@ func (r RealPodControl) createPods(nodeName, namespace string, template *api.Pod return nil } -func (r RealPodControl) DeletePod(namespace, podID string) error { - return r.KubeClient.Pods(namespace).Delete(podID, nil) +func (r RealPodControl) DeletePod(namespace string, podID string, object runtime.Object) error { + meta, err := api.ObjectMetaFor(object) + if err != nil { + return fmt.Errorf("object does not have ObjectMeta, %v", err) + } + if err := r.KubeClient.Pods(namespace).Delete(podID, nil); err != nil { + r.Recorder.Eventf(object, api.EventTypeWarning, "FailedDelete", "Error deleting: %v", err) + return fmt.Errorf("unable to delete pods: %v", err) + } else { + glog.V(4).Infof("Controller %v deleted pod %v", meta.Name, podID) + r.Recorder.Eventf(object, api.EventTypeNormal, "SuccessfulDelete", "Deleted pod: %v", podID) + } + return nil } type FakePodControl struct { @@ -357,13 +368,13 @@ func (f *FakePodControl) CreatePodsOnNode(nodeName, namespace string, template * return nil } -func (f *FakePodControl) DeletePod(namespace string, podName string) error { +func (f *FakePodControl) DeletePod(namespace string, podID string, object runtime.Object) error { f.Lock() defer f.Unlock() if f.Err != nil { return f.Err } - f.DeletePodName = append(f.DeletePodName, podName) + f.DeletePodName = append(f.DeletePodName, podID) return nil } diff --git a/pkg/controller/daemon/controller.go b/pkg/controller/daemon/controller.go index 96dab49cabc..aadb6c7fa3a 100644 --- a/pkg/controller/daemon/controller.go +++ b/pkg/controller/daemon/controller.go @@ -416,7 +416,7 @@ func (dsc *DaemonSetsController) manage(ds *extensions.DaemonSet) { glog.V(4).Infof("Pods to delete for daemon set %s: %+v", ds.Name, podsToDelete) for i := range podsToDelete { - if err := dsc.podControl.DeletePod(ds.Namespace, podsToDelete[i]); err != nil { + if err := dsc.podControl.DeletePod(ds.Namespace, podsToDelete[i], ds); err != nil { glog.V(2).Infof("Failed deletion, decrementing expectations for set %q/%q", ds.Namespace, ds.Name) dsc.expectations.DeletionObserved(dsKey) util.HandleError(err) diff --git a/pkg/controller/job/controller.go b/pkg/controller/job/controller.go index 8ccea7291d8..10fbe8052f6 100644 --- a/pkg/controller/job/controller.go +++ b/pkg/controller/job/controller.go @@ -346,7 +346,7 @@ func (jm *JobController) syncJob(key string) error { for i := 0; i < active; i++ { go func(ix int) { defer wait.Done() - if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name); err != nil { + if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name, &job); err != nil { defer util.HandleError(err) } }(i) @@ -440,7 +440,7 @@ func (jm *JobController) manageJob(activePods []*api.Pod, succeeded int, job *ex for i := 0; i < diff; i++ { go func(ix int) { defer wait.Done() - if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name); err != nil { + if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name, job); err != nil { defer util.HandleError(err) // Decrement the expected number of deletes because the informer won't observe this deletion jm.expectations.DeletionObserved(jobKey) diff --git a/pkg/controller/replication/replication_controller.go b/pkg/controller/replication/replication_controller.go index 6ea68d16c19..33b23854143 100644 --- a/pkg/controller/replication/replication_controller.go +++ b/pkg/controller/replication/replication_controller.go @@ -383,7 +383,7 @@ func (rm *ReplicationManager) manageReplicas(filteredPods []*api.Pod, rc *api.Re for i := 0; i < diff; i++ { go func(ix int) { defer wait.Done() - if err := rm.podControl.DeletePod(rc.Namespace, filteredPods[ix].Name); err != nil { + if err := rm.podControl.DeletePod(rc.Namespace, filteredPods[ix].Name, rc); err != nil { // Decrement the expected number of deletes because the informer won't observe this deletion glog.V(2).Infof("Failed deletion, decrementing expectations for controller %q/%q", rc.Namespace, rc.Name) rm.expectations.DeletionObserved(rcKey)