@@ -28,13 +28,14 @@ const (
28
28
// Default Configuration for Pod ENI resource type
29
29
PodENIDefaultWorker = 30
30
30
31
- // Default Configuration for IPv4 resource type
32
- IPv4DefaultWorker = 2
33
- IPv4DefaultWPSize = 3
34
- IPv4DefaultMaxDev = 1
35
- IPv4DefaultResSize = 0
36
-
37
- // Default Configuration for IPv4 prefix resource type
31
+ // Default Windows Configuration for IPv4 resource type
32
+ IPv4DefaultWinWorkerCount = 2
33
+ IPv4DefaultWinWarmIPTarget = 3
34
+ IPv4DefaultWinMinIPTarget = 3
35
+ IPv4DefaultWinMaxDev = 0
36
+ IPv4DefaultWinResSize = 0
37
+
38
+ // Default Windows Configuration for IPv4 prefix resource type
38
39
IPv4PDDefaultWorker = 2
39
40
IPv4PDDefaultWPSize = 1
40
41
IPv4PDDefaultMaxDev = 0
@@ -70,26 +71,45 @@ func LoadResourceConfig() map[string]ResourceConfig {
70
71
func LoadResourceConfigFromConfigMap (log logr.Logger , vpcCniConfigMap * v1.ConfigMap ) map [string ]ResourceConfig {
71
72
resourceConfig := getDefaultResourceConfig ()
72
73
73
- warmIPTarget , minIPTarget , warmPrefixTarget := ParseWinPDTargets (log , vpcCniConfigMap )
74
+ warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled := ParseWinIPTargetConfigs (log , vpcCniConfigMap )
74
75
75
76
// If no PD configuration is set in configMap or none is valid, return default resource config
76
77
if warmIPTarget == 0 && minIPTarget == 0 && warmPrefixTarget == 0 {
77
78
return resourceConfig
78
79
}
79
80
80
- resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmIPTarget = warmIPTarget
81
- resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .MinIPTarget = minIPTarget
82
- resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmPrefixTarget = warmPrefixTarget
81
+ if isPDEnabled {
82
+ resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmIPTarget = warmIPTarget
83
+ resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .MinIPTarget = minIPTarget
84
+ resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmPrefixTarget = warmPrefixTarget
85
+ } else {
86
+ resourceConfig [ResourceNameIPAddress ].WarmPoolConfig .WarmIPTarget = warmIPTarget
87
+ resourceConfig [ResourceNameIPAddress ].WarmPoolConfig .MinIPTarget = minIPTarget
88
+ resourceConfig [ResourceNameIPAddress ].WarmPoolConfig .WarmPrefixTarget = warmPrefixTarget // ignore warm prefix in secondary IP mode
89
+ }
83
90
84
91
return resourceConfig
85
92
}
86
93
87
- // ParseWinPDTargets parses config map for Windows prefix delegation configurations set by users
88
- func ParseWinPDTargets ( log logr. Logger , vpcCniConfigMap * v1. ConfigMap ) ( warmIPTarget int , minIPTarget int , warmPrefixTarget int ) {
89
- warmIPTarget , minIPTarget , warmPrefixTarget = 0 , 0 , 0
90
-
94
+ // ParseWinIPTargetConfigs parses Windows IP target configuration parameters in the amazon-vpc-cni ConfigMap
95
+ // If all three config parameter values (warm-ip-target, min-ip-target, warm-prefix-target) are 0 or unset, or config map does not exist,
96
+ // then default values for warm-ip-target and min-ip-target will be set.
97
+ func ParseWinIPTargetConfigs ( log logr. Logger , vpcCniConfigMap * v1. ConfigMap ) ( warmIPTarget int , minIPTarget int , warmPrefixTarget int , isPDEnabled bool ) {
91
98
if vpcCniConfigMap .Data == nil {
92
- return warmIPTarget , minIPTarget , warmPrefixTarget
99
+ warmIPTarget = IPv4DefaultWinWarmIPTarget
100
+ minIPTarget = IPv4DefaultWinMinIPTarget
101
+ log .V (1 ).Info (
102
+ "No ConfigMap data found, falling back to using default values" ,
103
+ "minIPTarget" , minIPTarget ,
104
+ "warmIPTarget" , warmIPTarget ,
105
+ )
106
+ return warmIPTarget , minIPTarget , 0 , false
107
+ }
108
+
109
+ isPDEnabled , err := strconv .ParseBool (vpcCniConfigMap .Data [EnableWindowsPrefixDelegationKey ])
110
+ if err != nil {
111
+ log .V (1 ).Info ("Could not parse prefix delegation flag from ConfigMap, falling back to using secondary IP mode" )
112
+ isPDEnabled = false
93
113
}
94
114
95
115
warmIPTargetStr , foundWarmIP := vpcCniConfigMap .Data [WarmIPTarget ]
@@ -105,36 +125,74 @@ func ParseWinPDTargets(log logr.Logger, vpcCniConfigMap *v1.ConfigMap) (warmIPTa
105
125
warmPrefixTargetStr , foundWarmPrefix = vpcCniConfigMap .Data [WinWarmPrefixTarget ]
106
126
}
107
127
108
- // If no configuration is found, return 0
109
- if ! foundWarmIP && ! foundMinIP && ! foundWarmPrefix {
110
- return warmIPTarget , minIPTarget , warmPrefixTarget
111
- }
112
-
128
+ // If warm IP target config value is not found, or there is an error parsing it, the value will be set to zero
113
129
if foundWarmIP {
114
130
warmIPTargetInt , err := strconv .Atoi (warmIPTargetStr )
115
131
if err != nil {
116
- log .Error (err , "failed to parse warm ip target" , "warm ip target" , warmIPTargetStr )
132
+ log .V (1 ).Info ("could not parse warm ip target, defaulting to zero" , "warm ip target" , warmIPTargetStr )
133
+ warmIPTarget = 0
117
134
} else {
118
135
warmIPTarget = warmIPTargetInt
136
+
137
+ // Handle secondary IP mode scenario where WarmIPTarget is explicitly configured to zero
138
+ // In such a case there must always be 1 warm IP to ensure that the warmpool is never empty
139
+ if ! isPDEnabled && warmIPTarget == 0 {
140
+ log .V (1 ).Info ("Explicitly setting WarmIPTarget zero value not supported in secondary IP mode, will override with 1" )
141
+ warmIPTarget = 1
142
+ }
119
143
}
144
+ } else {
145
+ log .V (1 ).Info ("could not find warm ip target in ConfigMap, defaulting to zero" )
146
+ warmIPTarget = 0
120
147
}
148
+
149
+ // If min IP target config value is not found, or there is an error parsing it, the value will be set to zero
121
150
if foundMinIP {
122
151
minIPTargetInt , err := strconv .Atoi (minIPTargetStr )
123
152
if err != nil {
124
- log .Error (err , "failed to parse minimum ip target" , "minimum ip target" , minIPTargetStr )
153
+ log .V (1 ).Info ("could not parse minimum ip target, defaulting to zero" , "minimum ip target" , minIPTargetStr )
154
+ minIPTarget = 0
125
155
} else {
126
156
minIPTarget = minIPTargetInt
127
157
}
158
+ } else {
159
+ log .V (1 ).Info ("could not find minimum ip target in ConfigMap, defaulting to zero" )
160
+ minIPTarget = 0
128
161
}
129
- if foundWarmPrefix {
162
+
163
+ // If PD is enabled and warm prefix target config value is not found, or there is an error parsing it, the value will be set to zero
164
+ if ! isPDEnabled && foundWarmPrefix {
165
+ log .V (1 ).Info ("warm prefix configuration not supported in secondary IP mode, will ignore warm prefix configuration" )
166
+ warmPrefixTarget = 0
167
+ } else if isPDEnabled && foundWarmPrefix {
130
168
warmPrefixTargetInt , err := strconv .Atoi (warmPrefixTargetStr )
131
169
if err != nil {
132
- log .Error (err , "failed to parse warm prefix target" , "warm prefix target" , warmPrefixTargetStr )
170
+ log .Error (err , "failed to parse warm prefix target, defaulting to zero" , "warm prefix target" , warmPrefixTargetStr )
171
+ warmPrefixTarget = 0
133
172
} else {
134
173
warmPrefixTarget = warmPrefixTargetInt
135
174
}
175
+ } else if isPDEnabled && ! foundWarmPrefix {
176
+ log .V (1 ).Info ("could not find warm prefix target in ConfigMap, defaulting to zero" )
177
+ warmPrefixTarget = 0
136
178
}
137
- return warmIPTarget , minIPTarget , warmPrefixTarget
179
+
180
+ if warmIPTarget == 0 && minIPTarget == 0 {
181
+ if isPDEnabled && warmPrefixTarget == 0 {
182
+ minIPTarget = IPv4PDDefaultMinIPTargetSize
183
+ warmIPTarget = IPv4PDDefaultWarmIPTargetSize
184
+ } else if ! isPDEnabled {
185
+ minIPTarget = IPv4DefaultWinMinIPTarget
186
+ warmIPTarget = IPv4DefaultWinWarmIPTarget
187
+ }
188
+ log .V (1 ).Info (
189
+ "No valid configuration values for warm-ip-target, min-ip-target and warm-prefix-target found in ConfigMap, falling back to using default values" ,
190
+ "minIPTarget" , minIPTarget ,
191
+ "warmIPTarget" , warmIPTarget ,
192
+ )
193
+ }
194
+
195
+ return warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled
138
196
}
139
197
140
198
// getDefaultResourceConfig returns the default Resource Configuration.
@@ -153,13 +211,15 @@ func getDefaultResourceConfig() map[string]ResourceConfig {
153
211
154
212
// Create default configuration for IPv4 Resource
155
213
ipV4WarmPoolConfig := WarmPoolConfig {
156
- DesiredSize : IPv4DefaultWPSize ,
157
- MaxDeviation : IPv4DefaultMaxDev ,
158
- ReservedSize : IPv4DefaultResSize ,
214
+ DesiredSize : IPv4DefaultWinWarmIPTarget ,
215
+ WarmIPTarget : IPv4DefaultWinWarmIPTarget ,
216
+ MinIPTarget : IPv4DefaultWinMinIPTarget ,
217
+ MaxDeviation : IPv4DefaultWinMaxDev ,
218
+ ReservedSize : IPv4DefaultWinResSize ,
159
219
}
160
220
ipV4Config := ResourceConfig {
161
221
Name : ResourceNameIPAddress ,
162
- WorkerCount : IPv4DefaultWorker ,
222
+ WorkerCount : IPv4DefaultWinWorkerCount ,
163
223
SupportedOS : map [string ]bool {OSWindows : true , OSLinux : false },
164
224
WarmPoolConfig : & ipV4WarmPoolConfig ,
165
225
}
0 commit comments