Skip to content

Commit 3db8137

Browse files
authored
Merge pull request #2108 from sunnylovestiramisu/release-1.17
[release-1.17] Add Labels Override for Gen3/Gen4 VMs
2 parents 4f71e5e + 16a57d4 commit 3db8137

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

pkg/common/constants.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ const (
5656
// Node label for Data Cache (only applicable to GKE nodes)
5757
NodeLabelPrefix = "cloud.google.com/%s"
5858
DataCacheLssdCountLabel = "gke-data-cache-disk"
59+
// Node label for attach limit override
60+
NodeRestrictionLabelPrefix = "node-restriction.kubernetes.io/%s"
61+
AttachLimitOverrideLabel = "gke-volume-attach-limit-override"
5962
)
6063

6164
// doc https://cloud.google.com/compute/docs/disks/hyperdisks#max-total-disks-per-vm

pkg/common/utils.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"net/http"
2525
"regexp"
2626
"slices"
27+
"strconv"
2728
"strings"
2829
"time"
2930

@@ -772,6 +773,25 @@ func MapNumber(num int64) int64 {
772773
return 0
773774
}
774775

776+
func ExtractCPUFromMachineType(input string) (int64, error) {
777+
// Regex to find the number at the end of the string,
778+
// it allows optional -lssd suffix.
779+
re := regexp.MustCompile(`(\d+)(?:-lssd|-metal)?$`)
780+
781+
match := re.FindStringSubmatch(input)
782+
if len(match) < 2 {
783+
return 0, fmt.Errorf("no number found at the end of the input string: %s", input)
784+
}
785+
786+
numberStr := match[1]
787+
number, err := strconv.ParseInt(numberStr, 10, 64)
788+
if err != nil {
789+
return 0, fmt.Errorf("failed to convert string '%s' to integer: %w", numberStr, err)
790+
}
791+
792+
return number, nil
793+
}
794+
775795
// IsUpdateIopsThroughputValuesAllowed checks if a disk type is hyperdisk,
776796
// which implies that IOPS and throughput values can be updated.
777797
func IsUpdateIopsThroughputValuesAllowed(disk *computev1.Disk) bool {

pkg/gce-pd-csi-driver/node.go

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

pkg/gce-pd-csi-driver/node_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,21 @@ func TestNodeGetVolumeLimits(t *testing.T) {
313313
machineType: "a4-highgpu-8g",
314314
expVolumeLimit: a4HyperdiskLimit,
315315
},
316+
{
317+
name: "c3-standard-4",
318+
machineType: "c3-standard-4",
319+
expVolumeLimit: volumeLimitBig,
320+
},
321+
{
322+
name: "c3d-highmem-8-lssd",
323+
machineType: "c3d-highmem-8-lssd",
324+
expVolumeLimit: volumeLimitBig,
325+
},
326+
{
327+
name: "c4a-standard-32-lssd",
328+
machineType: "c4a-standard-32-lssd",
329+
expVolumeLimit: 49,
330+
},
316331
}
317332

318333
for _, tc := range testCases {

0 commit comments

Comments
 (0)