| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| package org.apache.cloudstack.utils.qemu; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.fail; |
| |
| import java.io.File; |
| import com.cloud.utils.script.Script; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.UUID; |
| |
| import org.junit.Ignore; |
| import org.junit.Test; |
| |
| import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; |
| |
| |
| @Ignore |
| public class QemuImgTest { |
| |
| @Test |
| public void testCreateAndInfo() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| /* 10TB virtual_size */ |
| long size = 10995116277760l; |
| QemuImgFile file = new QemuImgFile(filename, size, PhysicalDiskFormat.QCOW2); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file); |
| Map<String, String> info = qemu.info(file); |
| |
| if (info == null) { |
| fail("We didn't get any information back from qemu-img"); |
| } |
| |
| Long infoSize = Long.parseLong(info.get(new String("virtual_size"))); |
| assertEquals(Long.valueOf(size), Long.valueOf(infoSize)); |
| |
| String infoPath = info.get(new String("image")); |
| assertEquals(filename, infoPath); |
| |
| File f = new File(filename); |
| f.delete(); |
| |
| } |
| |
| @Test |
| public void testCreateAndInfoWithOptions() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| /* 10TB virtual_size */ |
| long size = 10995116277760l; |
| QemuImgFile file = new QemuImgFile(filename, size, PhysicalDiskFormat.QCOW2); |
| String clusterSize = "131072"; |
| Map<String, String> options = new HashMap<String, String>(); |
| |
| options.put("cluster_size", clusterSize); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file, options); |
| Map<String, String> info = qemu.info(file); |
| |
| Long infoSize = Long.parseLong(info.get(new String("virtual_size"))); |
| assertEquals(Long.valueOf(size), Long.valueOf(infoSize)); |
| |
| String infoPath = info.get(new String("image")); |
| assertEquals(filename, infoPath); |
| |
| String infoClusterSize = info.get(new String("cluster_size")); |
| assertEquals(clusterSize, infoClusterSize); |
| |
| File f = new File(filename); |
| f.delete(); |
| |
| } |
| |
| @Test |
| public void testCreateSparseVolume() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| /* 10TB virtual_size */ |
| long size = 10995116277760l; |
| QemuImgFile file = new QemuImgFile(filename, size, PhysicalDiskFormat.QCOW2); |
| String preallocation = "metadata"; |
| Map<String, String> options = new HashMap<String, String>(); |
| |
| options.put("preallocation", preallocation); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file, options); |
| |
| String allocatedSize = Script.runSimpleBashScript(String.format("ls -alhs %s | awk '{print $1}'", file)); |
| String declaredSize = Script.runSimpleBashScript(String.format("ls -alhs %s | awk '{print $6}'", file)); |
| |
| assertFalse(allocatedSize.equals(declaredSize)); |
| |
| File f = new File(filename); |
| f.delete(); |
| |
| } |
| |
| @Test |
| public void testCreateAndResize() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| long startSize = 20480; |
| long endSize = 40960; |
| QemuImgFile file = new QemuImgFile(filename, startSize, PhysicalDiskFormat.QCOW2); |
| |
| try { |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file); |
| qemu.resize(file, endSize); |
| Map<String, String> info = qemu.info(file); |
| |
| if (info == null) { |
| fail("We didn't get any information back from qemu-img"); |
| } |
| |
| Long infoSize = Long.parseLong(info.get(new String("virtual_size"))); |
| assertEquals(Long.valueOf(endSize), Long.valueOf(infoSize)); |
| } catch (QemuImgException e) { |
| fail(e.getMessage()); |
| } |
| |
| File f = new File(filename); |
| f.delete(); |
| |
| } |
| |
| @Test |
| public void testCreateAndResizeDeltaPositive() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| long startSize = 20480; |
| long increment = 20480; |
| QemuImgFile file = new QemuImgFile(filename, startSize, PhysicalDiskFormat.RAW); |
| |
| try { |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file); |
| qemu.resize(file, increment, true); |
| Map<String, String> info = qemu.info(file); |
| |
| if (info == null) { |
| fail("We didn't get any information back from qemu-img"); |
| } |
| |
| Long infoSize = Long.parseLong(info.get(new String("virtual_size"))); |
| assertEquals(Long.valueOf(startSize + increment), Long.valueOf(infoSize)); |
| } catch (QemuImgException e) { |
| fail(e.getMessage()); |
| } |
| |
| File f = new File(filename); |
| f.delete(); |
| } |
| |
| @Test |
| public void testCreateAndResizeDeltaNegative() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| long startSize = 81920; |
| long increment = -40960; |
| QemuImgFile file = new QemuImgFile(filename, startSize, PhysicalDiskFormat.RAW); |
| |
| try { |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file); |
| qemu.resize(file, increment, true); |
| Map<String, String> info = qemu.info(file); |
| |
| if (info == null) { |
| fail("We didn't get any information back from qemu-img"); |
| } |
| |
| Long infoSize = Long.parseLong(info.get(new String("virtual_size"))); |
| assertEquals(Long.valueOf(startSize + increment), Long.valueOf(infoSize)); |
| } catch (QemuImgException e) { |
| fail(e.getMessage()); |
| } |
| |
| File f = new File(filename); |
| f.delete(); |
| } |
| |
| @Test(expected = QemuImgException.class) |
| public void testCreateAndResizeFail() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| long startSize = 20480; |
| |
| /* Negative new size, expect failure */ |
| long endSize = -1; |
| QemuImgFile file = new QemuImgFile(filename, startSize, PhysicalDiskFormat.QCOW2); |
| |
| QemuImg qemu = new QemuImg(0); |
| try { |
| qemu.create(file); |
| qemu.resize(file, endSize); |
| } finally { |
| File f = new File(filename); |
| f.delete(); |
| } |
| } |
| |
| @Test(expected = QemuImgException.class) |
| public void testCreateAndResizeZero() throws QemuImgException { |
| String filename = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| long startSize = 20480; |
| QemuImgFile file = new QemuImgFile(filename, 20480, PhysicalDiskFormat.QCOW2); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(file); |
| qemu.resize(file, 0); |
| |
| File f = new File(filename); |
| f.delete(); |
| |
| } |
| |
| @Test |
| public void testCreateWithBackingFile() throws QemuImgException { |
| String firstFileName = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| String secondFileName = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| QemuImgFile firstFile = new QemuImgFile(firstFileName, 20480, PhysicalDiskFormat.QCOW2); |
| QemuImgFile secondFile = new QemuImgFile(secondFileName, PhysicalDiskFormat.QCOW2); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(firstFile); |
| qemu.create(secondFile, firstFile); |
| |
| Map<String, String> info = qemu.info(secondFile); |
| if (info == null) { |
| fail("We didn't get any information back from qemu-img"); |
| } |
| |
| String backingFile = info.get(new String("backing_file")); |
| if (backingFile == null) { |
| fail("The second file does not have a property backing_file! Create failed?"); |
| } |
| } |
| |
| @Test |
| public void testConvertBasic() throws QemuImgException { |
| long srcSize = 20480; |
| String srcFileName = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| String destFileName = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| |
| QemuImgFile srcFile = new QemuImgFile(srcFileName, srcSize); |
| QemuImgFile destFile = new QemuImgFile(destFileName); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(srcFile); |
| qemu.convert(srcFile, destFile); |
| Map<String, String> info = qemu.info(destFile); |
| if (info == null) { |
| fail("We didn't get any information back from qemu-img"); |
| } |
| |
| File sf = new File(srcFileName); |
| sf.delete(); |
| |
| File df = new File(destFileName); |
| df.delete(); |
| |
| } |
| |
| @Test |
| public void testConvertAdvanced() throws QemuImgException { |
| long srcSize = 4019200; |
| String srcFileName = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| String destFileName = "/tmp/" + UUID.randomUUID() + ".qcow2"; |
| PhysicalDiskFormat srcFormat = PhysicalDiskFormat.RAW; |
| PhysicalDiskFormat destFormat = PhysicalDiskFormat.QCOW2; |
| |
| QemuImgFile srcFile = new QemuImgFile(srcFileName, srcSize, srcFormat); |
| QemuImgFile destFile = new QemuImgFile(destFileName, destFormat); |
| |
| QemuImg qemu = new QemuImg(0); |
| qemu.create(srcFile); |
| qemu.convert(srcFile, destFile); |
| |
| Map<String, String> info = qemu.info(destFile); |
| |
| PhysicalDiskFormat infoFormat = PhysicalDiskFormat.valueOf(info.get(new String("format")).toUpperCase()); |
| assertEquals(destFormat, infoFormat); |
| |
| Long infoSize = Long.parseLong(info.get(new String("virtual_size"))); |
| assertEquals(Long.valueOf(srcSize), Long.valueOf(infoSize)); |
| |
| File sf = new File(srcFileName); |
| sf.delete(); |
| |
| File df = new File(destFileName); |
| df.delete(); |
| |
| } |
| } |