Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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"
Expand Down
36 changes: 26 additions & 10 deletions pkg/zfs/plugin/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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
}
}

Expand All @@ -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 {
Expand Down Expand Up @@ -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
}