Skip to content

Commit b9937c1

Browse files
Merge pull request #5282 from isabella-janssen/mco-1713
OCPBUGS-52302: MCO-1713: Update MachineConfigNode resource to include on cluster image mode fields
2 parents b5688e7 + b77f1c9 commit b9937c1

File tree

62 files changed

+2674
-125
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+2674
-125
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ require (
3535
github.com/onsi/gomega v1.36.2
3636
github.com/opencontainers/go-digest v1.0.0
3737
github.com/openshift-eng/openshift-tests-extension v0.0.0-20250722101414-8083129ab8f9
38-
github.com/openshift/api v0.0.0-20250811150514-cc869c87a7f0
39-
github.com/openshift/client-go v0.0.0-20250811163556-6193816ae379
38+
github.com/openshift/api v0.0.0-20250911131931-2acafd4d1ed2
39+
github.com/openshift/client-go v0.0.0-20250911202206-1bc0cb0da03b
4040
github.com/openshift/library-go v0.0.0-20250911074910-e2c18d5abc3a
4141
github.com/openshift/runtime-utils v0.0.0-20230921210328-7bdb5b9c177b
4242
github.com/prometheus/client_golang v1.22.0

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -595,10 +595,10 @@ github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplU
595595
github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U=
596596
github.com/openshift-eng/openshift-tests-extension v0.0.0-20250722101414-8083129ab8f9 h1:4ZeSM80DVCb5WWB3Q/fyCI9jYXAl9bfrGnFvFONqzN4=
597597
github.com/openshift-eng/openshift-tests-extension v0.0.0-20250722101414-8083129ab8f9/go.mod h1:6gkP5f2HL0meusT0Aim8icAspcD1cG055xxBZ9yC68M=
598-
github.com/openshift/api v0.0.0-20250811150514-cc869c87a7f0 h1:K/EiQZE4lBzGMvk7APzYWRuRUJtfwaD5QGRVcny2J1M=
599-
github.com/openshift/api v0.0.0-20250811150514-cc869c87a7f0/go.mod h1:SPLf21TYPipzCO67BURkCfK6dcIIxx0oNRVWaOyRcXM=
600-
github.com/openshift/client-go v0.0.0-20250811163556-6193816ae379 h1:Xr47DBqFVjpLdU4BTtCS5l2XojbRYap2FIPdSj8YYzU=
601-
github.com/openshift/client-go v0.0.0-20250811163556-6193816ae379/go.mod h1:HouQRy4JgvTBpxcyw1YSD/Lp+wjOaUrxjWFHlMtZsk8=
598+
github.com/openshift/api v0.0.0-20250911131931-2acafd4d1ed2 h1:orbYgUTUMs2asHZhT792jeXlVzOqGFaGo8FbD9ihnsE=
599+
github.com/openshift/api v0.0.0-20250911131931-2acafd4d1ed2/go.mod h1:SPLf21TYPipzCO67BURkCfK6dcIIxx0oNRVWaOyRcXM=
600+
github.com/openshift/client-go v0.0.0-20250911202206-1bc0cb0da03b h1:VQpSjWE8jmsPj+EXB+XABTLmDgg9xtT8/fudB/31/aI=
601+
github.com/openshift/client-go v0.0.0-20250911202206-1bc0cb0da03b/go.mod h1:w7sV33ASK/HcuEb0Ll9qvChZdJwNwqo8GocVAnd7fVY=
602602
github.com/openshift/kubernetes v1.30.1-0.20250716113245-b94367cabf3e h1:M5BrUTglTltZjcRz5ouJBqSw0a60p760Bl520ndOGS0=
603603
github.com/openshift/kubernetes v1.30.1-0.20250716113245-b94367cabf3e/go.mod h1:GwUMe2E0Dqe2YN/Nkg9QWNBktqiTR7y+HFxcIWKshXI=
604604
github.com/openshift/kubernetes/staging/src/k8s.io/api v0.0.0-20250716113245-b94367cabf3e h1:Y70IDoOnCCKQT4lIJxx2KkTifLuqD/vjRrzo1DxZ/iw=

pkg/controller/common/layered_node_state.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,19 @@ func (l *LayeredNodeState) CheckNodeCandidacyForUpdate(layered bool, pool *mcfgv
321321

322322
return true
323323
}
324+
325+
// GetDesiredAnnotationsFromMachineOSConfig gets the desired config version and desired image values from the associated MOSC and MOSB
326+
func (l *LayeredNodeState) GetDesiredAnnotationsFromMachineConfigPool(mcp *mcfgv1.MachineConfigPool) (desriedConfig string) {
327+
return mcp.Spec.Configuration.Name
328+
}
329+
330+
// GetDesiredAnnotationsFromMachineOSConfig gets the desired config version and desired image values from the associated MOSC and MOSB
331+
func (l *LayeredNodeState) GetDesiredAnnotationsFromMachineOSConfig(mosc *mcfgv1.MachineOSConfig, mosb *mcfgv1.MachineOSBuild) (desriedConfig, desiredImage string) {
332+
desiredImage = ""
333+
moscs := NewMachineOSConfigState(mosc)
334+
if moscs.HasOSImage() {
335+
desiredImage = moscs.GetOSImage()
336+
}
337+
338+
return mosb.Spec.MachineConfig.Name, desiredImage
339+
}

pkg/controller/node/node_controller.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
helpers "github.com/openshift/machine-config-operator/pkg/helpers"
12+
"github.com/openshift/machine-config-operator/pkg/upgrademonitor"
1213

1314
configv1 "github.com/openshift/api/config/v1"
1415
features "github.com/openshift/api/features"
@@ -1288,14 +1289,19 @@ func (ctrl *Controller) updateCandidateNode(mosc *mcfgv1.MachineOSConfig, mosb *
12881289
}
12891290

12901291
lns := ctrlcommon.NewLayeredNodeState(oldNode)
1292+
desiredConfig := ""
1293+
desiredImage := ""
12911294
if !layered {
12921295
lns.SetDesiredStateFromPool(pool)
1296+
// If pool is not layered, the desired image annotation is removed (see the `delete`
1297+
// call in `SetDesiredStateFromPool`), so only the desired config version must be set.
1298+
desiredConfig = lns.GetDesiredAnnotationsFromMachineConfigPool(pool)
12931299
} else {
12941300
lns.SetDesiredStateFromMachineOSConfig(mosc, mosb)
1301+
desiredConfig, desiredImage = lns.GetDesiredAnnotationsFromMachineOSConfig(mosc, mosb)
12951302
}
12961303

12971304
// Set the desired state to match the pool.
1298-
12991305
newData, err := json.Marshal(lns.Node())
13001306
if err != nil {
13011307
return err
@@ -1306,6 +1312,12 @@ func (ctrl *Controller) updateCandidateNode(mosc *mcfgv1.MachineOSConfig, mosb *
13061312
return nil
13071313
}
13081314

1315+
// Populate the desired config version and image annotations in the node's MCN
1316+
err = upgrademonitor.UpdateMachineConfigNodeSpecDesiredAnnotations(ctrl.fgHandler, ctrl.client, nodeName, desiredConfig, desiredImage)
1317+
if err != nil {
1318+
klog.Errorf("error populating MCN for desired config version and image updates: %v", err)
1319+
}
1320+
13091321
klog.V(4).Infof("Pool %s: layered=%v node %s update is needed", pool.Name, layered, nodeName)
13101322
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, corev1.Node{})
13111323
if err != nil {

pkg/daemon/update.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
27582819
func (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

Comments
 (0)