From 6993b12a11de80194d6e17db803a60076368100b Mon Sep 17 00:00:00 2001 From: Edimar Cardoso Date: Fri, 31 Oct 2025 15:11:40 -0300 Subject: [PATCH] feat: store ZFSBackup metadata in object storage Store ZFSBackup resource metadata to object storage alongside the snapshot data. This metadata includes critical information about incremental backups, particularly the previous snapshot reference used as the base for incremental operations. Changes: - Add uploadObject helper function to serialize and upload generic objects as JSON - Update createBackup to return the full ZFSBackup resource instead of just the backup name - Upload ZFSBackup metadata to storage after successful backup completion with .backup extension - Update Makefile to allow IMAGE variable override and remove sudo from docker build --- Makefile | 8 ++++++-- pkg/zfs/plugin/backup.go | 36 ++++++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 88636510..77bec331 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,11 @@ endif export DBUILD_ARGS=--build-arg DBUILD_DATE=${DBUILD_DATE} --build-arg DBUILD_REPO_URL=${DBUILD_REPO_URL} --build-arg DBUILD_SITE_URL=${DBUILD_SITE_URL} -IMAGE = ${IMAGE_ORG}/velero-plugin-amd64 +ifeq (${IMAGE}, ) + IMAGE = ${IMAGE_ORG}/velero-plugin-amd64 + export IMAGE +endif + # if the architecture is arm64, image name will have arm64 suffix ifeq (${ARCH}, arm64) @@ -83,7 +87,7 @@ all: build container: all @echo ">> building container" @cp Dockerfile _output/Dockerfile - @sudo docker build -t $(IMAGE):$(IMAGE_TAG) ${DBUILD_ARGS} -f _output/Dockerfile _output + docker build -t $(IMAGE):$(IMAGE_TAG) ${DBUILD_ARGS} -f _output/Dockerfile _output build: @echo ">> building binary" diff --git a/pkg/zfs/plugin/backup.go b/pkg/zfs/plugin/backup.go index 155c68a6..ca668cbd 100644 --- a/pkg/zfs/plugin/backup.go +++ b/pkg/zfs/plugin/backup.go @@ -60,6 +60,17 @@ func (p *Plugin) uploadZFSVolume(vol *apis.ZFSVolume, filename string) error { return nil } +func (p *Plugin) uploadObject(obj interface{}, filename, ext string) error { + data, err := json.MarshalIndent(obj, "", "\t") + if err != nil { + return errors.New("zfs: error doing json parsing") + } + if ok := p.cl.Write(data, filename+ext); !ok { + return errors.New("zfs: failed to upload object") + } + return nil +} + // deleteBackup deletes the backup resource func (p *Plugin) deleteBackup(snapshotID string) error { pvname, _, snapname, err := utils.GetInfoFromSnapshotID(snapshotID) @@ -122,7 +133,7 @@ func (p *Plugin) getPrevSnap(volname, schdname string) (string, error) { return "", nil } -func (p *Plugin) createBackup(vol *apis.ZFSVolume, schdname, snapname string, port int) (string, error) { +func (p *Plugin) createBackup(vol *apis.ZFSVolume, schdname, snapname string, port int) (*apis.ZFSBackup, error) { bkpname := utils.GenerateResourceName(vol.Name, snapname) p.Log.Debugf("zfs: creating ZFSBackup vol = %s bkp = %s schd = %s", vol.Name, bkpname, schdname) @@ -138,7 +149,7 @@ func (p *Plugin) createBackup(vol *apis.ZFSVolume, schdname, snapname string, po prevSnap, err = p.getPrevSnap(vol.Name, schdname) if err != nil { p.Log.Errorf("zfs: Failed to get prev snapshot bkp %s err: {%v}", snapname, err) - return "", err + return nil, err } } @@ -158,14 +169,14 @@ func (p *Plugin) createBackup(vol *apis.ZFSVolume, schdname, snapname string, po Build() if err != nil { - return "", err + return nil, err } _, err = bkpbuilder.NewKubeclient().WithNamespace(p.namespace).Create(bkp) if err != nil { - return "", err + return nil, err } - return bkpname, nil + return bkp, nil } func (p *Plugin) checkBackupStatus(bkpname string) error { @@ -270,22 +281,27 @@ func (p *Plugin) doBackup(volumeID string, snapname string, schdname string, por return "", errors.New("zfs: error in uploading snapshot") } - bkpname, err := p.createBackup(vol, schdname, snapname, port) + bkp, err := p.createBackup(vol, schdname, snapname, port) + if err != nil { + return "", err + } + + err = p.checkBackupStatus(bkp.Name) if err != nil { + p.deleteBackup(bkp.Name) + p.Log.Errorf("zfs: backup failed vol %s snap %s bkpname %s err: %v", volumeID, snapname, bkp.Name, err) return "", err } - err = p.checkBackupStatus(bkpname) + err = p.uploadObject(bkp, filename, ".backup") if err != nil { - p.deleteBackup(bkpname) - p.Log.Errorf("zfs: backup failed vol %s snap %s bkpname %s err: %v", volumeID, snapname, bkpname, err) return "", err } // generate the snapID snapID := utils.GenerateSnapshotID(volumeID, schdname, snapname) - p.Log.Debugf("zfs: backup done vol %s bkp %s snapID %s", volumeID, bkpname, snapID) + p.Log.Debugf("zfs: backup done vol %s bkp %s snapID %s", volumeID, bkp.Name, snapID) return snapID, nil }