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/backup/backup.go b/pkg/backup/backup.go index 5b8a85c4d9..8bc0073d15 100644 --- a/pkg/backup/backup.go +++ b/pkg/backup/backup.go @@ -41,6 +41,9 @@ import ( kubeutil "github.com/heptio/ark/pkg/util/kube" ) +// BackupVersion is the current backup version for Ark. +const BackupVersion = "1.0.0" + // 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 +224,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 +299,23 @@ func (kb *kubernetesBackupper) Backup(logger logrus.FieldLogger, backupRequest * return err } +func (kb *kubernetesBackupper) writeBackupVersion(tw *tar.Writer) error { + hdr := &tar.Header{ + Name: "backup-version", + Size: int64(len(BackupVersion)), + Typeflag: tar.TypeReg, + Mode: 0644, + ModTime: time.Now(), + } + if err := tw.WriteHeader(hdr); err != nil { + return err + } + if _, err := tw.Write([]byte(BackupVersion)); err != nil { + return err + } + return nil +} + type tarWriter interface { io.Closer Write([]byte) (int, error)