@@ -31,6 +31,8 @@ import (
3131
3232 csi "github.com/container-storage-interface/spec/lib/go/csi"
3333
34+ "k8s.io/client-go/kubernetes"
35+ "k8s.io/client-go/rest"
3436 "k8s.io/klog/v2"
3537 "k8s.io/mount-utils"
3638
@@ -571,7 +573,7 @@ func (ns *GCENodeServer) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRe
571573
572574 nodeID := common .CreateNodeID (ns .MetadataService .GetProject (), ns .MetadataService .GetZone (), ns .MetadataService .GetName ())
573575
574- volumeLimits , err := ns .GetVolumeLimits ()
576+ volumeLimits , err := ns .GetVolumeLimits (ctx )
575577 if err != nil {
576578 klog .Errorf ("GetVolumeLimits failed: %v. The error is ignored so that the driver can register" , err .Error ())
577579 // No error should be returned from NodeGetInfo, otherwise the driver will not register
@@ -733,7 +735,7 @@ func (ns *GCENodeServer) NodeExpandVolume(ctx context.Context, req *csi.NodeExpa
733735 }, nil
734736}
735737
736- func (ns * GCENodeServer ) GetVolumeLimits () (int64 , error ) {
738+ func (ns * GCENodeServer ) GetVolumeLimits (ctx context. Context ) (int64 , error ) {
737739 // Machine-type format: n1-type-CPUS or custom-CPUS-RAM or f1/g1-type
738740 machineType := ns .MetadataService .GetMachineType ()
739741
@@ -743,6 +745,22 @@ func (ns *GCENodeServer) GetVolumeLimits() (int64, error) {
743745 return volumeLimitSmall , nil
744746 }
745747 }
748+
749+ // Get attach limit override from label
750+ attachLimitOverride , err := GetAttachLimitsOverrideFromNodeLabel (ctx , ns .MetadataService .GetName ())
751+ if err == nil && attachLimitOverride > 0 && attachLimitOverride < 128 {
752+ return attachLimitOverride , nil
753+ } else {
754+ // If there is an error or the range is not valid, still proceed to get defaults for the machine type
755+ if err != nil {
756+ klog .Warningf ("using default value due to err getting node-restriction.kubernetes.io/gke-volume-attach-limit-override: %v" , err )
757+ }
758+ if attachLimitOverride != 0 {
759+ klog .Warningf ("using default value due to invalid node-restriction.kubernetes.io/gke-volume-attach-limit-override: %d" , attachLimitOverride )
760+ }
761+ }
762+
763+ // Process gen4 machine attach limits
746764 gen4MachineTypesPrefix := []string {"c4a-" , "c4-" , "n4-" }
747765 for _ , gen4Prefix := range gen4MachineTypesPrefix {
748766 if strings .HasPrefix (machineType , gen4Prefix ) {
@@ -768,3 +786,27 @@ func (ns *GCENodeServer) GetVolumeLimits() (int64, error) {
768786
769787 return volumeLimitBig , nil
770788}
789+
790+ func GetAttachLimitsOverrideFromNodeLabel (ctx context.Context , nodeName string ) (int64 , error ) {
791+ cfg , err := rest .InClusterConfig ()
792+ if err != nil {
793+ return 0 , err
794+ }
795+ kubeClient , err := kubernetes .NewForConfig (cfg )
796+ if err != nil {
797+ return 0 , err
798+ }
799+ node , err := getNodeWithRetry (ctx , kubeClient , nodeName )
800+ if err != nil {
801+ return 0 , err
802+ }
803+ if val , found := node .GetLabels ()[fmt .Sprintf (common .NodeRestrictionLabelPrefix , common .AttachLimitOverrideLabel )]; found {
804+ attachLimitOverrideForNode , err := strconv .ParseInt (val , 10 , 64 )
805+ if err != nil {
806+ return 0 , fmt .Errorf ("error getting attach limit override from node label: %v" , err )
807+ }
808+ klog .V (4 ).Infof ("attach limit override for the node: %v" , attachLimitOverrideForNode )
809+ return attachLimitOverrideForNode , nil
810+ }
811+ return 0 , nil
812+ }
0 commit comments