User friendly name of Downloaded Templates Volumes and ISOs (#9252)

This commit is contained in:
Harikrishna 2024-06-19 16:17:43 +05:30 committed by GitHub
parent 7a0cd55e98
commit 2315a73a20
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 65 additions and 23 deletions

View File

@ -23,18 +23,19 @@ import com.cloud.agent.api.to.DataTO;
public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
public CreateEntityDownloadURLCommand(String parent, String installPath, String uuid, DataTO data) { // this constructor is for creating template download url
public CreateEntityDownloadURLCommand(String parent, String installPath, String fileName, String filePath, DataTO data) { // this constructor is for creating template download url
super();
this.parent = parent; // parent is required as not the template can be child of one of many parents
this.installPath = installPath;
this.extractLinkUUID = uuid;
this.filenameInExtractURL = fileName;
this.filepathInExtractURL = filePath;
this.data = data;
}
public CreateEntityDownloadURLCommand(String installPath, String uuid) {
public CreateEntityDownloadURLCommand(String installPath, String filename) {
super();
this.installPath = installPath;
this.extractLinkUUID = uuid;
this.filenameInExtractURL = filename;
}
public CreateEntityDownloadURLCommand() {
@ -42,7 +43,8 @@ public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
private String installPath;
private String parent;
private String extractLinkUUID;
private String filenameInExtractURL;
private String filepathInExtractURL;
public DataTO getData() {
return data;
@ -75,12 +77,19 @@ public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
this.parent = parent;
}
public String getExtractLinkUUID() {
return extractLinkUUID;
public String getFilenameInExtractURL() {
return filenameInExtractURL;
}
public void setExtractLinkUUID(String extractLinkUUID) {
this.extractLinkUUID = extractLinkUUID;
public void setFilenameInExtractURL(String filenameInExtractURL) {
this.filenameInExtractURL = filenameInExtractURL;
}
public String getFilepathInExtractURL() {
return filepathInExtractURL;
}
public void setFilepathInExtractURL(String filepathInExtractURL) {
this.filepathInExtractURL = filepathInExtractURL;
}
}

View File

@ -50,4 +50,6 @@ public interface DataObject {
void decRefCount();
Long getRefCount();
String getName();
}

View File

@ -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,43 @@ 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);
String objectPathInUrl = UUID.randomUUID().toString();
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(),
path, uuid, dataObject == null ? null: dataObject.getTO());
path, objectNameInUrl, objectPathInUrl, 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,10 +116,10 @@ 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, objectPathInUrl);
}
private String generateCopyUrl(String ipAddress, String uuid) {
private String generateCopyUrl(String ipAddress, String fileName, String filePath) {
String hostname = ipAddress;
String scheme = "http";
@ -118,7 +142,7 @@ public class CloudStackImageStoreDriverImpl extends NfsImageStoreDriverImpl {
}
scheme = "https";
}
return scheme + "://" + hostname + "/userdata/" + uuid;
return scheme + "://" + hostname + "/userdata/" + filePath + "/" + fileName;
}
@Override

View File

@ -261,7 +261,7 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
// Create Symlink at ssvm
String path = vmTemplateHost.getInstallPath();
String uuid = UUID.randomUUID().toString() + "." + template.getFormat().getFileExtension(); // adding "." + vhd/ova... etc.
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, null);
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, null, null);
Answer ans = ep.sendMessage(cmd);
if (ans == null || !ans.getResult()) {
errorString = "Unable to create a link for " + type + " id:" + template.getId() + "," + (ans == null ? "" : ans.getDetails());
@ -317,7 +317,7 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
throw new CloudRuntimeException(errorString);
}
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)secStore).getMountPoint(), path, uuid, null);
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)secStore).getMountPoint(), path, uuid, null, null);
Answer ans = ep.sendMessage(cmd);
if (ans == null || !ans.getResult()) {
errorString = "Unable to create a link for " + type + " id:" + entityId + "," + (ans == null ? "" : ans.getDetails());

View File

@ -99,4 +99,9 @@ public class DiagnosticsDataObject implements DataObject {
public Long getRefCount() {
return null;
}
@Override
public String getName() {
return dataStore.getName();
}
}

View File

@ -268,6 +268,8 @@ public class UploadManagerImpl extends ManagerBase implements UploadManager {
}
// Create the directory structure so that its visible under apache server root
String extractDir = "/var/www/html/userdata/";
extractDir = extractDir + cmd.getFilepathInExtractURL() + File.separator;
s_logger.info("HARI " + extractDir);
Script command = new Script("/bin/su", s_logger);
command.add("-s");
command.add("/bin/bash");
@ -290,11 +292,11 @@ public class UploadManagerImpl extends ManagerBase implements UploadManager {
}
// Create a random file under the directory for security reasons.
String uuid = cmd.getExtractLinkUUID();
String filename = cmd.getFilenameInExtractURL();
// Create a symbolic link from the actual directory to the template location. The entity would be directly visible under /var/www/html/userdata/cmd.getInstallPath();
command = new Script("/bin/bash", s_logger);
command.add("-c");
command.add("ln -sf /mnt/SecStorage/" + cmd.getParent() + File.separator + cmd.getInstallPath() + " " + extractDir + uuid);
command.add("ln -sf /mnt/SecStorage/" + cmd.getParent() + File.separator + cmd.getInstallPath() + " " + extractDir + filename);
result = command.execute();
if (result != null) {
String errorString = "Error in linking err=" + result;