/** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ package com.cloud.dc.dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.Local; import com.cloud.capacity.CapacityVO; import com.cloud.dc.ClusterVO; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; @Local(value=ClusterDao.class) public class ClusterDaoImpl extends GenericDaoBase implements ClusterDao { protected final SearchBuilder PodSearch; protected final SearchBuilder HyTypeWithoutGuidSearch; protected final SearchBuilder AvailHyperSearch; protected final SearchBuilder ZoneSearch; protected final SearchBuilder ZoneHyTypeSearch; 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 = " )"; protected ClusterDaoImpl() { super(); HyTypeWithoutGuidSearch = createSearchBuilder(); HyTypeWithoutGuidSearch.and("hypervisorType", HyTypeWithoutGuidSearch.entity().getHypervisorType(), SearchCriteria.Op.EQ); HyTypeWithoutGuidSearch.and("guid", HyTypeWithoutGuidSearch.entity().getGuid(), SearchCriteria.Op.NULL); HyTypeWithoutGuidSearch.done(); ZoneHyTypeSearch = createSearchBuilder(); ZoneHyTypeSearch.and("hypervisorType", ZoneHyTypeSearch.entity().getHypervisorType(), SearchCriteria.Op.EQ); ZoneHyTypeSearch.and("dataCenterId", ZoneHyTypeSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); ZoneHyTypeSearch.done(); PodSearch = createSearchBuilder(); PodSearch.and("pod", PodSearch.entity().getPodId(), SearchCriteria.Op.EQ); PodSearch.and("name", PodSearch.entity().getName(), SearchCriteria.Op.EQ); PodSearch.done(); ZoneSearch = createSearchBuilder(); ZoneSearch.and("dataCenterId", ZoneSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); ZoneSearch.groupBy(ZoneSearch.entity().getHypervisorType()); ZoneSearch.done(); AvailHyperSearch = createSearchBuilder(); AvailHyperSearch.and("zoneId", AvailHyperSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); AvailHyperSearch.groupBy(AvailHyperSearch.entity().getHypervisorType()); AvailHyperSearch.done(); } @Override public List listByZoneId(long zoneId) { SearchCriteria sc = ZoneSearch.create(); sc.setParameters("dataCenterId", zoneId); return listBy(sc); } @Override public List listByPodId(long podId) { SearchCriteria sc = PodSearch.create(); sc.setParameters("pod", podId); return listBy(sc); } @Override public ClusterVO findBy(String name, long podId) { SearchCriteria sc = PodSearch.create(); sc.setParameters("pod", podId); sc.setParameters("name", name); return findOneBy(sc); } @Override public List listByHyTypeWithoutGuid(String hyType) { SearchCriteria sc = HyTypeWithoutGuidSearch.create(); sc.setParameters("hypervisorType", hyType); return listBy(sc); } @Override public List listByDcHyType(long dcId, String hyType) { SearchCriteria sc = ZoneHyTypeSearch.create(); sc.setParameters("dataCenterId", dcId); sc.setParameters("hypervisorType", hyType); return listBy(sc); } @Override public List getAvailableHypervisorInZone(long zoneId) { SearchCriteria sc = AvailHyperSearch.create(); sc.setParameters("zoneId", zoneId); List clusters = listBy(sc); List hypers = new ArrayList(4); for (ClusterVO cluster : clusters) { hypers.add(cluster.getHypervisorType()); } return hypers; } @Override public Map> getPodClusterIdMap(List clusterIds){ Transaction txn = Transaction.currentTxn(); PreparedStatement pstmt = null; Map> result = new HashMap>(); try { StringBuilder sql = new StringBuilder(GET_POD_CLUSTER_MAP_PREFIX); if (clusterIds.size() > 0) { for (Long clusterId : clusterIds) { sql.append(clusterId).append(","); } sql.delete(sql.length()-1, sql.length()); sql.append(GET_POD_CLUSTER_MAP_SUFFIX); } pstmt = txn.prepareAutoCloseStatement(sql.toString()); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { Long podId = rs.getLong(1); Long clusterIdInPod = rs.getLong(2); if(result.containsKey(podId)){ List clusterList = result.get(podId); clusterList.add(clusterIdInPod); result.put(podId, clusterList); }else{ List clusterList = new ArrayList(); clusterList.add(clusterIdInPod); result.put(podId, clusterList); } } return result; } catch (SQLException e) { throw new CloudRuntimeException("DB Exception on: " + GET_POD_CLUSTER_MAP_PREFIX, e); } catch (Throwable e) { throw new CloudRuntimeException("Caught: " + GET_POD_CLUSTER_MAP_PREFIX, e); } } }