From fed7d1ebdb96bf031be2b8affb37da9d08a65c58 Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 31 May 2011 17:55:52 -0700 Subject: [PATCH] delete secondary storage, 1. check if there are snapshotsin this secondary storage, if yes , fails 2. check if there are private templatesin this secondary storage , if yes, fails --- .../cloud/resource/ResourceManagerImpl.java | 3 +- .../com/cloud/storage/dao/SnapshotDao.java | 2 ++ .../cloud/storage/dao/SnapshotDaoImpl.java | 20 +++++++++++++ .../com/cloud/storage/dao/VMTemplateDao.java | 1 + .../cloud/storage/dao/VMTemplateDaoImpl.java | 28 +++++++++++++++++++ .../cloud/storage/dao/VMTemplateHostDao.java | 2 ++ .../storage/dao/VMTemplateHostDaoImpl.java | 12 ++++++-- .../storage/download/DownloadMonitorImpl.java | 2 +- .../SecondaryStorageManagerImpl.java | 26 ++++++++++++++++- .../secondary/SecondaryStorageVmManager.java | 3 +- 10 files changed, 93 insertions(+), 6 deletions(-) diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 3dc5ac081e0..a2f5a51e3e0 100644 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -525,7 +525,8 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma } _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), host.getDataCenterId()); if (Host.Type.SecondaryStorage.equals(host.getType())) { - return _secondaryStorageMgr.destroySecStorageVm(hostId); + _secondaryStorageMgr.deleteHost(hostId); + return true; } else { return _agentMgr.deleteHost(hostId, isForced, caller); } diff --git a/server/src/com/cloud/storage/dao/SnapshotDao.java b/server/src/com/cloud/storage/dao/SnapshotDao.java index a0bcfa8c8e3..5875feb0312 100644 --- a/server/src/com/cloud/storage/dao/SnapshotDao.java +++ b/server/src/com/cloud/storage/dao/SnapshotDao.java @@ -37,5 +37,7 @@ public interface SnapshotDao extends GenericDao { List listByVolumeIdVersion(long volumeId, String version); Long getSecHostId(long volumeId); long updateSnapshotSecHost(long dcId, long secHostId); + List listByHostId(Filter filter, long hostId); + List listByHostId(long hostId); } diff --git a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java index 45dd79e3e5a..bc1285802c3 100644 --- a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java +++ b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java @@ -28,6 +28,7 @@ import org.apache.log4j.Logger; import com.cloud.storage.SnapshotVO; import com.cloud.storage.Snapshot.Type; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -47,6 +48,7 @@ public class SnapshotDaoImpl extends GenericDaoBase implements private final SearchBuilder ParentIdSearch; private final SearchBuilder backupUuidSearch; private final SearchBuilder VolumeIdVersionSearch; + private final SearchBuilder HostIdSearch; @Override public SnapshotVO findNextSnapshot(long snapshotId) { @@ -85,6 +87,19 @@ public class SnapshotDaoImpl extends GenericDaoBase implements return listBy(sc, filter); } + @Override + public List listByHostId(long hostId) { + return listByHostId(null, hostId); + } + + @Override + public List listByHostId(Filter filter, long hostId ) { + SearchCriteria sc = HostIdSearch.create(); + sc.setParameters("hostId", hostId); + sc.setParameters("status", Status.DOWNLOADED); + return listBy(sc, filter); + } + @Override public List listByVolumeIdIncludingRemoved(long volumeId) { SearchCriteria sc = VolumeIdSearch.create(); @@ -111,6 +126,11 @@ public class SnapshotDaoImpl extends GenericDaoBase implements VolumeIdSearch.and("volumeId", VolumeIdSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); VolumeIdSearch.done(); + HostIdSearch = createSearchBuilder(); + HostIdSearch.and("hostId", HostIdSearch.entity().getSecHostId(), SearchCriteria.Op.EQ); + HostIdSearch.and("status", HostIdSearch.entity().getStatus(), SearchCriteria.Op.EQ); + HostIdSearch.done(); + VolumeIdTypeSearch = createSearchBuilder(); VolumeIdTypeSearch.and("volumeId", VolumeIdTypeSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); VolumeIdTypeSearch.and("type", VolumeIdTypeSearch.entity().getsnapshotType(), SearchCriteria.Op.EQ); diff --git a/server/src/com/cloud/storage/dao/VMTemplateDao.java b/server/src/com/cloud/storage/dao/VMTemplateDao.java index 5aea418bb17..18c802bef26 100644 --- a/server/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDao.java @@ -71,5 +71,6 @@ public interface VMTemplateDao extends GenericDao { VMTemplateVO findSystemVMTemplate(long zoneId, HypervisorType hType); VMTemplateVO findRoutingTemplate(HypervisorType type); + List listPrivateTemplatesByHost(Long hostId); } diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 2164b13f4f7..8814ee086ef 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -21,11 +21,13 @@ package com.cloud.storage.dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TimeZone; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -39,6 +41,7 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.info.RunningHostCountInfo; import com.cloud.storage.Storage; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; @@ -46,6 +49,7 @@ import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; +import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.db.DB; @@ -139,6 +143,30 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return listBy(sc, filter); } + @Override + public List listPrivateTemplatesByHost(Long hostId) { + + String sql = "select * from template_host_ref as thr INNER JOIN vm_template as t ON t.id=thr.template_id " + + "where thr.host_id=? and t.public=0 and t.featured=0 and t.type='USER' and t.removed is NULL"; + + List l = new ArrayList(); + + Transaction txn = Transaction.currentTxn(); + + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql); + pstmt.setLong(1, hostId); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + l.add(rs.getLong(1)); + } + } catch (SQLException e) { + } catch (Throwable e) { + } + return l; + } + @Override public List listReadyTemplates() { SearchCriteria sc = createSearchCriteria(); diff --git a/server/src/com/cloud/storage/dao/VMTemplateHostDao.java b/server/src/com/cloud/storage/dao/VMTemplateHostDao.java index cefe359cff0..fef0217e878 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateHostDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateHostDao.java @@ -57,5 +57,7 @@ public interface VMTemplateHostDao extends GenericDao { boolean templateAvailable(long templateId, long hostId); List listByZoneTemplate(long dcId, long templateId); + + void deleteByHost(Long hostId); } diff --git a/server/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java index a9387fc1c0c..8d605a8e29e 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java @@ -52,7 +52,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase tmpltHosts = listByHostId(hostId); + for (VMTemplateHostVO tmpltHost : tmpltHosts ) { + remove(tmpltHost.getId()); + } + } } diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index 7d4cdd07f35..1a309f2cb67 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -539,7 +539,7 @@ public class DownloadMonitorImpl implements DownloadMonitor { for ( VMTemplateHostVO tmpltHost : tmpltHosts ) { if ( tmpltHost.getDownloadState() == Status.DOWNLOADED || tmpltHost.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) { iter.remove(); - continue; + break; } } } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index e7caa4ca1db..5365c45f550 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -71,9 +71,11 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.SnapshotVO; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; @@ -162,7 +164,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V private AgentManager _agentMgr; @Inject private NetworkManager _networkMgr; - + @Inject + protected SnapshotDao _snapshotDao; + @Inject private ClusterManager _clusterMgr; @@ -282,6 +286,26 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V return true; } + + @Override + public boolean deleteHost(Long hostId) { + List snapshots = _snapshotDao.listByHostId(hostId); + if( snapshots != null && !snapshots.isEmpty()) { + throw new CloudRuntimeException("Can not delete this secondary storage due to there are still snapshots on it "); + } + List list = _templateDao.listPrivateTemplatesByHost(hostId); + if( list != null && !list.isEmpty()) { + throw new CloudRuntimeException("Can not delete this secondary storage due to there are still private template on it "); + } + _vmTemplateHostDao.deleteByHost(hostId); + HostVO host = _hostDao.findById(hostId); + host.setGuid(null); + _hostDao.update(hostId, host); + _hostDao.remove(hostId); + + return true; + } + @Override public boolean generateVMSetupCommand(Long ssAHostId) { HostVO ssAHost = _hostDao.findById(ssAHostId); diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java b/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java index 885ba5c14ce..891a73a23fa 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java @@ -43,5 +43,6 @@ public interface SecondaryStorageVmManager extends Manager { public boolean generateVMSetupCommand(Long hostId); public Pair assignSecStorageVm(long zoneId, Command cmd); - boolean generateSetupCommand(Long hostId); + boolean generateSetupCommand(Long hostId); + boolean deleteHost(Long hostId); }