github.com/maier/nomad@v0.4.1-0.20161110003312-a9e3d0b8549d/nomad/periodic_endpoint.go (about) 1 package nomad 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/armon/go-metrics" 8 "github.com/hashicorp/nomad/nomad/structs" 9 ) 10 11 // Periodic endpoint is used for periodic job interactions 12 type Periodic struct { 13 srv *Server 14 } 15 16 // Force is used to force a new instance of a periodic job 17 func (p *Periodic) Force(args *structs.PeriodicForceRequest, reply *structs.PeriodicForceResponse) error { 18 if done, err := p.srv.forward("Periodic.Force", args, args, reply); done { 19 return err 20 } 21 defer metrics.MeasureSince([]string{"nomad", "periodic", "force"}, time.Now()) 22 23 // Validate the arguments 24 if args.JobID == "" { 25 return fmt.Errorf("missing job ID for evaluation") 26 } 27 28 // Lookup the job 29 snap, err := p.srv.fsm.State().Snapshot() 30 if err != nil { 31 return err 32 } 33 job, err := snap.JobByID(args.JobID) 34 if err != nil { 35 return err 36 } 37 if job == nil { 38 return fmt.Errorf("job not found") 39 } 40 41 if !job.IsPeriodic() { 42 return fmt.Errorf("can't force launch non-periodic job") 43 } 44 45 // Force run the job. 46 eval, err := p.srv.periodicDispatcher.ForceRun(job.ID) 47 if err != nil { 48 return fmt.Errorf("force launch for job %q failed: %v", job.ID, err) 49 } 50 51 reply.EvalID = eval.ID 52 reply.EvalCreateIndex = eval.CreateIndex 53 reply.Index = eval.CreateIndex 54 return nil 55 }