Skip to content

Commit c8cfd38

Browse files
authored
Merge pull request kubernetes#2493 from adammw/adammw/custom-ignored-labels
Add support for passing custom ignored labels
2 parents ee627f2 + 8313e96 commit c8cfd38

File tree

12 files changed

+168
-82
lines changed

12 files changed

+168
-82
lines changed

cluster-autoscaler/config/autoscaling_options.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ type AutoscalingOptions struct {
135135
MaxBulkSoftTaintTime time.Duration
136136
// IgnoredTaints is a list of taints to ignore when considering a node template for scheduling.
137137
IgnoredTaints []string
138+
// BalancingExtraIgnoredLabels is a list of labels to additionally ignore when comparing if two node groups are similar.
139+
// Labels in BasicIgnoredLabels and the cloud provider-specific ignored labels are always ignored.
140+
BalancingExtraIgnoredLabels []string
138141
// AWSUseStaticInstanceList tells if AWS cloud provider use static instance type list or dynamically fetch from remote APIs.
139142
AWSUseStaticInstanceList bool
140143
// Path to kube configuration if available

cluster-autoscaler/core/scale_test_common.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func NewTestProcessors() *processors.AutoscalingProcessors {
132132
return &processors.AutoscalingProcessors{
133133
PodListProcessor: NewFilterOutSchedulablePodListProcessor(),
134134
NodeGroupListProcessor: &nodegroups.NoOpNodeGroupListProcessor{},
135-
NodeGroupSetProcessor: &nodegroupset.BalancingNodeGroupSetProcessor{},
135+
NodeGroupSetProcessor: nodegroupset.NewDefaultNodeGroupSetProcessor([]string{}),
136136
// TODO(bskiba): change scale up test so that this can be a NoOpProcessor
137137
ScaleUpStatusProcessor: &status.EventingScaleUpStatusProcessor{},
138138
ScaleDownStatusProcessor: &status.NoOpScaleDownStatusProcessor{},

cluster-autoscaler/main.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,10 @@ var (
168168
regional = flag.Bool("regional", false, "Cluster is regional.")
169169
newPodScaleUpDelay = flag.Duration("new-pod-scale-up-delay", 0*time.Second, "Pods less than this old will not be considered for scale-up.")
170170

171-
ignoreTaintsFlag = multiStringFlag("ignore-taint", "Specifies a taint to ignore in node templates when considering to scale a node group")
172-
awsUseStaticInstanceList = flag.Bool("aws-use-static-instance-list", false, "Should CA fetch instance types in runtime or use a static list. AWS only")
173-
enableProfiling = flag.Bool("profiling", false, "Is debug/pprof endpoint enabled")
171+
ignoreTaintsFlag = multiStringFlag("ignore-taint", "Specifies a taint to ignore in node templates when considering to scale a node group")
172+
balancingIgnoreLabelsFlag = multiStringFlag("balancing-ignore-label", "Specifies a label to ignore in addition to the basic and cloud-provider set of labels when comparing if two node groups are similar")
173+
awsUseStaticInstanceList = flag.Bool("aws-use-static-instance-list", false, "Should CA fetch instance types in runtime or use a static list. AWS only")
174+
enableProfiling = flag.Bool("profiling", false, "Is debug/pprof endpoint enabled")
174175
)
175176

176177
func createAutoscalingOptions() config.AutoscalingOptions {
@@ -235,6 +236,7 @@ func createAutoscalingOptions() config.AutoscalingOptions {
235236
Regional: *regional,
236237
NewPodScaleUpDelay: *newPodScaleUpDelay,
237238
IgnoredTaints: *ignoreTaintsFlag,
239+
BalancingExtraIgnoredLabels: *balancingIgnoreLabelsFlag,
238240
KubeConfigPath: *kubeConfigFile,
239241
NodeDeletionDelayTimeout: *nodeDeletionDelayTimeout,
240242
AWSUseStaticInstanceList: *awsUseStaticInstanceList,
@@ -289,21 +291,24 @@ func buildAutoscaler() (core.Autoscaler, error) {
289291
kubeClient := createKubeClient(getKubeConfig())
290292
eventsKubeClient := createKubeClient(getKubeConfig())
291293

292-
processors := ca_processors.DefaultProcessors()
293-
processors.PodListProcessor = core.NewFilterOutSchedulablePodListProcessor()
294-
if autoscalingOptions.CloudProviderName == cloudprovider.AzureProviderName {
295-
processors.NodeGroupSetProcessor = &nodegroupset.BalancingNodeGroupSetProcessor{
296-
Comparator: nodegroupset.IsAzureNodeInfoSimilar}
297-
} else if autoscalingOptions.CloudProviderName == cloudprovider.AwsProviderName {
298-
processors.NodeGroupSetProcessor = &nodegroupset.BalancingNodeGroupSetProcessor{
299-
Comparator: nodegroupset.IsAwsNodeInfoSimilar}
300-
}
301-
302294
opts := core.AutoscalerOptions{
303295
AutoscalingOptions: autoscalingOptions,
304296
KubeClient: kubeClient,
305297
EventsKubeClient: eventsKubeClient,
306-
Processors: processors,
298+
}
299+
300+
opts.Processors = ca_processors.DefaultProcessors()
301+
opts.Processors.PodListProcessor = core.NewFilterOutSchedulablePodListProcessor()
302+
303+
nodeInfoComparatorBuilder := nodegroupset.CreateGenericNodeInfoComparator
304+
if autoscalingOptions.CloudProviderName == cloudprovider.AzureProviderName {
305+
nodeInfoComparatorBuilder = nodegroupset.CreateAzureNodeInfoComparator
306+
} else if autoscalingOptions.CloudProviderName == cloudprovider.AwsProviderName {
307+
nodeInfoComparatorBuilder = nodegroupset.CreateAwsNodeInfoComparator
308+
}
309+
310+
opts.Processors.NodeGroupSetProcessor = &nodegroupset.BalancingNodeGroupSetProcessor{
311+
Comparator: nodeInfoComparatorBuilder(autoscalingOptions.BalancingExtraIgnoredLabels),
307312
}
308313

309314
// This metric should be published only once.

cluster-autoscaler/processors/nodegroupset/aws_nodegroups.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import (
2020
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
2121
)
2222

23-
// IsAwsNodeInfoSimilar adds AWS specific node labels to the list of ignored labels.
24-
func IsAwsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
23+
// CreateAwsNodeInfoComparator returns a comparator that checks if two nodes should be considered
24+
// part of the same NodeGroupSet. This is true if they match usual conditions checked by IsCloudProviderNodeInfoSimilar,
25+
// even if they have different AWS-specific labels.
26+
func CreateAwsNodeInfoComparator(extraIgnoredLabels []string) NodeInfoComparator {
2527
awsIgnoredLabels := map[string]bool{
2628
"alpha.eksctl.io/instance-id": true, // this is a label used by eksctl to identify instances.
2729
"alpha.eksctl.io/nodegroup-name": true, // this is a label used by eksctl to identify "node group" names.
@@ -33,5 +35,12 @@ func IsAwsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
3335
for k, v := range BasicIgnoredLabels {
3436
awsIgnoredLabels[k] = v
3537
}
36-
return IsCloudProviderNodeInfoSimilar(n1, n2, awsIgnoredLabels)
38+
39+
for _, k := range extraIgnoredLabels {
40+
awsIgnoredLabels[k] = true
41+
}
42+
43+
return func(n1, n2 *schedulernodeinfo.NodeInfo) bool {
44+
return IsCloudProviderNodeInfoSimilar(n1, n2, awsIgnoredLabels)
45+
}
3746
}

cluster-autoscaler/processors/nodegroupset/azure_nodegroups.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,23 @@ func nodesFromSameAzureNodePool(n1, n2 *schedulernodeinfo.NodeInfo) bool {
2929
return n1AzureNodePool != "" && n1AzureNodePool == n2AzureNodePool
3030
}
3131

32-
// IsAzureNodeInfoSimilar compares if two nodes should be considered part of the
33-
// same NodeGroupSet. This is true if they either belong to the same Azure agentpool
34-
// or match usual conditions checked by IsAzureNodeInfoSimilar, even if they have different agentpool labels.
35-
func IsAzureNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
36-
if nodesFromSameAzureNodePool(n1, n2) {
37-
return true
38-
}
32+
// CreateAzureNodeInfoComparator returns a comparator that checks if two nodes should be considered
33+
// part of the same NodeGroupSet. This is true if they either belong to the same Azure agentpool
34+
// or match usual conditions checked by IsCloudProviderNodeInfoSimilar, even if they have different agentpool labels.
35+
func CreateAzureNodeInfoComparator(extraIgnoredLabels []string) NodeInfoComparator {
3936
azureIgnoredLabels := make(map[string]bool)
4037
for k, v := range BasicIgnoredLabels {
4138
azureIgnoredLabels[k] = v
4239
}
4340
azureIgnoredLabels[AzureNodepoolLabel] = true
44-
return IsCloudProviderNodeInfoSimilar(n1, n2, azureIgnoredLabels)
41+
for _, k := range extraIgnoredLabels {
42+
azureIgnoredLabels[k] = true
43+
}
44+
45+
return func(n1, n2 *schedulernodeinfo.NodeInfo) bool {
46+
if nodesFromSameAzureNodePool(n1, n2) {
47+
return true
48+
}
49+
return IsCloudProviderNodeInfoSimilar(n1, n2, azureIgnoredLabels)
50+
}
4551
}

cluster-autoscaler/processors/nodegroupset/azure_nodegroups_test.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,47 +29,54 @@ import (
2929
)
3030

3131
func TestIsAzureNodeInfoSimilar(t *testing.T) {
32+
comparator := CreateAzureNodeInfoComparator([]string{"example.com/ready"})
3233
n1 := BuildTestNode("node1", 1000, 2000)
3334
n1.ObjectMeta.Labels["test-label"] = "test-value"
3435
n1.ObjectMeta.Labels["character"] = "thing"
3536
n2 := BuildTestNode("node2", 1000, 2000)
3637
n2.ObjectMeta.Labels["test-label"] = "test-value"
3738
// No node-pool labels.
38-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, false)
39+
checkNodesSimilar(t, n1, n2, comparator, false)
3940
// Empty agentpool labels
4041
n1.ObjectMeta.Labels["agentpool"] = ""
4142
n2.ObjectMeta.Labels["agentpool"] = ""
42-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, false)
43+
checkNodesSimilar(t, n1, n2, comparator, false)
4344
// Only one non empty
4445
n1.ObjectMeta.Labels["agentpool"] = ""
4546
n2.ObjectMeta.Labels["agentpool"] = "foo"
46-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, false)
47+
checkNodesSimilar(t, n1, n2, comparator, false)
4748
// Only one present
4849
delete(n1.ObjectMeta.Labels, "agentpool")
4950
n2.ObjectMeta.Labels["agentpool"] = "foo"
50-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, false)
51+
checkNodesSimilar(t, n1, n2, comparator, false)
5152
// Different vales
5253
n1.ObjectMeta.Labels["agentpool"] = "foo1"
5354
n2.ObjectMeta.Labels["agentpool"] = "foo2"
54-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, false)
55+
checkNodesSimilar(t, n1, n2, comparator, false)
5556
// Same values
5657
n1.ObjectMeta.Labels["agentpool"] = "foo"
5758
n2.ObjectMeta.Labels["agentpool"] = "foo"
58-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, true)
59+
checkNodesSimilar(t, n1, n2, comparator, true)
5960
// Same labels except for agentpool
6061
delete(n1.ObjectMeta.Labels, "character")
6162
n1.ObjectMeta.Labels["agentpool"] = "foo"
6263
n2.ObjectMeta.Labels["agentpool"] = "bar"
63-
checkNodesSimilar(t, n1, n2, IsAzureNodeInfoSimilar, true)
64+
checkNodesSimilar(t, n1, n2, comparator, true)
65+
// Custom label
66+
n1.ObjectMeta.Labels["example.com/ready"] = "true"
67+
n2.ObjectMeta.Labels["example.com/ready"] = "false"
68+
checkNodesSimilar(t, n1, n2, comparator, true)
6469
}
6570

6671
func TestFindSimilarNodeGroupsAzureBasic(t *testing.T) {
67-
processor := &BalancingNodeGroupSetProcessor{Comparator: IsAzureNodeInfoSimilar}
68-
basicSimilarNodeGroupsTest(t, processor)
72+
context := &context.AutoscalingContext{}
73+
ni1, ni2, ni3 := buildBasicNodeGroups(context)
74+
processor := &BalancingNodeGroupSetProcessor{Comparator: CreateAzureNodeInfoComparator([]string{})}
75+
basicSimilarNodeGroupsTest(t, context, processor, ni1, ni2, ni3)
6976
}
7077

7178
func TestFindSimilarNodeGroupsAzureByLabel(t *testing.T) {
72-
processor := &BalancingNodeGroupSetProcessor{Comparator: IsAzureNodeInfoSimilar}
79+
processor := &BalancingNodeGroupSetProcessor{Comparator: CreateAzureNodeInfoComparator([]string{})}
7380
context := &context.AutoscalingContext{}
7481

7582
n1 := BuildTestNode("n1", 1000, 1000)

cluster-autoscaler/processors/nodegroupset/balancing_processor.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ type BalancingNodeGroupSetProcessor struct {
3232
Comparator NodeInfoComparator
3333
}
3434

35-
// FindSimilarNodeGroups returns a list of NodeGroups similar to the given one.
36-
// Two groups are similar if the NodeInfos for them compare equal using IsNodeInfoSimilar.
35+
// FindSimilarNodeGroups returns a list of NodeGroups similar to the given one using the
36+
// BalancingNodeGroupSetProcessor's comparator function.
3737
func (b *BalancingNodeGroupSetProcessor) FindSimilarNodeGroups(context *context.AutoscalingContext, nodeGroup cloudprovider.NodeGroup,
3838
nodeInfosForGroups map[string]*schedulernodeinfo.NodeInfo) ([]cloudprovider.NodeGroup, errors.AutoscalerError) {
3939

@@ -58,7 +58,7 @@ func (b *BalancingNodeGroupSetProcessor) FindSimilarNodeGroups(context *context.
5858
}
5959
comparator := b.Comparator
6060
if comparator == nil {
61-
comparator = IsNodeInfoSimilar
61+
klog.Fatal("BalancingNodeGroupSetProcessor comparator not set")
6262
}
6363
if comparator(nodeInfo, ngNodeInfo) {
6464
result = append(result, ng)

cluster-autoscaler/processors/nodegroupset/balancing_processor_test.go

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,17 @@ package nodegroupset
1919
import (
2020
"testing"
2121

22+
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
23+
2224
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
2325
testprovider "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/test"
2426
"k8s.io/autoscaler/cluster-autoscaler/context"
2527
. "k8s.io/autoscaler/cluster-autoscaler/utils/test"
26-
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
2728

2829
"github.com/stretchr/testify/assert"
2930
)
3031

31-
func basicSimilarNodeGroupsTest(t *testing.T, processor NodeGroupSetProcessor) {
32-
context := &context.AutoscalingContext{}
33-
32+
func buildBasicNodeGroups(context *context.AutoscalingContext) (*schedulernodeinfo.NodeInfo, *schedulernodeinfo.NodeInfo, *schedulernodeinfo.NodeInfo) {
3433
n1 := BuildTestNode("n1", 1000, 1000)
3534
n2 := BuildTestNode("n2", 1000, 1000)
3635
n3 := BuildTestNode("n3", 2000, 2000)
@@ -49,35 +48,71 @@ func basicSimilarNodeGroupsTest(t *testing.T, processor NodeGroupSetProcessor) {
4948
ni3 := schedulernodeinfo.NewNodeInfo()
5049
ni3.SetNode(n3)
5150

51+
context.CloudProvider = provider
52+
return ni1, ni2, ni3
53+
}
54+
55+
func basicSimilarNodeGroupsTest(
56+
t *testing.T,
57+
context *context.AutoscalingContext,
58+
processor NodeGroupSetProcessor,
59+
ni1 *schedulernodeinfo.NodeInfo,
60+
ni2 *schedulernodeinfo.NodeInfo,
61+
ni3 *schedulernodeinfo.NodeInfo,
62+
) {
5263
nodeInfosForGroups := map[string]*schedulernodeinfo.NodeInfo{
5364
"ng1": ni1, "ng2": ni2, "ng3": ni3,
5465
}
5566

56-
ng1, _ := provider.NodeGroupForNode(n1)
57-
ng2, _ := provider.NodeGroupForNode(n2)
58-
ng3, _ := provider.NodeGroupForNode(n3)
59-
context.CloudProvider = provider
67+
ng1, _ := context.CloudProvider.NodeGroupForNode(ni1.Node())
68+
ng2, _ := context.CloudProvider.NodeGroupForNode(ni2.Node())
69+
ng3, _ := context.CloudProvider.NodeGroupForNode(ni3.Node())
6070

6171
similar, err := processor.FindSimilarNodeGroups(context, ng1, nodeInfosForGroups)
6272
assert.NoError(t, err)
63-
assert.Equal(t, similar, []cloudprovider.NodeGroup{ng2})
73+
assert.Equal(t, []cloudprovider.NodeGroup{ng2}, similar)
6474

6575
similar, err = processor.FindSimilarNodeGroups(context, ng2, nodeInfosForGroups)
6676
assert.NoError(t, err)
67-
assert.Equal(t, similar, []cloudprovider.NodeGroup{ng1})
77+
assert.Equal(t, []cloudprovider.NodeGroup{ng1}, similar)
6878

6979
similar, err = processor.FindSimilarNodeGroups(context, ng3, nodeInfosForGroups)
7080
assert.NoError(t, err)
71-
assert.Equal(t, similar, []cloudprovider.NodeGroup{})
81+
assert.Equal(t, []cloudprovider.NodeGroup{}, similar)
7282
}
7383

7484
func TestFindSimilarNodeGroups(t *testing.T) {
75-
processor := &BalancingNodeGroupSetProcessor{}
76-
basicSimilarNodeGroupsTest(t, processor)
85+
context := &context.AutoscalingContext{}
86+
ni1, ni2, ni3 := buildBasicNodeGroups(context)
87+
processor := NewDefaultNodeGroupSetProcessor([]string{})
88+
basicSimilarNodeGroupsTest(t, context, processor, ni1, ni2, ni3)
89+
}
90+
91+
func TestFindSimilarNodeGroupsCustomLabels(t *testing.T) {
92+
context := &context.AutoscalingContext{}
93+
ni1, ni2, ni3 := buildBasicNodeGroups(context)
94+
ni1.Node().Labels["example.com/ready"] = "true"
95+
ni2.Node().Labels["example.com/ready"] = "false"
96+
97+
processor := NewDefaultNodeGroupSetProcessor([]string{"example.com/ready"})
98+
basicSimilarNodeGroupsTest(t, context, processor, ni1, ni2, ni3)
99+
}
100+
101+
func TestFindSimilarNodeGroupsCustomComparator(t *testing.T) {
102+
context := &context.AutoscalingContext{}
103+
ni1, ni2, ni3 := buildBasicNodeGroups(context)
104+
105+
processor := &BalancingNodeGroupSetProcessor{
106+
Comparator: func(n1, n2 *schedulernodeinfo.NodeInfo) bool {
107+
return (n1.Node().Name == "n1" && n2.Node().Name == "n2") ||
108+
(n1.Node().Name == "n2" && n2.Node().Name == "n1")
109+
},
110+
}
111+
basicSimilarNodeGroupsTest(t, context, processor, ni1, ni2, ni3)
77112
}
78113

79114
func TestBalanceSingleGroup(t *testing.T) {
80-
processor := &BalancingNodeGroupSetProcessor{}
115+
processor := NewDefaultNodeGroupSetProcessor([]string{})
81116
context := &context.AutoscalingContext{}
82117

83118
provider := testprovider.NewTestCloudProvider(nil, nil)
@@ -97,7 +132,7 @@ func TestBalanceSingleGroup(t *testing.T) {
97132
}
98133

99134
func TestBalanceUnderMaxSize(t *testing.T) {
100-
processor := &BalancingNodeGroupSetProcessor{}
135+
processor := NewDefaultNodeGroupSetProcessor([]string{})
101136
context := &context.AutoscalingContext{}
102137

103138
provider := testprovider.NewTestCloudProvider(nil, nil)
@@ -147,7 +182,7 @@ func TestBalanceUnderMaxSize(t *testing.T) {
147182
}
148183

149184
func TestBalanceHittingMaxSize(t *testing.T) {
150-
processor := &BalancingNodeGroupSetProcessor{}
185+
processor := NewDefaultNodeGroupSetProcessor([]string{})
151186
context := &context.AutoscalingContext{}
152187

153188
provider := testprovider.NewTestCloudProvider(nil, nil)

cluster-autoscaler/processors/nodegroupset/compare_nodegroups.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,26 @@ func compareLabels(nodes []*schedulernodeinfo.NodeInfo, ignoredLabels map[string
8686
return true
8787
}
8888

89-
// IsNodeInfoSimilar returns true if two NodeInfos are similar enough to consider
89+
// CreateGenericNodeInfoComparator returns a generic comparator that checks for node group similarity
90+
func CreateGenericNodeInfoComparator(extraIgnoredLabels []string) NodeInfoComparator {
91+
genericIgnoredLabels := make(map[string]bool)
92+
for k, v := range BasicIgnoredLabels {
93+
genericIgnoredLabels[k] = v
94+
}
95+
for _, k := range extraIgnoredLabels {
96+
genericIgnoredLabels[k] = true
97+
}
98+
99+
return func(n1, n2 *schedulernodeinfo.NodeInfo) bool {
100+
return IsCloudProviderNodeInfoSimilar(n1, n2, genericIgnoredLabels)
101+
}
102+
}
103+
104+
// IsCloudProviderNodeInfoSimilar returns true if two NodeInfos are similar enough to consider
90105
// that the NodeGroups they come from are part of the same NodeGroupSet. The criteria are
91106
// somewhat arbitrary, but generally we check if resources provided by both nodes
92107
// are similar enough to likely be the same type of machine and if the set of labels
93-
// is the same (except for a pre-defined set of labels like hostname or zone).
94-
func IsNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo) bool {
95-
return IsCloudProviderNodeInfoSimilar(n1, n2, BasicIgnoredLabels)
96-
}
97-
98-
// IsCloudProviderNodeInfoSimilar remains the same logic of IsNodeInfoSimilar with the
99-
// customized set of labels that should be ignored when comparing the similarity of two NodeInfos.
108+
// is the same (except for a set of labels passed in to be ignored like hostname or zone).
100109
func IsCloudProviderNodeInfoSimilar(n1, n2 *schedulernodeinfo.NodeInfo, ignoredLabels map[string]bool) bool {
101110
capacity := make(map[apiv1.ResourceName][]resource.Quantity)
102111
allocatable := make(map[apiv1.ResourceName][]resource.Quantity)

0 commit comments

Comments
 (0)