Skip to content

Commit 3784800

Browse files
vishesh92dhslove
authored andcommitted
Enforce distinct hostnames network (apache#10212)
* Check for unique hostnames for all networks in the vpc * Address comments
1 parent 69a143f commit 3784800

File tree

5 files changed

+122
-11
lines changed

5 files changed

+122
-11
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.List;
2020
import java.util.Map;
21+
import java.util.Set;
2122

2223
import com.cloud.network.Network;
2324
import com.cloud.network.Network.GuestType;
@@ -47,6 +48,12 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
4748

4849
int getOtherPersistentNetworksCount(long id, String broadcastURI, boolean isPersistent);
4950

51+
List<NetworkVO> listByNetworkDomains(Set<String> uniqueNtwkDomains);
52+
53+
List<NetworkVO> listByNetworkDomainsAndAccountIds(Set<String> uniqueNtwkDomains, Set<Long> accountIds);
54+
55+
List<NetworkVO> listByNetworkDomainsAndDomainIds(Set<String> uniqueNtwkDomains, Set<Long> domainIds);
56+
5057
/**
5158
* Retrieves the next available mac address in this network configuration.
5259
*

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(Set<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(Set<String> uniqueNtwkDomains, Set<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(Set<String> uniqueNtwkDomains, Set<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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ public interface UserVmManager extends UserVmService {
8585
ConfigKey<Boolean> EnableVmNetwokFilterAllowAllTraffic = new ConfigKey<Boolean>("Advanced", Boolean.class, "enable.vm.network.filter.allow.all.traffic", "true",
8686
"If true, the network security feature is enabled when creating a virtual machine, tag: <filterref filter='allow-all-traffic'/> item is enabled.", true);
8787

88+
ConfigKey<String> VmDistinctHostNameScope = new ConfigKey<>(String.class, "vm.distinct.hostname.scope", ConfigKey.CATEGORY_ADVANCED,
89+
"network",
90+
"Defines the scope for enforcing unique VM hostnames which determines the resource boundary within which VM hostnames must be unique. Possible values: global, domain, subdomain, account, network.",
91+
true, ConfigKey.Scope.Global, null, "VM distinct hostname scope", null, null, null, ConfigKey.Kind.Select,
92+
"global,domain,subdomain,account,network");
93+
8894
ConfigKey<Boolean> EnableAdditionalVmConfig = new ConfigKey<>(
8995
"Advanced",
9096
Boolean.class,
@@ -94,6 +100,7 @@ public interface UserVmManager extends UserVmService {
94100
true,
95101
ConfigKey.Scope.Account);
96102

103+
97104
static final int MAX_USER_DATA_LENGTH_BYTES = 2048;
98105

99106
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
@@ -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

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.ArrayList;
3030
import java.util.List;
3131
import java.util.Map;
32+
import java.util.Set;
3233

3334
@DB()
3435
public class MockNetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements NetworkDao {
@@ -265,4 +266,18 @@ public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
265266
return null;
266267
}
267268

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

0 commit comments

Comments
 (0)