Skip to content

Commit 6cada97

Browse files
committed
add IsNodeCandidateForDeletion interface
This function allows cloud providers to specify when a node is not a good candidate for deletion. This will occur before the autoscaler has begun to cordon, drain, and taint any node for deletion. Also adds a unit test for the prefiltering node processor.
1 parent 50c3d3e commit 6cada97

38 files changed

+287
-26
lines changed

cluster-autoscaler/cloudprovider/alicloud/alicloud_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,11 @@ func (ali *aliCloudProvider) Cleanup() error {
175175
return nil
176176
}
177177

178+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
179+
func (ali *aliCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
180+
return true, cloudprovider.ErrNotImplemented
181+
}
182+
178183
// AliRef contains a reference to ECS instance or .
179184
type AliRef struct {
180185
ID string

cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ func (aws *awsCloudProvider) Refresh() error {
193193
return aws.awsManager.Refresh()
194194
}
195195

196+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
197+
func (aws *awsCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
198+
return true, cloudprovider.ErrNotImplemented
199+
}
200+
196201
// AwsRef contains a reference to some entity in AWS world.
197202
type AwsRef struct {
198203
Name string

cluster-autoscaler/cloudprovider/azure/azure_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ func (azure *AzureCloudProvider) Refresh() error {
174174
return azure.azureManager.Refresh()
175175
}
176176

177+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
178+
func (azure *AzureCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
179+
return true, cloudprovider.ErrNotImplemented
180+
}
181+
177182
// azureRef contains a reference to some entity in Azure world.
178183
type azureRef struct {
179184
Name string

cluster-autoscaler/cloudprovider/baiducloud/baiducloud_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ func (baiducloud *baiducloudCloudProvider) Refresh() error {
228228
return nil
229229
}
230230

231+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
232+
func (baiducloud *baiducloudCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
233+
return true, cloudprovider.ErrNotImplemented
234+
}
235+
231236
// BaiducloudRef contains a reference to some entity in baiducloud world.
232237
type BaiducloudRef struct {
233238
Name string

cluster-autoscaler/cloudprovider/bizflycloud/bizflycloud_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,11 @@ func (d *bizflycloudCloudProvider) Refresh() error {
172172
return d.manager.Refresh()
173173
}
174174

175+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
176+
func (d *bizflycloudCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
177+
return true, cloudprovider.ErrNotImplemented
178+
}
179+
175180
// BuildBizflyCloud builds the Bizflycloud cloud provider.
176181
func BuildBizflyCloud(
177182
opts config.AutoscalingOptions,

cluster-autoscaler/cloudprovider/brightbox/brightbox_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ func (b *brightboxCloudProvider) Cleanup() error {
219219
return nil
220220
}
221221

222+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
223+
func (b *brightboxCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
224+
return true, cloudprovider.ErrNotImplemented
225+
}
226+
222227
// BuildBrightbox builds the Brightbox provider
223228
func BuildBrightbox(
224229
opts config.AutoscalingOptions,

cluster-autoscaler/cloudprovider/cherryservers/cherry_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ func (ccp *cherryCloudProvider) Cleanup() error {
170170
return nil
171171
}
172172

173+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
174+
func (ccp *cherryCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
175+
return true, cloudprovider.ErrNotImplemented
176+
}
177+
173178
// BuildCherry is called by the autoscaler to build a Cherry Servers cloud provider.
174179
//
175180
// The cherryManager is created here, and the node groups are created

cluster-autoscaler/cloudprovider/civo/civo_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ func (d *civoCloudProvider) Refresh() error {
167167
return d.manager.Refresh()
168168
}
169169

170+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
171+
func (d *civoCloudProvider) IsNodeCandidateForDeletion(node *apiv1.Node) (bool, error) {
172+
return true, cloudprovider.ErrNotImplemented
173+
}
174+
170175
// BuildCivo builds the Civo cloud provider.
171176
func BuildCivo(
172177
opts config.AutoscalingOptions,

cluster-autoscaler/cloudprovider/cloud_provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,14 @@ type CloudProvider interface {
154154
// Refresh is called before every main loop and can be used to dynamically update cloud provider state.
155155
// In particular the list of node groups returned by NodeGroups can change as a result of CloudProvider.Refresh().
156156
Refresh() error
157+
158+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion. This function
159+
// will be called during prefiltering of nodes for scaledown to allow cloud providers the opportunity
160+
// to reject a node for deletion. This may be used in cases where nodes are undergoing upgrades or other
161+
// cloud-specific behavior where the cluster autoscaler should not begin cordoning, draining, and tainting
162+
// the node.
163+
// Returns true if the node can be safely deleted or false otherwise.
164+
IsNodeCandidateForDeletion(*apiv1.Node) (bool, error)
157165
}
158166

159167
// ErrNotImplemented is returned if a method is not implemented.

cluster-autoscaler/cloudprovider/cloudstack/cloudstack_cloud_provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ func (provider *cloudStackCloudProvider) Pricing() (cloudprovider.PricingModel,
115115
return nil, cloudprovider.ErrNotImplemented
116116
}
117117

118+
// IsNodeCandidateForDeletion returns whether the node is a good candidate for deletion.
119+
func (provider *cloudStackCloudProvider) IsNodeCandidateForDeletion(node *v1.Node) (bool, error) {
120+
return true, cloudprovider.ErrNotImplemented
121+
}
122+
118123
// NewNodeGroup builds a theoretical node group based on the node definition provided. The node group is not automatically
119124
// created on the cloud provider side. The node group is not returned by NodeGroups() until it is created.
120125
func (provider *cloudStackCloudProvider) NewNodeGroup(machineType string, labels map[string]string, systemLabels map[string]string, taints []v1.Taint, extraResources map[string]resource.Quantity) (cloudprovider.NodeGroup, error) {

0 commit comments

Comments
 (0)