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  }