Skip to content

Commit

Permalink
plugins used
Browse files Browse the repository at this point in the history
Signed-off-by: Mattia Lavacca <[email protected]>
  • Loading branch information
mlavacca committed Mar 8, 2023
1 parent 8093ba5 commit 1d753ed
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 16 deletions.
53 changes: 43 additions & 10 deletions internal/dataplane/parser/translate_httproute.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package parser

import (
"fmt"
"path"
"strings"

"github.com/kong/go-kong/kong"
Expand Down Expand Up @@ -63,11 +64,6 @@ func validateHTTPRoute(httproute *gatewayv1beta1.HTTPRoute) error {
return errRouteValidationNoRules
}

for _, rule := range spec.Rules {
if len(rule.BackendRefs) == 0 {
return errRouteValidationMissingBackendRefs
}
}
return nil
}

Expand Down Expand Up @@ -173,7 +169,7 @@ func generateKongRoutesFromHTTPRouteRule(
var routes []kongstate.Route

// generate kong plugins from rule.filters
plugins := generatePluginsFromHTTPRouteFilters(rule.Filters, tags)
plugins := generatePluginsFromHTTPRouteFilters(rule.Filters, "", tags)

if len(rule.Matches) > 0 {
for matchNumber := range rule.Matches {
Expand Down Expand Up @@ -231,7 +227,7 @@ func generateKongRouteFromTranslation(
hostnames := getHTTPRouteHostnamesAsSliceOfStringPointers(httproute)

// generate kong plugins from rule.filters
plugins := generatePluginsFromHTTPRouteFilters(translation.Filters, tags)
plugins := generatePluginsFromHTTPRouteFilters(translation.Filters, *translation.Matches[0].Path.Value, tags)

return generateKongRouteFromHTTPRouteMatches(
translation.Name,
Expand Down Expand Up @@ -393,17 +389,20 @@ func generateKongstateHTTPRoute(routeName string, ingressObjectInfo util.K8sObje
}

// generatePluginsFromHTTPRouteFilters converts HTTPRouteFilter into Kong filters.
func generatePluginsFromHTTPRouteFilters(filters []gatewayv1beta1.HTTPRouteFilter, tags []*string) []kong.Plugin {
func generatePluginsFromHTTPRouteFilters(filters []gatewayv1beta1.HTTPRouteFilter, path string, tags []*string) []kong.Plugin {
kongPlugins := make([]kong.Plugin, 0)
if len(filters) == 0 {
return kongPlugins
}

for _, filter := range filters {
if filter.Type == gatewayv1beta1.HTTPRouteFilterRequestHeaderModifier {
switch filter.Type {
case gatewayv1beta1.HTTPRouteFilterRequestHeaderModifier:
kongPlugins = append(kongPlugins, generateRequestHeaderModifierKongPlugin(filter.RequestHeaderModifier))

case gatewayv1beta1.HTTPRouteFilterRequestRedirect:
kongPlugins = append(kongPlugins, generateRequestRedirectKongPlugin(filter.RequestRedirect, path)...)
}
// TODO: https:/Kong/kubernetes-ingress-controller/issues/2793
}
for _, p := range kongPlugins {
p.Tags = tags
Expand All @@ -412,6 +411,40 @@ func generatePluginsFromHTTPRouteFilters(filters []gatewayv1beta1.HTTPRouteFilte
return kongPlugins
}

func generateRequestRedirectKongPlugin(modifier *gatewayv1beta1.HTTPRequestRedirectFilter, p string) []kong.Plugin {
plugins := make([]kong.Plugin, 2)
plugins[0] = kong.Plugin{
Name: kong.String("request-termination"),
Config: kong.Configuration{
"status_code": modifier.StatusCode,
},
}

headers := []string{}
locationHeader := fmt.Sprintf("Location: %s", p)
if modifier.Hostname != nil {
headers = append(headers,
fmt.Sprintf("Host: %s", *modifier.Hostname),
)
locationHeader = fmt.Sprintf("Location: http://%s", path.Join(fmt.Sprintf("%s:80", *modifier.Hostname), p))
}
headers = append(headers, locationHeader)
if modifier.Scheme != nil {
headers = append(headers, fmt.Sprintf("Scheme: %s", *modifier.Scheme))
}

plugins[1] = kong.Plugin{
Name: kong.String("response-transformer"),
Config: kong.Configuration{
"add": map[string][]string{
"headers": headers,
},
},
}

return plugins
}

// generateRequestHeaderModifierKongPlugin converts a gatewayv1beta1.HTTPRequestHeaderFilter into a
// kong.Plugin of type request-transformer.
func generateRequestHeaderModifierKongPlugin(modifier *gatewayv1beta1.HTTPHeaderFilter) kong.Plugin {
Expand Down
6 changes: 1 addition & 5 deletions internal/dataplane/parser/translate_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,6 @@ func generateKongServiceFromBackendRefWithName(
) (kongstate.Service, error) {
objName := fmt.Sprintf("%s %s/%s",
route.GetObjectKind().GroupVersionKind().String(), route.GetNamespace(), route.GetName())
if len(backendRefs) == 0 {
return kongstate.Service{}, fmt.Errorf("no backendRefs present for %s, cannot build Kong service", objName)
}

grants, err := storer.ListReferenceGrants()
if err != nil {
return kongstate.Service{}, fmt.Errorf("could not retrieve ReferenceGrants for %s: %w", objName, err)
Expand Down Expand Up @@ -126,7 +122,7 @@ func generateKongServiceFromBackendRefWithName(
// the response must have a status code of 500. Since The default behavior of Kong is returning 503
// if there is no backend for a service, we inject a plugin that terminates all requests with 500
// as status code
if len(service.Backends) == 0 {
if len(service.Backends) == 0 && len(backendRefs) != 0 {
if service.Plugins == nil {
service.Plugins = make([]kong.Plugin, 0)
}
Expand Down
1 change: 0 additions & 1 deletion test/conformance/gateway_conformance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ func TestGatewayConformance(t *testing.T) {

// standard conformance
tests.HTTPRouteHeaderMatching.ShortName,
tests.HTTPRouteRedirectHostAndStatus.ShortName,

// extended conformance
// https:/Kong/kubernetes-ingress-controller/issues/3680
Expand Down

0 comments on commit 1d753ed

Please sign in to comment.