From c1d4d88c32269d6cbe5bb6ca40226d64263e6871 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 21 Jan 2025 14:03:37 +0100 Subject: [PATCH 1/6] list network offerings with specific tags only --- .../user/offering/ListDiskOfferingsCmd.java | 7 ++++++ .../com/cloud/api/query/QueryManagerImpl.java | 23 +++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java index 6f32b58b733b..234e9cb604b5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java @@ -77,6 +77,9 @@ public class ListDiskOfferingsCmd extends BaseListProjectAndAccountResourcesCmd since = "4.19") private String diskOfferingState; + @Parameter(name = ApiConstants.TAGS, type = CommandType.STRING, description = "list network offerings by tags", length = 4096) + private String tags; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -116,6 +119,10 @@ public State getState() { return state; } + public String getTags() { + return tags; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 421285257829..b1c3c9bb268f 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3385,7 +3385,7 @@ private Pair, Integer> searchForCacheStoresInternal(ListS @Override public ListResponse searchForDiskOfferings(ListDiskOfferingsCmd cmd) { Pair, Integer> result = searchForDiskOfferingsInternal(cmd); - ListResponse response = new ListResponse(); + ListResponse response = new ListResponse<>(); List offeringResponses = ViewResponseHelper.createDiskOfferingResponse(result.first().toArray(new DiskOfferingJoinVO[result.first().size()])); response.setResponses(offeringResponses, result.second()); return response; @@ -3444,10 +3444,11 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount Boolean encrypt = cmd.getEncrypt(); String storageType = cmd.getStorageType(); DiskOffering.State state = cmd.getState(); + String tags = cmd.getTags(); Filter searchFilter = new Filter(DiskOfferingVO.class, "sortKey", SortKeyAscending.value(), cmd.getStartIndex(), cmd.getPageSizeVal()); searchFilter.addOrderBy(DiskOfferingVO.class, "id", true); - SearchBuilder diskOfferingSearch = _diskOfferingDao.createSearchBuilder(); + SearchBuilder diskOfferingSearch = _diskOfferingJoinDao.createSearchBuilder(); diskOfferingSearch.select(null, Func.DISTINCT, diskOfferingSearch.entity().getId()); // select distinct diskOfferingSearch.and("computeOnly", diskOfferingSearch.entity().isComputeOnly(), Op.EQ); @@ -3456,6 +3457,10 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount diskOfferingSearch.and("state", diskOfferingSearch.entity().getState(), Op.EQ); } + if (tags != null) { + diskOfferingSearch.and("tags", SearchCriteria.Op.EQ, tags); + } + // Keeping this logic consistent with domain specific zones // if a domainId is provided, we just return the disk offering // associated with this domain @@ -3471,17 +3476,17 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount domainDetailsSearch.entity().getName(), diskOfferingSearch.entity().setString(ApiConstants.DOMAIN_ID)); if (!isRootAdmin) { - diskOfferingSearch.and("displayOffering", diskOfferingSearch.entity().getDisplayOffering(), Op.EQ); + diskOfferingSearch.and("displayOffering", diskOfferingSearch.entity().isDisplayOffering(), Op.EQ); } - SearchCriteria sc = diskOfferingSearch.create(); + SearchCriteria sc = diskOfferingSearch.create(); sc.setParameters("computeOnly", false); sc.setParameters("activeState", DiskOffering.State.Active); sc.setJoinParameters("domainDetailsSearch", "domainId", domainId); - Pair, Integer> uniquePairs = _diskOfferingDao.searchAndCount(sc, searchFilter); - List idsArray = uniquePairs.first().stream().map(DiskOfferingVO::getId).collect(Collectors.toList()); + Pair, Integer> uniquePairs = _diskOfferingJoinDao.searchAndCount(sc, searchFilter); + List idsArray = uniquePairs.first().stream().map(DiskOfferingJoinVO::getId).collect(Collectors.toList()); return new Ternary<>(idsArray, uniquePairs.second(), new String[0]); } else { throw new PermissionDeniedException("The account:" + account.getAccountName() + " does not fall in the same domain hierarchy as the disk offering"); @@ -3564,7 +3569,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount domainDetailsSearch.entity().getName(), diskOfferingSearch.entity().setString(ApiConstants.DOMAIN_ID)); } - SearchCriteria sc = diskOfferingSearch.create(); + SearchCriteria sc = diskOfferingSearch.create(); sc.setParameters("computeOnly", false); @@ -3624,7 +3629,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount sc.setJoinParameters("domainDetailsSearch", "domainIdIN", domainIds.toArray()); } - Pair, Integer> uniquePairs = _diskOfferingDao.searchAndCount(sc, searchFilter); + Pair, Integer> uniquePairs = _diskOfferingJoinDao.searchAndCount(sc, searchFilter); String[] requiredTagsArray = new String[0]; if (CollectionUtils.isNotEmpty(uniquePairs.first()) && VolumeApiServiceImpl.MatchStoragePoolTagsWithDiskOffering.valueIn(zoneId)) { if (volumeId != null) { @@ -3633,7 +3638,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount requiredTagsArray = _storageTagDao.getStoragePoolTags(storagePoolId).toArray(new String[0]); } } - List idsArray = uniquePairs.first().stream().map(DiskOfferingVO::getId).collect(Collectors.toList()); + List idsArray = uniquePairs.first().stream().map(DiskOfferingJoinVO::getId).collect(Collectors.toList()); return new Ternary<>(idsArray, uniquePairs.second(), requiredTagsArray); } From ab46add963fbb40eca647819a528b166e8c848ba Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 21 Jan 2025 16:04:20 +0100 Subject: [PATCH 2/6] revert moving to join --- .../com/cloud/api/query/QueryManagerImpl.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index b1c3c9bb268f..d60b069574d4 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3448,7 +3448,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount Filter searchFilter = new Filter(DiskOfferingVO.class, "sortKey", SortKeyAscending.value(), cmd.getStartIndex(), cmd.getPageSizeVal()); searchFilter.addOrderBy(DiskOfferingVO.class, "id", true); - SearchBuilder diskOfferingSearch = _diskOfferingJoinDao.createSearchBuilder(); + SearchBuilder diskOfferingSearch = _diskOfferingDao.createSearchBuilder(); diskOfferingSearch.select(null, Func.DISTINCT, diskOfferingSearch.entity().getId()); // select distinct diskOfferingSearch.and("computeOnly", diskOfferingSearch.entity().isComputeOnly(), Op.EQ); @@ -3476,17 +3476,17 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount domainDetailsSearch.entity().getName(), diskOfferingSearch.entity().setString(ApiConstants.DOMAIN_ID)); if (!isRootAdmin) { - diskOfferingSearch.and("displayOffering", diskOfferingSearch.entity().isDisplayOffering(), Op.EQ); + diskOfferingSearch.and("displayOffering", diskOfferingSearch.entity().getDisplayOffering(), Op.EQ); } - SearchCriteria sc = diskOfferingSearch.create(); + SearchCriteria sc = diskOfferingSearch.create(); sc.setParameters("computeOnly", false); sc.setParameters("activeState", DiskOffering.State.Active); sc.setJoinParameters("domainDetailsSearch", "domainId", domainId); - Pair, Integer> uniquePairs = _diskOfferingJoinDao.searchAndCount(sc, searchFilter); - List idsArray = uniquePairs.first().stream().map(DiskOfferingJoinVO::getId).collect(Collectors.toList()); + Pair, Integer> uniquePairs = _diskOfferingDao.searchAndCount(sc, searchFilter); + List idsArray = uniquePairs.first().stream().map(DiskOfferingVO::getId).collect(Collectors.toList()); return new Ternary<>(idsArray, uniquePairs.second(), new String[0]); } else { throw new PermissionDeniedException("The account:" + account.getAccountName() + " does not fall in the same domain hierarchy as the disk offering"); @@ -3569,7 +3569,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount domainDetailsSearch.entity().getName(), diskOfferingSearch.entity().setString(ApiConstants.DOMAIN_ID)); } - SearchCriteria sc = diskOfferingSearch.create(); + SearchCriteria sc = diskOfferingSearch.create(); sc.setParameters("computeOnly", false); @@ -3629,7 +3629,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount sc.setJoinParameters("domainDetailsSearch", "domainIdIN", domainIds.toArray()); } - Pair, Integer> uniquePairs = _diskOfferingJoinDao.searchAndCount(sc, searchFilter); + Pair, Integer> uniquePairs = _diskOfferingDao.searchAndCount(sc, searchFilter); String[] requiredTagsArray = new String[0]; if (CollectionUtils.isNotEmpty(uniquePairs.first()) && VolumeApiServiceImpl.MatchStoragePoolTagsWithDiskOffering.valueIn(zoneId)) { if (volumeId != null) { @@ -3638,7 +3638,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount requiredTagsArray = _storageTagDao.getStoragePoolTags(storagePoolId).toArray(new String[0]); } } - List idsArray = uniquePairs.first().stream().map(DiskOfferingJoinVO::getId).collect(Collectors.toList()); + List idsArray = uniquePairs.first().stream().map(DiskOfferingVO::getId).collect(Collectors.toList()); return new Ternary<>(idsArray, uniquePairs.second(), requiredTagsArray); } From a1dc5bec1f112fdc521ffd2f5be6ef300d97f6c2 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 21 Jan 2025 16:12:20 +0100 Subject: [PATCH 3/6] fix c&p tech --- .../api/command/user/offering/ListDiskOfferingsCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java index 234e9cb604b5..6494a8a707af 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java @@ -77,7 +77,7 @@ public class ListDiskOfferingsCmd extends BaseListProjectAndAccountResourcesCmd since = "4.19") private String diskOfferingState; - @Parameter(name = ApiConstants.TAGS, type = CommandType.STRING, description = "list network offerings by tags", length = 4096) + @Parameter(name = ApiConstants.TAGS, type = CommandType.STRING, description = "list disk offerings by tags", length = 4096) private String tags; ///////////////////////////////////////////////////// From 51d378f0388e663cdd1d1d3b8c76068a37049304 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 21 Jan 2025 17:33:01 +0100 Subject: [PATCH 4/6] import --- .../api/command/user/offering/ListDiskOfferingsCmd.java | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java index 6494a8a707af..476d7c487ab2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java @@ -28,7 +28,6 @@ import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.BaseCmd.CommandType; import org.apache.cloudstack.api.response.DiskOfferingResponse; import org.apache.cloudstack.api.response.ListResponse; From fddd7211676e2a269f69bd9d83a390cafacb46b8 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Wed, 22 Jan 2025 10:18:44 +0100 Subject: [PATCH 5/6] another c&p error --- server/src/main/java/com/cloud/api/query/QueryManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index d60b069574d4..a37fbe2d42a9 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3458,7 +3458,7 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount } if (tags != null) { - diskOfferingSearch.and("tags", SearchCriteria.Op.EQ, tags); + diskOfferingSearch.and("tags", diskOfferingSearch.entity().getTags(), Op.EQ); } // Keeping this logic consistent with domain specific zones From 5c7935fa5a0ea628f5f556ca5b7c734b7db4bfb6 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Wed, 22 Jan 2025 11:55:54 +0100 Subject: [PATCH 6/6] full query param and value --- .../java/com/cloud/api/query/QueryManagerImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index a37fbe2d42a9..f58f862799ec 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3457,10 +3457,6 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount diskOfferingSearch.and("state", diskOfferingSearch.entity().getState(), Op.EQ); } - if (tags != null) { - diskOfferingSearch.and("tags", diskOfferingSearch.entity().getTags(), Op.EQ); - } - // Keeping this logic consistent with domain specific zones // if a domainId is provided, we just return the disk offering // associated with this domain @@ -3525,6 +3521,10 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount diskOfferingSearch.and("encrypt", diskOfferingSearch.entity().getEncrypt(), Op.EQ); } + if (tags != null) { + diskOfferingSearch.and("tags", diskOfferingSearch.entity().getTags(), Op.EQ); + } + if (storageType != null || zoneId != null) { diskOfferingSearch.and("useLocalStorage", diskOfferingSearch.entity().isUseLocalStorage(), Op.EQ); } @@ -3594,6 +3594,10 @@ private Ternary, Integer, String[]> searchForDiskOfferingsIdsAndCount sc.setParameters("encrypt", encrypt); } + if (tags != null) { + sc.setParameters("tags", tags); + } + if (storageType != null) { if (storageType.equalsIgnoreCase(ServiceOffering.StorageType.local.toString())) { sc.setParameters("useLocalStorage", true);