Verify QCOW2 features on direct download of template

This commit is contained in:
Daniel Augusto Veronezi Salvador 2024-10-23 18:34:25 -03:00
parent 54b3519df1
commit 966b75d0b9

View File

@ -26,6 +26,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@ -63,6 +64,7 @@ import org.apache.cloudstack.storage.command.ResignatureCommand;
import org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer;
import org.apache.cloudstack.storage.command.SnapshotAndCopyCommand;
import org.apache.cloudstack.storage.command.SyncVolumePathCommand;
import org.apache.cloudstack.storage.formatinspector.Qcow2Inspector;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
import org.apache.cloudstack.storage.to.TemplateObjectTO;
@ -2394,6 +2396,22 @@ public class KVMStorageProcessor implements StorageProcessor {
template = storagePoolMgr.createPhysicalDiskFromDirectDownloadTemplate(tempFilePath, destTemplatePath, destPool, cmd.getFormat(), cmd.getWaitInMillSeconds());
String templatePath = template.getPath();
if (templatePath != null) {
try {
Qcow2Inspector.validateQcow2File(templatePath);
} catch (RuntimeException e) {
try {
Files.deleteIfExists(Path.of(templatePath));
} catch (IOException ioException) {
s_logger.warn(String.format("Unable to remove file [%s]; consider removing it manually.", templatePath), ioException);
}
s_logger.error(String.format("The downloaded file [%s] is not a valid QCOW2.", templatePath), e);
return new DirectDownloadAnswer(false, "The downloaded file is not a valid QCOW2. Ask the administrator to check the logs for more details.", true);
}
}
if (!storagePoolMgr.disconnectPhysicalDisk(pool.getPoolType(), pool.getUuid(), destTemplatePath)) {
s_logger.warn("Unable to disconnect physical disk at path: " + destTemplatePath + ", in storage pool id: " + pool.getUuid());
}