Skip to content
Draft
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
24 changes: 14 additions & 10 deletions server/src/main/java/com/cloud/network/NetworkServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2557,12 +2557,12 @@ public Pair<List<? extends Network>, Integer> searchForNetworks(ListNetworksCmd
SearchCriteria<NetworkVO> sc = createNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
physicalNetworkId, networkOfferingId, null, restartRequired, specifyIpRanges,
vpcId, tags, display, vlanId, associatedNetworkId);
addProjectNetworksConditionToSearch(sc, true);
addProjectNetworksConditionToSearch(sc, true, null);
result = _networksDao.searchAndCount(sc, searchFilter);
} else {
SearchCriteria<NetworkVO> additionalSC = _networksDao.createSearchCriteria();

addAccountSpecificNetworksToSearch(additionalSC, sb, networkFilter, skipProjectNetworks, permittedAccounts, path, isRecursive);
addAccountSpecificNetworksToSearch(additionalSC, sb, networkFilter, skipProjectNetworks, permittedAccounts, path, isRecursive, projectId);
addDomainSpecificNetworksToSearch(additionalSC, sb, networkFilter, permittedAccounts, domainId, path, isRecursive);
addSharedNetworksToSearch(additionalSC, sb, networkFilter, permittedAccounts, path, isRecursive);

Expand Down Expand Up @@ -2622,7 +2622,7 @@ public Pair<List<? extends Network>, Integer> searchForNetworks(ListNetworksCmd

private void addAccountSpecificNetworksToSearch(SearchCriteria<NetworkVO> additionalSC, SearchBuilder<NetworkVO> sb,
Network.NetworkFilter networkFilter, boolean skipProjectNetworks,
List<Long> permittedAccounts, String path, boolean isRecursive) {
List<Long> permittedAccounts, String path, boolean isRecursive, Long projectId) {
if (!Arrays.asList(Network.NetworkFilter.Account, Network.NetworkFilter.AccountDomain, Network.NetworkFilter.All).contains(networkFilter)) {
return;
}
Expand All @@ -2641,7 +2641,7 @@ private void addAccountSpecificNetworksToSearch(SearchCriteria<NetworkVO> additi
} else {
accountSC.addAnd("accountId", SearchCriteria.Op.IN, permittedAccounts.toArray());
}
addProjectNetworksConditionToSearch(accountSC, skipProjectNetworks);
addProjectNetworksConditionToSearch(accountSC, skipProjectNetworks, projectId);
additionalSC.addOr("id", SearchCriteria.Op.SC, accountSC);
}

Expand Down Expand Up @@ -2785,7 +2785,7 @@ private void addDomainLevelNetworksToSearch(SearchCriteria<NetworkVO> additional
SearchCriteria<NetworkVO> domainSC = sb.create();
domainSC.addAnd("id", SearchCriteria.Op.IN, networkIds.toArray());
domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString());
addProjectNetworksConditionToSearch(domainSC, true);
addProjectNetworksConditionToSearch(domainSC, true, null);
additionalSC.addOr("id", SearchCriteria.Op.SC, domainSC);
}
}
Expand Down Expand Up @@ -2813,13 +2813,17 @@ private void addDomainNetworksByDomainPathToSearch(SearchCriteria<NetworkVO> add
SearchCriteria<NetworkVO> domainSC = sb.create();
domainSC.addAnd("id", SearchCriteria.Op.IN, networkIds.toArray());
domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString());
addProjectNetworksConditionToSearch(domainSC, true);
addProjectNetworksConditionToSearch(domainSC, true, null);
additionalSC.addOr("id", SearchCriteria.Op.SC, domainSC);
}
}

Copy link
Preview

Copilot AI Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The method signature change from private to protected and adding a Long parameter is a breaking change for subclasses. Consider maintaining backward compatibility by overloading the method instead of changing the existing signature.

Suggested change
/**
* Original method signature for backward compatibility.
*/
private void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks) {
sc.getJoin("account").addAnd("type", skipProjectNetworks ? Op.NEQ : Op.EQ, Account.Type.PROJECT);
sc.addAnd("id", Op.SC, sc.getJoin("account"));
}
/**
* Overloaded method with additional projectId parameter.
*/

Copilot uses AI. Check for mistakes.

