@@ -14,6 +14,7 @@ import (
14
14
"syscall"
15
15
"time"
16
16
17
+ "github.com/hashicorp/go-version"
17
18
"github.com/hashicorp/nomad/client/allocdir"
18
19
"github.com/hashicorp/nomad/client/config"
19
20
cstructs "github.com/hashicorp/nomad/client/driver/structs"
28
29
reAppcVersion = regexp .MustCompile (`appc version (\d[.\d]+)` )
29
30
)
30
31
32
+ const (
33
+ // rkt added support for CPU and memory isolators in 0.14.0. We cannot support
34
+ // an earlier version to maintain an uniform interface across all drivers
35
+ minRktVersion = "0.14.0"
36
+ conversionFactor = 1024 * 1024
37
+ )
38
+
31
39
// RktDriver is a driver for running images via Rkt
32
40
// We attempt to chose sane defaults for now, with more configuration available
33
41
// planned in the future
@@ -85,6 +93,13 @@ func (d *RktDriver) Fingerprint(cfg *config.Config, node *structs.Node) (bool, e
85
93
node .Attributes ["driver.rkt.version" ] = rktMatches [1 ]
86
94
node .Attributes ["driver.rkt.appc.version" ] = appcMatches [1 ]
87
95
96
+ minVersion , _ := version .NewVersion (minRktVersion )
97
+ currentVersion , _ := version .NewVersion (node .Attributes ["driver.rkt.version" ])
98
+ if currentVersion .LessThan (minVersion ) {
99
+ // Do not allow rkt < 0.14.0
100
+ d .logger .Printf ("[WARN] driver.rkt: please upgrade rkt to a version >= %s" , minVersion )
101
+ node .Attributes ["driver.rkt" ] = "0"
102
+ }
88
103
return true , nil
89
104
}
90
105
@@ -109,21 +124,21 @@ func (d *RktDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, e
109
124
taskLocal := filepath .Join (taskDir , allocdir .TaskLocal )
110
125
111
126
// Add the given trust prefix
112
- trust_prefix , trust_cmd := task .Config ["trust_prefix" ]
113
- if trust_cmd {
127
+ trustPrefix , trustCmd := task .Config ["trust_prefix" ]
128
+ if trustCmd {
114
129
var outBuf , errBuf bytes.Buffer
115
- cmd := exec .Command ("rkt" , "trust" , fmt .Sprintf ("--prefix=%s" , trust_prefix ))
130
+ cmd := exec .Command ("rkt" , "trust" , fmt .Sprintf ("--prefix=%s" , trustPrefix ))
116
131
cmd .Stdout = & outBuf
117
132
cmd .Stderr = & errBuf
118
133
if err := cmd .Run (); err != nil {
119
134
return nil , fmt .Errorf ("Error running rkt trust: %s\n \n Output: %s\n \n Error: %s" ,
120
135
err , outBuf .String (), errBuf .String ())
121
136
}
122
- d .logger .Printf ("[DEBUG] driver.rkt: added trust prefix: %q" , trust_prefix )
137
+ d .logger .Printf ("[DEBUG] driver.rkt: added trust prefix: %q" , trustPrefix )
123
138
}
124
139
125
140
// Build the command.
126
- var cmd_args []string
141
+ var cmdArgs []string
127
142
128
143
// Inject the environment variables.
129
144
envVars := TaskEnvironmentVariables (ctx , task )
@@ -133,33 +148,46 @@ func (d *RktDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, e
133
148
envVars .ClearAllocDir ()
134
149
135
150
for k , v := range envVars .Map () {
136
- cmd_args = append (cmd_args , fmt .Sprintf ("--set-env=%v=%v" , k , v ))
151
+ cmdArgs = append (cmdArgs , fmt .Sprintf ("--set-env=%v=%v" , k , v ))
137
152
}
138
153
139
154
// Disble signature verification if the trust command was not run.
140
- if ! trust_cmd {
141
- cmd_args = append (cmd_args , "--insecure-skip-verify" )
155
+ if ! trustCmd {
156
+ cmdArgs = append (cmdArgs , "--insecure-skip-verify" )
142
157
}
143
158
144
159
// Append the run command.
145
- cmd_args = append (cmd_args , "run" , "--mds-register=false" , img )
160
+ cmdArgs = append (cmdArgs , "run" , "--mds-register=false" , img )
146
161
147
162
// Check if the user has overriden the exec command.
148
- if exec_cmd , ok := task .Config ["command" ]; ok {
149
- cmd_args = append (cmd_args , fmt .Sprintf ("--exec=%v" , exec_cmd ))
163
+ if execCmd , ok := task .Config ["command" ]; ok {
164
+ cmdArgs = append (cmdArgs , fmt .Sprintf ("--exec=%v" , execCmd ))
165
+ }
166
+
167
+ if task .Resources .MemoryMB == 0 {
168
+ return nil , fmt .Errorf ("Memory limit cannot be zero" )
169
+ }
170
+ if task .Resources .CPU == 0 {
171
+ return nil , fmt .Errorf ("CPU limit cannot be zero" )
150
172
}
151
173
174
+ // Add memory isolator
175
+ cmdArgs = append (cmdArgs , fmt .Sprintf ("--memory=%vM" , int64 (task .Resources .MemoryMB )* conversionFactor ))
176
+
177
+ // Add CPU isolator
178
+ cmdArgs = append (cmdArgs , fmt .Sprintf ("--cpu=%vm" , int64 (task .Resources .CPU )))
179
+
152
180
// Add user passed arguments.
153
181
if len (driverConfig .Args ) != 0 {
154
182
parsed := args .ParseAndReplace (driverConfig .Args , envVars .Map ())
155
183
156
184
// Need to start arguments with "--"
157
185
if len (parsed ) > 0 {
158
- cmd_args = append (cmd_args , "--" )
186
+ cmdArgs = append (cmdArgs , "--" )
159
187
}
160
188
161
189
for _ , arg := range parsed {
162
- cmd_args = append (cmd_args , fmt .Sprintf ("%v" , arg ))
190
+ cmdArgs = append (cmdArgs , fmt .Sprintf ("%v" , arg ))
163
191
}
164
192
}
165
193
@@ -177,7 +205,7 @@ func (d *RktDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, e
177
205
return nil , fmt .Errorf ("Error opening file to redirect stderr: %v" , err )
178
206
}
179
207
180
- cmd := exec .Command ("rkt" , cmd_args ... )
208
+ cmd := exec .Command ("rkt" , cmdArgs ... )
181
209
cmd .Stdout = stdo
182
210
cmd .Stderr = stde
183
211
0 commit comments