@@ -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 ());
@@ -542,44 +544,40 @@ public boolean scaleCluster() throws CloudRuntimeException {
542544 }
543545 }
544546
545- checkScalingKubernetesClusterOfferingsPerNodeType (serviceOfferingNodeTypeMap , kubernetesCluster );
546-
547547 final boolean autoscalingChanged = isAutoscalingChanged ();
548548 ServiceOffering defaultServiceOffering = serviceOfferingNodeTypeMap .getOrDefault (DEFAULT .name (), null );
549549
550550 for (KubernetesClusterNodeType nodeType : Arrays .asList (CONTROL , ETCD , WORKER )) {
551- boolean isWorkerNodeOrAllNodes = WORKER == nodeType ;
552- final long newVMRequired = (!isWorkerNodeOrAllNodes || clusterSize == null ) ? 0 : clusterSize - originalClusterSize ;
551+ boolean isWorkerNode = WORKER == nodeType ;
552+ final long newVMRequired = (!isWorkerNode || clusterSize == null ) ? 0 : clusterSize - originalClusterSize ;
553553 if (!scaleClusterDefaultOffering && !serviceOfferingNodeTypeMap .containsKey (nodeType .name ()) && newVMRequired == 0 ) {
554554 continue ;
555555 }
556556
557- Long existingNodeTypeOfferingId = getKubernetesClusterNodeTypeOfferingId (kubernetesCluster , nodeType );
558- boolean clusterHasExistingOfferingForNodeType = existingNodeTypeOfferingId != null ;
559- boolean serviceOfferingScalingNeeded = isServiceOfferingScalingNeededForNodeType (nodeType , serviceOfferingNodeTypeMap , kubernetesCluster );
560- ServiceOffering serviceOffering = serviceOfferingNodeTypeMap .getOrDefault (nodeType .name (), defaultServiceOffering );
561- boolean updateNodeOffering = serviceOfferingNodeTypeMap .containsKey (nodeType .name ()) ||
562- scaleClusterDefaultOffering && clusterHasExistingOfferingForNodeType ;
563- boolean updateClusterOffering = isWorkerNodeOrAllNodes && scaleClusterDefaultOffering ;
564- if (isWorkerNodeOrAllNodes && autoscalingChanged ) {
557+ ServiceOffering existingServiceOffering = getExistingServiceOfferingForNodeType (nodeType , kubernetesCluster );
558+ ServiceOffering scalingServiceOffering = serviceOfferingNodeTypeMap .getOrDefault (nodeType .name (), defaultServiceOffering );
559+ boolean isNodeOfferingScalingNeeded = isServiceOfferingScalingNeededForNodeType (existingServiceOffering , scalingServiceOffering );
560+
561+ boolean updateClusterOffering = isWorkerNode && scaleClusterDefaultOffering ;
562+ if (isWorkerNode && autoscalingChanged ) {
565563 boolean autoScaled = autoscaleCluster (this .isAutoscalingEnabled , minSize , maxSize );
566- if (autoScaled && serviceOfferingScalingNeeded ) {
567- scaleKubernetesClusterOffering (nodeType , serviceOffering , updateNodeOffering , updateClusterOffering );
564+ if (autoScaled && isNodeOfferingScalingNeeded ) {
565+ scaleKubernetesClusterOffering (nodeType , scalingServiceOffering , true , updateClusterOffering );
568566 }
569567 stateTransitTo (kubernetesCluster .getId (), KubernetesCluster .Event .OperationSucceeded );
570568 return autoScaled ;
571569 }
572- final boolean clusterSizeScalingNeeded = isWorkerNodeOrAllNodes && clusterSize != null && clusterSize != originalClusterSize ;
573- if (serviceOfferingScalingNeeded && clusterSizeScalingNeeded ) {
570+ final boolean clusterSizeScalingNeeded = isWorkerNode && clusterSize != null && clusterSize != originalClusterSize ;
571+ if (isNodeOfferingScalingNeeded && clusterSizeScalingNeeded ) {
574572 if (newVMRequired > 0 ) {
575- scaleKubernetesClusterOffering (nodeType , serviceOffering , updateNodeOffering , updateClusterOffering );
573+ scaleKubernetesClusterOffering (nodeType , scalingServiceOffering , true , updateClusterOffering );
576574 scaleKubernetesClusterSize (nodeType );
577575 } else {
578576 scaleKubernetesClusterSize (nodeType );
579- scaleKubernetesClusterOffering (nodeType , serviceOffering , updateNodeOffering , updateClusterOffering );
577+ scaleKubernetesClusterOffering (nodeType , scalingServiceOffering , true , updateClusterOffering );
580578 }
581- } else if (serviceOfferingScalingNeeded ) {
582- scaleKubernetesClusterOffering (nodeType , serviceOffering , updateNodeOffering , updateClusterOffering );
579+ } else if (isNodeOfferingScalingNeeded ) {
580+ scaleKubernetesClusterOffering (nodeType , scalingServiceOffering , true , updateClusterOffering );
583581 } else if (clusterSizeScalingNeeded ) {
584582 scaleKubernetesClusterSize (nodeType );
585583 }
@@ -589,6 +587,20 @@ public boolean scaleCluster() throws CloudRuntimeException {
589587 return true ;
590588 }
591589
590+ private ServiceOffering getExistingServiceOfferingForNodeType (KubernetesClusterNodeType nodeType , KubernetesCluster kubernetesCluster ) {
591+ Long existingOfferingId = getExistingOfferingIdForNodeType (nodeType , kubernetesCluster );
592+ if (existingOfferingId == null ) {
593+ logAndThrow (Level .ERROR , String .format ("The Kubernetes cluster %s does not have a service offering set for node type %s" ,
594+ kubernetesCluster .getName (), nodeType .name ()));
595+ }
596+ ServiceOffering existingOffering = serviceOfferingDao .findById (existingOfferingId );
597+ if (existingOffering == null ) {
598+ logAndThrow (Level .ERROR , String .format ("Cannot find service offering with ID %s set on the Kubernetes cluster %s node type %s" ,
599+ existingOfferingId , kubernetesCluster .getName (), nodeType .name ()));
600+ }
601+ return existingOffering ;
602+ }
603+
592604 protected void compareExistingToScalingServiceOfferingForNodeType (Long existingOfferingId , Long scalingOfferingId ,
593605 KubernetesClusterNodeType nodeType ) {
594606 if (existingOfferingId .equals (scalingOfferingId )) {
@@ -599,65 +611,21 @@ protected void compareExistingToScalingServiceOfferingForNodeType(Long existingO
599611 }
600612 }
601613
602- protected void checkScalingKubernetesClusterOfferingsPerNodeType (Map <String , ServiceOffering > scalingNodeTypeMap ,
603- KubernetesCluster kubernetesCluster ) {
604- for (KubernetesClusterNodeType nodeType : Arrays .asList (WORKER , CONTROL , ETCD )) {
605- Long existingNodeTypeOfferingId = getKubernetesClusterNodeTypeOfferingId (kubernetesCluster , nodeType );
606- if (existingNodeTypeOfferingId == null ) {
607- existingNodeTypeOfferingId = kubernetesCluster .getServiceOfferingId ();
608- }
609- if (ETCD == nodeType && (kubernetesCluster .getEtcdNodeCount () == null || kubernetesCluster .getEtcdNodeCount () == 0 )) {
610- continue ;
611- }
612- String scalingMapKey = scalingNodeTypeMap .containsKey (nodeType .name ()) ? nodeType .name () : DEFAULT .name ();
613- ServiceOffering scalingServiceOffering = scalingNodeTypeMap .get (scalingMapKey );
614- if (scalingServiceOffering == null ) {
615- String err = String .format ("Cannot find a service offering to scale the nodes of type %s" , nodeType .name ());
616- logger .error (err );
617- throw new CloudRuntimeException (err );
618- }
619- compareExistingToScalingServiceOfferingForNodeType (existingNodeTypeOfferingId ,
620- scalingServiceOffering .getId (), nodeType );
621- }
622- }
623-
624- private Long getKubernetesClusterNodeTypeOfferingId (KubernetesCluster kubernetesCluster , KubernetesClusterNodeType nodeType ) {
625- if (nodeType == WORKER ) {
626- return kubernetesCluster .getWorkerNodeServiceOfferingId ();
627- } else if (nodeType == ETCD ) {
628- return kubernetesCluster .getEtcdNodeServiceOfferingId ();
629- } else if (nodeType == CONTROL ) {
630- return kubernetesCluster .getControlNodeServiceOfferingId ();
631- }
632- return kubernetesCluster .getServiceOfferingId ();
633- }
634-
635- protected boolean isServiceOfferingScalingNeededForNodeType (KubernetesClusterNodeType nodeType ,
636- Map <String , ServiceOffering > map , KubernetesCluster kubernetesCluster ) {
637- // DEFAULT node type means only the global service offering has been set for the Kubernetes cluster
638- Long existingOfferingId = map .containsKey (DEFAULT .name ()) ?
639- kubernetesCluster .getServiceOfferingId () :
640- getExistingOfferingIdForNodeType (nodeType , kubernetesCluster );
641- if (existingOfferingId == null ) {
642- logAndThrow (Level .ERROR , String .format ("The Kubernetes cluster %s does not have a global service offering set" , kubernetesCluster .getName ()));
643- }
644- ServiceOffering existingOffering = serviceOfferingDao .findById (existingOfferingId );
645- if (existingOffering == null ) {
646- logAndThrow (Level .ERROR , String .format ("Cannot find the global service offering with ID %s set on the Kubernetes cluster %s" , existingOfferingId , kubernetesCluster .getName ()));
647- }
648- ServiceOffering newOffering = map .containsKey (DEFAULT .name ()) ? map .get (DEFAULT .name ()) : map .get (nodeType .name ());
649- return newOffering != null && newOffering .getId () != existingOffering .getId ();
614+ protected boolean isServiceOfferingScalingNeededForNodeType (ServiceOffering existingServiceOffering ,
615+ ServiceOffering scalingServiceOffering ) {
616+ return scalingServiceOffering != null && existingServiceOffering != null &&
617+ scalingServiceOffering .getId () != existingServiceOffering .getId ();
650618 }
651619
652620 protected Long getExistingOfferingIdForNodeType (KubernetesClusterNodeType nodeType , KubernetesCluster kubernetesCluster ) {
653621 List <KubernetesClusterVmMapVO > clusterVms = kubernetesClusterVmMapDao .listByClusterIdAndVmType (kubernetesCluster .getId (), nodeType );
654622 if (CollectionUtils .isEmpty (clusterVms )) {
655- return null ;
623+ return kubernetesCluster . getServiceOfferingId () ;
656624 }
657625 KubernetesClusterVmMapVO clusterVm = clusterVms .get (0 );
658626 UserVmVO clusterUserVm = userVmDao .findById (clusterVm .getVmId ());
659627 if (clusterUserVm == null ) {
660- return null ;
628+ return kubernetesCluster . getServiceOfferingId () ;
661629 }
662630 return clusterUserVm .getServiceOfferingId ();
663631 }
0 commit comments