@@ -4691,23 +4691,75 @@ protected void verifyIfHypervisorSupportsRootdiskSizeOverride(HypervisorType hyp
46914691 }
46924692 }
46934693
4694- private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<? extends Network > networkList) {
4695- // Check that hostName is unique in the network domain
4696- Map<String, List<Long>> ntwkDomains = new HashMap<String, List<Long> >();
4694+ private List<NetworkVO> getNetworksWithSameNetworkDomainInDomains( List<NetworkVO > networkList, boolean checkSubDomains ) {
4695+ List<String> uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toList());
4696+ List<Long> domainIdList = new ArrayList< >();
46974697 for (Network network : networkList) {
4698+ domainIdList.add(network.getDomainId());
4699+ }
4700+ Set<Long> finalDomainIdList = new HashSet<>(domainIdList);
4701+ if (checkSubDomains) {
4702+ for (Long domainId : domainIdList) {
4703+ DomainVO domain = _domainDao.findById(domainId);
4704+ List<Long> childDomainIds = _domainDao.getDomainChildrenIds(domain.getPath());
4705+ finalDomainIdList.addAll(childDomainIds);
4706+ }
4707+ }
4708+ return _networkDao.listByNetworkDomainsAndDomainIds(uniqueNtwkDomains, finalDomainIdList.stream().collect(Collectors.toList()));
4709+ }
4710+
4711+ private List<NetworkVO> getNetworksForCheckUniqueHostName(List<NetworkVO> networkList) {
4712+ List<NetworkVO> finalNetworkList;
4713+ List<String> uniqueNtwkDomains;
4714+ switch (VmDistinctHostNameScope.value()) {
4715+ case "global":
4716+ uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toList());
4717+ finalNetworkList = _networkDao.listByNetworkDomains(uniqueNtwkDomains);
4718+ break;
4719+ case "domain":
4720+ finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, false);
4721+ break;
4722+ case "subdomain":
4723+ finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, true);
4724+ break;
4725+ case "account":
4726+ uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toList());
4727+ List<Long> accountIds = networkList.stream().map(Network::getAccountId).collect(Collectors.toList());
4728+ finalNetworkList = _networkDao.listByNetworkDomainsAndAccountIds(uniqueNtwkDomains, accountIds);
4729+ break;
4730+ default:
4731+ Set<Long> vpcIds = networkList.stream().map(Network::getVpcId).filter(Objects::nonNull).collect(Collectors.toSet());
4732+ finalNetworkList = new ArrayList<>(networkList);
4733+ for (Long vpcId : vpcIds) {
4734+ finalNetworkList.addAll(_networkDao.listByVpc(vpcId));
4735+ }
4736+ break;
4737+ }
4738+ return finalNetworkList;
4739+ }
4740+
4741+ private Map<String, Set<Long>> getNetworkIdPerNetworkDomain(List<NetworkVO> networkList) {
4742+ Map<String, Set<Long>> ntwkDomains = new HashMap<>();
4743+
4744+ List<NetworkVO> updatedNetworkList = getNetworksForCheckUniqueHostName(networkList);
4745+ for (Network network : updatedNetworkList) {
46984746 String ntwkDomain = network.getNetworkDomain();
4747+ Set<Long> ntwkIds;
46994748 if (!ntwkDomains.containsKey(ntwkDomain)) {
4700- List<Long> ntwkIds = new ArrayList<Long>();
4701- ntwkIds.add(network.getId());
4702- ntwkDomains.put(ntwkDomain, ntwkIds);
4749+ ntwkIds = new HashSet<>();
47034750 } else {
4704- List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
4705- ntwkIds.add(network.getId());
4706- ntwkDomains.put(ntwkDomain, ntwkIds);
4751+ ntwkIds = ntwkDomains.get(ntwkDomain);
47074752 }
4753+ ntwkIds.add(network.getId());
4754+ ntwkDomains.put(ntwkDomain, ntwkIds);
47084755 }
4756+ return ntwkDomains;
4757+ }
47094758
4710- for (Entry<String, List<Long>> ntwkDomain : ntwkDomains.entrySet()) {
4759+ private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<NetworkVO> networkList) {
4760+ // Check that hostName is unique
4761+ Map<String, Set<Long>> ntwkDomains = getNetworkIdPerNetworkDomain(networkList);
4762+ for (Entry<String, Set<Long>> ntwkDomain : ntwkDomains.entrySet()) {
47114763 for (Long ntwkId : ntwkDomain.getValue()) {
47124764 // * get all vms hostNames in the network
47134765 List<String> hostNames = _vmInstanceDao.listDistinctHostNames(ntwkId);
@@ -9244,7 +9296,7 @@ public ConfigKey<?>[] getConfigKeys() {
92449296 return new ConfigKey<?>[] {EnableDynamicallyScaleVm, AllowDiskOfferingChangeDuringScaleVm, AllowUserExpungeRecoverVm, VmIpFetchWaitInterval, VmIpFetchTrialMax,
92459297 VmIpFetchThreadPoolMax, VmIpFetchTaskWorkers, AllowDeployVmIfGivenHostFails, EnableAdditionalVmConfig, DisplayVMOVFProperties,
92469298 KvmAdditionalConfigAllowList, XenServerAdditionalConfigAllowList, VmwareAdditionalConfigAllowList, DestroyRootVolumeOnVmDestruction,
9247- EnforceStrictResourceLimitHostTagCheck, StrictHostTags, AllowUserForceStopVm};
9299+ EnforceStrictResourceLimitHostTagCheck, StrictHostTags, AllowUserForceStopVm, VmDistinctHostNameScope };
92489300 }
92499301
92509302 @Override
0 commit comments