mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
User friendly name of Downloaded Templates Volumes and ISOs (#9252)
This commit is contained in:
parent
7a0cd55e98
commit
2315a73a20
@ -23,18 +23,19 @@ import com.cloud.agent.api.to.DataTO;
|
|||||||
|
|
||||||
public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
|
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();
|
super();
|
||||||
this.parent = parent; // parent is required as not the template can be child of one of many parents
|
this.parent = parent; // parent is required as not the template can be child of one of many parents
|
||||||
this.installPath = installPath;
|
this.installPath = installPath;
|
||||||
this.extractLinkUUID = uuid;
|
this.filenameInExtractURL = fileName;
|
||||||
|
this.filepathInExtractURL = filePath;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CreateEntityDownloadURLCommand(String installPath, String uuid) {
|
public CreateEntityDownloadURLCommand(String installPath, String filename) {
|
||||||
super();
|
super();
|
||||||
this.installPath = installPath;
|
this.installPath = installPath;
|
||||||
this.extractLinkUUID = uuid;
|
this.filenameInExtractURL = filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CreateEntityDownloadURLCommand() {
|
public CreateEntityDownloadURLCommand() {
|
||||||
@ -42,7 +43,8 @@ public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
|
|||||||
|
|
||||||
private String installPath;
|
private String installPath;
|
||||||
private String parent;
|
private String parent;
|
||||||
private String extractLinkUUID;
|
private String filenameInExtractURL;
|
||||||
|
private String filepathInExtractURL;
|
||||||
|
|
||||||
public DataTO getData() {
|
public DataTO getData() {
|
||||||
return data;
|
return data;
|
||||||
@ -75,12 +77,19 @@ public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
|
|||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getExtractLinkUUID() {
|
public String getFilenameInExtractURL() {
|
||||||
return extractLinkUUID;
|
return filenameInExtractURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExtractLinkUUID(String extractLinkUUID) {
|
public void setFilenameInExtractURL(String filenameInExtractURL) {
|
||||||
this.extractLinkUUID = extractLinkUUID;
|
this.filenameInExtractURL = filenameInExtractURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFilepathInExtractURL() {
|
||||||
|
return filepathInExtractURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilepathInExtractURL(String filepathInExtractURL) {
|
||||||
|
this.filepathInExtractURL = filepathInExtractURL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -50,4 +50,6 @@ public interface DataObject {
|
|||||||
void decRefCount();
|
void decRefCount();
|
||||||
|
|
||||||
Long getRefCount();
|
Long getRefCount();
|
||||||
|
|
||||||
|
String getName();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import javax.inject.Inject;
|
|||||||
import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand;
|
import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand;
|
||||||
import com.cloud.host.dao.HostDao;
|
import com.cloud.host.dao.HostDao;
|
||||||
import com.cloud.storage.Upload;
|
import com.cloud.storage.Upload;
|
||||||
|
import com.cloud.utils.StringUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
||||||
@ -64,20 +65,43 @@ public class CloudStackImageStoreDriverImpl extends NfsImageStoreDriverImpl {
|
|||||||
return nfsTO;
|
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
|
@Override
|
||||||
public String createEntityExtractUrl(DataStore store, String installPath, ImageFormat format, DataObject dataObject) {
|
public String createEntityExtractUrl(DataStore store, String installPath, ImageFormat format, DataObject dataObject) {
|
||||||
// find an endpoint to send command
|
// find an endpoint to send command
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
// Create Symlink at ssvm
|
// Create Symlink at ssvm
|
||||||
String path = installPath;
|
String path = installPath;
|
||||||
String uuid = UUID.randomUUID().toString();
|
String objectNameInUrl = createObjectNameForExtractUrl(path, format, dataObject);
|
||||||
if (format != null) {
|
String objectPathInUrl = UUID.randomUUID().toString();
|
||||||
uuid = uuid + "." + format.getFileExtension();
|
|
||||||
} else if (path.lastIndexOf(".") != -1) {
|
|
||||||
uuid = uuid + "." + path.substring(path.lastIndexOf(".") + 1);
|
|
||||||
}
|
|
||||||
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(),
|
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;
|
Answer ans = null;
|
||||||
if (ep == null) {
|
if (ep == null) {
|
||||||
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
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);
|
throw new CloudRuntimeException(errorString);
|
||||||
}
|
}
|
||||||
// Construct actual URL locally now that the symlink exists at SSVM
|
// 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 hostname = ipAddress;
|
||||||
String scheme = "http";
|
String scheme = "http";
|
||||||
@ -118,7 +142,7 @@ public class CloudStackImageStoreDriverImpl extends NfsImageStoreDriverImpl {
|
|||||||
}
|
}
|
||||||
scheme = "https";
|
scheme = "https";
|
||||||
}
|
}
|
||||||
return scheme + "://" + hostname + "/userdata/" + uuid;
|
return scheme + "://" + hostname + "/userdata/" + filePath + "/" + fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -261,7 +261,7 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
|
|||||||
// Create Symlink at ssvm
|
// Create Symlink at ssvm
|
||||||
String path = vmTemplateHost.getInstallPath();
|
String path = vmTemplateHost.getInstallPath();
|
||||||
String uuid = UUID.randomUUID().toString() + "." + template.getFormat().getFileExtension(); // adding "." + vhd/ova... etc.
|
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);
|
Answer ans = ep.sendMessage(cmd);
|
||||||
if (ans == null || !ans.getResult()) {
|
if (ans == null || !ans.getResult()) {
|
||||||
errorString = "Unable to create a link for " + type + " id:" + template.getId() + "," + (ans == null ? "" : ans.getDetails());
|
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);
|
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);
|
Answer ans = ep.sendMessage(cmd);
|
||||||
if (ans == null || !ans.getResult()) {
|
if (ans == null || !ans.getResult()) {
|
||||||
errorString = "Unable to create a link for " + type + " id:" + entityId + "," + (ans == null ? "" : ans.getDetails());
|
errorString = "Unable to create a link for " + type + " id:" + entityId + "," + (ans == null ? "" : ans.getDetails());
|
||||||
|
|||||||
@ -99,4 +99,9 @@ public class DiagnosticsDataObject implements DataObject {
|
|||||||
public Long getRefCount() {
|
public Long getRefCount() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return dataStore.getName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -268,6 +268,8 @@ public class UploadManagerImpl extends ManagerBase implements UploadManager {
|
|||||||
}
|
}
|
||||||
// Create the directory structure so that its visible under apache server root
|
// Create the directory structure so that its visible under apache server root
|
||||||
String extractDir = "/var/www/html/userdata/";
|
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);
|
Script command = new Script("/bin/su", s_logger);
|
||||||
command.add("-s");
|
command.add("-s");
|
||||||
command.add("/bin/bash");
|
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.
|
// 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();
|
// 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 = new Script("/bin/bash", s_logger);
|
||||||
command.add("-c");
|
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();
|
result = command.execute();
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
String errorString = "Error in linking err=" + result;
|
String errorString = "Error in linking err=" + result;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user