Skip to content

Commit

Permalink
Merge pull request #4334 from rphillips/add_fleet_evaluation_support_…
Browse files Browse the repository at this point in the history
…4.15

OCPBUGS-32922: [release-4.15] add cluster fleet evaluation support to mco
  • Loading branch information
openshift-merge-bot[bot] committed Apr 30, 2024
2 parents b72184f + 8fe1f69 commit 1b35c4e
Show file tree
Hide file tree
Showing 9 changed files with 209 additions and 47 deletions.
3 changes: 3 additions & 0 deletions cmd/machine-config-operator/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ func runStartCmd(_ *cobra.Command, _ []string) {
ctrlctx.ConfigInformerFactory.Config().V1().ClusterOperators(),
ctrlctx.NamespacedInformerFactory.Machineconfiguration().V1alpha1().MachineConfigNodes(),
ctrlctx.FeatureGateAccess,
ctrlctx.InformerFactory.Machineconfiguration().V1().KubeletConfigs(),
ctrlctx.InformerFactory.Machineconfiguration().V1().ContainerRuntimeConfigs(),
ctrlctx.ConfigInformerFactory.Config().V1().Nodes(),
)

ctrlctx.InformerFactory.Start(ctrlctx.Stop)
Expand Down
6 changes: 3 additions & 3 deletions pkg/controller/kubelet-config/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ func validateUserKubeletConfig(cfg *mcfgv1.KubeletConfig) error {
if cfg.Spec.KubeletConfig == nil || cfg.Spec.KubeletConfig.Raw == nil {
return nil
}
kcDecoded, err := decodeKubeletConfig(cfg.Spec.KubeletConfig.Raw)
kcDecoded, err := DecodeKubeletConfig(cfg.Spec.KubeletConfig.Raw)
if err != nil {
return fmt.Errorf("KubeletConfig could not be unmarshalled, err: %w", err)
}
Expand Down Expand Up @@ -436,7 +436,7 @@ func wrapErrorWithCondition(err error, args ...interface{}) mcfgv1.KubeletConfig
return *condition
}

