Skip to content

Commit 6cb5e27

Browse files
committed
Check for unique hostnames for all networks in the vpc
1 parent 3159fa7 commit 6cb5e27

File tree

5 files changed

+119
-11
lines changed

5 files changed

+119
-11
lines changed

engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
4747

4848
int getOtherPersistentNetworksCount(long id, String broadcastURI, boolean isPersistent);
4949

50+
List<NetworkVO> listByNetworkDomains(List<String> uniqueNtwkDomains);
51+
52+
List<NetworkVO> listByNetworkDomainsAndAccountIds(List<String> uniqueNtwkDomains, List<Long> accountIds);
53+
54+
List<NetworkVO> listByNetworkDomainsAndDomainIds(List<String> uniqueNtwkDomains, List<Long> domainIds);
55+
5056
/**
5157
* Retrieves the next available mac address in this network configuration.
5258
*

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long>implements Ne
8686

8787
GenericSearchBuilder<NetworkVO, Long> GarbageCollectedSearch;
8888
SearchBuilder<NetworkVO> PrivateNetworkSearch;
89+
SearchBuilder<NetworkVO> NetworkDomainSearch;
8990

9091
@Inject
9192
ResourceTagDao _tagsDao;
@@ -198,6 +199,12 @@ protected void init() {
198199
PersistentNetworkSearch.join("persistent", persistentNtwkOffJoin, PersistentNetworkSearch.entity().getNetworkOfferingId(), persistentNtwkOffJoin.entity().getId(), JoinType.INNER);
199200
PersistentNetworkSearch.done();
200201

202+
NetworkDomainSearch = createSearchBuilder();
203+
NetworkDomainSearch.and("networkDomains", NetworkDomainSearch.entity().getNetworkDomain(), Op.IN);
204+
NetworkDomainSearch.and("accounts", NetworkDomainSearch.entity().getAccountId(), Op.IN);
205+
NetworkDomainSearch.and("domains", NetworkDomainSearch.entity().getDomainId(), Op.IN);
206+
NetworkDomainSearch.done();
207+
201208
PhysicalNetworkSearch = createSearchBuilder();
202209
PhysicalNetworkSearch.and("physicalNetworkId", PhysicalNetworkSearch.entity().getPhysicalNetworkId(), Op.EQ);
203210
PhysicalNetworkSearch.done();
@@ -428,6 +435,29 @@ public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
428435
return search(sc, null);
429436
}
430437

438+
@Override
439+
public List<NetworkVO> listByNetworkDomains(List<String> uniqueNtwkDomains) {
440+
SearchCriteria<NetworkVO> sc = NetworkDomainSearch.create();
441+
sc.setParameters("networkDomains", uniqueNtwkDomains.toArray());
442+
return search(sc, null);
443+
}
444+
445+
@Override
446+
public List<NetworkVO> listByNetworkDomainsAndAccountIds(List<String> uniqueNtwkDomains, List<Long> accountIds) {
447+
SearchCriteria<NetworkVO> sc = NetworkDomainSearch.create();
448+
sc.setParameters("networkDomains", uniqueNtwkDomains.toArray());
449+
sc.setParameters("accounts", accountIds.toArray());
450+
return search(sc, null);
451+
}
452+
453+
@Override
454+
public List<NetworkVO> listByNetworkDomainsAndDomainIds(List<String> uniqueNtwkDomains, List<Long> domainIds) {
455+
SearchCriteria<NetworkVO> sc = NetworkDomainSearch.create();
456+
sc.setParameters("networkDomains", uniqueNtwkDomains.toArray());
457+
sc.setParameters("domains", domainIds.toArray());
458+
return search(sc, null);
459+
}
460+
431461
@Override
432462
public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) {
433463
final SequenceFetcher fetch = SequenceFetcher.getInstance();

server/src/main/java/com/cloud/vm/UserVmManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ public interface UserVmManager extends UserVmService {
8383
"If set to true, tags specified in `resource.limit.host.tags` are also included in vm.strict.host.tags.",
8484
true);
8585

86+
ConfigKey<String> VmDistinctHostNameScope = new ConfigKey<>(String.class, "vm.distinct.hostname.scope", ConfigKey.CATEGORY_ADVANCED,
87+
"network",
88+
"Scope of resources to check while checking if the hostname is unique. Possible values are global, domain, subdomain, account, network.",
89+
true, ConfigKey.Scope.Global, null, "VM distinct hostname scope", null, null, null, ConfigKey.Kind.Select,
90+
"global,domain,subdomain,account,network");
91+
8692
static final int MAX_USER_DATA_LENGTH_BYTES = 2048;
8793

8894
public static final String CKS_NODE = "cksnode";

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,18 @@ public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
265265
return null;
266266
}
267267

268+
@Override
269+
public List<NetworkVO> listByNetworkDomains(List<String> uniqueNtwkDomains) {
270+
return List.of();
271+
}
272+
273+
@Override
274+
public List<NetworkVO> listByNetworkDomainsAndAccountIds(List<String> uniqueNtwkDomains, List<Long> accountIds) {
275+
return List.of();
276+
}
277+
278+
@Override
279+
public List<NetworkVO> listByNetworkDomainsAndDomainIds(List<String> uniqueNtwkDomains, List<Long> domainIds) {
280+
return List.of();
281+
}
268282
}

0 commit comments

Comments
 (0)