Make copyFromS3ToNFS flow work.

This commit is contained in:
Min Chen 2013-05-08 17:39:46 -07:00
parent 3b45bc9c30
commit dc5d2f45e9
11 changed files with 97 additions and 52 deletions

View File

@ -231,9 +231,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
} }
} }
protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataTO destData, NfsTO destImageStore) {
DataTO destData, NfsTO destImageStore) {
final String storagePath = destImageStore.getUrl(); final String storagePath = destImageStore.getUrl();
final String destPath = destData.getPath(); final String destPath = destData.getPath();
@ -288,8 +286,8 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return new CopyCmdAnswer(errMsg); return new CopyCmdAnswer(errMsg);
} }
} }
protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) { protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) {
String srcMountPoint = this.getRootDir(srcDataStore.getUrl()); String srcMountPoint = this.getRootDir(srcDataStore.getUrl());
String snapshotPath = srcData.getPath(); String snapshotPath = srcData.getPath();
@ -330,7 +328,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
loc.save(); loc.save();
TemplateObjectTO newTemplate = new TemplateObjectTO(); TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(destData.getPath() + File.separator + templateName); newTemplate.setPath(destData.getPath() + File.separator + templateName);
newTemplate.setFormat(ImageFormat.VHD); newTemplate.setFormat(ImageFormat.VHD);
return new CopyCmdAnswer(newTemplate); return new CopyCmdAnswer(newTemplate);
} catch (ConfigurationException e) { } catch (ConfigurationException e) {
@ -346,16 +344,16 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return new CopyCmdAnswer(errMsg); return new CopyCmdAnswer(errMsg);
} }
protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) { protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) {
if (srcData.getHypervisorType() == HypervisorType.XenServer) { if (srcData.getHypervisorType() == HypervisorType.XenServer) {
return copySnapshotToTemplateFromNfsToNfsXenserver(cmd, srcData, srcDataStore, destData, destDataStore); return copySnapshotToTemplateFromNfsToNfsXenserver(cmd, srcData, srcDataStore, destData, destDataStore);
} }
return new CopyCmdAnswer(""); return new CopyCmdAnswer("");
} }
protected Answer createTemplateFromSnapshot(CopyCommand cmd) { protected Answer createTemplateFromSnapshot(CopyCommand cmd) {
DataTO srcData = cmd.getSrcTO(); DataTO srcData = cmd.getSrcTO();
DataTO destData = cmd.getDestTO(); DataTO destData = cmd.getDestTO();
@ -366,7 +364,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
s_logger.debug("only support nfs storage as src, when create template from snapshot"); s_logger.debug("only support nfs storage as src, when create template from snapshot");
return Answer.createUnsupportedCommandAnswer(cmd); return Answer.createUnsupportedCommandAnswer(cmd);
} }
if (destDataStore instanceof NfsTO){ if (destDataStore instanceof NfsTO){
return copySnapshotToTemplateFromNfsToNfs(cmd, (SnapshotObjectTO)srcData, (NfsTO)srcDataStore, (TemplateObjectTO)destData, (NfsTO)destDataStore); return copySnapshotToTemplateFromNfsToNfs(cmd, (SnapshotObjectTO)srcData, (NfsTO)srcDataStore, (TemplateObjectTO)destData, (NfsTO)destDataStore);
} }
@ -380,12 +378,18 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
DataTO destData = cmd.getDestTO(); DataTO destData = cmd.getDestTO();
DataStoreTO srcDataStore = srcData.getDataStore(); DataStoreTO srcDataStore = srcData.getDataStore();
DataStoreTO destDataStore = destData.getDataStore(); DataStoreTO destDataStore = destData.getDataStore();
if (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.TEMPLATE) { if (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.TEMPLATE) {
return createTemplateFromSnapshot(cmd); return createTemplateFromSnapshot(cmd);
} }
if (srcDataStore instanceof S3TO && destDataStore instanceof NfsTO && destDataStore.getRole() == DataStoreRole.ImageCache){
S3TO s3 = (S3TO)srcDataStore;
NfsTO destImageStore = (NfsTO)destDataStore;
return this.copyFromS3ToNfs(cmd, srcData, s3, destData, destImageStore);
}
return Answer.createUnsupportedCommandAnswer(cmd); return Answer.createUnsupportedCommandAnswer(cmd);
} }
@ -1729,7 +1733,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
if (_configIpFirewallScr != null) { if (_configIpFirewallScr != null) {
s_logger.info("_configIpFirewallScr found in " + _configIpFirewallScr); s_logger.info("_configIpFirewallScr found in " + _configIpFirewallScr);
} }
createTemplateFromSnapshotXenScript = Script.findScript(getDefaultScriptsDir(), "create_privatetemplate_from_snapshot_xen.sh"); createTemplateFromSnapshotXenScript = Script.findScript(getDefaultScriptsDir(), "create_privatetemplate_from_snapshot_xen.sh");
if (createTemplateFromSnapshotXenScript == null) { if (createTemplateFromSnapshotXenScript == null) {
throw new ConfigurationException("create_privatetemplate_from_snapshot_xen.sh not found in " + getDefaultScriptsDir()); throw new ConfigurationException("create_privatetemplate_from_snapshot_xen.sh not found in " + getDefaultScriptsDir());

View File

@ -30,5 +30,6 @@ public interface ImageStoreDao extends GenericDao<ImageStoreVO, Long> {
public ImageStoreVO findByName(String name); public ImageStoreVO findByName(String name);
public List<ImageStoreVO> findByProvider(String provider); public List<ImageStoreVO> findByProvider(String provider);
public List<ImageStoreVO> findByScope(ZoneScope scope); public List<ImageStoreVO> findByScope(ZoneScope scope);
public List<ImageStoreVO> findImageCacheByScope(ZoneScope scope);
} }

View File

@ -70,13 +70,13 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
@Override @Override
public void setName(String name) { public void setName(String name) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public void setConfigParams(Map<String, Object> params) { public void setConfigParams(Map<String, Object> params) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
@ -94,7 +94,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
@Override @Override
public void setRunLevel(int level) { public void setRunLevel(int level) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
@ -113,9 +113,9 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return true; return true;
} }
private class CreateCacheObjectContext<T> extends AsyncRpcConext<T> { private class CreateCacheObjectContext<T> extends AsyncRpcConext<T> {
final AsyncCallFuture<CopyCommandResult> future; final AsyncCallFuture<CopyCommandResult> future;
/** /**
@ -125,29 +125,34 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
super(callback); super(callback);
this.future = future; this.future = future;
} }
} }
@Override @Override
public DataObject createCacheObject(DataObject data, Scope scope) { public DataObject createCacheObject(DataObject data, Scope scope) {
DataStore cacheStore = this.getCacheStorage(scope); DataStore cacheStore = this.getCacheStorage(scope);
DataObject objOnCacheStore = cacheStore.create(data); DataObject objOnCacheStore = cacheStore.create(data);
AsyncCallFuture<CopyCommandResult> future = new AsyncCallFuture<CopyCommandResult>(); AsyncCallFuture<CopyCommandResult> future = new AsyncCallFuture<CopyCommandResult>();
/*
CreateCacheObjectContext<CopyCommandResult> context = new CreateCacheObjectContext<CopyCommandResult>(null, future); CreateCacheObjectContext<CopyCommandResult> context = new CreateCacheObjectContext<CopyCommandResult>(null, future);
AsyncCallbackDispatcher<StorageCacheManagerImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this); AsyncCallbackDispatcher<StorageCacheManagerImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
caller.setContext(context); caller.setContext(context);
caller.setCallback(future);
*/
CopyCommandResult result = null; CopyCommandResult result = null;
try { try {
objOnCacheStore.processEvent(Event.CreateOnlyRequested); objOnCacheStore.processEvent(Event.CreateOnlyRequested);
dataMotionSvr.copyAsync(data, objOnCacheStore, caller); dataMotionSvr.copyAsync(data, objOnCacheStore, future);
result = future.get(); result = future.get();
if (result.isFailed()) { if (result.isFailed()) {
cacheStore.delete(data); cacheStore.delete(data);
} else { } else {
objOnCacheStore.processEvent(Event.OperationSuccessed, result.getAnswer()); objOnCacheStore.processEvent(Event.OperationSuccessed, result.getAnswer());
return objOnCacheStore;
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
s_logger.debug("create cache storage failed: " + e.toString()); s_logger.debug("create cache storage failed: " + e.toString());
@ -160,19 +165,19 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
cacheStore.delete(data); cacheStore.delete(data);
} }
} }
return null; return null;
} }
@Override @Override
public DataObject getCacheObject(DataObject data, Scope scope) { public DataObject getCacheObject(DataObject data, Scope scope) {
DataStore cacheStore = this.getCacheStorage(scope); DataStore cacheStore = this.getCacheStorage(scope);
DataObject objOnCacheStore = cacheStore.create(data); DataObject objOnCacheStore = cacheStore.create(data);
return objOnCacheStore; return objOnCacheStore;
} }
protected Void createCacheObjectCallBack(AsyncCallbackDispatcher<StorageCacheManagerImpl, CopyCommandResult> callback, protected Void createCacheObjectCallBack(AsyncCallbackDispatcher<StorageCacheManagerImpl, CopyCommandResult> callback,
CreateCacheObjectContext<CopyCommandResult> context) { CreateCacheObjectContext<CopyCommandResult> context) {
AsyncCallFuture<CopyCommandResult> future = context.future; AsyncCallFuture<CopyCommandResult> future = context.future;
future.complete(callback.getResult()); future.complete(callback.getResult());

View File

@ -124,17 +124,13 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager
@Override @Override
public List<DataStore> listImageCacheStores(Scope scope) { public List<DataStore> listImageCacheStores(Scope scope) {
List<DataStore> imageStores = new ArrayList<DataStore>();
if (scope.getScopeType() != ScopeType.ZONE) { if (scope.getScopeType() != ScopeType.ZONE) {
s_logger.debug("only support zone wide image cache stores"); s_logger.debug("only support zone wide image cache stores");
return imageStores; return null;
} }
SearchCriteriaService<ImageStoreVO, ImageStoreVO> sc = SearchCriteria2.create(ImageStoreVO.class); List<ImageStoreVO> stores = dataStoreDao.findImageCacheByScope(new ZoneScope(scope.getScopeId()));
sc.addAnd(sc.getEntity().getScope(), Op.EQ, ScopeType.ZONE); List<DataStore> imageStores = new ArrayList<DataStore>();
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, scope.getScopeId()); for (ImageStoreVO store : stores) {
sc.addAnd(sc.getEntity().getRole(), Op.EQ, DataStoreRole.ImageCache);
List<ImageStoreVO> cacheStores = sc.list();
for (ImageStoreVO store : cacheStores) {
imageStores.add(getImageStore(store.getId())); imageStores.add(getImageStore(store.getId()));
} }
return imageStores; return imageStores;

View File

@ -85,8 +85,7 @@ public class ImageStoreImpl implements ImageStoreEntity {
@Override @Override
public DataStoreRole getRole() { public DataStoreRole getRole() {
// TODO Auto-generated method stub return this.imageDataStoreVO.getRole();
return DataStoreRole.Image;
} }
@Override @Override
public long getId() { public long getId() {

View File

@ -186,7 +186,7 @@ public class TemplateObject implements TemplateInfo {
templEvent = TemplateEvent.OperationFailed; templEvent = TemplateEvent.OperationFailed;
} }
if (templEvent != null) { if (templEvent != null && this.getDataStore().getRole() == DataStoreRole.Image) {
this.stateTransit(templEvent); this.stateTransit(templEvent);
} }
} }
@ -223,9 +223,11 @@ public class TemplateObject implements TemplateInfo {
templateStoreRef.setDownloadPercent(100); templateStoreRef.setDownloadPercent(100);
templateStoreRef.setDownloadState(Status.DOWNLOADED); templateStoreRef.setDownloadState(Status.DOWNLOADED);
templateStoreDao.update(templateStoreRef.getId(), templateStoreRef); templateStoreDao.update(templateStoreRef.getId(), templateStoreRef);
VMTemplateVO templateVO = this.imageDao.findById(this.getId()); if (this.getDataStore().getRole() == DataStoreRole.Image) {
templateVO.setFormat(newTemplate.getFormat()); VMTemplateVO templateVO = this.imageDao.findById(this.getId());
this.imageDao.update(templateVO.getId(), templateVO); templateVO.setFormat(newTemplate.getFormat());
this.imageDao.update(templateVO.getId(), templateVO);
}
} }
TemplateEvent templEvent = null; TemplateEvent templEvent = null;
@ -239,7 +241,7 @@ public class TemplateObject implements TemplateInfo {
templEvent = TemplateEvent.OperationFailed; templEvent = TemplateEvent.OperationFailed;
} }
if (templEvent != null) { if (templEvent != null && this.getDataStore().getRole() == DataStoreRole.Image) {
this.stateTransit(templEvent); this.stateTransit(templEvent);
} }
} }

View File

@ -65,6 +65,11 @@ public class MockLocalNfsSecondaryStorageResource extends
} }
@Override
public String getRootDir(String secUrl){
return "/mnt";
}
@Override @Override
public Answer executeRequest(Command cmd) { public Answer executeRequest(Command cmd) {
if (cmd instanceof DownloadSystemTemplateCommand){ if (cmd instanceof DownloadSystemTemplateCommand){

View File

@ -1,6 +1,5 @@
package org.apache.cloudstack.storage.test; package org.apache.cloudstack.storage.test;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -12,11 +11,14 @@ import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.framework.async.AsyncCallFuture; import org.apache.cloudstack.framework.async.AsyncCallFuture;
import org.apache.cloudstack.storage.LocalHostEndpoint; import org.apache.cloudstack.storage.LocalHostEndpoint;
import org.apache.cloudstack.storage.MockLocalNfsSecondaryStorageResource; import org.apache.cloudstack.storage.MockLocalNfsSecondaryStorageResource;
@ -28,15 +30,14 @@ import org.mockito.Mockito;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;
import static org.testng.Assert.assertNotNull;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
import com.cloud.storage.ScopeType; import com.cloud.storage.ScopeType;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.download.DownloadMonitorImpl; import com.cloud.storage.download.DownloadMonitorImpl;
@ -65,6 +66,8 @@ public class S3TemplateTest extends CloudStackTestNGBase {
DownloadMonitorImpl downloadMonitor; DownloadMonitorImpl downloadMonitor;
@Inject @Inject
ImageStoreHelper imageStoreHelper; ImageStoreHelper imageStoreHelper;
@Inject
StorageCacheManager cacheMgr;
long dcId; long dcId;
long templateId; long templateId;
@ -77,7 +80,6 @@ public class S3TemplateTest extends CloudStackTestNGBase {
dc = dcDao.persist(dc); dc = dcDao.persist(dc);
dcId = dc.getId(); dcId = dc.getId();
// add s3 image store // add s3 image store
Map<String, Object> sParams = new HashMap<String, Object>(); Map<String, Object> sParams = new HashMap<String, Object>();
sParams.put("name", "test"); sParams.put("name", "test");
@ -92,6 +94,17 @@ public class S3TemplateTest extends CloudStackTestNGBase {
sDetails.put(ApiConstants.S3_END_POINT, this.getS3EndPoint()); sDetails.put(ApiConstants.S3_END_POINT, this.getS3EndPoint());
this.imageStoreHelper.createImageStore(sParams, sDetails); this.imageStoreHelper.createImageStore(sParams, sDetails);
// add nfs cache storage
Map<String, Object> cParams = new HashMap<String, Object>();
cParams.put("name", "testCache");
cParams.put("protocol", "nfs");
cParams.put("providerName", DataStoreProvider.NFS_IMAGE);
cParams.put("scope", ScopeType.ZONE);
cParams.put("role", DataStoreRole.ImageCache);
cParams.put("url", this.getSecondaryStorage());
cParams.put("zoneId", dcId);
this.imageStoreHelper.createImageStore(cParams);
VMTemplateVO image = new VMTemplateVO(); VMTemplateVO image = new VMTemplateVO();
image.setTemplateType(TemplateType.SYSTEM); image.setTemplateType(TemplateType.SYSTEM);
@ -119,9 +132,10 @@ public class S3TemplateTest extends CloudStackTestNGBase {
ep.setResource(new MockLocalNfsSecondaryStorageResource()); ep.setResource(new MockLocalNfsSecondaryStorageResource());
Mockito.when(epSelector.select(Mockito.any(DataObject.class))).thenReturn(ep); Mockito.when(epSelector.select(Mockito.any(DataObject.class))).thenReturn(ep);
Mockito.when(epSelector.select(Mockito.any(DataStore.class))).thenReturn(ep); Mockito.when(epSelector.select(Mockito.any(DataStore.class))).thenReturn(ep);
Mockito.when(epSelector.select(Mockito.any(DataObject.class), Mockito.any(DataObject.class))).thenReturn(ep);
} }
@Test @Test(priority = 1)
public void registerTemplate() { public void registerTemplate() {
TemplateInfo template = templateFactory.getTemplate(templateId); TemplateInfo template = templateFactory.getTemplate(templateId);
DataStore store = dataStoreMgr.getImageStore(dcId); DataStore store = dataStoreMgr.getImageStore(dcId);
@ -141,4 +155,11 @@ public class S3TemplateTest extends CloudStackTestNGBase {
} }
} }
@Test(priority = 2)
public void copyTemplateToCache() {
TemplateInfo template = templateFactory.getTemplate(templateId);
DataObject cacheObj = this.cacheMgr.createCacheObject(template, new ZoneScope(dcId));
assertNotNull(cacheObj, "failed to create cache object");
}
} }

View File

@ -48,18 +48,22 @@ public class ImageStoreHelper {
return store; return store;
} }
store = new ImageStoreVO(); store = new ImageStoreVO();
store.setName((String)params.get("name"));
store.setProtocol((String)params.get("protocol")); store.setProtocol((String)params.get("protocol"));
store.setProviderName((String)params.get("providerName")); store.setProviderName((String)params.get("providerName"));
store.setScope((ScopeType)params.get("scope")); store.setScope((ScopeType)params.get("scope"));
store.setDataCenterId((Long)params.get("zoneId"));
String uuid = (String)params.get("uuid"); String uuid = (String)params.get("uuid");
if (uuid != null) { if (uuid != null) {
store.setUuid(uuid); store.setUuid(uuid);
} else { } else {
store.setUuid(UUID.randomUUID().toString()); store.setUuid(UUID.randomUUID().toString());
} }
store.setName((String)params.get("name"));
if ( store.getName() == null ){
store.setName(store.getUuid());
}
store.setUrl((String)params.get("url")); store.setUrl((String)params.get("url"));
store.setRole(DataStoreRole.getRole((String)params.get("role"))); store.setRole((DataStoreRole)params.get("role"));
store = imageStoreDao.persist(store); store = imageStoreDao.persist(store);
return store; return store;
} }

View File

@ -87,5 +87,13 @@ public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implem
return listBy(sc); return listBy(sc);
} }
@Override
public List<ImageStoreVO> findImageCacheByScope(ZoneScope scope) {
SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.ImageCache);
sc.addAnd("scope", SearchCriteria.Op.EQ, ScopeType.ZONE);
sc.addAnd("dcId", SearchCriteria.Op.EQ, scope.getScopeId());
return listBy(sc);
}
} }

View File

@ -126,7 +126,7 @@ public class CloudStackImageStoreDriverImpl implements ImageStoreDriver {
public DataStoreTO getStoreTO(DataStore store) { public DataStoreTO getStoreTO(DataStore store) {
ImageStoreImpl nfsStore = (ImageStoreImpl)store; ImageStoreImpl nfsStore = (ImageStoreImpl)store;
NfsTO nfsTO = new NfsTO(); NfsTO nfsTO = new NfsTO();
nfsTO.setRole(DataStoreRole.Image); nfsTO.setRole(store.getRole());
nfsTO.setUrl(nfsStore.getUri()); nfsTO.setUrl(nfsStore.getUri());
return nfsTO; return nfsTO;
} }