Skip to content

Commit afd8f3c

Browse files
Merge pull request #2690 from dtantsur/service-ppi
🐛 Create a PreprovisioningImage for servicing if needed
2 parents 92550df + c8e8ee1 commit afd8f3c

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

internal/controller/metal3.io/baremetalhost_controller.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -800,10 +800,14 @@ func (r *BareMetalHostReconciler) registerHost(prov provisioner.Provisioner, inf
800800
return actionError{err}
801801
}
802802
switch info.host.Status.Provisioning.State {
803-
case metal3api.StateRegistering, metal3api.StateExternallyProvisioned, metal3api.StateDeleting, metal3api.StatePoweringOffBeforeDelete:
803+
case metal3api.StateRegistering, metal3api.StateDeleting, metal3api.StatePoweringOffBeforeDelete:
804804
// No need to create PreprovisioningImage if host is not yet registered
805-
// or is externally provisioned
806805
preprovImgFormats = nil
806+
case metal3api.StateProvisioned, metal3api.StateExternallyProvisioned:
807+
// Provisioned hosts only need the image for servicing
808+
if info.host.Status.OperationalStatus != metal3api.OperationalStatusServicing {
809+
preprovImgFormats = nil
810+
}
807811
case metal3api.StateDeprovisioning:
808812
// PreprovisioningImage is not required for deprovisioning when cleaning is disabled
809813
if info.host.Spec.AutomatedCleaningMode == metal3api.CleaningModeDisabled {
@@ -835,6 +839,7 @@ func (r *BareMetalHostReconciler) registerHost(prov provisioner.Provisioner, inf
835839
BootMode: info.host.Status.Provisioning.BootMode,
836840
AutomatedCleaningMode: info.host.Spec.AutomatedCleaningMode,
837841
State: info.host.Status.Provisioning.State,
842+
OperationalStatus: info.host.Status.OperationalStatus,
838843
CurrentImage: getCurrentImage(info.host),
839844
PreprovisioningImage: preprovImg,
840845
PreprovisioningNetworkData: preprovisioningNetworkData,
@@ -1460,6 +1465,8 @@ func (r *BareMetalHostReconciler) doServiceIfNeeded(prov provisioner.Provisioner
14601465
// going to impact a small subset of Firmware Settings implementations.
14611466
if info.host.Status.OperationalStatus != metal3api.OperationalStatusServicing {
14621467
info.host.Status.OperationalStatus = metal3api.OperationalStatusServicing
1468+
// NOTE(dtantsur): it's very important to yield to the controller and retry before actually calling Ironic:
1469+
// a PreprovisioningImage may be missing until we get to the registration code.
14631470
return actionUpdate{}
14641471
}
14651472

pkg/provisioner/ironic/ironic.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,13 @@ func (p *ironicProvisioner) configureNode(data provisioner.ManagementAccessData,
363363
result, err = transientError(provisioner.ErrNeedsPreprovisioningImage)
364364
}
365365
return result, err
366+
case metal3api.StateProvisioned,
367+
metal3api.StateExternallyProvisioned:
368+
if data.OperationalStatus == metal3api.OperationalStatusServicing &&
369+
deployImageInfo == nil && p.config.havePreprovImgBuilder {
370+
result, err = transientError(provisioner.ErrNeedsPreprovisioningImage)
371+
}
372+
return result, err
366373
default:
367374
}
368375

pkg/provisioner/provisioner.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ type ManagementAccessData struct {
7777
BootMode metal3api.BootMode
7878
AutomatedCleaningMode metal3api.AutomatedCleaningMode
7979
State metal3api.ProvisioningState
80+
OperationalStatus metal3api.OperationalStatus
8081
CurrentImage *metal3api.Image
8182
PreprovisioningImage *PreprovisioningImage
8283
PreprovisioningNetworkData string

0 commit comments

Comments
 (0)