diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 1c0614cb74e..8866eb2dad6 100755 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -29,6 +29,7 @@ import java.util.Set; import javax.ejb.Local; import javax.naming.ConfigurationException; +import javax.persistence.EntityExistsException; import org.apache.log4j.Logger; import org.apache.xmlrpc.XmlRpcException; @@ -78,7 +79,6 @@ import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; -import com.cloud.resource.ResourceStateAdapter.DeleteHostAnswer; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.VMTemplateVO; @@ -87,6 +87,9 @@ import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.user.Account; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.Inject; +import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.SearchCriteria2; +import com.cloud.utils.db.SearchCriteriaService; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.HypervisorVersionChangedException; import com.xensource.xenapi.Connection; @@ -124,6 +127,26 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L protected XcpServerDiscoverer() { } + void setClusterGuid(ClusterVO cluster, String guid) { + cluster.setGuid(guid); + try { + _clusterDao.update(cluster.getId(), cluster); + } catch (EntityExistsException e) { + SearchCriteriaService sc = SearchCriteria2.create(ClusterVO.class); + sc.addAnd(sc.getEntity().getGuid(), Op.EQ, guid); + List clusters = sc.list(); + ClusterVO clu = clusters.get(0); + List clusterHosts = _resourceMgr.listAllHostsInCluster(clu.getId()); + if (clusterHosts == null || clusterHosts.size() == 0) { + clu.setGuid(null); + _clusterDao.update(clu.getId(), clu); + _clusterDao.update(cluster.getId(), cluster); + return; + } + throw e; + } + } + @Override public Map> find(long dcId, Long podId, Long clusterId, URI url, String username, String password, List hostTags) throws DiscoveryException { Map> resources = new HashMap>(); @@ -180,7 +203,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L /*set cluster hypervisor type to xenserver*/ ClusterVO clu = _clusterDao.findById(clusterId); if ( clu.getGuid()== null ) { - clu.setGuid(poolUuid); + setClusterGuid(clu, poolUuid); } else { List clusterHosts = _resourceMgr.listAllHostsInCluster(clusterId); if( clusterHosts != null && clusterHosts.size() > 0) { @@ -198,7 +221,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } } } else { - clu.setGuid(poolUuid); + setClusterGuid(clu, poolUuid); } } // can not use this conn after this point, because this host may join a pool, this conn is retired