Exclude removed template from template sync.

This commit is contained in:
Min Chen 2013-05-23 16:43:14 -07:00
parent 57049d5aef
commit d1704a389a
6 changed files with 99 additions and 83 deletions

View File

@ -50,6 +50,7 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long>, StateDao<
public long addTemplateToZone(VMTemplateVO tmplt, long zoneId); public long addTemplateToZone(VMTemplateVO tmplt, long zoneId);
public List<VMTemplateVO> listAllInZone(long dataCenterId); public List<VMTemplateVO> listAllInZone(long dataCenterId);
public List<VMTemplateVO> listAllActive();
public List<VMTemplateVO> listByHypervisorType(List<HypervisorType> hyperTypes); public List<VMTemplateVO> listByHypervisorType(List<HypervisorType> hyperTypes);
public List<VMTemplateVO> publicIsoSearch(Boolean bootable, boolean listRemoved, Map<String, String> tags); public List<VMTemplateVO> publicIsoSearch(Boolean bootable, boolean listRemoved, Map<String, String> tags);

View File

@ -110,6 +110,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
protected SearchBuilder<VMTemplateVO> AccountIdSearch; protected SearchBuilder<VMTemplateVO> AccountIdSearch;
protected SearchBuilder<VMTemplateVO> NameSearch; protected SearchBuilder<VMTemplateVO> NameSearch;
protected SearchBuilder<VMTemplateVO> TmpltsInZoneSearch; protected SearchBuilder<VMTemplateVO> TmpltsInZoneSearch;
protected SearchBuilder<VMTemplateVO> ActiveTmpltSearch;
private SearchBuilder<VMTemplateVO> PublicSearch; private SearchBuilder<VMTemplateVO> PublicSearch;
private SearchBuilder<VMTemplateVO> NameAccountIdSearch; private SearchBuilder<VMTemplateVO> NameAccountIdSearch;
private SearchBuilder<VMTemplateVO> PublicIsoSearch; private SearchBuilder<VMTemplateVO> PublicIsoSearch;
@ -368,6 +369,10 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
tmpltZoneSearch.done(); tmpltZoneSearch.done();
TmpltsInZoneSearch.done(); TmpltsInZoneSearch.done();
ActiveTmpltSearch = createSearchBuilder();
ActiveTmpltSearch.and("removed", ActiveTmpltSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
CountTemplatesByAccount = createSearchBuilder(Long.class); CountTemplatesByAccount = createSearchBuilder(Long.class);
CountTemplatesByAccount.select(null, Func.COUNT, null); CountTemplatesByAccount.select(null, Func.COUNT, null);
CountTemplatesByAccount.and("account", CountTemplatesByAccount.entity().getAccountId(), SearchCriteria.Op.EQ); CountTemplatesByAccount.and("account", CountTemplatesByAccount.entity().getAccountId(), SearchCriteria.Op.EQ);
@ -854,6 +859,14 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
return listBy(sc); return listBy(sc);
} }
@Override
public List<VMTemplateVO> listAllActive() {
SearchCriteria<VMTemplateVO> sc = ActiveTmpltSearch.create();
return listBy(sc);
}
@Override @Override
public List<VMTemplateVO> listDefaultBuiltinTemplates() { public List<VMTemplateVO> listDefaultBuiltinTemplates() {
SearchCriteria<VMTemplateVO> sc = tmpltTypeSearch.create(); SearchCriteria<VMTemplateVO> sc = tmpltTypeSearch.create();

View File

@ -40,11 +40,13 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
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.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateEvent;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
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.TemplateState;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.framework.async.AsyncCallFuture; import org.apache.cloudstack.framework.async.AsyncCallFuture;
@ -57,6 +59,7 @@ import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.image.manager.ImageDataManager;
import org.apache.cloudstack.storage.image.store.TemplateObject; import org.apache.cloudstack.storage.image.store.TemplateObject;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
@ -64,9 +67,12 @@ import com.cloud.agent.api.storage.DeleteTemplateCommand;
import com.cloud.agent.api.storage.ListTemplateAnswer; import com.cloud.agent.api.storage.ListTemplateAnswer;
import com.cloud.agent.api.storage.ListTemplateCommand; import com.cloud.agent.api.storage.ListTemplateCommand;
import com.cloud.alert.AlertManager; import com.cloud.alert.AlertManager;
import com.cloud.api.query.dao.UserVmJoinDao;
import com.cloud.api.query.vo.UserVmJoinVO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceAllocationException;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
@ -84,6 +90,7 @@ import com.cloud.storage.template.TemplateProp;
import com.cloud.user.AccountManager; import com.cloud.user.AccountManager;
import com.cloud.user.ResourceLimitService; import com.cloud.user.ResourceLimitService;
import com.cloud.utils.UriUtils; import com.cloud.utils.UriUtils;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.vm.UserVmVO; import com.cloud.vm.UserVmVO;
import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDao;
@ -121,12 +128,17 @@ public class TemplateServiceImpl implements TemplateService {
@Inject @Inject
UserVmDao _userVmDao; UserVmDao _userVmDao;
@Inject @Inject
UserVmJoinDao _userVmJoinDao;
@Inject
VolumeDao _volumeDao; VolumeDao _volumeDao;
@Inject @Inject
TemplateDataFactory _templateFactory; TemplateDataFactory _templateFactory;
@Inject VMTemplatePoolDao _tmpltPoolDao; @Inject VMTemplatePoolDao _tmpltPoolDao;
@Inject @Inject
EndPointSelector _epSelector; EndPointSelector _epSelector;
@Inject
ImageDataManager imageMgr;
class TemplateOpContext<T> extends AsyncRpcConext<T> { class TemplateOpContext<T> extends AsyncRpcConext<T> {
final TemplateObject template; final TemplateObject template;
@ -264,7 +276,7 @@ public class TemplateServiceImpl implements TemplateService {
List<VMTemplateVO> allTemplates = null; List<VMTemplateVO> allTemplates = null;
if (zoneId == null){ if (zoneId == null){
// region wide store // region wide store
allTemplates = _templateDao.listAll(); allTemplates = _templateDao.listAllActive();
} }
else{ else{
// zone wide store // zone wide store
@ -326,7 +338,7 @@ public class TemplateServiceImpl implements TemplateService {
tmlpt.setSize(tmpltInfo.getSize()); tmlpt.setSize(tmpltInfo.getSize());
_templateDao.update(tmplt.getId(), tmlpt); _templateDao.update(tmplt.getId(), tmlpt);
if (tmpltInfo.getSize() > 0) { if (tmpltInfo.getSize() > 0 && tmplt.getUrl() != null) {
long accountId = tmplt.getAccountId(); long accountId = tmplt.getAccountId();
try { try {
_resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(accountId), _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(accountId),
@ -418,7 +430,7 @@ public class TemplateServiceImpl implements TemplateService {
for (String uniqueName : templateInfos.keySet()) { for (String uniqueName : templateInfos.keySet()) {
TemplateProp tInfo = templateInfos.get(uniqueName); TemplateProp tInfo = templateInfos.get(uniqueName);
List<UserVmVO> userVmUsingIso = _userVmDao.listByIsoId(tInfo.getId()); List<UserVmJoinVO> userVmUsingIso = _userVmJoinDao.listActiveByIsoId(tInfo.getId());
//check if there is any Vm using this ISO. //check if there is any Vm using this ISO.
if (userVmUsingIso == null || userVmUsingIso.isEmpty()) { if (userVmUsingIso == null || userVmUsingIso.isEmpty()) {
//TODO: we cannot directly call deleteTemplateSync here to reuse delete logic since in this case, our db does not have this template at all. //TODO: we cannot directly call deleteTemplateSync here to reuse delete logic since in this case, our db does not have this template at all.
@ -610,6 +622,18 @@ public class TemplateServiceImpl implements TemplateService {
long storeId = store.getId(); long storeId = store.getId();
List<VMTemplateVO> rtngTmplts = _templateDao.listAllSystemVMTemplates(); List<VMTemplateVO> rtngTmplts = _templateDao.listAllSystemVMTemplates();
for ( VMTemplateVO tmplt : rtngTmplts ) { for ( VMTemplateVO tmplt : rtngTmplts ) {
// set template ready state
if ( tmplt.getState() != TemplateState.Ready ){
try {
imageMgr.getStateMachine().transitTo(tmplt, TemplateEvent.CreateRequested, null,
_templateDao);
imageMgr.getStateMachine().transitTo(tmplt, TemplateEvent.OperationSucceeded, null,
_templateDao);
} catch (NoTransitionException e) {
// non fatal though
s_logger.debug("failed to update system vm template state to Ready", e);
}
}
TemplateDataStoreVO tmpltStore = _vmTemplateStoreDao.findByStoreTemplate(storeId, tmplt.getId()); TemplateDataStoreVO tmpltStore = _vmTemplateStoreDao.findByStoreTemplate(storeId, tmplt.getId());
if ( tmpltStore == null ) { if ( tmpltStore == null ) {
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());

View File

@ -291,9 +291,6 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver {
UsageEventUtils.publishUsageEvent(eventType, account.getId(), sZoneId, templateId, null, null, null); UsageEventUtils.publishUsageEvent(eventType, account.getId(), sZoneId, templateId, null, null, null);
} }
List<UserVmJoinVO> userVmUsingIso = _userVmJoinDao.listActiveByIsoId(templateId);
// check if there is any VM using this ISO.
if (userVmUsingIso == null || userVmUsingIso.isEmpty()) {
// get installpath of this template on image store // get installpath of this template on image store
TemplateDataStoreVO tmplStore = _templateStoreDao.findByStoreTemplate(storeId, templateId); TemplateDataStoreVO tmplStore = _templateStoreDao.findByStoreTemplate(storeId, templateId);
String installPath = tmplStore.getInstallPath(); String installPath = tmplStore.getInstallPath();
@ -317,21 +314,13 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver {
} }
// for S3, a template can be associated with multiple zones // for S3, a template can be associated with multiple zones
List<VMTemplateZoneVO> templateZones = templateZoneDao List<VMTemplateZoneVO> templateZones = templateZoneDao.listByZoneTemplate(sZoneId, templateId);
.listByZoneTemplate(sZoneId, templateId);
if (templateZones != null) { if (templateZones != null) {
for (VMTemplateZoneVO templateZone : templateZones) { for (VMTemplateZoneVO templateZone : templateZones) {
templateZoneDao.remove(templateZone.getId()); templateZoneDao.remove(templateZone.getId());
} }
} }
} }
} else{
// cannot delete iso due to some VMs are using this
s_logger.debug("Cannot delete iso since some user vms are referencing it");
CommandResult result = new CommandResult();
result.setResult("Cannot delete iso since some user vms are referencing it");
callback.complete(result);
}
} }
private void deleteSnapshot(DataObject data, AsyncCompletionCallback<CommandResult> callback) { private void deleteSnapshot(DataObject data, AsyncCompletionCallback<CommandResult> callback) {

View File

@ -285,9 +285,6 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver {
UsageEventUtils.publishUsageEvent(eventType, account.getId(), sZoneId, templateId, null, null, null); UsageEventUtils.publishUsageEvent(eventType, account.getId(), sZoneId, templateId, null, null, null);
} }
List<UserVmJoinVO> userVmUsingIso = _userVmJoinDao.listActiveByIsoId(templateId);
// check if there is any VM using this ISO.
if (userVmUsingIso == null || userVmUsingIso.isEmpty()) {
// get installpath of this template on image store // get installpath of this template on image store
TemplateDataStoreVO tmplStore = _templateStoreDao.findByStoreTemplate(storeId, templateId); TemplateDataStoreVO tmplStore = _templateStoreDao.findByStoreTemplate(storeId, templateId);
String installPath = tmplStore.getInstallPath(); String installPath = tmplStore.getInstallPath();
@ -299,33 +296,25 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver {
if (answer == null || !answer.getResult()) { if (answer == null || !answer.getResult()) {
s_logger.debug("Failed to deleted template at store: " + store.getName()); s_logger.debug("Failed to deleted template at store: " + store.getName());
CommandResult result = new CommandResult(); CommandResult result = new CommandResult();
//result.setSucess(false); // result.setSucess(false);
result.setResult("Delete template failed"); result.setResult("Delete template failed");
callback.complete(result); callback.complete(result);
} else { } else {
s_logger.debug("Deleted template at: " + installPath); s_logger.debug("Deleted template at: " + installPath);
CommandResult result = new CommandResult(); CommandResult result = new CommandResult();
//result.setSucess(true); // result.setSucess(true);
callback.complete(result); callback.complete(result);
} }
// for Swift, a template can be associated with multiple zones // for Swift, a template can be associated with multiple zones
List<VMTemplateZoneVO> templateZones = templateZoneDao List<VMTemplateZoneVO> templateZones = templateZoneDao.listByZoneTemplate(sZoneId, templateId);
.listByZoneTemplate(sZoneId, templateId);
if (templateZones != null) { if (templateZones != null) {
for (VMTemplateZoneVO templateZone : templateZones) { for (VMTemplateZoneVO templateZone : templateZones) {
templateZoneDao.remove(templateZone.getId()); templateZoneDao.remove(templateZone.getId());
} }
} }
} }
} else{
// cannot delete iso due to some VMs are using this
s_logger.debug("Cannot delete iso since some user vms are referencing it");
CommandResult result = new CommandResult();
result.setResult("Cannot delete iso since some user vms are referencing it");
callback.complete(result);
}
} }
private void deleteSnapshot(DataObject data, AsyncCompletionCallback<CommandResult> callback) { private void deleteSnapshot(DataObject data, AsyncCompletionCallback<CommandResult> callback) {

View File

@ -1155,7 +1155,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
List<UserVmJoinVO> userVmUsingIso = _userVmJoinDao.listActiveByIsoId(templateId); List<UserVmJoinVO> userVmUsingIso = _userVmJoinDao.listActiveByIsoId(templateId);
// check if there is any VM using this ISO. // check if there is any VM using this ISO.
if (!userVmUsingIso.isEmpty()) { if (userVmUsingIso != null && !userVmUsingIso.isEmpty()) {
throw new InvalidParameterValueException("Unable to delete iso, as it's used by other vms"); throw new InvalidParameterValueException("Unable to delete iso, as it's used by other vms");
} }