Skip to content

Commit 718ccf0

Browse files
committed
chore: Add e2e tests for GatewayProxy referencing Secret
Introduce comprehensive e2e tests verifying GatewayProxy's ability to reference Secrets, including scenarios for creating, updating, and validating Secrets with admin keys. Update predicate filters to watch for Secret changes and replace `CurrentNamespace()` with `Namespace()` across multiple test files for consistency. Adjust line length configuration in `.golangci.yml` to accommodate the new test cases.
1 parent d07a2ec commit 718ccf0

File tree

11 files changed

+214
-15
lines changed

11 files changed

+214
-15
lines changed

.golangci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ linters:
2424
revive:
2525
rules:
2626
- name: comment-spacings
27+
lll:
28+
line-length: 160
2729
exclusions:
2830
generated: lax
2931
rules:

internal/controller/consumer_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,15 @@ func (r *ConsumerReconciler) SetupWithManager(mgr ctrl.Manager) error {
4040
predicate.NewPredicateFuncs(r.checkGatewayRef),
4141
),
4242
).
43-
WithEventFilter(predicate.GenerationChangedPredicate{}).
43+
WithEventFilter(
44+
predicate.Or(
45+
predicate.GenerationChangedPredicate{},
46+
predicate.NewPredicateFuncs(func(obj client.Object) bool {
47+
_, ok := obj.(*corev1.Secret)
48+
return ok
49+
}),
50+
),
51+
).
4452
Watches(&gatewayv1.Gateway{},
4553
handler.EnqueueRequestsFromMapFunc(r.listConsumersForGateway),
4654
builder.WithPredicates(

internal/controller/ingressclass_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,15 @@ func (r *IngressClassReconciler) SetupWithManager(mgr ctrl.Manager) error {
4040
predicate.NewPredicateFuncs(r.matchesController),
4141
),
4242
).
43-
WithEventFilter(predicate.GenerationChangedPredicate{}).
43+
WithEventFilter(
44+
predicate.Or(
45+
predicate.GenerationChangedPredicate{},
46+
predicate.NewPredicateFuncs(func(obj client.Object) bool {
47+
_, ok := obj.(*corev1.Secret)
48+
return ok
49+
}),
50+
),
51+
).
4452
Watches(
4553
&v1alpha1.GatewayProxy{},
4654
handler.EnqueueRequestsFromMapFunc(r.listIngressClassesForGatewayProxy),

test/e2e/crds/consumer.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gatewayapi
22

33
import (
44
"fmt"
5+
"net/http"
56
"time"
67

78
. "github.com/onsi/ginkgo/v2"
@@ -310,6 +311,15 @@ metadata:
310311
data:
311312
username: c2FtcGxlLXVzZXI=
312313
password: c2FtcGxlLXBhc3N3b3Jk
314+
`
315+
const basicAuthSecret2 = `
316+
apiVersion: v1
317+
kind: Secret
318+
metadata:
319+
name: basic-auth-secret
320+
data:
321+
username: c2FtcGxlLXVzZXI=
322+
password: c2FtcGxlLXBhc3N3b3JkLW5ldw==
313323
`
314324
var defaultConsumer = `
315325
apiVersion: apisix.apache.org/v1alpha1
@@ -358,6 +368,29 @@ spec:
358368
Expect().
359369
Status(200)
360370

371+
// update basic-auth password
372+
err = s.CreateResourceFromString(basicAuthSecret2)
373+
Expect(err).NotTo(HaveOccurred(), "creating basic-auth secret")
374+
375+
// use the old password will get 401
376+
Eventually(func() int {
377+
return s.NewAPISIXClient().
378+
GET("/get").
379+
WithBasicAuth("sample-user", "sample-password").
380+
WithHost("httpbin.org").
381+
Expect().
382+
Raw().StatusCode
383+
}).WithTimeout(8 * time.Second).ProbeEvery(time.Second).
384+
Should(Equal(http.StatusUnauthorized))
385+
386+
// use the new password will get 200
387+
s.NewAPISIXClient().
388+
GET("/get").
389+
WithBasicAuth("sample-user", "sample-password-new").
390+
WithHost("httpbin.org").
391+
Expect().
392+
Status(http.StatusOK)
393+
361394
By("delete consumer")
362395
err = s.DeleteResourceFromString(defaultConsumer)
363396
Expect(err).NotTo(HaveOccurred(), "deleting consumer")

test/e2e/gatewayapi/gateway.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ spec:
112112
Expect(gcyaml).To(ContainSubstring("message: the gatewayclass has been accepted by the api7-ingress-controller"), "checking GatewayClass condition message")
113113

114114
By("create Gateway")
115-
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.CurrentNamespace())
115+
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.
116+
Namespace())
116117
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
117118
time.Sleep(5 * time.Second)
118119

@@ -123,7 +124,7 @@ spec:
123124
Expect(gwyaml).To(ContainSubstring("message: the gateway has been accepted by the api7-ingress-controller"), "checking Gateway condition message")
124125

125126
By("create Gateway with not accepted GatewayClass")
126-
err = s.CreateResourceFromStringWithNamespace(noClassGateway, s.CurrentNamespace())
127+
err = s.CreateResourceFromStringWithNamespace(noClassGateway, s.Namespace())
127128
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
128129
time.Sleep(5 * time.Second)
129130

@@ -184,7 +185,7 @@ spec:
184185
time.Sleep(5 * time.Second)
185186

186187
By("create Gateway")
187-
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.CurrentNamespace())
188+
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.Namespace())
188189
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
189190
time.Sleep(10 * time.Second)
190191

