nvazquez commented on code in PR #9102:
URL: https://github.com/apache/cloudstack/pull/9102#discussion_r2110708931


##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java:
##########
@@ -446,37 +528,86 @@ public boolean scaleCluster() throws 
CloudRuntimeException {
         }
         scaleTimeoutTime = System.currentTimeMillis() + 
KubernetesClusterService.KubernetesClusterScaleTimeout.value() * 1000;
         final long originalClusterSize = kubernetesCluster.getNodeCount();
-        final ServiceOffering existingServiceOffering = 
serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
-        if (existingServiceOffering == null) {
-            logAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster 
%s failed, service offering for the Kubernetes cluster not found!", 
kubernetesCluster));
+        if (serviceOfferingNodeTypeMap.containsKey(DEFAULT.name())) {
+            final ServiceOffering existingServiceOffering = 
serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
+            if (existingServiceOffering == null) {
+                logAndThrow(Level.ERROR, String.format("Scaling Kubernetes 
cluster : %s failed, service offering for the Kubernetes cluster not found!", 
kubernetesCluster.getName()));
+            }
         }
+
         final boolean autoscalingChanged = isAutoscalingChanged();
-        final boolean serviceOfferingScalingNeeded = serviceOffering != null 
&& serviceOffering.getId() != existingServiceOffering.getId();
+        boolean hasDefaultOffering = 
serviceOfferingNodeTypeMap.containsKey(DEFAULT.name());
+        Long existingDefaultOfferingId = 
kubernetesCluster.getServiceOfferingId();
+        ServiceOffering defaultServiceOffering = 
serviceOfferingNodeTypeMap.getOrDefault(DEFAULT.name(), null);
+
+        for (KubernetesClusterNodeType nodeType : Arrays.asList(CONTROL, ETCD, 
WORKER)) {
+            boolean isWorkerNodeOrAllNodes = WORKER == nodeType;
+            final long newVMRequired = (!isWorkerNodeOrAllNodes || clusterSize 
== null) ? 0 : clusterSize - originalClusterSize;
+            if (!hasDefaultOffering && 
!serviceOfferingNodeTypeMap.containsKey(nodeType.name()) && newVMRequired == 0) 
{
+                continue;
+            }
 
-        if (autoscalingChanged) {
-            boolean autoScaled = autoscaleCluster(this.isAutoscalingEnabled, 
minSize, maxSize);
-            if (autoScaled && serviceOfferingScalingNeeded) {
-                scaleKubernetesClusterOffering();
+            boolean serviceOfferingScalingNeeded = 
isServiceOfferingScalingNeededForNodeType(nodeType, serviceOfferingNodeTypeMap, 
kubernetesCluster, existingDefaultOfferingId);
+            ServiceOffering serviceOffering = 
serviceOfferingNodeTypeMap.getOrDefault(nodeType.name(), 
defaultServiceOffering);
+            boolean updateNodeOffering = 
serviceOfferingNodeTypeMap.containsKey(nodeType.name());
+            boolean updateClusterOffering = isWorkerNodeOrAllNodes && 
hasDefaultOffering;
+            if (isWorkerNodeOrAllNodes && autoscalingChanged) {
+                boolean autoScaled = 
autoscaleCluster(this.isAutoscalingEnabled, minSize, maxSize);
+                if (autoScaled && serviceOfferingScalingNeeded) {
+                    scaleKubernetesClusterOffering(nodeType, serviceOffering, 
updateNodeOffering, updateClusterOffering);
+                }
+                stateTransitTo(kubernetesCluster.getId(), 
KubernetesCluster.Event.OperationSucceeded);
+                return autoScaled;
             }
-            stateTransitTo(kubernetesCluster.getId(), 
KubernetesCluster.Event.OperationSucceeded);
-            return autoScaled;
-        }
-        final boolean clusterSizeScalingNeeded = clusterSize != null && 
clusterSize != originalClusterSize;
-        final long newVMRequired = clusterSize == null ? 0 : clusterSize - 
originalClusterSize;
-        if (serviceOfferingScalingNeeded && clusterSizeScalingNeeded) {
-            if (newVMRequired > 0) {
-                scaleKubernetesClusterOffering();
-                scaleKubernetesClusterSize();
-            } else {
-                scaleKubernetesClusterSize();
-                scaleKubernetesClusterOffering();
+            final boolean clusterSizeScalingNeeded = isWorkerNodeOrAllNodes && 
clusterSize != null && clusterSize != originalClusterSize;
+            if (serviceOfferingScalingNeeded && clusterSizeScalingNeeded) {
+                if (newVMRequired > 0) {
+                    scaleKubernetesClusterOffering(nodeType, serviceOffering, 
updateNodeOffering, updateClusterOffering);
+                    scaleKubernetesClusterSize(nodeType);
+                } else {
+                    scaleKubernetesClusterSize(nodeType);
+                    scaleKubernetesClusterOffering(nodeType, serviceOffering, 
updateNodeOffering, updateClusterOffering);
+                }
+            } else if (serviceOfferingScalingNeeded) {
+                scaleKubernetesClusterOffering(nodeType, serviceOffering, 
updateNodeOffering, updateClusterOffering);
+            } else if (clusterSizeScalingNeeded) {
+                scaleKubernetesClusterSize(nodeType);
             }
-        } else if (serviceOfferingScalingNeeded) {
-            scaleKubernetesClusterOffering();
-        } else if (clusterSizeScalingNeeded) {
-            scaleKubernetesClusterSize();
         }
+
         stateTransitTo(kubernetesCluster.getId(), 
KubernetesCluster.Event.OperationSucceeded);
         return true;
     }
+
+    protected boolean 
isServiceOfferingScalingNeededForNodeType(KubernetesClusterNodeType nodeType,
+                                                                Map<String, 
ServiceOffering> map, KubernetesCluster kubernetesCluster,
+                                                                Long 
existingDefaultOfferingId) {
+        Long existingOfferingId = map.containsKey(DEFAULT.name()) ?
+                existingDefaultOfferingId :
+                getExistingOfferingIdForNodeType(nodeType, kubernetesCluster);

Review Comment:
   Thanks, fixed



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@cloudstack.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to