Skip to content

Commit 7f42ed7

Browse files
daimaxiaxiek8s-infra-cherrypick-robot
authored and
k8s-infra-cherrypick-robot
committed
drain node by infraMachine ProviderID
1 parent 322fc11 commit 7f42ed7

File tree

2 files changed

+68
-6
lines changed

2 files changed

+68
-6
lines changed

internal/controllers/machine/machine_controller.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import (
5353
"sigs.k8s.io/cluster-api/controllers/external"
5454
"sigs.k8s.io/cluster-api/controllers/noderefutil"
5555
"sigs.k8s.io/cluster-api/feature"
56+
"sigs.k8s.io/cluster-api/internal/contract"
5657
"sigs.k8s.io/cluster-api/internal/controllers/machine/drain"
5758
"sigs.k8s.io/cluster-api/util"
5859
"sigs.k8s.io/cluster-api/util/annotations"
@@ -435,7 +436,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, s *scope) (ctrl.Result
435436
s.deletingReason = clusterv1.MachineDeletingV1Beta2Reason
436437
s.deletingMessage = "Deletion started"
437438

438-
err := r.isDeleteNodeAllowed(ctx, cluster, m)
439+
err := r.isDeleteNodeAllowed(ctx, cluster, m, s.infraMachine)
439440
isDeleteNodeAllowed := err == nil
440441
if err != nil {
441442
switch err {
@@ -713,14 +714,24 @@ func (r *Reconciler) nodeVolumeDetachTimeoutExceeded(machine *clusterv1.Machine)
713714

714715
// isDeleteNodeAllowed returns nil only if the Machine's NodeRef is not nil
715716
// and if the Machine is not the last control plane node in the cluster.
716-
func (r *Reconciler) isDeleteNodeAllowed(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine) error {
717+
func (r *Reconciler) isDeleteNodeAllowed(ctx context.Context, cluster *clusterv1.Cluster, machine *clusterv1.Machine, infraMachine *unstructured.Unstructured) error {
717718
log := ctrl.LoggerFrom(ctx)
718719
// Return early if the cluster is being deleted.
719720
if !cluster.DeletionTimestamp.IsZero() {
720721
return errClusterIsBeingDeleted
721722
}
722723

723-
if machine.Status.NodeRef == nil && machine.Spec.ProviderID != nil {
724+
var providerID string
725+
if machine.Spec.ProviderID != nil {
726+
providerID = *machine.Spec.ProviderID
727+
} else if infraMachine != nil {
728+
// Fallback to retrieve from infraMachine.
729+
if providerIDFromInfraMachine, err := contract.InfrastructureMachine().ProviderID().Get(infraMachine); err == nil {
730+
providerID = *providerIDFromInfraMachine
731+
}
732+
}
733+
734+
if machine.Status.NodeRef == nil && providerID != "" {
724735
// If we don't have a node reference, but a provider id has been set,
725736
// try to retrieve the node one more time.
726737
//
@@ -731,7 +742,7 @@ func (r *Reconciler) isDeleteNodeAllowed(ctx context.Context, cluster *clusterv1
731742
if err != nil {
732743
log.Error(err, "Failed to get cluster client while deleting Machine and checking for nodes")
733744
} else {
734-
node, err := r.getNode(ctx, remoteClient, *machine.Spec.ProviderID)
745+
node, err := r.getNode(ctx, remoteClient, providerID)
735746
if err != nil && err != ErrNodeNotFound {
736747
log.Error(err, "Failed to get node while deleting Machine")
737748
} else if err == nil {

internal/controllers/machine/machine_controller_test.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2528,6 +2528,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
25282528
name string
25292529
cluster *clusterv1.Cluster
25302530
machine *clusterv1.Machine
2531+
infraMachine *unstructured.Unstructured
25312532
expectedError error
25322533
}{
25332534
{
@@ -2554,6 +2555,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
25542555
},
25552556
Status: clusterv1.MachineStatus{},
25562557
},
2558+
infraMachine: nil,
25572559
expectedError: errNilNodeRef,
25582560
},
25592561
{
@@ -2584,6 +2586,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
25842586
},
25852587
},
25862588
},
2589+
infraMachine: nil,
25872590
expectedError: errNoControlPlaneNodes,
25882591
},
25892592
{
@@ -2616,6 +2619,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
26162619
},
26172620
},
26182621
},
2622+
infraMachine: nil,
26192623
expectedError: errNoControlPlaneNodes,
26202624
},
26212625
{
@@ -2646,6 +2650,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
26462650
},
26472651
},
26482652
},
2653+
infraMachine: nil,
26492654
expectedError: nil,
26502655
},
26512656
{
@@ -2659,6 +2664,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
26592664
},
26602665
},
26612666
machine: &clusterv1.Machine{},
2667+
infraMachine: nil,
26622668
expectedError: errClusterIsBeingDeleted,
26632669
},
26642670
{
@@ -2697,6 +2703,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
26972703
},
26982704
},
26992705
},
2706+
infraMachine: nil,
27002707
expectedError: nil,
27012708
},
27022709
{
@@ -2735,6 +2742,7 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
27352742
},
27362743
},
27372744
},
2745+
infraMachine: nil,
27382746
expectedError: errControlPlaneIsBeingDeleted,
27392747
},
27402748
{
@@ -2773,8 +2781,40 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
27732781
},
27742782
},
27752783
},
2784+
infraMachine: nil,
27762785
expectedError: errControlPlaneIsBeingDeleted,
27772786
},
2787+
{
2788+
name: "no nodeRef, infrastructure machine has providerID",
2789+
cluster: &clusterv1.Cluster{
2790+
ObjectMeta: metav1.ObjectMeta{
2791+
Name: "test-cluster",
2792+
Namespace: metav1.NamespaceDefault,
2793+
},
2794+
},
2795+
machine: &clusterv1.Machine{
2796+
ObjectMeta: metav1.ObjectMeta{
2797+
Name: "created",
2798+
Namespace: metav1.NamespaceDefault,
2799+
Labels: map[string]string{
2800+
clusterv1.ClusterNameLabel: "test-cluster",
2801+
},
2802+
Finalizers: []string{clusterv1.MachineFinalizer},
2803+
},
2804+
Spec: clusterv1.MachineSpec{
2805+
ClusterName: "test-cluster",
2806+
InfrastructureRef: corev1.ObjectReference{},
2807+
Bootstrap: clusterv1.Bootstrap{DataSecretName: ptr.To("data")},
2808+
},
2809+
Status: clusterv1.MachineStatus{},
2810+
},
2811+
infraMachine: &unstructured.Unstructured{Object: map[string]interface{}{
2812+
"spec": map[string]interface{}{
2813+
"providerID": "test-node-1",
2814+
},
2815+
}},
2816+
expectedError: nil,
2817+
},
27782818
}
27792819

