From cf8a9b2b0a081068df75c2d95ea39c15efb64514 Mon Sep 17 00:00:00 2001 From: kubevirt-bot Date: Thu, 4 Jan 2024 22:45:21 +0100 Subject: [PATCH] Extract regular files as well during clone from filesystem (#3046) Sometimes the tar entry will not be sparse: - Preallocated target - CephFS way of reporting sparse files - https://docs.ceph.com/en/latest/cephfs/posix/ In those cases we still want to grab the disk image. Signed-off-by: Alex Kalenyuk Co-authored-by: Alex Kalenyuk --- pkg/uploadserver/uploadserver.go | 6 +++++- tests/cloner_test.go | 12 +++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/uploadserver/uploadserver.go b/pkg/uploadserver/uploadserver.go index 6bdd376ae9..16d2796986 100644 --- a/pkg/uploadserver/uploadserver.go +++ b/pkg/uploadserver/uploadserver.go @@ -485,7 +485,11 @@ func untarToBlockdev(stream io.Reader, dest string) error { case header == nil: continue } - if header.Typeflag == tar.TypeGNUSparse && strings.Contains(header.Name, common.DiskImageName) { + if !strings.Contains(header.Name, common.DiskImageName) { + continue + } + switch header.Typeflag { + case tar.TypeReg, tar.TypeGNUSparse: klog.Infof("Untaring %d bytes to %s", header.Size, dest) f, err := os.OpenFile(dest, os.O_APPEND|os.O_WRONLY, os.ModeDevice|os.ModePerm) if err != nil { diff --git a/tests/cloner_test.go b/tests/cloner_test.go index efcf5ec60f..f377d19d04 100644 --- a/tests/cloner_test.go +++ b/tests/cloner_test.go @@ -430,7 +430,7 @@ var _ = Describe("all clone tests", func() { completeClone(f, f.Namespace, targetPvc, filepath.Join(testBaseDir, testFile), fillDataFSMD5sum, "") }) - It("[test_id:cnv-5569]Should clone data from filesystem to block", func() { + DescribeTable("Should clone data from filesystem to block", func(preallocate bool) { if !f.IsBlockVolumeStorageClassAvailable() { Skip("Storage Class for block volume is not available") } @@ -445,6 +445,9 @@ var _ = Describe("all clone tests", func() { Expect(err).ToNot(HaveOccurred()) targetDV := utils.NewDataVolumeCloneToBlockPV("target-dv", "1Gi", sourcePvc.Namespace, sourcePvc.Name, f.BlockSCName) + if preallocate { + targetDV.Spec.Preallocation = pointer.Bool(true) + } targetDataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, targetDV) Expect(err).ToNot(HaveOccurred()) targetPvc, err := utils.WaitForPVC(f.K8sClient, targetDataVolume.Namespace, targetDataVolume.Name) @@ -474,9 +477,12 @@ var _ = Describe("all clone tests", func() { By("Deleting verifier pod") err = utils.DeleteVerifierPod(f.K8sClient, f.Namespace.Name) Expect(err).ToNot(HaveOccurred()) - }) + }, + Entry("[test_id:5569]regular target", false), + Entry("[test_id:XXXX]preallocated target", true), + ) - It("[test_id:cnv-5570]Should clone data from block to filesystem", func() { + It("[test_id:5570]Should clone data from block to filesystem", func() { if !f.IsBlockVolumeStorageClassAvailable() { Skip("Storage Class for block volume is not available") }