@@ -4,6 +4,10 @@ import (
44 "testing"
55
66 "github.com/stretchr/testify/assert"
7+ corev1 "k8s.io/api/core/v1"
8+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+ "k8s.io/utils/ptr"
10+ gwv1 "sigs.k8s.io/gateway-api/apis/v1"
711)
812
913func TestComponentLogLevelsToString (t * testing.T ) {
@@ -56,3 +60,175 @@ func TestComponentLogLevelsToString(t *testing.T) {
5660 })
5761 }
5862}
63+
64+ func TestSetLoadBalancerIPFromGateway (t * testing.T ) {
65+ tests := []struct {
66+ name string
67+ addresses []gwv1.GatewaySpecAddress
68+ serviceType * string
69+ wantIP * string
70+ wantErr error
71+ }{
72+ {
73+ name : "single valid IPv4 address with LoadBalancer service" ,
74+ addresses : []gwv1.GatewaySpecAddress {
75+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.10" },
76+ },
77+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
78+ wantIP : ptr .To ("203.0.113.10" ),
79+ wantErr : nil ,
80+ },
81+ {
82+ name : "single valid IPv6 address with LoadBalancer service" ,
83+ addresses : []gwv1.GatewaySpecAddress {
84+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "2001:db8::1" },
85+ },
86+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
87+ wantIP : ptr .To ("2001:db8::1" ),
88+ wantErr : nil ,
89+ },
90+ {
91+ name : "nil address type defaults to IPAddressType" ,
92+ addresses : []gwv1.GatewaySpecAddress {
93+ {Type : nil , Value : "192.0.2.1" },
94+ },
95+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
96+ wantIP : ptr .To ("192.0.2.1" ),
97+ wantErr : nil ,
98+ },
99+ {
100+ name : "empty addresses array with LoadBalancer service" ,
101+ addresses : []gwv1.GatewaySpecAddress {},
102+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
103+ wantIP : nil ,
104+ wantErr : nil ,
105+ },
106+ {
107+ name : "multiple valid IP addresses returns error" ,
108+ addresses : []gwv1.GatewaySpecAddress {
109+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.10" },
110+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.11" },
111+ },
112+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
113+ wantIP : nil ,
114+ wantErr : ErrMultipleAddresses ,
115+ },
116+ {
117+ name : "multiple addresses with mixed types returns error" ,
118+ addresses : []gwv1.GatewaySpecAddress {
119+ {Type : ptr .To (gwv1 .HostnameAddressType ), Value : "example.com" },
120+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.10" },
121+ },
122+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
123+ wantIP : nil ,
124+ wantErr : ErrMultipleAddresses ,
125+ },
126+ {
127+ name : "single hostname address returns error" ,
128+ addresses : []gwv1.GatewaySpecAddress {
129+ {Type : ptr .To (gwv1 .HostnameAddressType ), Value : "example.com" },
130+ },
131+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
132+ wantIP : nil ,
133+ wantErr : ErrNoValidIPAddress ,
134+ },
135+ {
136+ name : "single invalid IP address returns error" ,
137+ addresses : []gwv1.GatewaySpecAddress {
138+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "not-an-ip" },
139+ },
140+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
141+ wantIP : nil ,
142+ wantErr : ErrNoValidIPAddress ,
143+ },
144+ {
145+ name : "single invalid IP address format returns error" ,
146+ addresses : []gwv1.GatewaySpecAddress {
147+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "256.256.256.256" },
148+ },
149+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
150+ wantIP : nil ,
151+ wantErr : ErrNoValidIPAddress ,
152+ },
153+ {
154+ name : "nil type with valid IP returns IP" ,
155+ addresses : []gwv1.GatewaySpecAddress {
156+ {Type : nil , Value : "203.0.113.10" },
157+ },
158+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
159+ wantIP : ptr .To ("203.0.113.10" ),
160+ wantErr : nil ,
161+ },
162+ {
163+ name : "nil type with invalid IP returns error" ,
164+ addresses : []gwv1.GatewaySpecAddress {
165+ {Type : nil , Value : "invalid" },
166+ },
167+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
168+ wantIP : nil ,
169+ wantErr : ErrNoValidIPAddress ,
170+ },
171+ {
172+ name : "three addresses returns error" ,
173+ addresses : []gwv1.GatewaySpecAddress {
174+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.10" },
175+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.11" },
176+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.12" },
177+ },
178+ serviceType : ptr .To (string (corev1 .ServiceTypeLoadBalancer )),
179+ wantIP : nil ,
180+ wantErr : ErrMultipleAddresses ,
181+ },
182+ {
183+ name : "valid IP with ClusterIP service does not set IP" ,
184+ addresses : []gwv1.GatewaySpecAddress {
185+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.10" },
186+ },
187+ serviceType : ptr .To (string (corev1 .ServiceTypeClusterIP )),
188+ wantIP : nil ,
189+ wantErr : nil ,
190+ },
191+ {
192+ name : "valid IP with nil service type does not set IP" ,
193+ addresses : []gwv1.GatewaySpecAddress {
194+ {Type : ptr .To (gwv1 .IPAddressType ), Value : "203.0.113.10" },
195+ },
196+ serviceType : nil ,
197+ wantIP : nil ,
198+ wantErr : nil ,
199+ },
200+ }
201+
202+ for _ , tt := range tests {
203+ t .Run (tt .name , func (t * testing.T ) {
204+ gw := & gwv1.Gateway {
205+ ObjectMeta : metav1.ObjectMeta {
206+ Name : "test-gateway" ,
207+ Namespace : "default" ,
208+ },
209+ Spec : gwv1.GatewaySpec {
210+ Addresses : tt .addresses ,
211+ },
212+ }
213+
214+ svc := & HelmService {
215+ Type : tt .serviceType ,
216+ }
217+
218+ err := SetLoadBalancerIPFromGateway (gw , svc )
219+ if tt .wantErr != nil {
220+ assert .Error (t , err , "expected error" )
221+ assert .ErrorIs (t , err , tt .wantErr , "error type mismatch" )
222+ assert .Nil (t , svc .LoadBalancerIP , "expected nil IP when error occurs" )
223+ } else {
224+ assert .NoError (t , err , "unexpected error" )
225+ if tt .wantIP == nil {
226+ assert .Nil (t , svc .LoadBalancerIP , "expected nil but got %v" , svc .LoadBalancerIP )
227+ } else {
228+ assert .NotNil (t , svc .LoadBalancerIP , "expected non-nil IP" )
229+ assert .Equal (t , * tt .wantIP , * svc .LoadBalancerIP , "IP address mismatch" )
230+ }
231+ }
232+ })
233+ }
234+ }
0 commit comments