From 2c7052bc640332e4efe92965e9a8303bb295d106 Mon Sep 17 00:00:00 2001 From: "Xiaoliang.Li" Date: Fri, 3 Jul 2015 16:11:50 +0800 Subject: [PATCH] 1. remove duplicate refresh 2. ResourcePool DAO impr --- .../vmware/bdd/manager/ClusterManager.java | 8 +++ .../bdd/service/impl/ClusteringService.java | 3 +- .../bdd/manager/MockResourceManager.java | 5 ++ .../com/vmware/bdd/dal/IResourcePoolDAO.java | 2 + .../vmware/bdd/dal/impl/ResourcePoolDAO.java | 15 +++++ .../bdd/service/resmgmt/IResourceService.java | 4 ++ .../service/resmgmt/impl/ResourceService.java | 56 +++++++--------- .../bdd/service/utils/VcResourceUtils.java | 64 +++++++++++++++++++ 8 files changed, 124 insertions(+), 33 deletions(-) diff --git a/server/cluster-mgmt/src/main/java/com/vmware/bdd/manager/ClusterManager.java b/server/cluster-mgmt/src/main/java/com/vmware/bdd/manager/ClusterManager.java index e6dc549ff..81fcee7ed 100644 --- a/server/cluster-mgmt/src/main/java/com/vmware/bdd/manager/ClusterManager.java +++ b/server/cluster-mgmt/src/main/java/com/vmware/bdd/manager/ClusterManager.java @@ -450,6 +450,9 @@ public Long createCluster(ClusterCreate createSpec) throws Exception { if (vcClusters == null || vcClusters.isEmpty()) { throw ClusterConfigException.NO_RESOURCE_POOL_ADDED(); } + + this.resMgr.refreshVcResources(); + // validate accessibility validateDatastore(dsNames, vcClusters); validateNetworkAccessibility(createSpec.getName(), createSpec.getNetworkNames(), vcClusters); @@ -719,6 +722,9 @@ public Long resumeClusterCreation(String clusterName) throws Exception { if (vcClusters.isEmpty()) { throw ClusterConfigException.NO_DATASTORE_ADDED(); } + + this.resMgr.refreshVcResources(); + // validate accessibility validateDatastore(dsNames, vcClusters); validateNetworkAccessibility(cluster.getName(), cluster.fetchNetworkNameList(), vcClusters); @@ -955,6 +961,8 @@ public Long resizeCluster(String clusterName, String nodeGroupName, throw ClusterConfigException.NO_DATASTORE_ADDED(); } + this.resMgr.refreshVcResources(); + // validate accessibility validateDatastore(dsNames, vcClusters); validateNetworkAccessibility(cluster.getName(), cluster.fetchNetworkNameList(), vcClusters); diff --git a/server/cluster-mgmt/src/main/java/com/vmware/bdd/service/impl/ClusteringService.java b/server/cluster-mgmt/src/main/java/com/vmware/bdd/service/impl/ClusteringService.java index 720782fa0..b66b81e06 100644 --- a/server/cluster-mgmt/src/main/java/com/vmware/bdd/service/impl/ClusteringService.java +++ b/server/cluster-mgmt/src/main/java/com/vmware/bdd/service/impl/ClusteringService.java @@ -1383,7 +1383,8 @@ public List getPlacementPlan(ClusterCreate clusterSpec, List clusters = resMgr.getAvailableClusters(); AuAssert.check(clusters != null && clusters.size() != 0); for (VcCluster cl : clusters) { - VcResourceUtils.refreshDatastore(cl); + //refresh once at beginning of cluster create/resume/resize +// VcResourceUtils.refreshDatastore(cl); container.addResource(cl); } diff --git a/server/cluster-mgmt/src/test/java/com/vmware/bdd/manager/MockResourceManager.java b/server/cluster-mgmt/src/test/java/com/vmware/bdd/manager/MockResourceManager.java index 77ec38402..bcd60412f 100644 --- a/server/cluster-mgmt/src/test/java/com/vmware/bdd/manager/MockResourceManager.java +++ b/server/cluster-mgmt/src/test/java/com/vmware/bdd/manager/MockResourceManager.java @@ -181,6 +181,11 @@ public boolean isNetworkAccessibleByCluster(List networkList, return false; } + @Override + public void refreshVcResources() { + + } + @Mock @Override public void refreshResourcePool() { diff --git a/server/dal/src/main/java/com/vmware/bdd/dal/IResourcePoolDAO.java b/server/dal/src/main/java/com/vmware/bdd/dal/IResourcePoolDAO.java index 828e2d3cb..913e80e2d 100644 --- a/server/dal/src/main/java/com/vmware/bdd/dal/IResourcePoolDAO.java +++ b/server/dal/src/main/java/com/vmware/bdd/dal/IResourcePoolDAO.java @@ -31,6 +31,8 @@ public interface IResourcePoolDAO extends IBaseDAO { List findAllOrderByClusterName(); + List findAllClusterName(); + String getNameByClusterAndRp(String vcCluster, String vcRp); VcResourcePoolEntity findByClusterAndRp(String vcCluster, String vcRp); diff --git a/server/dal/src/main/java/com/vmware/bdd/dal/impl/ResourcePoolDAO.java b/server/dal/src/main/java/com/vmware/bdd/dal/impl/ResourcePoolDAO.java index a0d64d90d..e3647d0c9 100644 --- a/server/dal/src/main/java/com/vmware/bdd/dal/impl/ResourcePoolDAO.java +++ b/server/dal/src/main/java/com/vmware/bdd/dal/impl/ResourcePoolDAO.java @@ -19,12 +19,16 @@ import java.util.Map; import org.apache.log4j.Logger; +import org.hibernate.Criteria; +import org.hibernate.Session; import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.vmware.bdd.dal.IResourcePoolDAO; +import com.vmware.bdd.entity.ClusterEntity; import com.vmware.bdd.entity.VcResourcePoolEntity; import com.vmware.bdd.exception.BddException; @@ -60,6 +64,17 @@ public List findAllOrderByClusterName() { return this.findByCriteria(new Order[] { order }, null, null); } + @Override + public List findAllClusterName() { + Session session = getSessionFactory().getCurrentSession(); + + Criteria criteria = session.createCriteria(VcResourcePoolEntity.class); + + criteria.setProjection(Projections.distinct(Projections.property("vcCluster"))); + + return criteria.list(); + } + @Override @Transactional(readOnly = true) public String getNameByClusterAndRp(String vcCluster, String vcRp) { diff --git a/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/IResourceService.java b/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/IResourceService.java index 2d9cf7028..24382ff34 100644 --- a/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/IResourceService.java +++ b/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/IResourceService.java @@ -234,4 +234,8 @@ List filterHostsByNetwork(List networkList, boolean isNetworkAccessibleByCluster(List networkList, List clusters); + /** + * refresh host, datastores, networks + */ + void refreshVcResources(); } diff --git a/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/impl/ResourceService.java b/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/impl/ResourceService.java index 05d4d984a..e3a3c85a0 100644 --- a/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/impl/ResourceService.java +++ b/server/res-mgmt/src/main/java/com/vmware/bdd/service/resmgmt/impl/ResourceService.java @@ -204,6 +204,10 @@ public List getDatastoreByName(String dsName) return findDSInVC(datastores); } + public void refreshVcResources() { + VcResourceUtils.refreshVcResources(); + } + @Override public void refreshDatastore() { List vcClusters = VcResourceUtils.getClusters(); @@ -447,38 +451,24 @@ public List getHostsByClusterName(String clusterName) */ @Override public List getAvailableClusters() throws VcProviderException { - final List allRPEntities = - rpDao.findAllOrderByClusterName(); - List clusters = - VcContext.inVcSessionDo(new VcSession>() { - List result = new ArrayList(); - - @Override - protected List body() throws Exception { - List vcClusters = VcResourceUtils.getClusters(); - for (VcResourcePoolEntity rpEntity : allRPEntities) { - boolean added = false; - for (VcCluster vcCluster : result) { - if (rpEntity.getVcCluster().equals(vcCluster.getName())) { - added = true; - break; - } - } - if (added) { - continue; - } - for (VcCluster vcCluster : vcClusters) { - if (rpEntity.getVcCluster().equals(vcCluster.getName())) { - result.add(vcCluster); - break; - } - } - } - return result; + final HashSet clusterNameFromRps = new HashSet<>(rpDao.findAllClusterName()); + + return VcContext.inVcSessionDo(new VcSession>() { + + @Override + protected List body() throws Exception { + List results = new ArrayList<>(); + + for (VcCluster vcCluster : VcResourceUtils.getClusters()) { + if (clusterNameFromRps.contains(vcCluster.getName())) { + results.add(vcCluster); } + } + + return results; + } - }); - return clusters; + }); } @@ -527,7 +517,8 @@ public Map getCloudProviderAttributes() { @Override public List filterHostsByNetwork(List networkList, List clusters) { - refreshNetwork(); + // refresh all resource when at beginning of creating/resizing/resuming cluster + //refreshNetwork(); Set networkNames = new HashSet(); networkNames.addAll(networkList); Set portGroupNames = new HashSet(); @@ -566,7 +557,8 @@ public List filterHostsByNetwork(List networkList, @Override public boolean isNetworkAccessibleByCluster(List networkList, List clusters) { - refreshNetwork(); + // refresh all resource when at beginning of creating/resizing/resuming cluster +// refreshNetwork(); Set portGroupNames = new HashSet(); for (String networkName : networkList) { diff --git a/server/res-mgmt/src/main/java/com/vmware/bdd/service/utils/VcResourceUtils.java b/server/res-mgmt/src/main/java/com/vmware/bdd/service/utils/VcResourceUtils.java index c407bdc4c..73efd8e8b 100644 --- a/server/res-mgmt/src/main/java/com/vmware/bdd/service/utils/VcResourceUtils.java +++ b/server/res-mgmt/src/main/java/com/vmware/bdd/service/utils/VcResourceUtils.java @@ -22,9 +22,11 @@ import java.util.Map; import java.util.Set; +import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import com.vmware.aurora.global.Configuration; +import com.vmware.aurora.util.AuAssert; import com.vmware.aurora.vc.MoUtil; import com.vmware.aurora.vc.VcCache; import com.vmware.aurora.vc.VcCluster; @@ -418,6 +420,68 @@ protected Void body() { }); } + + public static void refreshVcResources() { + List vcClusters = getClusters(); + AuAssert.check(CollectionUtils.isNotEmpty(vcClusters), "no VC clusters found."); + + for (final VcCluster vcCluster : vcClusters) { + VcContext.inVcSessionDo(new VcSession() { + @Override + protected Void body() { + try { + vcCluster.update(); + } catch (Exception e) { + logger.info("failed to update cluster " + vcCluster.getName() + + ", ignore this error.", e); + } + + List networks = vcCluster.getAllNetworks(); + if (networks != null) { + for (VcNetwork network : networks) { + try { + network.update(); + } catch (Exception e) { + logger.info( + "failed to update network " + network.getName() + + ", ignore this error.", e); + } + } + } + + List dss = vcCluster.getAllDatastores(); + if (dss != null) { + for (VcDatastore ds : dss) { + try { + ds.update(); + } catch (Exception e) { + logger.info("failed to update datastore " + ds.getName() + + ", ignore this error.", e); + } + } + } + try { + List hosts = vcCluster.getHosts(); + if (hosts != null) { + for (VcHost host : hosts) { + try { + host.update(); + } catch (Exception e) { + logger.info("failed to update host " + host.getName() + + ", ignore this error.", e); + } + } + } + } catch (Exception e) { + logger.info("failed to get host list on cluster " + vcCluster.getName() + + ", ignore this error.", e); + } + return null; + } + }); + } + } + public static void refreshResourcePool(final VcCluster cl) { VcContext.inVcSessionDo(new VcSession() { @Override