Skip to content

Commit a89c775

Browse files
authored
api: make RateLimitRedisSettings.url a pointer (#9538)
* api: make RateLimitRedisSettings.url a pointer Follow-up to #9143. url became optional (mutually exclusive with urlRef) but stayed a non-pointer string, so an unset value could not be distinguished from an explicit empty string. Make it *string so nil means unset, per review feedback. Signed-off-by: Andrey Maltsev <maltsev.andrey@gmail.com> * api: use ptr.Deref for redis URL presence check Signed-off-by: Andrey Maltsev <maltsev.andrey@gmail.com> --------- Signed-off-by: Andrey Maltsev <maltsev.andrey@gmail.com>
1 parent 800c57d commit a89c775

11 files changed

Lines changed: 46 additions & 40 deletions

api/v1alpha1/envoygateway_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ type RateLimitRedisSettings struct {
690690
// Mutually exclusive with URLRef.
691691
//
692692
// +optional
693-
URL string `json:"url,omitempty"`
693+
URL *string `json:"url,omitempty"`
694694

695695
// URLRef sources the Redis URL from a Kubernetes Secret key. Use this for GitOps
696696
// flows where the Redis endpoint is provisioned by an external controller.

api/v1alpha1/validation/envoygateway_validate.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"time"
1313

1414
corev1 "k8s.io/api/core/v1"
15+
"k8s.io/utils/ptr"
1516

1617
egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
1718
)
@@ -194,7 +195,7 @@ func validateEnvoyGatewayRateLimit(rateLimit *egv1a1.RateLimit) error {
194195
return fmt.Errorf("empty ratelimit redis settings")
195196
}
196197

197-
hasURL := redis.URL != ""
198+
hasURL := ptr.Deref(redis.URL, "") != ""
198199
hasURLRef := redis.URLRef != nil
199200
if hasURL == hasURLRef {
200201
return fmt.Errorf("exactly one of ratelimit redis url or urlRef must be set")
@@ -215,7 +216,7 @@ func validateEnvoyGatewayRateLimit(rateLimit *egv1a1.RateLimit) error {
215216
return nil
216217
}
217218

218-
return ValidateRedisURL(redis.URL)
219+
return ValidateRedisURL(*redis.URL)
219220
}
220221

221222
// ValidateRedisURL validates a ratelimit Redis URL string, which may be a single

api/v1alpha1/validation/envoygateway_validate_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func TestValidateEnvoyGateway(t *testing.T) {
277277
Backend: egv1a1.RateLimitDatabaseBackend{
278278
Type: egv1a1.RedisBackendType,
279279
Redis: &egv1a1.RateLimitRedisSettings{
280-
URL: ":foo",
280+
URL: new(":foo"),
281281
},
282282
},
283283
},
@@ -295,7 +295,7 @@ func TestValidateEnvoyGateway(t *testing.T) {
295295
Backend: egv1a1.RateLimitDatabaseBackend{
296296
Type: egv1a1.RedisBackendType,
297297
Redis: &egv1a1.RateLimitRedisSettings{
298-
URL: "localhost:6376",
298+
URL: new("localhost:6376"),
299299
},
300300
},
301301
},
@@ -313,7 +313,7 @@ func TestValidateEnvoyGateway(t *testing.T) {
313313
Backend: egv1a1.RateLimitDatabaseBackend{
314314
Type: egv1a1.RedisBackendType,
315315
Redis: &egv1a1.RateLimitRedisSettings{
316-
URL: "primary_.-,node-0:26379,node-1:26379",
316+
URL: new("primary_.-,node-0:26379,node-1:26379"),
317317
},
318318
},
319319
},
@@ -331,7 +331,7 @@ func TestValidateEnvoyGateway(t *testing.T) {
331331
Backend: egv1a1.RateLimitDatabaseBackend{
332332
Type: egv1a1.RedisBackendType,
333333
Redis: &egv1a1.RateLimitRedisSettings{
334-
URL: "node-0:6376,node-1:6376,node-2:6376",
334+
URL: new("node-0:6376,node-1:6376,node-2:6376"),
335335
},
336336
},
337337
},
@@ -1485,7 +1485,7 @@ func TestValidateEnvoyGatewayRateLimitURLRef(t *testing.T) {
14851485
},
14861486
{
14871487
name: "url only",
1488-
rateLimit: redisBackend(&egv1a1.RateLimitRedisSettings{URL: "redis.redis.svc:6379"}),
1488+
rateLimit: redisBackend(&egv1a1.RateLimitRedisSettings{URL: new("redis.redis.svc:6379")}),
14891489
expectErr: false,
14901490
},
14911491
{
@@ -1503,7 +1503,7 @@ func TestValidateEnvoyGatewayRateLimitURLRef(t *testing.T) {
15031503
{
15041504
name: "both url and urlRef set",
15051505
rateLimit: redisBackend(&egv1a1.RateLimitRedisSettings{
1506-
URL: "redis.redis.svc:6379",
1506+
URL: new("redis.redis.svc:6379"),
15071507
URLRef: &egv1a1.RedisURLSource{
15081508
SecretKeyRef: &corev1.SecretKeySelector{
15091509
LocalObjectReference: corev1.LocalObjectReference{Name: "redis-conn"},

api/v1alpha1/zz_generated.deepcopy.go

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

internal/envoygateway/config/decoder_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ func TestDecode(t *testing.T) {
170170
Backend: egv1a1.RateLimitDatabaseBackend{
171171
Type: egv1a1.RedisBackendType,
172172
Redis: &egv1a1.RateLimitRedisSettings{
173-
URL: "localhost:6379",
173+
URL: new("localhost:6379"),
174174
TLS: &egv1a1.RedisTLSSettings{
175175
CertificateRef: &gwapiv1.SecretObjectReference{
176176
Name: "ratelimit-cert",
@@ -199,7 +199,7 @@ func TestDecode(t *testing.T) {
199199
Backend: egv1a1.RateLimitDatabaseBackend{
200200
Type: egv1a1.RedisBackendType,
201201
Redis: &egv1a1.RateLimitRedisSettings{
202-
URL: "localhost:6379",
202+
URL: new("localhost:6379"),
203203
},
204204
},
205205
},

internal/infrastructure/kubernetes/proxy_infra_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func newTestInfraWithClient(t *testing.T, cli client.Client) *Infra {
100100
Backend: egv1a1.RateLimitDatabaseBackend{
101101
Type: egv1a1.RedisBackendType,
102102
Redis: &egv1a1.RateLimitRedisSettings{
103-
URL: "",
103+
URL: new(""),
104104
TLS: &egv1a1.RedisTLSSettings{
105105
CertificateRef: &gwapiv1.SecretObjectReference{
106106
Name: "ratelimit-cert",

internal/infrastructure/kubernetes/ratelimit/resource.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,8 @@ func expectedRateLimitContainerEnv(rateLimit *egv1a1.RateLimit, rateLimitDeploym
381381
redisURLEnv.ValueFrom = &corev1.EnvVarSource{
382382
SecretKeyRef: rateLimit.Backend.Redis.URLRef.SecretKeyRef,
383383
}
384-
} else {
385-
redisURLEnv.Value = rateLimit.Backend.Redis.URL
384+
} else if rateLimit.Backend.Redis.URL != nil {
385+
redisURLEnv.Value = *rateLimit.Backend.Redis.URL
386386
}
387387
env = append(env, []corev1.EnvVar{
388388
{

internal/infrastructure/kubernetes/ratelimit/resource_provider_test.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func TestServiceAccount(t *testing.T) {
100100
Backend: egv1a1.RateLimitDatabaseBackend{
101101
Type: egv1a1.RedisBackendType,
102102
Redis: &egv1a1.RateLimitRedisSettings{
103-
URL: "redis.redis.svc:6379",
103+
URL: new("redis.redis.svc:6379"),
104104
},
105105
},
106106
}
@@ -126,7 +126,7 @@ func TestService(t *testing.T) {
126126
Backend: egv1a1.RateLimitDatabaseBackend{
127127
Type: egv1a1.RedisBackendType,
128128
Redis: &egv1a1.RateLimitRedisSettings{
129-
URL: "redis.redis.svc:6379",
129+
URL: new("redis.redis.svc:6379"),
130130
},
131131
},
132132
},
@@ -137,7 +137,7 @@ func TestService(t *testing.T) {
137137
Backend: egv1a1.RateLimitDatabaseBackend{
138138
Type: egv1a1.RedisBackendType,
139139
Redis: &egv1a1.RateLimitRedisSettings{
140-
URL: "redis.redis.svc:6379",
140+
URL: new("redis.redis.svc:6379"),
141141
},
142142
},
143143
Telemetry: &egv1a1.RateLimitTelemetry{
@@ -169,7 +169,7 @@ func TestConfigmap(t *testing.T) {
169169
Backend: egv1a1.RateLimitDatabaseBackend{
170170
Type: egv1a1.RedisBackendType,
171171
Redis: &egv1a1.RateLimitRedisSettings{
172-
URL: "redis.redis.svc:6379",
172+
URL: new("redis.redis.svc:6379"),
173173
},
174174
},
175175
}
@@ -193,7 +193,7 @@ func TestPDB(t *testing.T) {
193193
Backend: egv1a1.RateLimitDatabaseBackend{
194194
Type: egv1a1.RedisBackendType,
195195
Redis: &egv1a1.RateLimitRedisSettings{
196-
URL: "redis.redis.svc:6379",
196+
URL: new("redis.redis.svc:6379"),
197197
},
198198
},
199199
},
@@ -205,7 +205,7 @@ func TestPDB(t *testing.T) {
205205
Backend: egv1a1.RateLimitDatabaseBackend{
206206
Type: egv1a1.RedisBackendType,
207207
Redis: &egv1a1.RateLimitRedisSettings{
208-
URL: "redis.redis.svc:6379",
208+
URL: new("redis.redis.svc:6379"),
209209
},
210210
},
211211
},
@@ -225,7 +225,7 @@ func TestPDB(t *testing.T) {
225225
Backend: egv1a1.RateLimitDatabaseBackend{
226226
Type: egv1a1.RedisBackendType,
227227
Redis: &egv1a1.RateLimitRedisSettings{
228-
URL: "redis.redis.svc:6379",
228+
URL: new("redis.redis.svc:6379"),
229229
},
230230
},
231231
},
@@ -260,7 +260,7 @@ func TestDeployment(t *testing.T) {
260260
Backend: egv1a1.RateLimitDatabaseBackend{
261261
Type: egv1a1.RedisBackendType,
262262
Redis: &egv1a1.RateLimitRedisSettings{
263-
URL: "redis.redis.svc:6379",
263+
URL: new("redis.redis.svc:6379"),
264264
},
265265
},
266266
}
@@ -280,7 +280,7 @@ func TestDeployment(t *testing.T) {
280280
Backend: egv1a1.RateLimitDatabaseBackend{
281281
Type: egv1a1.RedisBackendType,
282282
Redis: &egv1a1.RateLimitRedisSettings{
283-
URL: "redis.redis.svc:6379",
283+
URL: new("redis.redis.svc:6379"),
284284
},
285285
},
286286
Telemetry: &egv1a1.RateLimitTelemetry{
@@ -487,7 +487,7 @@ func TestDeployment(t *testing.T) {
487487
Backend: egv1a1.RateLimitDatabaseBackend{
488488
Type: egv1a1.RedisBackendType,
489489
Redis: &egv1a1.RateLimitRedisSettings{
490-
URL: "redis.redis.svc:6379",
490+
URL: new("redis.redis.svc:6379"),
491491
TLS: &egv1a1.RedisTLSSettings{
492492
CertificateRef: &gwapiv1.SecretObjectReference{
493493
Name: "ratelimit-cert",
@@ -558,7 +558,7 @@ func TestDeployment(t *testing.T) {
558558
Backend: egv1a1.RateLimitDatabaseBackend{
559559
Type: egv1a1.RedisBackendType,
560560
Redis: &egv1a1.RateLimitRedisSettings{
561-
URL: "redis.redis.svc:6379",
561+
URL: new("redis.redis.svc:6379"),
562562
TLS: &egv1a1.RedisTLSSettings{
563563
CertificateRef: &gwapiv1.SecretObjectReference{
564564
Name: "ratelimit-cert",
@@ -620,7 +620,7 @@ func TestDeployment(t *testing.T) {
620620
Backend: egv1a1.RateLimitDatabaseBackend{
621621
Type: egv1a1.RedisBackendType,
622622
Redis: &egv1a1.RateLimitRedisSettings{
623-
URL: "redis.redis.svc:6379",
623+
URL: new("redis.redis.svc:6379"),
624624
TLS: &egv1a1.RedisTLSSettings{
625625
CertificateRef: &gwapiv1.SecretObjectReference{
626626
Name: "ratelimit-cert-origin",
@@ -725,7 +725,7 @@ func TestDeployment(t *testing.T) {
725725
Backend: egv1a1.RateLimitDatabaseBackend{
726726
Type: egv1a1.RedisBackendType,
727727
Redis: &egv1a1.RateLimitRedisSettings{
728-
URL: "redis.redis.svc:6379",
728+
URL: new("redis.redis.svc:6379"),
729729
},
730730
},
731731
Telemetry: &egv1a1.RateLimitTelemetry{
@@ -743,7 +743,7 @@ func TestDeployment(t *testing.T) {
743743
Backend: egv1a1.RateLimitDatabaseBackend{
744744
Type: egv1a1.RedisBackendType,
745745
Redis: &egv1a1.RateLimitRedisSettings{
746-
URL: "redis.redis.svc:6379",
746+
URL: new("redis.redis.svc:6379"),
747747
},
748748
},
749749
Telemetry: &egv1a1.RateLimitTelemetry{
@@ -762,7 +762,7 @@ func TestDeployment(t *testing.T) {
762762
Backend: egv1a1.RateLimitDatabaseBackend{
763763
Type: egv1a1.RedisBackendType,
764764
Redis: &egv1a1.RateLimitRedisSettings{
765-
URL: "redis.redis.svc:6379",
765+
URL: new("redis.redis.svc:6379"),
766766
},
767767
},
768768
},
@@ -784,7 +784,7 @@ func TestDeployment(t *testing.T) {
784784
Backend: egv1a1.RateLimitDatabaseBackend{
785785
Type: egv1a1.RedisBackendType,
786786
Redis: &egv1a1.RateLimitRedisSettings{
787-
URL: "redis.redis.svc:6379",
787+
URL: new("redis.redis.svc:6379"),
788788
},
789789
},
790790
},
@@ -834,7 +834,7 @@ func TestHorizontalPodAutoscaler(t *testing.T) {
834834
Backend: egv1a1.RateLimitDatabaseBackend{
835835
Type: egv1a1.RedisBackendType,
836836
Redis: &egv1a1.RateLimitRedisSettings{
837-
URL: "redis.redis.svc:6379",
837+
URL: new("redis.redis.svc:6379"),
838838
},
839839
},
840840
},
@@ -846,7 +846,7 @@ func TestHorizontalPodAutoscaler(t *testing.T) {
846846
Backend: egv1a1.RateLimitDatabaseBackend{
847847
Type: egv1a1.RedisBackendType,
848848
Redis: &egv1a1.RateLimitRedisSettings{
849-
URL: "redis.redis.svc:6379",
849+
URL: new("redis.redis.svc:6379"),
850850
},
851851
},
852852
},
@@ -883,7 +883,7 @@ func TestHorizontalPodAutoscaler(t *testing.T) {
883883
Backend: egv1a1.RateLimitDatabaseBackend{
884884
Type: egv1a1.RedisBackendType,
885885
Redis: &egv1a1.RateLimitRedisSettings{
886-
URL: "redis.redis.svc:6379",
886+
URL: new("redis.redis.svc:6379"),
887887
},
888888
},
889889
},
@@ -898,7 +898,7 @@ func TestHorizontalPodAutoscaler(t *testing.T) {
898898
Backend: egv1a1.RateLimitDatabaseBackend{
899899
Type: egv1a1.RedisBackendType,
900900
Redis: &egv1a1.RateLimitRedisSettings{
901-
URL: "redis.redis.svc:6379",
901+
URL: new("redis.redis.svc:6379"),
902902
},
903903
},
904904
},
@@ -1063,7 +1063,7 @@ func TestValidateRedisSettings(t *testing.T) {
10631063
}
10641064
c := fakeclient.NewClientBuilder().WithScheme(envoygateway.GetScheme()).WithObjects(certSecret).Build()
10651065
require.NoError(t, Validate(context.Background(), c, redisGW(&egv1a1.RateLimitRedisSettings{
1066-
URL: "redis.redis.svc:6379",
1066+
URL: new("redis.redis.svc:6379"),
10671067
TLS: &egv1a1.RedisTLSSettings{
10681068
CertificateRef: &gwapiv1.SecretObjectReference{Name: "redis-cert"},
10691069
},

internal/infrastructure/kubernetes/ratelimit_deployment_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestCreateOrUpdateRateLimitDeployment(t *testing.T) {
3232
Backend: egv1a1.RateLimitDatabaseBackend{
3333
Type: egv1a1.RedisBackendType,
3434
Redis: &egv1a1.RateLimitRedisSettings{
35-
URL: "redis.redis.svc:6379",
35+
URL: new("redis.redis.svc:6379"),
3636
},
3737
},
3838
}
@@ -106,7 +106,7 @@ func TestDeleteRateLimitDeployment(t *testing.T) {
106106
Backend: egv1a1.RateLimitDatabaseBackend{
107107
Type: egv1a1.RedisBackendType,
108108
Redis: &egv1a1.RateLimitRedisSettings{
109-
URL: "redis.redis.svc:6379",
109+
URL: new("redis.redis.svc:6379"),
110110
},
111111
},
112112
}

internal/infrastructure/kubernetes/ratelimit_service_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestDeleteRateLimitService(t *testing.T) {
2020
Backend: egv1a1.RateLimitDatabaseBackend{
2121
Type: egv1a1.RedisBackendType,
2222
Redis: &egv1a1.RateLimitRedisSettings{
23-
URL: "redis.redis.svc:6379",
23+
URL: new("redis.redis.svc:6379"),
2424
},
2525
},
2626
}

0 commit comments

Comments
 (0)