mirror of https://github.com/hashicorp/consul
Browse Source
* Updated httproute config entry for JWT Filters * Added manual deepcopy method for httproute jwt filter * Fix test * Update JWTFilter to be in oss file * Add changelog * Add build tags for deepcopy oss filepull/18445/head
John Maguire
1 year ago
committed by
GitHub
12 changed files with 881 additions and 609 deletions
@ -0,0 +1,3 @@ |
|||||||
|
```release-note:feature |
||||||
|
config-entry(api-gateway): (Enterprise only) Add JWTFilter to HTTPRoute Filters |
||||||
|
``` |
@ -1,6 +1,17 @@ |
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
//go:build !consulent
|
||||||
|
// +build !consulent
|
||||||
|
|
||||||
package structs |
package structs |
||||||
|
|
||||||
// DeepCopy generates a deep copy of *APIGatewayJWTRequirement
|
// DeepCopy generates a deep copy of *APIGatewayJWTRequirement
|
||||||
func (o *APIGatewayJWTRequirement) DeepCopy() *APIGatewayJWTRequirement { |
func (o *APIGatewayJWTRequirement) DeepCopy() *APIGatewayJWTRequirement { |
||||||
return new(APIGatewayJWTRequirement) |
return new(APIGatewayJWTRequirement) |
||||||
} |
} |
||||||
|
|
||||||
|
// DeepCopy generates a deep copy of *JWTFilter
|
||||||
|
func (o *JWTFilter) DeepCopy() *JWTFilter { |
||||||
|
return new(JWTFilter) |
||||||
|
} |
||||||
|
@ -0,0 +1,134 @@ |
|||||||
|
package api |
||||||
|
|
||||||
|
import ( |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/require" |
||||||
|
) |
||||||
|
|
||||||
|
func TestAPI_ConfigEntries_HTTPRoute(t *testing.T) { |
||||||
|
t.Parallel() |
||||||
|
c, s := makeClient(t) |
||||||
|
defer s.Stop() |
||||||
|
|
||||||
|
configEntries := c.ConfigEntries() |
||||||
|
route1 := &HTTPRouteConfigEntry{ |
||||||
|
Kind: HTTPRoute, |
||||||
|
Name: "route1", |
||||||
|
} |
||||||
|
|
||||||
|
route2 := &HTTPRouteConfigEntry{ |
||||||
|
Kind: HTTPRoute, |
||||||
|
Name: "route2", |
||||||
|
} |
||||||
|
|
||||||
|
// set it
|
||||||
|
_, wm, err := configEntries.Set(route1, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, wm) |
||||||
|
require.NotEqual(t, 0, wm.RequestTime) |
||||||
|
|
||||||
|
// also set the second one
|
||||||
|
_, wm, err = configEntries.Set(route2, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, wm) |
||||||
|
require.NotEqual(t, 0, wm.RequestTime) |
||||||
|
|
||||||
|
// get it
|
||||||
|
entry, qm, err := configEntries.Get(HTTPRoute, "route1", nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, qm) |
||||||
|
require.NotEqual(t, 0, qm.RequestTime) |
||||||
|
|
||||||
|
// verify it
|
||||||
|
readRoute, ok := entry.(*HTTPRouteConfigEntry) |
||||||
|
require.True(t, ok) |
||||||
|
require.Equal(t, route1.Kind, readRoute.Kind) |
||||||
|
require.Equal(t, route1.Name, readRoute.Name) |
||||||
|
require.Equal(t, route1.Meta, readRoute.Meta) |
||||||
|
require.Equal(t, route1.Meta, readRoute.GetMeta()) |
||||||
|
|
||||||
|
// update it
|
||||||
|
route1.Rules = []HTTPRouteRule{ |
||||||
|
{ |
||||||
|
Filters: HTTPFilters{ |
||||||
|
URLRewrite: &URLRewrite{ |
||||||
|
Path: "abc", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
// CAS fail
|
||||||
|
written, _, err := configEntries.CAS(route1, 0, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.False(t, written) |
||||||
|
|
||||||
|
// CAS success
|
||||||
|
written, wm, err = configEntries.CAS(route1, readRoute.ModifyIndex, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, wm) |
||||||
|
require.NotEqual(t, 0, wm.RequestTime) |
||||||
|
require.True(t, written) |
||||||
|
|
||||||
|
// re-setting should not yield an error
|
||||||
|
_, wm, err = configEntries.Set(route1, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, wm) |
||||||
|
require.NotEqual(t, 0, wm.RequestTime) |
||||||
|
|
||||||
|
route2.Rules = []HTTPRouteRule{ |
||||||
|
{ |
||||||
|
Filters: HTTPFilters{ |
||||||
|
URLRewrite: &URLRewrite{ |
||||||
|
Path: "def", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
_, wm, err = configEntries.Set(route2, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, wm) |
||||||
|
require.NotEqual(t, 0, wm.RequestTime) |
||||||
|
|
||||||
|
// list them
|
||||||
|
entries, qm, err := configEntries.List(HTTPRoute, nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, qm) |
||||||
|
require.NotEqual(t, 0, qm.RequestTime) |
||||||
|
require.Len(t, entries, 2) |
||||||
|
|
||||||
|
for _, entry = range entries { |
||||||
|
switch entry.GetName() { |
||||||
|
case "route1": |
||||||
|
// this also verifies that the update value was persisted and
|
||||||
|
// the updated values are seen
|
||||||
|
readRoute, ok = entry.(*HTTPRouteConfigEntry) |
||||||
|
require.True(t, ok) |
||||||
|
require.Equal(t, route1.Kind, readRoute.Kind) |
||||||
|
require.Equal(t, route1.Name, readRoute.Name) |
||||||
|
require.Len(t, readRoute.Rules, 1) |
||||||
|
|
||||||
|
require.Equal(t, route1.Rules, readRoute.Rules) |
||||||
|
case "route2": |
||||||
|
readRoute, ok = entry.(*HTTPRouteConfigEntry) |
||||||
|
require.True(t, ok) |
||||||
|
require.Equal(t, route2.Kind, readRoute.Kind) |
||||||
|
require.Equal(t, route2.Name, readRoute.Name) |
||||||
|
require.Len(t, readRoute.Rules, 1) |
||||||
|
|
||||||
|
require.Equal(t, route2.Rules, readRoute.Rules) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// delete it
|
||||||
|
wm, err = configEntries.Delete(HTTPRoute, "route1", nil) |
||||||
|
require.NoError(t, err) |
||||||
|
require.NotNil(t, wm) |
||||||
|
require.NotEqual(t, 0, wm.RequestTime) |
||||||
|
|
||||||
|
// verify deletion
|
||||||
|
_, _, err = configEntries.Get(HTTPRoute, "route1", nil) |
||||||
|
require.Error(t, err) |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue