Skip to content

Commit 9948199

Browse files
committed
Merge branch 'upstream-master' into fix-health-monitor-cycling-openshift
2 parents 3e2deac + 739b317 commit 9948199

File tree

1 file changed

+24
-34
lines changed

1 file changed

+24
-34
lines changed

pkg/openstack/loadbalancer.go

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const (
6464
defaultLoadBalancerSourceRangesIPv4 = "0.0.0.0/0"
6565
defaultLoadBalancerSourceRangesIPv6 = "::/0"
6666
activeStatus = "ACTIVE"
67+
errorStatus = "ERROR"
6768
annotationXForwardedFor = "X-Forwarded-For"
6869

6970
ServiceAnnotationLoadBalancerInternal = "service.beta.kubernetes.io/openstack-internal-load-balancer"
@@ -1176,8 +1177,8 @@ func (lbaas *LbaasV2) ensureOctaviaHealthMonitor(lbID string, name string, pool
11761177
return err
11771178
}
11781179
//Recreate health monitor with correct protocol if externalTrafficPolicy was changed
1179-
if (svcConf.healthCheckNodePort > 0 && monitor.Type != "HTTP") ||
1180-
(svcConf.healthCheckNodePort == 0 && monitor.Type == "HTTP") {
1180+
createOpts := lbaas.buildMonitorCreateOpts(svcConf, port)
1181+
if createOpts.Type != monitor.Type {
11811182
klog.InfoS("Recreating health monitor for the pool", "pool", pool.ID, "oldMonitor", monitorID)
11821183
if err := openstackutil.DeleteHealthMonitor(lbaas.lb, monitorID, lbID); err != nil {
11831184
return err
@@ -1220,6 +1221,18 @@ func (lbaas *LbaasV2) ensureOctaviaHealthMonitor(lbID string, name string, pool
12201221
return nil
12211222
}
12221223

1224+
func (lbaas *LbaasV2) canUseHTTPMonitor(port corev1.ServicePort) bool {
1225+
if lbaas.opts.LBProvider == "ovn" {
1226+
// ovn-octavia-provider doesn't support HTTP monitors at all. We got to avoid creating it with ovn.
1227+
return false
1228+
} else if port.Protocol == corev1.ProtocolUDP {
1229+
// Older Octavia versions or OVN provider doesn't support HTTP monitors on UDP pools. We got to check if that's the case.
1230+
return openstackutil.IsOctaviaFeatureSupported(lbaas.lb, openstackutil.OctaviaFeatureHTTPMonitorsOnUDP, lbaas.opts.LBProvider)
1231+
}
1232+
1233+
return true
1234+
}
1235+
12231236
// buildMonitorCreateOpts returns a v2monitors.CreateOpts without PoolID for consumption of both, fully popuplated Loadbalancers and Monitors.
12241237
func (lbaas *LbaasV2) buildMonitorCreateOpts(svcConf *serviceConfig, port corev1.ServicePort) v2monitors.CreateOpts {
12251238
opts := v2monitors.CreateOpts{
@@ -1231,22 +1244,11 @@ func (lbaas *LbaasV2) buildMonitorCreateOpts(svcConf *serviceConfig, port corev1
12311244
if port.Protocol == corev1.ProtocolUDP {
12321245
opts.Type = "UDP-CONNECT"
12331246
}
1234-
if svcConf.healthCheckNodePort > 0 {
1235-
setHTTPHealthMonitor := true
1236-
if lbaas.opts.LBProvider == "ovn" {
1237-
// ovn-octavia-provider doesn't support HTTP monitors at all. We got to avoid creating it with ovn.
1238-
setHTTPHealthMonitor = false
1239-
} else if opts.Type == "UDP-CONNECT" {
1240-
// Older Octavia versions or OVN provider doesn't support HTTP monitors on UDP pools. We got to check if that's the case.
1241-
setHTTPHealthMonitor = openstackutil.IsOctaviaFeatureSupported(lbaas.lb, openstackutil.OctaviaFeatureHTTPMonitorsOnUDP, lbaas.opts.LBProvider)
1242-
}
1243-
1244-
if setHTTPHealthMonitor {
1245-
opts.Type = "HTTP"
1246-
opts.URLPath = "/healthz"
1247-
opts.HTTPMethod = "GET"
1248-
opts.ExpectedCodes = "200"
1249-
}
1247+
if svcConf.healthCheckNodePort > 0 && lbaas.canUseHTTPMonitor(port) {
1248+
opts.Type = "HTTP"
1249+
opts.URLPath = "/healthz"
1250+
opts.HTTPMethod = "GET"
1251+
opts.ExpectedCodes = "200"
12501252
}
12511253
return opts
12521254
}
@@ -1372,20 +1374,8 @@ func (lbaas *LbaasV2) buildBatchUpdateMemberOpts(port corev1.ServicePort, nodes
13721374
Name: &node.Name,
13731375
SubnetID: &svcConf.lbMemberSubnetID,
13741376
}
1375-
if svcConf.healthCheckNodePort > 0 {
1376-
useHealthCheckNodePort := true
1377-
if lbaas.opts.LBProvider == "ovn" {
1378-
// ovn-octavia-provider doesn't support HTTP monitors at all, if we have it we got to rely on NodePort
1379-
// and UDP-CONNECT health monitor.
1380-
useHealthCheckNodePort = false
1381-
} else if port.Protocol == "UDP" {
1382-
// Older Octavia versions doesn't support HTTP monitors on UDP pools. If we have one like that, we got
1383-
// to rely on checking the NodePort instead.
1384-
useHealthCheckNodePort = openstackutil.IsOctaviaFeatureSupported(lbaas.lb, openstackutil.OctaviaFeatureHTTPMonitorsOnUDP, lbaas.opts.LBProvider)
1385-
}
1386-
if useHealthCheckNodePort {
1387-
member.MonitorPort = &svcConf.healthCheckNodePort
1388-
}
1377+
if svcConf.healthCheckNodePort > 0 && lbaas.canUseHTTPMonitor(port) {
1378+
member.MonitorPort = &svcConf.healthCheckNodePort
13891379
}
13901380
members = append(members, member)
13911381
newMembers.Insert(fmt.Sprintf("%s-%s-%d-%d", node.Name, addr, member.ProtocolPort, svcConf.healthCheckNodePort))
@@ -3462,8 +3452,8 @@ func (lbaas *LbaasV2) ensureLoadBalancerDeleted(ctx context.Context, clusterName
34623452
return nil
34633453
}
34643454

3465-
if loadbalancer.ProvisioningStatus != activeStatus {
3466-
return fmt.Errorf("load balancer %s is not ACTIVE, current provisioning status: %s", loadbalancer.ID, loadbalancer.ProvisioningStatus)
3455+
if loadbalancer.ProvisioningStatus != activeStatus && loadbalancer.ProvisioningStatus != errorStatus {
3456+
return fmt.Errorf("load balancer %s is in immutable status, current provisioning status: %s", loadbalancer.ID, loadbalancer.ProvisioningStatus)
34673457
}
34683458

34693459
if strings.HasPrefix(loadbalancer.Name, servicePrefix) {

0 commit comments

Comments
 (0)