private void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks) {
sc.getJoin("account").addAnd("type", skipProjectNetworks ? Op.NEQ : Op.EQ, Account.Type.PROJECT);
protected void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks, Long projectId) {
if (!skipProjectNetworks && projectId == -1) {
Copy link
Preview

Copilot AI Oct 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comparison projectId == -1 will fail if projectId is null. Since the method signature accepts Long projectId (which can be null), this should use Long.valueOf(-1L).equals(projectId) or add a null check first.

Suggested change
if (!skipProjectNetworks && projectId == -1) {
if (!skipProjectNetworks && Long.valueOf(-1L).equals(projectId)) {

Copilot uses AI. Check for mistakes.

sc.getJoin("account").addAnd("type", Op.NNULL);
} else {
sc.getJoin("account").addAnd("type", skipProjectNetworks ? Op.NEQ : Op.EQ, Account.Type.PROJECT);
}
sc.addAnd("id", Op.SC, sc.getJoin("account"));
}

Expand All @@ -2829,7 +2833,7 @@ private void addSharedNetworksByAccountsToSearch(SearchCriteria<NetworkVO> addit
if (!sharedNetworkIds.isEmpty()) {
SearchCriteria<NetworkVO> ssc = sb.create();
ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray());
addProjectNetworksConditionToSearch(ssc, true);
addProjectNetworksConditionToSearch(ssc, true, null);
additionalSC.addOr("id", SearchCriteria.Op.SC, ssc);
}
}
Expand Down Expand Up @@ -2859,7 +2863,7 @@ private void addSharedNetworksByDomainPathToSearch(SearchCriteria<NetworkVO> add
if (!sharedNetworkIds.isEmpty()) {
SearchCriteria<NetworkVO> ssc = sb.create();
ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray());
addProjectNetworksConditionToSearch(ssc, true);
addProjectNetworksConditionToSearch(ssc, true, null);
additionalSC.addOr("id", SearchCriteria.Op.SC, ssc);
}
}
Expand Down
31 changes: 31 additions & 0 deletions server/src/test/java/com/cloud/network/NetworkServiceImplTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@
import com.cloud.utils.Pair;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.vm.DomainRouterVO;
Expand Down Expand Up @@ -1299,4 +1300,34 @@ public void testGetIpAddressesFromIps() {
Assert.assertEquals("Mac address is not valid: invalid-mac", e.getMessage());
}
}

@Test
public void addProjectNetworksConditionToSearch_includesProjectNetworksWhenNotSkipped() {
SearchCriteria<NetworkVO> sc = Mockito.mock(SearchCriteria.class);
SearchCriteria accountJoin = Mockito.mock(SearchCriteria.class);
Mockito.when(sc.getJoin("account")).thenReturn(accountJoin);
service.addProjectNetworksConditionToSearch(sc, false, -1L);
Mockito.verify(accountJoin).addAnd("type", SearchCriteria.Op.NNULL);
Mockito.verify(sc).addAnd("id", SearchCriteria.Op.SC, accountJoin);
}

@Test
public void addProjectNetworksConditionToSearch_excludesProjectNetworksWhenSkipped() {
SearchCriteria<NetworkVO> sc = Mockito.mock(SearchCriteria.class);
SearchCriteria accountJoin = Mockito.mock(SearchCriteria.class);
Mockito.when(sc.getJoin("account")).thenReturn(accountJoin);
service.addProjectNetworksConditionToSearch(sc, true, -1L);
Mockito.verify(accountJoin).addAnd("type", SearchCriteria.Op.NEQ, Account.Type.PROJECT);
Mockito.verify(sc).addAnd("id", SearchCriteria.Op.SC, accountJoin);
}

@Test
public void addProjectNetworksConditionToSearch_includesSpecificProjectWhenProjectIdProvided() {
SearchCriteria<NetworkVO> sc = Mockito.mock(SearchCriteria.class);
SearchCriteria accountJoin = Mockito.mock(SearchCriteria.class);
Mockito.when(sc.getJoin("account")).thenReturn(accountJoin);
service.addProjectNetworksConditionToSearch(sc, false, 123L);
Mockito.verify(accountJoin).addAnd("type", SearchCriteria.Op.EQ, Account.Type.PROJECT);
Mockito.verify(sc).addAnd("id", SearchCriteria.Op.SC, accountJoin);
}
}
Loading