@@ -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