Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[release-1.25] Support for custom health probe port(not in spec) #4388

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
32 changes: 16 additions & 16 deletions pkg/provider/azure_loadbalancer_healthprobe.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,37 +99,30 @@ func (az *Cloud) buildHealthProbeRulesForPort(serviceManifest *v1.Service, port
if s == nil {
return nil
}
//not a integer
for _, item := range serviceManifest.Spec.Ports {
if strings.EqualFold(item.Name, *s) {
//found the port
return nil
}
}
//nolint:gosec
port, err := strconv.Atoi(*s)
if err != nil {
//not a integer
for _, item := range serviceManifest.Spec.Ports {
if strings.EqualFold(item.Name, *s) {
//found the port
return nil
}
}
return fmt.Errorf("port %s not found in service", *s)
}
if port < 0 || port > 65535 {
return fmt.Errorf("port %d is out of range", port)
}
for _, item := range serviceManifest.Spec.Ports {
//nolint:gosec
if item.Port == int32(port) {
//found the port
return nil
}
}
return fmt.Errorf("port %s not found in service", *s)
return nil
})
if err != nil {
return nil, fmt.Errorf("failed to parse annotation %s: %w", consts.BuildHealthProbeAnnotationKeyForPort(port.Port, consts.HealthProbeParamsPort), err)
}

if probePort != nil {
//nolint:gosec
port, err := strconv.Atoi(*probePort)
port, err := strconv.ParseInt(*probePort, 10, 32)
if err != nil {
//not a integer
for _, item := range serviceManifest.Spec.Ports {
Expand All @@ -140,13 +133,20 @@ func (az *Cloud) buildHealthProbeRulesForPort(serviceManifest *v1.Service, port
}
} else {
// Not need to verify probePort is in correct range again.
var found bool
for _, item := range serviceManifest.Spec.Ports {
//nolint:gosec
if item.Port == int32(port) {
//found the port
properties.Port = pointer.Int32(item.NodePort)
found = true
break
}
}
if !found {
//nolint:gosec
properties.Port = pointer.Int32(int32(port))
}
}
}

Expand Down
26 changes: 26 additions & 0 deletions pkg/provider/azure_loadbalancer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2600,6 +2600,32 @@ func TestReconcileLoadBalancerRule(t *testing.T) {
},
},
},
{
desc: "getExpectedLBRules should support customize health probe port ",
service: getTestServiceDualStack("test1", v1.ProtocolTCP, map[string]string{
"service.beta.kubernetes.io/port_8000_health-probe_port": "5080",
}, 80, 8000),
expectedRules: map[bool][]network.LoadBalancingRule{
consts.IPVersionIPv4: {
getTestRule(false, 80, consts.IPVersionIPv4),
getTestRule(false, 8000, consts.IPVersionIPv4),
},
consts.IPVersionIPv6: {
getTestRule(false, 80, consts.IPVersionIPv6),
getTestRule(false, 8000, consts.IPVersionIPv6),
},
},
expectedProbes: map[bool][]network.Probe{
consts.IPVersionIPv4: {
getTestProbe("Tcp", "/", pointer.Int32(5), pointer.Int32(80), pointer.Int32(10080), pointer.Int32(2), consts.IPVersionIPv4),
getTestProbe("Tcp", "/", pointer.Int32(5), pointer.Int32(8000), pointer.Int32(5080), pointer.Int32(2), consts.IPVersionIPv4),
},
consts.IPVersionIPv6: {
getTestProbe("Tcp", "/", pointer.Int32(5), pointer.Int32(80), pointer.Int32(10080), pointer.Int32(2), consts.IPVersionIPv6),
getTestProbe("Tcp", "/", pointer.Int32(5), pointer.Int32(8000), pointer.Int32(5080), pointer.Int32(2), consts.IPVersionIPv6),
},
},
},
}
rulesDualStack := getDefaultTestRules(true)
for _, rules := range rulesDualStack {
Expand Down