@@ -4849,23 +4849,75 @@ protected void verifyIfHypervisorSupportsRootdiskSizeOverride(HypervisorType hyp
48494849 }
48504850 }
48514851
4852- private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<? extends Network > networkList) {
4853- // Check that hostName is unique in the network domain
4854- Map<String, List< Long>> ntwkDomains = new HashMap<String, List<Long> >();
4852+ private List<NetworkVO> getNetworksWithSameNetworkDomainInDomains( List<NetworkVO > networkList, boolean checkSubDomains ) {
4853+ Set<String> uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toSet());
4854+ Set< Long> domainIdList = new HashSet< >();
48554855 for (Network network : networkList) {
4856+ domainIdList.add(network.getDomainId());
4857+ }
4858+ Set<Long> finalDomainIdSet = new HashSet<>(domainIdList);
4859+ if (checkSubDomains) {
4860+ for (Long domainId : domainIdList) {
4861+ DomainVO domain = _domainDao.findById(domainId);
4862+ List<Long> childDomainIds = _domainDao.getDomainChildrenIds(domain.getPath());
4863+ finalDomainIdSet.addAll(childDomainIds);
4864+ }
4865+ }
4866+ return _networkDao.listByNetworkDomainsAndDomainIds(uniqueNtwkDomains, finalDomainIdSet);
4867+ }
4868+
4869+ private List<NetworkVO> getNetworksForCheckUniqueHostName(List<NetworkVO> networkList) {
4870+ List<NetworkVO> finalNetworkList;
4871+ Set<String> uniqueNtwkDomains;
4872+ switch (VmDistinctHostNameScope.value()) {
4873+ case "global":
4874+ uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toSet());
4875+ finalNetworkList = _networkDao.listByNetworkDomains(uniqueNtwkDomains);
4876+ break;
4877+ case "domain":
4878+ finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, false);
4879+ break;
4880+ case "subdomain":
4881+ finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, true);
4882+ break;
4883+ case "account":
4884+ uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toSet());
4885+ Set<Long> accountIds = networkList.stream().map(Network::getAccountId).collect(Collectors.toSet());
4886+ finalNetworkList = _networkDao.listByNetworkDomainsAndAccountIds(uniqueNtwkDomains, accountIds);
4887+ break;
4888+ default:
4889+ Set<Long> vpcIds = networkList.stream().map(Network::getVpcId).filter(Objects::nonNull).collect(Collectors.toSet());
4890+ finalNetworkList = new ArrayList<>(networkList);
4891+ for (Long vpcId : vpcIds) {
4892+ finalNetworkList.addAll(_networkDao.listByVpc(vpcId));
4893+ }
4894+ break;
4895+ }
4896+ return finalNetworkList;
4897+ }
4898+
4899+ private Map<String, Set<Long>> getNetworkIdPerNetworkDomain(List<NetworkVO> networkList) {
4900+ Map<String, Set<Long>> ntwkDomains = new HashMap<>();
4901+
4902+ List<NetworkVO> updatedNetworkList = getNetworksForCheckUniqueHostName(networkList);
4903+ for (Network network : updatedNetworkList) {
48564904 String ntwkDomain = network.getNetworkDomain();
4905+ Set<Long> ntwkIds;
48574906 if (!ntwkDomains.containsKey(ntwkDomain)) {
4858- List<Long> ntwkIds = new ArrayList<Long>();
4859- ntwkIds.add(network.getId());
4860- ntwkDomains.put(ntwkDomain, ntwkIds);
4907+ ntwkIds = new HashSet<>();
48614908 } else {
4862- List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
4863- ntwkIds.add(network.getId());
4864- ntwkDomains.put(ntwkDomain, ntwkIds);
4909+ ntwkIds = ntwkDomains.get(ntwkDomain);
48654910 }
4911+ ntwkIds.add(network.getId());
4912+ ntwkDomains.put(ntwkDomain, ntwkIds);
48664913 }
4914+ return ntwkDomains;
4915+ }
48674916
4868- for (Entry<String, List<Long>> ntwkDomain : ntwkDomains.entrySet()) {
4917+ private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<NetworkVO> networkList) {
4918+ // Check that hostName is unique
4919+ Map<String, Set<Long>> ntwkDomains = getNetworkIdPerNetworkDomain(networkList);
4920+ for (Entry<String, Set<Long>> ntwkDomain : ntwkDomains.entrySet()) {
48694921 for (Long ntwkId : ntwkDomain.getValue()) {
48704922 // * get all vms hostNames in the network
48714923 List<String> hostNames = _vmInstanceDao.listDistinctHostNames(ntwkId);
@@ -9465,7 +9517,7 @@ public ConfigKey<?>[] getConfigKeys() {
94659517 return new ConfigKey<?>[] {EnableDynamicallyScaleVm, AllowDiskOfferingChangeDuringScaleVm, AllowUserExpungeRecoverVm, VmIpFetchWaitInterval, VmIpFetchTrialMax,
94669518 VmIpFetchThreadPoolMax, VmIpFetchTaskWorkers, AllowDeployVmIfGivenHostFails, EnableAdditionalVmConfig, DisplayVMOVFProperties,
94679519 KvmAdditionalConfigAllowList, XenServerAdditionalConfigAllowList, VmwareAdditionalConfigAllowList, DestroyRootVolumeOnVmDestruction,
9468- EnforceStrictResourceLimitHostTagCheck, StrictHostTags, AllowUserForceStopVm, EnableVmNetwokFilterAllowAllTraffic};
9520+ EnforceStrictResourceLimitHostTagCheck, StrictHostTags, AllowUserForceStopVm, EnableVmNetwokFilterAllowAllTraffic, VmDistinctHostNameScope };
94699521 }
94709522
94719523 @Override
0 commit comments