@@ -46,7 +46,7 @@ var _ = Describe("Test ApisixTls Webhook", Label("webhook"), func() {
4646 time .Sleep (5 * time .Second )
4747 })
4848
49- It ("should reject missing TLS secrets" , func () {
49+ It ("should warn on missing TLS secrets" , func () {
5050 serverSecret := "missing-server-tls"
5151 clientSecret := "missing-client-ca"
5252 tlsName := "webhook-apisixtls"
7070`
7171
7272 output , err := s .CreateResourceFromStringAndGetOutput (fmt .Sprintf (tlsYAML , tlsName , s .Namespace (), s .Namespace (), serverSecret , s .Namespace (), clientSecret , s .Namespace ()))
73- expectAdmissionDenied ( s , "apisixtls" , tlsName , err , fmt . Sprintf ( "%s/%s" , s . Namespace (), serverSecret ))
73+ Expect ( err ). ShouldNot ( HaveOccurred ( ))
7474 Expect (output ).To (ContainSubstring (fmt .Sprintf ("Warning: Referenced Secret '%s/%s' not found" , s .Namespace (), serverSecret )))
7575 Expect (output ).To (ContainSubstring (fmt .Sprintf ("Warning: Referenced Secret '%s/%s' not found" , s .Namespace (), clientSecret )))
7676
@@ -149,4 +149,76 @@ spec:
149149 err = s .CreateResourceFromString (tlsYAML )
150150 Expect (err ).NotTo (HaveOccurred (), "creating corrected ApisixTls" )
151151 })
152+
153+ It ("should reject TLS update with invalid certificate material" , func () {
154+ if framework .ProviderType != framework .ProviderTypeAPISIXStandalone {
155+ Skip ("ADC validation requires apisix-standalone backend" )
156+ }
157+
158+ serverSecret := "update-server-tls"
159+ tlsName := "webhook-apisixtls-update"
160+ host := "update-webhook.example.com"
161+
162+ By ("creating a valid TLS secret" )
163+ serverCert , serverKey := s .GenerateCert (GinkgoT (), []string {host })
164+ err := s .NewKubeTlsSecret (serverSecret , serverCert .String (), serverKey .String ())
165+ Expect (err ).NotTo (HaveOccurred (), "creating initial valid server TLS secret" )
166+
167+ tlsYAML := fmt .Sprintf (`
168+ apiVersion: apisix.apache.org/v2
169+ kind: ApisixTls
170+ metadata:
171+ name: %s
172+ namespace: %s
173+ spec:
174+ ingressClassName: %s
175+ hosts:
176+ - %s
177+ secret:
178+ name: %s
179+ namespace: %s
180+ ` , tlsName , s .Namespace (), s .Namespace (), host , serverSecret , s .Namespace ())
181+
182+ By ("creating valid ApisixTls" )
183+ err = s .CreateResourceFromString (tlsYAML )
184+ Expect (err ).NotTo (HaveOccurred (), "creating initial valid ApisixTls" )
185+
186+ By ("replacing secret with invalid certificate data" )
187+ err = s .DeleteResource ("Secret" , serverSecret )
188+ Expect (err ).NotTo (HaveOccurred (), "deleting valid server TLS secret" )
189+ invalidSecretYAML := fmt .Sprintf (`
190+ apiVersion: v1
191+ kind: Secret
192+ metadata:
193+ name: %s
194+ namespace: %s
195+ type: kubernetes.io/tls
196+ stringData:
197+ tls.crt: not-a-cert
198+ tls.key: not-a-key
199+ ` , serverSecret , s .Namespace ())
200+ err = s .CreateResourceFromString (invalidSecretYAML )
201+ Expect (err ).NotTo (HaveOccurred (), "creating invalid server TLS secret" )
202+
203+ // Wait for the webhook cache to reflect the replaced Secret.
204+ time .Sleep (2 * time .Second )
205+
206+ By ("updating ApisixTls with secret now containing invalid certificate data" )
207+ err = s .CreateResourceFromString (tlsYAML )
208+ expectAdmissionDenied (s , "apisixtls" , tlsName , err )
209+
210+ By ("replacing secret back with valid certificate data" )
211+ err = s .DeleteResource ("Secret" , serverSecret )
212+ Expect (err ).NotTo (HaveOccurred (), "deleting invalid server TLS secret" )
213+ serverCert , serverKey = s .GenerateCert (GinkgoT (), []string {host })
214+ err = s .NewKubeTlsSecret (serverSecret , serverCert .String (), serverKey .String ())
215+ Expect (err ).NotTo (HaveOccurred (), "recreating valid server TLS secret" )
216+
217+ // Wait for the webhook cache to reflect the restored Secret.
218+ time .Sleep (2 * time .Second )
219+
220+ By ("updating ApisixTls with valid certificate data" )
221+ err = s .CreateResourceFromString (tlsYAML )
222+ Expect (err ).NotTo (HaveOccurred (), "updating ApisixTls with valid certificate" )
223+ })
152224})
0 commit comments