1
1
package config
2
2
3
3
import (
4
+ "fmt"
4
5
"strings"
5
6
"time"
6
7
@@ -16,6 +17,7 @@ const (
16
17
flagLogLevel = "log-level"
17
18
flagK8sClusterName = "cluster-name"
18
19
flagDefaultTags = "default-tags"
20
+ flagResourcePrefix = "resource-prefix"
19
21
flagDefaultTargetType = "default-target-type"
20
22
flagExternalManagedTags = "external-managed-tags"
21
23
flagServiceTargetENISGTags = "service-target-eni-security-group-tags"
@@ -27,24 +29,42 @@ const (
27
29
flagBackendSecurityGroup = "backend-security-group"
28
30
flagEnableEndpointSlices = "enable-endpoint-slices"
29
31
flagDisableRestrictedSGRules = "disable-restricted-sg-rules"
30
- defaultLogLevel = "info"
31
- defaultMaxConcurrentReconciles = 3
32
- defaultMaxExponentialBackoffDelay = time .Second * 1000
33
- defaultSSLPolicy = "ELBSecurityPolicy-2016-08"
34
- defaultEnableBackendSG = true
35
- defaultEnableEndpointSlices = false
36
- defaultDisableRestrictedSGRules = false
32
+
33
+ ClusterTagPrefixKey = "clusterTagPrefix"
34
+ IngressTagPrefixKey = "ingressTagPrefix"
35
+ ServiceTagPrefixKey = "serviceTagPrefix"
36
+ BackendSGNamePrefixKey = "backendSGNamePrefix"
37
+ ClusterSgRuleLabelPrefixKey = "clusterSgRuleLabelPrefix"
38
+
39
+ defaultClusterTagPrefix = "elbv2.k8s.aws"
40
+ defaultIngressTagPrefix = "ingress.k8s.aws"
41
+ defaultServiceTagPrefix = "service.k8s.aws"
42
+ defaultBackendSGNamePrefix = "k8s-traffic"
43
+ defaultClusterSgRuleLabelPrefix = "elbv2.k8s.aws"
44
+ defaultLogLevel = "info"
45
+ defaultMaxConcurrentReconciles = 3
46
+ defaultMaxExponentialBackoffDelay = time .Second * 1000
47
+ defaultSSLPolicy = "ELBSecurityPolicy-2016-08"
48
+ defaultEnableBackendSG = true
49
+ defaultEnableEndpointSlices = false
50
+ defaultDisableRestrictedSGRules = false
37
51
)
38
52
39
53
var (
40
- trackingTagKeys = sets .NewString (
41
- "elbv2.k8s.aws/cluster" ,
42
- "elbv2.k8s.aws/resource" ,
43
- "ingress.k8s.aws/stack" ,
44
- "ingress.k8s.aws/resource" ,
45
- "service.k8s.aws/stack" ,
46
- "service.k8s.aws/resource" ,
54
+ validPrefixKeys = sets .NewString (
55
+ ClusterTagPrefixKey ,
56
+ IngressTagPrefixKey ,
57
+ ServiceTagPrefixKey ,
58
+ BackendSGNamePrefixKey ,
59
+ ClusterSgRuleLabelPrefixKey ,
47
60
)
61
+ defaultResourcePrefix = map [string ]string {
62
+ ClusterTagPrefixKey : defaultClusterTagPrefix ,
63
+ IngressTagPrefixKey : defaultIngressTagPrefix ,
64
+ ServiceTagPrefixKey : defaultServiceTagPrefix ,
65
+ BackendSGNamePrefixKey : defaultBackendSGNamePrefix ,
66
+ ClusterSgRuleLabelPrefixKey : defaultClusterSgRuleLabelPrefix ,
67
+ }
48
68
)
49
69
50
70
// ControllerConfig contains the controller configuration
@@ -69,6 +89,9 @@ type ControllerConfig struct {
69
89
// Default AWS Tags that will be applied to all AWS resources managed by this controller.
70
90
DefaultTags map [string ]string
71
91
92
+ // ResourcePrefix provides prefix for resource tags, backend SG name and worker node SG rules label.
93
+ ResourcePrefix map [string ]string
94
+
72
95
// Default target type for Ingress and Service objects
73
96
DefaultTargetType string
74
97
@@ -134,10 +157,13 @@ func (cfg *ControllerConfig) BindFlags(fs *pflag.FlagSet) {
134
157
"Disable the usage of restricted security group rules" )
135
158
fs .StringToStringVar (& cfg .ServiceTargetENISGTags , flagServiceTargetENISGTags , nil ,
136
159
"AWS Tags, in addition to cluster tags, for finding the target ENI security group to which to add inbound rules from NLBs" )
160
+ fs .StringToStringVar (& cfg .ResourcePrefix , flagResourcePrefix , defaultResourcePrefix ,
161
+ "the prefixes for resource tags, backend SG name and worker node SG rules label." )
162
+
163
+ cfg .mergeDefaultResourcePrefixVal ()
137
164
cfg .FeatureGates .BindFlags (fs )
138
165
cfg .AWSConfig .BindFlags (fs )
139
166
cfg .RuntimeConfig .BindFlags (fs )
140
-
141
167
cfg .PodWebhookConfig .BindFlags (fs )
142
168
cfg .IngressConfig .BindFlags (fs )
143
169
cfg .AddonsConfig .BindFlags (fs )
@@ -150,10 +176,23 @@ func (cfg *ControllerConfig) Validate() error {
150
176
return errors .New ("kubernetes cluster name must be specified" )
151
177
}
152
178
153
- if err := cfg .validateDefaultTagsCollisionWithTrackingTags (); err != nil {
179
+ if err := cfg .validateResourcePrefixKeys (); err != nil {
180
+ return err
181
+ }
182
+
183
+ trackingTagKeys := sets .New [string ](
184
+ cfg .ResourcePrefix [ClusterTagPrefixKey ]+ "/cluster" ,
185
+ cfg .ResourcePrefix [ClusterTagPrefixKey ]+ "/resource" ,
186
+ cfg .ResourcePrefix [IngressTagPrefixKey ]+ "/stack" ,
187
+ cfg .ResourcePrefix [IngressTagPrefixKey ]+ "/resource" ,
188
+ cfg .ResourcePrefix [ServiceTagPrefixKey ]+ "/stack" ,
189
+ cfg .ResourcePrefix [ServiceTagPrefixKey ]+ "/resource" ,
190
+ )
191
+
192
+ if err := cfg .validateDefaultTagsCollisionWithTrackingTags (trackingTagKeys ); err != nil {
154
193
return err
155
194
}
156
- if err := cfg .validateExternalManagedTagsCollisionWithTrackingTags (); err != nil {
195
+ if err := cfg .validateExternalManagedTagsCollisionWithTrackingTags (trackingTagKeys ); err != nil {
157
196
return err
158
197
}
159
198
if err := cfg .validateExternalManagedTagsCollisionWithDefaultTags (); err != nil {
@@ -168,7 +207,7 @@ func (cfg *ControllerConfig) Validate() error {
168
207
return nil
169
208
}
170
209
171
- func (cfg * ControllerConfig ) validateDefaultTagsCollisionWithTrackingTags () error {
210
+ func (cfg * ControllerConfig ) validateDefaultTagsCollisionWithTrackingTags (trackingTagKeys sets. Set [ string ] ) error {
172
211
for tagKey := range cfg .DefaultTags {
173
212
if trackingTagKeys .Has (tagKey ) {
174
213
return errors .Errorf ("tag key %v cannot be specified in %v flag" , tagKey , flagDefaultTags )
@@ -177,7 +216,7 @@ func (cfg *ControllerConfig) validateDefaultTagsCollisionWithTrackingTags() erro
177
216
return nil
178
217
}
179
218
180
- func (cfg * ControllerConfig ) validateExternalManagedTagsCollisionWithTrackingTags () error {
219
+ func (cfg * ControllerConfig ) validateExternalManagedTagsCollisionWithTrackingTags (trackingTagKeys sets. Set [ string ] ) error {
181
220
for _ , tagKey := range cfg .ExternalManagedTags {
182
221
if trackingTagKeys .Has (tagKey ) {
183
222
return errors .Errorf ("tag key %v cannot be specified in %v flag" , tagKey , flagExternalManagedTags )
@@ -214,3 +253,28 @@ func (cfg *ControllerConfig) validateBackendSecurityGroupConfiguration() error {
214
253
}
215
254
return nil
216
255
}
256
+
257
+ func (cfg * ControllerConfig ) validateResourcePrefixKeys () error {
258
+ keys := make ([]string , 0 , len (cfg .ResourcePrefix ))
259
+ for key := range cfg .ResourcePrefix {
260
+ if ! validPrefixKeys .Has (key ) {
261
+ return fmt .Errorf ("invalid key: %s. Valid keys are: %v" , key , validPrefixKeys .List ())
262
+ }
263
+ keys = append (keys , key )
264
+ }
265
+ if len (keys ) != len (validPrefixKeys .List ()) {
266
+ return fmt .Errorf ("invalid number of keys. Expected %d keys, but got %d keys" ,
267
+ len (validPrefixKeys .List ()), len (keys ))
268
+ }
269
+ return nil
270
+ }
271
+
272
+ // mergeDefaultResourcePrefixVal make sure the ResourcePrefix map always has default val for unspecified key in user-passed flag
273
+ func (cfg * ControllerConfig ) mergeDefaultResourcePrefixVal () {
274
+ // Merge user-provided values with defaults
275
+ for key , defaultVal := range defaultResourcePrefix {
276
+ if _ , exists := cfg .ResourcePrefix [key ]; ! exists {
277
+ cfg .ResourcePrefix [key ] = defaultVal
278
+ }
279
+ }
280
+ }
0 commit comments