mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Exclude removed template from template sync.
This commit is contained in:
parent
57049d5aef
commit
d1704a389a
@ -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);
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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());
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user