From d27b2f45be5e460db1081bd94dcf0396988bbdbb Mon Sep 17 00:00:00 2001 From: Daman Arora Date: Thu, 8 Jan 2026 14:30:13 -0500 Subject: [PATCH] update user VM response handling in KubernetesClusterManagerImpl --- .../cluster/KubernetesClusterManagerImpl.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 524f585b836..2dad9cc26a7 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -861,24 +861,38 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne List vmResponses = new ArrayList<>(); List vmList = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId()); - ResponseView respView = ResponseView.Restricted; + ResponseView userVmResponseView = ResponseView.Restricted; Account caller = CallContext.current().getCallingAccount(); if (accountService.isRootAdmin(caller.getId())) { - respView = ResponseView.Full; + userVmResponseView = ResponseView.Full; } final String responseName = "virtualmachine"; if (vmList != null && !vmList.isEmpty()) { - for (KubernetesClusterVmMapVO vmMapVO : vmList) { - UserVmJoinVO userVM = userVmJoinDao.findById(vmMapVO.getVmId()); - if (userVM != null) { - UserVmResponse vmResponse = ApiDBUtils.newUserVmResponse(respView, responseName, userVM, - EnumSet.of(VMDetails.nics, VMDetails.affgrp), caller); + Map vmMapById = vmList.stream() + .collect(Collectors.toMap(KubernetesClusterVmMapVO::getVmId, vm -> vm)); + Long[] vmIds = vmMapById.keySet().toArray(new Long[0]); + List userVmJoinVOs = userVmJoinDao.searchByIds(vmIds); + if (userVmJoinVOs != null && !userVmJoinVOs.isEmpty()) { + Map vmResponseMap = new HashMap<>(); + for (UserVmJoinVO userVM : userVmJoinVOs) { + Long vmId = userVM.getId(); + UserVmResponse vmResponse = vmResponseMap.get(vmId); + if (vmResponse == null) { + vmResponse = ApiDBUtils.newUserVmResponse(userVmResponseView, responseName, userVM, + EnumSet.of(VMDetails.nics, VMDetails.affgrp), caller); + vmResponseMap.put(vmId, vmResponse); + } else { + ApiDBUtils.fillVmDetails(userVmResponseView, vmResponse, userVM); + } + } + for (Map.Entry vmIdResponseEntry : vmResponseMap.entrySet()) { KubernetesUserVmResponse kubernetesUserVmResponse = new KubernetesUserVmResponse(); try { - BeanUtils.copyProperties(kubernetesUserVmResponse, vmResponse); + BeanUtils.copyProperties(kubernetesUserVmResponse, vmIdResponseEntry.getValue()); } catch (IllegalAccessException | InvocationTargetException e) { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to generate zone metrics response"); } + KubernetesClusterVmMapVO vmMapVO = vmMapById.get(vmIdResponseEntry.getKey()); kubernetesUserVmResponse.setExternalNode(vmMapVO.isExternalNode()); kubernetesUserVmResponse.setEtcdNode(vmMapVO.isEtcdNode()); kubernetesUserVmResponse.setNodeVersion(vmMapVO.getNodeVersion());