From e2fd34364347138eb5a8ce6bbcda51ba3977a3d5 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Tue, 20 Jan 2026 11:20:16 -0300 Subject: [PATCH 1/3] Add ability to filter by version for listHosts and listMgmtServers APIs --- .../api/command/admin/host/ListHostsCmd.java | 7 +++++++ .../api/command/admin/management/ListMgmtsCmd.java | 8 ++++++++ .../java/com/cloud/api/query/QueryManagerImpl.java | 10 ++++++++++ 3 files changed, 25 insertions(+) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java index a73a0d00ffbe..972a9c8950c4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java @@ -109,6 +109,9 @@ public class ListHostsCmd extends BaseListCmd { @Parameter(name = ApiConstants.ARCH, type = CommandType.STRING, description = "CPU Arch of the host", since = "4.20.1") private String arch; + @Parameter(name = ApiConstants.VERSION, type = CommandType.STRING, description = "the host version", since = "4.20.3") + private String version; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -197,6 +200,10 @@ public CPU.CPUArch getArch() { return StringUtils.isBlank(arch) ? null : CPU.CPUArch.fromType(arch); } + public String getVersion() { + return version; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java index ecc59f7cab86..293cb34e7028 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/management/ListMgmtsCmd.java @@ -45,6 +45,10 @@ public class ListMgmtsCmd extends BaseListCmd { since = "4.20.1.0") private Boolean peers; + @Parameter(name = ApiConstants.VERSION, type = CommandType.STRING, + description = "the version of the management server", since = "4.20.3") + private String version; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -61,6 +65,10 @@ public Boolean getPeers() { return BooleanUtils.toBooleanDefaultIfNull(peers, false); } + public String getVersion() { + return version; + } + ///////////////////////////////////////////////////// /////////////// 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 5833ede550e7..06bc8f204574 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -2309,6 +2309,7 @@ public Pair, Integer> searchForServerIdsAndCount(ListHostsCmd cmd) { Long pageSize = cmd.getPageSizeVal(); Hypervisor.HypervisorType hypervisorType = cmd.getHypervisor(); final CPU.CPUArch arch = cmd.getArch(); + String version = cmd.getVersion(); Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); @@ -2325,6 +2326,7 @@ public Pair, Integer> searchForServerIdsAndCount(ListHostsCmd cmd) { hostSearchBuilder.and("resourceState", hostSearchBuilder.entity().getResourceState(), SearchCriteria.Op.EQ); hostSearchBuilder.and("hypervisor_type", hostSearchBuilder.entity().getHypervisorType(), SearchCriteria.Op.EQ); hostSearchBuilder.and("arch", hostSearchBuilder.entity().getArch(), SearchCriteria.Op.EQ); + hostSearchBuilder.and("version", hostSearchBuilder.entity().getVersion(), SearchCriteria.Op.EQ); if (keyword != null) { hostSearchBuilder.and().op("keywordName", hostSearchBuilder.entity().getName(), SearchCriteria.Op.LIKE); @@ -2409,6 +2411,10 @@ public Pair, Integer> searchForServerIdsAndCount(ListHostsCmd cmd) { sc.setParameters("arch", arch); } + if (version != null) { + sc.setParameters("version", version); + } + Pair, Integer> uniqueHostPair = hostDao.searchAndCount(sc, searchFilter); Integer count = uniqueHostPair.second(); List hostIds = uniqueHostPair.first().stream().map(HostVO::getId).collect(Collectors.toList()); @@ -5397,6 +5403,7 @@ public ListResponse listManagementServers(ListMgmtsCmd protected Pair, Integer> listManagementServersInternal(ListMgmtsCmd cmd) { Long id = cmd.getId(); String name = cmd.getHostName(); + String version = cmd.getVersion(); SearchBuilder sb = managementServerJoinDao.createSearchBuilder(); SearchCriteria sc = sb.create(); @@ -5406,6 +5413,9 @@ protected Pair, Integer> listManagementServersInter if (name != null) { sc.addAnd("name", SearchCriteria.Op.EQ, name); } + if (version != null) { + sc.addAnd("version", SearchCriteria.Op.EQ, version); + } return managementServerJoinDao.searchAndCount(sc, null); } From fc22145feb71269e402a611d45404c5263b0efc8 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Mon, 26 Jan 2026 08:21:45 -0300 Subject: [PATCH 2/3] Address review comment --- .../src/main/java/com/cloud/api/query/QueryManagerImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 06bc8f204574..8a0e54588898 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -2332,6 +2332,7 @@ public Pair, Integer> searchForServerIdsAndCount(ListHostsCmd cmd) { hostSearchBuilder.and().op("keywordName", hostSearchBuilder.entity().getName(), SearchCriteria.Op.LIKE); hostSearchBuilder.or("keywordStatus", hostSearchBuilder.entity().getStatus(), SearchCriteria.Op.LIKE); hostSearchBuilder.or("keywordType", hostSearchBuilder.entity().getType(), SearchCriteria.Op.LIKE); + hostSearchBuilder.or("keywordVersion", hostSearchBuilder.entity().getVersion(), SearchCriteria.Op.LIKE); hostSearchBuilder.cp(); } @@ -2362,6 +2363,7 @@ public Pair, Integer> searchForServerIdsAndCount(ListHostsCmd cmd) { sc.setParameters("keywordName", "%" + keyword + "%"); sc.setParameters("keywordStatus", "%" + keyword + "%"); sc.setParameters("keywordType", "%" + keyword + "%"); + sc.setParameters("keywordVersion", "%" + keyword + "%"); } if (id != null) { @@ -5404,6 +5406,7 @@ protected Pair, Integer> listManagementServersInter Long id = cmd.getId(); String name = cmd.getHostName(); String version = cmd.getVersion(); + String keyword = cmd.getKeyword(); SearchBuilder sb = managementServerJoinDao.createSearchBuilder(); SearchCriteria sc = sb.create(); @@ -5416,6 +5419,9 @@ protected Pair, Integer> listManagementServersInter if (version != null) { sc.addAnd("version", SearchCriteria.Op.EQ, version); } + if (keyword != null) { + sc.addAnd("keywordVersion", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + } return managementServerJoinDao.searchAndCount(sc, null); } From fbc86b6e921c4dda6ce6ade08987def5f4caa6ae Mon Sep 17 00:00:00 2001 From: nvazquez Date: Mon, 26 Jan 2026 08:53:57 -0300 Subject: [PATCH 3/3] Fix listMgmtServers API --- 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 8a0e54588898..a89a1eed87bf 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -5420,7 +5420,7 @@ protected Pair, Integer> listManagementServersInter sc.addAnd("version", SearchCriteria.Op.EQ, version); } if (keyword != null) { - sc.addAnd("keywordVersion", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("version", SearchCriteria.Op.LIKE, "%" + keyword + "%"); } return managementServerJoinDao.searchAndCount(sc, null); }