Skip to content

Commit d38706c

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

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

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

Lines changed: 60 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,58 @@ 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 (
477+
talosSecret corev1.Secret
478+
serverObj metalv1.Server
479+
)
480+
481+
if err := r.Get(ctx, types.NamespacedName{Namespace: "", Name: metalMachine.Spec.ServerRef.Name}, &serverObj); err != nil {
482+
return err
483+
}
484+
485+
if serverObj.Spec.BMC != nil {
486+
// let BMC configuration to reboot and wipe te machine using pxe.
487+
return nil
488+
}
489+
490+
cluster, err := util.GetClusterFromMetadata(ctx, r.Client, metalMachine.ObjectMeta)
491+
if err != nil {
492+
return fmt.Errorf("no cluster label or cluster does not exist")
493+
}
494+
495+
if err = r.Get(ctx, types.NamespacedName{Namespace: cluster.Namespace, Name: fmt.Sprintf("%s-talosconfig", cluster.Name)}, &talosSecret); err != nil {
496+
return err
497+
}
498+
499+
config, ok := talosSecret.Data["talosconfig"]
500+
if !ok {
501+
return fmt.Errorf("failed to find talosconfig data in the talosconfig secret")
502+
}
503+
504+
var clientConfig *clientconfig.Config
505+
clientConfig, err = clientconfig.FromBytes(config)
506+
507+
if err != nil {
508+
return err
509+
}
510+
511+
var talosClient *talosclient.Client
512+
talosClient, err = talosclient.New(ctx,
513+
talosclient.WithConfig(clientConfig),
514+
talosclient.WithEndpoints(serverBinding.Spec.Addresses...),
515+
)
516+
if err != nil {
517+
return err
518+
}
519+
520+
// ignore error if the machine is already reset, reboot, offline, but record event
521+
if err = talosClient.Reset(ctx, false, true); err != nil {
522+
r.Recorder.Event(metalMachine.Spec.ServerRef, corev1.EventTypeWarning, "Server Allocation", fmt.Sprintf("Software reset failed on %q, %s", metalMachine.Name, err))
523+
} else {
524+
r.Recorder.Event(metalMachine.Spec.ServerRef, corev1.EventTypeNormal, "Server Allocation", fmt.Sprintf("Software reset called on %q", metalMachine.Name))
525+
}
526+
527+
return nil
528+
}

0 commit comments

Comments
 (0)