Skip to content

Commit 59069d4

Browse files
committed
server: consistent behaviour for list apis with project=-1
Fixes #9602 Fixes #11517 Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 2c1aad4 commit 59069d4

File tree

2 files changed

+45
-10
lines changed

2 files changed

+45
-10
lines changed

server/src/main/java/com/cloud/network/NetworkServiceImpl.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2557,12 +2557,12 @@ public Pair<List<? extends Network>, Integer> searchForNetworks(ListNetworksCmd
25572557
SearchCriteria<NetworkVO> sc = createNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
25582558
physicalNetworkId, networkOfferingId, null, restartRequired, specifyIpRanges,
25592559
vpcId, tags, display, vlanId, associatedNetworkId);
2560-
addProjectNetworksConditionToSearch(sc, true);
2560+
addProjectNetworksConditionToSearch(sc, true, null);
25612561
result = _networksDao.searchAndCount(sc, searchFilter);
25622562
} else {
25632563
SearchCriteria<NetworkVO> additionalSC = _networksDao.createSearchCriteria();
25642564

2565-
addAccountSpecificNetworksToSearch(additionalSC, sb, networkFilter, skipProjectNetworks, permittedAccounts, path, isRecursive);
2565+
addAccountSpecificNetworksToSearch(additionalSC, sb, networkFilter, skipProjectNetworks, permittedAccounts, path, isRecursive, projectId);
25662566
addDomainSpecificNetworksToSearch(additionalSC, sb, networkFilter, permittedAccounts, domainId, path, isRecursive);
25672567
addSharedNetworksToSearch(additionalSC, sb, networkFilter, permittedAccounts, path, isRecursive);
25682568

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

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

@@ -2785,7 +2785,7 @@ private void addDomainLevelNetworksToSearch(SearchCriteria<NetworkVO> additional
27852785
SearchCriteria<NetworkVO> domainSC = sb.create();
27862786
domainSC.addAnd("id", SearchCriteria.Op.IN, networkIds.toArray());
27872787
domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString());
2788-
addProjectNetworksConditionToSearch(domainSC, true);
2788+
addProjectNetworksConditionToSearch(domainSC, true, null);
27892789
additionalSC.addOr("id", SearchCriteria.Op.SC, domainSC);
27902790
}
27912791
}
@@ -2813,13 +2813,17 @@ private void addDomainNetworksByDomainPathToSearch(SearchCriteria<NetworkVO> add
28132813
SearchCriteria<NetworkVO> domainSC = sb.create();
28142814
domainSC.addAnd("id", SearchCriteria.Op.IN, networkIds.toArray());
28152815
domainSC.addAnd("aclType", SearchCriteria.Op.EQ, ACLType.Domain.toString());
2816-
addProjectNetworksConditionToSearch(domainSC, true);
2816+
addProjectNetworksConditionToSearch(domainSC, true, null);
28172817
additionalSC.addOr("id", SearchCriteria.Op.SC, domainSC);
28182818
}
28192819
}
28202820

