Add store_role to template_store_ref, and add search function to find

template_store_ref entry based on DataStoreRole and ZoneId.
This commit is contained in:
Min Chen 2013-05-08 22:06:07 -07:00
parent 545d2e4eb6
commit fa11575212
15 changed files with 191 additions and 124 deletions

View File

@ -18,9 +18,12 @@
*/ */
package org.apache.cloudstack.engine.subsystem.api.storage; package org.apache.cloudstack.engine.subsystem.api.storage;
import com.cloud.storage.DataStoreRole;
public interface TemplateDataFactory { public interface TemplateDataFactory {
TemplateInfo getTemplate(long templateId, DataStore store); TemplateInfo getTemplate(long templateId, DataStore store);
TemplateInfo getTemplate(DataObject obj, DataStore store); TemplateInfo getTemplate(DataObject obj, DataStore store);
TemplateInfo getTemplate(long templateId); TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);
TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId);
} }

View File

@ -23,6 +23,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
import com.cloud.utils.fsm.StateDao; import com.cloud.utils.fsm.StateDao;
@ -50,7 +51,9 @@ public interface TemplateDataStoreDao extends GenericDao<TemplateDataStoreVO, Lo
TemplateDataStoreVO findByStoreTemplate(long storeId, long templateId, boolean lock); TemplateDataStoreVO findByStoreTemplate(long storeId, long templateId, boolean lock);
TemplateDataStoreVO findByTemplate(long templateId); TemplateDataStoreVO findByTemplate(long templateId, DataStoreRole role);
TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, DataStoreRole role);
List<TemplateDataStoreVO> listByTemplate(long templateId); List<TemplateDataStoreVO> listByTemplate(long templateId);
} }

View File

@ -33,6 +33,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericDaoBase;
@ -55,6 +56,10 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Column(name="template_id") @Column(name="template_id")
private long templateId; private long templateId;
@Column(name="store_role")
@Enumerated(EnumType.STRING)
private DataStoreRole dataStoreRole;
@Column(name=GenericDaoBase.CREATED_COLUMN) @Column(name=GenericDaoBase.CREATED_COLUMN)
private Date created = null; private Date created = null;
@ -108,66 +113,8 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
ObjectInDataStoreStateMachine.State state; ObjectInDataStoreStateMachine.State state;
@Override
public String getInstallPath() {
return installPath;
}
@Override
public long getDataStoreId() {
return dataStoreId;
}
public void setDataStoreId(long storeId) {
this.dataStoreId = storeId;
}
public long getTemplateId() {
return templateId;
}
public void setTemplateId(long templateId) {
this.templateId = templateId;
}
public int getDownloadPercent() {
return downloadPercent;
}
public void setDownloadPercent(int downloadPercent) {
this.downloadPercent = downloadPercent;
}
public void setDownloadState(Status downloadState) {
this.downloadState = downloadState;
}
public long getId() {
return id;
}
public Date getCreated() {
return created;
}
public Date getLastUpdated() {
return lastUpdated;
}
public void setLastUpdated(Date date) {
lastUpdated = date;
}
@Override
public void setInstallPath(String installPath) {
this.installPath = installPath;
}
public Status getDownloadState() {
return downloadState;
}
public TemplateDataStoreVO(Long hostId, long templateId) { public TemplateDataStoreVO(Long hostId, long templateId) {
super(); super();
this.dataStoreId = hostId; this.dataStoreId = hostId;
@ -216,6 +163,65 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
} }
@Override
public String getInstallPath() {
return installPath;
}
@Override
public long getDataStoreId() {
return dataStoreId;
}
public void setDataStoreId(long storeId) {
this.dataStoreId = storeId;
}
public long getTemplateId() {
return templateId;
}
public void setTemplateId(long templateId) {
this.templateId = templateId;
}
public int getDownloadPercent() {
return downloadPercent;
}
public void setDownloadPercent(int downloadPercent) {
this.downloadPercent = downloadPercent;
}
public void setDownloadState(Status downloadState) {
this.downloadState = downloadState;
}
public long getId() {
return id;
}
public Date getCreated() {
return created;
}
public Date getLastUpdated() {
return lastUpdated;
}
public void setLastUpdated(Date date) {
lastUpdated = date;
}
@Override
public void setInstallPath(String installPath) {
this.installPath = installPath;
}
public Status getDownloadState() {
return downloadState;
}
public void setLocalDownloadPath(String localPath) { public void setLocalDownloadPath(String localPath) {
this.localDownloadPath = localPath; this.localDownloadPath = localPath;
@ -345,4 +351,15 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
public State getObjectInStoreState() { public State getObjectInStoreState() {
return this.state; return this.state;
} }
public DataStoreRole getDataStoreRole() {
return dataStoreRole;
}
public void setDataStoreRole(DataStoreRole dataStoreRole) {
this.dataStoreRole = dataStoreRole;
}
} }

