@@ -123,6 +123,101 @@ func TestKMSPluginBuilder_Apply(t *testing.T) {
123123 }
124124}
125125
126+ func TestKMSPluginBuilder_WithHealthReporter (t * testing.T ) {
127+ f := newSidecarTestFixtures (t )
128+ cfg , err := encryptiondata .FromSecret (f .encryptionConfigSecret )
129+ require .NoError (t , err )
130+
131+ t .Run ("health reporter injected with correct args and socket mount" , func (t * testing.T ) {
132+ podSpec := & corev1.PodSpec {
133+ Containers : []corev1.Container {{Name : "kube-apiserver" }},
134+ Volumes : []corev1.Volume {f .resourceDirVolume },
135+ }
136+ err := NewKMSPluginBuilder ().
137+ FromEncryptionConfig ("encryption-config" , cfg ).
138+ WithHealthReporter ("kms-health-reporter" , "cluster-kube-apiserver-operator" , "quay.io/test/operator:latest" ).
139+ Apply (podSpec , "kube-apiserver" )
140+ require .NoError (t , err )
141+
142+ var reporter * corev1.Container
143+ for i := range podSpec .InitContainers {
144+ if podSpec .InitContainers [i ].Name == "kms-health-reporter" {
145+ reporter = & podSpec .InitContainers [i ]
146+ break
147+ }
148+ }
149+ require .NotNil (t , reporter , "health reporter container must be injected" )
150+ require .Equal (t , "quay.io/test/operator:latest" , reporter .Image )
151+ require .Equal (t , []string {"cluster-kube-apiserver-operator" , "kms-health-reporter" }, reporter .Command )
152+ require .Contains (t , reporter .Args , "--kms-sockets=unix:///var/run/kmsplugin/kms-555.sock" )
153+ require .Contains (t , reporter .Args , "--node-name=$(NODE_NAME)" )
154+
155+ hasSocketMount := false
156+ for _ , m := range reporter .VolumeMounts {
157+ if m .Name == "kms-plugin-socket" {
158+ hasSocketMount = true
159+ require .True (t , m .ReadOnly )
160+ }
161+ }
162+ require .True (t , hasSocketMount )
163+
164+ require .Len (t , reporter .Env , 1 )
165+ require .Equal (t , "NODE_NAME" , reporter .Env [0 ].Name )
166+ require .Equal (t , "spec.nodeName" , reporter .Env [0 ].ValueFrom .FieldRef .FieldPath )
167+ })
168+
169+ t .Run ("static pod mode: health reporter gets root UID" , func (t * testing.T ) {
170+ podSpec := & corev1.PodSpec {
171+ Containers : []corev1.Container {{Name : "kube-apiserver" }},
172+ Volumes : []corev1.Volume {f .resourceDirVolume },
173+ }
174+ err := NewKMSPluginBuilder ().
175+ FromEncryptionConfig ("encryption-config" , cfg ).
176+ AsStaticPod ().
177+ WithHealthReporter ("kms-health-reporter" , "cluster-kube-apiserver-operator" , "quay.io/test/operator:latest" ).
178+ Apply (podSpec , "kube-apiserver" )
179+ require .NoError (t , err )
180+
181+ var reporter * corev1.Container
182+ for i := range podSpec .InitContainers {
183+ if podSpec .InitContainers [i ].Name == "kms-health-reporter" {
184+ reporter = & podSpec .InitContainers [i ]
185+ break
186+ }
187+ }
188+ require .NotNil (t , reporter )
189+ require .Equal (t , ptr .To (int64 (0 )), reporter .SecurityContext .RunAsUser )
190+ require .Contains (t , reporter .Args , "--kubeconfig=/etc/kubernetes/static-pod-resources/configmaps/kube-apiserver-cert-syncer-kubeconfig/kubeconfig" )
191+ })
192+
193+ t .Run ("without WithHealthReporter: no health reporter" , func (t * testing.T ) {
194+ podSpec := & corev1.PodSpec {
195+ Containers : []corev1.Container {{Name : "kube-apiserver" }},
196+ Volumes : []corev1.Volume {f .resourceDirVolume },
197+ }
198+ err := NewKMSPluginBuilder ().
199+ FromEncryptionConfig ("encryption-config" , cfg ).
200+ Apply (podSpec , "kube-apiserver" )
201+ require .NoError (t , err )
202+
203+ for _ , c := range podSpec .InitContainers {
204+ require .NotEqual (t , "kms-health-reporter" , c .Name , "health reporter must not be injected without WithHealthReporter" )
205+ }
206+ })
207+
208+ t .Run ("empty image: returns error" , func (t * testing.T ) {
209+ podSpec := & corev1.PodSpec {
210+ Containers : []corev1.Container {{Name : "kube-apiserver" }},
211+ Volumes : []corev1.Volume {f .resourceDirVolume },
212+ }
213+ err := NewKMSPluginBuilder ().
214+ FromEncryptionConfig ("encryption-config" , cfg ).
215+ WithHealthReporter ("kms-health-reporter" , "cluster-kube-apiserver-operator" , "" ).
216+ Apply (podSpec , "kube-apiserver" )
217+ require .ErrorContains (t , err , "health reporter image is required" )
218+ })
219+ }
220+
126221func TestKMSPluginBuilder_OrderIndependence (t * testing.T ) {
127222 f := newSidecarTestFixtures (t )
128223 cfg , err := encryptiondata .FromSecret (f .encryptionConfigSecret )
0 commit comments