Skip to content

Commit 8464bd3

Browse files
nvazquezdhslove
authored andcommitted
[CKS] Simplify logic for scaling CKS cluster service offerings (apache#11063)
1 parent 6e3ceb0 commit 8464bd3

File tree

1 file changed

+44
-41
lines changed

1 file changed

+44
-41
lines changed

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,8 @@ public boolean scaleCluster() throws CloudRuntimeException {
532532
}
533533
scaleTimeoutTime = System.currentTimeMillis() + KubernetesClusterService.KubernetesClusterScaleTimeout.value() * 1000;
534534
final long originalClusterSize = kubernetesCluster.getNodeCount();
535+
536+
// DEFAULT node type means only the global service offering has been set for the Kubernetes cluster
535537
boolean scaleClusterDefaultOffering = serviceOfferingNodeTypeMap.containsKey(DEFAULT.name());
536538
if (scaleClusterDefaultOffering) {
537539
final ServiceOffering existingServiceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
@@ -546,38 +548,37 @@ public boolean scaleCluster() throws CloudRuntimeException {
546548
ServiceOffering defaultServiceOffering = serviceOfferingNodeTypeMap.getOrDefault(DEFAULT.name(), null);
547549

548550
for (KubernetesClusterNodeType nodeType : Arrays.asList(CONTROL, ETCD, WORKER)) {
549-
boolean isWorkerNodeOrAllNodes = WORKER == nodeType;
550-
final long newVMRequired = (!isWorkerNodeOrAllNodes || clusterSize == null) ? 0 : clusterSize - originalClusterSize;
551+
boolean isWorkerNode = WORKER == nodeType;
552+
final long newVMRequired = (!isWorkerNode || clusterSize == null) ? 0 : clusterSize - originalClusterSize;
551553
if (!scaleClusterDefaultOffering && !serviceOfferingNodeTypeMap.containsKey(nodeType.name()) && newVMRequired == 0) {
552554
continue;
553555
}
554556

555-
Long existingNodeTypeOfferingId = getKubernetesClusterNodeTypeOfferingId(kubernetesCluster, nodeType);
556-
boolean clusterHasExistingOfferingForNodeType = existingNodeTypeOfferingId != null;
557-
boolean serviceOfferingScalingNeeded = isServiceOfferingScalingNeededForNodeType(nodeType, serviceOfferingNodeTypeMap, kubernetesCluster);
558-
ServiceOffering serviceOffering = serviceOfferingNodeTypeMap.getOrDefault(nodeType.name(), defaultServiceOffering);
559-
boolean updateNodeOffering = serviceOfferingNodeTypeMap.containsKey(nodeType.name()) ||
560-
scaleClusterDefaultOffering && clusterHasExistingOfferingForNodeType;
561-
boolean updateClusterOffering = isWorkerNodeOrAllNodes && scaleClusterDefaultOffering;
562-
if (isWorkerNodeOrAllNodes && autoscalingChanged) {
557+
ServiceOffering existingServiceOffering = getExistingServiceOfferingForNodeType(nodeType, kubernetesCluster);
558+
ServiceOffering scalingServiceOffering = serviceOfferingNodeTypeMap.getOrDefault(nodeType.name(), defaultServiceOffering);
559+
boolean isNodeOfferingScalingNeeded = isServiceOfferingScalingNeededForNodeType(existingServiceOffering, scalingServiceOffering);
560+
boolean updateNodeOffering = serviceOfferingNodeTypeMap.containsKey(nodeType.name()) || isNodeOfferingScalingNeeded;
561+
562+
boolean updateClusterOffering = isWorkerNode && scaleClusterDefaultOffering;
563+
if (isWorkerNode && autoscalingChanged) {
563564
boolean autoScaled = autoscaleCluster(this.isAutoscalingEnabled, minSize, maxSize);
564-
if (autoScaled && serviceOfferingScalingNeeded) {
565-
scaleKubernetesClusterOffering(nodeType, serviceOffering, updateNodeOffering, updateClusterOffering);
565+
if (autoScaled && isNodeOfferingScalingNeeded) {
566+
scaleKubernetesClusterOffering(nodeType, scalingServiceOffering, updateNodeOffering, updateClusterOffering);
566567
}
567568
stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
568569
return autoScaled;
569570
}
570-
final boolean clusterSizeScalingNeeded = isWorkerNodeOrAllNodes && clusterSize != null && clusterSize != originalClusterSize;
571-
if (serviceOfferingScalingNeeded && clusterSizeScalingNeeded) {
571+
final boolean clusterSizeScalingNeeded = isWorkerNode && clusterSize != null && clusterSize != originalClusterSize;
572+
if (isNodeOfferingScalingNeeded && clusterSizeScalingNeeded) {
572573
if (newVMRequired > 0) {
573-
scaleKubernetesClusterOffering(nodeType, serviceOffering, updateNodeOffering, updateClusterOffering);
574+
scaleKubernetesClusterOffering(nodeType, scalingServiceOffering, updateNodeOffering, updateClusterOffering);
574575
scaleKubernetesClusterSize(nodeType);
575576
} else {
576577
scaleKubernetesClusterSize(nodeType);
577-
scaleKubernetesClusterOffering(nodeType, serviceOffering, updateNodeOffering, updateClusterOffering);
578+
scaleKubernetesClusterOffering(nodeType, scalingServiceOffering, updateNodeOffering, updateClusterOffering);
578579
}
579-
} else if (serviceOfferingScalingNeeded) {
580-
scaleKubernetesClusterOffering(nodeType, serviceOffering, updateNodeOffering, updateClusterOffering);
580+
} else if (isNodeOfferingScalingNeeded) {
581+
scaleKubernetesClusterOffering(nodeType, scalingServiceOffering, updateNodeOffering, updateClusterOffering);
581582
} else if (clusterSizeScalingNeeded) {
582583
scaleKubernetesClusterSize(nodeType);
583584
}
@@ -587,43 +588,45 @@ public boolean scaleCluster() throws CloudRuntimeException {
587588
return true;
588589
}
589590

590-
private Long getKubernetesClusterNodeTypeOfferingId(KubernetesCluster kubernetesCluster, KubernetesClusterNodeType nodeType) {
591-
if (nodeType == WORKER) {
592-
return kubernetesCluster.getWorkerNodeServiceOfferingId();
593-
} else if (nodeType == ETCD) {
594-
return kubernetesCluster.getEtcdNodeServiceOfferingId();
595-
} else if (nodeType == CONTROL) {
596-
return kubernetesCluster.getControlNodeServiceOfferingId();
597-
}
598-
return null;
599-
}
600-
601-
protected boolean isServiceOfferingScalingNeededForNodeType(KubernetesClusterNodeType nodeType,
602-
Map<String, ServiceOffering> map, KubernetesCluster kubernetesCluster) {
603-
// DEFAULT node type means only the global service offering has been set for the Kubernetes cluster
604-
Long existingOfferingId = map.containsKey(DEFAULT.name()) ?
605-
kubernetesCluster.getServiceOfferingId() :
606-
getExistingOfferingIdForNodeType(nodeType, kubernetesCluster);
591+
private ServiceOffering getExistingServiceOfferingForNodeType(KubernetesClusterNodeType nodeType, KubernetesCluster kubernetesCluster) {
592+
Long existingOfferingId = getExistingOfferingIdForNodeType(nodeType, kubernetesCluster);
607593
if (existingOfferingId == null) {
608-
logAndThrow(Level.ERROR, String.format("The Kubernetes cluster %s does not have a global service offering set", kubernetesCluster.getName()));
594+
logAndThrow(Level.ERROR, String.format("The Kubernetes cluster %s does not have a service offering set for node type %s",
595+
kubernetesCluster.getName(), nodeType.name()));
609596
}
610597
ServiceOffering existingOffering = serviceOfferingDao.findById(existingOfferingId);
611598
if (existingOffering == null) {
612-
logAndThrow(Level.ERROR, String.format("Cannot find the global service offering with ID %s set on the Kubernetes cluster %s", existingOfferingId, kubernetesCluster.getName()));
599+
logAndThrow(Level.ERROR, String.format("Cannot find service offering with ID %s set on the Kubernetes cluster %s node type %s",
600+
existingOfferingId, kubernetesCluster.getName(), nodeType.name()));
601+
}
602+
return existingOffering;
603+
}
604+
605+
protected void compareExistingToScalingServiceOfferingForNodeType(Long existingOfferingId, Long scalingOfferingId,
606+
KubernetesClusterNodeType nodeType) {
607+
if (existingOfferingId.equals(scalingOfferingId)) {
608+
String err = String.format("Cannot scale the nodes of type %s as the provided offering %s " +
609+
"is the same as the existing offering", nodeType.name(), scalingOfferingId);
610+
logger.error(err);
611+
throw new CloudRuntimeException(err);
613612
}
614-
ServiceOffering newOffering = map.containsKey(DEFAULT.name()) ? map.get(DEFAULT.name()) : map.get(nodeType.name());
615-
return newOffering != null && newOffering.getId() != existingOffering.getId();
613+
}
614+
615+
protected boolean isServiceOfferingScalingNeededForNodeType(ServiceOffering existingServiceOffering,
616+
ServiceOffering scalingServiceOffering) {
617+
return scalingServiceOffering != null && existingServiceOffering != null &&
618+
scalingServiceOffering.getId() != existingServiceOffering.getId();
616619
}
617620

618621
protected Long getExistingOfferingIdForNodeType(KubernetesClusterNodeType nodeType, KubernetesCluster kubernetesCluster) {
619622
List<KubernetesClusterVmMapVO> clusterVms = kubernetesClusterVmMapDao.listByClusterIdAndVmType(kubernetesCluster.getId(), nodeType);
620623
if (CollectionUtils.isEmpty(clusterVms)) {
621-
return null;
624+
return kubernetesCluster.getServiceOfferingId();
622625
}
623626
KubernetesClusterVmMapVO clusterVm = clusterVms.get(0);
624627
UserVmVO clusterUserVm = userVmDao.findById(clusterVm.getVmId());
625628
if (clusterUserVm == null) {
626-
return null;
629+
return kubernetesCluster.getServiceOfferingId();
627630
}
628631
return clusterUserVm.getServiceOfferingId();
629632
}

0 commit comments

Comments
 (0)