@@ -4698,23 +4698,75 @@ protected void verifyIfHypervisorSupportsRootdiskSizeOverride(HypervisorType hyp
46984698 }
46994699 }
47004700
4701- private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<? extends Network > networkList) {
4702- // Check that hostName is unique in the network domain
4703- Map<String, List< Long>> ntwkDomains = new HashMap<String, List<Long> >();
4701+ private List<NetworkVO> getNetworksWithSameNetworkDomainInDomains( List<NetworkVO > networkList, boolean checkSubDomains ) {
4702+ Set<String> uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toSet());
4703+ Set< Long> domainIdList = new HashSet< >();
47044704 for (Network network : networkList) {
4705+ domainIdList.add(network.getDomainId());
4706+ }
4707+ Set<Long> finalDomainIdSet = new HashSet<>(domainIdList);
4708+ if (checkSubDomains) {
4709+ for (Long domainId : domainIdList) {
4710+ DomainVO domain = _domainDao.findById(domainId);
4711+ List<Long> childDomainIds = _domainDao.getDomainChildrenIds(domain.getPath());
4712+ finalDomainIdSet.addAll(childDomainIds);
4713+ }
4714+ }
4715+ return _networkDao.listByNetworkDomainsAndDomainIds(uniqueNtwkDomains, finalDomainIdSet);
4716+ }
4717+
4718+ private List<NetworkVO> getNetworksForCheckUniqueHostName(List<NetworkVO> networkList) {
4719+ List<NetworkVO> finalNetworkList;
4720+ Set<String> uniqueNtwkDomains;
4721+ switch (VmDistinctHostNameScope.value()) {
4722+ case "global":
4723+ uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toSet());
4724+ finalNetworkList = _networkDao.listByNetworkDomains(uniqueNtwkDomains);
4725+ break;
4726+ case "domain":
4727+ finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, false);
4728+ break;
4729+ case "subdomain":
4730+ finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, true);
4731+ break;
4732+ case "account":
4733+ uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toSet());
4734+ Set<Long> accountIds = networkList.stream().map(Network::getAccountId).collect(Collectors.toSet());
4735+ finalNetworkList = _networkDao.listByNetworkDomainsAndAccountIds(uniqueNtwkDomains, accountIds);
4736+ break;
4737+ default:
4738+ Set<Long> vpcIds = networkList.stream().map(Network::getVpcId).filter(Objects::nonNull).collect(Collectors.toSet());
4739+ finalNetworkList = new ArrayList<>(networkList);
4740+ for (Long vpcId : vpcIds) {
4741+ finalNetworkList.addAll(_networkDao.listByVpc(vpcId));
4742+ }
4743+ break;
4744+ }
4745+ return finalNetworkList;
4746+ }
4747+
4748+ private Map<String, Set<Long>> getNetworkIdPerNetworkDomain(List<NetworkVO> networkList) {
4749+ Map<String, Set<Long>> ntwkDomains = new HashMap<>();
4750+
4751+ List<NetworkVO> updatedNetworkList = getNetworksForCheckUniqueHostName(networkList);
4752+ for (Network network : updatedNetworkList) {
47054753 String ntwkDomain = network.getNetworkDomain();
4754+ Set<Long> ntwkIds;
47064755 if (!ntwkDomains.containsKey(ntwkDomain)) {
4707- List<Long> ntwkIds = new ArrayList<Long>();
4708- ntwkIds.add(network.getId());
4709- ntwkDomains.put(ntwkDomain, ntwkIds);
4756+ ntwkIds = new HashSet<>();
47104757 } else {
4711- List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
4712- ntwkIds.add(network.getId());
4713- ntwkDomains.put(ntwkDomain, ntwkIds);
4758+ ntwkIds = ntwkDomains.get(ntwkDomain);
47144759 }
4760+ ntwkIds.add(network.getId());
4761+ ntwkDomains.put(ntwkDomain, ntwkIds);
47154762 }
4763+ return ntwkDomains;
4764+ }
47164765
4717- for (Entry<String, List<Long>> ntwkDomain : ntwkDomains.entrySet()) {
4766+ private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<NetworkVO> networkList) {
4767+ // Check that hostName is unique
4768+ Map<String, Set<Long>> ntwkDomains = getNetworkIdPerNetworkDomain(networkList);
4769+ for (Entry<String, Set<Long>> ntwkDomain : ntwkDomains.entrySet()) {
47184770 for (Long ntwkId : ntwkDomain.getValue()) {
47194771 // * get all vms hostNames in the network
47204772 List<String> hostNames = _vmInstanceDao.listDistinctHostNames(ntwkId);
@@ -9284,7 +9336,7 @@ public ConfigKey<?>[] getConfigKeys() {
92849336 return new ConfigKey<?>[] {EnableDynamicallyScaleVm, AllowDiskOfferingChangeDuringScaleVm, AllowUserExpungeRecoverVm, VmIpFetchWaitInterval, VmIpFetchTrialMax,
92859337 VmIpFetchThreadPoolMax, VmIpFetchTaskWorkers, AllowDeployVmIfGivenHostFails, EnableAdditionalVmConfig, DisplayVMOVFProperties,
92869338 KvmAdditionalConfigAllowList, XenServerAdditionalConfigAllowList, VmwareAdditionalConfigAllowList, DestroyRootVolumeOnVmDestruction,
9287- EnforceStrictResourceLimitHostTagCheck, StrictHostTags, AllowUserForceStopVm};
9339+ EnforceStrictResourceLimitHostTagCheck, StrictHostTags, AllowUserForceStopVm, VmDistinctHostNameScope };
92889340 }
92899341
92909342 @Override
0 commit comments