Skip to content

Commit

Permalink
[v1.29][Hetzner] Fix Autoscaling for worker nodes with invalid Provid…
Browse files Browse the repository at this point in the history
…erID

This change fixes a bug that arises when the user's cluster includes
worker nodes not from Hetzner Cloud, such as a Hetzner Dedicated server
or any server resource other than Hetzner. It also corrects the
behavior when a server has been physically deleted from Hetzner Cloud.

Signed-off-by: Maksim Paskal <[email protected]>
  • Loading branch information
maksim-paskal authored and apricote committed Apr 17, 2024
1 parent a7b4386 commit a1a8d39
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
10 changes: 10 additions & 0 deletions cluster-autoscaler/cloudprovider/hetzner/hetzner_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,19 @@ func (m *hetznerManager) addNodeToDrainingPool(node *apiv1.Node) (*hetznerNodeGr
return m.nodeGroups[drainingNodePoolId], nil
}

func (m *hetznerManager) validProviderID(providerID string) bool {
return strings.HasPrefix(providerID, providerIDPrefix)
}

func (m *hetznerManager) serverForNode(node *apiv1.Node) (*hcloud.Server, error) {
var nodeIdOrName string
if node.Spec.ProviderID != "" {
if !m.validProviderID(node.Spec.ProviderID) {
// This cluster-autoscaler provider only handles Hetzner Cloud servers.
// Any other provider ID prefix is invalid, and we return no server. Returning an error here breaks hybrid
// clusters with nodes from Hetzner Cloud & Robot (or other providers).
return nil, nil
}
nodeIdOrName = strings.TrimPrefix(node.Spec.ProviderID, providerIDPrefix)
} else {
nodeIdOrName = node.Name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package hetzner

import (
"context"
"errors"
"strconv"
"sync"
"time"
Expand Down Expand Up @@ -136,7 +135,8 @@ func (m *serversCache) getServer(nodeIdOrName string) (*hcloud.Server, error) {
}
}

return nil, errors.New("server not found")
// return nil if server not found
return nil, nil
}

func (m *serversCache) getServersByNodeGroupName(nodeGroup string) ([]*hcloud.Server, error) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func TestServersCache(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, "test2", foundservers.Name)

_, err = c.getServer("test3")
require.Error(t, err)
server, err := c.getServer("test3")
require.Nil(t, server)
require.NoError(t, err)
}

0 comments on commit a1a8d39

Please sign in to comment.