zfs-localpv/pkg/builder/bkpbuilder/backup.go

118 lines
2.8 KiB
Go
Raw Normal View History

feat(zfspv): adding backup and restore support (#162) This commit adds support for Backup and Restore controller, which will be watching for the events. The velero plugin will create a Backup CR to create a backup with the remote location information, the controller will send the data to that remote location. In the same way, the velero plugin will create a Restore CR to restore the volume from the the remote location and the restore controller will restore the data. Steps to use velero plugin for ZFS-LocalPV are : 1. install velero 2. add openebs plugin velero plugin add openebs/velero-plugin:latest 3. Create the volumesnapshot location : for full backup :- ```yaml apiVersion: velero.io/v1 kind: VolumeSnapshotLocation metadata: name: default namespace: velero spec: provider: openebs.io/zfspv-blockstore config: bucket: velero prefix: zfs namespace: openebs provider: aws region: minio s3ForcePathStyle: "true" s3Url: http://minio.velero.svc:9000 ``` for incremental backup :- ```yaml apiVersion: velero.io/v1 kind: VolumeSnapshotLocation metadata: name: default namespace: velero spec: provider: openebs.io/zfspv-blockstore config: bucket: velero prefix: zfs backup: incremental namespace: openebs provider: aws region: minio s3ForcePathStyle: "true" s3Url: http://minio.velero.svc:9000 ``` 4. Create backup velero backup create my-backup --snapshot-volumes --include-namespaces=velero-ns --volume-snapshot-locations=aws-cloud-default --storage-location=default 5. Create Schedule velero create schedule newschedule --schedule="*/1 * * * *" --snapshot-volumes --include-namespaces=velero-ns --volume-snapshot-locations=aws-local-default --storage-location=default 6. Restore from backup velero restore create --from-backup my-backup --restore-volumes=true --namespace-mappings velero-ns:ns1 Signed-off-by: Pawan <pawan@mayadata.io>
2020-09-08 13:44:39 +05:30
// Copyright © 2020 The OpenEBS Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package bkpbuilder
import (
apis "github.com/openebs/zfs-localpv/pkg/apis/openebs.io/zfs/v1"
)
// ZFSBackup is a wrapper over
// ZFSBackup API instance
type ZFSBackup struct {
// ZFSSnap object
Object *apis.ZFSBackup
}
// From returns a new instance of
// zfsbkp bkpume
func From(bkp *apis.ZFSBackup) *ZFSBackup {
return &ZFSBackup{
Object: bkp,
}
}
// Predicate defines an abstraction
// to determine conditional checks
// against the provided pod instance
type Predicate func(*ZFSBackup) bool
// PredicateList holds a list of predicate
type predicateList []Predicate
// ZFSBackupList holds the list
// of zfs backup instances
type ZFSBackupList struct {
// List contains list of backups
List apis.ZFSBackupList
}
// Len returns the number of items present
// in the ZFSBackupList
func (bkpList *ZFSBackupList) Len() int {
return len(bkpList.List.Items)
}
// all returns true if all the predicates
// succeed against the provided ZFSBackup
// instance
func (l predicateList) all(bkp *ZFSBackup) bool {
for _, pred := range l {
if !pred(bkp) {
return false
}
}
return true
}
// HasLabels returns true if provided labels
// are present in the provided ZFSBackup instance
func HasLabels(keyValuePair map[string]string) Predicate {
return func(bkp *ZFSBackup) bool {
for key, value := range keyValuePair {
if !bkp.HasLabel(key, value) {
return false
}
}
return true
}
}
// HasLabel returns true if provided label
// is present in the provided ZFSBackup instance
func (bkp *ZFSBackup) HasLabel(key, value string) bool {
val, ok := bkp.Object.GetLabels()[key]
if ok {
return val == value
}
return false
}
// HasLabel returns true if provided label
// is present in the provided ZFSBackup instance
func HasLabel(key, value string) Predicate {
return func(bkp *ZFSBackup) bool {
return bkp.HasLabel(key, value)
}
}
// IsNil returns true if the zfsbkp bkpume instance
// is nil
func (bkp *ZFSBackup) IsNil() bool {
return bkp.Object == nil
}
// IsNil is predicate to filter out nil zfsbkp bkpume
// instances
func IsNil() Predicate {
return func(bkp *ZFSBackup) bool {
return bkp.IsNil()
}
}
// GetAPIObject returns zfsbkp bkpume's API instance
func (bkp *ZFSBackup) GetAPIObject() *apis.ZFSBackup {
return bkp.Object
}