2821-
private void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks) {
2822-
sc.getJoin("account").addAnd("type", skipProjectNetworks ? Op.NEQ : Op.EQ, Account.Type.PROJECT);
2821+
protected void addProjectNetworksConditionToSearch(SearchCriteria<NetworkVO> sc, boolean skipProjectNetworks, Long projectId) {
2822+
if (!skipProjectNetworks && projectId == -1) {
2823+
sc.getJoin("account").addAnd("type", Op.NNULL);
2824+
} else {
2825+
sc.getJoin("account").addAnd("type", skipProjectNetworks ? Op.NEQ : Op.EQ, Account.Type.PROJECT);
2826+
}
28232827
sc.addAnd("id", Op.SC, sc.getJoin("account"));
28242828
}
28252829

@@ -2829,7 +2833,7 @@ private void addSharedNetworksByAccountsToSearch(SearchCriteria<NetworkVO> addit
28292833
if (!sharedNetworkIds.isEmpty()) {
28302834
SearchCriteria<NetworkVO> ssc = sb.create();
28312835
ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray());
2832-
addProjectNetworksConditionToSearch(ssc, true);
2836+
addProjectNetworksConditionToSearch(ssc, true, null);
28332837
additionalSC.addOr("id", SearchCriteria.Op.SC, ssc);
28342838
}
28352839
}
@@ -2859,7 +2863,7 @@ private void addSharedNetworksByDomainPathToSearch(SearchCriteria<NetworkVO> add
28592863
if (!sharedNetworkIds.isEmpty()) {
28602864
SearchCriteria<NetworkVO> ssc = sb.create();
28612865
ssc.addAnd("id", SearchCriteria.Op.IN, sharedNetworkIds.toArray());
2862-
addProjectNetworksConditionToSearch(ssc, true);
2866+
addProjectNetworksConditionToSearch(ssc, true, null);
28632867
additionalSC.addOr("id", SearchCriteria.Op.SC, ssc);
28642868
}
28652869
}

server/src/test/java/com/cloud/network/NetworkServiceImplTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
import com.cloud.utils.Pair;
115115
import com.cloud.utils.component.ComponentContext;
116116
import com.cloud.utils.db.EntityManager;
117+
import com.cloud.utils.db.SearchCriteria;
117118
import com.cloud.utils.exception.CloudRuntimeException;
118119
import com.cloud.utils.net.Ip;
119120
import com.cloud.vm.DomainRouterVO;
@@ -1299,4 +1300,34 @@ public void testGetIpAddressesFromIps() {
12991300
Assert.assertEquals("Mac address is not valid: invalid-mac", e.getMessage());
13001301
}
13011302
}
1303+
1304+
@Test
1305+
public void addProjectNetworksConditionToSearch_includesProjectNetworksWhenNotSkipped() {
1306+
SearchCriteria<NetworkVO> sc = Mockito.mock(SearchCriteria.class);
1307+
SearchCriteria accountJoin = Mockito.mock(SearchCriteria.class);
1308+
Mockito.when(sc.getJoin("account")).thenReturn(accountJoin);
1309+
service.addProjectNetworksConditionToSearch(sc, false, -1L);
1310+
Mockito.verify(accountJoin).addAnd("type", SearchCriteria.Op.NNULL);
1311+
Mockito.verify(sc).addAnd("id", SearchCriteria.Op.SC, accountJoin);
1312+
}
1313+
1314+
@Test
1315+
public void addProjectNetworksConditionToSearch_excludesProjectNetworksWhenSkipped() {
1316+
SearchCriteria<NetworkVO> sc = Mockito.mock(SearchCriteria.class);
1317+
SearchCriteria accountJoin = Mockito.mock(SearchCriteria.class);
1318+
Mockito.when(sc.getJoin("account")).thenReturn(accountJoin);
1319+
service.addProjectNetworksConditionToSearch(sc, true, -1L);
1320+
Mockito.verify(accountJoin).addAnd("type", SearchCriteria.Op.NEQ, Account.Type.PROJECT);
1321+
Mockito.verify(sc).addAnd("id", SearchCriteria.Op.SC, accountJoin);
1322+
}
1323+
1324+
@Test
1325+
public void addProjectNetworksConditionToSearch_includesSpecificProjectWhenProjectIdProvided() {
1326+
SearchCriteria<NetworkVO> sc = Mockito.mock(SearchCriteria.class);
1327+
SearchCriteria accountJoin = Mockito.mock(SearchCriteria.class);
1328+
Mockito.when(sc.getJoin("account")).thenReturn(accountJoin);
1329+
service.addProjectNetworksConditionToSearch(sc, false, 123L);
1330+
Mockito.verify(accountJoin).addAnd("type", SearchCriteria.Op.EQ, Account.Type.PROJECT);
1331+
Mockito.verify(sc).addAnd("id", SearchCriteria.Op.SC, accountJoin);
1332+
}
13021333
}

0 commit comments

Comments
 (0)