mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-09-29 03:05:54 +00:00
@@ -160,9 +160,9 @@ type BackupSpec struct {
|
||||
// The default value is 1 hour.
|
||||
// +optional
|
||||
ItemOperationTimeout metav1.Duration `json:"itemOperationTimeout,omitempty"`
|
||||
// ResourcePolicies specifies the referenced resource policies that backup should follow
|
||||
// ResourcePolicy specifies the referenced resource policies that backup should follow
|
||||
// +optional
|
||||
ResourcePolicies *v1.TypedLocalObjectReference `json:"resourcePolices,omitempty"`
|
||||
ResourcePolicy *v1.TypedLocalObjectReference `json:"resourcePolicy,omitempty"`
|
||||
}
|
||||
|
||||
// BackupHooks contains custom behaviors that should be executed at different phases of the backup.
|
||||
|
||||
@@ -371,8 +371,8 @@ func (in *BackupSpec) DeepCopyInto(out *BackupSpec) {
|
||||
}
|
||||
out.CSISnapshotTimeout = in.CSISnapshotTimeout
|
||||
out.ItemOperationTimeout = in.ItemOperationTimeout
|
||||
if in.ResourcePolicies != nil {
|
||||
in, out := &in.ResourcePolicies, &out.ResourcePolicies
|
||||
if in.ResourcePolicy != nil {
|
||||
in, out := &in.ResourcePolicy, &out.ResourcePolicy
|
||||
*out = new(corev1.TypedLocalObjectReference)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
|
||||
@@ -324,7 +324,7 @@ func (ib *itemBackupper) executeActions(
|
||||
}
|
||||
log.Info("Executing custom action")
|
||||
|
||||
if act, err := ib.checkResourcePolicies(obj, &groupResource, action.Name()); err != nil {
|
||||
if act, err := ib.getMatchAction(obj, groupResource, action.Name()); err != nil {
|
||||
return nil, itemFiles, errors.WithStack(err)
|
||||
} else if act != nil && act.Type == resourcepolicies.Skip {
|
||||
log.Infof("skip snapshot of pvc %s/%s bound pv for the matched resource policies", namespace, name)
|
||||
@@ -484,10 +484,10 @@ func (ib *itemBackupper) takePVSnapshot(obj runtime.Unstructured, log logrus.Fie
|
||||
}
|
||||
|
||||
if ib.backupRequest.ResPolicies != nil {
|
||||
structuredVolume := &resourcepolicies.StructuredVolume{}
|
||||
structuredVolume.ParsePV(pv)
|
||||
action := ib.backupRequest.ResPolicies.Match(structuredVolume)
|
||||
if action != nil && action.Type == resourcepolicies.Skip {
|
||||
if action, err := ib.backupRequest.ResPolicies.GetMatchAction(pv); err != nil {
|
||||
log.WithError(err).Errorf("Error getting matched resource policies for pv %s", pv.Name)
|
||||
return nil
|
||||
} else if action != nil && action.Type == resourcepolicies.Skip {
|
||||
log.Infof("skip snapshot of pv %s for the matched resource policies", pv.Name)
|
||||
return nil
|
||||
}
|
||||
@@ -579,8 +579,8 @@ func (ib *itemBackupper) takePVSnapshot(obj runtime.Unstructured, log logrus.Fie
|
||||
return kubeerrs.NewAggregate(errs)
|
||||
}
|
||||
|
||||
func (ib *itemBackupper) checkResourcePolicies(obj runtime.Unstructured, groupResource *schema.GroupResource, actionName string) (*resourcepolicies.Action, error) {
|
||||
if ib.backupRequest.ResPolicies != nil && groupResource.String() == "persistentvolumeclaims" && actionName == "velero.io/csi-pvc-backupper" {
|
||||
func (ib *itemBackupper) getMatchAction(obj runtime.Unstructured, groupResource schema.GroupResource, backupItemActionName string) (*resourcepolicies.Action, error) {
|
||||
if ib.backupRequest.ResPolicies != nil && groupResource == kuberesource.PersistentVolumeClaims && backupItemActionName == "velero.io/csi-pvc-backupper" {
|
||||
pvc := corev1api.PersistentVolumeClaim{}
|
||||
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.UnstructuredContent(), &pvc); err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
@@ -595,10 +595,7 @@ func (ib *itemBackupper) checkResourcePolicies(obj runtime.Unstructured, groupRe
|
||||
if err := ib.kbClient.Get(context.Background(), kbClient.ObjectKey{Name: pvName}, pv); err != nil {
|
||||
return nil, errors.WithStack(err)
|
||||
}
|
||||
|
||||
volume := resourcepolicies.StructuredVolume{}
|
||||
volume.ParsePV(pv)
|
||||
return ib.backupRequest.ResPolicies.Match(&volume), nil
|
||||
return ib.backupRequest.ResPolicies.GetMatchAction(pv)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -125,8 +125,8 @@ func (b *BackupBuilder) FromSchedule(schedule *velerov1api.Schedule) *BackupBuil
|
||||
})
|
||||
}
|
||||
|
||||
if schedule.Spec.Template.ResourcePolicies != nil {
|
||||
b.ResourcePolicies(schedule.Spec.Template.ResourcePolicies.Name)
|
||||
if schedule.Spec.Template.ResourcePolicy != nil {
|
||||
b.ResourcePolicies(schedule.Spec.Template.ResourcePolicy.Name)
|
||||
}
|
||||
|
||||
return b
|
||||
@@ -282,8 +282,8 @@ func (b *BackupBuilder) ItemOperationTimeout(timeout time.Duration) *BackupBuild
|
||||
return b
|
||||
}
|
||||
|
||||
// resourcePolicies sets the Backup's resource polices.
|
||||
// ResourcePolicies sets the Backup's resource polices.
|
||||
func (b *BackupBuilder) ResourcePolicies(name string) *BackupBuilder {
|
||||
b.object.Spec.ResourcePolicies = &v1.TypedLocalObjectReference{Kind: resourcepolicies.ConfigmapRefType, Name: name}
|
||||
b.object.Spec.ResourcePolicy = &v1.TypedLocalObjectReference{Kind: resourcepolicies.ConfigmapRefType, Name: name}
|
||||
return b
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ func (o *CreateOptions) Run(c *cobra.Command, f client.Factory) error {
|
||||
}
|
||||
|
||||
if o.BackupOptions.ResPoliciesConfigmap != "" {
|
||||
schedule.Spec.Template.ResourcePolicies = &v1.TypedLocalObjectReference{Kind: resourcepolicies.ConfigmapRefType, Name: o.BackupOptions.ResPoliciesConfigmap}
|
||||
schedule.Spec.Template.ResourcePolicy = &v1.TypedLocalObjectReference{Kind: resourcepolicies.ConfigmapRefType, Name: o.BackupOptions.ResPoliciesConfigmap}
|
||||
}
|
||||
|
||||
if printed, err := output.PrintWithFormat(c, schedule); printed || err != nil {
|
||||
|
||||
@@ -460,17 +460,17 @@ func (b *backupReconciler) prepareBackupRequest(backup *velerov1api.Backup, logg
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, fmt.Sprintf("encountered labelSelector as well as orLabelSelectors in backup spec, only one can be specified"))
|
||||
}
|
||||
|
||||
if request.Spec.ResourcePolicies != nil && request.Spec.ResourcePolicies.Kind == resourcepolicies.ConfigmapRefType {
|
||||
if request.Spec.ResourcePolicy != nil && request.Spec.ResourcePolicy.Kind == resourcepolicies.ConfigmapRefType {
|
||||
policiesConfigmap := &v1.ConfigMap{}
|
||||
err := b.kbClient.Get(context.Background(), kbclient.ObjectKey{Namespace: request.Namespace, Name: request.Spec.ResourcePolicies.Name}, policiesConfigmap)
|
||||
err := b.kbClient.Get(context.Background(), kbclient.ObjectKey{Namespace: request.Namespace, Name: request.Spec.ResourcePolicy.Name}, policiesConfigmap)
|
||||
if err != nil {
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, fmt.Sprintf("failed to get resource policies %s/%s configmap with err %v", request.Namespace, request.Spec.ResourcePolicies.Name, err))
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, fmt.Sprintf("failed to get resource policies %s/%s configmap with err %v", request.Namespace, request.Spec.ResourcePolicy.Name, err))
|
||||
}
|
||||
res, err := resourcepolicies.GetResourcePoliciesFromConfig(policiesConfigmap)
|
||||
if err != nil {
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, errors.Wrapf(err, fmt.Sprintf("resource policies %s/%s", request.Namespace, request.Spec.ResourcePolicies.Name)).Error())
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, errors.Wrapf(err, fmt.Sprintf("resource policies %s/%s", request.Namespace, request.Spec.ResourcePolicy.Name)).Error())
|
||||
} else if err = res.Validate(); err != nil {
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, errors.Wrapf(err, fmt.Sprintf("resource policies %s/%s", request.Namespace, request.Spec.ResourcePolicies.Name)).Error())
|
||||
request.Status.ValidationErrors = append(request.Status.ValidationErrors, errors.Wrapf(err, fmt.Sprintf("resource policies %s/%s", request.Namespace, request.Spec.ResourcePolicy.Name)).Error())
|
||||
}
|
||||
request.ResPolicies = res
|
||||
}
|
||||
|
||||
@@ -111,20 +111,20 @@ func resultsKey(ns, name string) string {
|
||||
return fmt.Sprintf("%s/%s", ns, name)
|
||||
}
|
||||
|
||||
func (b *backupper) checkResourcePolicies(resPolicies *resourcepolicies.Policies, pvc *corev1api.PersistentVolumeClaim, volume *corev1api.Volume) (*resourcepolicies.Action, error) {
|
||||
structuredVolume := &resourcepolicies.StructuredVolume{}
|
||||
func (b *backupper) getMatchAction(resPolicies *resourcepolicies.Policies, pvc *corev1api.PersistentVolumeClaim, volume *corev1api.Volume) (*resourcepolicies.Action, error) {
|
||||
if pvc != nil {
|
||||
pv, err := b.pvClient.PersistentVolumes().Get(context.TODO(), pvc.Spec.VolumeName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "error getting pv for pvc %s", pvc.Spec.VolumeName)
|
||||
}
|
||||
structuredVolume.ParsePV(pv)
|
||||
} else if volume != nil {
|
||||
structuredVolume.ParsePodVolume(volume)
|
||||
} else {
|
||||
return nil, errors.Errorf("failed to check resource policies for empty volume")
|
||||
return resPolicies.GetMatchAction(pv)
|
||||
}
|
||||
return resPolicies.Match(structuredVolume), nil
|
||||
|
||||
if volume != nil {
|
||||
return resPolicies.GetMatchAction(volume)
|
||||
}
|
||||
|
||||
return nil, errors.Errorf("failed to check resource policies for empty volume")
|
||||
}
|
||||
|
||||
func (b *backupper) BackupPodVolumes(backup *velerov1api.Backup, pod *corev1api.Pod, volumesToBackup []string, resPolicies *resourcepolicies.Policies, log logrus.FieldLogger) ([]*velerov1api.PodVolumeBackup, []error) {
|
||||
@@ -219,7 +219,7 @@ func (b *backupper) BackupPodVolumes(backup *velerov1api.Backup, pod *corev1api.
|
||||
}
|
||||
|
||||
if resPolicies != nil {
|
||||
if action, err := b.checkResourcePolicies(resPolicies, pvc, &volume); err != nil {
|
||||
if action, err := b.getMatchAction(resPolicies, pvc, &volume); err != nil {
|
||||
errs = append(errs, errors.Wrapf(err, "error getting pv for pvc %s", pvc.Spec.VolumeName))
|
||||
continue
|
||||
} else if action != nil && action.Type == resourcepolicies.Skip {
|
||||
|
||||
Reference in New Issue
Block a user