@@ -38,6 +38,7 @@ import (
3838 k8serrors "k8s.io/apimachinery/pkg/api/errors"
3939 "k8s.io/apimachinery/pkg/api/meta"
4040 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
41+ "k8s.io/apimachinery/pkg/types"
4142 ctrl "sigs.k8s.io/controller-runtime"
4243 "sigs.k8s.io/controller-runtime/pkg/builder"
4344 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -69,13 +70,14 @@ type BareMetalHostReconciler struct {
6970// Instead of passing a zillion arguments to the action of a phase,
7071// hold them in a context.
7172type reconcileInfo struct {
72- ctx context.Context
73- log logr.Logger
74- host * metal3api.BareMetalHost
75- request ctrl.Request
76- bmcCredsSecret * corev1.Secret
77- events []corev1.Event
78- postSaveCallbacks []func ()
73+ ctx context.Context
74+ log logr.Logger
75+ host * metal3api.BareMetalHost
76+ request ctrl.Request
77+ bmcCredsSecret * corev1.Secret
78+ preprovisioningNetworkDataSecret * corev1.Secret
79+ events []corev1.Event
80+ postSaveCallbacks []func ()
7981}
8082
8183// match the provisioner.EventPublisher interface.
@@ -201,13 +203,30 @@ func (r *BareMetalHostReconciler) Reconcile(ctx context.Context, request ctrl.Re
201203 }
202204 }
203205
206+ var preprovisioningNetworkDataSecret * corev1.Secret
207+ if host .Spec .PreprovisioningNetworkDataName != "" &&
208+ host .Status .Provisioning .State != metal3api .StateNone &&
209+ host .Status .Provisioning .State != metal3api .StateUnmanaged {
210+ preprovisioningNetworkDataSecret , err = r .acquirePreprovisioningNetworkDataSecret (ctx , host )
211+ if err != nil {
212+ if hostInDeletionFlow (host ) && k8serrors .IsNotFound (err ) {
213+ preprovisioningNetworkDataSecret = & corev1.Secret {}
214+ } else if ! hostInDeletionFlow (host ) {
215+ reqLogger .Info ("failed to acquire preprovisioning network data secret" , "error" , err )
216+ } else {
217+ return ctrl.Result {}, fmt .Errorf ("failed to acquire preprovisioning network data secret during deletion: %w" , err )
218+ }
219+ }
220+ }
221+
204222 initialState := host .Status .Provisioning .State
205223 info := & reconcileInfo {
206- ctx : ctx ,
207- log : reqLogger .WithValues ("provisioningState" , initialState ),
208- host : host ,
209- request : request ,
210- bmcCredsSecret : bmcCredsSecret ,
224+ ctx : ctx ,
225+ log : reqLogger .WithValues ("provisioningState" , initialState ),
226+ host : host ,
227+ request : request ,
228+ bmcCredsSecret : bmcCredsSecret ,
229+ preprovisioningNetworkDataSecret : preprovisioningNetworkDataSecret ,
211230 }
212231
213232 prov , err := r .ProvisionerFactory .NewProvisioner (ctx , provisioner .BuildHostData (* host , * bmcCreds ), info .publishEvent )
@@ -554,6 +573,13 @@ func (r *BareMetalHostReconciler) actionDeleting(prov provisioner.Provisioner, i
554573 return actionError {err }
555574 }
556575
576+ if info .preprovisioningNetworkDataSecret != nil && info .preprovisioningNetworkDataSecret .Name != "" {
577+ err = secretManager .ReleaseSecret (info .preprovisioningNetworkDataSecret )
578+ if err != nil {
579+ return actionError {err }
580+ }
581+ }
582+
557583 info .host .Finalizers = utils .FilterStringFromList (
558584 info .host .Finalizers , metal3api .BareMetalHostFinalizer )
559585 info .log .Info ("cleanup is complete, removed finalizer" ,
@@ -2220,6 +2246,22 @@ func (r *BareMetalHostReconciler) getBMCSecretAndSetOwner(ctx context.Context, r
22202246 return bmcCredsSecret , nil
22212247}
22222248
2249+ // acquirePreprovisioningNetworkDataSecret claims the Secret referenced by
2250+ // spec.preprovisioningNetworkDataName with a finalizer so it is not removed
2251+ // before the host finishes deletion. Callers must ensure
2252+ // spec.preprovisioningNetworkDataName is set.
2253+ func (r * BareMetalHostReconciler ) acquirePreprovisioningNetworkDataSecret (ctx context.Context , host * metal3api.BareMetalHost ) (* corev1.Secret , error ) {
2254+ secretManager := r .secretManager (ctx , r .Log .WithValues (
2255+ "baremetalhost" , types.NamespacedName {Namespace : host .Namespace , Name : host .Name },
2256+ ))
2257+ key := types.NamespacedName {
2258+ Name : host .Spec .PreprovisioningNetworkDataName ,
2259+ Namespace : host .Namespace ,
2260+ }
2261+
2262+ return secretManager .ObtainSecretWithFinalizer (key , host .Status .Provisioning .State != metal3api .StateDeleting )
2263+ }
2264+
22232265func credentialsFromSecret (bmcCredsSecret * corev1.Secret ) * bmc.Credentials {
22242266 // We trim surrounding whitespace because those characters are
22252267 // unlikely to be part of the username or password and it is
0 commit comments