@@ -20,6 +20,7 @@ import (
20
20
"context"
21
21
"crypto/md5" //nolint:gosec
22
22
"crypto/tls"
23
+ "encoding/hex"
23
24
"fmt"
24
25
"log"
25
26
"net/http"
@@ -231,11 +232,11 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
231
232
return
232
233
}
233
234
234
- id := toIdHashLabelValue ( event .Source (), event .ID ())
235
- logger .Debug ("Getting job for event" , zap .String ("URI" , r .RequestURI ), zap .String ("id " , id ))
235
+ jobName := toJobName ( ref . Name , event .Source (), event .ID ())
236
+ logger .Debug ("Getting job for event" , zap .String ("URI" , r .RequestURI ), zap .String ("jobName " , jobName ))
236
237
237
238
jobs , err := h .k8s .BatchV1 ().Jobs (js .GetNamespace ()).List (r .Context (), metav1.ListOptions {
238
- LabelSelector : jobLabelSelector (ref , id ),
239
+ LabelSelector : jobLabelSelector (ref , jobName ),
239
240
Limit : 1 ,
240
241
})
241
242
if err != nil {
@@ -256,56 +257,21 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
256
257
return
257
258
}
258
259
259
- jobName := kmeta .ChildName (ref .Name , id )
260
-
261
- logger .Debug ("Creating secret for event" , zap .String ("URI" , r .RequestURI ), zap .String ("jobName" , jobName ))
262
-
263
- jobSinkUID := js .GetUID ()
264
-
265
- or := metav1.OwnerReference {
266
- APIVersion : sinksv .SchemeGroupVersion .String (),
267
- Kind : sinks .JobSinkResource .Resource ,
268
- Name : js .GetName (),
269
- UID : jobSinkUID ,
270
- Controller : ptr .Bool (true ),
271
- BlockOwnerDeletion : ptr .Bool (false ),
272
- }
273
-
274
- secret := & corev1.Secret {
275
- TypeMeta : metav1.TypeMeta {},
276
- ObjectMeta : metav1.ObjectMeta {
277
- Name : jobName ,
278
- Namespace : ref .Namespace ,
279
- Labels : map [string ]string {
280
- sinks .JobSinkIDLabel : id ,
281
- sinks .JobSinkNameLabel : ref .Name ,
282
- },
283
- OwnerReferences : []metav1.OwnerReference {or },
284
- },
285
- Immutable : ptr .Bool (true ),
286
- Data : map [string ][]byte {"event" : eventBytes },
287
- Type : corev1 .SecretTypeOpaque ,
288
- }
289
-
290
- _ , err = h .k8s .CoreV1 ().Secrets (ref .Namespace ).Create (r .Context (), secret , metav1.CreateOptions {})
291
- if err != nil && ! apierrors .IsAlreadyExists (err ) {
292
- logger .Warn ("Failed to create secret" , zap .Error (err ))
293
-
294
- w .Header ().Add ("Reason" , err .Error ())
295
- w .WriteHeader (http .StatusInternalServerError )
296
- return
297
- }
298
-
299
- logger .Debug ("Creating job for event" , zap .String ("URI" , r .RequestURI ), zap .String ("jobName" , jobName ))
300
-
301
260
job := js .Spec .Job .DeepCopy ()
302
261
job .Name = jobName
303
262
if job .Labels == nil {
304
263
job .Labels = make (map [string ]string , 4 )
305
264
}
306
- job .Labels [sinks .JobSinkIDLabel ] = id
265
+ job .Labels [sinks .JobSinkIDLabel ] = jobName
307
266
job .Labels [sinks .JobSinkNameLabel ] = ref .Name
308
- job .OwnerReferences = append (job .OwnerReferences , or )
267
+ job .OwnerReferences = append (job .OwnerReferences , metav1.OwnerReference {
268
+ APIVersion : sinksv .SchemeGroupVersion .String (),
269
+ Kind : sinks .JobSinkResource .Resource ,
270
+ Name : js .GetName (),
271
+ UID : js .GetUID (),
272
+ Controller : ptr .Bool (true ),
273
+ BlockOwnerDeletion : ptr .Bool (false ),
274
+ })
309
275
var mountPathName string
310
276
for i := range job .Spec .Template .Spec .Containers {
311
277
found := false
@@ -346,14 +312,66 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
346
312
})
347
313
}
348
314
349
- _ , err = h .k8s .BatchV1 ().Jobs (ref .Namespace ).Create (r .Context (), job , metav1.CreateOptions {})
350
- if err != nil {
315
+ logger .Debug ("Creating job for event" ,
316
+ zap .String ("URI" , r .RequestURI ),
317
+ zap .String ("jobName" , jobName ),
318
+ zap .Any ("job" , job ),
319
+ )
320
+
321
+ createdJob , err := h .k8s .BatchV1 ().Jobs (ref .Namespace ).Create (r .Context (), job , metav1.CreateOptions {})
322
+ if err != nil && ! apierrors .IsAlreadyExists (err ) {
351
323
logger .Warn ("Failed to create job" , zap .Error (err ))
352
324
353
325
w .Header ().Add ("Reason" , err .Error ())
354
326
w .WriteHeader (http .StatusInternalServerError )
355
327
return
356
328
}
329
+ if apierrors .IsAlreadyExists (err ) {
330
+ logger .Debug ("Job already exists" , zap .String ("URI" , r .RequestURI ), zap .String ("jobName" , jobName ))
331
+ }
332
+
333
+ secret := & corev1.Secret {
334
+ TypeMeta : metav1.TypeMeta {},
335
+ ObjectMeta : metav1.ObjectMeta {
336
+ Name : jobName ,
337
+ Namespace : ref .Namespace ,
338
+ Labels : map [string ]string {
339
+ sinks .JobSinkIDLabel : jobName ,
340
+ sinks .JobSinkNameLabel : ref .Name ,
341
+ },
342
+ OwnerReferences : []metav1.OwnerReference {
343
+ {
344
+ APIVersion : "batch/v1" ,
345
+ Kind : "Job" ,
346
+ Name : createdJob .Name ,
347
+ UID : createdJob .UID ,
348
+ Controller : ptr .Bool (true ),
349
+ BlockOwnerDeletion : ptr .Bool (false ),
350
+ },
351
+ },
352
+ },
353
+ Immutable : ptr .Bool (true ),
354
+ Data : map [string ][]byte {"event" : eventBytes },
355
+ Type : corev1 .SecretTypeOpaque ,
356
+ }
357
+
358
+ logger .Debug ("Creating secret for event" ,
359
+ zap .String ("URI" , r .RequestURI ),
360
+ zap .String ("jobName" , jobName ),
361
+ zap .Any ("secret.metadata" , secret .ObjectMeta ),
362
+ )
363
+
364
+ _ , err = h .k8s .CoreV1 ().Secrets (ref .Namespace ).Create (r .Context (), secret , metav1.CreateOptions {})
365
+ if err != nil && ! apierrors .IsAlreadyExists (err ) {
366
+ logger .Warn ("Failed to create secret" , zap .Error (err ))
367
+
368
+ w .Header ().Add ("Reason" , err .Error ())
369
+ w .WriteHeader (http .StatusInternalServerError )
370
+ return
371
+ }
372
+ if apierrors .IsAlreadyExists (err ) {
373
+ logger .Debug ("Secret already exists" , zap .String ("URI" , r .RequestURI ), zap .String ("jobName" , jobName ))
374
+ }
357
375
358
376
w .Header ().Add ("Location" , locationHeader (ref , event .Source (), event .ID ()))
359
377
w .WriteHeader (http .StatusAccepted )
@@ -391,8 +409,7 @@ func (h *Handler) handleGet(ctx context.Context, w http.ResponseWriter, r *http.
391
409
eventSource := parts [6 ]
392
410
eventID := parts [8 ]
393
411
394
- id := toIdHashLabelValue (eventSource , eventID )
395
- jobName := kmeta .ChildName (ref .Name , id )
412
+ jobName := toJobName (ref .Name , eventSource , eventID )
396
413
397
414
job , err := h .k8s .BatchV1 ().Jobs (ref .Namespace ).Get (r .Context (), jobName , metav1.GetOptions {})
398
415
if err != nil {
@@ -445,6 +462,7 @@ func jobLabelSelector(ref types.NamespacedName, id string) string {
445
462
return fmt .Sprintf ("%s=%s,%s=%s" , sinks .JobSinkIDLabel , id , sinks .JobSinkNameLabel , ref .Name )
446
463
}
447
464
448
- func toIdHashLabelValue (source , id string ) string {
449
- return utils .ToDNS1123Subdomain (fmt .Sprintf ("%s" , md5 .Sum ([]byte (fmt .Sprintf ("%s-%s" , source , id ))))) //nolint:gosec
465
+ func toJobName (js string , source , id string ) string {
466
+ h := md5 .Sum ([]byte (source + id )) //nolint:gosec
467
+ return kmeta .ChildName (js + "-" , utils .ToDNS1123Subdomain (hex .EncodeToString (h [:])))
450
468
}
0 commit comments