27802820
emp := &unstructured.Unstructured{
@@ -2813,6 +2853,16 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
28132853
empBeingDeleted.SetDeletionTimestamp(&metav1.Time{Time: time.Now()})
28142854
empBeingDeleted.SetFinalizers([]string{"block-deletion"})
28152855

2856+
testNodeA := &corev1.Node{
2857+
ObjectMeta: metav1.ObjectMeta{
2858+
Name: "node-1",
2859+
},
2860+
Spec: corev1.NodeSpec{
2861+
ProviderID: "test-node-1",
2862+
},
2863+
}
2864+
remoteClient := fake.NewClientBuilder().WithIndex(&corev1.Node{}, "spec.providerID", index.NodeByProviderID).WithObjects(testNodeA).Build()
2865+
28162866
for _, tc := range testCases {
28172867
t.Run(tc.name, func(t *testing.T) {
28182868
g := NewWithT(t)
@@ -2873,10 +2923,11 @@ func TestIsDeleteNodeAllowed(t *testing.T) {
28732923
empBeingDeleted,
28742924
).Build()
28752925
mr := &Reconciler{
2876-
Client: c,
2926+
Client: c,
2927+
ClusterCache: clustercache.NewFakeClusterCache(remoteClient, client.ObjectKeyFromObject(tc.cluster)),
28772928
}
28782929

2879-
err := mr.isDeleteNodeAllowed(ctx, tc.cluster, tc.machine)
2930+
err := mr.isDeleteNodeAllowed(ctx, tc.cluster, tc.machine, tc.infraMachine)
28802931
if tc.expectedError == nil {
28812932
g.Expect(err).ToNot(HaveOccurred())
28822933
} else {

0 commit comments

Comments
 (0)