Skip to content

Commit 6cacce1

Browse files
authored
Merge pull request #7604 from elastic/prefixed_extended_resources
Add option for passing extended resources in node labels in GKE
2 parents 4f98ba1 + 4f13cab commit 6cacce1

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed

cluster-autoscaler/cloudprovider/gce/templates.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -438,22 +438,47 @@ func extractExtendedResourcesFromKubeEnv(kubeEnv KubeEnv) (apiv1.ResourceList, e
438438
klog.Warningf("error while obtaining extended_resources from AUTOSCALER_ENV_VARS; %v", err)
439439
return nil, err
440440
}
441-
442-
if !found {
443-
return apiv1.ResourceList{}, nil
441+
var extendedResourcesMap map[string]string
442+
if found {
443+
extendedResourcesMap, err = parseKeyValueListToMap(extendedResourcesAsString)
444+
if err != nil {
445+
return apiv1.ResourceList{}, err
446+
}
447+
} else {
448+
extendedResourcesMap = make(map[string]string)
444449
}
445-
446-
extendedResourcesMap, err := parseKeyValueListToMap(extendedResourcesAsString)
450+
nodeLabelsAsString, found, err := extractAutoscalerVarFromKubeEnv(kubeEnv, "node_labels")
447451
if err != nil {
448-
return apiv1.ResourceList{}, err
452+
klog.Warningf("error while obtaining node_labels from AUTOSCALER_ENV_VARS; %v", err)
453+
return nil, err
454+
}
455+
if found {
456+
nodeLabelsMap, err := parseKeyValueListToMap(nodeLabelsAsString)
457+
if err != nil {
458+
return apiv1.ResourceList{}, err
459+
}
460+
const extendedResourcesKeyPrefix = "clusterautoscaler-nodetemplate-resources."
461+
for key, value := range nodeLabelsMap {
462+
if strings.HasPrefix(key, extendedResourcesKeyPrefix) {
463+
key = strings.TrimPrefix(key, extendedResourcesKeyPrefix)
464+
if _, existsBefore := extendedResourcesMap[key]; existsBefore {
465+
klog.Warningf("extended resource %s defined twice in template", key)
466+
}
467+
extendedResourcesMap[key] = value
468+
}
469+
}
470+
}
471+
472+
if len(extendedResourcesMap) == 0 {
473+
return apiv1.ResourceList{}, nil
449474
}
450475

451476
extendedResources := apiv1.ResourceList{}
452477
for name, quantity := range extendedResourcesMap {
453478
if q, err := resource.ParseQuantity(quantity); err == nil && q.Sign() >= 0 {
454479
extendedResources[apiv1.ResourceName(name)] = q
455480
} else if err != nil {
456-
klog.Warningf("ignoring invalid value in extended_resources defined in AUTOSCALER_ENV_VARS; %v", err)
481+
klog.Warningf("ignoring invalid value in extended_resources or node_labels defined in AUTOSCALER_ENV_VARS; %v", err)
457482
}
458483
}
459484
return extendedResources, nil

cluster-autoscaler/cloudprovider/gce/templates_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,18 @@ func TestExtractExtendedResourcesFromKubeEnv(t *testing.T) {
13041304
expectedExtendedResources: apiv1.ResourceList{},
13051305
expectedErr: true,
13061306
},
1307+
{
1308+
name: "two valid values one of them defined in node labels",
1309+
kubeEnvValue: "AUTOSCALER_ENV_VARS: node_labels=a=b,c=d,clusterautoscaler-nodetemplate-resources.test.co/test-resource=3,cloud.google.com/gke-nodepool=pool-3,cloud.google.com/gke-preemptible=true;" +
1310+
"node_taints='dedicated=ml:NoSchedule,test=dev:PreferNoSchedule,a=b:c';" +
1311+
"kube_reserved=cpu=1000m,memory=300000Mi;" +
1312+
"extended_resources=foo=bar,baz=10G",
1313+
expectedExtendedResources: apiv1.ResourceList{
1314+
apiv1.ResourceName("baz"): *resource.NewQuantity(10*units.GB, resource.DecimalSI),
1315+
apiv1.ResourceName("test.co/test-resource"): *resource.NewQuantity(3, resource.DecimalSI),
1316+
},
1317+
expectedErr: false,
1318+
},
13071319
}
13081320

13091321
for _, tc := range testCases {

0 commit comments

Comments
 (0)