@@ -31,6 +31,8 @@ import (
31
31
32
32
csi "github.com/container-storage-interface/spec/lib/go/csi"
33
33
34
+ "k8s.io/client-go/kubernetes"
35
+ "k8s.io/client-go/rest"
34
36
"k8s.io/klog/v2"
35
37
"k8s.io/mount-utils"
36
38
@@ -571,7 +573,7 @@ func (ns *GCENodeServer) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRe
571
573
572
574
nodeID := common .CreateNodeID (ns .MetadataService .GetProject (), ns .MetadataService .GetZone (), ns .MetadataService .GetName ())
573
575
574
- volumeLimits , err := ns .GetVolumeLimits ()
576
+ volumeLimits , err := ns .GetVolumeLimits (ctx )
575
577
if err != nil {
576
578
klog .Errorf ("GetVolumeLimits failed: %v. The error is ignored so that the driver can register" , err .Error ())
577
579
// 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
733
735
}, nil
734
736
}
735
737
736
- func (ns * GCENodeServer ) GetVolumeLimits () (int64 , error ) {
738
+ func (ns * GCENodeServer ) GetVolumeLimits (ctx context. Context ) (int64 , error ) {
737
739
// Machine-type format: n1-type-CPUS or custom-CPUS-RAM or f1/g1-type
738
740
machineType := ns .MetadataService .GetMachineType ()
739
741
@@ -743,6 +745,22 @@ func (ns *GCENodeServer) GetVolumeLimits() (int64, error) {
743
745
return volumeLimitSmall , nil
744
746
}
745
747
}
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
746
764
gen4MachineTypesPrefix := []string {"c4a-" , "c4-" , "n4-" }
747
765
for _ , gen4Prefix := range gen4MachineTypesPrefix {
748
766
if strings .HasPrefix (machineType , gen4Prefix ) {
@@ -768,3 +786,27 @@ func (ns *GCENodeServer) GetVolumeLimits() (int64, error) {
768
786
769
787
return volumeLimitBig , nil
770
788
}
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