diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java index 6ba7c365215..1e4c8b66c0e 100644 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java @@ -136,4 +136,6 @@ public interface VMInstanceDao extends GenericDao, StateDao< void resetHostPowerStateTracking(long hostId); HashMap countVgpuVMs(Long dcId, Long podId, Long clusterId); + + VMInstanceVO findVMByHostNameInZone(String hostName, long zoneId); } diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index df023bfcf79..3eabbdb7499 100644 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -85,6 +85,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem protected SearchBuilder HostUpSearch; protected SearchBuilder InstanceNameSearch; protected SearchBuilder HostNameSearch; + protected SearchBuilder HostNameAndZoneSearch; protected GenericSearchBuilder FindIdsOfVirtualRoutersByAccount; protected GenericSearchBuilder CountRunningByHost; protected GenericSearchBuilder CountRunningByAccount; @@ -218,6 +219,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem HostNameSearch.and("hostName", HostNameSearch.entity().getHostName(), Op.EQ); HostNameSearch.done(); + HostNameAndZoneSearch = createSearchBuilder(); + HostNameAndZoneSearch.and("hostName", HostNameAndZoneSearch.entity().getHostName(), Op.EQ); + HostNameAndZoneSearch.and("zone", HostNameAndZoneSearch.entity().getDataCenterId(), Op.EQ); + HostNameAndZoneSearch.done(); + FindIdsOfVirtualRoutersByAccount = createSearchBuilder(Long.class); FindIdsOfVirtualRoutersByAccount.selectFields(FindIdsOfVirtualRoutersByAccount.entity().getId()); FindIdsOfVirtualRoutersByAccount.and("account", FindIdsOfVirtualRoutersByAccount.entity().getAccountId(), SearchCriteria.Op.EQ); @@ -414,6 +420,14 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem return findOneBy(sc); } + @Override + public VMInstanceVO findVMByHostNameInZone(String hostName, long zoneId) { + SearchCriteria sc = HostNameAndZoneSearch.create(); + sc.setParameters("hostName", hostName); + sc.setParameters("zone", zoneId); + 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 22f27691c07..c74c74efc7e 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2919,6 +2919,12 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir hostName = generateHostName(uuidName); } } + // If global config vm.instancename.flag is set to true, then CS will set guest VM's name as it appears on the hypervisor, to its hostname. + // In case of VMware since VM name must be unique within a DC, check if VM with the same hostname already exists in the zone. + VMInstanceVO vmByHostName = _vmInstanceDao.findVMByHostNameInZone(hostName, zone.getId()); + if (vmByHostName != null && vmByHostName.getState() != VirtualMachine.State.Expunging) { + throw new InvalidParameterValueException("There already exists a VM by the name: " + hostName + "."); + } } else { if (hostName == null) { //Generate name using uuid and instance.name global config