Skip to content

Commit 20fd649

Browse files
authored
Check node by name in providerID controller (#1272)
Signed-off-by: Alexey Makhov <[email protected]> Signed-off-by: makhov <[email protected]> # Conflicts: # internal/controller/controlplane/k0s_controlplane_controller.go
1 parent da591ad commit 20fd649

File tree

1 file changed

+40
-6
lines changed

1 file changed

+40
-6
lines changed

internal/controller/bootstrap/providerid_controller.go

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package bootstrap
33
import (
44
"context"
55
"fmt"
6+
corev1 "k8s.io/api/core/v1"
7+
"net"
68
"time"
79

810
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -66,21 +68,53 @@ func (p *ProviderIDController) Reconcile(ctx context.Context, req ctrl.Request)
6668
return ctrl.Result{}, fmt.Errorf("can't get kube client for cluster %s/%s: %w. may not be created yet", machine.Namespace, machine.Spec.ClusterName, err)
6769
}
6870

69-
nodes, err := childClient.CoreV1().Nodes().List(ctx, metav1.ListOptions{
70-
LabelSelector: fmt.Sprintf("%s=%s", machineNameNodeLabel, machine.GetName()),
71-
})
72-
if err != nil || len(nodes.Items) == 0 {
71+
nodes, err := childClient.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
72+
if err != nil {
73+
return ctrl.Result{}, fmt.Errorf("failed to list nodes in cluster %s/%s: %w", cluster.Namespace, cluster.Name, err)
74+
}
75+
76+
var node *corev1.Node
77+
for _, n := range nodes.Items {
78+
if n.Spec.ProviderID == *machine.Spec.ProviderID {
79+
// ProviderID is already set on the node
80+
return ctrl.Result{}, nil
81+
}
82+
83+
// If node name matches machine name, we have found our node
84+
if n.Name == machine.GetName() {
85+
node = &n
86+
break
87+
}
88+
89+
// Check k0smotron.io/machine-name node label
90+
if val, ok := n.Labels[machineNameNodeLabel]; ok && val == machine.GetName() {
91+
node = &n
92+
break
93+
}
94+
95+
// Check node addresses against machine addresses
96+
for _, addr := range machine.Status.Addresses {
97+
for _, nodeAddr := range n.Status.Addresses {
98+
if addr.Address == nodeAddr.Address && !net.ParseIP(nodeAddr.Address).IsLoopback() {
99+
node = &n
100+
break
101+
}
102+
}
103+
}
104+
}
105+
106+
if node == nil {
73107
log.Info("waiting for node to be available for machine " + machine.Name)
74108
return ctrl.Result{Requeue: true, RequeueAfter: time.Second * 10}, nil
75109
}
76110

77-
node := nodes.Items[0]
78111
if node.Spec.ProviderID == "" {
79112
node.Spec.ProviderID = *machine.Spec.ProviderID
113+
node.Labels[machineNameNodeLabel] = machine.GetName()
80114
err = retry.OnError(retry.DefaultBackoff, func(err error) bool {
81115
return true
82116
}, func() error {
83-
_, upErr := childClient.CoreV1().Nodes().Update(context.Background(), &node, metav1.UpdateOptions{})
117+
_, upErr := childClient.CoreV1().Nodes().Update(context.Background(), node, metav1.UpdateOptions{})
84118
return upErr
85119
})
86120

0 commit comments

Comments
 (0)