Skip to content

Commit 2e561dd

Browse files
authored
Add handling of Reset ad-hoc operation to Server type (#125)
* implements adhoc operations * removes AnnotationOperationKey * corrects error message in bmc reset * adds mising V(1) to logs * fixes log messages
1 parent 7f77017 commit 2e561dd

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

bmc/bmc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type BMC interface {
1717
PowerOff(systemUUID string) error
1818

1919
// Reset performs a reset on the system.
20-
Reset() error
20+
Reset(systemUUID string, resetType redfish.ResetType) error
2121

2222
// SetPXEBootOnce sets the boot device for the next system boot.
2323
SetPXEBootOnce(systemUUID string) error

bmc/redfish.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,14 @@ func (r *RedfishBMC) PowerOff(systemUUID string) error {
8787
}
8888

8989
// Reset performs a reset on the system using Redfish.
90-
func (r *RedfishBMC) Reset() error {
91-
// Implementation details...
90+
func (r *RedfishBMC) Reset(systemUUID string, resetType redfish.ResetType) error {
91+
system, err := r.getSystemByUUID(systemUUID)
92+
if err != nil {
93+
return fmt.Errorf("failed to get systems: %w", err)
94+
}
95+
if err := system.Reset(resetType); err != nil {
96+
return fmt.Errorf("failed to reset system: %w", err)
97+
}
9298
return nil
9399
}
94100

internal/controller/server_controller.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
metalv1alpha1 "github.com/ironcore-dev/metal-operator/api/v1alpha1"
1818
"github.com/ironcore-dev/metal-operator/internal/api/registry"
1919
"github.com/ironcore-dev/metal-operator/internal/ignition"
20+
"github.com/stmcginnis/gofish/redfish"
2021
v1 "k8s.io/api/core/v1"
2122
apierrors "k8s.io/apimachinery/pkg/api/errors"
2223
meta "k8s.io/apimachinery/pkg/api/meta"
@@ -125,6 +126,10 @@ func (r *ServerReconciler) reconcile(ctx context.Context, log logr.Logger, serve
125126
return ctrl.Result{}, err
126127
}
127128
}
129+
if modified, err := r.handleAnnotionOperations(ctx, log, server); err != nil || modified {
130+
return ctrl.Result{}, err
131+
}
132+
log.V(1).Info("Handled annotation operations")
128133

129134
if modified, err := clientutils.PatchEnsureFinalizer(ctx, r.Client, server, ServerFinalizer); err != nil || modified {
130135
return ctrl.Result{}, err
@@ -812,6 +817,31 @@ func (r *ServerReconciler) applyBiosSettings(ctx context.Context, log logr.Logge
812817
return nil
813818
}
814819

820+
func (r *ServerReconciler) handleAnnotionOperations(ctx context.Context, log logr.Logger, server *metalv1alpha1.Server) (bool, error) {
821+
annotations := server.GetAnnotations()
822+
operation, ok := annotations[metalv1alpha1.OperationAnnotation]
823+
if !ok {
824+
return false, nil
825+
}
826+
bmcClient, err := GetBMCClientForServer(ctx, r.Client, server, r.Insecure)
827+
if err != nil {
828+
return false, fmt.Errorf("failed to create BMC client: %w", err)
829+
}
830+
defer bmcClient.Logout()
831+
log.V(1).Info("Handling operation", "Operation", operation)
832+
if err := bmcClient.Reset(server.Spec.UUID, redfish.ResetType(operation)); err != nil {
833+
return false, fmt.Errorf("failed to reset server: %w", err)
834+
}
835+
log.V(1).Info("Operation completed", "Operation", operation)
836+
serverBase := server.DeepCopy()
837+
delete(annotations, metalv1alpha1.OperationAnnotation)
838+
server.SetAnnotations(annotations)
839+
if err := r.Patch(ctx, server, client.MergeFrom(serverBase)); err != nil {
840+
return false, fmt.Errorf("failed to patch server annotations: %w", err)
841+
}
842+
return true, nil
843+
}
844+
815845
// SetupWithManager sets up the controller with the Manager.
816846
func (r *ServerReconciler) SetupWithManager(mgr ctrl.Manager) error {
817847
// Create a channel to send periodic events

0 commit comments

Comments
 (0)