@@ -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