Skip to content

Commit a918070

Browse files
committed
Feat: add weight to the backendRef of tcproute and udproute, and optimize the code
1 parent 0757ca3 commit a918070

File tree

12 files changed

+451
-388
lines changed

12 files changed

+451
-388
lines changed

internal/controller/nginx/config/stream/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type Upstream struct {
3434
type UpstreamServer struct {
3535
Address string
3636
Resolve bool
37+
Weight int32 // Weight for load balancing, default 1
3738
}
3839

3940
// ServerConfig holds configuration for a stream server and IP family to be used by NGINX.

internal/controller/nginx/config/stream_servers.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
gotemplate "text/template"
66

7+
"github.com/go-logr/logr"
78
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/shared"
89
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/nginx/config/stream"
910
"github.com/nginx/nginx-gateway-fabric/v2/internal/controller/state/dataplane"
@@ -13,7 +14,7 @@ import (
1314
var streamServersTemplate = gotemplate.Must(gotemplate.New("streamServers").Parse(streamServersTemplateText))
1415

1516
func (g GeneratorImpl) executeStreamServers(conf dataplane.Configuration) []executeResult {
16-
streamServers := createStreamServers(conf)
17+
streamServers := createStreamServers(g.logger, conf)
1718

1819
streamServerConfig := stream.ServerConfig{
1920
Servers: streamServers,
@@ -32,7 +33,7 @@ func (g GeneratorImpl) executeStreamServers(conf dataplane.Configuration) []exec
3233
}
3334
}
3435

35-
func createStreamServers(conf dataplane.Configuration) []stream.Server {
36+
func createStreamServers(logger logr.Logger, conf dataplane.Configuration) []stream.Server {
3637
totalServers := len(conf.TLSPassthroughServers) + len(conf.TCPServers) + len(conf.UDPServers)
3738
if totalServers == 0 {
3839
return nil
@@ -85,8 +86,23 @@ func createStreamServers(conf dataplane.Configuration) []stream.Server {
8586
streamServers = append(streamServers, streamServer)
8687
}
8788

89+
// Process Layer4 servers (TCP and UDP)
90+
processLayer4Servers(logger, conf.TCPServers, conf.UDPServers, upstreams, portSet, &streamServers)
91+
92+
return streamServers
93+
}
94+
95+
// processLayer4Servers processes TCP and UDP servers to create stream servers.
96+
func processLayer4Servers(
97+
logger logr.Logger,
98+
tcpServers []dataplane.Layer4VirtualServer,
99+
udpServers []dataplane.Layer4VirtualServer,
100+
upstreams map[string]dataplane.Upstream,
101+
portSet map[int32]struct{},
102+
streamServers *[]stream.Server,
103+
) {
88104
// Process TCP servers
89-
for i, server := range conf.TCPServers {
105+
for i, server := range tcpServers {
90106
if _, inPortSet := portSet[server.Port]; inPortSet {
91107
continue // Skip if port already in use
92108
}
@@ -97,15 +113,19 @@ func createStreamServers(conf dataplane.Configuration) []stream.Server {
97113
StatusZone: fmt.Sprintf("tcp_%d", server.Port),
98114
ProxyPass: server.UpstreamName,
99115
}
100-
streamServers = append(streamServers, streamServer)
116+
*streamServers = append(*streamServers, streamServer)
101117
portSet[server.Port] = struct{}{}
102118
} else {
103-
fmt.Printf("DEBUG: createStreamServers - TCP Server %d: Skipped - upstream not found or no endpoints\n", i)
119+
logger.V(1).Info("TCP Server skipped - upstream not found or no endpoints",
120+
"serverIndex", i,
121+
"port", server.Port,
122+
"upstreamName", server.UpstreamName,
123+
)
104124
}
105125
}
106126

107127
// Process UDP servers
108-
for _, server := range conf.UDPServers {
128+
for _, server := range udpServers {
109129
if _, inPortSet := portSet[server.Port]; inPortSet {
110130
continue // Skip if port already in use
111131
}
@@ -120,12 +140,10 @@ func createStreamServers(conf dataplane.Configuration) []stream.Server {
120140
ProxyTimeout: "1s",
121141
},
122142
}
123-
streamServers = append(streamServers, streamServer)
143+
*streamServers = append(*streamServers, streamServer)
124144
portSet[server.Port] = struct{}{}
125145
}
126146
}
127-
128-
return streamServers
129147
}
130148

131149
func getRewriteClientIPSettingsForStream(

internal/controller/nginx/config/upstreams.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,15 @@ func (g GeneratorImpl) createStreamUpstream(up dataplane.Upstream) stream.Upstre
115115
if ep.IPv6 {
116116
format = "[%s]:%d"
117117
}
118+
// Default weight to 1 if not specified
119+
weight := ep.Weight
120+
if weight == 0 {
121+
weight = 1
122+
}
118123
upstreamServers[idx] = stream.UpstreamServer{
119124
Address: fmt.Sprintf(format, ep.Address, ep.Port),
120125
Resolve: ep.Resolve,
126+
Weight: weight,
121127
}
122128
}
123129

internal/controller/nginx/config/upstreams_template.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ upstream {{ $u.Name }} {
4949
state {{ $u.StateFile }};
5050
{{- else }}
5151
{{ range $server := $u.Servers }}
52-
server {{ $server.Address }}{{ if $server.Resolve }} resolve{{ end }};
52+
server {{ $server.Address }}{{ if ne $server.Weight 0 }}{{ if ne $server.Weight 1 }} weight={{ $server.Weight }}{{ end }}{{ end }}{{ if $server.Resolve }} resolve{{ end }};
5353
{{- end }}
5454
{{- end }}
5555
}

internal/controller/nginx/modules/package-lock.json

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)