mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 01:32:18 +02:00
Support xz format for template registration (#11786)
This commit is contained in:
parent
dfcbd2e977
commit
9e535e35d2
@ -79,6 +79,7 @@ import com.cloud.storage.Storage.StoragePoolType;
|
|||||||
import com.cloud.storage.StorageLayer;
|
import com.cloud.storage.StorageLayer;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.script.Script;
|
import com.cloud.utils.script.Script;
|
||||||
|
import com.cloud.utils.storage.TemplateDownloaderUtil;
|
||||||
|
|
||||||
public class LibvirtStorageAdaptor implements StorageAdaptor {
|
public class LibvirtStorageAdaptor implements StorageAdaptor {
|
||||||
protected Logger logger = LogManager.getLogger(getClass());
|
protected Logger logger = LogManager.getLogger(getClass());
|
||||||
@ -172,37 +173,11 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if downloaded template is extractable
|
|
||||||
* @return true if it should be extracted, false if not
|
|
||||||
*/
|
|
||||||
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 extract command to execute given downloaded file
|
|
||||||
* @param downloadedTemplateFile
|
|
||||||
* @param templateUuid
|
|
||||||
*/
|
|
||||||
public static String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateUuid) {
|
|
||||||
if (downloadedTemplateFile.endsWith(".zip")) {
|
|
||||||
return "unzip -p " + downloadedTemplateFile + " | cat > " + templateUuid;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".bz2")) {
|
|
||||||
return "bunzip2 -c " + downloadedTemplateFile + " > " + templateUuid;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".gz")) {
|
|
||||||
return "gunzip -c " + downloadedTemplateFile + " > " + templateUuid;
|
|
||||||
} else {
|
|
||||||
throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract downloaded template into installPath, remove compressed file
|
* Extract downloaded template into installPath, remove compressed file
|
||||||
*/
|
*/
|
||||||
public static void extractDownloadedTemplate(String downloadedTemplateFile, KVMStoragePool destPool, String destinationFile) {
|
public static void extractDownloadedTemplate(String downloadedTemplateFile, KVMStoragePool destPool, String destinationFile) {
|
||||||
String extractCommand = getExtractCommandForDownloadedFile(downloadedTemplateFile, destinationFile);
|
String extractCommand = TemplateDownloaderUtil.getExtractCommandForDownloadedFile(downloadedTemplateFile, destinationFile);
|
||||||
Script.runSimpleBashScript(extractCommand);
|
Script.runSimpleBashScript(extractCommand);
|
||||||
Script.runSimpleBashScript("rm -f " + downloadedTemplateFile);
|
Script.runSimpleBashScript("rm -f " + downloadedTemplateFile);
|
||||||
}
|
}
|
||||||
@ -221,7 +196,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
|
|||||||
|
|
||||||
if (destPool.getType() == StoragePoolType.NetworkFilesystem || destPool.getType() == StoragePoolType.Filesystem
|
if (destPool.getType() == StoragePoolType.NetworkFilesystem || destPool.getType() == StoragePoolType.Filesystem
|
||||||
|| destPool.getType() == StoragePoolType.SharedMountPoint) {
|
|| destPool.getType() == StoragePoolType.SharedMountPoint) {
|
||||||
if (!Storage.ImageFormat.ISO.equals(format) && isTemplateExtractable(templateFilePath)) {
|
if (!Storage.ImageFormat.ISO.equals(format) && TemplateDownloaderUtil.isTemplateExtractable(templateFilePath)) {
|
||||||
extractDownloadedTemplate(templateFilePath, destPool, destinationFile);
|
extractDownloadedTemplate(templateFilePath, destPool, destinationFile);
|
||||||
} else {
|
} else {
|
||||||
Script.runSimpleBashScript("mv " + templateFilePath + " " + destinationFile);
|
Script.runSimpleBashScript("mv " + templateFilePath + " " + destinationFile);
|
||||||
|
|||||||
@ -423,24 +423,6 @@ public abstract class MultipathSCSIAdapterBase implements StorageAdaptor {
|
|||||||
throw new UnsupportedOperationException("Unimplemented method 'createPhysicalDisk'");
|
throw new UnsupportedOperationException("Unimplemented method 'createPhysicalDisk'");
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) {
|
|
||||||
if (downloadedTemplateFile.endsWith(".zip")) {
|
|
||||||
return "unzip -p " + downloadedTemplateFile + " | cat > " + templateFile;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".bz2")) {
|
|
||||||
return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".gz")) {
|
|
||||||
return "gunzip -c " + downloadedTemplateFile + " > " + templateFile;
|
|
||||||
} else {
|
|
||||||
throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean waitForDiskToBecomeAvailable(AddressInfo address, KVMStoragePool pool, long waitTimeInSec) {
|
boolean waitForDiskToBecomeAvailable(AddressInfo address, KVMStoragePool pool, long waitTimeInSec) {
|
||||||
LOGGER.debug("Waiting for the volume with id: " + address.getPath() + " of the storage pool: " + pool.getUuid() + " to become available for " + waitTimeInSec + " secs");
|
LOGGER.debug("Waiting for the volume with id: " + address.getPath() + " of the storage pool: " + pool.getUuid() + " to become available for " + waitTimeInSec + " secs");
|
||||||
|
|
||||||
|
|||||||
@ -53,6 +53,8 @@ import com.cloud.utils.Ternary;
|
|||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.script.OutputInterpreter;
|
import com.cloud.utils.script.OutputInterpreter;
|
||||||
import com.cloud.utils.script.Script;
|
import com.cloud.utils.script.Script;
|
||||||
|
import com.cloud.utils.storage.TemplateDownloaderUtil;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
public class ScaleIOStorageAdaptor implements StorageAdaptor {
|
public class ScaleIOStorageAdaptor implements StorageAdaptor {
|
||||||
@ -572,10 +574,10 @@ public class ScaleIOStorageAdaptor implements StorageAdaptor {
|
|||||||
throw new CloudRuntimeException("Failed to find the disk: " + destTemplatePath + " of the storage pool: " + destPool.getUuid());
|
throw new CloudRuntimeException("Failed to find the disk: " + destTemplatePath + " of the storage pool: " + destPool.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isTemplateExtractable(templateFilePath)) {
|
if (TemplateDownloaderUtil.isTemplateExtractable(templateFilePath)) {
|
||||||
srcTemplateFilePath = sourceFile.getParent() + "/" + UUID.randomUUID().toString();
|
srcTemplateFilePath = sourceFile.getParent() + "/" + UUID.randomUUID().toString();
|
||||||
logger.debug("Extract the downloaded template " + templateFilePath + " to " + srcTemplateFilePath);
|
logger.debug("Extract the downloaded template " + templateFilePath + " to " + srcTemplateFilePath);
|
||||||
String extractCommand = getExtractCommandForDownloadedFile(templateFilePath, srcTemplateFilePath);
|
String extractCommand = TemplateDownloaderUtil.getExtractCommandForDownloadedFile(templateFilePath, srcTemplateFilePath);
|
||||||
Script.runSimpleBashScript(extractCommand);
|
Script.runSimpleBashScript(extractCommand);
|
||||||
Script.runSimpleBashScript("rm -f " + templateFilePath);
|
Script.runSimpleBashScript("rm -f " + templateFilePath);
|
||||||
}
|
}
|
||||||
@ -611,23 +613,6 @@ public class ScaleIOStorageAdaptor implements StorageAdaptor {
|
|||||||
return destDisk;
|
return destDisk;
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) {
|
|
||||||
if (downloadedTemplateFile.endsWith(".zip")) {
|
|
||||||
return "unzip -p " + downloadedTemplateFile + " | cat > " + templateFile;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".bz2")) {
|
|
||||||
return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".gz")) {
|
|
||||||
return "gunzip -c " + downloadedTemplateFile + " > " + templateFile;
|
|
||||||
} else {
|
|
||||||
throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resizeQcow2ToVolume(String volumePath, QemuImageOptions options, List<QemuObject> objects, Integer timeout) throws QemuImgException, LibvirtException {
|
public void resizeQcow2ToVolume(String volumePath, QemuImageOptions options, List<QemuObject> objects, Integer timeout) throws QemuImgException, LibvirtException {
|
||||||
long rawSizeBytes = getPhysicalDiskSize(volumePath);
|
long rawSizeBytes = getPhysicalDiskSize(volumePath);
|
||||||
long usableSizeBytes = getUsableBytesFromRawBytes(rawSizeBytes);
|
long usableSizeBytes = getUsableBytesFromRawBytes(rawSizeBytes);
|
||||||
|
|||||||
@ -38,6 +38,7 @@ import org.apache.logging.log4j.Logger;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.libvirt.LibvirtException;
|
import org.libvirt.LibvirtException;
|
||||||
|
|
||||||
|
import com.cloud.utils.storage.TemplateDownloaderUtil;
|
||||||
import com.linbit.linstor.api.ApiClient;
|
import com.linbit.linstor.api.ApiClient;
|
||||||
import com.linbit.linstor.api.ApiConsts;
|
import com.linbit.linstor.api.ApiConsts;
|
||||||
import com.linbit.linstor.api.ApiException;
|
import com.linbit.linstor.api.ApiException;
|
||||||
@ -694,7 +695,7 @@ public class LinstorStorageAdaptor implements StorageAdaptor {
|
|||||||
|
|
||||||
private String getFinalDirectDownloadPath(String templateFilePath, KVMStoragePool destPool) {
|
private String getFinalDirectDownloadPath(String templateFilePath, KVMStoragePool destPool) {
|
||||||
String finalSourcePath = templateFilePath;
|
String finalSourcePath = templateFilePath;
|
||||||
if (LibvirtStorageAdaptor.isTemplateExtractable(templateFilePath)) {
|
if (TemplateDownloaderUtil.isTemplateExtractable(templateFilePath)) {
|
||||||
finalSourcePath = templateFilePath.substring(0, templateFilePath.lastIndexOf('.'));
|
finalSourcePath = templateFilePath.substring(0, templateFilePath.lastIndexOf('.'));
|
||||||
LibvirtStorageAdaptor.extractDownloadedTemplate(templateFilePath, destPool, finalSourcePath);
|
LibvirtStorageAdaptor.extractDownloadedTemplate(templateFilePath, destPool, finalSourcePath);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
|||||||
import com.cloud.utils.script.OutputInterpreter;
|
import com.cloud.utils.script.OutputInterpreter;
|
||||||
import com.cloud.utils.script.Script;
|
import com.cloud.utils.script.Script;
|
||||||
|
|
||||||
|
import com.cloud.utils.storage.TemplateDownloaderUtil;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
@ -528,32 +529,15 @@ public class StorPoolStorageAdaptor implements StorageAdaptor {
|
|||||||
|
|
||||||
private String extractTemplate(String templateFilePath, File sourceFile, String srcTemplateFilePath,
|
private String extractTemplate(String templateFilePath, File sourceFile, String srcTemplateFilePath,
|
||||||
String templateName) {
|
String templateName) {
|
||||||
if (isTemplateExtractable(templateFilePath)) {
|
if (TemplateDownloaderUtil.isTemplateExtractable(templateFilePath)) {
|
||||||
srcTemplateFilePath = sourceFile.getParent() + "/" + templateName;
|
srcTemplateFilePath = sourceFile.getParent() + "/" + templateName;
|
||||||
String extractCommand = getExtractCommandForDownloadedFile(templateFilePath, srcTemplateFilePath);
|
String extractCommand = TemplateDownloaderUtil.getExtractCommandForDownloadedFile(templateFilePath, srcTemplateFilePath);
|
||||||
Script.runSimpleBashScript(extractCommand);
|
Script.runSimpleBashScript(extractCommand);
|
||||||
Script.runSimpleBashScript("rm -f " + templateFilePath);
|
Script.runSimpleBashScript("rm -f " + templateFilePath);
|
||||||
}
|
}
|
||||||
return srcTemplateFilePath;
|
return srcTemplateFilePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) {
|
|
||||||
if (downloadedTemplateFile.endsWith(".zip")) {
|
|
||||||
return "unzip -p " + downloadedTemplateFile + " | cat > " + templateFile;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".bz2")) {
|
|
||||||
return "bunzip2 -c " + downloadedTemplateFile + " > " + templateFile;
|
|
||||||
} else if (downloadedTemplateFile.endsWith(".gz")) {
|
|
||||||
return "gunzip -c " + downloadedTemplateFile + " > " + templateFile;
|
|
||||||
} else {
|
|
||||||
throw new CloudRuntimeException("Unable to extract template " + downloadedTemplateFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getNameFromResponse(String resp, boolean tildeNeeded, boolean isSnapshot) {
|
private String getNameFromResponse(String resp, boolean tildeNeeded, boolean isSnapshot) {
|
||||||
JsonParser jsonParser = new JsonParser();
|
JsonParser jsonParser = new JsonParser();
|
||||||
JsonObject respObj = (JsonObject) jsonParser.parse(resp);
|
JsonObject respObj = (JsonObject) jsonParser.parse(resp);
|
||||||
|
|||||||
@ -87,6 +87,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
[zZ][iI][pP]) unzip -p $1 | cat > $tmpfile
|
[zZ][iI][pP]) unzip -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -88,6 +88,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
ZIP) unzip -p $1 | cat > $tmpfile
|
ZIP) unzip -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -65,6 +65,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
[zZ][iI][pP]) unzip -p $1 | cat > $tmpfile
|
[zZ][iI][pP]) unzip -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -66,6 +66,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
ZIP) unzip -p $1 | cat > $tmpfile
|
ZIP) unzip -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -63,6 +63,8 @@ is_compressed() {
|
|||||||
;;
|
;;
|
||||||
[zZ][iI][pP]) ctype="zip"
|
[zZ][iI][pP]) ctype="zip"
|
||||||
;;
|
;;
|
||||||
|
XZ) ctype="xz"
|
||||||
|
;;
|
||||||
*) echo "File $1 does not appear to be compressed" >&2
|
*) echo "File $1 does not appear to be compressed" >&2
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
@ -82,6 +84,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
[zZ][iI][pP]) unzip -q -p $1 | cat > $tmpfile
|
[zZ][iI][pP]) unzip -q -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -85,6 +85,8 @@ is_compressed() {
|
|||||||
;;
|
;;
|
||||||
ZIP) ctype="zip"
|
ZIP) ctype="zip"
|
||||||
;;
|
;;
|
||||||
|
XZ) ctype="xz"
|
||||||
|
;;
|
||||||
*) echo "File $1 does not appear to be compressed" >&2
|
*) echo "File $1 does not appear to be compressed" >&2
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
@ -104,6 +106,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
ZIP) unzip -q -p $1 | cat > $tmpfile
|
ZIP) unzip -q -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -75,6 +75,8 @@ is_compressed() {
|
|||||||
;;
|
;;
|
||||||
ZIP) ctype="zip"
|
ZIP) ctype="zip"
|
||||||
;;
|
;;
|
||||||
|
XZ) ctype="xz"
|
||||||
|
;;
|
||||||
*) echo "File $1 does not appear to be compressed" >&2
|
*) echo "File $1 does not appear to be compressed" >&2
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
@ -94,6 +96,8 @@ uncompress() {
|
|||||||
;;
|
;;
|
||||||
ZIP) unzip -q -p $1 | cat > $tmpfile
|
ZIP) unzip -q -p $1 | cat > $tmpfile
|
||||||
;;
|
;;
|
||||||
|
XZ) xz -d -c $1 > $tmpfile
|
||||||
|
;;
|
||||||
*) printf "$1"
|
*) printf "$1"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@ -431,7 +431,7 @@ public class UriUtils {
|
|||||||
return urls;
|
return urls;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Set<String> COMPRESSION_FORMATS = ImmutableSet.of("zip", "bz2", "gz");
|
public static final Set<String> COMPRESSION_FORMATS = ImmutableSet.of("zip", "bz2", "gz", "xz");
|
||||||
|
|
||||||
public static final Set<String> buildExtensionSet(boolean metalink, String... baseExtensions) {
|
public static final Set<String> buildExtensionSet(boolean metalink, String... baseExtensions) {
|
||||||
final ImmutableSet.Builder<String> builder = ImmutableSet.builder();
|
final ImmutableSet.Builder<String> builder = ImmutableSet.builder();
|
||||||
|
|||||||
@ -0,0 +1,61 @@
|
|||||||
|
//
|
||||||
|
// 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
|
||||||
|
// with 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 com.cloud.utils.storage;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import com.cloud.utils.script.Script;
|
||||||
|
|
||||||
|
public class TemplateDownloaderUtil {
|
||||||
|
|
||||||
|
private TemplateDownloaderUtil() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if downloaded template is extractable
|
||||||
|
* @return true if it should be extracted, false if not
|
||||||
|
*/
|
||||||
|
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") || type.equalsIgnoreCase("xz");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return extract command to execute given downloaded file
|
||||||
|
* @param downloadedTemplateFile
|
||||||
|
* @param templateFile
|
||||||
|
*/
|
||||||
|
public static String getExtractCommandForDownloadedFile(String downloadedTemplateFile, String templateFile) {
|
||||||
|
String extension = FilenameUtils.getExtension(downloadedTemplateFile).toLowerCase();
|
||||||
|
switch (extension) {
|
||||||
|
case "zip":
|
||||||
|
return String.format("unzip -p '%s' | cat > '%s'", downloadedTemplateFile, templateFile);
|
||||||
|
case "bz2":
|
||||||
|
return String.format("bunzip2 -c '%s' > '%s'", downloadedTemplateFile, templateFile);
|
||||||
|
case "gz":
|
||||||
|
return String.format("gunzip -c '%s' > '%s'", downloadedTemplateFile, templateFile);
|
||||||
|
case "xz":
|
||||||
|
return String.format("xz -d -c '%s' > '%s'", downloadedTemplateFile, templateFile);
|
||||||
|
default:
|
||||||
|
throw new CloudRuntimeException("Unable to extract template: " + downloadedTemplateFile + " (unsupported format: ." + extension + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -44,7 +44,7 @@ public class UriUtilsParametrizedTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final Set<String> COMMPRESSION_FORMATS = ImmutableSet.of("",".zip", ".bz2", ".gz");
|
private static final Set<String> COMMPRESSION_FORMATS = ImmutableSet.of("",".zip", ".bz2", ".gz");
|
||||||
private static final Set<String> ILLEGAL_COMMPRESSION_FORMATS = ImmutableSet.of(".7z", ".xz");
|
private static final Set<String> ILLEGAL_COMMPRESSION_FORMATS = ImmutableSet.of(".7z");
|
||||||
private final static Set<String> FORMATS = ImmutableSet.of(
|
private final static Set<String> FORMATS = ImmutableSet.of(
|
||||||
"vhd",
|
"vhd",
|
||||||
"vhdx",
|
"vhdx",
|
||||||
|
|||||||
@ -271,6 +271,7 @@ public class UriUtilsTest {
|
|||||||
Assert.assertTrue(UriUtils.isUrlForCompressedFile("https://abc.com/xyz.bz2"));
|
Assert.assertTrue(UriUtils.isUrlForCompressedFile("https://abc.com/xyz.bz2"));
|
||||||
Assert.assertTrue(UriUtils.isUrlForCompressedFile("http://abc.com/xyz.zip"));
|
Assert.assertTrue(UriUtils.isUrlForCompressedFile("http://abc.com/xyz.zip"));
|
||||||
Assert.assertTrue(UriUtils.isUrlForCompressedFile("https://abc.com/xyz.gz"));
|
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"));
|
Assert.assertFalse(UriUtils.isUrlForCompressedFile("http://abc.com/xyz.qcow2"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user