@@ -29,7 +29,6 @@ import (
29
29
30
30
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud"
31
31
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
32
- "github.com/google/go-cmp/cmp"
33
32
compute "google.golang.org/api/compute/v1"
34
33
v1 "k8s.io/api/core/v1"
35
34
"k8s.io/apimachinery/pkg/types"
@@ -188,121 +187,104 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v
188
187
189
188
// Get all existing forwarding rules for this service.
190
189
// A service can have a forwarding rule with the base name, or with a protocol suffix.
191
- existingFwdRules := make (map [string ]* compute.ForwardingRule )
192
- // The `existingFwdRule` is the one with the base name, passed into this function.
193
- if existingFwdRule != nil {
194
- existingFwdRules [existingFwdRule .Name ] = existingFwdRule
195
- }
190
+ // TODO: Remove existingFwdRules and use the one from the function.
196
191
// Check for forwarding rules with protocol suffixes.
197
- if len (groupedPorts ) > 1 {
198
- for protocol := range groupedPorts {
199
- frName := fmt .Sprintf ("%s-%s" , loadBalancerName , strings .ToLower (string (protocol )))
200
- if _ , ok := existingFwdRules [frName ]; ok {
201
- continue
202
- }
203
- fr , err := g .GetRegionForwardingRule (frName , g .region )
204
- if err != nil && ! isNotFound (err ) {
205
- return nil , err
206
- }
207
- if fr != nil {
208
- existingFwdRules [fr .Name ] = fr
209
- }
210
- }
211
- }
212
-
213
- desiredFwdRuleNames := sets .NewString ()
214
- var desiredFwdRuleProtocols []v1.Protocol
215
- for protocol := range groupedPorts {
216
- desiredFwdRuleProtocols = append (desiredFwdRuleProtocols , protocol )
192
+ existingForwardingRules , err := g .getExistingForwardingRules (loadBalancerName )
193
+ if err != nil {
194
+ return nil , err
217
195
}
218
- // Sort protocols to have a stable order for naming and processing.
219
- sort .Slice (desiredFwdRuleProtocols , func (i , j int ) bool {
220
- return desiredFwdRuleProtocols [i ] < desiredFwdRuleProtocols [j ]
221
- })
222
196
223
197
var createdFwdRules []* compute.ForwardingRule
224
198
var desiredBackendServices = make (map [string ]bool )
225
199
226
- for _ , protocol := range desiredFwdRuleProtocols {
227
- portStruct := groupedPorts [protocol ]
228
- ports := portStruct .portRanges
229
-
230
- // Each protocol gets its own backend service.
231
- // The backend service name must be unique per protocol.
232
- // Pass a single-protocol map to makeBackendServiceName.
233
- singleProtocolGroupedPorts := map [v1.Protocol ]ProtocolPorts {protocol : portStruct }
234
- backendServiceName := makeBackendServiceName (loadBalancerName , clusterID , sharedBackend , scheme , singleProtocolGroupedPorts , svc .Spec .SessionAffinity )
235
- desiredBackendServices [backendServiceName ] = true
236
- backendServiceLink := g .getBackendServiceLink (backendServiceName )
237
-
238
- bsDescription := makeBackendServiceDescription (nm , sharedBackend )
239
- err = g .ensureInternalBackendService (backendServiceName , bsDescription , svc .Spec .SessionAffinity , scheme , protocol , igLinks , hc .SelfLink )
240
- if err != nil {
241
- return nil , err
242
- }
243
-
200
+ var desiredForwardingRules map [v1.Protocol ]* compute.ForwardingRule
201
+ for protocol , protocolPorts := range groupedPorts {
244
202
// Each protocol gets its own forwarding rule.
245
203
// If there's only one protocol, the forwarding rule name is the load balancer name.
246
204
// Otherwise, it's load-balancer-name-<protocol>.
247
205
frName := loadBalancerName
248
206
if len (groupedPorts ) > 1 {
249
207
frName = fmt .Sprintf ("%s-%s" , loadBalancerName , strings .ToLower (string (protocol )))
250
208
}
251
- desiredFwdRuleNames .Insert (frName )
252
209
253
- newFwdRule := & compute.ForwardingRule {
210
+ forwardingRule := & compute.ForwardingRule {
254
211
Name : frName ,
255
212
Description : fwdRuleDescriptionString ,
256
213
IPAddress : ipToUse ,
257
214
BackendService : backendServiceLink ,
258
- Ports : ports ,
259
215
IPProtocol : string (protocol ),
260
216
LoadBalancingScheme : string (scheme ),
261
217
Subnetwork : subnetworkURL ,
262
218
Network : g .networkURL ,
263
219
}
264
220
if options .AllowGlobalAccess {
265
- newFwdRule .AllowGlobalAccess = options .AllowGlobalAccess
221
+ forwardingRule .AllowGlobalAccess = options .AllowGlobalAccess
266
222
}
267
- if len (ports ) > maxL4ILBPorts {
268
- newFwdRule .Ports = nil
269
- newFwdRule .AllPorts = true
223
+ if len (protocolPorts .ports ) > maxL4ILBPorts {
224
+ forwardingRule .Ports = nil
225
+ forwardingRule .AllPorts = true
226
+ } else {
227
+ for _ , port := range protocolPorts .ports {
228
+ forwardingRule .Ports = append (forwardingRule .Ports , strconv .Itoa (port ))
229
+ }
270
230
}
271
231
272
232
// Check if a forwarding rule for this protocol already exists.
233
+ for _ , existingFwdRule := range existingForwardingRules {
234
+ if existingFwdRule .IPProtocol == forwardingRule .IPProtocol {
235
+ forwardingRule .Name = existingFwdRule .Name
236
+ break
237
+ }
238
+ }
239
+
240
+ desiredForwardingRules = append (desiredForwardingRules , forwardingRule )
241
+ }
242
+
243
+ for _ , desiredForwardingRule := range desiredForwardingRules {
273
244
var existingFwdRuleForProtocol * compute.ForwardingRule
274
- if fr , ok := existingFwdRules [frName ]; ok {
275
- existingFwdRuleForProtocol = fr
245
+ for _ , existingFwdRule := range existingForwardingRules {
246
+ if existingFwdRule .IPProtocol == desiredForwardingRule .IPProtocol {
247
+ existingFwdRuleForProtocol = existingFwdRule
248
+ break
249
+ }
276
250
}
277
251
278
- if err := g .ensureInternalForwardingRule (existingFwdRuleForProtocol , newFwdRule ); err != nil {
252
+ if err := g .ensureInternalForwardingRule (existingFwdRuleForProtocol , desiredForwardingRule ); err != nil {
279
253
return nil , err
280
254
}
281
- createdFwdRules = append (createdFwdRules , newFwdRule )
255
+ createdFwdRules = append (createdFwdRules , desiredForwardingRule )
282
256
}
283
257
284
258
// Delete any forwarding rules that are no longer needed.
285
- for frName , fr := range existingFwdRules {
286
- if desiredFwdRuleNames .Has (frName ) {
259
+ for frName , fr := range existingForwardingRules {
260
+ var matching * compute.ForwardingRule
261
+ for _ , desiredForwardingRule := range desiredForwardingRules {
262
+ if desiredForwardingRule .Name == fr .Name {
263
+ matching = desiredForwardingRule
264
+ continue
265
+ }
266
+ }
267
+ if matching != nil {
287
268
continue
288
269
}
270
+
289
271
klog .V (2 ).Infof ("ensureInternalLoadBalancer(%v): deleting stale forwarding rule %s" , loadBalancerName , frName )
290
272
if err := ignoreNotFound (g .DeleteRegionForwardingRule (frName , g .region )); err != nil {
291
273
return nil , err
292
274
}
293
- // Also delete the associated backend service if it's not used by other forwarding rules.
294
- if fr .BackendService != "" {
295
- bsName := getNameFromLink (fr .BackendService )
296
- if ! desiredBackendServices [bsName ] {
297
- klog .V (2 ).Infof ("ensureInternalLoadBalancer(%v): deleting stale backend service %s" , loadBalancerName , bsName )
298
- if err := g .teardownInternalBackendService (bsName ); err != nil {
299
- klog .Warningf ("ensureInternalLoadBalancer: could not delete old backend service %s: %v" , bsName , err )
300
- }
301
- }
302
- }
303
- }
304
-
305
- if len (createdFwdRules ) == 0 {
275
+ // // Also delete the associated backend service if it's not used by other forwarding rules.
276
+ // if fr.BackendService != "" {
277
+ // bsName := getNameFromLink(fr.BackendService)
278
+ // if !desiredBackendServices[bsName] {
279
+ // klog.V(2).Infof("ensureInternalLoadBalancer(%v): deleting stale backend service %s", loadBalancerName, bsName)
280
+ // if err := g.teardownInternalBackendService(bsName); err != nil {
281
+ // klog.Warningf("ensureInternalLoadBalancer: could not delete old backend service %s: %v", bsName, err)
282
+ // }
283
+ // }
284
+ // }
285
+ }
286
+
287
+ if len (desiredForwardingRules ) == 0 {
306
288
klog .V (2 ).Infof ("ensureInternalLoadBalancer(%v): no forwarding rules needed, all deleted." , loadBalancerName )
307
289
return & v1.LoadBalancerStatus {}, nil
308
290
}
0 commit comments