@@ -28,11 +28,15 @@ const (
28
28
// Default Configuration for Pod ENI resource type
29
29
PodENIDefaultWorker = 30
30
30
31
+ //Note: The default warm IP target and default min IP target for secondary IP mode and PD should be the same
32
+ // This is because the ConfigMap is created...TODO finish this comment
33
+
31
34
// Default Configuration for IPv4 resource type
32
- IPv4DefaultWorker = 2
33
- IPv4DefaultWPSize = 3
34
- IPv4DefaultMaxDev = 1
35
- IPv4DefaultResSize = 0
35
+ IPv4DefaultWorker = 2
36
+ IPv4DefaultWarmIPTarget = 1
37
+ IPv4DefaultMinIPTarget = 3
38
+ IPv4DefaultMaxDev = 0
39
+ IPv4DefaultResSize = 0
36
40
37
41
// Default Configuration for IPv4 prefix resource type
38
42
IPv4PDDefaultWorker = 2
@@ -70,26 +74,41 @@ func LoadResourceConfig() map[string]ResourceConfig {
70
74
func LoadResourceConfigFromConfigMap (log logr.Logger , vpcCniConfigMap * v1.ConfigMap ) map [string ]ResourceConfig {
71
75
resourceConfig := getDefaultResourceConfig ()
72
76
73
- warmIPTarget , minIPTarget , warmPrefixTarget := ParseWinPDTargets (log , vpcCniConfigMap )
77
+ warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled := ParseWinIPConfigs (log , vpcCniConfigMap )
74
78
75
79
// If no PD configuration is set in configMap or none is valid, return default resource config
76
80
if warmIPTarget == 0 && minIPTarget == 0 && warmPrefixTarget == 0 {
77
81
return resourceConfig
78
82
}
79
83
80
- resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmIPTarget = warmIPTarget
81
- resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .MinIPTarget = minIPTarget
82
- resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmPrefixTarget = warmPrefixTarget
84
+ if isPDEnabled {
85
+ resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmIPTarget = warmIPTarget
86
+ resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .MinIPTarget = minIPTarget
87
+ resourceConfig [ResourceNameIPAddressFromPrefix ].WarmPoolConfig .WarmPrefixTarget = warmPrefixTarget
88
+ } else {
89
+ resourceConfig [ResourceNameIPAddress ].WarmPoolConfig .WarmIPTarget = warmIPTarget
90
+ resourceConfig [ResourceNameIPAddress ].WarmPoolConfig .MinIPTarget = minIPTarget
91
+ }
83
92
84
93
return resourceConfig
85
94
}
86
95
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 ) {
96
+ // ParseWinIPConfigs parses Windows configuration parameters in the ConfigMap set by users
97
+ func ParseWinIPConfigs (log logr.Logger , vpcCniConfigMap * v1.ConfigMap ) (warmIPTarget int , minIPTarget int , warmPrefixTarget int , isPDEnabled bool ) {
89
98
warmIPTarget , minIPTarget , warmPrefixTarget = 0 , 0 , 0
90
99
91
100
if vpcCniConfigMap .Data == nil {
92
- return warmIPTarget , minIPTarget , warmPrefixTarget
101
+ log .V (1 ).Info ("No configuration found in ConfigMap, falling back to using secondary IP mode default values" )
102
+ isPDEnabled = false
103
+ minIPTarget = IPv4DefaultMinIPTarget
104
+ warmIPTarget = IPv4DefaultWarmIPTarget
105
+ warmPrefixTarget = 0
106
+ return warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled
107
+ }
108
+
109
+ isPDEnabled , err := strconv .ParseBool (vpcCniConfigMap .Data [EnableWindowsPrefixDelegationKey ])
110
+ if err != nil {
111
+ isPDEnabled = false
93
112
}
94
113
95
114
warmIPTargetStr , foundWarmIP := vpcCniConfigMap .Data [WarmIPTarget ]
@@ -100,14 +119,25 @@ func ParseWinPDTargets(log logr.Logger, vpcCniConfigMap *v1.ConfigMap) (warmIPTa
100
119
if ! foundMinIP {
101
120
minIPTargetStr , foundMinIP = vpcCniConfigMap .Data [WinMinimumIPTarget ]
102
121
}
103
- warmPrefixTargetStr , foundWarmPrefix := vpcCniConfigMap .Data [WarmPrefixTarget ]
104
- if ! foundWarmPrefix {
105
- warmPrefixTargetStr , foundWarmPrefix = vpcCniConfigMap .Data [WinWarmPrefixTarget ]
122
+
123
+ var warmPrefixTargetStr string
124
+ var foundWarmPrefix bool
125
+ if ! isPDEnabled {
126
+ log .V (1 ).Info ("PD is disabled, skipping warm prefix parsing" )
127
+ } else {
128
+ warmPrefixTargetStr , foundWarmPrefix = vpcCniConfigMap .Data [WarmPrefixTarget ]
129
+ if ! foundWarmPrefix {
130
+ warmPrefixTargetStr , foundWarmPrefix = vpcCniConfigMap .Data [WinWarmPrefixTarget ]
131
+ }
106
132
}
107
133
108
- // If no configuration is found, return 0
109
- if ! foundWarmIP && ! foundMinIP && ! foundWarmPrefix {
110
- return warmIPTarget , minIPTarget , warmPrefixTarget
134
+ // Handle scenario whereby one or more parameters are not found
135
+ if isPDEnabled {
136
+ // If no configuration is found, return 0
137
+ if ! foundWarmIP && ! foundMinIP && ! foundWarmPrefix {
138
+ log .V (1 ).Info ("Prefix delegation configuration in ConfigMap is empty" )
139
+ return warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled
140
+ }
111
141
}
112
142
113
143
if foundWarmIP {
@@ -117,6 +147,11 @@ func ParseWinPDTargets(log logr.Logger, vpcCniConfigMap *v1.ConfigMap) (warmIPTa
117
147
} else {
118
148
warmIPTarget = warmIPTargetInt
119
149
}
150
+ } else {
151
+ if ! isPDEnabled {
152
+ log .V (1 ).Info ("Secondary IP mode warm IP configuration not found in ConfigMap, falling back to using default" )
153
+ warmIPTarget = IPv4DefaultWarmIPTarget
154
+ }
120
155
}
121
156
if foundMinIP {
122
157
minIPTargetInt , err := strconv .Atoi (minIPTargetStr )
@@ -125,16 +160,28 @@ func ParseWinPDTargets(log logr.Logger, vpcCniConfigMap *v1.ConfigMap) (warmIPTa
125
160
} else {
126
161
minIPTarget = minIPTargetInt
127
162
}
163
+ } else {
164
+ if ! isPDEnabled {
165
+ log .V (1 ).Info ("Secondary IP mode min IP configuration not found in ConfigMap, falling back to using default" )
166
+ warmIPTarget = IPv4DefaultMinIPTarget
167
+ }
128
168
}
129
- if foundWarmPrefix {
169
+
170
+ if ! isPDEnabled && warmIPTarget == 0 {
171
+ // Handle the unique scenario where WarmIPTarget is specifically configured to zero
172
+ // There must always be 1 warm IP to ensure that the warmpool is never empty and pods can be scheduled
173
+ warmIPTarget = 1
174
+ }
175
+
176
+ if isPDEnabled && foundWarmPrefix {
130
177
warmPrefixTargetInt , err := strconv .Atoi (warmPrefixTargetStr )
131
178
if err != nil {
132
179
log .Error (err , "failed to parse warm prefix target" , "warm prefix target" , warmPrefixTargetStr )
133
180
} else {
134
181
warmPrefixTarget = warmPrefixTargetInt
135
182
}
136
183
}
137
- return warmIPTarget , minIPTarget , warmPrefixTarget
184
+ return warmIPTarget , minIPTarget , warmPrefixTarget , isPDEnabled
138
185
}
139
186
140
187
// getDefaultResourceConfig returns the default Resource Configuration.
@@ -153,7 +200,7 @@ func getDefaultResourceConfig() map[string]ResourceConfig {
153
200
154
201
// Create default configuration for IPv4 Resource
155
202
ipV4WarmPoolConfig := WarmPoolConfig {
156
- DesiredSize : IPv4DefaultWPSize ,
203
+ DesiredSize : IPv4DefaultWarmIPTarget ,
157
204
MaxDeviation : IPv4DefaultMaxDev ,
158
205
ReservedSize : IPv4DefaultResSize ,
159
206
}
0 commit comments