forked from moby/swarmkit
/
resource.go
95 lines (83 loc) · 2.34 KB
/
resource.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
package flagparser
import (
"fmt"
"math/big"
"github.com/docker/go-units"
"github.com/docker/swarmkit/api"
"github.com/spf13/pflag"
)
func parseResourceCPU(flags *pflag.FlagSet, resources *api.Resources, name string) error {
cpu, err := flags.GetString(name)
if err != nil {
return err
}
nanoCPUs, ok := new(big.Rat).SetString(cpu)
if !ok {
return fmt.Errorf("invalid cpu: %s", cpu)
}
cpuRat := new(big.Rat).Mul(nanoCPUs, big.NewRat(1e9, 1))
if !cpuRat.IsInt() {
return fmt.Errorf("CPU value cannot have more than 9 decimal places: %s", cpu)
}
resources.NanoCPUs = cpuRat.Num().Int64()
return nil
}
func parseResourceMemory(flags *pflag.FlagSet, resources *api.Resources, name string) error {
memory, err := flags.GetString(name)
if err != nil {
return err
}
bytes, err := units.RAMInBytes(memory)
if err != nil {
return err
}
resources.MemoryBytes = bytes
return nil
}
func parseResource(flags *pflag.FlagSet, spec *api.ServiceSpec) error {
if flags.Changed("memory-reservation") {
if spec.Task.Resources == nil {
spec.Task.Resources = &api.ResourceRequirements{}
}
if spec.Task.Resources.Reservations == nil {
spec.Task.Resources.Reservations = &api.Resources{}
}
if err := parseResourceMemory(flags, spec.Task.Resources.Reservations, "memory-reservation"); err != nil {
return err
}
}
if flags.Changed("memory-limit") {
if spec.Task.Resources == nil {
spec.Task.Resources = &api.ResourceRequirements{}
}
if spec.Task.Resources.Limits == nil {
spec.Task.Resources.Limits = &api.Resources{}
}
if err := parseResourceMemory(flags, spec.Task.Resources.Limits, "memory-limit"); err != nil {
return err
}
}
if flags.Changed("cpu-reservation") {
if spec.Task.Resources == nil {
spec.Task.Resources = &api.ResourceRequirements{}
}
if spec.Task.Resources.Reservations == nil {
spec.Task.Resources.Reservations = &api.Resources{}
}
if err := parseResourceCPU(flags, spec.Task.Resources.Reservations, "cpu-reservation"); err != nil {
return err
}
}
if flags.Changed("cpu-limit") {
if spec.Task.Resources == nil {
spec.Task.Resources = &api.ResourceRequirements{}
}
if spec.Task.Resources.Limits == nil {
spec.Task.Resources.Limits = &api.Resources{}
}
if err := parseResourceCPU(flags, spec.Task.Resources.Limits, "cpu-limit"); err != nil {
return err
}
}
return nil
}