mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Workaround an issue of null url when ListTemplateCommand is received on
SSVM side, also fix a bug in listTemplates with id passed.
This commit is contained in:
parent
bb7a72b7d6
commit
a221ecb484
@ -16,19 +16,18 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api.storage;
|
package com.cloud.agent.api.storage;
|
||||||
|
|
||||||
import com.cloud.agent.api.LogLevel;
|
|
||||||
import com.cloud.agent.api.LogLevel.Log4jLevel;
|
|
||||||
import com.cloud.agent.api.to.DataStoreTO;
|
import com.cloud.agent.api.to.DataStoreTO;
|
||||||
|
|
||||||
public class ListTemplateCommand extends StorageCommand {
|
public class ListTemplateCommand extends StorageCommand {
|
||||||
@LogLevel(Log4jLevel.Off)
|
|
||||||
private DataStoreTO store;
|
private DataStoreTO store;
|
||||||
|
private String secUrl;
|
||||||
|
|
||||||
public ListTemplateCommand() {
|
public ListTemplateCommand() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListTemplateCommand(DataStoreTO store) {
|
public ListTemplateCommand(DataStoreTO store, String url) {
|
||||||
this.store = store;
|
this.store = store;
|
||||||
|
this.secUrl = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,4 +40,8 @@ public class ListTemplateCommand extends StorageCommand {
|
|||||||
return store;
|
return store;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSecUrl() {
|
||||||
|
return secUrl;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,15 +16,19 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.agent.api.storage;
|
package com.cloud.agent.api.storage;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.to.DataStoreTO;
|
||||||
|
|
||||||
|
|
||||||
public class ListVolumeCommand extends StorageCommand {
|
public class ListVolumeCommand extends StorageCommand {
|
||||||
|
|
||||||
|
private DataStoreTO store;
|
||||||
private String secUrl;
|
private String secUrl;
|
||||||
|
|
||||||
public ListVolumeCommand() {
|
public ListVolumeCommand() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListVolumeCommand(String secUrl) {
|
public ListVolumeCommand(DataStoreTO store, String secUrl) {
|
||||||
|
this.store = store;
|
||||||
this.secUrl = secUrl;
|
this.secUrl = secUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,4 +41,7 @@ public class ListVolumeCommand extends StorageCommand {
|
|||||||
return secUrl;
|
return secUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DataStoreTO getDataStore() {
|
||||||
|
return store;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -327,6 +327,11 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
|
|||||||
return join(asList(VOLUME_ROOT_DIR, accountId, volId), S3Utils.SEPARATOR);
|
return join(asList(VOLUME_ROOT_DIR, accountId, volId), S3Utils.SEPARATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected Long determineS3VolumeIdFromKey(String key) {
|
||||||
|
return Long.parseLong(StringUtils.substringAfterLast(StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR), S3Utils.SEPARATOR));
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private String determineStorageTemplatePath(final String storagePath, String dataPath) {
|
private String determineStorageTemplatePath(final String storagePath, String dataPath) {
|
||||||
return join(asList(getRootDir(storagePath), dataPath), File.separator);
|
return join(asList(getRootDir(storagePath), dataPath), File.separator);
|
||||||
@ -1121,6 +1126,25 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<Long, TemplateProp> s3ListVolume(S3TO s3) {
|
||||||
|
String bucket = s3.getBucketName();
|
||||||
|
// List the objects in the source directory on S3
|
||||||
|
final List<S3ObjectSummary> objectSummaries = S3Utils.getDirectory(s3, bucket, this.VOLUME_ROOT_DIR);
|
||||||
|
if (objectSummaries == null)
|
||||||
|
return null;
|
||||||
|
Map<Long, TemplateProp> tmpltInfos = new HashMap<Long, TemplateProp>();
|
||||||
|
for (S3ObjectSummary objectSummary : objectSummaries) {
|
||||||
|
String key = objectSummary.getKey();
|
||||||
|
String installPath = StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR);
|
||||||
|
Long id = this.determineS3VolumeIdFromKey(key);
|
||||||
|
// TODO: how to get volume template name
|
||||||
|
TemplateProp tInfo = new TemplateProp(id.toString(), installPath, objectSummary.getSize(), objectSummary.getSize(), true, false);
|
||||||
|
tmpltInfos.put(id, tInfo);
|
||||||
|
}
|
||||||
|
return tmpltInfos;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private Answer execute(ListTemplateCommand cmd) {
|
private Answer execute(ListTemplateCommand cmd) {
|
||||||
if (!_inSystemVM) {
|
if (!_inSystemVM) {
|
||||||
return new Answer(cmd, true, null);
|
return new Answer(cmd, true, null);
|
||||||
@ -1129,9 +1153,10 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
|
|||||||
DataStoreTO store = cmd.getDataStore();
|
DataStoreTO store = cmd.getDataStore();
|
||||||
if (store instanceof NfsTO) {
|
if (store instanceof NfsTO) {
|
||||||
NfsTO nfs = (NfsTO) store;
|
NfsTO nfs = (NfsTO) store;
|
||||||
String root = getRootDir(nfs.getUrl());
|
String secUrl = cmd.getSecUrl();
|
||||||
|
String root = getRootDir(secUrl);
|
||||||
Map<String, TemplateProp> templateInfos = _dlMgr.gatherTemplateInfo(root);
|
Map<String, TemplateProp> templateInfos = _dlMgr.gatherTemplateInfo(root);
|
||||||
return new ListTemplateAnswer(nfs.getUrl(), templateInfos);
|
return new ListTemplateAnswer(secUrl, templateInfos);
|
||||||
} else if (store instanceof SwiftTO) {
|
} else if (store instanceof SwiftTO) {
|
||||||
SwiftTO swift = (SwiftTO) store;
|
SwiftTO swift = (SwiftTO) store;
|
||||||
Map<String, TemplateProp> templateInfos = swiftListTemplate(swift);
|
Map<String, TemplateProp> templateInfos = swiftListTemplate(swift);
|
||||||
@ -1150,9 +1175,19 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
|
|||||||
return new Answer(cmd, true, null);
|
return new Answer(cmd, true, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DataStoreTO store = cmd.getDataStore();
|
||||||
|
if (store instanceof NfsTO) {
|
||||||
|
NfsTO nfs = (NfsTO)store;
|
||||||
String root = getRootDir(cmd.getSecUrl());
|
String root = getRootDir(cmd.getSecUrl());
|
||||||
Map<Long, TemplateProp> templateInfos = _dlMgr.gatherVolumeInfo(root);
|
Map<Long, TemplateProp> templateInfos = _dlMgr.gatherVolumeInfo(root);
|
||||||
return new ListVolumeAnswer(cmd.getSecUrl(), templateInfos);
|
return new ListVolumeAnswer(cmd.getSecUrl(), templateInfos);
|
||||||
|
} else if (store instanceof S3TO ){
|
||||||
|
S3TO s3 = (S3TO)store;
|
||||||
|
Map<Long, TemplateProp> templateInfos = s3ListVolume(s3);
|
||||||
|
return new ListVolumeAnswer(s3.getBucketName(), templateInfos);
|
||||||
|
} else {
|
||||||
|
return new Answer(cmd, false, "Unsupported image data store: " + store);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -417,7 +417,7 @@ public class TemplateServiceImpl implements TemplateService {
|
|||||||
|
|
||||||
|
|
||||||
private Map<String, TemplateProp> listTemplate(DataStore ssStore) {
|
private Map<String, TemplateProp> listTemplate(DataStore ssStore) {
|
||||||
ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO());
|
ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), ssStore.getUri());
|
||||||
EndPoint ep = _epSelector.select(ssStore);
|
EndPoint ep = _epSelector.select(ssStore);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = ep.sendMessage(cmd);
|
||||||
if (answer != null && answer.getResult()) {
|
if (answer != null && answer.getResult()) {
|
||||||
|
|||||||
@ -828,7 +828,7 @@ public class VolumeServiceImpl implements VolumeService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Map<Long, TemplateProp> listVolume(DataStore store) {
|
private Map<Long, TemplateProp> listVolume(DataStore store) {
|
||||||
ListVolumeCommand cmd = new ListVolumeCommand(store.getUri());
|
ListVolumeCommand cmd = new ListVolumeCommand(store.getTO(), store.getUri());
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = ep.sendMessage(cmd);
|
||||||
if (answer != null && answer.getResult()) {
|
if (answer != null && answer.getResult()) {
|
||||||
|
|||||||
@ -2643,7 +2643,10 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// other criteria
|
// other criteria
|
||||||
if (keyword != null) {
|
if (templateId != null){
|
||||||
|
sc.addAnd("id", SearchCriteria.Op.EQ, templateId);
|
||||||
|
}
|
||||||
|
else if (keyword != null) {
|
||||||
sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
|
sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
|
||||||
} else if (name != null) {
|
} else if (name != null) {
|
||||||
sc.addAnd("name", SearchCriteria.Op.EQ, name);
|
sc.addAnd("name", SearchCriteria.Op.EQ, name);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user