Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enforce distinct hostnames network #10212

Open
wants to merge 3 commits into
base: 4.19
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,

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

List<NetworkVO> listByNetworkDomains(List<String> uniqueNtwkDomains);

List<NetworkVO> listByNetworkDomainsAndAccountIds(List<String> uniqueNtwkDomains, List<Long> accountIds);

List<NetworkVO> listByNetworkDomainsAndDomainIds(List<String> uniqueNtwkDomains, List<Long> domainIds);

/**
* Retrieves the next available mac address in this network configuration.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@

GenericSearchBuilder<NetworkVO, Long> GarbageCollectedSearch;
SearchBuilder<NetworkVO> PrivateNetworkSearch;
SearchBuilder<NetworkVO> NetworkDomainSearch;

@Inject
ResourceTagDao _tagsDao;
Expand Down Expand Up @@ -198,6 +199,12 @@
PersistentNetworkSearch.join("persistent", persistentNtwkOffJoin, PersistentNetworkSearch.entity().getNetworkOfferingId(), persistentNtwkOffJoin.entity().getId(), JoinType.INNER);
PersistentNetworkSearch.done();

NetworkDomainSearch = createSearchBuilder();
NetworkDomainSearch.and("networkDomains", NetworkDomainSearch.entity().getNetworkDomain(), Op.IN);
NetworkDomainSearch.and("accounts", NetworkDomainSearch.entity().getAccountId(), Op.IN);
NetworkDomainSearch.and("domains", NetworkDomainSearch.entity().getDomainId(), Op.IN);
NetworkDomainSearch.done();

Check warning on line 206 in engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java#L202-L206

Added lines #L202 - L206 were not covered by tests

PhysicalNetworkSearch = createSearchBuilder();
PhysicalNetworkSearch.and("physicalNetworkId", PhysicalNetworkSearch.entity().getPhysicalNetworkId(), Op.EQ);
PhysicalNetworkSearch.done();
Expand Down Expand Up @@ -429,6 +436,29 @@
return search(sc, null);
}

@Override
public List<NetworkVO> listByNetworkDomains(List<String> uniqueNtwkDomains) {
SearchCriteria<NetworkVO> sc = NetworkDomainSearch.create();
sc.setParameters("networkDomains", uniqueNtwkDomains.toArray());
return search(sc, null);
}

Check warning on line 444 in engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java#L440-L444

Added lines #L440 - L444 were not covered by tests

@Override
public List<NetworkVO> listByNetworkDomainsAndAccountIds(List<String> uniqueNtwkDomains, List<Long> accountIds) {
SearchCriteria<NetworkVO> sc = NetworkDomainSearch.create();
sc.setParameters("networkDomains", uniqueNtwkDomains.toArray());
sc.setParameters("accounts", accountIds.toArray());
return search(sc, null);
}

Check warning on line 452 in engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java#L447-L452

Added lines #L447 - L452 were not covered by tests

@Override
public List<NetworkVO> listByNetworkDomainsAndDomainIds(List<String> uniqueNtwkDomains, List<Long> domainIds) {
SearchCriteria<NetworkVO> sc = NetworkDomainSearch.create();
sc.setParameters("networkDomains", uniqueNtwkDomains.toArray());
sc.setParameters("domains", domainIds.toArray());
return search(sc, null);
}

Check warning on line 460 in engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

View check run for this annotation

Codecov / codecov/patch

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java#L455-L460

Added lines #L455 - L460 were not covered by tests

@Override
public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) {
final SequenceFetcher fetch = SequenceFetcher.getInstance();
Expand Down
6 changes: 6 additions & 0 deletions server/src/main/java/com/cloud/vm/UserVmManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ public interface UserVmManager extends UserVmService {
"Destroys the VM's root volume when the VM is destroyed.",
true, ConfigKey.Scope.Domain);

ConfigKey<String> VmDistinctHostNameScope = new ConfigKey<>(String.class, "vm.distinct.hostname.scope", ConfigKey.CATEGORY_ADVANCED,
"network",
"Scope of resources to check while checking if the hostname is unique. Possible values are global, domain, subdomain, account, network.",
true, ConfigKey.Scope.Global, null, "VM distinct hostname scope", null, null, null, ConfigKey.Kind.Select,
"global,domain,subdomain,account,network");

static final int MAX_USER_DATA_LENGTH_BYTES = 2048;

public static final String CKS_NODE = "cksnode";
Expand Down
74 changes: 63 additions & 11 deletions server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4429,23 +4429,75 @@
}
}

private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<? extends Network> networkList) {
// Check that hostName is unique in the network domain
Map<String, List<Long>> ntwkDomains = new HashMap<String, List<Long>>();
private List<NetworkVO> getNetworksWithSameNetworkDomainInDomains(List<NetworkVO> networkList, boolean checkSubDomains) {
List<String> uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toList());
List<Long> domainIdList = new ArrayList<>();

Check warning on line 4434 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4432-L4434

Added lines #L4432 - L4434 were not covered by tests
for (Network network : networkList) {
domainIdList.add(network.getDomainId());
}
Set<Long> finalDomainIdList = new HashSet<>(domainIdList);

Check warning on line 4438 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4436-L4438

Added lines #L4436 - L4438 were not covered by tests
if (checkSubDomains) {
for (Long domainId : domainIdList) {
DomainVO domain = _domainDao.findById(domainId);
List<Long> childDomainIds = _domainDao.getDomainChildrenIds(domain.getPath());
finalDomainIdList.addAll(childDomainIds);
}
}
return _networkDao.listByNetworkDomainsAndDomainIds(uniqueNtwkDomains, finalDomainIdList.stream().collect(Collectors.toList()));
}

Check warning on line 4447 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4441-L4447

Added lines #L4441 - L4447 were not covered by tests

private List<NetworkVO> getNetworksForCheckUniqueHostName(List<NetworkVO> networkList) {
List<NetworkVO> finalNetworkList;
List<String> uniqueNtwkDomains;

Check warning on line 4451 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4449-L4451

Added lines #L4449 - L4451 were not covered by tests
switch (VmDistinctHostNameScope.value()) {
case "global":
uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toList());
finalNetworkList = _networkDao.listByNetworkDomains(uniqueNtwkDomains);
break;

Check warning on line 4456 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4454-L4456

Added lines #L4454 - L4456 were not covered by tests
case "domain":
finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, false);
break;

Check warning on line 4459 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4458-L4459

Added lines #L4458 - L4459 were not covered by tests
case "subdomain":
finalNetworkList = getNetworksWithSameNetworkDomainInDomains(networkList, true);
break;

Check warning on line 4462 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4461-L4462

Added lines #L4461 - L4462 were not covered by tests
case "account":
uniqueNtwkDomains = networkList.stream().map(NetworkVO::getNetworkDomain).collect(Collectors.toList());
List<Long> accountIds = networkList.stream().map(Network::getAccountId).collect(Collectors.toList());
finalNetworkList = _networkDao.listByNetworkDomainsAndAccountIds(uniqueNtwkDomains, accountIds);
break;

Check warning on line 4467 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4464-L4467

Added lines #L4464 - L4467 were not covered by tests
default:
Set<Long> vpcIds = networkList.stream().map(Network::getVpcId).filter(Objects::nonNull).collect(Collectors.toSet());
finalNetworkList = new ArrayList<>(networkList);

Check warning on line 4470 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4469-L4470

Added lines #L4469 - L4470 were not covered by tests
for (Long vpcId : vpcIds) {
finalNetworkList.addAll(_networkDao.listByVpc(vpcId));
}
break;

Check warning on line 4474 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4472-L4474

Added lines #L4472 - L4474 were not covered by tests
}
return finalNetworkList;
}

Check warning on line 4477 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4476-L4477

Added lines #L4476 - L4477 were not covered by tests

private Map<String, Set<Long>> getNetworkIdPerNetworkDomain(List<NetworkVO> networkList) {
Map<String, Set<Long>> ntwkDomains = new HashMap<>();

Check warning on line 4480 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4479-L4480

Added lines #L4479 - L4480 were not covered by tests

List<NetworkVO> updatedNetworkList = getNetworksForCheckUniqueHostName(networkList);

Check warning on line 4482 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L4482 was not covered by tests
for (Network network : updatedNetworkList) {
String ntwkDomain = network.getNetworkDomain();
Set<Long> ntwkIds;

Check warning on line 4485 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L4485 was not covered by tests
if (!ntwkDomains.containsKey(ntwkDomain)) {
List<Long> ntwkIds = new ArrayList<Long>();
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);
ntwkIds = new HashSet<>();

Check warning on line 4487 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L4487 was not covered by tests
} else {
List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);
ntwkIds = ntwkDomains.get(ntwkDomain);

Check warning on line 4489 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L4489 was not covered by tests
}
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);

Check warning on line 4492 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4491-L4492

Added lines #L4491 - L4492 were not covered by tests
}
return ntwkDomains;
}

Check warning on line 4495 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java#L4494-L4495

Added lines #L4494 - L4495 were not covered by tests

for (Entry<String, List<Long>> ntwkDomain : ntwkDomains.entrySet()) {
private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<NetworkVO> networkList) {

Check warning on line 4497 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L4497 was not covered by tests
// Check that hostName is unique
Map<String, Set<Long>> ntwkDomains = getNetworkIdPerNetworkDomain(networkList);

Check warning on line 4499 in server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

View check run for this annotation

Codecov / codecov/patch

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

Added line #L4499 was not covered by tests
for (Entry<String, Set<Long>> ntwkDomain : ntwkDomains.entrySet()) {
for (Long ntwkId : ntwkDomain.getValue()) {
// * get all vms hostNames in the network
List<String> hostNames = _vmInstanceDao.listDistinctHostNames(ntwkId);
Expand Down Expand Up @@ -8222,7 +8274,7 @@
public ConfigKey<?>[] getConfigKeys() {
return new ConfigKey<?>[] {EnableDynamicallyScaleVm, AllowDiskOfferingChangeDuringScaleVm, AllowUserExpungeRecoverVm, VmIpFetchWaitInterval, VmIpFetchTrialMax,
VmIpFetchThreadPoolMax, VmIpFetchTaskWorkers, AllowDeployVmIfGivenHostFails, EnableAdditionalVmConfig, DisplayVMOVFProperties,
KvmAdditionalConfigAllowList, XenServerAdditionalConfigAllowList, VmwareAdditionalConfigAllowList, DestroyRootVolumeOnVmDestruction};
KvmAdditionalConfigAllowList, XenServerAdditionalConfigAllowList, VmwareAdditionalConfigAllowList, DestroyRootVolumeOnVmDestruction, VmDistinctHostNameScope};
}

@Override
Expand Down
15 changes: 15 additions & 0 deletions server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,19 @@ public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String
public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
return null;
}

@Override
public List<NetworkVO> listByNetworkDomains(List<String> uniqueNtwkDomains) {
return List.of();
}

@Override
public List<NetworkVO> listByNetworkDomainsAndAccountIds(List<String> uniqueNtwkDomains, List<Long> accountIds) {
return List.of();
}

@Override
public List<NetworkVO> listByNetworkDomainsAndDomainIds(List<String> uniqueNtwkDomains, List<Long> domainIds) {
return List.of();
}
}
Loading