Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/crd/bases/metal.ironcore.dev_biosversions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.17.1
controller-gen.kubebuilder.io/version: v0.18.0
name: biosversions.metal.ironcore.dev
spec:
group: metal.ironcore.dev
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ metadata:
{{- if .Values.crd.keep }}
"helm.sh/resource-policy": keep
{{- end }}
controller-gen.kubebuilder.io/version: v0.17.1
controller-gen.kubebuilder.io/version: v0.18.0
name: biosversions.metal.ironcore.dev
spec:
group: metal.ironcore.dev
Expand Down
14 changes: 7 additions & 7 deletions docs/api-reference/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ BIOSSettingUpdateState
<td>
<code>metadata</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectmeta-v1-meta">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#objectmeta-v1-meta">
Kubernetes meta/v1.ObjectMeta
</a>
</em>
Expand Down Expand Up @@ -391,7 +391,7 @@ ImageSpec
<td>
<code>serverRef</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#localobjectreference-v1-core">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#localobjectreference-v1-core">
Kubernetes core/v1.LocalObjectReference
</a>
</em>
Expand All @@ -417,7 +417,7 @@ ServerMaintenancePolicy
<td>
<code>serverMaintenanceRef</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectreference-v1-core">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#objectreference-v1-core">
Kubernetes core/v1.ObjectReference
</a>
</em>
Expand Down Expand Up @@ -500,7 +500,7 @@ ImageSpec
<td>
<code>serverRef</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#localobjectreference-v1-core">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#localobjectreference-v1-core">
Kubernetes core/v1.LocalObjectReference
</a>
</em>
Expand All @@ -526,7 +526,7 @@ ServerMaintenancePolicy
<td>
<code>serverMaintenanceRef</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#objectreference-v1-core">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#objectreference-v1-core">
Kubernetes core/v1.ObjectReference
</a>
</em>
Expand Down Expand Up @@ -611,7 +611,7 @@ TaskStatus
<td>
<code>conditions</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#condition-v1-meta">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#condition-v1-meta">
[]Kubernetes meta/v1.Condition
</a>
</em>
Expand Down Expand Up @@ -1517,7 +1517,7 @@ net/netip.Prefix
<td>
<code>secretRef</code><br/>
<em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.32/#localobjectreference-v1-core">
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.33/#localobjectreference-v1-core">
Kubernetes core/v1.LocalObjectReference
</a>
</em>
Expand Down
71 changes: 28 additions & 43 deletions internal/controller/biossettings_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,7 @@ func (r *BiosSettingsReconciler) cleanupReferences(
return err
}

