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 23, 2023
1 parent 46929c1 commit 5f4ec24
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 22 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 @@ -270,8 +270,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 @@ -320,8 +319,7 @@ func getRoutesFromMatches(
}

// 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, path, 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 @@ -593,8 +590,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
35 changes: 30 additions & 5 deletions internal/dataplane/parser/translators/httproute_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ import (

func TestGeneratePluginsFromHTTPRouteFilters(t *testing.T) {
testCases := []struct {
name string
filters []gatewayapi.HTTPRouteFilter
path string
expectedPlugins []kong.Plugin
name string
filters []gatewayapi.HTTPRouteFilter
path string
expectedPlugins []kong.Plugin
expectedPluginsAnnotation string
}{
{
name: "no filters",
Expand Down Expand Up @@ -153,13 +154,37 @@ func TestGeneratePluginsFromHTTPRouteFilters(t *testing.T) {
},
},
},
{
name: "extension-refs",
filters: []gatewayapi.HTTPRouteFilter{
{
Type: gatewayapi.HTTPRouteFilterExtensionRef,
ExtensionRef: &gatewayapi.LocalObjectReference{
Group: gatewayapi.Group("configuration.konghq.com/v1"),
Kind: gatewayapi.Kind("KongPlugin"),
Name: "plugin1",
},
},
{
Type: gatewayapi.HTTPRouteFilterExtensionRef,
ExtensionRef: &gatewayapi.LocalObjectReference{
Group: gatewayapi.Group("configuration.konghq.com/v1"),
Kind: gatewayapi.Kind("KongPlugin"),
Name: "plugin2",
},
},
},
expectedPluginsAnnotation: "plugin1,plugin2",
expectedPlugins: []kong.Plugin{},
},
}

for _, tc := range testCases {
tc := tc
plugins := GeneratePluginsFromHTTPRouteFilters(tc.filters, tc.path, nil)
t.Run(tc.name, func(t *testing.T) {
plugins, pluginsAnnotation := generatePluginsFromHTTPRouteFilters(tc.filters, tc.path, nil)
require.Equal(t, tc.expectedPlugins, plugins)
require.Equal(t, tc.expectedPluginsAnnotation, pluginsAnnotation)
})
}
}
1 change: 1 addition & 0 deletions internal/gatewayapi/aliases.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ type (
HTTPRouteList = gatewayv1.HTTPRouteList
HTTPRouteMatch = gatewayv1.HTTPRouteMatch
HTTPRouteRule = gatewayv1.HTTPRouteRule
LocalObjectReference = gatewayv1.LocalObjectReference
HTTPRouteSpec = gatewayv1.HTTPRouteSpec
HTTPRouteStatus = gatewayv1.HTTPRouteStatus
Hostname = gatewayv1.Hostname
Expand Down

0 comments on commit 5f4ec24

Please sign in to comment.