Skip to content

Commit 476dead

Browse files
committed
fixup! Implement multi forwardingRule in interanal case
1 parent a068f95 commit 476dead

File tree

1 file changed

+56
-74
lines changed

1 file changed

+56
-74
lines changed

providers/gce/gce_loadbalancer_internal.go

Lines changed: 56 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929

3030
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud"
3131
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
32-
"github.com/google/go-cmp/cmp"
3332
compute "google.golang.org/api/compute/v1"
3433
v1 "k8s.io/api/core/v1"
3534
"k8s.io/apimachinery/pkg/types"
@@ -188,121 +187,104 @@ func (g *Cloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v
188187

189188
// Get all existing forwarding rules for this service.
190189
// 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.
196191
// 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
217195
}
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-
})
222196

223197
var createdFwdRules []*compute.ForwardingRule
224198
var desiredBackendServices = make(map[string]bool)
225199

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 {
244202
// Each protocol gets its own forwarding rule.
245203
// If there's only one protocol, the forwarding rule name is the load balancer name.
246204
// Otherwise, it's load-balancer-name-<protocol>.
247205
frName := loadBalancerName
248206
if len(groupedPorts) > 1 {
249207
frName = fmt.Sprintf("%s-%s", loadBalancerName, strings.ToLower(string(protocol)))
250208
}
251-
desiredFwdRuleNames.Insert(frName)
252209

253-
newFwdRule := &compute.ForwardingRule{
210+
forwardingRule := &compute.ForwardingRule{
254211
Name: frName,
255212
Description: fwdRuleDescriptionString,
256213
IPAddress: ipToUse,
257214
BackendService: backendServiceLink,
258-
Ports: ports,
259215
IPProtocol: string(protocol),
260216
LoadBalancingScheme: string(scheme),
261217
Subnetwork: subnetworkURL,
262218
Network: g.networkURL,
263219
}
264220
if options.AllowGlobalAccess {
265-
newFwdRule.AllowGlobalAccess = options.AllowGlobalAccess
221+
forwardingRule.AllowGlobalAccess = options.AllowGlobalAccess
266222
}
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+
}
270230
}
271231

272232
// 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 {
273244
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+
}
276250
}
277251

278-
if err := g.ensureInternalForwardingRule(existingFwdRuleForProtocol, newFwdRule); err != nil {
252+
if err := g.ensureInternalForwardingRule(existingFwdRuleForProtocol, desiredForwardingRule); err != nil {
279253
return nil, err
280254
}
281-
createdFwdRules = append(createdFwdRules, newFwdRule)
255+
createdFwdRules = append(createdFwdRules, desiredForwardingRule)
282256
}
283257

284258
// 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 {
287268
continue
288269
}
270+
289271
klog.V(2).Infof("ensureInternalLoadBalancer(%v): deleting stale forwarding rule %s", loadBalancerName, frName)
290272
if err := ignoreNotFound(g.DeleteRegionForwardingRule(frName, g.region)); err != nil {
291273
return nil, err
292274
}
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 {
306288
klog.V(2).Infof("ensureInternalLoadBalancer(%v): no forwarding rules needed, all deleted.", loadBalancerName)
307289
return &v1.LoadBalancerStatus{}, nil
308290
}

0 commit comments

Comments
 (0)