@@ -227,6 +227,51 @@ func createNFSStorageClass(
227227 })
228228}
229229
230+ func createNFSVolumeAttributesClass (
231+ c clientset.Interface ,
232+ f * framework.Framework ,
233+ enablePool bool ,
234+ params map [string ]string ,
235+ ) error {
236+ vacPath := fmt .Sprintf ("%s/%s" , nfsExamplePath , "vac-relocated.yaml" )
237+ vac , err := getVolumeAttributesClass (vacPath )
238+ if err != nil {
239+ return err
240+ }
241+ vac .Parameters ["server" ] = "rook-ceph-nfs-my-nfs-a." + rookNamespace + ".svc.cluster.local"
242+
243+ // overload any parameters that were passed
244+ if params == nil {
245+ // create an empty params, so that params["clusterID"] below
246+ // does not panic
247+ params = map [string ]string {}
248+ }
249+ for param , value := range params {
250+ vac .Parameters [param ] = value
251+ }
252+
253+ vac .DriverName = nfsDriverName
254+
255+ timeout := time .Duration (deployTimeout ) * time .Minute
256+
257+ return wait .PollUntilContextTimeout (context .TODO (), poll , timeout , true , func (ctx context.Context ) (bool , error ) {
258+ _ , err = c .StorageV1 ().VolumeAttributesClasses ().Create (ctx , & vac , metav1.CreateOptions {})
259+ if err != nil {
260+ framework .Logf ("error creating VolumeAttributesClass %q: %v" , vac .Name , err )
261+ if apierrs .IsAlreadyExists (err ) {
262+ return true , nil
263+ }
264+ if isRetryableAPIError (err ) {
265+ return false , nil
266+ }
267+
268+ return false , fmt .Errorf ("failed to create VolumeAttributesClass %q: %w" , vac .Name , err )
269+ }
270+
271+ return true , nil
272+ })
273+ }
274+
230275// unmountNFSVolume unmounts a NFS volume mounted on a pod.
231276func unmountNFSVolume (f * framework.Framework , appName , pvcName string ) error {
232277 pod , err := f .ClientSet .CoreV1 ().Pods (f .UniqueName ).Get (context .TODO (), appName , metav1.GetOptions {})
@@ -500,6 +545,46 @@ var _ = Describe("nfs", func() {
500545 }
501546 })
502547
548+ By ("create a storageclass with relocated server and a PVC then bind it to an app" , func () {
549+ if ! k8sVersionGreaterEquals (c , 1 , 34 ) {
550+ framework .Logf ("skipping VolumeAttributesClass test, needs Kubernetes >= 1.34" )
551+
552+ return
553+ }
554+
555+ err := createNFSStorageClass (f .ClientSet , f , false , map [string ]string {
556+ "server" : "relocated.example.net" , // mounting will fail without vac
557+ })
558+ if err != nil {
559+ logAndFail ("failed to create NFS storageclass: %v" , err )
560+ }
561+ err = createNFSVolumeAttributesClass (f .ClientSet , f , false , nil )
562+ if err != nil {
563+ logAndFail ("failed to create NFS voluemattributesclass: %v" , err )
564+ }
565+
566+ pvc , err := loadPVC (pvcPath )
567+ if err != nil {
568+ logAndFail ("Could not create PVC: 1 %v" , err )
569+ }
570+ pvc .Namespace = f .UniqueName
571+ vacName := "relocated-server"
572+ pvc .Spec .VolumeAttributesClassName = & vacName
573+ err = createPVCAndvalidatePV (f .ClientSet , pvc , deployTimeout )
574+ if err != nil {
575+ logAndFail ("failed to create PVC: %v" , err )
576+ }
577+
578+ err = deleteResource (nfsExamplePath + "storageclass.yaml" )
579+ if err != nil {
580+ logAndFail ("failed to delete NFS storageclass: %v" , err )
581+ }
582+ err = deleteResource (nfsExamplePath + "vac-relocated.yaml" )
583+ if err != nil {
584+ logAndFail ("failed to delete NFS storageclass: %v" , err )
585+ }
586+ })
587+
503588 By ("create a storageclass with sys,krb5i security and a PVC then bind it to an app" , func () {
504589 err := createNFSStorageClass (f .ClientSet , f , false , map [string ]string {
505590 "secTypes" : "sys,krb5i" ,
0 commit comments