forked from hashicorp/nomad
-
Notifications
You must be signed in to change notification settings - Fork 0
/
job_periodic_force.go
151 lines (124 loc) · 3.58 KB
/
job_periodic_force.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package command
import (
"fmt"
"strings"
"github.com/hashicorp/nomad/api"
"github.com/posener/complete"
)
type JobPeriodicForceCommand struct {
Meta
}
func (c *JobPeriodicForceCommand) Help() string {
helpText := `
Usage: nomad job periodic force <job id>
This command is used to force the creation of a new instance of a periodic job.
This is used to immediately run a periodic job, even if it violates the job's
prohibit_overlap setting.
General Options:
` + generalOptionsUsage() + `
Periodic Force Options:
-detach
Return immediately instead of entering monitor mode. After the force,
the evaluation ID will be printed to the screen, which can be used to
examine the evaluation using the eval-status command.
-verbose
Display full information.
`
return strings.TrimSpace(helpText)
}
func (c *JobPeriodicForceCommand) Synopsis() string {
return "Force the launch of a periodic job"
}
func (c *JobPeriodicForceCommand) AutocompleteFlags() complete.Flags {
return mergeAutocompleteFlags(c.Meta.AutocompleteFlags(FlagSetClient),
complete.Flags{
"-detach": complete.PredictNothing,
"-verbose": complete.PredictNothing,
})
}
func (c *JobPeriodicForceCommand) AutocompleteArgs() complete.Predictor {
return complete.PredictFunc(func(a complete.Args) []string {
client, err := c.Meta.Client()
if err != nil {
return nil
}
resp, _, err := client.Jobs().PrefixList(a.Last)
if err != nil {
return []string{}
}
// filter this by periodic jobs
matches := make([]string, 0, len(resp))
for _, job := range resp {
if job.Periodic {
matches = append(matches, job.ID)
}
}
return matches
})
}
func (c *JobPeriodicForceCommand) Name() string { return "job periodic force" }
func (c *JobPeriodicForceCommand) Run(args []string) int {
var detach, verbose bool
flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
flags.Usage = func() { c.Ui.Output(c.Help()) }
flags.BoolVar(&detach, "detach", false, "")
flags.BoolVar(&verbose, "verbose", false, "")
if err := flags.Parse(args); err != nil {
return 1
}
// Check that we got exactly one argument
args = flags.Args()
if l := len(args); l != 1 {
c.Ui.Error("This command takes one argument: <job id>")
c.Ui.Error(commandErrorText(c))
return 1
}
// Truncate the id unless full length is requested
length := shortId
if verbose {
length = fullId
}
// Get the HTTP client
client, err := c.Meta.Client()
if err != nil {
c.Ui.Error(fmt.Sprintf("Error initializing client: %s", err))
return 1
}
// Check if the job exists
jobID := args[0]
jobs, _, err := client.Jobs().PrefixList(jobID)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error forcing periodic job: %s", err))
return 1
}
// filter non-periodic jobs
periodicJobs := make([]*api.JobListStub, 0, len(jobs))
for _, j := range jobs {
if j.Periodic {
periodicJobs = append(periodicJobs, j)
}
}
if len(periodicJobs) == 0 {
c.Ui.Error(fmt.Sprintf("No periodic job(s) with prefix or id %q found", jobID))
return 1
}
if len(periodicJobs) > 1 {
c.Ui.Error(fmt.Sprintf("Prefix matched multiple periodic jobs\n\n%s", createStatusListOutput(periodicJobs)))
return 1
}
jobID = periodicJobs[0].ID
// force the evaluation
evalID, _, err := client.Jobs().PeriodicForce(jobID, nil)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error forcing periodic job %q: %s", jobID, err))
return 1
}
if detach {
c.Ui.Output("Force periodic successful")
c.Ui.Output("Evaluation ID: " + evalID)
return 0
}
// Detach was not specified, so start monitoring
mon := newMonitor(c.Ui, client, length)
return mon.monitor(evalID, false)
}