From d08c2e1b9cb1671df6bea882846c1ce845e85a43 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Wed, 5 Dec 2018 17:56:53 -0500 Subject: [PATCH] Add backup-version file in backup tarball Signed-off-by: Wayne Witzel III --- changelogs/unreleased/1117-wwitzel3 | 1 + pkg/apis/ark/v1/constants.go | 4 ++++ pkg/backup/backup.go | 28 ++++++++++++++++++++++++++++ pkg/controller/backup_controller.go | 4 +--- 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/1117-wwitzel3 diff --git a/changelogs/unreleased/1117-wwitzel3 b/changelogs/unreleased/1117-wwitzel3 new file mode 100644 index 0000000000..efd7a986c3 --- /dev/null +++ b/changelogs/unreleased/1117-wwitzel3 @@ -0,0 +1 @@ +Add backup-version file in backup tarball. diff --git a/pkg/apis/ark/v1/constants.go b/pkg/apis/ark/v1/constants.go index f4fa3191f5..7bc4999ba0 100644 --- a/pkg/apis/ark/v1/constants.go +++ b/pkg/apis/ark/v1/constants.go @@ -25,6 +25,10 @@ const ( // for each resource type in the backup. ResourcesDir = "resources" + // MetadataDir is a top-level directory expected in backups which contains + // files that store metadata about the backup, such as the backup version. + MetadataDir = "metadata" + // RestoreLabelKey is the label key that's applied to all resources that // are created during a restore. This is applied for ease of identification // of restored resources. The value will be the restore's name. diff --git a/pkg/backup/backup.go b/pkg/backup/backup.go index 5b8a85c4d9..f091325af9 100644 --- a/pkg/backup/backup.go +++ b/pkg/backup/backup.go @@ -22,6 +22,7 @@ import ( "context" "fmt" "io" + "path/filepath" "time" "github.com/pkg/errors" @@ -41,6 +42,9 @@ import ( kubeutil "github.com/heptio/ark/pkg/util/kube" ) +// BackupVersion is the current backup version for Ark. +const BackupVersion = 1 + // Backupper performs backups. type Backupper interface { // Backup takes a backup using the specification in the api.Backup and writes backup and log data @@ -221,6 +225,10 @@ func (kb *kubernetesBackupper) Backup(logger logrus.FieldLogger, backupRequest * log := logger.WithField("backup", kubeutil.NamespaceAndName(backupRequest)) log.Info("Starting backup") + if err := kb.writeBackupVersion(tw); err != nil { + return errors.WithStack(err) + } + backupRequest.NamespaceIncludesExcludes = getNamespaceIncludesExcludes(backupRequest.Backup) log.Infof("Including namespaces: %s", backupRequest.NamespaceIncludesExcludes.IncludesString()) log.Infof("Excluding namespaces: %s", backupRequest.NamespaceIncludesExcludes.ExcludesString()) @@ -292,6 +300,26 @@ func (kb *kubernetesBackupper) Backup(logger logrus.FieldLogger, backupRequest * return err } +func (kb *kubernetesBackupper) writeBackupVersion(tw *tar.Writer) error { + versionFile := filepath.Join(api.MetadataDir, "version") + versionString := fmt.Sprintf("%d\n", BackupVersion) + + hdr := &tar.Header{ + Name: versionFile, + Size: int64(len(versionString)), + Typeflag: tar.TypeReg, + Mode: 0644, + ModTime: time.Now(), + } + if err := tw.WriteHeader(hdr); err != nil { + return errors.WithStack(err) + } + if _, err := tw.Write([]byte(versionString)); err != nil { + return errors.WithStack(err) + } + return nil +} + type tarWriter interface { io.Closer Write([]byte) (int, error) diff --git a/pkg/controller/backup_controller.go b/pkg/controller/backup_controller.go index 8a886db3ba..5973e1f642 100644 --- a/pkg/controller/backup_controller.go +++ b/pkg/controller/backup_controller.go @@ -51,8 +51,6 @@ import ( "github.com/heptio/ark/pkg/volume" ) -const backupVersion = 1 - type backupController struct { *genericController @@ -245,7 +243,7 @@ func (c *backupController) prepareBackupRequest(backup *api.Backup) *pkgbackup.R } // set backup version - request.Status.Version = backupVersion + request.Status.Version = pkgbackup.BackupVersion // calculate expiration if request.Spec.TTL.Duration > 0 {