@@ -11,6 +11,8 @@ import (
1111
1212 "github.com/go-logr/logr"
1313 "github.com/siderolabs/go-pointer"
14+ talosclient "github.com/siderolabs/talos/pkg/machinery/client"
15+ clientconfig "github.com/siderolabs/talos/pkg/machinery/client/config"
1416 corev1 "k8s.io/api/core/v1"
1517 apierrors "k8s.io/apimachinery/pkg/api/errors"
1618 "k8s.io/apimachinery/pkg/fields"
@@ -253,6 +255,9 @@ func (r *MetalMachineReconciler) reconcileDelete(ctx context.Context, metalMachi
253255
254256 err := r .Get (ctx , types.NamespacedName {Namespace : metalMachine .Spec .ServerRef .Namespace , Name : metalMachine .Spec .ServerRef .Name }, & serverBinding )
255257 if err == nil {
258+ if err = r .ResetServer (ctx , metalMachine , & serverBinding ); err != nil {
259+ return ctrl.Result {}, err
260+ }
256261 return ctrl.Result {Requeue : true }, r .Delete (ctx , & serverBinding )
257262 }
258263
@@ -467,3 +472,42 @@ func (r *MetalMachineReconciler) fetchServerClass(ctx context.Context, classRef
467472
468473 return serverClassResource , nil
469474}
475+
476+ func (r * MetalMachineReconciler ) ResetServer (ctx context.Context , metalMachine * infrav1.MetalMachine , serverBinding * infrav1.ServerBinding ) error {
477+ var talosSecret corev1.Secret
478+
479+ cluster , err := util .GetClusterFromMetadata (ctx , r .Client , metalMachine .ObjectMeta )
480+ if err != nil {
481+ return fmt .Errorf ("no cluster label or cluster does not exist" )
482+ }
483+
484+ if err = r .Get (ctx , types.NamespacedName {Namespace : cluster .Namespace , Name : fmt .Sprintf ("%s-talosconfig" , cluster .Name )}, & talosSecret ); err != nil {
485+ return err
486+ }
487+
488+ config , ok := talosSecret .Data ["talosconfig" ]
489+ if ! ok {
490+ return fmt .Errorf ("failed to find talosconfig data in the talosconfig secret" )
491+ }
492+
493+ var clientConfig * clientconfig.Config
494+ clientConfig , err = clientconfig .FromBytes (config )
495+
496+ if err != nil {
497+ return err
498+ }
499+
500+ var talosClient * talosclient.Client
501+ talosClient , err = talosclient .New (ctx ,
502+ talosclient .WithConfig (clientConfig ),
503+ talosclient .WithEndpoints (serverBinding .Spec .Addresses ... ),
504+ )
505+ if err != nil {
506+ return err
507+ }
508+
509+ // ignore error if the machine is already reset, reboot, offline
510+ _ = talosClient .Reset (ctx , false , true )
511+
512+ return nil
513+ }
0 commit comments