Skip to content

Commit b71a37d

Browse files
author
Nolan Brubaker
committed
Record backup completion time before uploading
Signed-off-by: Nolan Brubaker <nolan@heptio.com>
1 parent 9ca7622 commit b71a37d

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

pkg/apis/ark/v1/backup.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ type BackupStatus struct {
179179

180180
// CompletionTimestamp records the time a backup was completed.
181181
// Completion time is recorded even on failed backups.
182+
// Completion time is recorded before uploading the backup object.
182183
// The server's time is used for CompletionTimestamps
183184
CompletionTimestamp metav1.Time `json:"completionTimestamp"`
184185
}

pkg/controller/backup_controller.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,10 @@ func (controller *backupController) runBackup(backup *api.Backup, bucket string)
370370
backup.Status.Phase = api.BackupPhaseCompleted
371371
}
372372

373+
// Mark completion timestamp before serializing and uploading.
374+
// Otherwise, the JSON file in object storage has a CompletionTimestamp of 'null'.
375+
backup.Status.CompletionTimestamp.Time = controller.clock.Now()
376+
373377
backupJSON := new(bytes.Buffer)
374378
if err := encode.EncodeTo(backup, "json", backupJSON); err != nil {
375379
errs = append(errs, errors.Wrap(err, "error encoding backup"))
@@ -393,7 +397,6 @@ func (controller *backupController) runBackup(backup *api.Backup, bucket string)
393397
backupScheduleName := backup.GetLabels()["ark-schedule"]
394398
controller.metrics.SetBackupTarballSizeBytesGauge(backupScheduleName, backupSizeBytes)
395399

396-
backup.Status.CompletionTimestamp.Time = controller.clock.Now()
397400
backupDuration := backup.Status.CompletionTimestamp.Time.Sub(backup.Status.StartTimestamp.Time)
398401
backupDurationSeconds := float64(backupDuration / time.Second)
399402
controller.metrics.RegisterBackupDuration(backupScheduleName, backupDurationSeconds)

pkg/controller/backup_controller_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ limitations under the License.
1717
package controller
1818

1919
import (
20+
"bytes"
2021
"encoding/json"
2122
"io"
23+
"strings"
2224
"testing"
2325
"time"
2426

@@ -201,7 +203,15 @@ func TestProcessBackup(t *testing.T) {
201203
backup.Status.Version = 1
202204
backupper.On("Backup", backup, mock.Anything, mock.Anything, mock.Anything).Return(nil)
203205

204-
cloudBackups.On("UploadBackup", "bucket", backup.Name, mock.Anything, mock.Anything, mock.Anything).Return(nil)
206+
// Ensure we have a CompletionTimestamp when uploading.
207+
// Failures will display the bytes in buf.
208+
completionTimestampIsPresent := func(buf *bytes.Buffer) bool {
209+
json := buf.String()
210+
timeString := `"completionTimestamp": "2006-01-02T15:04:05Z"`
211+
212+
return strings.Contains(json, timeString)
213+
}
214+
cloudBackups.On("UploadBackup", "bucket", backup.Name, mock.MatchedBy(completionTimestampIsPresent), mock.Anything, mock.Anything).Return(nil)
205215

206216
pluginManager.On("GetBackupItemActions", backup.Name).Return(nil, nil)
207217
pluginManager.On("CloseBackupItemActions", backup.Name).Return(nil)

0 commit comments

Comments
 (0)