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  }