View File

@ -78,20 +78,31 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
return tmpl; return tmpl;
} }
// NOTE that this method can only be used for get template information stored in secondary storage
//TODO: this method is problematic, since one template can be stored in multiple image stores.
// need to see if we can get rid of this method or change to plural format, or restrict to 1:1 mapping
@Override @Override
public TemplateInfo getTemplate(long templateId) { public TemplateInfo getTemplate(long templateId, DataStoreRole storeRole) {
VMTemplateVO templ = imageDataDao.findById(templateId); VMTemplateVO templ = imageDataDao.findById(templateId);
TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplate(templateId); TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplate(templateId, storeRole);
DataStore store = null; DataStore store = null;
if ( tmplStore != null ){ if ( tmplStore != null ){
store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), DataStoreRole.Image); store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
} }
return this.getTemplate(templateId, store); return this.getTemplate(templateId, store);
} }
@Override
public TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId) {
VMTemplateVO templ = imageDataDao.findById(templateId);
TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplateZone(templateId, zoneId, storeRole);
DataStore store = null;
if ( tmplStore != null ){
store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
}
return this.getTemplate(templateId, store);
}
@Override @Override
public TemplateInfo getTemplate(DataObject obj, DataStore store) { public TemplateInfo getTemplate(DataObject obj, DataStore store) {
return this.getTemplate(obj.getId(), store); return this.getTemplate(obj.getId(), store);

View File

@ -73,6 +73,7 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
@ -189,7 +190,7 @@ public class TemplateServiceImpl implements TemplateService {
for (VMTemplateVO template : toBeDownloaded) { for (VMTemplateVO template : toBeDownloaded) {
TemplateDataStoreVO tmpltHost = _vmTemplateStoreDao.findByStoreTemplate(store.getId(), template.getId()); TemplateDataStoreVO tmpltHost = _vmTemplateStoreDao.findByStoreTemplate(store.getId(), template.getId());
if (tmpltHost == null || tmpltHost.getState() != ObjectInDataStoreStateMachine.State.Ready) { if (tmpltHost == null || tmpltHost.getState() != ObjectInDataStoreStateMachine.State.Ready) {
TemplateInfo tmplt = this._templateFactory.getTemplate(template.getId()); TemplateInfo tmplt = this._templateFactory.getTemplate(template.getId(), DataStoreRole.Image);
this.createTemplateAsync(tmplt, store, null); this.createTemplateAsync(tmplt, store, null);
} }
} }
@ -224,7 +225,7 @@ public class TemplateServiceImpl implements TemplateService {
for (VMTemplateVO template: toBeDownloaded) { for (VMTemplateVO template: toBeDownloaded) {
TemplateDataStoreVO tmpltHost = _vmTemplateStoreDao.findByStoreTemplate(store.getId(), template.getId()); TemplateDataStoreVO tmpltHost = _vmTemplateStoreDao.findByStoreTemplate(store.getId(), template.getId());
if (tmpltHost == null || tmpltHost.getState() != ObjectInDataStoreStateMachine.State.Ready) { if (tmpltHost == null || tmpltHost.getState() != ObjectInDataStoreStateMachine.State.Ready) {
TemplateInfo tmplt = this._templateFactory.getTemplate(template.getId()); TemplateInfo tmplt = this._templateFactory.getTemplate(template.getId(), DataStoreRole.Image);
this.createTemplateAsync(tmplt, store, null); this.createTemplateAsync(tmplt, store, null);
} }
} }
@ -328,6 +329,7 @@ public class TemplateServiceImpl implements TemplateService {
tmpltStore = new TemplateDataStoreVO(storeId, tmplt.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, tmpltInfo.getInstallPath(), tmplt.getUrl()); tmpltStore = new TemplateDataStoreVO(storeId, tmplt.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, tmpltInfo.getInstallPath(), tmplt.getUrl());
tmpltStore.setSize(tmpltInfo.getSize()); tmpltStore.setSize(tmpltInfo.getSize());
tmpltStore.setPhysicalSize(tmpltInfo.getPhysicalSize()); tmpltStore.setPhysicalSize(tmpltInfo.getPhysicalSize());
tmpltStore.setDataStoreRole(store.getRole());
_vmTemplateStoreDao.persist(tmpltStore); _vmTemplateStoreDao.persist(tmpltStore);
this.associateTemplateToZone(tmplt.getId(), zoneId); this.associateTemplateToZone(tmplt.getId(), zoneId);
} }
@ -381,7 +383,7 @@ public class TemplateServiceImpl implements TemplateService {
} }
s_logger.debug("Template " + tmplt.getName() + " needs to be downloaded to " + store.getName()); s_logger.debug("Template " + tmplt.getName() + " needs to be downloaded to " + store.getName());
//TODO: we should pass a callback here //TODO: we should pass a callback here
TemplateInfo tmpl = this._templateFactory.getTemplate(tmplt.getId()); TemplateInfo tmpl = this._templateFactory.getTemplate(tmplt.getId(), DataStoreRole.Image);
this.createTemplateAsync(tmpl, store, null); this.createTemplateAsync(tmpl, store, null);
} }
} }
@ -580,6 +582,7 @@ public class TemplateServiceImpl implements TemplateService {
tmpltStore = new TemplateDataStoreVO(storeId, tmplt.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, TemplateConstants.DEFAULT_SYSTEM_VM_TEMPLATE_PATH + tmplt.getId() + File.separator, tmplt.getUrl()); tmpltStore = new TemplateDataStoreVO(storeId, tmplt.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, TemplateConstants.DEFAULT_SYSTEM_VM_TEMPLATE_PATH + tmplt.getId() + File.separator, tmplt.getUrl());
tmpltStore.setSize(0); tmpltStore.setSize(0);
tmpltStore.setPhysicalSize(0); // no size information for pre-seeded system vm templates tmpltStore.setPhysicalSize(0); // no size information for pre-seeded system vm templates
tmpltStore.setDataStoreRole(store.getRole());
_vmTemplateStoreDao.persist(tmpltStore); _vmTemplateStoreDao.persist(tmpltStore);
} }
} }

