@@ -28,13 +28,14 @@ const (
2828 // Default Configuration for Pod ENI resource type
2929 PodENIDefaultWorker = 30
3030
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
3839 IPv4PDDefaultWorker = 2
3940 IPv4PDDefaultWPSize = 1
4041 IPv4PDDefaultMaxDev = 0
@@ -70,26 +71,45 @@ func LoadResourceConfig() map[string]ResourceConfig {
7071func LoadResourceConfigFromConfigMap (log logr.Logger , vpcCniConfigMap * v1.ConfigMap ) map [string ]ResourceConfig {
7172 resourceConfig := getDefaultResourceConfig ()
7273
73- warmIPTarget , minIPTarget , warmPrefixTarget := ParseWinPDTargets (log , vpcCniConfigMap )
74+ warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled := ParseWinIPTargetConfigs (log , vpcCniConfigMap )
7475
7576 // If no PD configuration is set in configMap or none is valid, return default resource config
7677 if warmIPTarget == 0 && minIPTarget == 0 && warmPrefixTarget == 0 {
7778 return resourceConfig
7879 }
7980
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+ }
8390
8491 return resourceConfig
8592}
8693
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 ) {
9198 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
93113 }
94114
95115 warmIPTargetStr , foundWarmIP := vpcCniConfigMap .Data [WarmIPTarget ]
@@ -105,36 +125,74 @@ func ParseWinPDTargets(log logr.Logger, vpcCniConfigMap *v1.ConfigMap) (warmIPTa
105125 warmPrefixTargetStr , foundWarmPrefix = vpcCniConfigMap .Data [WinWarmPrefixTarget ]
106126 }
107127
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
113129 if foundWarmIP {
114130 warmIPTargetInt , err := strconv .Atoi (warmIPTargetStr )
115131 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
117134 } else {
118135 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+ }
119143 }
144+ } else {
145+ log .V (1 ).Info ("could not find warm ip target in ConfigMap, defaulting to zero" )
146+ warmIPTarget = 0
120147 }
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
121150 if foundMinIP {
122151 minIPTargetInt , err := strconv .Atoi (minIPTargetStr )
123152 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
125155 } else {
126156 minIPTarget = minIPTargetInt
127157 }
158+ } else {
159+ log .V (1 ).Info ("could not find minimum ip target in ConfigMap, defaulting to zero" )
160+ minIPTarget = 0
128161 }
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 {
130168 warmPrefixTargetInt , err := strconv .Atoi (warmPrefixTargetStr )
131169 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
133172 } else {
134173 warmPrefixTarget = warmPrefixTargetInt
135174 }
175+ } else if isPDEnabled && ! foundWarmPrefix {
176+ log .V (1 ).Info ("could not find warm prefix target in ConfigMap, defaulting to zero" )
177+ warmPrefixTarget = 0
136178 }
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
138196}
139197
140198// getDefaultResourceConfig returns the default Resource Configuration.
@@ -153,13 +211,15 @@ func getDefaultResourceConfig() map[string]ResourceConfig {
153211
154212 // Create default configuration for IPv4 Resource
155213 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 ,
159219 }
160220 ipV4Config := ResourceConfig {
161221 Name : ResourceNameIPAddress ,
162- WorkerCount : IPv4DefaultWorker ,
222+ WorkerCount : IPv4DefaultWinWorkerCount ,
163223 SupportedOS : map [string ]bool {OSWindows : true , OSLinux : false },
164224 WarmPoolConfig : & ipV4WarmPoolConfig ,
165225 }
0 commit comments