Skip to content

Commit b22116f

Browse files
harikrishna-patnaladhslove
authored andcommitted
User friendly name of Downloaded Templates Volumes and ISOs (apache#9252)
1 parent 40c61f4 commit b22116f

6 files changed

Lines changed: 63 additions & 23 deletions

File tree

core/src/main/java/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,28 @@
2323

2424
public class CreateEntityDownloadURLCommand extends AbstractDownloadCommand {
2525

26-
public CreateEntityDownloadURLCommand(String parent, String installPath, String uuid, DataTO data) { // this constructor is for creating template download url
26+
public CreateEntityDownloadURLCommand(String parent, String installPath, String fileName, String filePath, DataTO data) { // this constructor is for creating template download url
2727
super();
2828
this.parent = parent; // parent is required as not the template can be child of one of many parents
2929
this.installPath = installPath;
30-
this.extractLinkUUID = uuid;
30+
this.filenameInExtractURL = fileName;
31+
this.filepathInExtractURL = filePath;
3132
this.data = data;
3233
}
3334

34-
public CreateEntityDownloadURLCommand(String installPath, String uuid) {
35+
public CreateEntityDownloadURLCommand(String installPath, String filename) {
3536
super();
3637
this.installPath = installPath;
37-
this.extractLinkUUID = uuid;
38+
this.filenameInExtractURL = filename;
3839
}
3940

4041
public CreateEntityDownloadURLCommand() {
4142
}
4243

4344
private String installPath;
4445
private String parent;
45-
private String extractLinkUUID;
46+
private String filenameInExtractURL;
47+
private String filepathInExtractURL;
4648

4749
public DataTO getData() {
4850
return data;
@@ -75,12 +77,19 @@ public void setParent(String parent) {
7577
this.parent = parent;
7678
}
7779

78-
public String getExtractLinkUUID() {
79-
return extractLinkUUID;
80+
public String getFilenameInExtractURL() {
81+
return filenameInExtractURL;
8082
}
8183

82-
public void setExtractLinkUUID(String extractLinkUUID) {
83-
this.extractLinkUUID = extractLinkUUID;
84+
public void setFilenameInExtractURL(String filenameInExtractURL) {
85+
this.filenameInExtractURL = filenameInExtractURL;
8486
}
8587

88+
public String getFilepathInExtractURL() {
89+
return filepathInExtractURL;
90+
}
91+
92+
public void setFilepathInExtractURL(String filepathInExtractURL) {
93+
this.filepathInExtractURL = filepathInExtractURL;
94+
}
8695
}

engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,6 @@ public interface DataObject {
5050
void decRefCount();
5151

5252
Long getRefCount();
53+
54+
String getName();
5355
}

plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand;
2626
import com.cloud.host.dao.HostDao;
2727
import com.cloud.storage.Upload;
28+
import com.cloud.utils.StringUtils;
2829

2930
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
3031
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
@@ -62,20 +63,43 @@ public DataStoreTO getStoreTO(DataStore store) {
6263
return nfsTO;
6364
}
6465

66+
private String createObjectNameForExtractUrl(String installPath, ImageFormat format, DataObject dataObject) {
67+
String objectNameInUrl = dataObject.getName();
68+
try {
69+
objectNameInUrl = cleanObjectName(objectNameInUrl);
70+
} catch (Exception e) {
71+
objectNameInUrl = UUID.randomUUID().toString();
72+
}
73+
74+
if (format != null) {
75+
objectNameInUrl = objectNameInUrl + "." + format.getFileExtension();
76+
} else if (installPath.lastIndexOf(".") != -1) {
77+
objectNameInUrl = objectNameInUrl + "." + installPath.substring(installPath.lastIndexOf(".") + 1);
78+
}
79+
80+
return objectNameInUrl;
81+
}
82+
83+
private String cleanObjectName(String objectName) {
84+
if (StringUtils.isEmpty(objectName)) {
85+
throw new IllegalArgumentException("Object name is empty or null");
86+
}
87+
return objectName.trim()
88+
.replaceAll("[^a-zA-Z0-9]+", "-")
89+
.replaceAll("-{2,}", "-")
90+
.replaceAll("^-|-$", "");
91+
}
92+
6593
@Override
6694
public String createEntityExtractUrl(DataStore store, String installPath, ImageFormat format, DataObject dataObject) {
6795
// find an endpoint to send command
6896
EndPoint ep = _epSelector.select(store);
6997
// Create Symlink at ssvm
7098
String path = installPath;
71-
String uuid = UUID.randomUUID().toString();
72-
if (format != null) {
73-
uuid = uuid + "." + format.getFileExtension();
74-
} else if (path.lastIndexOf(".") != -1) {
75-
uuid = uuid + "." + path.substring(path.lastIndexOf(".") + 1);
76-
}
99+
String objectNameInUrl = createObjectNameForExtractUrl(path, format, dataObject);
100+
String objectPathInUrl = UUID.randomUUID().toString();
77101
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(),
78-
path, uuid, dataObject == null ? null: dataObject.getTO());
102+
path, objectNameInUrl, objectPathInUrl, dataObject == null ? null: dataObject.getTO());
79103
Answer ans = null;
80104
if (ep == null) {
81105
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
@@ -90,10 +114,10 @@ public String createEntityExtractUrl(DataStore store, String installPath, ImageF
90114
throw new CloudRuntimeException(errorString);
91115
}
92116
// Construct actual URL locally now that the symlink exists at SSVM
93-
return generateCopyUrl(ep.getPublicAddr(), uuid);
117+
return generateCopyUrl(ep.getPublicAddr(), objectNameInUrl, objectPathInUrl);
94118
}
95119

96-
private String generateCopyUrl(String ipAddress, String uuid) {
120+
private String generateCopyUrl(String ipAddress, String fileName, String filePath) {
97121

98122
String hostname = ipAddress;
99123
String scheme = "http";
@@ -116,7 +140,7 @@ private String generateCopyUrl(String ipAddress, String uuid) {
116140
}
117141
scheme = "https";
118142
}
119-
return scheme + "://" + hostname + "/userdata/" + uuid;
143+
return scheme + "://" + hostname + "/userdata/" + filePath + "/" + fileName;
120144
}
121145

122146
@Override

server/src/main/java/com/cloud/storage/upload/UploadMonitorImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ else if ((token != null) && (token.length == 5) && (token[2].startsWith(hostname
259259
// Create Symlink at ssvm
260260
String path = vmTemplateHost.getInstallPath();
261261
String uuid = UUID.randomUUID().toString() + "." + template.getFormat().getFileExtension(); // adding "." + vhd/ova... etc.
262-
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, null);
262+
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, null, null);
263263
Answer ans = ep.sendMessage(cmd);
264264
if (ans == null || !ans.getResult()) {
265265
errorString = "Unable to create a link for " + type + " id:" + template.getId() + "," + (ans == null ? "" : ans.getDetails());
@@ -315,7 +315,7 @@ public void createVolumeDownloadURL(Long entityId, String path, Type type, Long
315315
throw new CloudRuntimeException(errorString);
316316
}
317317

318-
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)secStore).getMountPoint(), path, uuid, null);
318+
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)secStore).getMountPoint(), path, uuid, null, null);
319319
Answer ans = ep.sendMessage(cmd);
320320
if (ans == null || !ans.getResult()) {
321321
errorString = "Unable to create a link for " + type + " id:" + entityId + "," + (ans == null ? "" : ans.getDetails());

server/src/main/java/org/apache/cloudstack/diagnostics/to/DiagnosticsDataObject.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,9 @@ public void decRefCount() {
9999
public Long getRefCount() {
100100
return null;
101101
}
102+
103+
@Override
104+
public String getName() {
105+
return dataStore.getName();
106+
}
102107
}

services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,11 @@ public CreateEntityDownloadURLAnswer handleCreateEntityURLCommand(CreateEntityDo
288288
}
289289

290290
// Create a random file under the directory for security reasons.
291-
String uuid = cmd.getExtractLinkUUID();
291+
String filename = cmd.getFilenameInExtractURL();
292292
// 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();
293293
command = new Script("/bin/bash", logger);
294294
command.add("-c");
295-
command.add("ln -sf /mnt/SecStorage/" + cmd.getParent() + File.separator + cmd.getInstallPath() + " " + extractDir + uuid);
295+
command.add("ln -sf /mnt/SecStorage/" + cmd.getParent() + File.separator + cmd.getInstallPath() + " " + extractDir + filename);
296296
result = command.execute();
297297
if (result != null) {
298298
String errorString = "Error in linking err=" + result;

0 commit comments

Comments
 (0)