blob: e81890a9832eac391f7c9f0afbed9449886c54dd [file] [log] [blame]
// 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();
}
}