@@ -53,10 +53,68 @@ const (
53
53
SuccessSynced = "Synced"
54
54
// ErrResourceExists provides a const to indicate a resource exists error
55
55
ErrResourceExists = "ErrResourceExists"
56
+ // ErrResourceDoesntExist provides a const to indicate a resource doesn't exist error
57
+ ErrResourceDoesntExist = "ErrResourceDoesntExist"
58
+ // ErrClaimLost provides a const to indicate a claim is lost
59
+ ErrClaimLost = "ErrClaimLost"
60
+ // DataVolumeFailed provides a const to represent DataVolume failed status
61
+ DataVolumeFailed = "DataVolumeFailed"
62
+ // ImportScheduled provides a const to indicate import is scheduled
63
+ ImportScheduled = "ImportScheduled"
64
+ // ImportInProgress provides a const to indicate an import is in progress
65
+ ImportInProgress = "ImportInProgress"
66
+ // ImportFailed provides a const to indicate import has failed
67
+ ImportFailed = "ImportFailed"
68
+ // ImportSucceeded provides a const to indicate import has succeeded
69
+ ImportSucceeded = "ImportSucceded"
70
+ // CloneScheduled provides a const to indicate clone is scheduled
71
+ CloneScheduled = "CloneScheduled"
72
+ // CloneInProgress provides a const to indicate clone is in progress
73
+ CloneInProgress = "CloneInProgress"
74
+ // CloneFailed provides a const to indicate clone has failed
75
+ CloneFailed = "CloneFailed"
76
+ // CloneSucceeded provides a const to indicate clone has succeeded
77
+ CloneSucceeded = "CloneSucceeded"
78
+ // UploadScheduled provides a const to indicate upload is scheduled
79
+ UploadScheduled = "UploadScheduled"
80
+ // UploadReady provides a const to indicate upload is in progress
81
+ UploadReady = "UploadReady"
82
+ // UploadFailed provides a const to indicate upload has failed
83
+ UploadFailed = "UploadFailed"
84
+ // UploadSucceeded provides a const to indicate upload has succeeded
85
+ UploadSucceeded = "UploadSucceeded"
56
86
// MessageResourceExists provides a const to form a resource exists error message
57
87
MessageResourceExists = "Resource %q already exists and is not managed by DataVolume"
88
+ // MessageResourceDoesntExist provides a const to form a resource doesn't exist error message
89
+ MessageResourceDoesntExist = "Resource managed by %q doesn't exist"
58
90
// MessageResourceSynced provides a const to standardize a Resource Synced message
59
91
MessageResourceSynced = "DataVolume synced successfully"
92
+ // MessageErrClaimLost provides a const to form claim lost message
93
+ MessageErrClaimLost = "PVC %s lost"
94
+ // MessageImportScheduled provides a const to form import is scheduled message
95
+ MessageImportScheduled = "Import into %s scheduled"
96
+ // MessageImportInProgress provides a const to form import is in progress message
97
+ MessageImportInProgress = "Import into %s in progress"
98
+ // MessageImportFailed provides a const to form import has failed message
99
+ MessageImportFailed = "Failed to import into PVC %s"
100
+ // MessageImportSucceeded provides a const to form import has succeeded message
101
+ MessageImportSucceeded = "Successfully imported into PVC %s"
102
+ // MessageCloneScheduled provides a const to form clone is scheduled message
103
+ MessageCloneScheduled = "Cloning from %s/%s into %s/%s scheduled"
104
+ // MessageCloneInProgress provides a const to form clone is in progress message
105
+ MessageCloneInProgress = "Cloning from %s/%s into %s/%s in progress"
106
+ // MessageCloneFailed provides a const to form clone has failed message
107
+ MessageCloneFailed = "Cloning from %s/%s into %s/%s failed"
108
+ // MessageCloneSucceeded provides a const to form clone has succeeded message
109
+ MessageCloneSucceeded = "Successfully cloned from %s/%s into %s/%s"
110
+ // MessageUploadScheduled provides a const to form upload is scheduled message
111
+ MessageUploadScheduled = "Upload into %s scheduled"
112
+ // MessageUploadReady provides a const to form upload is ready message
113
+ MessageUploadReady = "Upload into %s ready"
114
+ // MessageUploadFailed provides a const to form upload has failed message
115
+ MessageUploadFailed = "Upload into %s failed"
116
+ // MessageUploadSucceeded provides a const to form upload has succeeded message
117
+ MessageUploadSucceeded = "Successfully uploaded into %s"
60
118
)
61
119
62
120
// DataVolumeController represents the CDI Data Volume Controller
@@ -78,6 +136,13 @@ type DataVolumeController struct {
78
136
pvcExpectations * expectations.UIDTrackingControllerExpectations
79
137
}
80
138
139
+ // DataVolumeEvent reoresents event
140
+ type DataVolumeEvent struct {
141
+ eventType string
142
+ reason string
143
+ message string
144
+ }
145
+
81
146
// NewDataVolumeController sets up a Data Volume Controller, and return a pointer to
82
147
// the newly created Controller
83
148
func NewDataVolumeController (
@@ -298,63 +363,102 @@ func (c *DataVolumeController) syncHandler(key string) error {
298
363
return nil
299
364
}
300
365
301
- func (c * DataVolumeController ) updateImportStatusPhase (pvc * corev1.PersistentVolumeClaim , dataVolumeCopy * cdiv1.DataVolume ) {
366
+ func (c * DataVolumeController ) updateImportStatusPhase (pvc * corev1.PersistentVolumeClaim , dataVolumeCopy * cdiv1.DataVolume , event * DataVolumeEvent ) {
302
367
phase , ok := pvc .Annotations [AnnPodPhase ]
303
368
if ok {
304
369
switch phase {
305
370
case string (corev1 .PodPending ):
306
371
// TODO: Use a more generic Scheduled, like maybe TransferScheduled.
307
372
dataVolumeCopy .Status .Phase = cdiv1 .ImportScheduled
373
+ event .eventType = corev1 .EventTypeNormal
374
+ event .reason = ImportScheduled
375
+ event .message = fmt .Sprintf (MessageImportScheduled , pvc .Name )
308
376
case string (corev1 .PodRunning ):
309
377
// TODO: Use a more generic In Progess, like maybe TransferInProgress.
310
378
dataVolumeCopy .Status .Phase = cdiv1 .ImportInProgress
379
+ event .eventType = corev1 .EventTypeNormal
380
+ event .reason = ImportInProgress
381
+ event .message = fmt .Sprintf (MessageImportInProgress , pvc .Name )
311
382
case string (corev1 .PodFailed ):
312
383
dataVolumeCopy .Status .Phase = cdiv1 .Failed
384
+ event .eventType = corev1 .EventTypeWarning
385
+ event .reason = ImportFailed
386
+ event .message = fmt .Sprintf (MessageImportFailed , pvc .Name )
313
387
case string (corev1 .PodSucceeded ):
314
388
dataVolumeCopy .Status .Phase = cdiv1 .Succeeded
389
+ event .eventType = corev1 .EventTypeNormal
390
+ event .reason = ImportSucceeded
391
+ event .message = fmt .Sprintf (MessageImportSucceeded , pvc .Name )
315
392
}
316
393
}
317
394
}
318
395
319
- func (c * DataVolumeController ) updateCloneStatusPhase (pvc * corev1.PersistentVolumeClaim , dataVolumeCopy * cdiv1.DataVolume ) {
396
+ func (c * DataVolumeController ) updateCloneStatusPhase (pvc * corev1.PersistentVolumeClaim , dataVolumeCopy * cdiv1.DataVolume , event * DataVolumeEvent ) {
320
397
phase , ok := pvc .Annotations [AnnPodPhase ]
321
398
if ok {
322
399
switch phase {
323
400
case string (corev1 .PodPending ):
324
401
// TODO: Use a more generic Scheduled, like maybe TransferScheduled.
325
402
dataVolumeCopy .Status .Phase = cdiv1 .CloneScheduled
403
+ event .eventType = corev1 .EventTypeNormal
404
+ event .reason = CloneScheduled
405
+ event .message = fmt .Sprintf (MessageCloneScheduled , dataVolumeCopy .Spec .Source .PVC .Namespace , dataVolumeCopy .Spec .Source .PVC .Name , pvc .Namespace , pvc .Name )
326
406
case string (corev1 .PodRunning ):
327
407
// TODO: Use a more generic In Progess, like maybe TransferInProgress.
328
408
dataVolumeCopy .Status .Phase = cdiv1 .CloneInProgress
409
+ event .eventType = corev1 .EventTypeNormal
410
+ event .reason = CloneInProgress
411
+ event .message = fmt .Sprintf (MessageCloneInProgress , dataVolumeCopy .Spec .Source .PVC .Namespace , dataVolumeCopy .Spec .Source .PVC .Name , pvc .Namespace , pvc .Name )
329
412
case string (corev1 .PodFailed ):
330
413
dataVolumeCopy .Status .Phase = cdiv1 .Failed
414
+ event .eventType = corev1 .EventTypeWarning
415
+ event .reason = CloneFailed
416
+ event .message = fmt .Sprintf (MessageCloneFailed , dataVolumeCopy .Spec .Source .PVC .Namespace , dataVolumeCopy .Spec .Source .PVC .Name , pvc .Namespace , pvc .Name )
331
417
case string (corev1 .PodSucceeded ):
332
418
dataVolumeCopy .Status .Phase = cdiv1 .Succeeded
419
+ event .eventType = corev1 .EventTypeNormal
420
+ event .reason = CloneSucceeded
421
+ event .message = fmt .Sprintf (MessageCloneSucceeded , dataVolumeCopy .Spec .Source .PVC .Namespace , dataVolumeCopy .Spec .Source .PVC .Name , pvc .Namespace , pvc .Name )
333
422
}
423
+
334
424
}
335
425
}
336
426
337
- func (c * DataVolumeController ) updateUploadStatusPhase (pvc * corev1.PersistentVolumeClaim , dataVolumeCopy * cdiv1.DataVolume ) {
427
+ func (c * DataVolumeController ) updateUploadStatusPhase (pvc * corev1.PersistentVolumeClaim , dataVolumeCopy * cdiv1.DataVolume , event * DataVolumeEvent ) {
338
428
phase , ok := pvc .Annotations [AnnPodPhase ]
339
429
if ok {
340
430
switch phase {
341
431
case string (corev1 .PodPending ):
342
432
// TODO: Use a more generic Scheduled, like maybe TransferScheduled.
343
433
dataVolumeCopy .Status .Phase = cdiv1 .UploadScheduled
434
+ event .eventType = corev1 .EventTypeNormal
435
+ event .reason = UploadScheduled
436
+ event .message = fmt .Sprintf (MessageUploadScheduled , pvc .Name )
344
437
case string (corev1 .PodRunning ):
345
438
// TODO: Use a more generic In Progess, like maybe TransferInProgress.
346
439
dataVolumeCopy .Status .Phase = cdiv1 .UploadReady
440
+ event .eventType = corev1 .EventTypeNormal
441
+ event .reason = UploadReady
442
+ event .message = fmt .Sprintf (MessageUploadReady , pvc .Name )
347
443
case string (corev1 .PodFailed ):
348
444
dataVolumeCopy .Status .Phase = cdiv1 .Failed
445
+ event .eventType = corev1 .EventTypeWarning
446
+ event .reason = UploadFailed
447
+ event .message = fmt .Sprintf (MessageUploadFailed , pvc .Name )
349
448
case string (corev1 .PodSucceeded ):
350
449
dataVolumeCopy .Status .Phase = cdiv1 .Succeeded
450
+ event .eventType = corev1 .EventTypeNormal
451
+ event .reason = UploadSucceeded
452
+ event .message = fmt .Sprintf (MessageUploadSucceeded , pvc .Name )
453
+
351
454
}
352
455
}
353
456
}
354
457
355
458
func (c * DataVolumeController ) updateDataVolumeStatus (dataVolume * cdiv1.DataVolume , pvc * corev1.PersistentVolumeClaim ) error {
356
459
dataVolumeCopy := dataVolume .DeepCopy ()
357
460
var err error
461
+ var event DataVolumeEvent
358
462
359
463
curPhase := dataVolumeCopy .Status .Phase
360
464
if pvc == nil {
@@ -364,6 +468,9 @@ func (c *DataVolumeController) updateDataVolumeStatus(dataVolume *cdiv1.DataVolu
364
468
// something has gone wrong. Perhaps the PVC was deleted out from
365
469
// underneath the DataVolume
366
470
dataVolumeCopy .Status .Phase = cdiv1 .Failed
471
+ event .eventType = corev1 .EventTypeWarning
472
+ event .reason = DataVolumeFailed
473
+ event .message = fmt .Sprintf (MessageResourceDoesntExist , dataVolume .Name )
367
474
}
368
475
369
476
} else {
@@ -381,21 +488,24 @@ func (c *DataVolumeController) updateDataVolumeStatus(dataVolume *cdiv1.DataVolu
381
488
_ , ok := pvc .Annotations [AnnImportPod ]
382
489
if ok {
383
490
dataVolumeCopy .Status .Phase = cdiv1 .ImportScheduled
384
- c .updateImportStatusPhase (pvc , dataVolumeCopy )
491
+ c .updateImportStatusPhase (pvc , dataVolumeCopy , & event )
385
492
}
386
493
_ , ok = pvc .Annotations [AnnCloneRequest ]
387
494
if ok {
388
495
dataVolumeCopy .Status .Phase = cdiv1 .CloneScheduled
389
- c .updateCloneStatusPhase (pvc , dataVolumeCopy )
496
+ c .updateCloneStatusPhase (pvc , dataVolumeCopy , & event )
390
497
}
391
498
_ , ok = pvc .Annotations [AnnUploadRequest ]
392
499
if ok {
393
500
dataVolumeCopy .Status .Phase = cdiv1 .UploadScheduled
394
- c .updateUploadStatusPhase (pvc , dataVolumeCopy )
501
+ c .updateUploadStatusPhase (pvc , dataVolumeCopy , & event )
395
502
}
396
503
397
504
case corev1 .ClaimLost :
398
505
dataVolumeCopy .Status .Phase = cdiv1 .Failed
506
+ event .eventType = corev1 .EventTypeWarning
507
+ event .reason = ErrClaimLost
508
+ event .message = fmt .Sprintf (MessageErrClaimLost , pvc .Name )
399
509
default :
400
510
if pvc .Status .Phase != "" {
401
511
dataVolumeCopy .Status .Phase = cdiv1 .Unknown
@@ -406,6 +516,10 @@ func (c *DataVolumeController) updateDataVolumeStatus(dataVolume *cdiv1.DataVolu
406
516
// Only update the object if something actually changed in the status.
407
517
if ! reflect .DeepEqual (dataVolume .Status , dataVolumeCopy .Status ) {
408
518
_ , err = c .cdiClientSet .CdiV1alpha1 ().DataVolumes (dataVolume .Namespace ).Update (dataVolumeCopy )
519
+ // Emit the event only when the status change happens, not every time
520
+ if event .eventType != "" {
521
+ c .recorder .Event (dataVolume , event .eventType , event .reason , event .message )
522
+ }
409
523
}
410
524
return err
411
525
}
0 commit comments