You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by su...@apache.org on 2026/07/03 12:18:17 UTC

(cloudstack) branch 4.22 updated: listHosts: add 'core' details (#13444)

This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new 135922fa63b listHosts: add 'core' details (#13444)
135922fa63b is described below

commit 135922fa63ba7d2708e0026ac5d06d0dfd212792
Author: Nicolas Vazquez <ni...@gmail.com>
AuthorDate: Fri Jul 3 09:18:10 2026 -0300

    listHosts: add 'core' details (#13444)
    
    * listHosts: add 'core' details
    
    * Include msid response and integrate core details into the base response method
    
    Co-authored-by: abennatan <a_...@apple.com>
---
 .../org/apache/cloudstack/api/ApiConstants.java    |   2 +-
 .../cloudstack/api/response/HostResponse.java      |  12 ++
 .../com/cloud/api/query/dao/HostJoinDaoImpl.java   | 203 +++++++++++----------
 3 files changed, 124 insertions(+), 93 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 03b73834a94..a8ff00c40ff 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -1407,7 +1407,7 @@ public class ApiConstants {
     }
 
     public enum HostDetails {
-        all, capacity, events, stats, min;
+        all, capacity, core, events, stats, min;
     }
 
     public enum VMDetails {
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java
index 5d085d1bee0..324cc31177a 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java
@@ -197,6 +197,10 @@ public class HostResponse extends BaseResponseWithAnnotations {
     @Param(description = "the virtual machine id for host type ConsoleProxy and SecondaryStorageVM", since = "4.21.0")
     private String virtualMachineId;
 
+    @SerializedName("msid")
+    @Param(description = "(only for details=core) the msid of the host's management server")
+    private Long msId;
+
     @SerializedName(ApiConstants.MANAGEMENT_SERVER_ID)
     @Param(description = "The management server ID of the host")
     private String managementServerId;
@@ -488,6 +492,14 @@ public class HostResponse extends BaseResponseWithAnnotations {
         this.virtualMachineId = virtualMachineId;
     }
 
+    public Long getMsId() {
+        return msId;
+    }
+
+    public void setMsId(Long msId) {
+        this.msId = msId;
+    }
+
     public void setManagementServerId(String managementServerId) {
         this.managementServerId = managementServerId;
     }
diff --git a/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java
index e7265a7e3b9..7e149020cb0 100644
--- a/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java
@@ -131,21 +131,16 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
             hostResponse.setHypervisor(hypervisorType);
         }
         hostResponse.setHostType(host.getType());
-        if (host.getType().equals(Host.Type.ConsoleProxy) || host.getType().equals(Host.Type.SecondaryStorageVM)) {
+        if (!details.contains(HostDetails.core) && (host.getType().equals(Host.Type.ConsoleProxy) || host.getType().equals(Host.Type.SecondaryStorageVM))) {
             VMInstanceVO vm = virtualMachineDao.findVMByInstanceNameIncludingRemoved(host.getName());
             if (vm != null) {
                 hostResponse.setVirtualMachineId(vm.getUuid());
             }
         }
         hostResponse.setLastPinged(new Date(host.getLastPinged()));
-        Long mshostId = host.getManagementServerId();
-        if (mshostId != null) {
-            ManagementServerHostVO managementServer = managementServerHostDao.findByMsid(host.getManagementServerId());
-            if (managementServer != null) {
-                hostResponse.setManagementServerId(managementServer.getUuid());
-                hostResponse.setManagementServerName(managementServer.getName());
-            }
-        }
+
+        setManagementServerResponse(hostResponse, host, details);
+
         hostResponse.setName(host.getName());
         hostResponse.setPodId(host.getPodUuid());
         hostResponse.setRemoved(host.getRemoved());
@@ -155,41 +150,44 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
         hostResponse.setVersion(host.getVersion());
         hostResponse.setCreated(host.getCreated());
 
-        List<HostGpuGroupsVO> gpuGroups = ApiDBUtils.getGpuGroups(host.getId());
-        if (gpuGroups != null && !gpuGroups.isEmpty()) {
-            List<GpuResponse> gpus = new ArrayList<GpuResponse>();
-            long gpuRemaining = 0;
-            long gpuTotal = 0;
-            for (HostGpuGroupsVO entry : gpuGroups) {
-                GpuResponse gpuResponse = new GpuResponse();
-                gpuResponse.setGpuGroupName(entry.getGroupName());
-                List<VGPUTypesVO> vgpuTypes = ApiDBUtils.getVgpus(entry.getId());
-                if (vgpuTypes != null && !vgpuTypes.isEmpty()) {
-                    List<VgpuResponse> vgpus = new ArrayList<VgpuResponse>();
-                    for (VGPUTypesVO vgpuType : vgpuTypes) {
-                        VgpuResponse vgpuResponse = new VgpuResponse();
-                        vgpuResponse.setName(vgpuType.getVgpuType());
-                        vgpuResponse.setVideoRam(vgpuType.getVideoRam());
-                        vgpuResponse.setMaxHeads(vgpuType.getMaxHeads());
-                        vgpuResponse.setMaxResolutionX(vgpuType.getMaxResolutionX());
-                        vgpuResponse.setMaxResolutionY(vgpuType.getMaxResolutionY());
-                        vgpuResponse.setMaxVgpuPerPgpu(vgpuType.getMaxVgpuPerPgpu());
-                        vgpuResponse.setRemainingCapacity(vgpuType.getRemainingCapacity());
-                        vgpuResponse.setmaxCapacity(vgpuType.getMaxCapacity());
-                        vgpus.add(vgpuResponse);
-                        gpuRemaining += vgpuType.getRemainingCapacity();
-                        gpuTotal += vgpuType.getMaxCapacity();
+        if (!details.contains(HostDetails.core)) {
+            List<HostGpuGroupsVO> gpuGroups = ApiDBUtils.getGpuGroups(host.getId());
+            if (gpuGroups != null && !gpuGroups.isEmpty()) {
+                List<GpuResponse> gpus = new ArrayList<GpuResponse>();
+                long gpuRemaining = 0;
+                long gpuTotal = 0;
+                for (HostGpuGroupsVO entry : gpuGroups) {
+                    GpuResponse gpuResponse = new GpuResponse();
+                    gpuResponse.setGpuGroupName(entry.getGroupName());
+                    List<VGPUTypesVO> vgpuTypes = ApiDBUtils.getVgpus(entry.getId());
+                    if (vgpuTypes != null && !vgpuTypes.isEmpty()) {
+                        List<VgpuResponse> vgpus = new ArrayList<VgpuResponse>();
+                        for (VGPUTypesVO vgpuType : vgpuTypes) {
+                            VgpuResponse vgpuResponse = new VgpuResponse();
+                            vgpuResponse.setName(vgpuType.getVgpuType());
+                            vgpuResponse.setVideoRam(vgpuType.getVideoRam());
+                            vgpuResponse.setMaxHeads(vgpuType.getMaxHeads());
+                            vgpuResponse.setMaxResolutionX(vgpuType.getMaxResolutionX());
+                            vgpuResponse.setMaxResolutionY(vgpuType.getMaxResolutionY());
+                            vgpuResponse.setMaxVgpuPerPgpu(vgpuType.getMaxVgpuPerPgpu());
+                            vgpuResponse.setRemainingCapacity(vgpuType.getRemainingCapacity());
+                            vgpuResponse.setmaxCapacity(vgpuType.getMaxCapacity());
+                            vgpus.add(vgpuResponse);
+                            gpuRemaining += vgpuType.getRemainingCapacity();
+                            gpuTotal += vgpuType.getMaxCapacity();
+                        }
+                        gpuResponse.setVgpu(vgpus);
                     }
-                    gpuResponse.setVgpu(vgpus);
+                    gpus.add(gpuResponse);
                 }
-                gpus.add(gpuResponse);
+                hostResponse.setGpuTotal(gpuTotal);
+                hostResponse.setGpuUsed(gpuTotal - gpuRemaining);
+                hostResponse.setGpuGroup(gpus);
             }
-            hostResponse.setGpuTotal(gpuTotal);
-            hostResponse.setGpuUsed(gpuTotal - gpuRemaining);
-            hostResponse.setGpuGroup(gpus);
         }
-        if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity) || details.contains(HostDetails.stats) || details.contains(HostDetails.events)) {
 
+        if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity) || details.contains(HostDetails.core) ||
+                details.contains(HostDetails.stats) || details.contains(HostDetails.events)) {
             hostResponse.setOsCategoryId(host.getOsCategoryUuid());
             hostResponse.setOsCategoryName(host.getOsCategoryName());
             hostResponse.setZoneName(host.getZoneName());
@@ -202,43 +200,45 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
 
         DecimalFormat decimalFormat = new DecimalFormat("#.##");
         if (host.getType() == Host.Type.Routing) {
-            float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(host.getClusterId());
-            if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)) {
-                // set allocated capacities
-                Long mem = host.getMemReservedCapacity() + host.getMemUsedCapacity();
-                Long cpu = host.getCpuReservedCapacity() + host.getCpuUsedCapacity();
-
-                Float memWithOverprovisioning = host.getTotalMemory() * ApiDBUtils.getMemOverprovisioningFactor(host.getClusterId());
-                hostResponse.setMemoryTotal(memWithOverprovisioning.longValue());
-                hostResponse.setMemWithOverprovisioning(decimalFormat.format(memWithOverprovisioning));
-                hostResponse.setMemoryAllocated(mem);
-                hostResponse.setMemoryAllocatedBytes(mem);
-                hostResponse.setMemoryAllocatedPercentage(calculateResourceAllocatedPercentage(mem, memWithOverprovisioning));
-
+            if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity) || details.contains(HostDetails.core)) {
                 String hostTags = host.getTag();
                 hostResponse.setHostTags(hostTags);
-                hostResponse.setIsTagARule(host.getIsTagARule());
-                hostResponse.setHaHost(containsHostHATag(hostTags));
                 hostResponse.setExplicitHostTags(host.getExplicitTag());
                 hostResponse.setImplicitHostTags(host.getImplicitTag());
-
-                hostResponse.setHypervisorVersion(host.getHypervisorVersion());
-                if (host.getArch() != null) {
-                    hostResponse.setArch(host.getArch().getType());
-                }
-
                 hostResponse.setStorageAccessGroups(host.getStorageAccessGroups());
                 hostResponse.setClusterStorageAccessGroups(host.getClusterStorageAccessGroups());
                 hostResponse.setPodStorageAccessGroups(host.getPodStorageAccessGroups());
                 hostResponse.setZoneStorageAccessGroups(host.getZoneStorageAccessGroups());
+                hostResponse.setHypervisorVersion(host.getHypervisorVersion());
+
+                if (!details.contains(HostDetails.core)) {
+                    float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(host.getClusterId());
+                    // set allocated capacities
+                    Long mem = host.getMemReservedCapacity() + host.getMemUsedCapacity();
+                    Long cpu = host.getCpuReservedCapacity() + host.getCpuUsedCapacity();
+
+                    Float memWithOverprovisioning = host.getTotalMemory() * ApiDBUtils.getMemOverprovisioningFactor(host.getClusterId());
+                    hostResponse.setMemoryTotal(memWithOverprovisioning.longValue());
+                    hostResponse.setMemWithOverprovisioning(decimalFormat.format(memWithOverprovisioning));
+                    hostResponse.setMemoryAllocated(mem);
+                    hostResponse.setMemoryAllocatedBytes(mem);
+                    hostResponse.setMemoryAllocatedPercentage(calculateResourceAllocatedPercentage(mem, memWithOverprovisioning));
+
+                    hostResponse.setIsTagARule(host.getIsTagARule());
+                    hostResponse.setHaHost(containsHostHATag(hostTags));
 
-                float cpuWithOverprovisioning = host.getCpus() * host.getSpeed() * cpuOverprovisioningFactor;
-                hostResponse.setCpuAllocatedValue(cpu);
-                String cpuAllocated = calculateResourceAllocatedPercentage(cpu, cpuWithOverprovisioning);
-                hostResponse.setCpuAllocated(cpuAllocated);
-                hostResponse.setCpuAllocatedPercentage(cpuAllocated);
-                hostResponse.setCpuAllocatedWithOverprovisioning(cpuAllocated);
-                hostResponse.setCpuWithOverprovisioning(decimalFormat.format(cpuWithOverprovisioning));
+                    if (host.getArch() != null) {
+                        hostResponse.setArch(host.getArch().getType());
+                    }
+
+                    float cpuWithOverprovisioning = host.getCpus() * host.getSpeed() * cpuOverprovisioningFactor;
+                    hostResponse.setCpuAllocatedValue(cpu);
+                    String cpuAllocated = calculateResourceAllocatedPercentage(cpu, cpuWithOverprovisioning);
+                    hostResponse.setCpuAllocated(cpuAllocated);
+                    hostResponse.setCpuAllocatedPercentage(cpuAllocated);
+                    hostResponse.setCpuAllocatedWithOverprovisioning(cpuAllocated);
+                    hostResponse.setCpuWithOverprovisioning(decimalFormat.format(cpuWithOverprovisioning));
+                }
             }
 
             if (details.contains(HostDetails.all) || details.contains(HostDetails.stats)) {
@@ -257,27 +257,29 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
                 }
             }
 
-            Map<String, String> hostDetails = hostDetailsDao.findDetails(host.getId());
-            if (hostDetails != null) {
-                if (hostDetails.containsKey(Host.HOST_UEFI_ENABLE)) {
-                    hostResponse.setUefiCapability(Boolean.parseBoolean((String) hostDetails.get(Host.HOST_UEFI_ENABLE)));
-                } else {
-                    hostResponse.setUefiCapability(new Boolean(false));
+            if (!details.contains(HostDetails.core)) {
+                Map<String, String> hostDetails = hostDetailsDao.findDetails(host.getId());
+                if (hostDetails != null) {
+                    if (hostDetails.containsKey(Host.HOST_UEFI_ENABLE)) {
+                        hostResponse.setUefiCapability(Boolean.parseBoolean((String) hostDetails.get(Host.HOST_UEFI_ENABLE)));
+                    } else {
+                        hostResponse.setUefiCapability(new Boolean(false));
+                    }
                 }
-            }
-            if (details.contains(HostDetails.all) &&
-                    Arrays.asList(Hypervisor.HypervisorType.KVM,
-                            Hypervisor.HypervisorType.Custom,
-                            Hypervisor.HypervisorType.External).contains(host.getHypervisorType())) {
-                //only kvm has the requirement to return host details
-                try {
-                    hostResponse.setDetails(hostDetails, host.getHypervisorType());
-                } catch (Exception e) {
-                    logger.debug("failed to get host details", e);
+                if (details.contains(HostDetails.all) &&
+                        Arrays.asList(Hypervisor.HypervisorType.KVM,
+                                Hypervisor.HypervisorType.Custom,
+                                Hypervisor.HypervisorType.External).contains(host.getHypervisorType())) {
+                    //only kvm has the requirement to return host details
+                    try {
+                        hostResponse.setDetails(hostDetails, host.getHypervisorType());
+                    } catch (Exception e) {
+                        logger.debug("failed to get host details", e);
+                    }
                 }
             }
 
-        } else if (host.getType() == Host.Type.SecondaryStorage) {
+        } else if (host.getType() == Host.Type.SecondaryStorage && !details.contains(HostDetails.core)) {
             StorageStats secStorageStats = ApiDBUtils.getSecondaryStorageStatistics(host.getId());
             if (secStorageStats != null) {
                 hostResponse.setDiskSizeTotal(secStorageStats.getCapacityBytes());
@@ -285,7 +287,16 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
             }
         }
 
-        hostResponse.setLocalStorageActive(ApiDBUtils.isLocalStorageActiveOnHost(host.getId()));
+        if (!details.contains(HostDetails.core)) {
+            hostResponse.setLocalStorageActive(ApiDBUtils.isLocalStorageActiveOnHost(host.getId()));
+            hostResponse.setHostHAResponse(haConfigDao.findHAResource(host.getId(), HAResource.ResourceType.Host));
+            hostResponse.setOutOfBandManagementResponse(outOfBandManagementDao.findByHost(host.getId()));
+            hostResponse.setHasAnnotation(annotationDao.hasAnnotations(host.getUuid(), AnnotationService.EntityType.HOST.name(),
+                    accountManager.isRootAdmin(CallContext.current().getCallingAccount().getId())));
+            hostResponse.setAnnotation(host.getAnnotation());
+            hostResponse.setLastAnnotated(host.getLastAnnotated());
+            hostResponse.setUsername(host.getUsername());
+        }
 
         if (details.contains(HostDetails.all) || details.contains(HostDetails.events)) {
             Set<com.cloud.host.Status.Event> possibleEvents = host.getStatus().getPossibleEvents();
@@ -303,8 +314,6 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
             }
         }
 
-        hostResponse.setHostHAResponse(haConfigDao.findHAResource(host.getId(), HAResource.ResourceType.Host));
-        hostResponse.setOutOfBandManagementResponse(outOfBandManagementDao.findByHost(host.getId()));
         hostResponse.setResourceState(host.getResourceState().toString());
 
         // set async job
@@ -312,15 +321,25 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
             hostResponse.setJobId(host.getJobUuid());
             hostResponse.setJobStatus(host.getJobStatus());
         }
-        hostResponse.setHasAnnotation(annotationDao.hasAnnotations(host.getUuid(), AnnotationService.EntityType.HOST.name(),
-                accountManager.isRootAdmin(CallContext.current().getCallingAccount().getId())));
-        hostResponse.setAnnotation(host.getAnnotation());
-        hostResponse.setLastAnnotated(host.getLastAnnotated ());
-        hostResponse.setUsername(host.getUsername());
 
         hostResponse.setObjectName("host");
     }
 
+    private void setManagementServerResponse(HostResponse hostResponse, HostJoinVO host, EnumSet<HostDetails> details) {
+        if (host.getManagementServerId() != null) {
+            if (details.size() == 1 && details.contains(HostDetails.core)) {
+                // msid is returned as-is; callers resolve it to avoid a per-host lookup
+                hostResponse.setMsId(host.getManagementServerId());
+            } else {
+                ManagementServerHostVO managementServer = managementServerHostDao.findByMsid(host.getManagementServerId());
+                if (managementServer != null) {
+                    hostResponse.setManagementServerId(managementServer.getUuid());
+                    hostResponse.setManagementServerName(managementServer.getName());
+                }
+            }
+        }
+    }
+
     @Override
     public HostResponse newMinimalHostResponse(HostJoinVO host) {
         HostResponse hostResponse = new HostResponse();