diff --git a/changelogs/unreleased/7967-blackpiglet b/changelogs/unreleased/7967-blackpiglet new file mode 100644 index 0000000000..f71b2b375e --- /dev/null +++ b/changelogs/unreleased/7967-blackpiglet @@ -0,0 +1 @@ +Check whether the volume's source is PVC before fetching its PV. \ No newline at end of file diff --git a/internal/volumehelper/volume_policy_helper.go b/internal/volumehelper/volume_policy_helper.go index 45acbec797..5d39972729 100644 --- a/internal/volumehelper/volume_policy_helper.go +++ b/internal/volumehelper/volume_policy_helper.go @@ -143,20 +143,24 @@ func (v volumeHelperImpl) ShouldPerformFSBackup(volume corev1api.Volume, pod cor } if v.volumePolicy != nil { - pvc, err := kubeutil.GetPVCForPodVolume(&volume, &pod, v.client) - if err != nil { - v.logger.WithError(err).Errorf("fail to get PVC for pod %s", pod.Namespace+"/"+pod.Name) - return false, err - } - pv, err := kubeutil.GetPVForPVC(pvc, v.client) - if err != nil { - v.logger.WithError(err).Errorf("fail to get PV for PVC %s", pvc.Namespace+"/"+pvc.Name) - return false, err + var resource interface{} + resource = &volume + if volume.VolumeSource.PersistentVolumeClaim != nil { + pvc, err := kubeutil.GetPVCForPodVolume(&volume, &pod, v.client) + if err != nil { + v.logger.WithError(err).Errorf("fail to get PVC for pod %s", pod.Namespace+"/"+pod.Name) + return false, err + } + resource, err = kubeutil.GetPVForPVC(pvc, v.client) + if err != nil { + v.logger.WithError(err).Errorf("fail to get PV for PVC %s", pvc.Namespace+"/"+pvc.Name) + return false, err + } } - action, err := v.volumePolicy.GetMatchAction(pv) + action, err := v.volumePolicy.GetMatchAction(resource) if err != nil { - v.logger.WithError(err).Errorf("fail to get VolumePolicy match action for PV %s", pv.Name) + v.logger.WithError(err).Error("fail to get VolumePolicy match action for volume") return false, err } diff --git a/internal/volumehelper/volume_policy_helper_test.go b/internal/volumehelper/volume_policy_helper_test.go index 7450417d83..35efaa7de1 100644 --- a/internal/volumehelper/volume_policy_helper_test.go +++ b/internal/volumehelper/volume_policy_helper_test.go @@ -552,6 +552,32 @@ func TestVolumeHelperImpl_ShouldPerformFSBackup(t *testing.T) { shouldFSBackup: true, expectedErr: false, }, + { + name: "Volume source is emptyDir, VolumePolicy match, return true and no error", + pod: builder.ForPod("ns", "pod-1"). + Volumes( + &corev1.Volume{ + Name: "", + VolumeSource: corev1.VolumeSource{ + EmptyDir: &corev1.EmptyDirVolumeSource{}, + }, + }).Result(), + resourcePolicies: &resourcepolicies.ResourcePolicies{ + Version: "v1", + VolumePolicies: []resourcepolicies.VolumePolicy{ + { + Conditions: map[string]interface{}{ + "volumeTypes": []string{"emptyDir"}, + }, + Action: resourcepolicies.Action{ + Type: resourcepolicies.FSBackup, + }, + }, + }, + }, + shouldFSBackup: true, + expectedErr: false, + }, { name: "VolumePolicy match, action type is not fs-backup, return false and no error", pod: builder.ForPod("ns", "pod-1").