@@ -45,6 +45,12 @@ type DataTemplateManagerInterface interface {
4545 UpdateDatas (context.Context ) (bool , bool , error )
4646}
4747
48+ // Klogr log levels.
49+ const (
50+ EXTRAINFO = 3
51+ TRACE = 5
52+ )
53+
4854// DataTemplateManager is responsible for performing machine reconciliation.
4955type DataTemplateManager struct {
5056 client client.Client
@@ -167,7 +173,7 @@ func (m *DataTemplateManager) UpdateDatas(ctx context.Context) (bool, bool, erro
167173 }
168174
169175 hasClaims := false
170- // Iterate over the Metal3Data objects to find all indexes and objects
176+ // Iterate over the Metal3DataClaim objects to find all indexes and objects
171177 for _ , dataClaim := range dataClaimObjects .Items {
172178 // If DataTemplate does not point to this object, discard
173179 if dataClaim .Spec .Template .Name != m .DataTemplate .Name {
@@ -179,11 +185,12 @@ func (m *DataTemplateManager) UpdateDatas(ctx context.Context) (bool, bool, erro
179185 continue
180186 }
181187 }
182-
188+ m . Log . V ( TRACE ). Info ( "Initiate updating data of claim" , "Metal3DataClaim" , dataClaim . Name , "Metal3DataTemplate" , m . DataTemplate . Name )
183189 indexes , err = m .updateData (ctx , & dataClaim , indexes )
184190 if err != nil {
185191 return false , false , err
186192 }
193+ m .Log .V (EXTRAINFO ).Info ("Success updating data of claim" , "Metal3DataClaim" , dataClaim .Name , "Metal3DataTemplate" , m .DataTemplate .Name )
187194 }
188195 m .updateStatusTimestamp ()
189196 return hasData , hasClaims , nil
@@ -212,7 +219,8 @@ func (m *DataTemplateManager) updateData(ctx context.Context,
212219 return indexes , err
213220 }
214221 } else {
215- indexes , err = m .deleteData (ctx , dataClaim , indexes )
222+ m .Log .V (TRACE ).Info ("Attempting to delete data of claim and related data if present" , "Metal3DataClaim" , dataClaim .Name )
223+ indexes , err = m .deleteMetal3DataAndClaim (ctx , dataClaim , indexes )
216224 if err != nil {
217225 return indexes , err
218226 }
@@ -341,40 +349,87 @@ func (m *DataTemplateManager) createData(ctx context.Context,
341349 return indexes , nil
342350}
343351
344- // deleteData deletes the Metal3DataClaim and marks the Metal3Data for deletion.
345- func (m * DataTemplateManager ) deleteData (ctx context.Context ,
352+ // handleRetrieveDataError handles errors generated by Metal3Data retrieval.
353+ // First return value is true if Metal3Data was retrieved successfully.
354+ // Second return value contains an error message if an unknown error was encountered.
355+ func (m * DataTemplateManager ) handleRetrieveDataError (err error , filter string , dataClaimName string , dataName string ) (bool , string ) {
356+ if err != nil && apierrors .IsNotFound (err ) {
357+ m .Log .Error (err , "Metal3Data NOT FOUND" , "Metal3Data was not found based on filter:" , filter , "Metal3DataClaim" , dataClaimName , "Metal3DataTemplate" , m .DataTemplate .Name , "Metal3Data" , dataName )
358+ } else if err != nil && ! apierrors .IsNotFound (err ) {
359+ persistentErrMsg := "Failed to get Metal3Data object for reason OTHER THAN not finding it based on " + filter
360+ m .Log .Error (err , persistentErrMsg , "Metal3DataClaim" , dataClaimName , "Metal3DataTemplate" , m .DataTemplate .Name , "Metal3Data" , dataName )
361+ return false , persistentErrMsg
362+ } else if err == nil {
363+ m .Log .V (TRACE ).Info ("Metal3Data found!" , "Metal3DataClaim" , dataClaimName , "Metal3DataTemplate" , m .DataTemplate .Name , "Metal3Data" , dataName )
364+ return true , ""
365+ }
366+ return false , ""
367+ }
368+
369+ // retrieveData is a utility to retrieve Metal3Data based on name and save the data to specified object.
370+ func (m * DataTemplateManager ) retrieveData (ctx context.Context , dataName string , tmpM3Data * infrav1.Metal3Data ) error {
371+ key := client.ObjectKey {
372+ Name : dataName ,
373+ Namespace : m .DataTemplate .Namespace ,
374+ }
375+ return m .client .Get (ctx , key , tmpM3Data )
376+ }
377+
378+ // deleteMetal3DataAndClaim deletes the Metal3DataClaim and marks the Metal3Data for deletion.
379+ func (m * DataTemplateManager ) deleteMetal3DataAndClaim (ctx context.Context ,
346380 dataClaim * infrav1.Metal3DataClaim , indexes map [int ]string ,
347381) (map [int ]string , error ) {
348382 m .Log .Info ("Deleting Metal3DataClaim" , "Metal3DataClaim" , dataClaim .Name )
383+ persistentErrMsg := ""
384+ m3DataFound := false
385+ tmpM3Data := & infrav1.Metal3Data {}
386+ dataName := ""
349387
350388 dataClaimIndex , ok := m .DataTemplate .Status .Indexes [dataClaim .Name ]
389+
351390 if ok {
352- // Try to get the Metal3Data. if it succeeds, delete it
353- tmpM3Data := & infrav1.Metal3Data {}
354- key := client.ObjectKey {
355- Name : m .DataTemplate .Name + "-" + strconv .Itoa (dataClaimIndex ),
356- Namespace : m .DataTemplate .Namespace ,
391+ // Try to get the Metal3Data, if it succeeds, delete it
392+ dataName = m .DataTemplate .Name + "-" + strconv .Itoa (dataClaimIndex )
393+ err := m .retrieveData (ctx , dataName , tmpM3Data )
394+ m3DataFound , persistentErrMsg = m .handleRetrieveDataError (err , "template name and claim index" , dataClaim .Name , dataName )
395+ } else {
396+ persistentErrMsg = "Index of the claim was not found"
397+ m .Log .Error (errors .New (persistentErrMsg ), dataClaim .Name , "Metal3DataTemplate" , m .DataTemplate .Name )
398+ }
399+
400+ if ! m3DataFound {
401+ m .Log .V (TRACE ).Info ("Attempting to retrieve Metal3Data based on Metal3DataClaim render information" )
402+ if dataClaim != nil && dataClaim .Status .RenderedData != nil {
403+ dataName = dataClaim .Status .RenderedData .Name
404+ err := m .retrieveData (ctx , dataName , tmpM3Data )
405+ errMsg := ""
406+ m3DataFound , errMsg = m .handleRetrieveDataError (err , "render data reference" , dataClaim .Name , dataName )
407+ persistentErrMsg += errMsg
357408 }
358- err := m .client .Get (ctx , key , tmpM3Data )
409+ }
410+
411+ if m3DataFound {
412+ // Remove the finalizer
413+ m .Log .V (TRACE ).Info ("Attempting to remove finalizer from associated Metal3Data" , "Metal3DataClaim" , dataClaim .Name , "Metal3DataTemplate" , m .DataTemplate .Name , "Metal3Data" , dataName )
414+ controllerutil .RemoveFinalizer (tmpM3Data , infrav1 .DataClaimFinalizer )
415+ err := updateObject (ctx , m .client , tmpM3Data )
359416 if err != nil && ! apierrors .IsNotFound (err ) {
360- dataClaim .Status .ErrorMessage = ptr .To ("Failed to get associated Metal3Data object" )
417+ m .Log .Error (errors .New ("Unable to remove finalizer from Metal3Data" ), tmpM3Data .Name )
418+ return indexes , err
419+ }
420+ // Delete the Metal3Data
421+ m .Log .V (EXTRAINFO ).Info ("Deleting associated Metal3Data" , "Metal3DataClaim" , dataClaim .Name , "Metal3DataTemplate" , m .DataTemplate .Name , "Metal3Data" , dataName )
422+ err = deleteObject (ctx , m .client , tmpM3Data )
423+ if err != nil && ! apierrors .IsNotFound (err ) {
424+ dataClaim .Status .ErrorMessage = ptr .To ("Failed to delete associated Metal3Data object" )
361425 return indexes , err
362- } else if err == nil {
363- // Remove the finalizer
364- controllerutil .RemoveFinalizer (tmpM3Data , infrav1 .DataClaimFinalizer )
365- err = updateObject (ctx , m .client , tmpM3Data )
366- if err != nil && ! apierrors .IsNotFound (err ) {
367- m .Log .Info ("Unable to remove finalizer from Metal3Data" , "Metal3Data" , tmpM3Data .Name )
368- return indexes , err
369- }
370- // Delete the Metal3Data
371- err = deleteObject (ctx , m .client , tmpM3Data )
372- if err != nil && ! apierrors .IsNotFound (err ) {
373- dataClaim .Status .ErrorMessage = ptr .To ("Failed to delete associated Metal3Data object" )
374- return indexes , err
375- }
376- m .Log .Info ("Deleted Metal3Data" , "Metal3Data" , tmpM3Data .Name )
377426 }
427+ m .Log .Info ("Deleted Metal3Data" , "Metal3Data" , tmpM3Data .Name )
428+ } else {
429+ errMsg := "Failed to retrieve Metal3Data object because it was not found or for other unknown reason."
430+ persistentErrMsg += errMsg
431+ dataClaim .Status .ErrorMessage = ptr .To (persistentErrMsg )
432+ m .Log .Error (errors .New (errMsg ), "error added to Metal3DataClaim status" , "Metal3DataClaim" , dataClaim .Name , "Metal3DataTemplate" , m .DataTemplate .Name , "Metal3Data" , dataName )
378433 }
379434
380435 dataClaim .Status .RenderedData = nil
0 commit comments