From 466e8889584b851891c82d5951befdaf776e831d Mon Sep 17 00:00:00 2001 From: nvazquez Date: Tue, 14 Oct 2025 19:46:16 -0300 Subject: [PATCH 1/6] Fix import VM tasks pagination --- .../api/command/admin/vm/ListImportVMTasksCmd.java | 7 ------- .../java/com/cloud/vm/dao/ImportVMTaskDao.java | 3 ++- .../java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java | 8 ++++++-- .../cloudstack/vm/ImportVmTasksManagerImpl.java | 14 ++++++-------- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ListImportVMTasksCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ListImportVMTasksCmd.java index a0c8cb57ee61..9bdd87a3d76b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ListImportVMTasksCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ListImportVMTasksCmd.java @@ -75,9 +75,6 @@ public class ListImportVMTasksCmd extends BaseListCmd { description = "Conversion host of the importing task") private Long convertHostId; - @Parameter(name = ApiConstants.LIST_ALL, type = CommandType.BOOLEAN, description = "Whether to list all import tasks.") - private boolean listAll = false; - @Parameter(name = ApiConstants.SHOW_COMPLETED, type = CommandType.BOOLEAN, description = "Whether to list completed tasks.") private boolean showCompleted = false; @@ -97,10 +94,6 @@ public Long getConvertHostId() { return convertHostId; } - public boolean isListAll() { - return listAll; - } - public boolean isShowCompleted() { return showCompleted; } diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDao.java b/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDao.java index 990dacb33fb5..919d0f6938f6 100644 --- a/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDao.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDao.java @@ -18,6 +18,7 @@ // package com.cloud.vm.dao; +import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; import com.cloud.vm.ImportVMTaskVO; @@ -25,5 +26,5 @@ public interface ImportVMTaskDao extends GenericDao { - List listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId, boolean showCompleted); + Pair, Integer> listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId, boolean showCompleted, Long startIndex, Long pageSizeVal); } diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java index 8bdae2e456ae..dbf685402f13 100644 --- a/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java @@ -16,10 +16,13 @@ // under the License. package com.cloud.vm.dao; +import com.cloud.utils.Pair; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.ImportVMTaskVO; +import org.apache.cloudstack.acl.RoleVO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -46,7 +49,7 @@ void init() { @Override - public List listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId, boolean showCompleted) { + public Pair, Integer> listImportVMTasks(Long zoneId, Long accountId, String vcenter, Long convertHostId, boolean showCompleted, Long startIndex, Long pageSizeVal) { SearchCriteria sc = AllFieldsSearch.create(); if (zoneId != null) { sc.setParameters("zoneId", zoneId); @@ -60,6 +63,7 @@ public List listImportVMTasks(Long zoneId, Long accountId, Strin if (convertHostId != null) { sc.setParameters("convertHostId", convertHostId); } - return showCompleted ? listIncludingRemovedBy(sc) : listBy(sc); + Filter filter = new Filter(RoleVO.class, "created", false, startIndex, pageSizeVal); + return searchAndCount(sc, filter, showCompleted); } } diff --git a/server/src/main/java/org/apache/cloudstack/vm/ImportVmTasksManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/ImportVmTasksManagerImpl.java index fa36627e8649..26d007e53f68 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/ImportVmTasksManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/ImportVmTasksManagerImpl.java @@ -25,6 +25,7 @@ import com.cloud.user.Account; import com.cloud.user.AccountService; import com.cloud.utils.DateUtil; +import com.cloud.utils.Pair; import com.cloud.vm.ImportVMTaskVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.dao.ImportVMTaskDao; @@ -72,22 +73,19 @@ public ListResponse listImportVMTasks(ListImportVMTasksCmd Long accountId = cmd.getAccountId(); String vcenter = cmd.getVcenter(); Long convertHostId = cmd.getConvertHostId(); - boolean listAll = cmd.isListAll(); boolean showCompleted = cmd.isShowCompleted(); + Long startIndex = cmd.getStartIndex(); + Long pageSizeVal = cmd.getPageSizeVal(); - List tasks; - if (listAll) { - tasks = importVMTaskDao.listAll(); - } else { - tasks = importVMTaskDao.listImportVMTasks(zoneId, accountId, vcenter, convertHostId, showCompleted); - } + Pair, Integer> result = importVMTaskDao.listImportVMTasks(zoneId, accountId, vcenter, convertHostId, showCompleted, startIndex, pageSizeVal); + List tasks = result.first(); List responses = new ArrayList<>(); for (ImportVMTaskVO task : tasks) { responses.add(createImportVMTaskResponse(task)); } ListResponse listResponses = new ListResponse<>(); - listResponses.setResponses(responses, responses.size()); + listResponses.setResponses(responses, result.second()); return listResponses; } From 8acd7f57a698bfccd7a30337c4fb025760d9b507 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Tue, 14 Oct 2025 23:31:33 -0300 Subject: [PATCH 2/6] Fix UI for pagination and proper listing --- .../com/cloud/vm/dao/ImportVMTaskDaoImpl.java | 3 +- ui/public/locales/en.json | 2 + ui/src/views/tools/ImportVmTasks.vue | 146 +++++++++++------- ui/src/views/tools/ManageInstances.vue | 37 ++++- 4 files changed, 127 insertions(+), 61 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java index dbf685402f13..cdd31d8cfd75 100644 --- a/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/ImportVMTaskDaoImpl.java @@ -22,7 +22,6 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.ImportVMTaskVO; -import org.apache.cloudstack.acl.RoleVO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -63,7 +62,7 @@ public Pair, Integer> listImportVMTasks(Long zoneId, Long a if (convertHostId != null) { sc.setParameters("convertHostId", convertHostId); } - Filter filter = new Filter(RoleVO.class, "created", false, startIndex, pageSizeVal); + Filter filter = new Filter(ImportVMTaskVO.class, "created", false, startIndex, pageSizeVal); return searchAndCount(sc, filter, showCompleted); } } diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 5f1621c334e5..b41f9addc6fd 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -1244,6 +1244,7 @@ "label.import.instance": "Import Instance", "label.import.offering": "Import Offering", "label.import.role": "Import Role", +"label.import.vm.tasks": "Import VM Tasks", "label.import.volume": "Import Volume", "label.inactive": "Inactive", "label.inbuilt": "Inbuilt", @@ -3520,6 +3521,7 @@ "message.host.dedication.released": "Host dedication released.", "message.host.external.datadisk": "Usage of data disks for the selected template is not applicable", "message.import.running.instance.warning": "The selected VM is powered-on on the VMware Datacenter. The recommended state to convert a VMware VM into KVM is powered-off after a graceful shutdown of the guest OS.", +"message.import.vm.tasks": "Import from VMware to KVM tasks", "message.import.volume": "Please specify the domain, account or project name.
If not set, the volume will be imported for the caller.", "message.info.cloudian.console": "Cloudian Management Console should open in another window.", "message.installwizard.cloudstack.helptext.website": " * Project website:\t ", diff --git a/ui/src/views/tools/ImportVmTasks.vue b/ui/src/views/tools/ImportVmTasks.vue index 51741f18e699..1183820f8378 100644 --- a/ui/src/views/tools/ImportVmTasks.vue +++ b/ui/src/views/tools/ImportVmTasks.vue @@ -16,56 +16,80 @@ // under the License.