Adjust match resource policies

Signed-off-by: Ming <mqiu@vmware.com>
This commit is contained in:
Ming
2023-03-23 03:48:26 +00:00
parent 086dbd344f
commit a3cef5b0d3
16 changed files with 167 additions and 160 deletions
+2 -2
View File
@@ -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.
+2 -2
View File
@@ -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)
}
+8 -11
View File
@@ -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
}
+4 -4
View File
@@ -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
}
+1 -1
View File
@@ -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 {
+5 -5
View File
@@ -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
}
+9 -9
View File
@@ -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 {