-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathlimits.go
More file actions
155 lines (121 loc) · 4.04 KB
/
limits.go
File metadata and controls
155 lines (121 loc) · 4.04 KB
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
152
153
154
155
package parser
import (
"github.com/teamhephy/workflow-cli/cmd"
docopt "github.com/docopt/docopt-go"
)
// Limits routes limits commands to their specific function
func Limits(argv []string, cmdr cmd.Commander) error {
usage := `
Valid commands for limits:
limits:list list resource limits for an app
limits:set set resource limits for an app
limits:unset unset resource limits for an app
Use 'deis help [command]' to learn more.
`
switch argv[0] {
case "limits:list":
return limitsList(argv, cmdr)
case "limits:set":
return limitSet(argv, cmdr)
case "limits:unset":
return limitUnset(argv, cmdr)
default:
if printHelp(argv, usage) {
return nil
}
if argv[0] == "limits" {
argv[0] = "limits:list"
return limitsList(argv, cmdr)
}
PrintUsage(cmdr)
return nil
}
}
func limitsList(argv []string, cmdr cmd.Commander) error {
usage := `
Lists resource limits for an application.
Usage: deis limits:list [options]
Options:
-a --app=<app>
the uniquely identifiable name of the application.
`
args, err := docopt.Parse(usage, argv, true, "", false, true)
if err != nil {
return err
}
return cmdr.LimitsList(safeGetValue(args, "--app"))
}
func limitSet(argv []string, cmdr cmd.Commander) error {
usage := `
Sets resource requests and limits for an application.
A resource limit is a finite resource within a pod which we can apply
restrictions through Kubernetes. A resource request is used by Kubernetes scheduler
to select a node that can guarantee requested resource. If provided only one value,
it'll be default by Kubernetes as both request and limit. These request and limit
are applied to each individual pod, so setting a memory limit of 1G for an application
means that each pod gets 1G of memory. Value needs to be within 0 <= request <= limit
Usage: deis limits:set [options] <type>=<value>...
Arguments:
<type>
the process type as defined in your Procfile, such as 'web' or 'worker'.
Note that Dockerfile apps have a default 'cmd' process type.
<value>
The value to apply to the process type. By default, this is set to --memory.
Can be in <limit> or <request>/<limit> format eg. web=2G db=1G/2G
You can only set one type of limit per call.
With --memory, units are represented in Bytes (B), Kilobytes (K), Megabytes
(M), or Gigabytes (G). For example, 'deis limit:set cmd=1G' will restrict all
"cmd" processes to a maximum of 1 Gigabyte of memory each.
With --cpu, units are represented in the number of CPUs. For example,
'deis limit:set --cpu cmd=1' will restrict all "cmd" processes to a
maximum of 1 CPU. Alternatively, you can also use milli units to specify the
number of CPU shares the pod can use. For example, 'deis limits:set --cpu cmd=500m'
will restrict all "cmd" processes to half of a CPU.
Options:
-a --app=<app>
the uniquely identifiable name for the application.
--cpu
value apply to CPU.
-m --memory
value apply to memory. [default: true]
`
args, err := docopt.Parse(usage, argv, true, "", false, true)
if err != nil {
return err
}
app := safeGetValue(args, "--app")
limits := args["<type>=<value>"].([]string)
limitType := "memory"
if args["--cpu"].(bool) {
limitType = "cpu"
}
return cmdr.LimitsSet(app, limits, limitType)
}
func limitUnset(argv []string, cmdr cmd.Commander) error {
usage := `
Unsets resource limits for an application.
Usage: deis limits:unset [options] [--memory | --cpu] <type>...
Arguments:
<type>
the process type as defined in your Procfile, such as 'web' or 'worker'.
Note that Dockerfile apps have a default 'cmd' process type.
Options:
-a --app=<app>
the uniquely identifiable name for the application.
--cpu
limits cpu shares.
-m --memory
limits memory. [default: true]
`
args, err := docopt.Parse(usage, argv, true, "", false, true)
if err != nil {
return err
}
app := safeGetValue(args, "--app")
limits := args["<type>"].([]string)
limitType := "memory"
if args["--cpu"].(bool) {
limitType = "cpu"
}
return cmdr.LimitsUnset(app, limits, limitType)
}