server: consistent behaviour for list apis with project=-1 (#11767)

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
This commit is contained in:
Abhishek Kumar 2025-10-14 12:36:53 +05:30 committed by GitHub
parent a574f7ac99
commit dfcbd2e977
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 5 deletions

View File

@ -2563,7 +2563,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
} 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);
@ -2623,7 +2623,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
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;
}
@ -2642,7 +2642,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
} else {
accountSC.addAnd("accountId", SearchCriteria.Op.IN, permittedAccounts.toArray());
}
addProjectNetworksConditionToSearch(accountSC, skipProjectNetworks);
addProjectNetworksConditionToSearch(accountSC, skipProjectNetworks, projectId);
additionalSC.addOr("id", SearchCriteria.Op.SC, accountSC);
}
@ -2823,8 +2823,17 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
}
}
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) {
addProjectNetworksConditionToSearch(sc, skipProjectNetworks, null);
}
protected void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks,
Long projectId) {
if (!skipProjectNetworks && projectId == -1) {
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"));
}

View File

@ -114,6 +114,7 @@ import com.cloud.user.dao.UserDao;
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;
@ -1299,4 +1300,34 @@ public class NetworkServiceImplTest {
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);
}
}