diff --git a/changelogs/unreleased/8569-Lyndon-Li b/changelogs/unreleased/8569-Lyndon-Li new file mode 100644 index 000000000..336a9856c --- /dev/null +++ b/changelogs/unreleased/8569-Lyndon-Li @@ -0,0 +1 @@ +fs uploader and block uploader support Windows nodes \ No newline at end of file diff --git a/pkg/controller/data_upload_controller.go b/pkg/controller/data_upload_controller.go index 5d1073b2f..66f5b67f7 100644 --- a/pkg/controller/data_upload_controller.go +++ b/pkg/controller/data_upload_controller.go @@ -803,12 +803,7 @@ func (r *DataUploadReconciler) setupExposeParam(du *velerov2alpha1api.DataUpload return nil, errors.Wrapf(err, "failed to get PVC %s/%s", du.Spec.SourceNamespace, du.Spec.SourcePVC) } - accessMode := exposer.AccessModeFileSystem - if pvc.Spec.VolumeMode != nil && *pvc.Spec.VolumeMode == corev1.PersistentVolumeBlock { - accessMode = exposer.AccessModeBlock - } - - nodeOS, err := kube.GetPVCAttachingNodeOS(pvc, (accessMode == exposer.AccessModeBlock), r.kubeClient.CoreV1(), r.kubeClient.StorageV1(), r.logger) + nodeOS, err := kube.GetPVCAttachingNodeOS(pvc, r.kubeClient.CoreV1(), r.kubeClient.StorageV1(), r.logger) if err != nil { return nil, errors.Wrapf(err, "failed to get attaching node OS for PVC %s/%s", du.Spec.SourceNamespace, du.Spec.SourcePVC) } @@ -817,6 +812,11 @@ func (r *DataUploadReconciler) setupExposeParam(du *velerov2alpha1api.DataUpload return nil, errors.Wrapf(err, "no appropriate node to run data upload for PVC %s/%s", du.Spec.SourceNamespace, du.Spec.SourcePVC) } + accessMode := exposer.AccessModeFileSystem + if pvc.Spec.VolumeMode != nil && *pvc.Spec.VolumeMode == corev1.PersistentVolumeBlock { + accessMode = exposer.AccessModeBlock + } + hostingPodLabels := map[string]string{velerov1api.DataUploadLabel: du.Name} for _, k := range util.ThirdPartyLabels { if v, err := nodeagent.GetLabelValue(context.Background(), r.kubeClient, du.Namespace, k, nodeOS); err != nil { diff --git a/pkg/controller/data_upload_controller_test.go b/pkg/controller/data_upload_controller_test.go index 8e3b1688b..f480a692c 100644 --- a/pkg/controller/data_upload_controller_test.go +++ b/pkg/controller/data_upload_controller_test.go @@ -59,6 +59,7 @@ import ( velerotest "github.com/vmware-tanzu/velero/pkg/test" "github.com/vmware-tanzu/velero/pkg/uploader" "github.com/vmware-tanzu/velero/pkg/util/boolptr" + "github.com/vmware-tanzu/velero/pkg/util/kube" ) const dataUploadName = "dataupload-1" @@ -187,6 +188,8 @@ func initDataUploaderReconcilerWithError(needError ...error) (*DataUploadReconci }, } + node := builder.ForNode("fake-node").Labels(map[string]string{kube.NodeOSLabel: kube.NodeOSLinux}).Result() + dataPathMgr := datapath.NewManager(1) now, err := time.Parse(time.RFC1123, time.RFC1123) @@ -229,7 +232,7 @@ func initDataUploaderReconcilerWithError(needError ...error) (*DataUploadReconci } fakeSnapshotClient := snapshotFake.NewSimpleClientset(vsObject, vscObj) - fakeKubeClient := clientgofake.NewSimpleClientset(daemonSet) + fakeKubeClient := clientgofake.NewSimpleClientset(daemonSet, node) return NewDataUploadReconciler( fakeClient, diff --git a/pkg/util/kube/pvc_pv.go b/pkg/util/kube/pvc_pv.go index eab07f25b..e91e5dab3 100644 --- a/pkg/util/kube/pvc_pv.go +++ b/pkg/util/kube/pvc_pv.go @@ -429,13 +429,13 @@ func DiagnosePV(pv *corev1api.PersistentVolume) string { return diag } -func GetPVCAttachingNodeOS(pvc *corev1api.PersistentVolumeClaim, blockAccess bool, nodeClient corev1client.CoreV1Interface, +func GetPVCAttachingNodeOS(pvc *corev1api.PersistentVolumeClaim, nodeClient corev1client.CoreV1Interface, storageClient storagev1.StorageV1Interface, log logrus.FieldLogger) (string, error) { var nodeOS string var scFsType string - if blockAccess { - log.Infof("Use linux node for block access for PVC %s/%s", pvc.Namespace, pvc.Name) + if pvc.Spec.VolumeMode != nil && *pvc.Spec.VolumeMode == corev1api.PersistentVolumeBlock { + log.Infof("Use linux node for block mode PVC %s/%s", pvc.Namespace, pvc.Name) return NodeOSLinux, nil } diff --git a/pkg/util/kube/pvc_pv_test.go b/pkg/util/kube/pvc_pv_test.go index ea3195966..2a5c2d826 100644 --- a/pkg/util/kube/pvc_pv_test.go +++ b/pkg/util/kube/pvc_pv_test.go @@ -1564,6 +1564,17 @@ func TestGetPVCAttachingNodeOS(t *testing.T) { }, } + blockMode := corev1api.PersistentVolumeBlock + pvcObjBlockMode := &corev1api.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "fake-namespace", + Name: "fake-pvc", + }, + Spec: corev1api.PersistentVolumeClaimSpec{ + VolumeMode: &blockMode, + }, + } + pvcObjWithNode := &corev1api.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{ Namespace: "fake-namespace", @@ -1610,7 +1621,6 @@ func TestGetPVCAttachingNodeOS(t *testing.T) { name string pvc *corev1api.PersistentVolumeClaim kubeClientObj []runtime.Object - blockAccess bool expectedNodeOS string err string }{ @@ -1665,8 +1675,7 @@ func TestGetPVCAttachingNodeOS(t *testing.T) { }, { name: "block access", - pvc: pvcObjWithBoth, - blockAccess: true, + pvc: pvcObjBlockMode, expectedNodeOS: NodeOSLinux, }, } @@ -1676,7 +1685,7 @@ func TestGetPVCAttachingNodeOS(t *testing.T) { var kubeClient kubernetes.Interface = fakeKubeClient - nodeOS, err := GetPVCAttachingNodeOS(test.pvc, test.blockAccess, kubeClient.CoreV1(), kubeClient.StorageV1(), velerotest.NewLogger()) + nodeOS, err := GetPVCAttachingNodeOS(test.pvc, kubeClient.CoreV1(), kubeClient.StorageV1(), velerotest.NewLogger()) if err != nil { assert.EqualError(t, err, test.err)