@@ -23,6 +23,7 @@ import (
2323	. "github.com/onsi/gomega" 
2424
2525	corev1 "k8s.io/api/core/v1" 
26+ 	"k8s.io/apimachinery/pkg/api/resource" 
2627	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 
2728	"k8s.io/apimachinery/pkg/runtime" 
2829	"k8s.io/client-go/kubernetes/scheme" 
@@ -33,18 +34,37 @@ import (
3334	logf "sigs.k8s.io/controller-runtime/pkg/log" 
3435
3536	cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" 
37+ 	"kubevirt.io/containerized-data-importer/pkg/common" 
3638	cc "kubevirt.io/containerized-data-importer/pkg/controller/common" 
3739)
3840
3941var  _  =  Describe ("HostClonePhase test" , func () {
4042	log  :=  logf .Log .WithName ("host-clone-phase-test" )
4143
42- 	creatHostClonePhase  :=  func (objects  ... runtime.Object ) * HostClonePhase  {
44+ 	type  ResourceModifier  struct  {
45+ 		modifySourcePvc   func (pvcSpec  * corev1.PersistentVolumeClaimSpec )
46+ 		modifyDesiredPvc  func (pvcSpec  * corev1.PersistentVolumeClaimSpec )
47+ 	}
48+ 
49+ 	creatHostClonePhase  :=  func (modifier  * ResourceModifier , objects  ... runtime.Object ) * HostClonePhase  {
4350		s  :=  scheme .Scheme 
4451		_  =  cdiv1 .AddToScheme (s )
4552
4653		objects  =  append (objects , cc .MakeEmptyCDICR ())
4754
55+ 		source  :=  & corev1.PersistentVolumeClaim {
56+ 			ObjectMeta : metav1.ObjectMeta {
57+ 				Namespace : "ns" ,
58+ 				Name :      "source" ,
59+ 			},
60+ 		}
61+ 
62+ 		if  modifier  !=  nil  &&  modifier .modifySourcePvc  !=  nil  {
63+ 			modifier .modifySourcePvc (& source .Spec )
64+ 		}
65+ 
66+ 		objects  =  append (objects , source )
67+ 
4868		// Create a fake client to mock API calls. 
4969		builder  :=  fake .NewClientBuilder ().
5070			WithScheme (s ).
@@ -69,11 +89,15 @@ var _ = Describe("HostClonePhase test", func() {
6989			},
7090		}
7191
92+ 		if  modifier  !=  nil  &&  modifier .modifyDesiredPvc  !=  nil  {
93+ 			modifier .modifyDesiredPvc (& desired .Spec )
94+ 		}
95+ 
7296		return  & HostClonePhase {
7397			Owner :          owner ,
7498			OwnershipLabel : "label" ,
7599			Namespace :      "ns" ,
76- 			SourceName :     " source"  ,
100+ 			SourceName :     source . Name ,
77101			DesiredClaim :   desired ,
78102			ImmediateBind :  true ,
79103			Preallocation :  false ,
@@ -91,7 +115,7 @@ var _ = Describe("HostClonePhase test", func() {
91115	}
92116
93117	It ("should create pvc" , func () {
94- 		p  :=  creatHostClonePhase ()
118+ 		p  :=  creatHostClonePhase (nil )
95119
96120		result , err  :=  p .Reconcile (context .Background ())
97121		Expect (err ).ToNot (HaveOccurred ())
@@ -114,7 +138,7 @@ var _ = Describe("HostClonePhase test", func() {
114138	})
115139
116140	It ("should create pvc with priorityclass" , func () {
117- 		p  :=  creatHostClonePhase ()
141+ 		p  :=  creatHostClonePhase (nil )
118142		p .PriorityClassName  =  "priority" 
119143
120144		result , err  :=  p .Reconcile (context .Background ())
@@ -127,6 +151,80 @@ var _ = Describe("HostClonePhase test", func() {
127151		Expect (pvc .Annotations [cc .AnnPriorityClassName ]).To (Equal ("priority" ))
128152	})
129153
154+ 	It ("should adjust requested size for block to filesystem volume mode clone" , func () {
155+ 		setPvcAttributes  :=  func (pvcSpec  * corev1.PersistentVolumeClaimSpec , volumeMode  corev1.PersistentVolumeMode , storage  string ) {
156+ 			pvcSpec .VolumeMode  =  & volumeMode 
157+ 			if  pvcSpec .Resources .Requests  ==  nil  {
158+ 				pvcSpec .Resources .Requests  =  corev1.ResourceList {}
159+ 			}
160+ 			pvcSpec .Resources .Requests [corev1 .ResourceStorage ] =  resource .MustParse (storage )
161+ 		}
162+ 		cdiConfig  :=  cc .MakeEmptyCDIConfigSpec (common .ConfigName )
163+ 		cdiConfig .Status .FilesystemOverhead  =  & cdiv1.FilesystemOverhead {
164+ 			Global : common .DefaultGlobalOverhead ,
165+ 		}
166+ 
167+ 		p  :=  creatHostClonePhase (& ResourceModifier {
168+ 			modifySourcePvc : func (pvcSpec  * corev1.PersistentVolumeClaimSpec ) {
169+ 				setPvcAttributes (pvcSpec , corev1 .PersistentVolumeBlock , "8Gi" )
170+ 			},
171+ 			modifyDesiredPvc : func (pvcSpec  * corev1.PersistentVolumeClaimSpec ) {
172+ 				setPvcAttributes (pvcSpec , corev1 .PersistentVolumeFilesystem , "8Gi" )
173+ 			},
174+ 		}, cdiConfig )
175+ 
176+ 		result , err  :=  p .Reconcile (context .Background ())
177+ 		Expect (err ).ToNot (HaveOccurred ())
178+ 		Expect (result ).ToNot (BeNil ())
179+ 		Expect (result .Requeue ).To (BeFalse ())
180+ 		Expect (result .RequeueAfter ).ToNot (BeZero ())
181+ 
182+ 		pvc  :=  getDesiredClaim (p )
183+ 
184+ 		Expect (* pvc .Spec .VolumeMode ).To (Equal (corev1 .PersistentVolumeFilesystem ))
185+ 		actualSize  :=  pvc .Spec .Resources .Requests [corev1 .ResourceStorage ]
186+ 		originalRequested  :=  resource .MustParse ("8Gi" )
187+ 
188+ 		Expect (actualSize .Cmp (originalRequested )).To (BeNumerically (">" , 0 ), "The actual should be greater than the requested" , "actual" , actualSize , "requested" , originalRequested )
189+ 	})
190+ 
191+ 	It ("should use the same requested size for filesystem to filesystem volume mode clone" , func () {
192+ 		setPvcAttributes  :=  func (pvcSpec  * corev1.PersistentVolumeClaimSpec , volumeMode  corev1.PersistentVolumeMode , storage  string ) {
193+ 			pvcSpec .VolumeMode  =  & volumeMode 
194+ 			if  pvcSpec .Resources .Requests  ==  nil  {
195+ 				pvcSpec .Resources .Requests  =  corev1.ResourceList {}
196+ 			}
197+ 			pvcSpec .Resources .Requests [corev1 .ResourceStorage ] =  resource .MustParse (storage )
198+ 		}
199+ 		cdiConfig  :=  cc .MakeEmptyCDIConfigSpec (common .ConfigName )
200+ 		cdiConfig .Status .FilesystemOverhead  =  & cdiv1.FilesystemOverhead {
201+ 			Global : common .DefaultGlobalOverhead ,
202+ 		}
203+ 
204+ 		p  :=  creatHostClonePhase (& ResourceModifier {
205+ 			modifySourcePvc : func (pvcSpec  * corev1.PersistentVolumeClaimSpec ) {
206+ 				setPvcAttributes (pvcSpec , corev1 .PersistentVolumeFilesystem , "8Gi" )
207+ 			},
208+ 			modifyDesiredPvc : func (pvcSpec  * corev1.PersistentVolumeClaimSpec ) {
209+ 				setPvcAttributes (pvcSpec , corev1 .PersistentVolumeFilesystem , "8Gi" )
210+ 			},
211+ 		}, cdiConfig )
212+ 
213+ 		result , err  :=  p .Reconcile (context .Background ())
214+ 		Expect (err ).ToNot (HaveOccurred ())
215+ 		Expect (result ).ToNot (BeNil ())
216+ 		Expect (result .Requeue ).To (BeFalse ())
217+ 		Expect (result .RequeueAfter ).ToNot (BeZero ())
218+ 
219+ 		pvc  :=  getDesiredClaim (p )
220+ 
221+ 		Expect (* pvc .Spec .VolumeMode ).To (Equal (corev1 .PersistentVolumeFilesystem ))
222+ 		actualSize  :=  pvc .Spec .Resources .Requests [corev1 .ResourceStorage ]
223+ 		originalRequested  :=  resource .MustParse ("8Gi" )
224+ 
225+ 		Expect (actualSize .Cmp (originalRequested )).To (BeNumerically ("=" , 0 ), "The actual should be equal to the requested" , "actual" , actualSize , "requested" , originalRequested )
226+ 	})
227+ 
130228	Context ("with desired claim created" , func () {
131229		getCliam  :=  func () * corev1.PersistentVolumeClaim  {
132230			return  & corev1.PersistentVolumeClaim {
@@ -141,7 +239,7 @@ var _ = Describe("HostClonePhase test", func() {
141239		It ("should wait for clone to succeed" , func () {
142240			desired  :=  getCliam ()
143241			desired .Annotations [cc .AnnPodPhase ] =  "Running" 
144- 			p  :=  creatHostClonePhase (desired )
242+ 			p  :=  creatHostClonePhase (nil ,  desired )
145243
146244			result , err  :=  p .Reconcile (context .Background ())
147245			Expect (err ).ToNot (HaveOccurred ())
@@ -153,7 +251,7 @@ var _ = Describe("HostClonePhase test", func() {
153251		It ("should wait for clone to succeed with preallocation" , func () {
154252			desired  :=  getCliam ()
155253			desired .Annotations [cc .AnnPodPhase ] =  "Succeeded" 
156- 			p  :=  creatHostClonePhase (desired )
254+ 			p  :=  creatHostClonePhase (nil ,  desired )
157255			p .Preallocation  =  true 
158256
159257			result , err  :=  p .Reconcile (context .Background ())
@@ -166,7 +264,7 @@ var _ = Describe("HostClonePhase test", func() {
166264		It ("should succeed" , func () {
167265			desired  :=  getCliam ()
168266			desired .Annotations [cc .AnnPodPhase ] =  "Succeeded" 
169- 			p  :=  creatHostClonePhase (desired )
267+ 			p  :=  creatHostClonePhase (nil ,  desired )
170268
171269			result , err  :=  p .Reconcile (context .Background ())
172270			Expect (err ).ToNot (HaveOccurred ())
@@ -177,7 +275,7 @@ var _ = Describe("HostClonePhase test", func() {
177275			desired  :=  getCliam ()
178276			desired .Annotations [cc .AnnPodPhase ] =  "Succeeded" 
179277			desired .Annotations [cc .AnnPreallocationApplied ] =  "true" 
180- 			p  :=  creatHostClonePhase (desired )
278+ 			p  :=  creatHostClonePhase (nil ,  desired )
181279			p .Preallocation  =  true 
182280
183281			result , err  :=  p .Reconcile (context .Background ())
0 commit comments