@@ -53,7 +53,7 @@ func firmwareInstall(ctx context.Context, component, operationApplyTime string,
53
53
taskID , vErr := elem .FirmwareInstall (ctx , component , operationApplyTime , forceInstall , reader )
54
54
if vErr != nil {
55
55
err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
56
- err = multierror . Append ( err , vErr )
56
+ metadata . FailedProviderDetail [ elem . name ] = err . Error ( )
57
57
continue
58
58
59
59
}
@@ -134,7 +134,7 @@ func firmwareInstallStatus(ctx context.Context, installVersion, component, taskI
134
134
status , vErr := elem .FirmwareInstallStatus (ctx , installVersion , component , taskID )
135
135
if vErr != nil {
136
136
err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
137
- err = multierror . Append ( err , vErr )
137
+ metadata . FailedProviderDetail [ elem . name ] = err . Error ( )
138
138
continue
139
139
140
140
}
@@ -175,7 +175,82 @@ func FirmwareInstallStatusFromInterfaces(ctx context.Context, installVersion, co
175
175
return firmwareInstallStatus (ctx , installVersion , component , taskID , implementations )
176
176
}
177
177
178
- // FirmwareInstallerWithOpts defines an interface to install firmware that was previously uploaded with FirmwareUpload
178
+ // FirmwareInstallProvider defines an interface to upload and initiate a firmware install in the same implementation method
179
+ //
180
+ // Its intended to deprecate the FirmwareInstall interface
181
+ type FirmwareInstallProvider interface {
182
+ // FirmwareInstallUploadAndInitiate uploads _and_ initiates the firmware install process.
183
+ //
184
+ // return values:
185
+ // taskID - A taskID is returned if the update process on the BMC returns an identifier for the update process.
186
+ FirmwareInstallUploadAndInitiate (ctx context.Context , component string , file * os.File ) (taskID string , err error )
187
+ }
188
+
189
+ // firmwareInstallProvider is an internal struct to correlate an implementation/provider and its name
190
+ type firmwareInstallProvider struct {
191
+ name string
192
+ FirmwareInstallProvider
193
+ }
194
+
195
+ // firmwareInstall uploads and initiates firmware update for the component
196
+ func firmwareInstallUploadAndInitiate (ctx context.Context , component string , file * os.File , generic []firmwareInstallProvider ) (taskID string , metadata Metadata , err error ) {
197
+ var metadataLocal Metadata
198
+
199
+ for _ , elem := range generic {
200
+ if elem .FirmwareInstallProvider == nil {
201
+ continue
202
+ }
203
+ select {
204
+ case <- ctx .Done ():
205
+ err = multierror .Append (err , ctx .Err ())
206
+
207
+ return taskID , metadata , err
208
+ default :
209
+ metadataLocal .ProvidersAttempted = append (metadataLocal .ProvidersAttempted , elem .name )
210
+ taskID , vErr := elem .FirmwareInstallUploadAndInitiate (ctx , component , file )
211
+ if vErr != nil {
212
+ err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
213
+ metadata .FailedProviderDetail [elem .name ] = err .Error ()
214
+ continue
215
+ }
216
+ metadataLocal .SuccessfulProvider = elem .name
217
+ return taskID , metadataLocal , nil
218
+ }
219
+ }
220
+
221
+ return taskID , metadataLocal , multierror .Append (err , errors .New ("failure in FirmwareInstallUploadAndInitiate" ))
222
+ }
223
+
224
+ // FirmwareInstallUploadAndInitiateFromInterfaces identifies implementations of the FirmwareInstallProvider interface and passes the found implementations to the firmwareInstallUploadAndInitiate() wrapper
225
+ func FirmwareInstallUploadAndInitiateFromInterfaces (ctx context.Context , component string , file * os.File , generic []interface {}) (taskID string , metadata Metadata , err error ) {
226
+ metadata = newMetadata ()
227
+
228
+ implementations := make ([]firmwareInstallProvider , 0 )
229
+ for _ , elem := range generic {
230
+ temp := firmwareInstallProvider {name : getProviderName (elem )}
231
+ switch p := elem .(type ) {
232
+ case FirmwareInstallProvider :
233
+ temp .FirmwareInstallProvider = p
234
+ implementations = append (implementations , temp )
235
+ default :
236
+ e := fmt .Sprintf ("not a FirmwareInstallProvider implementation: %T" , p )
237
+ err = multierror .Append (err , errors .New (e ))
238
+ }
239
+ }
240
+ if len (implementations ) == 0 {
241
+ return taskID , metadata , multierror .Append (
242
+ err ,
243
+ errors .Wrap (
244
+ bmclibErrs .ErrProviderImplementation ,
245
+ ("no FirmwareInstallProvider implementations found" ),
246
+ ),
247
+ )
248
+ }
249
+
250
+ return firmwareInstallUploadAndInitiate (ctx , component , file , implementations )
251
+ }
252
+
253
+ // FirmwareInstallerUploaded defines an interface to install firmware that was previously uploaded with FirmwareUpload
179
254
type FirmwareInstallerUploaded interface {
180
255
// FirmwareInstallUploaded uploads firmware update payload to the BMC returning the firmware install task ID
181
256
//
@@ -213,7 +288,7 @@ func firmwareInstallUploaded(ctx context.Context, component, uploadTaskID string
213
288
installTaskID , vErr = elem .FirmwareInstallUploaded (ctx , component , uploadTaskID )
214
289
if vErr != nil {
215
290
err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
216
- err = multierror . Append ( err , vErr )
291
+ metadata . FailedProviderDetail [ elem . name ] = err . Error ( )
217
292
continue
218
293
219
294
}
@@ -310,7 +385,7 @@ func firmwareInstallSteps(ctx context.Context, component string, generic []firmw
310
385
steps , vErr := elem .FirmwareInstallSteps (ctx , component )
311
386
if vErr != nil {
312
387
err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
313
- err = multierror . Append ( err , vErr )
388
+ metadata . FailedProviderDetail [ elem . name ] = err . Error ( )
314
389
continue
315
390
316
391
}
@@ -362,7 +437,7 @@ func FirmwareUploadFromInterfaces(ctx context.Context, component string, file *o
362
437
}
363
438
364
439
func firmwareUpload (ctx context.Context , component string , file * os.File , generic []firmwareUploaderProvider ) (taskID string , metadata Metadata , err error ) {
365
- var metadataLocal Metadata
440
+ metadata = newMetadata ()
366
441
367
442
for _ , elem := range generic {
368
443
if elem .FirmwareUploader == nil {
@@ -374,20 +449,20 @@ func firmwareUpload(ctx context.Context, component string, file *os.File, generi
374
449
375
450
return taskID , metadata , err
376
451
default :
377
- metadataLocal .ProvidersAttempted = append (metadataLocal .ProvidersAttempted , elem .name )
452
+ metadata .ProvidersAttempted = append (metadata .ProvidersAttempted , elem .name )
378
453
taskID , vErr := elem .FirmwareUpload (ctx , component , file )
379
454
if vErr != nil {
380
455
err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
381
- err = multierror . Append ( err , vErr )
456
+ metadata . FailedProviderDetail [ elem . name ] = err . Error ( )
382
457
continue
383
458
384
459
}
385
- metadataLocal .SuccessfulProvider = elem .name
386
- return taskID , metadataLocal , nil
460
+ metadata .SuccessfulProvider = elem .name
461
+ return taskID , metadata , nil
387
462
}
388
463
}
389
464
390
- return taskID , metadataLocal , multierror .Append (err , errors .New ("failure in FirmwareUpload" ))
465
+ return taskID , metadata , multierror .Append (err , errors .New ("failure in FirmwareUpload" ))
391
466
}
392
467
393
468
// FirmwareTaskVerifier defines an interface to check the status for firmware related tasks queued on the BMC.
@@ -417,7 +492,7 @@ type firmwareTaskVerifierProvider struct {
417
492
418
493
// firmwareTaskStatus returns the status of the firmware upload process.
419
494
func firmwareTaskStatus (ctx context.Context , kind bconsts.FirmwareInstallStep , component , taskID , installVersion string , generic []firmwareTaskVerifierProvider ) (state constants.TaskState , status string , metadata Metadata , err error ) {
420
- var metadataLocal Metadata
495
+ metadata = newMetadata ()
421
496
422
497
for _ , elem := range generic {
423
498
if elem .FirmwareTaskVerifier == nil {
@@ -429,20 +504,20 @@ func firmwareTaskStatus(ctx context.Context, kind bconsts.FirmwareInstallStep, c
429
504
430
505
return state , status , metadata , err
431
506
default :
432
- metadataLocal .ProvidersAttempted = append (metadataLocal .ProvidersAttempted , elem .name )
507
+ metadata .ProvidersAttempted = append (metadata .ProvidersAttempted , elem .name )
433
508
state , status , vErr := elem .FirmwareTaskStatus (ctx , kind , component , taskID , installVersion )
434
509
if vErr != nil {
435
510
err = multierror .Append (err , errors .WithMessagef (vErr , "provider: %v" , elem .name ))
436
- err = multierror . Append ( err , vErr )
511
+ metadata . FailedProviderDetail [ elem . name ] = err . Error ( )
437
512
continue
438
-
439
513
}
440
- metadataLocal .SuccessfulProvider = elem .name
441
- return state , status , metadataLocal , nil
514
+
515
+ metadata .SuccessfulProvider = elem .name
516
+ return state , status , metadata , nil
442
517
}
443
518
}
444
519
445
- return state , status , metadataLocal , multierror .Append (err , errors .New ("failure in FirmwareTaskStatus" ))
520
+ return state , status , metadata , multierror .Append (err , errors .New ("failure in FirmwareTaskStatus" ))
446
521
}
447
522
448
523
// FirmwareTaskStatusFromInterfaces identifies implementations of the FirmwareTaskVerifier interface and passes the found implementations to the firmwareTaskStatus() wrapper.
0 commit comments