View File

@ -137,7 +137,7 @@ public class S3TemplateTest extends CloudStackTestNGBase {
@Test(priority = 1) @Test(priority = 1)
public void registerTemplate() { public void registerTemplate() {
TemplateInfo template = templateFactory.getTemplate(templateId); TemplateInfo template = templateFactory.getTemplate(templateId, DataStoreRole.Image);
DataStore store = dataStoreMgr.getImageStore(dcId); DataStore store = dataStoreMgr.getImageStore(dcId);
AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>(); AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
templateSvr.createTemplateAsync(template, store, future); templateSvr.createTemplateAsync(template, store, future);
@ -157,7 +157,7 @@ public class S3TemplateTest extends CloudStackTestNGBase {
@Test(priority = 2) @Test(priority = 2)
public void copyTemplateToCache() { public void copyTemplateToCache() {
TemplateInfo template = templateFactory.getTemplate(templateId); TemplateInfo template = templateFactory.getTemplate(templateId, DataStoreRole.Image);
DataObject cacheObj = this.cacheMgr.createCacheObject(template, new ZoneScope(dcId)); DataObject cacheObj = this.cacheMgr.createCacheObject(template, new ZoneScope(dcId));
assertNotNull(cacheObj, "failed to create cache object"); assertNotNull(cacheObj, "failed to create cache object");
} }

View File

@ -240,7 +240,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
DataStore store = this.dataStoreMgr.getDataStore(imageStore.getId(), DataStoreRole.Image); DataStore store = this.dataStoreMgr.getDataStore(imageStore.getId(), DataStoreRole.Image);
TemplateInfo template = templateFactory.getTemplate(image.getId()); TemplateInfo template = templateFactory.getTemplate(image.getId(), DataStoreRole.Image);
DataObject templateOnStore = store.create(template); DataObject templateOnStore = store.create(template);
TemplateObjectTO to = new TemplateObjectTO(); TemplateObjectTO to = new TemplateObjectTO();
to.setPath(this.getImageInstallPath()); to.setPath(this.getImageInstallPath());
@ -336,7 +336,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
primaryStore = this.dataStoreMgr.getPrimaryDataStore(primaryStoreId); primaryStore = this.dataStoreMgr.getPrimaryDataStore(primaryStoreId);
VolumeVO volume = createVolume(image.getId(), primaryStore.getId()); VolumeVO volume = createVolume(image.getId(), primaryStore.getId());
VolumeInfo volInfo = this.volFactory.getVolume(volume.getId()); VolumeInfo volInfo = this.volFactory.getVolume(volume.getId());
AsyncCallFuture<VolumeApiResult> future = this.volumeService.createVolumeFromTemplateAsync(volInfo, this.primaryStoreId, this.templateFactory.getTemplate(this.image.getId())); AsyncCallFuture<VolumeApiResult> future = this.volumeService.createVolumeFromTemplateAsync(volInfo, this.primaryStoreId, this.templateFactory.getTemplate(this.image.getId(), DataStoreRole.Image));
VolumeApiResult result; VolumeApiResult result;
try { try {
@ -404,7 +404,7 @@ public class SnapshotTest extends CloudStackTestNGBase {
ep.setResource(new MockLocalNfsSecondaryStorageResource()); ep.setResource(new MockLocalNfsSecondaryStorageResource());
Mockito.when(epSelector.select(Mockito.any(DataObject.class), Mockito.any(DataObject.class))).thenReturn(ep); Mockito.when(epSelector.select(Mockito.any(DataObject.class), Mockito.any(DataObject.class))).thenReturn(ep);
VMTemplateVO templateVO = createTemplateInDb(); VMTemplateVO templateVO = createTemplateInDb();
TemplateInfo tmpl = this.templateFactory.getTemplate(templateVO.getId()); TemplateInfo tmpl = this.templateFactory.getTemplate(templateVO.getId(), DataStoreRole.Image);
DataStore imageStore = this.dataStoreMgr.getImageStore(this.dcId); DataStore imageStore = this.dataStoreMgr.getImageStore(this.dcId);
this.imageService.createTemplateFromSnapshotAsync(snapshot, tmpl, imageStore); this.imageService.createTemplateFromSnapshotAsync(snapshot, tmpl, imageStore);
} }

View File

@ -117,7 +117,7 @@ public class TemplateTest extends CloudStackTestNGBase {
@Test @Test
public void registerTemplate() { public void registerTemplate() {
TemplateInfo template = templateFactory.getTemplate(templateId); TemplateInfo template = templateFactory.getTemplate(templateId, DataStoreRole.Image);
DataStore store = dataStoreMgr.getImageStore(dcId); DataStore store = dataStoreMgr.getImageStore(dcId);
AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>(); AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
templateSvr.createTemplateAsync(template, store, future); templateSvr.createTemplateAsync(template, store, future);
@ -137,7 +137,7 @@ public class TemplateTest extends CloudStackTestNGBase {
// @Test // @Test
public void deleteTemplate() { public void deleteTemplate() {
TemplateInfo template = templateFactory.getTemplate(templateId); TemplateInfo template = templateFactory.getTemplate(templateId, DataStoreRole.Image);
DataStore store = dataStoreMgr.getImageStore(dcId); DataStore store = dataStoreMgr.getImageStore(dcId);
AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>(); AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
templateSvr.deleteTemplateAsync(template); templateSvr.deleteTemplateAsync(template);

View File

@ -232,7 +232,7 @@ public class VolumeTest extends CloudStackTestNGBase {
DataStore store = this.dataStoreMgr.getDataStore(imageStore.getId(), DataStoreRole.Image); DataStore store = this.dataStoreMgr.getDataStore(imageStore.getId(), DataStoreRole.Image);
TemplateInfo template = templateFactory.getTemplate(image.getId()); TemplateInfo template = templateFactory.getTemplate(image.getId(), DataStoreRole.Image);
DataObject templateOnStore = store.create(template); DataObject templateOnStore = store.create(template);
TemplateObjectTO to = new TemplateObjectTO(); TemplateObjectTO to = new TemplateObjectTO();
to.setPath(this.getImageInstallPath()); to.setPath(this.getImageInstallPath());
@ -320,7 +320,7 @@ public class VolumeTest extends CloudStackTestNGBase {
primaryStore = this.dataStoreMgr.getPrimaryDataStore(primaryStoreId); primaryStore = this.dataStoreMgr.getPrimaryDataStore(primaryStoreId);
VolumeVO volume = createVolume(image.getId(), primaryStore.getId()); VolumeVO volume = createVolume(image.getId(), primaryStore.getId());
VolumeInfo volInfo = this.volFactory.getVolume(volume.getId()); VolumeInfo volInfo = this.volFactory.getVolume(volume.getId());
AsyncCallFuture<VolumeApiResult> future = this.volumeService.createVolumeFromTemplateAsync(volInfo, this.primaryStoreId, this.templateFactory.getTemplate(this.image.getId())); AsyncCallFuture<VolumeApiResult> future = this.volumeService.createVolumeFromTemplateAsync(volInfo, this.primaryStoreId, this.templateFactory.getTemplate(this.image.getId(), DataStoreRole.Image));
try { try {
VolumeApiResult result = future.get(); VolumeApiResult result = future.get();
@ -416,7 +416,7 @@ public class VolumeTest extends CloudStackTestNGBase {
AssertJUnit.assertTrue(result.isSuccess()); AssertJUnit.assertTrue(result.isSuccess());
volInfo = result.getVolume(); volInfo = result.getVolume();
VMTemplateVO templateVO = createTemplateInDb(); VMTemplateVO templateVO = createTemplateInDb();
TemplateInfo tmpl = this.templateFactory.getTemplate(templateVO.getId()); TemplateInfo tmpl = this.templateFactory.getTemplate(templateVO.getId(), DataStoreRole.Image);
DataStore imageStore = this.dataStoreMgr.getImageStore(this.dcId); DataStore imageStore = this.dataStoreMgr.getImageStore(this.dcId);
this.imageService.createTemplateFromVolumeAsync(volInfo, tmpl, imageStore); this.imageService.createTemplateFromVolumeAsync(volInfo, tmpl, imageStore);

View File

@ -303,7 +303,7 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
DataObjectInStore vo = null; DataObjectInStore vo = null;
switch (type){ switch (type){
case TEMPLATE: case TEMPLATE:
vo = templateDataStoreDao.findByTemplate(objId); vo = templateDataStoreDao.findByTemplate(objId, role);
break; break;
case SNAPSHOT: case SNAPSHOT:
vo = snapshotDataStoreDao.findBySnapshot(objId, role); vo = snapshotDataStoreDao.findBySnapshot(objId, role);
@ -313,7 +313,7 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
break; break;
} }
if (vo != null) { if (vo != null) {
store = this.storeMgr.getDataStore(vo.getDataStoreId(), DataStoreRole.Image); store = this.storeMgr.getDataStore(vo.getDataStoreId(), role);
} }
} }
return store; return store;

View File

@ -35,6 +35,7 @@ import org.apache.log4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchBuilder;
@ -51,6 +52,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
private SearchBuilder<TemplateDataStoreVO> updateStateSearch; private SearchBuilder<TemplateDataStoreVO> updateStateSearch;
private SearchBuilder<TemplateDataStoreVO> storeSearch; private SearchBuilder<TemplateDataStoreVO> storeSearch;
private SearchBuilder<TemplateDataStoreVO> templateSearch; private SearchBuilder<TemplateDataStoreVO> templateSearch;
private SearchBuilder<TemplateDataStoreVO> templateRoleSearch;
private SearchBuilder<TemplateDataStoreVO> storeTemplateSearch; private SearchBuilder<TemplateDataStoreVO> storeTemplateSearch;
private SearchBuilder<TemplateDataStoreVO> storeTemplateStateSearch; private SearchBuilder<TemplateDataStoreVO> storeTemplateStateSearch;
private SearchBuilder<TemplateDataStoreVO> storeTemplateDownloadStatusSearch; private SearchBuilder<TemplateDataStoreVO> storeTemplateDownloadStatusSearch;
@ -73,6 +75,12 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
templateSearch.and("destroyed", templateSearch.entity().getDestroyed(), SearchCriteria.Op.EQ); templateSearch.and("destroyed", templateSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
templateSearch.done(); templateSearch.done();
templateRoleSearch = createSearchBuilder();
templateRoleSearch.and("template_id", templateRoleSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
templateRoleSearch.and("store_role", templateRoleSearch.entity().getDataStoreRole(), SearchCriteria.Op.EQ);
templateRoleSearch.and("destroyed", templateRoleSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
templateRoleSearch.done();
updateStateSearch = this.createSearchBuilder(); updateStateSearch = this.createSearchBuilder();
updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ);
@ -263,10 +271,12 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
return lockOneRandomRow(sc, true); return lockOneRandomRow(sc, true);
} }
@Override @Override
public TemplateDataStoreVO findByTemplate(long templateId) { public TemplateDataStoreVO findByTemplate(long templateId, DataStoreRole role) {
SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create(); SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
sc.setParameters("template_id", templateId); sc.setParameters("template_id", templateId);
sc.setParameters("store_role", role);
sc.setParameters("destroyed", false); sc.setParameters("destroyed", false);
return findOneIncludingRemovedBy(sc); return findOneIncludingRemovedBy(sc);
} }
@ -279,6 +289,24 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
return search(sc, null); return search(sc, null);
} }
@Override
public TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, DataStoreRole role) {
// get all elgible image stores
List<DataStore> imgStores = null;
if ( role == DataStoreRole.Image){
imgStores = this._storeMgr.getImageStoresByScope(new ZoneScope(zoneId));
} else if (role == DataStoreRole.ImageCache){
imgStores = this._storeMgr.getImageCacheStores(new ZoneScope(zoneId));
}
if ( imgStores != null ){
for (DataStore store : imgStores){
List<TemplateDataStoreVO> sRes = this.listByTemplateStore(templateId, store.getId());
if ( sRes != null && sRes.size() > 0){
return sRes.get(0);
}
}
}
return null;
}
} }

View File

@ -671,7 +671,7 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
if (isNotCreatedFromTemplate) { if (isNotCreatedFromTemplate) {
future = this.volService.createVolumeAsync(volume, store); future = this.volService.createVolumeAsync(volume, store);
} else { } else {
TemplateInfo templ = this.tmplFactory.getTemplate(template.getId()); TemplateInfo templ = this.tmplFactory.getTemplate(template.getId(), DataStoreRole.Image);
future = this.volService.createVolumeFromTemplateAsync(volume, store.getId(), templ); future = this.volService.createVolumeFromTemplateAsync(volume, store.getId(), templ);
} }
try { try {
@ -2266,7 +2266,7 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
if (templateId == null) { if (templateId == null) {
future = this.volService.createVolumeAsync(volume, destPool); future = this.volService.createVolumeAsync(volume, destPool);
} else { } else {
TemplateInfo templ = this.tmplFactory.getTemplate(templateId); TemplateInfo templ = this.tmplFactory.getTemplate(templateId, DataStoreRole.Image);
future = this.volService.createVolumeFromTemplateAsync(volume, destPool.getId(), templ); future = this.volService.createVolumeFromTemplateAsync(volume, destPool.getId(), templ);
} }
VolumeApiResult result = null; VolumeApiResult result = null;

View File

@ -174,6 +174,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
if (vmTemplateStore == null) { if (vmTemplateStore == null) {
vmTemplateStore = new TemplateDataStoreVO(store.getId(), template.getId(), new Date(), 0, vmTemplateStore = new TemplateDataStoreVO(store.getId(), template.getId(), new Date(), 0,
VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED, null, null, "jobid0000", null, template.getUri()); VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED, null, null, "jobid0000", null, template.getUri());
vmTemplateStore.setDataStoreRole(store.getRole());
_vmTemplateStoreDao.persist(vmTemplateStore); _vmTemplateStoreDao.persist(vmTemplateStore);
} else if ((vmTemplateStore.getJobId() != null) && (vmTemplateStore.getJobId().length() > 2)) { } else if ((vmTemplateStore.getJobId() != null) && (vmTemplateStore.getJobId().length() > 2)) {
downloadJobExists = true; downloadJobExists = true;

View File

@ -1348,7 +1348,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
VolumeVO volume = null; VolumeVO volume = null;
try { try {
TemplateInfo tmplInfo = this._tmplFactory.getTemplate(templateId); TemplateInfo tmplInfo = this._tmplFactory.getTemplate(templateId, DataStoreRole.Image);
Long zoneId = null; Long zoneId = null;
if (snapshotId != null) { if (snapshotId != null) {
snapshot = _snapshotDao.findById(snapshotId); snapshot = _snapshotDao.findById(snapshotId);

View File

@ -128,6 +128,7 @@ CREATE TABLE `cloud`.`template_store_ref` (
`job_id` varchar(255), `job_id` varchar(255),
`download_pct` int(10) unsigned, `download_pct` int(10) unsigned,
`size` bigint unsigned, `size` bigint unsigned,
`store_role` varchar(255),
`physical_size` bigint unsigned DEFAULT 0, `physical_size` bigint unsigned DEFAULT 0,
`download_state` varchar(255), `download_state` varchar(255),
`error_str` varchar(255), `error_str` varchar(255),