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