From f00140243c8628757a1474310af192eb932aab6e Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Wed, 12 Nov 2014 17:27:21 +0530 Subject: [PATCH] CLOUDSTACK-8112. CS allows creation of VM's with the same Display name when vm.instancename.flag is set to true. During VM creation, if vm.instancename.flag is set to true and hypervisor type is VMware, check if VM with the same hostname already exists in the zone. (cherry picked from commit 5f9e4fddf303f312a0b17abc0d837f28042caeda) Signed-off-by: Rohit Yadav --- .../schema/src/com/cloud/vm/dao/VMInstanceDao.java | 2 ++ .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 14 ++++++++++++++ server/src/com/cloud/vm/UserVmManagerImpl.java | 6 ++++++ 3 files changed, 22 insertions(+) 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