diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index d5119ea55b71..2ab48f39eb4e 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -178,7 +178,8 @@ public KVMPhysicalDisk createDiskFromTemplateBacking(KVMPhysicalDisk template, S */ public static boolean isTemplateExtractable(String templatePath) { String type = Script.runSimpleBashScript("file " + templatePath + " | awk -F' ' '{print $2}'"); - return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip"); + return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") + || type.equalsIgnoreCase("zip") || type.equalsIgnoreCase("xz"); } /** @@ -193,6 +194,8 @@ public static String getExtractCommandForDownloadedFile(String downloadedTemplat return "bunzip2 -c " + downloadedTemplateFile + " > " + templateUuid; } else if (downloadedTemplateFile.endsWith(".gz")) { return "gunzip -c " + downloadedTemplateFile + " > " + templateUuid; + } else if (downloadedTemplateFile.endsWith(".xz")) { + return "xz -d -c " + downloadedTemplateFile + " > " + templateUuid; } else { throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/MultipathSCSIAdapterBase.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/MultipathSCSIAdapterBase.java index 7ba29ffc26ea..63d310e6a0bb 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/MultipathSCSIAdapterBase.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/MultipathSCSIAdapterBase.java @@ -426,7 +426,8 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, boolean isTemplateExtractable(String templatePath) { ScriptResult result = runScript("file", 5000L, templatePath, "| awk -F' ' '{print $2}'"); String type = result.getResult(); - return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip"); + return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") + || type.equalsIgnoreCase("zip") || type.equalsIgnoreCase("xz"); } String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) { @@ -436,6 +437,8 @@ String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile; } else if (downloadedTemplateFile.endsWith(".gz")) { return "gunzip -c " + downloadedTemplateFile + " > " + templateFile; + } else if (downloadedTemplateFile.endsWith(".xz")) { + return "xz -d -c " + downloadedTemplateFile + " > " + templateFile; } else { throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java index efa8024a34b5..5ebf7a16a431 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java @@ -613,7 +613,8 @@ public KVMPhysicalDisk createTemplateFromDirectDownloadFile(String templateFileP private boolean isTemplateExtractable(String templatePath) { String type = Script.runSimpleBashScript("file " + templatePath + " | awk -F' ' '{print $2}'"); - return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip"); + return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") + || type.equalsIgnoreCase("zip") || type.equalsIgnoreCase("xz"); } private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) { @@ -623,6 +624,8 @@ private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile; } else if (downloadedTemplateFile.endsWith(".gz")) { return "gunzip -c " + downloadedTemplateFile + " > " + templateFile; + } else if (downloadedTemplateFile.endsWith(".xz")) { + return "xz -d -c " + downloadedTemplateFile + " > " + templateFile; } else { throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile); } diff --git a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java index 4dcc67f3f06b..2471d44bf14b 100644 --- a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java +++ b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java @@ -539,7 +539,8 @@ private String extractTemplate(String templateFilePath, File sourceFile, String private boolean isTemplateExtractable(String templatePath) { String type = Script.runSimpleBashScript("file " + templatePath + " | awk -F' ' '{print $2}'"); - return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip"); + return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") + || type.equalsIgnoreCase("zip") || type.equalsIgnoreCase("xz"); } private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) { @@ -549,6 +550,8 @@ private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile; } else if (downloadedTemplateFile.endsWith(".gz")) { return "gunzip -c " + downloadedTemplateFile + " > " + templateFile; + } else if (downloadedTemplateFile.endsWith(".xz")) { + return "xz -d -c " + downloadedTemplateFile + " > " + templateFile; } else { throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile); } diff --git a/scripts/installer/createtmplt.sh b/scripts/installer/createtmplt.sh index db3cfd71ee19..b9b403a94bb7 100755 --- a/scripts/installer/createtmplt.sh +++ b/scripts/installer/createtmplt.sh @@ -87,6 +87,8 @@ uncompress() { ;; [zZ][iI][pP]) unzip -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/scripts/installer/createvolume.sh b/scripts/installer/createvolume.sh index 52792e9fc3aa..4726404b76a4 100755 --- a/scripts/installer/createvolume.sh +++ b/scripts/installer/createvolume.sh @@ -88,6 +88,8 @@ uncompress() { ;; ZIP) unzip -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/scripts/storage/qcow2/createtmplt.sh b/scripts/storage/qcow2/createtmplt.sh index 4bb955e130c7..de7010b0a25e 100755 --- a/scripts/storage/qcow2/createtmplt.sh +++ b/scripts/storage/qcow2/createtmplt.sh @@ -65,6 +65,8 @@ uncompress() { ;; [zZ][iI][pP]) unzip -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/scripts/storage/qcow2/createvolume.sh b/scripts/storage/qcow2/createvolume.sh index ff04ee3fe5e0..b2ce249a3d1b 100755 --- a/scripts/storage/qcow2/createvolume.sh +++ b/scripts/storage/qcow2/createvolume.sh @@ -66,6 +66,8 @@ uncompress() { ;; ZIP) unzip -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/scripts/storage/secondary/createtmplt.sh b/scripts/storage/secondary/createtmplt.sh index ed9bbe869e1b..cfc4be28a012 100755 --- a/scripts/storage/secondary/createtmplt.sh +++ b/scripts/storage/secondary/createtmplt.sh @@ -63,6 +63,8 @@ is_compressed() { ;; [zZ][iI][pP]) ctype="zip" ;; + XZ) ctype="xz" + ;; *) echo "File $1 does not appear to be compressed" >&2 return 1 ;; @@ -82,6 +84,8 @@ uncompress() { ;; [zZ][iI][pP]) unzip -q -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/scripts/storage/secondary/createvolume.sh b/scripts/storage/secondary/createvolume.sh index ac69ebe88aba..a47d1fdc2d38 100755 --- a/scripts/storage/secondary/createvolume.sh +++ b/scripts/storage/secondary/createvolume.sh @@ -85,6 +85,8 @@ is_compressed() { ;; ZIP) ctype="zip" ;; + XZ) ctype="xz" + ;; *) echo "File $1 does not appear to be compressed" >&2 return 1 ;; @@ -104,6 +106,8 @@ uncompress() { ;; ZIP) unzip -q -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/tools/devcloud4/common/development-installation/files/default/createtmplt.sh b/tools/devcloud4/common/development-installation/files/default/createtmplt.sh index 2f8f3421350a..ca5022bae4f0 100755 --- a/tools/devcloud4/common/development-installation/files/default/createtmplt.sh +++ b/tools/devcloud4/common/development-installation/files/default/createtmplt.sh @@ -75,6 +75,8 @@ is_compressed() { ;; ZIP) ctype="zip" ;; + XZ) ctype="xz" + ;; *) echo "File $1 does not appear to be compressed" >&2 return 1 ;; @@ -94,6 +96,8 @@ uncompress() { ;; ZIP) unzip -q -p $1 | cat > $tmpfile ;; + XZ) xz -d -c $1 > $tmpfile + ;; *) printf "$1" return 0 ;; diff --git a/utils/src/main/java/com/cloud/utils/UriUtils.java b/utils/src/main/java/com/cloud/utils/UriUtils.java index 961c121597f5..42603237888c 100644 --- a/utils/src/main/java/com/cloud/utils/UriUtils.java +++ b/utils/src/main/java/com/cloud/utils/UriUtils.java @@ -431,7 +431,7 @@ public static List getMetalinkUrls(String metalinkUrl) { return urls; } - public static final Set COMPRESSION_FORMATS = ImmutableSet.of("zip", "bz2", "gz"); + public static final Set COMPRESSION_FORMATS = ImmutableSet.of("zip", "bz2", "gz", "xz"); public static final Set buildExtensionSet(boolean metalink, String... baseExtensions) { final ImmutableSet.Builder builder = ImmutableSet.builder(); diff --git a/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java b/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java index 3f1e707c6074..2a4c5c34102b 100644 --- a/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java +++ b/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java @@ -44,7 +44,7 @@ public interface ThrowingBlock { } private static final Set COMMPRESSION_FORMATS = ImmutableSet.of("",".zip", ".bz2", ".gz"); - private static final Set ILLEGAL_COMMPRESSION_FORMATS = ImmutableSet.of(".7z", ".xz"); + private static final Set ILLEGAL_COMMPRESSION_FORMATS = ImmutableSet.of(".7z"); private final static Set FORMATS = ImmutableSet.of( "vhd", "vhdx", diff --git a/utils/src/test/java/com/cloud/utils/UriUtilsTest.java b/utils/src/test/java/com/cloud/utils/UriUtilsTest.java index 47fd389e3aef..8e6408f77835 100644 --- a/utils/src/test/java/com/cloud/utils/UriUtilsTest.java +++ b/utils/src/test/java/com/cloud/utils/UriUtilsTest.java @@ -271,6 +271,7 @@ public void testIsUrlForCompressedFile() { Assert.assertTrue(UriUtils.isUrlForCompressedFile("https://abc.com/xyz.bz2")); Assert.assertTrue(UriUtils.isUrlForCompressedFile("http://abc.com/xyz.zip")); Assert.assertTrue(UriUtils.isUrlForCompressedFile("https://abc.com/xyz.gz")); + Assert.assertTrue(UriUtils.isUrlForCompressedFile("http://abc.com/xyz.xz")); Assert.assertFalse(UriUtils.isUrlForCompressedFile("http://abc.com/xyz.qcow2")); }