Skip to content

Commit

Permalink
feat: HTTPRoute extensionRef filter converted onto plugin
Browse files Browse the repository at this point in the history
Signed-off-by: Mattia Lavacca <lavacca.mattia@gmail.com>
  • Loading branch information
mlavacca committed Oct 13, 2023
1 parent b41cf57 commit a9a2e4a
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 18 deletions.
6 changes: 2 additions & 4 deletions internal/dataplane/parser/translate_httproute.go
Original file line number Diff line number Diff line change
Expand Up @@ -264,8 +264,7 @@ func generateKongRoutesFromHTTPRouteMatches(

// if the redirect filter has not been set, we still need to set the route plugins
if !hasRedirectFilter {
plugins := translators.GeneratePluginsFromHTTPRouteFilters(filters, "", tags)
r.Plugins = append(r.Plugins, plugins...)
translators.ConvertFiltersToPlugins(&r, filters, "", tags)
routes = []kongstate.Route{r}
}

Expand Down Expand Up @@ -314,8 +313,7 @@ func getRoutesFromMatches(matches []gatewayapi.HTTPRouteMatch,
}

// generate kong plugins from rule.filters
plugins := translators.GeneratePluginsFromHTTPRouteFilters(filters, path, tags)
matchRoute.Plugins = append(matchRoute.Plugins, plugins...)
translators.ConvertFiltersToPlugins(matchRoute, filters, path, tags)

routes = append(routes, *route)
} else {
Expand Down
46 changes: 40 additions & 6 deletions internal/dataplane/parser/translators/httproute.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (

"github.com/kong/go-kong/kong"

"github.com/kong/kubernetes-ingress-controller/v2/internal/annotations"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/kongstate"
"github.com/kong/kubernetes-ingress-controller/v2/internal/gatewayapi"
)

Expand Down Expand Up @@ -350,14 +352,35 @@ func mustMarshalJSON[T any](val T) string {
return string(key)
}

// GeneratePluginsFromHTTPRouteFilters converts HTTPRouteFilter into Kong plugins.
func ConvertFiltersToPlugins(route *kongstate.Route, filters []gatewayapi.HTTPRouteFilter, path string, tags []*string) {
plugins, pluginAnnotation := generatePluginsFromHTTPRouteFilters(filters, "", tags)
if route.Plugins == nil {
route.Plugins = make([]kong.Plugin, 0)
}
route.Plugins = append(route.Plugins, plugins...)
if len(pluginAnnotation) > 0 {
if route.Ingress.Annotations == nil {
route.Ingress.Annotations = make(map[string]string)
}
if _, ok := route.Ingress.Annotations[annotations.AnnotationPrefix+annotations.PluginsKey]; !ok {
route.Ingress.Annotations[annotations.AnnotationPrefix+annotations.PluginsKey] = pluginAnnotation
} else {
route.Ingress.Annotations[annotations.AnnotationPrefix+annotations.PluginsKey] = fmt.Sprintf("%s,%s",
route.Ingress.Annotations[annotations.AnnotationPrefix+annotations.PluginsKey],
pluginAnnotation)
}
}
}

// generatePluginsFromHTTPRouteFilters converts HTTPRouteFilter into Kong plugins.
// path is the parameter to be used by the redirect plugin, to perform redirection.
func GeneratePluginsFromHTTPRouteFilters(filters []gatewayapi.HTTPRouteFilter, path string, tags []*string) []kong.Plugin {
func generatePluginsFromHTTPRouteFilters(filters []gatewayapi.HTTPRouteFilter, path string, tags []*string) ([]kong.Plugin, string) {
kongPlugins := make([]kong.Plugin, 0)
if len(filters) == 0 {
return kongPlugins
return kongPlugins, ""
}

var pluginsAnnotation string
for _, filter := range filters {
switch filter.Type {
case gatewayapi.HTTPRouteFilterRequestHeaderModifier:
Expand All @@ -369,8 +392,15 @@ func GeneratePluginsFromHTTPRouteFilters(filters []gatewayapi.HTTPRouteFilter, p
case gatewayapi.HTTPRouteFilterResponseHeaderModifier:
kongPlugins = append(kongPlugins, generateResponseHeaderModifierKongPlugin(filter.ResponseHeaderModifier))

case gatewayapi.HTTPRouteFilterExtensionRef,
gatewayapi.HTTPRouteFilterRequestMirror,
case gatewayapi.HTTPRouteFilterExtensionRef:
plugin := generateExtensionRefKongPlugin(filter.ExtensionRef)
if len(pluginsAnnotation) > 0 {
pluginsAnnotation = fmt.Sprintf("%s,%s", pluginsAnnotation, plugin)
} else {
pluginsAnnotation = plugin
}

case gatewayapi.HTTPRouteFilterRequestMirror,
gatewayapi.HTTPRouteFilterURLRewrite:
// not supported
}
Expand All @@ -381,7 +411,7 @@ func GeneratePluginsFromHTTPRouteFilters(filters []gatewayapi.HTTPRouteFilter, p
p.Tags = tags
}

return kongPlugins
return kongPlugins, pluginsAnnotation
}

// generateRequestRedirectKongPlugin generates configurations of plugins to satisfy the specification
Expand Down Expand Up @@ -429,6 +459,10 @@ func generateRequestRedirectKongPlugin(modifier *gatewayapi.HTTPRequestRedirectF
return plugins
}

func generateExtensionRefKongPlugin(modifier *gatewayapi.LocalObjectReference) string {
return string(modifier.Name)
}

// generateRequestHeaderModifierKongPlugin converts a gatewayapi.HTTPRequestHeaderFilter into a
// kong.Plugin of type request-transformer.
func generateRequestHeaderModifierKongPlugin(modifier *gatewayapi.HTTPHeaderFilter) kong.Plugin {
Expand Down
10 changes: 3 additions & 7 deletions internal/dataplane/parser/translators/httproute_atc.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,7 @@ func GenerateKongExpressionRoutesFromHTTPRouteMatches(

atc.ApplyExpression(&r.Route, routeMatcher, 1)
// generate plugins.
plugins := GeneratePluginsFromHTTPRouteFilters(translation.Filters, "", tags)
r.Plugins = plugins
ConvertFiltersToPlugins(&r, translation.Filters, "", tags)
return []kongstate.Route{r}, nil
}

Expand Down Expand Up @@ -104,9 +103,7 @@ func generateKongExpressionRoutesWithRequestRedirectFilter(
if match.Path != nil && match.Path.Value != nil {
path = *match.Path.Value
}
plugins := GeneratePluginsFromHTTPRouteFilters(translation.Filters, path, tags)
matchRoute.Plugins = plugins

ConvertFiltersToPlugins(&matchRoute, translation.Filters, path, tags)
routes = append(routes, matchRoute)
}
return routes, nil
Expand Down Expand Up @@ -561,8 +558,7 @@ func KongExpressionRouteFromHTTPRouteMatchWithPriority(
path = *match.Match.Path.Value
}

plugins := GeneratePluginsFromHTTPRouteFilters(rule.Filters, path, tags)
r.Plugins = plugins
ConvertFiltersToPlugins(&r, rule.Filters, path, tags)
}

return r
Expand Down
2 changes: 1 addition & 1 deletion internal/dataplane/parser/translators/httproute_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ func TestGeneratePluginsFromHTTPRouteFilters(t *testing.T) {

for _, tc := range testCases {
tc := tc
plugins := GeneratePluginsFromHTTPRouteFilters(tc.filters, tc.path, nil)
plugins := generatePluginsFromHTTPRouteFilters(tc.filters, tc.path, nil)

Check failure on line 160 in internal/dataplane/parser/translators/httproute_test.go

View workflow job for this annotation

GitHub Actions / Run Go benchmarks

assignment mismatch: 1 variable but generatePluginsFromHTTPRouteFilters returns 2 values

Check failure on line 160 in internal/dataplane/parser/translators/httproute_test.go

View workflow job for this annotation

GitHub Actions / unit-tests / unit-tests

assignment mismatch: 1 variable but generatePluginsFromHTTPRouteFilters returns 2 values

Check failure on line 160 in internal/dataplane/parser/translators/httproute_test.go

View workflow job for this annotation

GitHub Actions / unit-tests / unit-tests

assignment mismatch: 1 variable but generatePluginsFromHTTPRouteFilters returns 2 values

Check failure on line 160 in internal/dataplane/parser/translators/httproute_test.go

View workflow job for this annotation

GitHub Actions / linters / lint

assignment mismatch: 1 variable but generatePluginsFromHTTPRouteFilters returns 2 values
t.Run(tc.name, func(t *testing.T) {
require.Equal(t, tc.expectedPlugins, plugins)
})
Expand Down
1 change: 1 addition & 0 deletions internal/gatewayapi/aliases.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ type (
ListenerConditionReason = gatewayv1beta1.ListenerConditionReason
ListenerConditionType = gatewayv1beta1.ListenerConditionType
ListenerStatus = gatewayv1beta1.ListenerStatus
LocalObjectReference = gatewayv1beta1.LocalObjectReference
Namespace = gatewayv1beta1.Namespace
ObjectName = gatewayv1beta1.ObjectName
ParentReference = gatewayv1beta1.ParentReference
Expand Down

0 comments on commit a9a2e4a

Please sign in to comment.