-
Notifications
You must be signed in to change notification settings - Fork 185
/
config.go
99 lines (81 loc) · 2.88 KB
/
config.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
package kubeletconfig
import (
"fmt"
v1 "github.com/openshift-online/ocm-sdk-go/clustersmgmt/v1"
"github.com/openshift/rosa/pkg/interactive"
"github.com/openshift/rosa/pkg/rosa"
)
//go:generate mockgen -source=config.go -package=kubeletconfig -destination=capability_checker_mock.go
type CapabilityChecker interface {
IsCapabilityEnabled(capability string) (bool, error)
}
// GetMaxPidsLimit - returns the maximum pids limit for the current organization
// the maximum is varied depending on whether the current organizaton has
// the capability.organization.bypass_pids_limit capability
func GetMaxPidsLimit(client CapabilityChecker) (int, error) {
enabled, err := client.IsCapabilityEnabled(ByPassPidsLimitCapability)
if err != nil {
return -1, err
}
if enabled {
return MaxUnsafePodPidsLimit, nil
}
return MaxPodPidsLimit, nil
}
func GetInteractiveMaxPidsLimitHelp(maxPidsLimit int) string {
return fmt.Sprintf(InteractivePodPidsLimitHelp, maxPidsLimit)
}
func GetInteractiveInput(maxPidsLimit int, kubeletConfig *v1.KubeletConfig) interactive.Input {
var defaultLimit = MinPodPidsLimit
if kubeletConfig != nil {
defaultLimit = kubeletConfig.PodPidsLimit()
}
return interactive.Input{
Question: InteractivePodPidsLimitPrompt,
Help: GetInteractiveMaxPidsLimitHelp(maxPidsLimit),
Options: nil,
Default: defaultLimit,
Required: true,
Validators: []interactive.Validator{
interactive.MinValue(MinPodPidsLimit),
interactive.MaxValue(maxPidsLimit),
},
}
}
// ValidateOrPromptForRequestedPidsLimit validates user provided limits or prompts via interactive mode
// if the user hasn't specified any limit on the command line.
func ValidateOrPromptForRequestedPidsLimit(
requestedPids int,
clusterKey string,
kubeletConfig *v1.KubeletConfig,
r *rosa.Runtime) (int, error) {
if requestedPids == PodPidsLimitOptionDefaultValue && !interactive.Enabled() {
interactive.Enable()
r.Reporter.Infof("Enabling interactive mode")
}
maxPidsLimit, err := GetMaxPidsLimit(r.OCMClient)
if err != nil {
return PodPidsLimitOptionDefaultValue,
r.Reporter.Errorf("Failed to check maximum allowed Pids limit for cluster '%s'",
clusterKey)
}
if interactive.Enabled() {
requestedPids, err = interactive.GetInt(GetInteractiveInput(maxPidsLimit, kubeletConfig))
if err != nil {
return PodPidsLimitOptionDefaultValue,
r.Reporter.Errorf("Failed reading requested Pids limit for cluster '%s': '%s'",
clusterKey, err)
}
}
if requestedPids < MinPodPidsLimit {
return PodPidsLimitOptionDefaultValue,
r.Reporter.Errorf("The minimum value for --pod-pids-limit is '%d'. You have supplied '%d'",
MinPodPidsLimit, requestedPids)
}
if requestedPids > maxPidsLimit {
return PodPidsLimitOptionDefaultValue,
r.Reporter.Errorf("The maximum value for --pod-pids-limit is '%d'. You have supplied '%d'",
maxPidsLimit, requestedPids)
}
return requestedPids, nil
}