Skip to content

Commit c8e8ee1

Browse files
committed
Create a PreprovisioningImage for servicing if needed
The current code ignores PreprovisioningImages for provisioned nodes. While normally there is a leftover PreprovisioningImage from the deployment, it's not the case for externally provisioned hosts. Signed-off-by: Dmitry Tantsur <[email protected]>
1 parent 272f40b commit c8e8ee1

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
@@ -807,10 +807,14 @@ func (r *BareMetalHostReconciler) registerHost(prov provisioner.Provisioner, inf
807807
return actionError{err}
808808
}
809809
switch info.host.Status.Provisioning.State {
810-
case metal3api.StateRegistering, metal3api.StateExternallyProvisioned, metal3api.StateDeleting, metal3api.StatePoweringOffBeforeDelete:
810+
case metal3api.StateRegistering, metal3api.StateDeleting, metal3api.StatePoweringOffBeforeDelete:
811811
// No need to create PreprovisioningImage if host is not yet registered
812-
// or is externally provisioned
813812
preprovImgFormats = nil
813+
case metal3api.StateProvisioned, metal3api.StateExternallyProvisioned:
814+
// Provisioned hosts only need the image for servicing
815+
if info.host.Status.OperationalStatus != metal3api.OperationalStatusServicing {
816+
preprovImgFormats = nil
817+
}
814818
case metal3api.StateDeprovisioning:
815819
// PreprovisioningImage is not required for deprovisioning when cleaning is disabled
816820
if info.host.Spec.AutomatedCleaningMode == metal3api.CleaningModeDisabled {
@@ -842,6 +846,7 @@ func (r *BareMetalHostReconciler) registerHost(prov provisioner.Provisioner, inf
842846
BootMode: info.host.Status.Provisioning.BootMode,
843847
AutomatedCleaningMode: info.host.Spec.AutomatedCleaningMode,
844848
State: info.host.Status.Provisioning.State,
849+
OperationalStatus: info.host.Status.OperationalStatus,
845850
CurrentImage: getCurrentImage(info.host),
846851
PreprovisioningImage: preprovImg,
847852
PreprovisioningNetworkData: preprovisioningNetworkData,
@@ -1467,6 +1472,8 @@ func (r *BareMetalHostReconciler) doServiceIfNeeded(prov provisioner.Provisioner
14671472
// going to impact a small subset of Firmware Settings implementations.
14681473
if info.host.Status.OperationalStatus != metal3api.OperationalStatusServicing {
14691474
info.host.Status.OperationalStatus = metal3api.OperationalStatusServicing
1475+
// NOTE(dtantsur): it's very important to yield to the controller and retry before actually calling Ironic:
1476+
// a PreprovisioningImage may be missing until we get to the registration code.
14701477
return actionUpdate{}
14711478
}
14721479

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)