Skip to content

Commit 5901ebe

Browse files
committed
fix: wipe and reboot with talos client on removing server
all deleted machine will receive a reset call from talos client Signed-off-by: Anthony ARNAUD <github@anthony-arnaud.fr>
1 parent ea8e126 commit 5901ebe

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

app/caps-controller-manager/controllers/metalmachine_controller.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import (
88
"context"
99
"errors"
1010
"fmt"
11-
1211
"github.com/go-logr/logr"
1312
"github.com/siderolabs/go-pointer"
13+
talosclient "github.com/siderolabs/talos/pkg/machinery/client"
14+
clientconfig "github.com/siderolabs/talos/pkg/machinery/client/config"
1415
corev1 "k8s.io/api/core/v1"
1516
apierrors "k8s.io/apimachinery/pkg/api/errors"
1617
"k8s.io/apimachinery/pkg/fields"
@@ -253,6 +254,9 @@ func (r *MetalMachineReconciler) reconcileDelete(ctx context.Context, metalMachi
253254

254255
err := r.Get(ctx, types.NamespacedName{Namespace: metalMachine.Spec.ServerRef.Namespace, Name: metalMachine.Spec.ServerRef.Name}, &serverBinding)
255256
if err == nil {
257+
if err = r.ResetServer(ctx, metalMachine, &serverBinding); err != nil {
258+
return ctrl.Result{}, err
259+
}
256260
return ctrl.Result{Requeue: true}, r.Delete(ctx, &serverBinding)
257261
}
258262

@@ -467,3 +471,46 @@ func (r *MetalMachineReconciler) fetchServerClass(ctx context.Context, classRef
467471

468472
return serverClassResource, nil
469473
}
474+
475+
func (r *MetalMachineReconciler) ResetServer(ctx context.Context, metalMachine *infrav1.MetalMachine, serverBinding *infrav1.ServerBinding) error {
476+
var talosSecret corev1.Secret
477+
478+
cluster, err := util.GetClusterFromMetadata(ctx, r.Client, metalMachine.ObjectMeta)
479+
if err != nil {
480+
return fmt.Errorf("no cluster label or cluster does not exist")
481+
}
482+
483+
if err = r.Get(ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: fmt.Sprintf("%s-talosconfig", cluster.Name)}, &talosSecret); err != nil {
484+
return err
485+
}
486+
487+
config, ok := talosSecret.Data["talosconfig"]
488+
if !ok {
489+
return fmt.Errorf("failed to find talosconfig data in the talosconfig secret")
490+
}
491+
492+
var clientConfig *clientconfig.Config
493+
clientConfig, err = clientconfig.FromBytes(config)
494+
495+
if err != nil {
496+
return err
497+
}
498+
499+
var talosClient *talosclient.Client
500+
talosClient, err = talosclient.New(ctx,
501+
talosclient.WithConfig(clientConfig),
502+
talosclient.WithEndpoints(serverBinding.Spec.Addresses...),
503+
)
504+
if err != nil {
505+
return err
506+
}
507+
508+
// ignore error if the machine is already reset, reboot, offline, but record event
509+
if err = talosClient.Reset(ctx, false, true); err != nil {
510+
r.Recorder.Event(metalMachine.Spec.ServerRef, corev1.EventTypeWarning, "Server Allocation", fmt.Sprintf("Software reset failed on %q, %s", metalMachine.Name, err))
511+
} else {
512+
r.Recorder.Event(metalMachine.Spec.ServerRef, corev1.EventTypeNormal, "Server Allocation", fmt.Sprintf("Software reset called on %q", metalMachine.Name))
513+
}
514+
515+
return nil
516+
}

0 commit comments

Comments
 (0)