func (r *BiosSettingsReconciler) reconcile(
ctx context.Context,
log logr.Logger,
biosSettings *metalv1alpha1.BIOSSettings,
) (ctrl.Result, error) {
func (r *BiosSettingsReconciler) reconcile(ctx context.Context, log logr.Logger, biosSettings *metalv1alpha1.BIOSSettings) (ctrl.Result, error) {
if shouldIgnoreReconciliation(biosSettings) {
log.V(1).Info("Skipped BIOS Setting reconciliation")
return ctrl.Result{}, nil
Expand Down Expand Up @@ -224,18 +220,25 @@ func (r *BiosSettingsReconciler) reconcile(
return ctrl.Result{}, err
}

return r.ensureBIOSSettingsStateTransition(ctx, log, biosSettings, server)
bmcClient, err := bmcutils.GetBMCClientForServer(ctx, r.Client, server, r.Insecure, r.BMCOptions)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to get BMC client for server: %w", err)
}
defer bmcClient.Logout()

return r.ensureBIOSSettingsStateTransition(ctx, log, bmcClient, biosSettings, server)
}

func (r *BiosSettingsReconciler) ensureBIOSSettingsStateTransition(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
biosSettings *metalv1alpha1.BIOSSettings,
server *metalv1alpha1.Server,
) (ctrl.Result, error) {
switch biosSettings.Status.State {
case "", metalv1alpha1.BIOSSettingsStatePending:
pendingSettings, err := r.getPendingSettingsOnBIOS(ctx, log, server)
pendingSettings, err := r.getPendingSettingsOnBIOS(ctx, log, bmcClient, server)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to get pending settings on bios: %w", err)
}
Expand All @@ -247,9 +250,9 @@ func (r *BiosSettingsReconciler) ensureBIOSSettingsStateTransition(
err = r.updateBiosSettingsStatus(ctx, log, biosSettings, metalv1alpha1.BIOSSettingsStateInProgress)
return ctrl.Result{}, err
case metalv1alpha1.BIOSSettingsStateInProgress:
return r.handleSettingInProgressState(ctx, log, biosSettings, server)
return r.handleSettingInProgressState(ctx, log, bmcClient, biosSettings, server)
case metalv1alpha1.BIOSSettingsStateApplied:
return r.handleSettingAppliedState(ctx, log, biosSettings, server)
return r.handleSettingAppliedState(ctx, log, bmcClient, biosSettings, server)
case metalv1alpha1.BIOSSettingsStateFailed:
return r.handleFailedState(ctx, log, biosSettings, server)
}
Expand All @@ -260,10 +263,11 @@ func (r *BiosSettingsReconciler) ensureBIOSSettingsStateTransition(
func (r *BiosSettingsReconciler) handleSettingInProgressState(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
biosSettings *metalv1alpha1.BIOSSettings,
server *metalv1alpha1.Server,
) (ctrl.Result, error) {
currentBiosVersion, settingsDiff, err := r.getBIOSVersionAndSettingDifference(ctx, log, biosSettings, server)
currentBiosVersion, settingsDiff, err := r.getBIOSVersionAndSettingDifference(ctx, log, bmcClient, biosSettings, server)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to get BIOS settings: %w", err)
}
Expand All @@ -280,7 +284,7 @@ func (r *BiosSettingsReconciler) handleSettingInProgressState(
return ctrl.Result{}, nil
}

if req, err := r.checkAndRequestMaintenance(ctx, log, biosSettings, server, settingsDiff); err != nil || req {
if req, err := r.checkAndRequestMaintenance(ctx, log, bmcClient, biosSettings, server, settingsDiff); err != nil || req {
return ctrl.Result{}, err
}

Expand All @@ -290,25 +294,20 @@ func (r *BiosSettingsReconciler) handleSettingInProgressState(
return ctrl.Result{}, nil
}

return r.applySettingUpdateStateTransition(ctx, log, biosSettings, server, settingsDiff)
return r.applySettingUpdateStateTransition(ctx, log, bmcClient, biosSettings, server, settingsDiff)
}

func (r *BiosSettingsReconciler) checkAndRequestMaintenance(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
biosSettings *metalv1alpha1.BIOSSettings,
server *metalv1alpha1.Server,
settingsDiff redfish.SettingsAttributes,
) (bool, error) {
// check if we need to request maintenance if we dont have it already
// note: having this check will reduce the call made to BMC.
if biosSettings.Spec.ServerMaintenanceRef == nil {
bmcClient, err := bmcutils.GetBMCClientForServer(ctx, r.Client, server, r.Insecure, r.BMCOptions)
if err != nil {
return false, err
}
defer bmcClient.Logout()

resetReq, err := bmcClient.CheckBiosAttributes(settingsDiff)
if resetReq {
// request maintenance if needed, even if err was reported.
Expand All @@ -325,6 +324,7 @@ func (r *BiosSettingsReconciler) checkAndRequestMaintenance(
func (r *BiosSettingsReconciler) applySettingUpdateStateTransition(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
biosSettings *metalv1alpha1.BIOSSettings,
server *metalv1alpha1.Server,
settingsDiff redfish.SettingsAttributes,
Expand All @@ -350,14 +350,8 @@ func (r *BiosSettingsReconciler) applySettingUpdateStateTransition(
log.V(1).Info("Reconciled biosSettings at Pending state")
return ctrl.Result{}, err
case metalv1alpha1.BIOSSettingUpdateStateIssue:
bmcClient, err := bmcutils.GetBMCClientForServer(ctx, r.Client, server, r.Insecure, r.BMCOptions)
if err != nil {
return ctrl.Result{}, err
}
defer bmcClient.Logout()

// check if the pending tasks not present on the bios settings
pendingSettings, err := r.getPendingSettingsOnBIOS(ctx, log, server)
pendingSettings, err := r.getPendingSettingsOnBIOS(ctx, log, bmcClient, server)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to get pending BIOS settings: %w", err)
}
Expand All @@ -369,13 +363,13 @@ func (r *BiosSettingsReconciler) applySettingUpdateStateTransition(
}
}

// get latest pending settings, and expect it to be zero different from the required settings.
pendingSettings, err = r.getPendingSettingsOnBIOS(ctx, log, server)
// Get the latest pending settings and expect it to be zero different from the required settings.
pendingSettings, err = r.getPendingSettingsOnBIOS(ctx, log, bmcClient, server)
if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to get pending BIOS settings: %w", err)
}

// at this point the bios setting update needs to be already issued.
// At this point the BIOS setting update needs to be already issued.
if len(pendingSettings) == 0 {
// todo: fail after X amount of time
log.V(1).Info("bios Setting update issued to bmc not accepted. retrying....")
Expand Down Expand Up @@ -430,7 +424,7 @@ func (r *BiosSettingsReconciler) applySettingUpdateStateTransition(
return ctrl.Result{}, nil
case metalv1alpha1.BIOSSettingUpdateStateVerification:
// make sure the setting has actually applied.
_, settingsDiff, err := r.getBIOSVersionAndSettingDifference(ctx, log, biosSettings, server)
_, settingsDiff, err := r.getBIOSVersionAndSettingDifference(ctx, log, bmcClient, biosSettings, server)

if err != nil {
return ctrl.Result{}, fmt.Errorf("failed to get BIOS settings: %w", err)
Expand All @@ -453,6 +447,7 @@ func (r *BiosSettingsReconciler) applySettingUpdateStateTransition(
func (r *BiosSettingsReconciler) handleSettingAppliedState(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
biosSettings *metalv1alpha1.BIOSSettings,
server *metalv1alpha1.Server,
) (ctrl.Result, error) {
Expand All @@ -461,7 +456,7 @@ func (r *BiosSettingsReconciler) handleSettingAppliedState(
return ctrl.Result{}, err
}

_, settingsDiff, err := r.getBIOSVersionAndSettingDifference(ctx, log, biosSettings, server)
_, settingsDiff, err := r.getBIOSVersionAndSettingDifference(ctx, log, bmcClient, biosSettings, server)

if err != nil {
log.V(1).Error(err, "unable to fetch and check BIOSSettings")
Expand Down Expand Up @@ -507,15 +502,10 @@ func (r *BiosSettingsReconciler) checkPendingSettingsDiff(
func (r *BiosSettingsReconciler) getPendingSettingsOnBIOS(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
server *metalv1alpha1.Server,
) (pendingSettings redfish.SettingsAttributes, err error) {
bmcClient, err := bmcutils.GetBMCClientForServer(ctx, r.Client, server, r.Insecure, r.BMCOptions)
if err != nil {
return pendingSettings, fmt.Errorf("failed to create BMC client: %w", err)
}
defer bmcClient.Logout()

log.V(1).Info("fetching the pending settings on bios")
log.V(1).Info("Fetching the pending settings on bios")

pendingSettings, err = bmcClient.GetBiosPendingAttributeValues(ctx, server.Spec.SystemUUID)
if err != nil {
Expand All @@ -528,15 +518,10 @@ func (r *BiosSettingsReconciler) getPendingSettingsOnBIOS(
func (r *BiosSettingsReconciler) getBIOSVersionAndSettingDifference(
ctx context.Context,
log logr.Logger,
bmcClient bmc.BMC,
biosSettings *metalv1alpha1.BIOSSettings,
server *metalv1alpha1.Server,
) (currentbiosVersion string, diff redfish.SettingsAttributes, err error) {
bmcClient, err := bmcutils.GetBMCClientForServer(ctx, r.Client, server, r.Insecure, r.BMCOptions)
if err != nil {
return "", diff, fmt.Errorf("failed to create BMC client: %w", err)
}
defer bmcClient.Logout()

keys := slices.Collect(maps.Keys(biosSettings.Spec.SettingsMap))

currentSettings, err := bmcClient.GetBiosAttributeValues(ctx, server.Spec.SystemUUID, keys)
Expand Down
Loading
Loading