@@ -19,6 +19,8 @@ package autoscaling
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "io"
23
+ "strings"
22
24
"time"
23
25
24
26
appsv1 "k8s.io/api/apps/v1"
@@ -852,6 +854,60 @@ var _ = AdmissionControllerE2eDescribe("Admission-controller", func() {
852
854
gomega .Expect (err2 .Error ()).To (gomega .MatchRegexp (`.*admission webhook .*vpa.* denied the request: .*` ))
853
855
})
854
856
857
+ ginkgo .It ("reloads the webhook certificate" , func (ctx ginkgo.SpecContext ) {
858
+ ginkgo .By ("Retrieving alternative certificate" )
859
+ c := f .ClientSet
860
+ e2eCertsSecret , err := c .CoreV1 ().Secrets (metav1 .NamespaceSystem ).Get (ctx , "vpa-e2e-certs" , metav1.GetOptions {})
861
+ gomega .Expect (err ).To (gomega .Succeed (), "Failed to get vpa-e2e-certs secret" )
862
+ actualCertsSecret , err := c .CoreV1 ().Secrets (metav1 .NamespaceSystem ).Get (ctx , "vpa-tls-certs" , metav1.GetOptions {})
863
+ gomega .Expect (err ).To (gomega .Succeed (), "Failed to get vpa-tls-certs secret" )
864
+ actualCertsSecret .Data ["serverKey.pem" ] = e2eCertsSecret .Data ["e2eKey.pem" ]
865
+ actualCertsSecret .Data ["serverCert.pem" ] = e2eCertsSecret .Data ["e2eCert.pem" ]
866
+ _ , err = c .CoreV1 ().Secrets (metav1 .NamespaceSystem ).Update (ctx , actualCertsSecret , metav1.UpdateOptions {})
867
+ gomega .Expect (err ).To (gomega .Succeed (), "Failed to update vpa-tls-certs secret with e2e rotation certs" )
868
+
869
+ ginkgo .By ("Waiting for certificate reload" )
870
+ pods , err := c .CoreV1 ().Pods (metav1 .NamespaceSystem ).List (ctx , metav1.ListOptions {})
871
+ gomega .Expect (err ).To (gomega .Succeed ())
872
+
873
+ var admissionController apiv1.Pod
874
+ for _ , p := range pods .Items {
875
+ if strings .HasPrefix (p .Name , "vpa-admission-controller" ) {
876
+ admissionController = p
877
+ }
878
+ }
879
+ gomega .Expect (admissionController .Name ).ToNot (gomega .BeEmpty ())
880
+
881
+ gomega .Eventually (func (g gomega.Gomega ) string {
882
+ reader , err := c .CoreV1 ().Pods (metav1 .NamespaceSystem ).GetLogs (admissionController .Name , & apiv1.PodLogOptions {}).Stream (ctx )
883
+ g .Expect (err ).To (gomega .Succeed ())
884
+ logs , err := io .ReadAll (reader )
885
+ g .Expect (err ).To (gomega .Succeed ())
886
+ return string (logs )
887
+ }).Should (gomega .ContainSubstring ("New certificate found, reloading" ))
888
+
889
+ ginkgo .By ("Setting up invalid VPA object" )
890
+ // there is an invalid "requests" field.
891
+ invalidVPA := []byte (`{
892
+ "kind": "VerticalPodAutoscaler",
893
+ "apiVersion": "autoscaling.k8s.io/v1",
894
+ "metadata": {"name": "cert-vpa-invalid"},
895
+ "spec": {
896
+ "targetRef": {
897
+ "apiVersion": "apps/v1",
898
+ "kind": "Deployment",
899
+ "name":"hamster"
900
+ },
901
+ "resourcePolicy": {
902
+ "containerPolicies": [{"containerName": "*", "minAllowed":{"requests":{"cpu":"50m"}}}]
903
+ }
904
+ }
905
+ }` )
906
+ err = InstallRawVPA (f , invalidVPA )
907
+ gomega .Expect (err ).To (gomega .HaveOccurred (), "Invalid VPA object accepted" )
908
+ gomega .Expect (err .Error ()).To (gomega .MatchRegexp (`.*admission webhook .*vpa.* denied the request: .*` ), "Admission controller did not inspect the object" )
909
+ })
910
+
855
911
})
856
912
857
913
func startDeploymentPods (f * framework.Framework , deployment * appsv1.Deployment ) * apiv1.PodList {
0 commit comments