This is an automated email from the ASF dual-hosted git repository. harikrishna pushed a commit to branch UseObjectNameWhileDownloading in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 9d64ebede9ac0dc1cf15298429716cf3f60e172c Author: Harikrishna Patnala <[email protected]> AuthorDate: Fri Jun 14 13:02:38 2024 +0530 Use object name as the file name when downloading the template or ISO or volumes --- .../engine/subsystem/api/storage/DataObject.java | 2 ++ .../driver/CloudStackImageStoreDriverImpl.java | 39 +++++++++++++++++----- .../diagnostics/to/DiagnosticsDataObject.java | 5 +++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java index 091c09d7a4d..fe052f01606 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java @@ -50,4 +50,6 @@ public interface DataObject { void decRefCount(); Long getRefCount(); + + String getName(); } diff --git a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java index 71fa2e91bcb..d2961f0b064 100644 --- a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java +++ b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand; import com.cloud.host.dao.HostDao; import com.cloud.storage.Upload; +import com.cloud.utils.StringUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; @@ -64,20 +65,42 @@ public class CloudStackImageStoreDriverImpl extends NfsImageStoreDriverImpl { return nfsTO; } + private String createObjectNameForExtractUrl(String installPath, ImageFormat format, DataObject dataObject) { + String objectNameInUrl = dataObject.getName(); + try { + objectNameInUrl = cleanObjectName(objectNameInUrl); + } catch (Exception e) { + objectNameInUrl = UUID.randomUUID().toString(); + } + + if (format != null) { + objectNameInUrl = objectNameInUrl + "." + format.getFileExtension(); + } else if (installPath.lastIndexOf(".") != -1) { + objectNameInUrl = objectNameInUrl + "." + installPath.substring(installPath.lastIndexOf(".") + 1); + } + + return objectNameInUrl; + } + + private String cleanObjectName(String objectName) { + if (StringUtils.isEmpty(objectName)) { + throw new IllegalArgumentException("Object name is empty or null"); + } + return objectName.trim() + .replaceAll("[^a-zA-Z0-9]+", "-") + .replaceAll("-{2,}", "-") + .replaceAll("^-|-$", ""); + } + @Override public String createEntityExtractUrl(DataStore store, String installPath, ImageFormat format, DataObject dataObject) { // find an endpoint to send command EndPoint ep = _epSelector.select(store); // Create Symlink at ssvm String path = installPath; - String uuid = UUID.randomUUID().toString(); - if (format != null) { - uuid = uuid + "." + format.getFileExtension(); - } else if (path.lastIndexOf(".") != -1) { - uuid = uuid + "." + path.substring(path.lastIndexOf(".") + 1); - } + String objectNameInUrl = createObjectNameForExtractUrl(path, format, dataObject); CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), - path, uuid, dataObject == null ? null: dataObject.getTO()); + path, objectNameInUrl, dataObject == null ? null: dataObject.getTO()); Answer ans = null; if (ep == null) { String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; @@ -92,7 +115,7 @@ public class CloudStackImageStoreDriverImpl extends NfsImageStoreDriverImpl { throw new CloudRuntimeException(errorString); } // Construct actual URL locally now that the symlink exists at SSVM - return generateCopyUrl(ep.getPublicAddr(), uuid); + return generateCopyUrl(ep.getPublicAddr(), objectNameInUrl); } private String generateCopyUrl(String ipAddress, String uuid) { diff --git a/server/src/main/java/org/apache/cloudstack/diagnostics/to/DiagnosticsDataObject.java b/server/src/main/java/org/apache/cloudstack/diagnostics/to/DiagnosticsDataObject.java index ebe1d7fbc73..de66ad4d5e6 100644 --- a/server/src/main/java/org/apache/cloudstack/diagnostics/to/DiagnosticsDataObject.java +++ b/server/src/main/java/org/apache/cloudstack/diagnostics/to/DiagnosticsDataObject.java @@ -99,4 +99,9 @@ public class DiagnosticsDataObject implements DataObject { public Long getRefCount() { return null; } + + @Override + public String getName() { + return dataStore.getName(); + } }
