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