@@ -11,6 +11,7 @@ import (
1111
1212 batchv1 "k8s.io/api/batch/v1"
1313 corev1 "k8s.io/api/core/v1"
14+ apierrors "k8s.io/apimachinery/pkg/api/errors"
1415 "k8s.io/apimachinery/pkg/api/meta"
1516 "k8s.io/apimachinery/pkg/api/resource"
1617 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -76,12 +77,40 @@ func verifyCatalogEndpoint(ctx SpecContext, catalog, endpoint, query string) {
7677 strings .ReplaceAll (endpoint , "?" , "" ),
7778 strings .ReplaceAll (catalog , "-" , "" ))
7879
79- job := buildCurlJob (jobNamePrefix , "default" , serviceURL )
80+ // Create the ServiceAccount first
81+ serviceAccount := & corev1.ServiceAccount {
82+ ObjectMeta : metav1.ObjectMeta {
83+ Name : jobNamePrefix ,
84+ Namespace : "default" ,
85+ },
86+ }
87+
88+ err = k8sClient .Create (ctx , serviceAccount )
89+ Expect (err ).NotTo (HaveOccurred (), "failed to create ServiceAccount" )
90+
91+ // Create the Job
92+ job := buildCurlJob (jobNamePrefix , "default" , serviceURL , serviceAccount .Name )
8093 err = k8sClient .Create (ctx , job )
8194 Expect (err ).NotTo (HaveOccurred (), "failed to create Job" )
8295
8396 DeferCleanup (func (ctx SpecContext ) {
84- _ = k8sClient .Delete (ctx , job )
97+ // Force delete job with zero grace period to ensure cleanup doesn't hang
98+ // Use Foreground propagation to ensure Pods are deleted before the Job is removed,
99+ // guaranteeing the ServiceAccount isn't deleted while Pods are still using it
100+ deletePolicy := metav1 .DeletePropagationForeground
101+ gracePeriod := int64 (0 )
102+ err := k8sClient .Delete (ctx , job , & client.DeleteOptions {
103+ GracePeriodSeconds : & gracePeriod ,
104+ PropagationPolicy : & deletePolicy ,
105+ })
106+ if err != nil && ! apierrors .IsNotFound (err ) {
107+ Expect (err ).NotTo (HaveOccurred (), "failed to delete Job" )
108+ }
109+ Eventually (func (g Gomega ) {
110+ err := k8sClient .Get (ctx , client .ObjectKeyFromObject (job ), & batchv1.Job {})
111+ g .Expect (err ).To (HaveOccurred ())
112+ }).WithTimeout (helpers .DefaultTimeout ).WithPolling (helpers .DefaultPolling ).Should (Succeed ())
113+ _ = k8sClient .Delete (ctx , serviceAccount )
85114 })
86115
87116 By ("Waiting for Job to succeed" )
@@ -203,7 +232,7 @@ var _ = Describe("[sig-olmv1][OCPFeatureGate:NewOLM][Skipped:Disconnected] OLMv1
203232 })
204233})
205234
206- func buildCurlJob (prefix , namespace , url string ) * batchv1.Job {
235+ func buildCurlJob (prefix , namespace , url , serviceAccountName string ) * batchv1.Job {
207236 backoff := int32 (1 )
208237 // This means the k8s garbage collector will automatically delete the job 5 minutes
209238 // after it has completed or failed.
@@ -232,7 +261,8 @@ func buildCurlJob(prefix, namespace, url string) *batchv1.Job {
232261 BackoffLimit : & backoff ,
233262 Template : corev1.PodTemplateSpec {
234263 Spec : corev1.PodSpec {
235- RestartPolicy : corev1 .RestartPolicyNever ,
264+ ServiceAccountName : serviceAccountName ,
265+ RestartPolicy : corev1 .RestartPolicyNever ,
236266 Containers : []corev1.Container {{
237267 Name : "api-tester" ,
238268 Image : "registry.redhat.io/rhel8/httpd-24:latest" ,
0 commit comments