24
24
// Package sysinfo stores information about which features a kernel supports.
25
25
package sysinfo // import "github.com/docker/docker/"
26
26
27
- import "github.com/docker/docker/pkg/parsers"
27
+ import (
28
+ "fmt"
29
+ "strconv"
30
+ "strings"
31
+ )
28
32
29
33
// Opt for New().
30
34
type Opt func (info * SysInfo )
@@ -168,7 +172,7 @@ func (c cgroupCpusetInfo) IsCpusetMemsAvailable(provided string) (bool, error) {
168
172
}
169
173
170
174
func isCpusetListAvailable (provided , available string ) (bool , error ) {
171
- parsedAvailable , err := parsers . ParseUintList (available )
175
+ parsedAvailable , err := parseUintList (available , 0 )
172
176
if err != nil {
173
177
return false , err
174
178
}
@@ -180,7 +184,7 @@ func isCpusetListAvailable(provided, available string) (bool, error) {
180
184
maxCPUs = m
181
185
}
182
186
}
183
- parsedProvided , err := parsers . ParseUintListMaximum (provided , maxCPUs )
187
+ parsedProvided , err := parseUintList (provided , maxCPUs )
184
188
if err != nil {
185
189
return false , err
186
190
}
@@ -191,3 +195,46 @@ func isCpusetListAvailable(provided, available string) (bool, error) {
191
195
}
192
196
return true , nil
193
197
}
198
+
199
+ func parseUintList (val string , maximum int ) (map [int ]bool , error ) {
200
+ if val == "" {
201
+ return map [int ]bool {}, nil
202
+ }
203
+
204
+ availableInts := make (map [int ]bool )
205
+ split := strings .Split (val , "," )
206
+ errInvalidFormat := fmt .Errorf ("invalid format: %s" , val )
207
+
208
+ for _ , r := range split {
209
+ if ! strings .Contains (r , "-" ) {
210
+ v , err := strconv .Atoi (r )
211
+ if err != nil {
212
+ return nil , errInvalidFormat
213
+ }
214
+ if maximum != 0 && v > maximum {
215
+ return nil , fmt .Errorf ("value of out range, maximum is %d" , maximum )
216
+ }
217
+ availableInts [v ] = true
218
+ } else {
219
+ minS , maxS , _ := strings .Cut (r , "-" )
220
+ minI , err := strconv .Atoi (minS )
221
+ if err != nil {
222
+ return nil , errInvalidFormat
223
+ }
224
+ maxI , err := strconv .Atoi (maxS )
225
+ if err != nil {
226
+ return nil , errInvalidFormat
227
+ }
228
+ if maxI < minI {
229
+ return nil , errInvalidFormat
230
+ }
231
+ if maximum != 0 && maxI > maximum {
232
+ return nil , fmt .Errorf ("value of out range, maximum is %d" , maximum )
233
+ }
234
+ for i := minI ; i <= maxI ; i ++ {
235
+ availableInts [i ] = true
236
+ }
237
+ }
238
+ }
239
+ return availableInts , nil
240
+ }
0 commit comments