nvazquez commented on code in PR #9102:
URL: https://github.com/apache/cloudstack/pull/9102#discussion_r2110707933
##########
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);
+ if (existingOfferingId == null) {
+ logAndThrow(Level.ERROR, String.format("The Kubernetes cluster %s
does not have a global service offering set", kubernetesCluster.getName()));
+ }
+ ServiceOffering existingOffering =
serviceOfferingDao.findById(existingOfferingId);
+ if (existingOffering == null) {
+ logAndThrow(Level.ERROR, String.format("Cannot find the global
service offering with ID %s set on the Kubernetes cluster %s",
existingOfferingId, kubernetesCluster.getName()));
+ }
+ ServiceOffering newOffering = map.containsKey(DEFAULT.name()) ?
map.get(DEFAULT.name()) : map.get(nodeType.name());
+ return newOffering != null && newOffering.getId() !=
existingOffering.getId();
+ }
+
+ protected Long getExistingOfferingIdForNodeType(KubernetesClusterNodeType
nodeType, KubernetesCluster kubernetesCluster) {
+ Long offeringId = null;
+ if (WORKER == nodeType) {
+ offeringId = kubernetesCluster.getWorkerServiceOfferingId();
+ } else if (CONTROL == nodeType) {
+ offeringId = kubernetesCluster.getControlServiceOfferingId();
+ } else if (ETCD == nodeType) {
+ offeringId = kubernetesCluster.getEtcdServiceOfferingId();
+ }
+ if (offeringId == null) {
+ offeringId = kubernetesCluster.getServiceOfferingId();
+ }
+ return offeringId;
+ }
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]