// Delete ... func (ra *RepJobAPI) Delete() { if ra.jobID == 0 { ra.CustomAbort(http.StatusBadRequest, "id is nil") } job, err := dao.GetRepJob(ra.jobID) if err != nil { log.Errorf("failed to get job %d: %v", ra.jobID, err) ra.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } if job.Status == models.JobPending || job.Status == models.JobRunning { ra.CustomAbort(http.StatusBadRequest, fmt.Sprintf("job is %s, can not be deleted", job.Status)) } if err = dao.DeleteRepJob(ra.jobID); err != nil { log.Errorf("failed to deleted job %d: %v", ra.jobID, err) ra.CustomAbort(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) } }
// Reset resets the state machine so it will start handling another job. func (sm *SM) Reset(jid int64) error { //To ensure the new jobID is visible to the thread to stop the SM sm.lock.Lock() sm.JobID = jid sm.desiredState = "" sm.lock.Unlock() sm.Logger = utils.NewLogger(sm.JobID) //init parms job, err := dao.GetRepJob(sm.JobID) if err != nil { return fmt.Errorf("Failed to get job, error: %v", err) } if job == nil { return fmt.Errorf("The job doesn't exist in DB, job id: %d", sm.JobID) } policy, err := dao.GetRepPolicy(job.PolicyID) if err != nil { return fmt.Errorf("Failed to get policy, error: %v", err) } if policy == nil { return fmt.Errorf("The policy doesn't exist in DB, policy id:%d", job.PolicyID) } sm.Parms = &RepJobParm{ LocalRegURL: config.LocalRegURL(), Repository: job.Repository, Tags: job.TagList, Enabled: policy.Enabled, Operation: job.Operation, Insecure: !config.VerifyRemoteCert(), } if policy.Enabled == 0 { //worker will cancel this job return nil } target, err := dao.GetRepTarget(policy.TargetID) if err != nil { return fmt.Errorf("Failed to get target, error: %v", err) } if target == nil { return fmt.Errorf("The target doesn't exist in DB, target id: %d", policy.TargetID) } sm.Parms.TargetURL = target.URL sm.Parms.TargetUsername = target.Username pwd := target.Password if len(pwd) != 0 { pwd, err = uti.ReversibleDecrypt(pwd) if err != nil { return fmt.Errorf("failed to decrypt password: %v", err) } } sm.Parms.TargetPassword = pwd //init states handlers sm.Handlers = make(map[string]StateHandler) sm.Transitions = make(map[string]map[string]struct{}) sm.CurrentState = models.JobPending sm.AddTransition(models.JobPending, models.JobRunning, StatusUpdater{sm.JobID, models.JobRunning}) sm.AddTransition(models.JobRetrying, models.JobRunning, StatusUpdater{sm.JobID, models.JobRunning}) sm.Handlers[models.JobError] = StatusUpdater{sm.JobID, models.JobError} sm.Handlers[models.JobStopped] = StatusUpdater{sm.JobID, models.JobStopped} sm.Handlers[models.JobRetrying] = Retry{sm.JobID} switch sm.Parms.Operation { case models.RepOpTransfer: addImgTransferTransition(sm) case models.RepOpDelete: addImgDeleteTransition(sm) default: err = fmt.Errorf("unsupported operation: %s", sm.Parms.Operation) } return err }