Use BuildCookie function when setting cookie in Gateway API routers

Signed-off-by: Renato Vassão <renato.vassao@mindbodyonline.com>
This commit is contained in:
Renato Vassão
2025-10-14 16:00:14 -03:00
parent c7dad5b532
commit 278e7d31bc
4 changed files with 56 additions and 16 deletions
+2 -4
View File
@@ -482,10 +482,8 @@ func (gwr *GatewayAPIRouter) getSessionAffinityRouteRules(canary *flaggerv1.Cana
ResponseHeaderModifier: &v1.HTTPHeaderFilter{
Add: []v1.HTTPHeader{
{
Name: setCookieHeader,
Value: fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr,
canary.Spec.Analysis.SessionAffinity.GetMaxAge(),
),
Name: setCookieHeader,
Value: canary.Spec.Analysis.SessionAffinity.BuildCookie(canary.Status.SessionAffinityCookie),
},
},
},
+26 -4
View File
@@ -99,8 +99,14 @@ func TestGatewayAPIRouter_Routes(t *testing.T) {
cookieKey := "flagger-cookie"
// enable session affinity and start canary run
canary.Spec.Analysis.SessionAffinity = &flaggerv1.SessionAffinity{
CookieName: cookieKey,
MaxAge: 300,
CookieName: cookieKey,
Domain: "flagger.app",
HttpOnly: true,
MaxAge: 300,
Partitioned: true,
Path: "/app",
SameSite: "Strict",
Secure: true,
}
_, pSvcName, cSvcName := canary.GetServiceNames()
@@ -137,10 +143,18 @@ func TestGatewayAPIRouter_Routes(t *testing.T) {
if string(backendRef.Name) == cSvcName {
found = true
filter := backendRef.Filters[0]
val := filter.ResponseHeaderModifier.Add[0].Value
assert.Equal(t, filter.Type, v1.HTTPRouteFilterResponseHeaderModifier)
assert.NotNil(t, filter.ResponseHeaderModifier)
assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader)
assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300))
assert.True(t, strings.HasPrefix(val, cookieKey))
assert.True(t, strings.Contains(val, "Domain=flagger.app"))
assert.True(t, strings.Contains(val, "HttpOnly"))
assert.True(t, strings.Contains(val, "Max-Age=300"))
assert.True(t, strings.Contains(val, "Partitioned"))
assert.True(t, strings.Contains(val, "Path=/app"))
assert.True(t, strings.Contains(val, "SameSite=Strict"))
assert.True(t, strings.Contains(val, "Secure"))
assert.Equal(t, *backendRef.Weight, int32(10))
}
if string(backendRef.Name) == pSvcName {
@@ -193,10 +207,18 @@ func TestGatewayAPIRouter_Routes(t *testing.T) {
if string(backendRef.Name) == cSvcName {
found = true
filter := backendRef.Filters[0]
val := filter.ResponseHeaderModifier.Add[0].Value
assert.Equal(t, filter.Type, v1.HTTPRouteFilterResponseHeaderModifier)
assert.NotNil(t, filter.ResponseHeaderModifier)
assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader)
assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300))
assert.True(t, strings.HasPrefix(val, cookieKey))
assert.True(t, strings.Contains(val, "Domain=flagger.app"))
assert.True(t, strings.Contains(val, "HttpOnly"))
assert.True(t, strings.Contains(val, "Max-Age=300"))
assert.True(t, strings.Contains(val, "Partitioned"))
assert.True(t, strings.Contains(val, "Path=/app"))
assert.True(t, strings.Contains(val, "SameSite=Strict"))
assert.True(t, strings.Contains(val, "Secure"))
assert.Equal(t, *backendRef.Weight, int32(50))
}
+2 -4
View File
@@ -423,10 +423,8 @@ func (gwr *GatewayAPIV1Beta1Router) getSessionAffinityRouteRules(canary *flagger
ResponseHeaderModifier: &v1beta1.HTTPHeaderFilter{
Add: []v1beta1.HTTPHeader{
{
Name: setCookieHeader,
Value: fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr,
canary.Spec.Analysis.SessionAffinity.GetMaxAge(),
),
Name: setCookieHeader,
Value: canary.Spec.Analysis.SessionAffinity.BuildCookie(canary.Status.SessionAffinityCookie),
},
},
},
+26 -4
View File
@@ -96,8 +96,14 @@ func TestGatewayAPIV1Beta1Router_Routes(t *testing.T) {
cookieKey := "flagger-cookie"
// enable session affinity and start canary run
canary.Spec.Analysis.SessionAffinity = &flaggerv1.SessionAffinity{
CookieName: cookieKey,
MaxAge: 300,
CookieName: cookieKey,
Domain: "flagger.app",
HttpOnly: true,
MaxAge: 300,
Partitioned: true,
Path: "/app",
SameSite: "Strict",
Secure: true,
}
_, pSvcName, cSvcName := canary.GetServiceNames()
@@ -133,10 +139,18 @@ func TestGatewayAPIV1Beta1Router_Routes(t *testing.T) {
if string(backendRef.Name) == cSvcName {
found = true
filter := backendRef.Filters[0]
val := filter.ResponseHeaderModifier.Add[0].Value
assert.Equal(t, filter.Type, v1beta1.HTTPRouteFilterResponseHeaderModifier)
assert.NotNil(t, filter.ResponseHeaderModifier)
assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader)
assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300))
assert.True(t, strings.HasPrefix(val, cookieKey))
assert.True(t, strings.Contains(val, "Domain=flagger.app"))
assert.True(t, strings.Contains(val, "HttpOnly"))
assert.True(t, strings.Contains(val, "Max-Age=300"))
assert.True(t, strings.Contains(val, "Partitioned"))
assert.True(t, strings.Contains(val, "Path=/app"))
assert.True(t, strings.Contains(val, "SameSite=Strict"))
assert.True(t, strings.Contains(val, "Secure"))
assert.Equal(t, *backendRef.Weight, int32(10))
}
if string(backendRef.Name) == pSvcName {
@@ -189,10 +203,18 @@ func TestGatewayAPIV1Beta1Router_Routes(t *testing.T) {
if string(backendRef.Name) == cSvcName {
found = true
filter := backendRef.Filters[0]
val := filter.ResponseHeaderModifier.Add[0].Value
assert.Equal(t, filter.Type, v1beta1.HTTPRouteFilterResponseHeaderModifier)
assert.NotNil(t, filter.ResponseHeaderModifier)
assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader)
assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300))
assert.True(t, strings.HasPrefix(val, cookieKey))
assert.True(t, strings.Contains(val, "Domain=flagger.app"))
assert.True(t, strings.Contains(val, "HttpOnly"))
assert.True(t, strings.Contains(val, "Max-Age=300"))
assert.True(t, strings.Contains(val, "Partitioned"))
assert.True(t, strings.Contains(val, "Path=/app"))
assert.True(t, strings.Contains(val, "SameSite=Strict"))
assert.True(t, strings.Contains(val, "Secure"))
assert.Equal(t, *backendRef.Weight, int32(50))
}