@@ -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