code: func (c *jobController) RemoveJob(pvName string) (CleanupState, *time.Time, error) {
  	jobName := generateCleaningJobName(pvName)
  	job, err := c.jobLister.Jobs(c.namespace).Get(jobName)
  	if err != nil {
  		if errors.IsNotFound(err) {
  			return CSNotFound, nil, nil
  		}
  		return CSUnknown, nil, fmt.Errorf("Failed to check whether job %s has succeeded. Error - %s",
  			jobName, err.Error())
  	}
  
  	var startTime *time.Time
  	if startTimeStr, ok := job.Annotations[StartTimeAnnotation]; ok {
  		parsedStartTime, err := time.Parse(time.RFC3339Nano, startTimeStr)
  		if err == nil {
  			startTime = &parsedStartTime
  		} else {
  			glog.Errorf("Failed to parse start time %s: %v", startTimeStr, err)
  		}
  	}
  
  	if job.Status.Succeeded == 0 {
  		// Jobs has not yet succeeded. We assume failed jobs to be still running, until addressed by admin.
  		return CSUnknown, nil, fmt.Errorf("Error deleting Job %q: Cannot remove job that has not succeeded", job.Name)
  	}
  
  	if err := c.RuntimeConfig.APIUtil.DeleteJob(job.Name, c.namespace); err != nil {
  		return CSUnknown, nil, fmt.Errorf("Error deleting Job %q: %s", job.Name, err.Error())
  	}
  
  	return CSSucceeded, startTime, nil
  }
docs: // RemoveJob returns true and deletes the job if the cleaning job has completed.