func decodeKubeletConfig(data []byte) (*kubeletconfigv1beta1.KubeletConfiguration, error) {
func DecodeKubeletConfig(data []byte) (*kubeletconfigv1beta1.KubeletConfiguration, error) {
config := &kubeletconfigv1beta1.KubeletConfiguration{}
d := yaml.NewYAMLOrJSONDecoder(bytes.NewReader(data), len(data))
if err := d.Decode(config); err != nil {
Expand Down Expand Up @@ -488,7 +488,7 @@ func generateKubeletIgnFiles(kubeletConfig *mcfgv1.KubeletConfig, originalKubeCo
userDefinedSystemReserved := make(map[string]string)

if kubeletConfig.Spec.KubeletConfig != nil && kubeletConfig.Spec.KubeletConfig.Raw != nil {
specKubeletConfig, err := decodeKubeletConfig(kubeletConfig.Spec.KubeletConfig.Raw)
specKubeletConfig, err := DecodeKubeletConfig(kubeletConfig.Spec.KubeletConfig.Raw)
if err != nil {
return nil, nil, nil, fmt.Errorf("could not deserialize the new Kubelet config: %w", err)
}
Expand Down
9 changes: 3 additions & 6 deletions pkg/controller/kubelet-config/kubelet_config_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@ const (
defaultOpenshiftTLSSecurityProfileConfig = "apiserver.v1.config.openshift.io"
)

var (
// controllerKind contains the schema.GroupVersionKind for this controller type.
controllerKind = mcfgv1.SchemeGroupVersion.WithKind("KubeletConfig")
)
// controllerKind contains the schema.GroupVersionKind for this controller type.
var controllerKind = mcfgv1.SchemeGroupVersion.WithKind("KubeletConfig")

var updateBackoff = wait.Backoff{
Steps: 5,
Expand Down Expand Up @@ -205,7 +203,6 @@ func (ctrl *Controller) Run(workers int, stopCh <-chan struct{}) {

for i := 0; i < workers; i++ {
go wait.Until(ctrl.nodeConfigWorker, time.Second, stopCh)

}

<-stopCh
Expand Down Expand Up @@ -372,7 +369,7 @@ func generateOriginalKubeletConfigWithFeatureGates(cc *mcfgv1.ControllerConfig,
if err != nil {
return nil, fmt.Errorf("could not decode the original Kubelet source string: %w", err)
}
originalKubeConfig, err := decodeKubeletConfig(contents)
originalKubeConfig, err := DecodeKubeletConfig(contents)
if err != nil {
return nil, fmt.Errorf("could not deserialize the Kubelet source: %w", err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,7 @@ import (
"github.com/openshift/machine-config-operator/test/helpers"
)

var (
alwaysReady = func() bool { return true }
)
var alwaysReady = func() bool { return true }

const (
templateDir = "../../../templates"
Expand Down Expand Up @@ -632,7 +630,7 @@ func TestKubeletConfigUpdates(t *testing.T) {

// Modify config
kcUpdate := kc1.DeepCopy()
kcDecoded, err := decodeKubeletConfig(kcUpdate.Spec.KubeletConfig.Raw)
kcDecoded, err := DecodeKubeletConfig(kcUpdate.Spec.KubeletConfig.Raw)
if err != nil {
t.Errorf("KubeletConfig could not be unmarshalled")
}
Expand Down
8 changes: 3 additions & 5 deletions pkg/controller/kubelet-config/kubelet_config_features_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ func TestFeatureGateDrift(t *testing.T) {
}
contents, err := ctrlcommon.DecodeIgnitionFileContents(kubeletConfig.Contents.Source, kubeletConfig.Contents.Compression)
require.NoError(t, err)
originalKubeConfig, err := decodeKubeletConfig(contents)
originalKubeConfig, err := DecodeKubeletConfig(contents)
require.NoError(t, err)

defaultFeatureGates, err := generateFeatureMap(fgAccess)
if err != nil {
t.Errorf("could not generate defaultFeatureGates: %v", err)
}
if !reflect.DeepEqual(originalKubeConfig.FeatureGates, *defaultFeatureGates) {
var found = map[string]bool{}
found := map[string]bool{}
for featureGate := range originalKubeConfig.FeatureGates {
for apiGate := range *defaultFeatureGates {
if featureGate == apiGate {
Expand Down Expand Up @@ -168,7 +168,6 @@ func TestFeaturesCustomNoUpgrade(t *testing.T) {
func TestBootstrapFeaturesDefault(t *testing.T) {
for _, platform := range []configv1.PlatformType{configv1.AWSPlatformType, configv1.NonePlatformType, "unrecognized"} {
t.Run(string(platform), func(t *testing.T) {

cc := newControllerConfig(ctrlcommon.ControllerConfigName, platform)
mcp := helpers.NewMachineConfigPool("master", nil, helpers.MasterSelector, "v0")
mcp2 := helpers.NewMachineConfigPool("worker", nil, helpers.WorkerSelector, "v0")
Expand All @@ -190,7 +189,6 @@ func TestBootstrapFeaturesDefault(t *testing.T) {
func TestBootstrapFeaturesCustomNoUpgrade(t *testing.T) {
for _, platform := range []configv1.PlatformType{configv1.AWSPlatformType, configv1.NonePlatformType, "unrecognized"} {
t.Run(string(platform), func(t *testing.T) {

cc := newControllerConfig(ctrlcommon.ControllerConfigName, platform)
mcp := helpers.NewMachineConfigPool("master", nil, helpers.MasterSelector, "v0")
mcp2 := helpers.NewMachineConfigPool("worker", nil, helpers.WorkerSelector, "v0")
Expand All @@ -212,7 +210,7 @@ func TestBootstrapFeaturesCustomNoUpgrade(t *testing.T) {
conf, err := ctrlcommon.DecodeIgnitionFileContents(regfile.Contents.Source, regfile.Contents.Compression)
require.NoError(t, err)

originalKubeConfig, err := decodeKubeletConfig(conf)
originalKubeConfig, err := DecodeKubeletConfig(conf)
require.NoError(t, err)

fgAccess := createNewDefaultFeatureGateAccess()
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/kubelet-config/kubelet_config_nodes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func TestOriginalKubeletConfigDefaultNodeConfig(t *testing.T) {
}
contents, err := ctrlcommon.DecodeIgnitionFileContents(kubeletConfig.Contents.Source, kubeletConfig.Contents.Compression)
require.NoError(t, err)
originalKubeConfig, err := decodeKubeletConfig(contents)
originalKubeConfig, err := DecodeKubeletConfig(contents)
require.NoError(t, err)

if reflect.DeepEqual(originalKubeConfig.NodeStatusReportFrequency, metav1.Duration{osev1.DefaultNodeStatusUpdateFrequency}) {
Expand Down
72 changes: 48 additions & 24 deletions pkg/operator/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,27 +80,30 @@ type Operator struct {

syncHandler func(ic string) error

mcNodeLister mcfglistersalphav1.MachineConfigNodeLister
imgLister configlistersv1.ImageLister
crdLister apiextlistersv1.CustomResourceDefinitionLister
mcpLister mcfglistersv1.MachineConfigPoolLister
msLister mcfglistersalphav1.MachineConfigNodeLister
ccLister mcfglistersv1.ControllerConfigLister
mcLister mcfglistersv1.MachineConfigLister
deployLister appslisterv1.DeploymentLister
daemonsetLister appslisterv1.DaemonSetLister
infraLister configlistersv1.InfrastructureLister
networkLister configlistersv1.NetworkLister
mcoCmLister corelisterv1.ConfigMapLister
clusterCmLister corelisterv1.ConfigMapLister
proxyLister configlistersv1.ProxyLister
oseKubeAPILister corelisterv1.ConfigMapLister
nodeLister corelisterv1.NodeLister
dnsLister configlistersv1.DNSLister
mcoSALister corelisterv1.ServiceAccountLister
mcoSecretLister corelisterv1.SecretLister
ocSecretLister corelisterv1.SecretLister
mcoCOLister configlistersv1.ClusterOperatorLister
mcNodeLister mcfglistersalphav1.MachineConfigNodeLister
imgLister configlistersv1.ImageLister
crdLister apiextlistersv1.CustomResourceDefinitionLister
mcpLister mcfglistersv1.MachineConfigPoolLister
msLister mcfglistersalphav1.MachineConfigNodeLister
ccLister mcfglistersv1.ControllerConfigLister
mcLister mcfglistersv1.MachineConfigLister
deployLister appslisterv1.DeploymentLister
daemonsetLister appslisterv1.DaemonSetLister
infraLister configlistersv1.InfrastructureLister
networkLister configlistersv1.NetworkLister
mcoCmLister corelisterv1.ConfigMapLister
clusterCmLister corelisterv1.ConfigMapLister
proxyLister configlistersv1.ProxyLister
oseKubeAPILister corelisterv1.ConfigMapLister
nodeLister corelisterv1.NodeLister
dnsLister configlistersv1.DNSLister
mcoSALister corelisterv1.ServiceAccountLister
mcoSecretLister corelisterv1.SecretLister
ocSecretLister corelisterv1.SecretLister
mcoCOLister configlistersv1.ClusterOperatorLister
mckLister mcfglistersv1.KubeletConfigLister
crcLister mcfglistersv1.ContainerRuntimeConfigLister
nodeClusterLister configlistersv1.NodeLister

mcNodeListerSynced cache.InformerSynced
crdListerSynced cache.InformerSynced
Expand All @@ -126,6 +129,9 @@ type Operator struct {
mcoSecretListerSynced cache.InformerSynced
ocSecretListerSynced cache.InformerSynced
mcoCOListerSynced cache.InformerSynced
mckListerSynced cache.InformerSynced
crcListerSynced cache.InformerSynced
nodeClusterListerSynced cache.InformerSynced

// queue only ever has one item, but it has nice error handling backoff/retry semantics
queue workqueue.RateLimitingInterface
Expand Down Expand Up @@ -169,6 +175,9 @@ func New(
mcoCOInformer configinformersv1.ClusterOperatorInformer,
mcNodeInformer mcfginformersalphav1.MachineConfigNodeInformer,
fgAccess featuregates.FeatureGateAccess,
mckInformer mcfginformersv1.KubeletConfigInformer,
crcInformer mcfginformersv1.ContainerRuntimeConfigInformer,
nodeClusterInformer configinformersv1.NodeInformer,
) *Operator {
eventBroadcaster := record.NewBroadcaster()
eventBroadcaster.StartLogging(klog.Infof)
Expand Down Expand Up @@ -227,6 +236,9 @@ func New(
ocSecretInformer.Informer(),
mcoCOInformer.Informer(),
mcNodeInformer.Informer(),
mckInformer.Informer(),
crcInformer.Informer(),
nodeClusterInformer.Informer(),
} {
i.AddEventHandler(optr.eventHandler())
}
Expand All @@ -249,6 +261,8 @@ func New(
optr.oseKubeAPIListerSynced = oseKubeAPIInformer.Informer().HasSynced
optr.nodeLister = nodeInformer.Lister()
optr.nodeListerSynced = nodeInformer.Informer().HasSynced
optr.nodeClusterLister = nodeClusterInformer.Lister()
optr.nodeClusterListerSynced = nodeClusterInformer.Informer().HasSynced

optr.mcNodeListerSynced = mcInformer.Informer().HasSynced
optr.imgListerSynced = imgInformer.Informer().HasSynced
Expand Down Expand Up @@ -278,6 +292,10 @@ func New(
optr.ocSecretListerSynced = ocSecretInformer.Informer().HasSynced
optr.mcoCOLister = mcoCOInformer.Lister()
optr.mcoCOListerSynced = mcoCOInformer.Informer().HasSynced
optr.mckLister = mckInformer.Lister()
optr.mckListerSynced = mckInformer.Informer().HasSynced
optr.crcLister = crcInformer.Lister()
optr.crcListerSynced = crcInformer.Informer().HasSynced

optr.vStore.Set("operator", version.ReleaseVersion)

Expand All @@ -300,7 +318,8 @@ func (optr *Operator) Run(workers int, stopCh <-chan struct{}) {
}
}

cacheSynced := []cache.InformerSynced{optr.crdListerSynced,
cacheSynced := []cache.InformerSynced{
optr.crdListerSynced,
optr.deployListerSynced,
optr.daemonsetListerSynced,
optr.infraListerSynced,
Expand All @@ -321,13 +340,18 @@ func (optr *Operator) Run(workers int, stopCh <-chan struct{}) {
optr.mcoSAListerSynced,
optr.mcoSecretListerSynced,
optr.ocSecretListerSynced,
optr.mcoCOListerSynced}
optr.mcoCOListerSynced,
optr.mckListerSynced,
optr.crcListerSynced,
optr.nodeClusterListerSynced,
}
fg, err := optr.fgAccessor.CurrentFeatureGates()
if err != nil {
klog.Errorf("No fg enabled %w", err)
} else if fg.Enabled(v1.FeatureGateMachineConfigNodes) {
cacheSynced = append(cacheSynced, optr.mcNodeListerSynced)
}

if !cache.WaitForCacheSync(stopCh,
cacheSynced...) {
klog.Error("failed to sync caches")
Expand Down Expand Up @@ -425,7 +449,7 @@ func (optr *Operator) sync(key string) error {

// syncFuncs is the list of sync functions that are executed in order.
// any error marks sync as failure.
var syncFuncs = []syncFunc{
syncFuncs := []syncFunc{
// "RenderConfig" must always run first as it sets the renderConfig in the operator
// for the sync funcs below
{"RenderConfig", optr.syncRenderConfig},
Expand Down

0 comments on commit 1b35c4e

Please sign in to comment.