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

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


The following commit(s) were added to refs/heads/main by this push:
     new 2dbc86abfae Fix CKS cluster creation not honoring the CKS ISO arch 
(#11902)
2dbc86abfae is described below

commit 2dbc86abfaea70653d36926527648d013fbc2c92
Author: Nicolas Vazquez <[email protected]>
AuthorDate: Mon Oct 27 02:28:46 2025 -0300

    Fix CKS cluster creation not honoring the CKS ISO arch (#11902)
    
    * Fix CKS cluster creation not honouring the CKS ISO arch
    
    * Fix arch type reference to choose right template
    
    * Include template name on the CKS clusters response
    
    ---------
    
    Co-authored-by: Harikrishna Patnala <[email protected]>
---
 .../cluster/KubernetesClusterManagerImpl.java      |  3 ++-
 ...ernetesClusterResourceModifierActionWorker.java | 22 ++++++++++++++++------
 .../KubernetesClusterScaleWorker.java              |  4 ++--
 .../KubernetesClusterStartWorker.java              |  2 +-
 .../api/response/KubernetesClusterResponse.java    | 12 ++++++++++++
 .../cluster/KubernetesClusterManagerImplTest.java  |  4 ++--
 6 files changed, 35 insertions(+), 12 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 e814e35c2c3..213657db073 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
@@ -556,7 +556,7 @@ public class KubernetesClusterManagerImpl extends 
ManagerBase implements Kuberne
         if (cksIso == null) {
             return systemVMPreferredArchitecture;
         }
-        String cksIsoArchName = cksIso.getArch().name();
+        String cksIsoArchName = cksIso.getArch().getType();
         return cksIsoArchName.equals(systemVMPreferredArchitecture) ? 
systemVMPreferredArchitecture : cksIsoArchName;
     }
 
@@ -807,6 +807,7 @@ public class KubernetesClusterManagerImpl extends 
ManagerBase implements Kuberne
         VMTemplateVO template = 
ApiDBUtils.findTemplateById(kubernetesCluster.getTemplateId());
         if (template != null) {
             response.setTemplateId(template.getUuid());
+            response.setTemplateName(template.getName());
         }
         ServiceOfferingVO offering = 
serviceOfferingDao.findByIdIncludingRemoved(kubernetesCluster.getServiceOfferingId());
         if (offering != null) {
diff --git 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
index 1f976bf3085..cf69234d19e 100644
--- 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
+++ 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
@@ -36,6 +36,7 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import com.cloud.cpu.CPU;
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeploymentPlan;
 import com.cloud.dc.DedicatedResourceVO;
@@ -177,7 +178,7 @@ public class KubernetesClusterResourceModifierActionWorker 
extends KubernetesClu
     }
 
     protected DeployDestination plan(final long nodesCount, final DataCenter 
zone, final ServiceOffering offering,
-                                     final Long domainId, final Long 
accountId, final Hypervisor.HypervisorType hypervisorType) throws 
InsufficientServerCapacityException {
+                                     final Long domainId, final Long 
accountId, final Hypervisor.HypervisorType hypervisorType, CPU.CPUArch arch) 
throws InsufficientServerCapacityException {
         final int cpu_requested = offering.getCpu() * offering.getSpeed();
         final long ram_requested = offering.getRamSize() * 1024L * 1024L;
         boolean useDedicatedHosts = false;
@@ -201,6 +202,15 @@ public class KubernetesClusterResourceModifierActionWorker 
extends KubernetesClu
         if (hypervisorType != null) {
             hosts = hosts.stream().filter(x -> x.getHypervisorType() == 
hypervisorType).collect(Collectors.toList());
         }
+        if (arch != null) {
+            hosts = hosts.stream().filter(x -> 
x.getArch().equals(arch)).collect(Collectors.toList());
+        }
+        if (CollectionUtils.isEmpty(hosts)) {
+            String msg = String.format("Cannot find enough capacity for 
Kubernetes cluster(requested cpu=%d memory=%s) with offering: %s hypervisor: %s 
and arch: %s",
+                    cpu_requested * nodesCount, 
toHumanReadableSize(ram_requested * nodesCount), offering.getName(), 
clusterTemplate.getHypervisorType().toString(), arch.getType());
+            logAndThrow(Level.WARN, msg, new 
InsufficientServerCapacityException(msg, DataCenter.class, zone.getId()));
+        }
+
         final Map<String, Pair<HostVO, Integer>> hosts_with_resevered_capacity 
= new ConcurrentHashMap<String, Pair<HostVO, Integer>>();
         for (HostVO h : hosts) {
             hosts_with_resevered_capacity.put(h.getUuid(), new Pair<HostVO, 
Integer>(h, 0));
@@ -254,8 +264,8 @@ public class KubernetesClusterResourceModifierActionWorker 
extends KubernetesClu
             }
             return new DeployDestination(zone, null, null, null);
         }
-        String msg = String.format("Cannot find enough capacity for Kubernetes 
cluster(requested cpu=%d memory=%s) with offering: %s and hypervisor: %s",
-                cpu_requested * nodesCount, toHumanReadableSize(ram_requested 
* nodesCount), offering.getName(), 
clusterTemplate.getHypervisorType().toString());
+        String msg = String.format("Cannot find enough capacity for Kubernetes 
cluster(requested cpu=%d memory=%s) with offering: %s hypervisor: %s and arch: 
%s",
+                cpu_requested * nodesCount, toHumanReadableSize(ram_requested 
* nodesCount), offering.getName(), 
clusterTemplate.getHypervisorType().toString(), arch.getType());
 
         logger.warn(msg);
         throw new InsufficientServerCapacityException(msg, DataCenter.class, 
zone.getId());
@@ -265,7 +275,7 @@ public class KubernetesClusterResourceModifierActionWorker 
extends KubernetesClu
      * Plan Kubernetes Cluster Deployment
      * @return a map of DeployDestination per node type
      */
-    protected Map<String, DeployDestination> planKubernetesCluster(Long 
domainId, Long accountId, Hypervisor.HypervisorType hypervisorType) throws 
InsufficientServerCapacityException {
+    protected Map<String, DeployDestination> planKubernetesCluster(Long 
domainId, Long accountId, Hypervisor.HypervisorType hypervisorType, CPU.CPUArch 
arch) throws InsufficientServerCapacityException {
         Map<String, DeployDestination> destinationMap = new HashMap<>();
         DataCenter zone = 
dataCenterDao.findById(kubernetesCluster.getZoneId());
         if (logger.isDebugEnabled()) {
@@ -286,7 +296,7 @@ public class KubernetesClusterResourceModifierActionWorker 
extends KubernetesClu
             if (logger.isDebugEnabled()) {
                 logger.debug("Checking deployment destination for {} nodes on 
Kubernetes cluster : {} in zone : {}", nodeType.name(), 
kubernetesCluster.getName(), zone.getName());
             }
-            DeployDestination planForNodeType = plan(nodes, zone, 
nodeOffering, domainId, accountId, hypervisorType);
+            DeployDestination planForNodeType = plan(nodes, zone, 
nodeOffering, domainId, accountId, hypervisorType, arch);
             destinationMap.put(nodeType.name(), planForNodeType);
         }
         return destinationMap;
@@ -322,7 +332,7 @@ public class KubernetesClusterResourceModifierActionWorker 
extends KubernetesClu
         if (Objects.nonNull(domainId) && 
!listDedicatedHostsInDomain(domainId).isEmpty()) {
             DeployDestination dest = null;
             try {
-                Map<String, DeployDestination> destinationMap = 
planKubernetesCluster(domainId, accountId, vm.getHypervisorType());
+                Map<String, DeployDestination> destinationMap = 
planKubernetesCluster(domainId, accountId, vm.getHypervisorType(), 
clusterTemplate.getArch());
                 dest = destinationMap.get(nodeType.name());
             } catch (InsufficientCapacityException e) {
                 logTransitStateAndThrow(Level.ERROR, 
String.format("Provisioning the cluster failed due to insufficient capacity in 
the Kubernetes cluster: %s", kubernetesCluster.getUuid()), 
kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
diff --git 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
index c552b5d57c7..dba858ed809 100644
--- 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
+++ 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
@@ -341,9 +341,9 @@ public class KubernetesClusterScaleWorker extends 
KubernetesClusterResourceModif
             VMTemplateVO clusterTemplate = 
templateDao.findById(kubernetesCluster.getTemplateId());
             try {
                 if (originalState.equals(KubernetesCluster.State.Running)) {
-                    plan(newVmRequiredCount, zone, clusterServiceOffering, 
kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), 
clusterTemplate.getHypervisorType());
+                    plan(newVmRequiredCount, zone, clusterServiceOffering, 
kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), 
clusterTemplate.getHypervisorType(), clusterTemplate.getArch());
                 } else {
-                    plan(kubernetesCluster.getTotalNodeCount() + 
newVmRequiredCount, zone, clusterServiceOffering, 
kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), 
clusterTemplate.getHypervisorType());
+                    plan(kubernetesCluster.getTotalNodeCount() + 
newVmRequiredCount, zone, clusterServiceOffering, 
kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), 
clusterTemplate.getHypervisorType(), clusterTemplate.getArch());
                 }
             } catch (InsufficientCapacityException e) {
                 logTransitStateToFailedIfNeededAndThrow(Level.WARN, 
String.format("Scaling failed for Kubernetes cluster : %s in zone : %s, 
insufficient capacity", kubernetesCluster.getName(), zone.getName()));
diff --git 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
index 62cdd6c5a4e..aa9317e619b 100644
--- 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
+++ 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
@@ -749,7 +749,7 @@ public class KubernetesClusterStartWorker extends 
KubernetesClusterResourceModif
         DeployDestination dest = null;
         try {
             VMTemplateVO clusterTemplate = 
templateDao.findById(kubernetesCluster.getTemplateId());
-            Map<String, DeployDestination> destinationMap = 
planKubernetesCluster(domainId, accountId, clusterTemplate.getHypervisorType());
+            Map<String, DeployDestination> destinationMap = 
planKubernetesCluster(domainId, accountId, clusterTemplate.getHypervisorType(), 
clusterTemplate.getArch());
             dest = destinationMap.get(WORKER.name());
         } catch (InsufficientCapacityException e) {
             logTransitStateAndThrow(Level.ERROR, String.format("Provisioning 
the cluster failed due to insufficient capacity in the Kubernetes cluster: %s", 
kubernetesCluster.getUuid()), kubernetesCluster.getId(), 
KubernetesCluster.Event.CreateFailed, e);
diff --git 
a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
 
b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
index 81d068df9b6..3ad924bda66 100644
--- 
a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
+++ 
b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
@@ -91,6 +91,10 @@ public class KubernetesClusterResponse extends 
BaseResponseWithAnnotations imple
     @Param(description = "the ID of the template of the Kubernetes cluster")
     private String templateId;
 
+    @SerializedName(ApiConstants.TEMPLATE_NAME)
+    @Param(description = "the name of the template of the Kubernetes cluster")
+    private String templateName;
+
     @SerializedName(ApiConstants.NETWORK_ID)
     @Param(description = "the ID of the network of the Kubernetes cluster")
     private String networkId;
@@ -267,6 +271,14 @@ public class KubernetesClusterResponse extends 
BaseResponseWithAnnotations imple
         this.templateId = templateId;
     }
 
+    public String getTemplateName() {
+        return templateName;
+    }
+
+    public void setTemplateName(String templateName) {
+        this.templateName = templateName;
+    }
+
     public String getNetworkId() {
         return networkId;
     }
diff --git 
a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java
 
b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java
index 0793482b8f1..2a381f282de 100644
--- 
a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java
+++ 
b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImplTest.java
@@ -430,7 +430,7 @@ public class KubernetesClusterManagerImplTest {
         VMTemplateVO cksIso = Mockito.mock(VMTemplateVO.class);
         Mockito.when(cksIso.getArch()).thenReturn(CPU.CPUArch.arm64);
         String cksClusterPreferredArch = 
kubernetesClusterManager.getCksClusterPreferredArch(systemVMArch, cksIso);
-        Assert.assertEquals(CPU.CPUArch.arm64.name(), cksClusterPreferredArch);
+        Assert.assertEquals(CPU.CPUArch.arm64.getType(), 
cksClusterPreferredArch);
     }
 
     @Test
@@ -439,6 +439,6 @@ public class KubernetesClusterManagerImplTest {
         VMTemplateVO cksIso = Mockito.mock(VMTemplateVO.class);
         Mockito.when(cksIso.getArch()).thenReturn(CPU.CPUArch.amd64);
         String cksClusterPreferredArch = 
kubernetesClusterManager.getCksClusterPreferredArch(systemVMArch, cksIso);
-        Assert.assertEquals(CPU.CPUArch.amd64.name(), cksClusterPreferredArch);
+        Assert.assertEquals(CPU.CPUArch.amd64.getType(), 
cksClusterPreferredArch);
     }
 }

Reply via email to