Skip to content

Commit 1c2d0ba

Browse files
committed
support extraPreProvKernelParams in deprovisioning
This commit: - Makes the deprovisioning process able to update the extra kernel parameter field of the ironic node's driver_info before the actual deprovisioning would start. This feature can come handy when the user needs different kernel options during e.g. automated node cleaning compared to inspection. Signed-off-by: Adam Rozman <adam.rozman@est.tech>
1 parent ba5bc05 commit 1c2d0ba

File tree

7 files changed

+34
-10
lines changed

7 files changed

+34
-10
lines changed

internal/controller/metal3.io/baremetalhost_controller.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1397,9 +1397,12 @@ func (r *BareMetalHostReconciler) actionDeprovisioning(prov provisioner.Provisio
13971397
}
13981398
}
13991399

1400+
DeprovisionData := provisioner.DeprovisionData{
1401+
PreprovisioningExtraKernelParams: r.retrievePreprovisioningExtraKernelParamsSpec(info, prov),
1402+
}
14001403
info.log.Info("deprovisioning")
14011404

1402-
provResult, err := prov.Deprovision(info.host.Status.ErrorType == metal3api.ProvisioningError)
1405+
provResult, err := prov.Deprovision(DeprovisionData, info.host.Status.ErrorType == metal3api.ProvisioningError)
14031406
if err != nil {
14041407
return actionError{fmt.Errorf("failed to deprovision: %w", err)}
14051408
}

internal/controller/metal3.io/host_state_machine_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1374,7 +1374,7 @@ func (m *mockProvisioner) Provision(_ provisioner.ProvisionData, _ bool) (result
13741374
return m.getNextResultByMethod("Provision"), err
13751375
}
13761376