@@ -257,7 +258,7 @@ spec:
257258
time.Sleep(5 * time.Second)
258259

259260
By("create Gateway")
260-
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.CurrentNamespace())
261+
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.Namespace())
261262
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
262263
time.Sleep(10 * time.Second)
263264

test/e2e/gatewayapi/gatewayclass.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ spec:
7777
}).WithTimeout(8 * time.Second).ProbeEvery(time.Second).Should(ContainSubstring(`status: "True"`))
7878

7979
By("create a Gateway")
80-
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.CurrentNamespace())
80+
err = s.CreateResourceFromStringWithNamespace(defaultGateway, s.Namespace())
8181
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
8282
time.Sleep(time.Second)
8383

test/e2e/gatewayapi/gatewayproxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ spec:
207207
time.Sleep(5 * time.Second)
208208

209209
By("Create Gateway with GatewayProxy")
210-
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(gatewayWithProxy, gatewayClassName), s.CurrentNamespace())
210+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(gatewayWithProxy, gatewayClassName), s.Namespace())
211211
Expect(err).NotTo(HaveOccurred(), "creating Gateway with GatewayProxy")
212212
time.Sleep(5 * time.Second)
213213

test/e2e/gatewayapi/httproute.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ spec:
125125
Expect(gcyaml).To(ContainSubstring("message: the gatewayclass has been accepted by the api7-ingress-controller"), "checking GatewayClass condition message")
126126

127127
By("create Gateway")
128-
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGateway, gatewayClassName), s.CurrentNamespace())
128+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGateway, gatewayClassName), s.Namespace())
129129
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
130130
time.Sleep(5 * time.Second)
131131

@@ -158,7 +158,7 @@ spec:
158158
Expect(gcyaml).To(ContainSubstring("message: the gatewayclass has been accepted by the api7-ingress-controller"), "checking GatewayClass condition message")
159159

160160
By("create Gateway")
161-
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGatewayHTTPS, gatewayClassName), s.CurrentNamespace())
161+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGatewayHTTPS, gatewayClassName), s.Namespace())
162162
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
163163
time.Sleep(5 * time.Second)
164164

test/e2e/ingress/ingress.go

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ingress
22

