@@ -8,9 +8,10 @@ import (
8
8
"context"
9
9
"errors"
10
10
"fmt"
11
-
12
11
"github.com/go-logr/logr"
13
12
"github.com/siderolabs/go-pointer"
13
+ talosclient "github.com/siderolabs/talos/pkg/machinery/client"
14
+ clientconfig "github.com/siderolabs/talos/pkg/machinery/client/config"
14
15
corev1 "k8s.io/api/core/v1"
15
16
apierrors "k8s.io/apimachinery/pkg/api/errors"
16
17
"k8s.io/apimachinery/pkg/fields"
@@ -253,6 +254,9 @@ func (r *MetalMachineReconciler) reconcileDelete(ctx context.Context, metalMachi
253
254
254
255
err := r .Get (ctx , types.NamespacedName {Namespace : metalMachine .Spec .ServerRef .Namespace , Name : metalMachine .Spec .ServerRef .Name }, & serverBinding )
255
256
if err == nil {
257
+ if err = r .ResetServer (ctx , metalMachine , & serverBinding ); err != nil {
258
+ return ctrl.Result {}, err
259
+ }
256
260
return ctrl.Result {Requeue : true }, r .Delete (ctx , & serverBinding )
257
261
}
258
262
@@ -467,3 +471,58 @@ func (r *MetalMachineReconciler) fetchServerClass(ctx context.Context, classRef
467
471
468
472
return serverClassResource , nil
469
473
}
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