1377-
func (m *mockProvisioner) Deprovision(_ bool) (result provisioner.Result, err error) {
1377+
func (m *mockProvisioner) Deprovision(_ provisioner.DeprovisionData, _ bool) (result provisioner.Result, err error) {
13781378
return m.getNextResultByMethod("Deprovision"), err
13791379
}
13801380

pkg/provisioner/demo/demo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ func (p *demoProvisioner) Provision(_ provisioner.ProvisionData, _ bool) (result
269269
// Deprovision removes the host from the image. It may be called
270270
// multiple times, and should return true for its dirty flag until the
271271
// deprovisioning operation is completed.
272-
func (p *demoProvisioner) Deprovision(_ bool) (result provisioner.Result, err error) {
272+
func (p *demoProvisioner) Deprovision(_ provisioner.DeprovisionData, _ bool) (result provisioner.Result, err error) {
273273
p.log.Info("deprovisioning host")
274274
return result, nil
275275
}

pkg/provisioner/fixture/fixture.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func (p *fixtureProvisioner) Provision(data provisioner.ProvisionData, _ bool) (
286286
// Deprovision removes the host from the image. It may be called
287287
// multiple times, and should return true for its dirty flag until the
288288
// deprovisioning operation is completed.
289-
func (p *fixtureProvisioner) Deprovision(_ bool) (result provisioner.Result, err error) {
289+
func (p *fixtureProvisioner) Deprovision(_ provisioner.DeprovisionData, _ bool) (result provisioner.Result, err error) {
290290
p.log.Info("ensuring host is deprovisioned")
291291

292292
result.RequeueAfter = deprovisionRequeueDelay

pkg/provisioner/ironic/ironic.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,16 @@ func (p *ironicProvisioner) getPrepareOptsForNode(ironicNode *nodes.Node, data p
735735
return updater
736736
}
737737

738+
func (p *ironicProvisioner) getDeprovisionOptsForNode(ironicNode *nodes.Node, data provisioner.DeprovisionData) *clients.NodeUpdater {
739+
updater := clients.UpdateOptsBuilder(p.log)
740+
driverOpts := clients.UpdateOptsData{
741+
"kernel_append_params": fmtPreprovExtraKernParams(data.PreprovisioningExtraKernelParams),
742+
}
743+
updater.SetDriverInfoOpts(driverOpts, ironicNode)
744+
745+
return updater
746+
}
747+
738748
func (p *ironicProvisioner) getServicingOptsForNode(ironicNode *nodes.Node, data provisioner.ServicingData) *clients.NodeUpdater {
739749
updater := clients.UpdateOptsBuilder(p.log)
740750
driverOpts := clients.UpdateOptsData{
@@ -1418,14 +1428,21 @@ func (p *ironicProvisioner) setMaintenanceFlag(ironicNode *nodes.Node, value boo
14181428
// Deprovision removes the host from the image. It may be called
14191429
// multiple times, and should return true for its dirty flag until the
14201430
// deprovisioning operation is completed.
1421-
func (p *ironicProvisioner) Deprovision(restartOnFailure bool) (result provisioner.Result, err error) {
1431+
func (p *ironicProvisioner) Deprovision(data provisioner.DeprovisionData, restartOnFailure bool) (result provisioner.Result, err error) {
14221432
p.log.Info("deprovisioning")
14231433

14241434
ironicNode, err := p.getNode()
14251435
if err != nil {
14261436
return transientError(err)
14271437
}
14281438

1439+
// Updating the kernel_append_params field of the Ironic node's
1440+
// API drive_info endpoint
1441+
_, updateSuccess, result, err := p.tryUpdateNode(ironicNode, p.getDeprovisionOptsForNode(ironicNode, data))
1442+
if !updateSuccess {
1443+
return result, err
1444+
}
1445+
14291446
p.log.Info("deprovisioning host",
14301447
"ID", ironicNode.UUID,
14311448
"lastError", ironicNode.LastError,

pkg/provisioner/ironic/provision_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ func TestDeprovision(t *testing.T) {
291291
},
292292
{
293293
name: "deleting state",
294-
ironic: testserver.NewIronic(t).Node(nodes.Node{
294+
ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{
295295
ProvisionState: string(nodes.Deleting),
296296
UUID: nodeUUID,
297297
}),
@@ -300,7 +300,7 @@ func TestDeprovision(t *testing.T) {
300300
},
301301
{
302302
name: "cleaning state",
303-
ironic: testserver.NewIronic(t).Node(nodes.Node{
303+
ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{
304304
ProvisionState: string(nodes.Cleaning),
305305
UUID: nodeUUID,
306306
}),
@@ -309,7 +309,7 @@ func TestDeprovision(t *testing.T) {
309309
},
310310
{
311311
name: "cleanWait state",
312-
ironic: testserver.NewIronic(t).Node(nodes.Node{
312+
ironic: testserver.NewIronic(t).WithDefaultResponses().Node(nodes.Node{
313313
ProvisionState: string(nodes.CleanWait),
314314
UUID: nodeUUID,
315315
}),
@@ -351,7 +351,7 @@ func TestDeprovision(t *testing.T) {
351351
t.Fatalf("could not create provisioner: %s", err)
352352
}
353353

354-
result, err := prov.Deprovision(false)
354+
result, err := prov.Deprovision(provisioner.DeprovisionData{}, false)
355355

356356
assert.Equal(t, tc.expectedDirty, result.Dirty)
357357
assert.Equal(t, tc.expectedErrorMessage, result.ErrorMessage != "")

pkg/provisioner/provisioner.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ type AdoptData struct {
9090
State metal3api.ProvisioningState
9191
}
9292

93+
type DeprovisionData struct {
94+
PreprovisioningExtraKernelParams string
95+
}
96+
9397
type InspectData struct {
9498
BootMode metal3api.BootMode
9599
PreprovisioningExtraKernelParams string
@@ -179,7 +183,7 @@ type Provisioner interface {
179183
// Deprovision removes the host from the image. It may be called
180184
// multiple times, and should return true for its dirty flag until
181185
// the deprovisioning operation is completed.
182-
Deprovision(restartOnFailure bool) (result Result, err error)
186+
Deprovision(data DeprovisionData, restartOnFailure bool) (result Result, err error)
183187

184188
// Delete removes the host from the provisioning system. It may be
185189
// called multiple times, and should return true for its dirty

0 commit comments

Comments
 (0)