33
import (
44
"context"
5+
"encoding/base64"
56
"fmt"
67
"net/http"
78
"strings"
@@ -805,4 +806,150 @@ spec:
805806
Status(200)
806807
})
807808
})
809+
810+
Context("GatewayProxy reference Secret", func() {
811+
const secretSpec = `
812+
apiVersion: v1
813+
kind: Secret
814+
metadata:
815+
name: control-plane-secret
816+
data:
817+
admin-key: %s
818+
`
819+
const gatewayProxySpec = `
820+
apiVersion: apisix.apache.org/v1alpha1
821+
kind: GatewayProxy
822+
metadata:
823+
name: api7-proxy-config
824+
spec:
825+
provider:
826+
type: ControlPlane
827+
controlPlane:
828+
endpoints:
829+
- %s
830+
auth:
831+
type: AdminKey
832+
adminKey:
833+
valueFrom:
834+
secretKeyRef:
835+
name: control-plane-secret
836+
key: admin-key
837+
`
838+
const ingressClassSpec = `
839+
apiVersion: networking.k8s.io/v1
840+
kind: IngressClass
841+
metadata:
842+
name: api7-ingress-class
843+
spec:
844+
controller: "apisix.apache.org/api7-ingress-controller"
845+
parameters:
846+
apiGroup: "apisix.apache.org"
847+
kind: "GatewayProxy"
848+
name: "api7-proxy-config"
849+
namespace: %s
850+
scope: "Namespace"
851+
`
852+
const ingressSpec = `
853+
apiVersion: networking.k8s.io/v1
854+
kind: Ingress
855+
metadata:
856+
name: api7-ingress
857+
spec:
858+
ingressClassName: api7-ingress-class
859+
rules:
860+
- host: ingress.example.com
861+
http:
862+
paths:
863+
- path: /get
864+
pathType: Prefix
865+
backend:
866+
service:
867+
name: httpbin-service-e2e-test
868+
port:
869+
number: 80
870+
`
871+
const ingressSpec2 = `
872+
apiVersion: networking.k8s.io/v1
873+
kind: Ingress
874+
metadata:
875+
name: api7-ingress
876+
spec:
877+
ingressClassName: api7-ingress-class
878+
rules:
879+
- host: ingress.example.com
880+
http:
881+
paths:
882+
- path: /put
883+
pathType: Prefix
884+
backend:
885+
service:
886+
name: httpbin-service-e2e-test
887+
port:
888+
number: 80
889+
`
890+
var (
891+
err error
892+
)
893+
894+
It("GatewayProxy reference Secret", func() {
895+
By("create Secret")
896+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(secretSpec, base64.StdEncoding.EncodeToString([]byte(s.AdminKey()))), s.Namespace())
897+
Expect(err).NotTo(HaveOccurred(), "creating secret")
898+
899+
By("create GatewayProxy")
900+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(gatewayProxySpec, framework.DashboardTLSEndpoint), s.Namespace())
901+
Expect(err).NotTo(HaveOccurred(), "creating gateway proxy")
902+
903+
By("create IngressClass")
904+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(ingressClassSpec, s.Namespace()), s.Namespace())
905+
Expect(err).NotTo(HaveOccurred(), "creating IngressClass")
906+
907+
By("creat Ingress")
908+
err = s.CreateResourceFromStringWithNamespace(ingressSpec, s.Namespace())
909+
Expect(err).NotTo(HaveOccurred(), "creating Ingress")
910+
911+
By("verify Ingress works")
912+
Eventually(func() int {
913+
return s.NewAPISIXClient().
914+
GET("/get").
915+
WithHost("ingress.example.com").
916+
Expect().Raw().StatusCode
917+
}).WithTimeout(8 * time.Second).ProbeEvery(time.Second).
918+
Should(Equal(http.StatusOK))
919+
920+
// update gateway group admin-key
921+
adminKey := s.GetAdminKey(s.CurrentGatewayGroupID())
922+
923+
// should fail to request provider service and get 401 because the admin-key is changed
924+
By("create Ingress")
925+
err = s.CreateResourceFromStringWithNamespace(ingressSpec2, s.Namespace())
926+
s.WaitControllerManagerLog("Request failed with status code 401", 0, 10*time.Second)
927+
928+
// the new Ingress should not work consistently
929+
Consistently(func() int {
930+
return s.NewAPISIXClient().
931+
GET("/put").
932+
WithHost("ingress.example.com").
933+
Expect().Raw().StatusCode
934+
}).WithTimeout(8 * time.Second).ProbeEvery(time.Second).
935+
Should(Equal(http.StatusNotFound))
936+
937+
By("update secret")
938+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(secretSpec, base64.StdEncoding.EncodeToString([]byte(adminKey))), s.Namespace())
939+
Expect(err).NotTo(HaveOccurred(), "creating secret")
940+
941+
By("create Ingress again")
942+
err = s.CreateResourceFromStringWithNamespace(ingressSpec2, s.Namespace())
943+
Expect(err).NotTo(HaveOccurred(), "creating Ingress with path prefix /put")
944+
945+
By("verify Ingress works")
946+
Eventually(func() int {
947+
return s.NewAPISIXClient().
948+
PUT("/put").
949+
WithHost("ingress.example.com").
950+
Expect().Raw().StatusCode
951+
}).WithTimeout(8 * time.Second).ProbeEvery(time.Second).
952+
Should(Equal(http.StatusOK))
953+
})
954+
})
808955
})

test/e2e/scaffold/k8s.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,6 @@ func (s *Scaffold) DeleteResourceFromStringWithNamespace(yaml, namespace string)
129129
return k8s.KubectlDeleteFromStringE(s.t, s.kubectlOptions, yaml)
130130
}
131131

132-
func (s *Scaffold) CurrentNamespace() string {
133-
return s.kubectlOptions.Namespace
134-
}
135-
136132
func (s *Scaffold) NewAPISIX() (dashboard.Dashboard, error) {
137133
return dashboard.NewClient()
138134
}
@@ -272,7 +268,7 @@ func (s *Scaffold) ApplyDefaultGatewayResource(
272268
)
273269

274270
By("create Gateway")
275-
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGateway, gatewayClassName), s.CurrentNamespace())
271+
err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGateway, gatewayClassName), s.Namespace())
276272
Expect(err).NotTo(HaveOccurred(), "creating Gateway")
277273
time.Sleep(5 * time.Second)
278274

0 commit comments

Comments
 (0)