/
add-on-hollow-nodes-remote.go
127 lines (108 loc) · 5.29 KB
/
add-on-hollow-nodes-remote.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
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
package eksconfig
import (
"errors"
"fmt"
"github.com/aws/aws-k8s-tester/pkg/randutil"
"github.com/aws/aws-k8s-tester/pkg/timeutil"
)
// AddOnHollowNodesRemote defines parameters for EKS cluster
// add-on hollow nodes remote.
// It generates loads from the remote workers (Pod) in the cluster.
// Each worker writes serially with no concurrency.
// Configure "DeploymentReplicas" accordingly to increase the concurrency.
type AddOnHollowNodesRemote struct {
// Enable is 'true' to create this add-on.
Enable bool `json:"enable"`
// Created is true when the resource has been created.
// Used for delete operations.
Created bool `json:"created" read-only:"true"`
TimeFrameCreate timeutil.TimeFrame `json:"time-frame-create" read-only:"true"`
TimeFrameDelete timeutil.TimeFrame `json:"time-frame-delete" read-only:"true"`
// Namespace is the namespace to create objects in.
Namespace string `json:"namespace"`
// RepositoryAccountID is the account ID for tester ECR image.
// e.g. "aws/aws-k8s-tester" for "[ACCOUNT_ID].dkr.ecr.[REGION].amazonaws.com/aws/aws-k8s-tester"
RepositoryAccountID string `json:"repository-account-id,omitempty"`
// RepositoryName is the repositoryName for tester ECR image.
// e.g. "aws/aws-k8s-tester" for "[ACCOUNT_ID].dkr.ecr.[REGION].amazonaws.com/aws/aws-k8s-tester"
RepositoryName string `json:"repository-name,omitempty"`
// RepositoryImageTag is the image tag for tester ECR image.
// e.g. "latest" for image URI "[ACCOUNT_ID].dkr.ecr.[REGION].amazonaws.com/aws/aws-k8s-tester:latest"
RepositoryImageTag string `json:"repository-image-tag,omitempty"`
// DeploymentReplicas is the number of replicas to create for workers.
// The total number of objects to be created is "DeploymentReplicas" * "Nodes".
DeploymentReplicas int32 `json:"deployment-replicas,omitempty"`
// Nodes is the number of hollow nodes to create.
// The total number of objects to be created is "DeploymentReplicas" * "Nodes".
Nodes int `json:"nodes"`
// NodeNamePrefix is the node name prefix for node names.
NodeNamePrefix string `json:"node-name-prefix"`
// NodeLabelPrefix is the node prefix.
NodeLabelPrefix string `json:"node-label-prefix"`
// MaxOpenFiles is number of files that can be opened by kubelet process.
// "cmd/kubelet/app.rlimit.SetNumFiles(MaxOpenFiles)" sets this for the host.
MaxOpenFiles int64 `json:"max-open-files"`
// CreatedNodeNames is the list of created "Node" object names.
CreatedNodeNames []string `json:"created-node-names" read-only:"true"`
}
// EnvironmentVariablePrefixAddOnHollowNodesRemote is the environment variable prefix used for "eksconfig".
const EnvironmentVariablePrefixAddOnHollowNodesRemote = AWS_K8S_TESTER_EKS_PREFIX + "ADD_ON_HOLLOW_NODES_REMOTE_"
// IsEnabledAddOnHollowNodesRemote returns true if "AddOnHollowNodesRemote" is enabled.
// Otherwise, nil the field for "omitempty".
func (cfg *Config) IsEnabledAddOnHollowNodesRemote() bool {
if cfg.AddOnHollowNodesRemote == nil {
return false
}
if cfg.AddOnHollowNodesRemote.Enable {
return true
}
cfg.AddOnHollowNodesRemote = nil
return false
}
func getDefaultAddOnHollowNodesRemote() *AddOnHollowNodesRemote {
return &AddOnHollowNodesRemote{
Enable: false,
DeploymentReplicas: 5,
Nodes: 2,
NodeNamePrefix: "hollow" + randutil.String(5),
NodeLabelPrefix: "hollow" + randutil.String(5),
MaxOpenFiles: 1000000,
}
}
func (cfg *Config) validateAddOnHollowNodesRemote() error {
if !cfg.IsEnabledAddOnHollowNodesRemote() {
return nil
}
if cfg.AddOnHollowNodesRemote.Namespace == "" {
cfg.AddOnHollowNodesRemote.Namespace = cfg.Name + "-hollow-nodes-remote"
}
if cfg.AddOnHollowNodesRemote.RepositoryAccountID == "" {
return errors.New("AddOnHollowNodesRemote.RepositoryAccountID empty")
}
if cfg.AddOnHollowNodesRemote.RepositoryName == "" {
return errors.New("AddOnHollowNodesRemote.RepositoryName empty")
}
if cfg.AddOnHollowNodesRemote.RepositoryImageTag == "" {
return errors.New("AddOnHollowNodesRemote.RepositoryImageTag empty")
}
if cfg.AddOnHollowNodesRemote.DeploymentReplicas == 0 {
cfg.AddOnHollowNodesRemote.DeploymentReplicas = 5
}
if cfg.AddOnHollowNodesRemote.Nodes == 0 {
cfg.AddOnHollowNodesRemote.Nodes = 2
}
if cfg.AddOnHollowNodesRemote.NodeNamePrefix == "" {
cfg.AddOnHollowNodesRemote.NodeNamePrefix = "hollow" + randutil.String(5)
}
// e.g. Unable to register node "fake-node-000004-evere" with API server: Node "fake-node-000004-evere" is invalid: [metadata.labels: Invalid value: "...-hollow-nodes-remote-fake-ami-type-duneg": must be no more than 63 characters, metadata.labels: Invalid value: "...-hollow-nodes-remote-fake-ng-name-duneg": must be no more than 63 characters, metadata.labels: Invalid value: "...-hollow-nodes-remote-fake-ng-type-duneg": must be no more than 63 characters]
if cfg.AddOnHollowNodesRemote.NodeLabelPrefix == "" {
cfg.AddOnHollowNodesRemote.NodeLabelPrefix = "hollow" + randutil.String(5)
}
if len(cfg.AddOnHollowNodesRemote.NodeLabelPrefix) > 55 {
return fmt.Errorf("invalid node label prefix %q (%d characters, label value can not be more than 63 characters)", cfg.AddOnHollowNodesRemote.NodeLabelPrefix, len(cfg.AddOnHollowNodesRemote.NodeLabelPrefix))
}
if cfg.AddOnHollowNodesRemote.MaxOpenFiles == 0 {
cfg.AddOnHollowNodesRemote.MaxOpenFiles = 1000000
}
return nil
}