diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java index 830e4643251..e5640528ec1 100644 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java @@ -76,6 +76,8 @@ public interface VMInstanceDao extends GenericDao, StateDao< VMInstanceVO findVMByInstanceName(String name); + VMInstanceVO findVMByHostName(String hostName); + void updateProxyId(long id, Long proxyId, Date time); List listByHostIdTypes(long hostid, VirtualMachine.Type... types); diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index ffb1a0b8b3d..ec04085826e 100644 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -78,6 +78,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem protected SearchBuilder HostIdUpTypesSearch; protected SearchBuilder HostUpSearch; protected SearchBuilder InstanceNameSearch; + protected SearchBuilder HostNameSearch; protected GenericSearchBuilder CountVirtualRoutersByAccount; protected GenericSearchBuilder CountRunningByHost; protected GenericSearchBuilder CountRunningByAccount; @@ -192,6 +193,10 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem InstanceNameSearch.and("instanceName", InstanceNameSearch.entity().getInstanceName(), Op.EQ); InstanceNameSearch.done(); + HostNameSearch = createSearchBuilder(); + HostNameSearch.and("hostName", HostNameSearch.entity().getHostName(), Op.EQ); + HostNameSearch.done(); + CountVirtualRoutersByAccount = createSearchBuilder(Long.class); CountVirtualRoutersByAccount.select(null, Func.COUNT, null); CountVirtualRoutersByAccount.and("account", CountVirtualRoutersByAccount.entity().getAccountId(), SearchCriteria.Op.EQ); @@ -361,6 +366,13 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem return findOneBy(sc); } + @Override + public VMInstanceVO findVMByHostName(String hostName) { + SearchCriteria sc = HostNameSearch.create(); + sc.setParameters("hostName", hostName); + return findOneBy(sc); + } + @Override public void updateProxyId(long id, Long proxyId, Date time) { VMInstanceVO vo = createForUpdate(); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index f95123ee9e1..79e7f5ae6fc 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -870,14 +870,17 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use throw new CloudRuntimeException(vmInstance + " is in zone:" + vmInstance.getDataCenterId() + " but " + network + " is in zone:" + network.getDataCenterId()); } - if(_networkModel.getNicInNetwork(vmInstance.getId(),network.getId()) != null){ - s_logger.debug(vmInstance + " already in " + network + " going to add another NIC"); - } else { - //* get all vms hostNames in the network - List hostNames = _vmInstanceDao.listDistinctHostNames(network.getId()); - //* verify that there are no duplicates - if (hostNames.contains(vmInstance.getHostName())) { - throw new CloudRuntimeException(network + " already has a vm with host name: '" + vmInstance.getHostName()); + // Get all vms hostNames in the network + List hostNames = _vmInstanceDao.listDistinctHostNames(network.getId()); + // verify that there are no duplicates, listDistictHostNames could return hostNames even if the NIC + //in the network is removed, so also check if the NIC is present and then throw an exception. + //This will also check if there are multiple nics of same vm in the network + if (hostNames.contains(vmInstance.getHostName())) { + for (String hostName : hostNames) { + VMInstanceVO vm = _vmInstanceDao.findVMByHostName(hostName); + if(_networkModel.getNicInNetwork(vm.getId(),network.getId())!=null && vm.getHostName().equals(vmInstance.getHostName())) { + throw new CloudRuntimeException(network + " already has a vm with host name: " + vmInstance.getHostName()); + } } }