Record backup completion time before uploading
Signed-off-by: Nolan Brubaker <nolan@heptio.com>pull/667/head
parent
9ca76226e2
commit
b71a37dbfc
|
@ -179,6 +179,7 @@ type BackupStatus struct {
|
||||||
|
|
||||||
// CompletionTimestamp records the time a backup was completed.
|
// CompletionTimestamp records the time a backup was completed.
|
||||||
// Completion time is recorded even on failed backups.
|
// Completion time is recorded even on failed backups.
|
||||||
|
// Completion time is recorded before uploading the backup object.
|
||||||
// The server's time is used for CompletionTimestamps
|
// The server's time is used for CompletionTimestamps
|
||||||
CompletionTimestamp metav1.Time `json:"completionTimestamp"`
|
CompletionTimestamp metav1.Time `json:"completionTimestamp"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -370,6 +370,10 @@ func (controller *backupController) runBackup(backup *api.Backup, bucket string)
|
||||||
backup.Status.Phase = api.BackupPhaseCompleted
|
backup.Status.Phase = api.BackupPhaseCompleted
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mark completion timestamp before serializing and uploading.
|
||||||
|
// Otherwise, the JSON file in object storage has a CompletionTimestamp of 'null'.
|
||||||
|
backup.Status.CompletionTimestamp.Time = controller.clock.Now()
|
||||||
|
|
||||||
backupJSON := new(bytes.Buffer)
|
backupJSON := new(bytes.Buffer)
|
||||||
if err := encode.EncodeTo(backup, "json", backupJSON); err != nil {
|
if err := encode.EncodeTo(backup, "json", backupJSON); err != nil {
|
||||||
errs = append(errs, errors.Wrap(err, "error encoding backup"))
|
errs = append(errs, errors.Wrap(err, "error encoding backup"))
|
||||||
|
@ -393,7 +397,6 @@ func (controller *backupController) runBackup(backup *api.Backup, bucket string)
|
||||||
backupScheduleName := backup.GetLabels()["ark-schedule"]
|
backupScheduleName := backup.GetLabels()["ark-schedule"]
|
||||||
controller.metrics.SetBackupTarballSizeBytesGauge(backupScheduleName, backupSizeBytes)
|
controller.metrics.SetBackupTarballSizeBytesGauge(backupScheduleName, backupSizeBytes)
|
||||||
|
|
||||||
backup.Status.CompletionTimestamp.Time = controller.clock.Now()
|
|
||||||
backupDuration := backup.Status.CompletionTimestamp.Time.Sub(backup.Status.StartTimestamp.Time)
|
backupDuration := backup.Status.CompletionTimestamp.Time.Sub(backup.Status.StartTimestamp.Time)
|
||||||
backupDurationSeconds := float64(backupDuration / time.Second)
|
backupDurationSeconds := float64(backupDuration / time.Second)
|
||||||
controller.metrics.RegisterBackupDuration(backupScheduleName, backupDurationSeconds)
|
controller.metrics.RegisterBackupDuration(backupScheduleName, backupDurationSeconds)
|
||||||
|
|
|
@ -17,8 +17,10 @@ limitations under the License.
|
||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -201,7 +203,15 @@ func TestProcessBackup(t *testing.T) {
|
||||||
backup.Status.Version = 1
|
backup.Status.Version = 1
|
||||||
backupper.On("Backup", backup, mock.Anything, mock.Anything, mock.Anything).Return(nil)
|
backupper.On("Backup", backup, mock.Anything, mock.Anything, mock.Anything).Return(nil)
|
||||||
|
|
||||||
cloudBackups.On("UploadBackup", "bucket", backup.Name, mock.Anything, mock.Anything, mock.Anything).Return(nil)
|
// Ensure we have a CompletionTimestamp when uploading.
|
||||||
|
// Failures will display the bytes in buf.
|
||||||
|
completionTimestampIsPresent := func(buf *bytes.Buffer) bool {
|
||||||
|
json := buf.String()
|
||||||
|
timeString := `"completionTimestamp": "2006-01-02T15:04:05Z"`
|
||||||
|
|
||||||
|
return strings.Contains(json, timeString)
|
||||||
|
}
|
||||||
|
cloudBackups.On("UploadBackup", "bucket", backup.Name, mock.MatchedBy(completionTimestampIsPresent), mock.Anything, mock.Anything).Return(nil)
|
||||||
|
|
||||||
pluginManager.On("GetBackupItemActions", backup.Name).Return(nil, nil)
|
pluginManager.On("GetBackupItemActions", backup.Name).Return(nil, nil)
|
||||||
pluginManager.On("CloseBackupItemActions", backup.Name).Return(nil)
|
pluginManager.On("CloseBackupItemActions", backup.Name).Return(nil)
|
||||||
|
|
Loading…
Reference in New Issue