@@ -2572,11 +2572,38 @@ func (dn *Daemon) updateLayeredOS(config *mcfgv1.MachineConfig) error {
25722572 }
25732573 }
25742574
2575+ // For image mode status reporting we need the node's MCP association to populate its MCN
2576+ imageModeStatusReportingEnabled := dn .fgHandler != nil && dn .fgHandler .Enabled (features .FeatureGateImageModeStatusReporting )
2577+ pool := ""
2578+ if imageModeStatusReportingEnabled {
2579+ pool , err = helpers .GetPrimaryPoolNameForMCN (dn .mcpLister , dn .node )
2580+ if err != nil {
2581+ return err
2582+ }
2583+ }
2584+
25752585 if isOsImagePresent {
25762586 if err := dn .NodeUpdaterClient .RebaseLayeredFromContainerStorage (newURL ); err != nil {
25772587 return fmt .Errorf ("failed to update OS from local storage: %s: %w" , newURL , err )
25782588 }
25792589 } else {
2590+ // Report ImagePulledFromRegistry condition as unknown (pulling)
2591+ if imageModeStatusReportingEnabled {
2592+ err := upgrademonitor .GenerateAndApplyMachineConfigNodes (
2593+ & upgrademonitor.Condition {State : mcfgv1 .MachineConfigNodeImagePulledFromRegistry , Reason : string (mcfgv1 .MachineConfigNodeImagePulledFromRegistry ), Message : fmt .Sprintf ("Pulling OS image %s from registry" , newURL )},
2594+ nil ,
2595+ metav1 .ConditionUnknown ,
2596+ metav1 .ConditionFalse ,
2597+ dn .node ,
2598+ dn .mcfgClient ,
2599+ dn .fgHandler ,
2600+ pool ,
2601+ )
2602+ if err != nil {
2603+ klog .Errorf ("Error setting ImagePulledFromRegistry condition to unknown: %v" , err )
2604+ }
2605+ }
2606+
25802607 // Workaround for OCPBUGS-43406, retry the remote rebase with backoff,
25812608 // such that if we happen to update while the CoreDNS pod is being restarted,
25822609 // the next retry should succeed if no other issues are present.
@@ -2593,8 +2620,41 @@ func (dn *Daemon) updateLayeredOS(config *mcfgv1.MachineConfig) error {
25932620 }
25942621 return true , nil
25952622 }); err != nil {
2623+ // Report ImagePulledFromRegistry condition as false (failed)
2624+ if imageModeStatusReportingEnabled {
2625+ err = upgrademonitor .GenerateAndApplyMachineConfigNodes (
2626+ & upgrademonitor.Condition {State : mcfgv1 .MachineConfigNodeImagePulledFromRegistry , Reason : string (mcfgv1 .MachineConfigNodeImagePulledFromRegistry ), Message : fmt .Sprintf ("Failed to pull OS image %s from registry: %v" , newURL , err )},
2627+ nil ,
2628+ metav1 .ConditionFalse ,
2629+ metav1 .ConditionFalse ,
2630+ dn .node ,
2631+ dn .mcfgClient ,
2632+ dn .fgHandler ,
2633+ pool ,
2634+ )
2635+ if err != nil {
2636+ klog .Errorf ("Error setting ImagePulledFromRegistry condition to false: %v" , err )
2637+ }
2638+ }
25962639 return fmt .Errorf ("Failed to update OS to %s after retries: %w" , newURL , err )
25972640 }
2641+
2642+ // Report ImagePulledFromRegistry condition as true (success)
2643+ if imageModeStatusReportingEnabled {
2644+ err := upgrademonitor .GenerateAndApplyMachineConfigNodes (
2645+ & upgrademonitor.Condition {State : mcfgv1 .MachineConfigNodeImagePulledFromRegistry , Reason : string (mcfgv1 .MachineConfigNodeImagePulledFromRegistry ), Message : fmt .Sprintf ("Successfully pulled OS image %s from registry" , newURL )},
2646+ nil ,
2647+ metav1 .ConditionTrue ,
2648+ metav1 .ConditionFalse ,
2649+ dn .node ,
2650+ dn .mcfgClient ,
2651+ dn .fgHandler ,
2652+ pool ,
2653+ )
2654+ if err != nil {
2655+ klog .Errorf ("Error setting ImagePulledFromRegistry condition to true: %v" , err )
2656+ }
2657+ }
25982658 }
25992659
26002660 return nil
@@ -2755,6 +2815,7 @@ func (dn *Daemon) reboot(rationale string) error {
27552815 return nil
27562816}
27572817
2818+ //nolint:gocyclo
27582819func (dn * CoreOSDaemon ) applyLayeredOSChanges (mcDiff machineConfigDiff , oldConfig , newConfig * mcfgv1.MachineConfig ) (retErr error ) {
27592820 // Override the computed diff if the booted state differs from the oldConfig
27602821 // https://issues.redhat.com/browse/OCPBUGS-2757
@@ -2766,13 +2827,75 @@ func (dn *CoreOSDaemon) applyLayeredOSChanges(mcDiff machineConfigDiff, oldConfi
27662827 var osExtensionsContentDir string
27672828 var err error
27682829
2830+ // For image mode status reporting we need the node's MCP association to populate its MCN
2831+ imageModeStatusReportingEnabled := dn .fgHandler != nil && dn .fgHandler .Enabled (features .FeatureGateImageModeStatusReporting )
2832+ pool := ""
2833+ if imageModeStatusReportingEnabled {
2834+ pool , err = helpers .GetPrimaryPoolNameForMCN (dn .mcpLister , dn .node )
2835+ if err != nil {
2836+ return err
2837+ }
2838+ }
2839+
27692840 if newConfig .Spec .BaseOSExtensionsContainerImage != "" && (mcDiff .osUpdate || mcDiff .extensions || mcDiff .kernelType ) && ! mcDiff .oclEnabled {
27702841 // TODO(jkyros): the original intent was that we use the extensions container as a service, but that currently results
27712842 // in a lot of complexity due to boostrap and firstboot where the service isn't easily available, so for now we are going
27722843 // to extract them to disk like we did previously.
2844+
2845+ // Report ImagePulledFromRegistry condition as unknown (pulling)
2846+ if imageModeStatusReportingEnabled {
2847+ err := upgrademonitor .GenerateAndApplyMachineConfigNodes (
2848+ & upgrademonitor.Condition {State : mcfgv1 .MachineConfigNodeImagePulledFromRegistry , Reason : string (mcfgv1 .MachineConfigNodeImagePulledFromRegistry ), Message : fmt .Sprintf ("Pulling extensions image %s from registry" , newConfig .Spec .BaseOSExtensionsContainerImage )},
2849+ nil ,
2850+ metav1 .ConditionUnknown ,
2851+ metav1 .ConditionFalse ,
2852+ dn .node ,
2853+ dn .mcfgClient ,
2854+ dn .fgHandler ,
2855+ pool ,
2856+ )
2857+ if err != nil {
2858+ klog .Errorf ("Error setting ImagePulledFromRegistry condition to unknown: %v" , err )
2859+ }
2860+ }
2861+
27732862 if osExtensionsContentDir , err = ExtractExtensionsImage (newConfig .Spec .BaseOSExtensionsContainerImage ); err != nil {
2863+ // Report ImagePulledFromRegistry condition as false (failed)
2864+ if imageModeStatusReportingEnabled {
2865+ err := upgrademonitor .GenerateAndApplyMachineConfigNodes (
2866+ & upgrademonitor.Condition {State : mcfgv1 .MachineConfigNodeImagePulledFromRegistry , Reason : string (mcfgv1 .MachineConfigNodeImagePulledFromRegistry ), Message : fmt .Sprintf ("Failed to pull extensions image %s from registry: %v" , newConfig .Spec .BaseOSExtensionsContainerImage , err )},
2867+ nil ,
2868+ metav1 .ConditionFalse ,
2869+ metav1 .ConditionFalse ,
2870+ dn .node ,
2871+ dn .mcfgClient ,
2872+ dn .fgHandler ,
2873+ pool ,
2874+ )
2875+ if err != nil {
2876+ klog .Errorf ("Error setting ImagePulledFromRegistry condition to false: %v" , err )
2877+ }
2878+ }
27742879 return err
27752880 }
2881+
2882+ // Report ImagePulledFromRegistry condition as true (success)
2883+ if imageModeStatusReportingEnabled {
2884+ err := upgrademonitor .GenerateAndApplyMachineConfigNodes (
2885+ & upgrademonitor.Condition {State : mcfgv1 .MachineConfigNodeImagePulledFromRegistry , Reason : string (mcfgv1 .MachineConfigNodeImagePulledFromRegistry ), Message : fmt .Sprintf ("Successfully pulled extensions image %s from registry" , newConfig .Spec .BaseOSExtensionsContainerImage )},
2886+ nil ,
2887+ metav1 .ConditionTrue ,
2888+ metav1 .ConditionFalse ,
2889+ dn .node ,
2890+ dn .mcfgClient ,
2891+ dn .fgHandler ,
2892+ pool ,
2893+ )
2894+ if err != nil {
2895+ klog .Errorf ("Error setting ImagePulledFromRegistry condition to true: %v" , err )
2896+ }
2897+ }
2898+
27762899 // Delete extracted OS image once we are done.
27772900 defer os .RemoveAll (osExtensionsContentDir )
27782901
0 commit comments