diff --git a/api/src/com/cloud/deploy/DeploymentPlanner.java b/api/src/com/cloud/deploy/DeploymentPlanner.java index 741a8048a0a..88cfc74ca29 100644 --- a/api/src/com/cloud/deploy/DeploymentPlanner.java +++ b/api/src/com/cloud/deploy/DeploymentPlanner.java @@ -191,6 +191,13 @@ public interface DeploymentPlanner extends Adapter { _podIds.add(podId); } + public void addPodList(Collection podList) { + if (_podIds == null) { + _podIds = new HashSet(); + } + _podIds.addAll(podList); + } + public void addCluster(long clusterId) { if (_clusterIds == null) { _clusterIds = new HashSet(); diff --git a/engine/schema/src/com/cloud/dc/dao/ClusterDao.java b/engine/schema/src/com/cloud/dc/dao/ClusterDao.java index 673888bc2ab..d7e43bf102d 100644 --- a/engine/schema/src/com/cloud/dc/dao/ClusterDao.java +++ b/engine/schema/src/com/cloud/dc/dao/ClusterDao.java @@ -35,4 +35,5 @@ public interface ClusterDao extends GenericDao { List listDisabledClusters(long zoneId, Long podId); List listClustersWithDisabledPods(long zoneId); List listClustersByDcId(long zoneId); + List listAllCusters(long zoneId); } diff --git a/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java index ba2686a4004..64bf1fe6103 100644 --- a/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java @@ -54,6 +54,8 @@ public class ClusterDaoImpl extends GenericDaoBase implements C protected final SearchBuilder ZoneHyTypeSearch; protected final SearchBuilder ZoneClusterSearch; + protected GenericSearchBuilder ClusterIdSearch; + private static final String GET_POD_CLUSTER_MAP_PREFIX = "SELECT pod_id, id FROM cloud.cluster WHERE cluster.id IN( "; private static final String GET_POD_CLUSTER_MAP_SUFFIX = " )"; @Inject @@ -90,6 +92,11 @@ public class ClusterDaoImpl extends GenericDaoBase implements C ZoneClusterSearch = createSearchBuilder(); ZoneClusterSearch.and("dataCenterId", ZoneClusterSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); ZoneClusterSearch.done(); + + ClusterIdSearch = createSearchBuilder(Long.class); + ClusterIdSearch.selectField(ClusterIdSearch.entity().getId()); + ClusterIdSearch.and("dataCenterId", ClusterIdSearch.entity().getDataCenterId(), Op.EQ); + ClusterIdSearch.done(); } @Override @@ -168,11 +175,11 @@ public class ClusterDaoImpl extends GenericDaoBase implements C while (rs.next()) { Long podId = rs.getLong(1); Long clusterIdInPod = rs.getLong(2); - if(result.containsKey(podId)){ + if (result.containsKey(podId)) { List clusterList = result.get(podId); clusterList.add(clusterIdInPod); result.put(podId, clusterList); - }else{ + } else { List clusterList = new ArrayList(); clusterList.add(clusterIdInPod); result.put(podId, clusterList); @@ -191,13 +198,12 @@ public class ClusterDaoImpl extends GenericDaoBase implements C GenericSearchBuilder clusterIdSearch = createSearchBuilder(Long.class); clusterIdSearch.selectField(clusterIdSearch.entity().getId()); clusterIdSearch.and("dataCenterId", clusterIdSearch.entity().getDataCenterId(), Op.EQ); - if(podId != null){ + if (podId != null) { clusterIdSearch.and("podId", clusterIdSearch.entity().getPodId(), Op.EQ); } clusterIdSearch.and("allocationState", clusterIdSearch.entity().getAllocationState(), Op.EQ); clusterIdSearch.done(); - SearchCriteria sc = clusterIdSearch.create(); sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); if (podId != null) { @@ -250,4 +256,10 @@ public class ClusterDaoImpl extends GenericDaoBase implements C return result; } + @Override + public List listAllCusters(long zoneId) { + SearchCriteria sc = ClusterIdSearch.create(); + sc.setParameters("dataCenterId", zoneId); + return customSearch(sc, null); + } } diff --git a/engine/schema/src/com/cloud/dc/dao/HostPodDao.java b/engine/schema/src/com/cloud/dc/dao/HostPodDao.java index 03f7155d0d2..1babef16d03 100644 --- a/engine/schema/src/com/cloud/dc/dao/HostPodDao.java +++ b/engine/schema/src/com/cloud/dc/dao/HostPodDao.java @@ -24,12 +24,13 @@ import com.cloud.utils.db.GenericDao; import com.cloud.vm.VirtualMachine; public interface HostPodDao extends GenericDao { - public List listByDataCenterId(long id); + public List listByDataCenterId(long id); public HostPodVO findByName(String name, long dcId); - - public HashMap> getCurrentPodCidrSubnets(long zoneId, long podIdToSkip); + + public HashMap> getCurrentPodCidrSubnets(long zoneId, long podIdToSkip); public List listDisabledPods(long zoneId); + public List listAllPods(long zoneId); } diff --git a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java index 07b4ad13db6..14b2931dcc5 100644 --- a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java @@ -44,6 +44,7 @@ public class HostPodDaoImpl extends GenericDaoBase implements H protected SearchBuilder DataCenterAndNameSearch; protected SearchBuilder DataCenterIdSearch; + protected GenericSearchBuilder PodIdSearch; public HostPodDaoImpl() { DataCenterAndNameSearch = createSearchBuilder(); @@ -54,6 +55,12 @@ public class HostPodDaoImpl extends GenericDaoBase implements H DataCenterIdSearch = createSearchBuilder(); DataCenterIdSearch.and("dcId", DataCenterIdSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); DataCenterIdSearch.done(); + + PodIdSearch = createSearchBuilder(Long.class); + PodIdSearch.selectField(PodIdSearch.entity().getId()); + PodIdSearch.and("dataCenterId", PodIdSearch.entity().getDataCenterId(), Op.EQ); + PodIdSearch.and("allocationState", PodIdSearch.entity().getAllocationState(), Op.EQ); + PodIdSearch.done(); } @Override @@ -118,17 +125,16 @@ public class HostPodDaoImpl extends GenericDaoBase implements H @Override public List listDisabledPods(long zoneId) { - GenericSearchBuilder podIdSearch = createSearchBuilder(Long.class); - podIdSearch.selectField(podIdSearch.entity().getId()); - podIdSearch.and("dataCenterId", podIdSearch.entity().getDataCenterId(), Op.EQ); - podIdSearch.and("allocationState", podIdSearch.entity().getAllocationState(), Op.EQ); - podIdSearch.done(); - - - SearchCriteria sc = podIdSearch.create(); + SearchCriteria sc = PodIdSearch.create(); sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); sc.addAnd("allocationState", SearchCriteria.Op.EQ, Grouping.AllocationState.Disabled); return customSearch(sc, null); } + @Override + public List listAllPods(long zoneId) { + SearchCriteria sc = PodIdSearch.create(); + sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); + return customSearch(sc, null); + } } diff --git a/engine/schema/src/com/cloud/host/dao/HostDao.java b/engine/schema/src/com/cloud/host/dao/HostDao.java index 8ceb8f23132..b007bb135a5 100755 --- a/engine/schema/src/com/cloud/host/dao/HostDao.java +++ b/engine/schema/src/com/cloud/host/dao/HostDao.java @@ -43,7 +43,7 @@ public interface HostDao extends GenericDao, StateDao findLostHosts(long timeout); + List findLostHosts(long timeout); List findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId); @@ -61,15 +61,14 @@ public interface HostDao extends GenericDao, StateDao findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId); + List findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId); boolean updateResourceState(ResourceState oldState, ResourceState.Event event, ResourceState newState, Host vo); - HostVO findByGuid(String guid); - - HostVO findByTypeNameAndZoneId(long zoneId, String name, Host.Type type); - List findHypervisorHostInCluster(long clusterId); + HostVO findByGuid(String guid); + HostVO findByTypeNameAndZoneId(long zoneId, String name, Host.Type type); + List findHypervisorHostInCluster(long clusterId); /** * @param type @@ -86,4 +85,6 @@ public interface HostDao extends GenericDao, StateDao findByClusterId(Long clusterId); List listByDataCenterId(long id); + + List listAllHosts(long zoneId); } diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java index dd26941aa00..41ee7a7a2dd 100755 --- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java +++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java @@ -105,7 +105,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected SearchBuilder ManagedRoutingServersSearch; protected SearchBuilder SecondaryStorageVMSearch; - + protected GenericSearchBuilder HostIdSearch; protected GenericSearchBuilder HostsInStatusSearch; protected GenericSearchBuilder CountRoutingByDc; protected SearchBuilder HostTransferSearch; @@ -319,7 +319,6 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao CountRoutingByDc.and("dc", CountRoutingByDc.entity().getDataCenterId(), SearchCriteria.Op.EQ); CountRoutingByDc.and("type", CountRoutingByDc.entity().getType(), SearchCriteria.Op.EQ); CountRoutingByDc.and("status", CountRoutingByDc.entity().getStatus(), SearchCriteria.Op.EQ); - CountRoutingByDc.done(); ManagedDirectConnectSearch = createSearchBuilder(); @@ -370,6 +369,11 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao HostsInClusterSearch.and("server", HostsInClusterSearch.entity().getManagementServerId(), SearchCriteria.Op.NNULL); HostsInClusterSearch.done(); + HostIdSearch = createSearchBuilder(Long.class); + HostIdSearch.selectField(HostIdSearch.entity().getId()); + HostIdSearch.and("dataCenterId", HostIdSearch.entity().getDataCenterId(), Op.EQ); + HostIdSearch.done(); + _statusAttr = _allAttributes.get("status"); _msIdAttr = _allAttributes.get("managementServerId"); _pingTimeAttr = _allAttributes.get("lastPinged"); @@ -1027,4 +1031,10 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return listBy(sc); } + @Override + public List listAllHosts(long zoneId) { + SearchCriteria sc = HostIdSearch.create(); + sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); + return customSearch(sc, null); + } } diff --git a/server/src/com/cloud/dc/dao/DedicatedResourceDao.java b/server/src/com/cloud/dc/dao/DedicatedResourceDao.java index a5d65d46c8e..2eef83a120c 100644 --- a/server/src/com/cloud/dc/dao/DedicatedResourceDao.java +++ b/server/src/com/cloud/dc/dao/DedicatedResourceDao.java @@ -46,4 +46,10 @@ public interface DedicatedResourceDao extends GenericDao listByDomainId(Long domainId); List listZonesNotInDomainIds(List domainIds); + + List listAllPods(); + + List listAllClusters(); + + List listAllHosts(); } \ No newline at end of file diff --git a/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java b/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java index 2a3b4690a0c..c5108604e2e 100644 --- a/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java @@ -23,11 +23,14 @@ import javax.ejb.Local; import org.springframework.stereotype.Component; import com.cloud.dc.DedicatedResourceVO; +import com.cloud.dc.HostPodVO; import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; @@ -59,6 +62,10 @@ public class DedicatedResourceDaoImpl extends GenericDaoBase ZoneByDomainIdsSearch; + protected GenericSearchBuilder ListPodsSearch; + protected GenericSearchBuilder ListClustersSearch; + protected GenericSearchBuilder ListHostsSearch; + protected DedicatedResourceDaoImpl() { PodSearch = createSearchBuilder(); PodSearch.and("podId", PodSearch.entity().getPodId(), SearchCriteria.Op.EQ); @@ -169,6 +176,21 @@ public class DedicatedResourceDaoImpl extends GenericDaoBase listAllPods() { + SearchCriteria sc = ListPodsSearch.create(); + return customSearch(sc, null); + } + + @Override + public List listAllClusters() { + SearchCriteria sc = ListClustersSearch.create(); + return customSearch(sc, null); + } + + @Override + public List listAllHosts() { + SearchCriteria sc = ListHostsSearch.create(); + return customSearch(sc, null); + } } diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java index 33a382faa01..252cf8ae630 100644 --- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -44,14 +44,8 @@ import org.apache.cloudstack.framework.messagebus.MessageSubscriber; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.identity.ManagementServerNode; - import org.apache.log4j.Logger; - - - - - import com.cloud.capacity.CapacityManager; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; @@ -61,7 +55,6 @@ import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.DedicatedResourceVO; -import com.cloud.dc.HostPodVO; import com.cloud.dc.Pod; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; @@ -100,8 +93,6 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.DB; -import com.cloud.utils.db.JoinBuilder; -import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; @@ -466,39 +457,22 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId()); if (dedicatedZone != null && dedicatedZone.getDomainId() != null) { throw new CloudRuntimeException("Failed to deploy VM. Zone " + dc.getName() + " is dedicated . Please use Explicit Dedication Affinity Group"); - } + } - List podsInDc = _podDao.listByDataCenterId(dc.getId()); - for (HostPodVO pod : podsInDc) { - DedicatedResourceVO dedicatedPod = _dedicatedDao.findByPodId(pod.getId()); - if (dedicatedPod != null) { - avoids.addPod(dedicatedPod.getPodId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cannot use this dedicated pod " + pod.getName() + "."); - } - } - } - - List clusterInDc = _clusterDao.listClustersByDcId(dc.getId()); - for (ClusterVO cluster : clusterInDc) { - DedicatedResourceVO dedicatedCluster = _dedicatedDao.findByClusterId(cluster.getId()); - if (dedicatedCluster != null) { - avoids.addCluster(dedicatedCluster.getClusterId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cannot use this dedicated Cluster " + cluster.getName() + "."); - } - } - } - List hostInDc = _hostDao.listByDataCenterId(dc.getId()); - for (HostVO host : hostInDc) { - DedicatedResourceVO dedicatedHost = _dedicatedDao.findByHostId(host.getId()); - if (dedicatedHost != null) { - avoids.addHost(dedicatedHost.getHostId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cannot use this dedicated host " + host.getName() + "."); - } - } - } + List allPodsInDc = _podDao.listAllPods(dc.getId()); + List allDedicatedPods = _dedicatedDao.listAllPods(); + allPodsInDc.retainAll(allDedicatedPods); + avoids.addPodList(allPodsInDc); + + List allClustersInDc = _clusterDao.listAllCusters(dc.getId()); + List allDedicatedClusters = _dedicatedDao.listAllClusters(); + allClustersInDc.retainAll(allDedicatedClusters); + avoids.addClusterList(allClustersInDc); + + List allHostsInDc = _hostDao.listAllHosts(dc.getId()); + List allDedicatedHosts = _dedicatedDao.listAllHosts(); + allHostsInDc.retainAll(allDedicatedHosts); + avoids.addHostList(allHostsInDc); } }