mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
545d2e4eb6
commit
fa11575212
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user