Skip to content

Commit e3e571d

Browse files
authored
GenerateVirtualServer upstreams config refactor (#7264)
1 parent 96044a3 commit e3e571d

File tree

2 files changed

+145
-62
lines changed

2 files changed

+145
-62
lines changed

internal/configs/virtualserver.go

Lines changed: 76 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -473,63 +473,37 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
473473

474474
// generate upstreams for VirtualServer
475475
for _, u := range vsEx.VirtualServer.Spec.Upstreams {
476-
477-
if (sslConfig == nil || !vsc.cfgParams.HTTP2) && isGRPC(u.Type) {
478-
vsc.addWarningf(vsEx.VirtualServer, "gRPC cannot be configured for upstream %s. gRPC requires enabled HTTP/2 and TLS termination.", u.Name)
479-
}
480-
481-
upstreamName := virtualServerUpstreamNamer.GetNameForUpstream(u.Name)
482-
upstreamNamespace := vsEx.VirtualServer.Namespace
483-
endpoints := vsc.generateEndpointsForUpstream(vsEx.VirtualServer, upstreamNamespace, u, vsEx)
484-
backupEndpoints := vsc.generateBackupEndpointsForUpstream(vsEx.VirtualServer, upstreamNamespace, u, vsEx)
485-
486-
// isExternalNameSvc is always false for OSS
487-
_, isExternalNameSvc := vsEx.ExternalNameSvcs[GenerateExternalNameSvcKey(upstreamNamespace, u.Service)]
488-
ups := vsc.generateUpstream(vsEx.VirtualServer, upstreamName, u, isExternalNameSvc, endpoints, backupEndpoints)
489-
upstreams = append(upstreams, ups)
490-
491-
u.TLS.Enable = isTLSEnabled(u, vsc.spiffeCerts, vsEx.VirtualServer.Spec.InternalRoute)
492-
crUpstreams[upstreamName] = u
493-
494-
if hc := generateHealthCheck(u, upstreamName, vsc.cfgParams); hc != nil {
495-
healthChecks = append(healthChecks, *hc)
496-
if u.HealthCheck.StatusMatch != "" {
497-
statusMatches = append(
498-
statusMatches,
499-
generateUpstreamStatusMatch(upstreamName, u.HealthCheck.StatusMatch),
500-
)
501-
}
502-
}
476+
upstreams, healthChecks, statusMatches = generateUpstreams(
477+
sslConfig,
478+
vsc,
479+
u,
480+
vsEx.VirtualServer,
481+
vsEx.VirtualServer.Namespace,
482+
virtualServerUpstreamNamer,
483+
vsEx,
484+
upstreams,
485+
crUpstreams,
486+
healthChecks,
487+
statusMatches,
488+
)
503489
}
504490
// generate upstreams for each VirtualServerRoute
505491
for _, vsr := range vsEx.VirtualServerRoutes {
506492
upstreamNamer := NewUpstreamNamerForVirtualServerRoute(vsEx.VirtualServer, vsr)
507493
for _, u := range vsr.Spec.Upstreams {
508-
if (sslConfig == nil || !vsc.cfgParams.HTTP2) && isGRPC(u.Type) {
509-
vsc.addWarningf(vsr, "gRPC cannot be configured for upstream %s. gRPC requires enabled HTTP/2 and TLS termination", u.Name)
510-
}
511-
512-
upstreamName := upstreamNamer.GetNameForUpstream(u.Name)
513-
upstreamNamespace := vsr.Namespace
514-
endpoints := vsc.generateEndpointsForUpstream(vsr, upstreamNamespace, u, vsEx)
515-
backup := vsc.generateBackupEndpointsForUpstream(vsEx.VirtualServer, upstreamNamespace, u, vsEx)
516-
517-
// isExternalNameSvc is always false for OSS
518-
_, isExternalNameSvc := vsEx.ExternalNameSvcs[GenerateExternalNameSvcKey(upstreamNamespace, u.Service)]
519-
ups := vsc.generateUpstream(vsr, upstreamName, u, isExternalNameSvc, endpoints, backup)
520-
upstreams = append(upstreams, ups)
521-
u.TLS.Enable = isTLSEnabled(u, vsc.spiffeCerts, vsEx.VirtualServer.Spec.InternalRoute)
522-
crUpstreams[upstreamName] = u
523-
524-
if hc := generateHealthCheck(u, upstreamName, vsc.cfgParams); hc != nil {
525-
healthChecks = append(healthChecks, *hc)
526-
if u.HealthCheck.StatusMatch != "" {
527-
statusMatches = append(
528-
statusMatches,
529-
generateUpstreamStatusMatch(upstreamName, u.HealthCheck.StatusMatch),
530-
)
531-
}
532-
}
494+
upstreams, healthChecks, statusMatches = generateUpstreams(
495+
sslConfig,
496+
vsc,
497+
u,
498+
vsr,
499+
vsr.Namespace,
500+
upstreamNamer,
501+
vsEx,
502+
upstreams,
503+
crUpstreams,
504+
healthChecks,
505+
statusMatches,
506+
)
533507
}
534508
}
535509

@@ -552,11 +526,7 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
552526

553527
// generates config for VirtualServer routes
554528
for _, r := range vsEx.VirtualServer.Spec.Routes {
555-
errorPages := errorPageDetails{
556-
pages: r.ErrorPages,
557-
index: len(errorPageLocations),
558-
owner: vsEx.VirtualServer,
559-
}
529+
errorPages := generateErrorPageDetails(r.ErrorPages, errorPageLocations, vsEx.VirtualServer)
560530
errorPageLocations = append(errorPageLocations, generateErrorPageLocations(errorPages.index, errorPages.pages)...)
561531

562532
// ignore routes that reference VirtualServerRoute
@@ -700,11 +670,7 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
700670
isVSR := true
701671
upstreamNamer := NewUpstreamNamerForVirtualServerRoute(vsEx.VirtualServer, vsr)
702672
for _, r := range vsr.Spec.Subroutes {
703-
errorPages := errorPageDetails{
704-
pages: r.ErrorPages,
705-
index: len(errorPageLocations),
706-
owner: vsr,
707-
}
673+
errorPages := generateErrorPageDetails(r.ErrorPages, errorPageLocations, vsr)
708674
errorPageLocations = append(errorPageLocations, generateErrorPageLocations(errorPages.index, errorPages.pages)...)
709675
vsrNamespaceName := fmt.Sprintf("%v/%v", vsr.Namespace, vsr.Name)
710676
// use the VirtualServer error pages if the route does not define any
@@ -930,6 +896,46 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
930896
return vsCfg, vsc.warnings
931897
}
932898

899+
func generateUpstreams(
900+
sslConfig *version2.SSL,
901+
vsc *virtualServerConfigurator,
902+
u conf_v1.Upstream,
903+
owner runtime.Object,
904+
ownerNamespace string,
905+
upstreamNamer *upstreamNamer,
906+
vsEx *VirtualServerEx,
907+
upstreams []version2.Upstream,
908+
crUpstreams map[string]conf_v1.Upstream,
909+
healthChecks []version2.HealthCheck,
910+
statusMatches []version2.StatusMatch,
911+
) ([]version2.Upstream, []version2.HealthCheck, []version2.StatusMatch) {
912+
if (sslConfig == nil || !vsc.cfgParams.HTTP2) && isGRPC(u.Type) {
913+
vsc.addWarningf(owner, "gRPC cannot be configured for upstream %s. gRPC requires enabled HTTP/2 and TLS termination", u.Name)
914+
}
915+
916+
upstreamName := upstreamNamer.GetNameForUpstream(u.Name)
917+
endpoints := vsc.generateEndpointsForUpstream(owner, ownerNamespace, u, vsEx)
918+
backup := vsc.generateBackupEndpointsForUpstream(vsEx.VirtualServer, ownerNamespace, u, vsEx)
919+
920+
// isExternalNameSvc is always false for OSS
921+
_, isExternalNameSvc := vsEx.ExternalNameSvcs[GenerateExternalNameSvcKey(ownerNamespace, u.Service)]
922+
ups := vsc.generateUpstream(owner, upstreamName, u, isExternalNameSvc, endpoints, backup)
923+
upstreams = append(upstreams, ups)
924+
u.TLS.Enable = isTLSEnabled(u, vsc.spiffeCerts, vsEx.VirtualServer.Spec.InternalRoute)
925+
crUpstreams[upstreamName] = u
926+
927+
if hc := generateHealthCheck(u, upstreamName, vsc.cfgParams); hc != nil {
928+
healthChecks = append(healthChecks, *hc)
929+
if u.HealthCheck.StatusMatch != "" {
930+
statusMatches = append(
931+
statusMatches,
932+
generateUpstreamStatusMatch(upstreamName, u.HealthCheck.StatusMatch),
933+
)
934+
}
935+
}
936+
return upstreams, healthChecks, statusMatches
937+
}
938+
933939
// rateLimit hold the configuration for the ratelimiting Policy
934940
type rateLimit struct {
935941
Reqs []version2.LimitReq
@@ -3267,6 +3273,14 @@ func generateErrorPages(errPageIndex int, errorPages []conf_v1.ErrorPage) []vers
32673273
return ePages
32683274
}
32693275

3276+
func generateErrorPageDetails(errorPages []conf_v1.ErrorPage, errorPageLocations []version2.ErrorPageLocation, owner runtime.Object) errorPageDetails {
3277+
return errorPageDetails{
3278+
pages: errorPages,
3279+
index: len(errorPageLocations),
3280+
owner: owner,
3281+
}
3282+
}
3283+
32703284
func generateErrorPageLocations(errPageIndex int, errorPages []conf_v1.ErrorPage) []version2.ErrorPageLocation {
32713285
var errorPageLocations []version2.ErrorPageLocation
32723286
for i, e := range errorPages {

internal/configs/virtualserver_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20025,6 +20025,75 @@ func TestGenerateErrorPageLocations(t *testing.T) {
2002520025
}
2002620026
}
2002720027

20028+
func TestGenerateErrorPageDetails(t *testing.T) {
20029+
t.Parallel()
20030+
tests := []struct {
20031+
errorPages []conf_v1.ErrorPage
20032+
errorLocations []version2.ErrorPageLocation
20033+
owner runtime.Object
20034+
expected errorPageDetails
20035+
}{
20036+
{}, // empty
20037+
{
20038+
errorPages: []conf_v1.ErrorPage{
20039+
{
20040+
Codes: []int{404, 405, 500, 502},
20041+
Return: &conf_v1.ErrorPageReturn{
20042+
ActionReturn: conf_v1.ActionReturn{
20043+
Code: 200,
20044+
Headers: nil,
20045+
},
20046+
},
20047+
Redirect: nil,
20048+
},
20049+
},
20050+
errorLocations: []version2.ErrorPageLocation{
20051+
{
20052+
Name: "@error_page_0_0",
20053+
DefaultType: "text/plain",
20054+
Return: &version2.Return{
20055+
Text: "All Good",
20056+
},
20057+
},
20058+
},
20059+
owner: &conf_v1.VirtualServer{
20060+
ObjectMeta: meta_v1.ObjectMeta{
20061+
Namespace: "namespace",
20062+
Name: "name",
20063+
},
20064+
},
20065+
expected: errorPageDetails{
20066+
pages: []conf_v1.ErrorPage{
20067+
{
20068+
Codes: []int{404, 405, 500, 502},
20069+
Return: &conf_v1.ErrorPageReturn{
20070+
ActionReturn: conf_v1.ActionReturn{
20071+
Code: 200,
20072+
Headers: nil,
20073+
},
20074+
},
20075+
Redirect: nil,
20076+
},
20077+
},
20078+
index: 1,
20079+
owner: &conf_v1.VirtualServer{
20080+
ObjectMeta: meta_v1.ObjectMeta{
20081+
Namespace: "namespace",
20082+
Name: "name",
20083+
},
20084+
},
20085+
},
20086+
},
20087+
}
20088+
20089+
for _, test := range tests {
20090+
result := generateErrorPageDetails(test.errorPages, test.errorLocations, test.owner)
20091+
if !reflect.DeepEqual(result, test.expected) {
20092+
t.Errorf("generateErrorPageDetails() returned %v but expected %v", result, test.expected)
20093+
}
20094+
}
20095+
}
20096+
2002820097
func TestGenerateProxySSLName(t *testing.T) {
2002920098
t.Parallel()
2003020099
result := generateProxySSLName("coffee-v1", "default")

0 commit comments

Comments
 (0)