Skip to content

Commit 4106e8b

Browse files
Merge pull request #371 from theobarberbany/tb/fix-machinesync-watches
OCPBUGS-62325: Updates InfraMachine watch_filters for MachineSync controller
2 parents 4ac330e + f3dc56e commit 4106e8b

File tree

9 files changed

+1154
-924
lines changed

9 files changed

+1154
-924
lines changed

pkg/controllers/machinemigration/suite_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import (
2929
"k8s.io/apimachinery/pkg/api/meta"
3030
"k8s.io/client-go/rest"
3131
"k8s.io/klog/v2"
32-
"k8s.io/klog/v2/textlogger"
3332

33+
ctrl "sigs.k8s.io/controller-runtime"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
3535
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3636
"sigs.k8s.io/controller-runtime/pkg/envtest"
@@ -54,7 +54,8 @@ func TestMachineMigration(t *testing.T) {
5454
var _ = BeforeSuite(func() {
5555
klog.SetOutput(GinkgoWriter)
5656

57-
logf.SetLogger(textlogger.NewLogger(textlogger.NewConfig()))
57+
logf.SetLogger(GinkgoLogr)
58+
ctrl.SetLogger(GinkgoLogr)
5859

5960
By("bootstrapping test environment")
6061
var err error

pkg/controllers/machinesetmigration/suite_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import (
2929
"k8s.io/apimachinery/pkg/api/meta"
3030
"k8s.io/client-go/rest"
3131
"k8s.io/klog/v2"
32-
"k8s.io/klog/v2/textlogger"
3332

33+
ctrl "sigs.k8s.io/controller-runtime"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
3535
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3636
"sigs.k8s.io/controller-runtime/pkg/envtest"
@@ -54,7 +54,8 @@ func TestMachineSetMigration(t *testing.T) {
5454
var _ = BeforeSuite(func() {
5555
klog.SetOutput(GinkgoWriter)
5656

57-
logf.SetLogger(textlogger.NewLogger(textlogger.NewConfig()))
57+
logf.SetLogger(GinkgoLogr)
58+
ctrl.SetLogger(GinkgoLogr)
5859

5960
By("bootstrapping test environment")
6061
var err error

pkg/controllers/machinesetsync/machineset_sync_controller.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ var (
8787

8888
// errMachineAPIMachineSetOwnerReferenceConversionUnsupported.
8989
errMachineAPIMachineSetOwnerReferenceConversionUnsupported = errors.New("could not convert Machine API machine set owner references to Cluster API")
90+
91+
// errInvalidInfraClusterReference is returned when the cluster name is empty in CAPI machineset spec.
92+
errInvalidInfraClusterReference = errors.New("cluster name is empty in Cluster API machine set spec")
93+
94+
// errInvalidInfraMachineTemplateReference is returned when the infrastructure machine template reference is invalid or incomplete.
95+
errInvalidInfraMachineTemplateReference = errors.New("infrastructure machine template reference is invalid or incomplete")
9096
)
9197

9298
const (
@@ -105,6 +111,8 @@ const (
105111
messageSuccessfullySynchronizedMAPItoCAPI = "Successfully synchronized MAPI MachineSet to CAPI"
106112

107113
controllerName string = "MachineSetSyncController"
114+
115+
terminalConfigurationErrorLog string = "Detected terminal configuration error - cluster name or infrastructure machine template reference is empty, not requeuing"
108116
)
109117

110118
// MachineSetSyncReconciler reconciles CAPI and MAPI MachineSets.
@@ -235,6 +243,18 @@ func (r *MachineSetSyncReconciler) fetchCAPIInfraResources(ctx context.Context,
235243
Name: infraMachineTemplateRef.Name,
236244
}
237245

246+
// Validate that required references are not empty to avoid nil pointer issues later.
247+
// These are terminal configuration errors that require user intervention.
248+
if capiMachineSet.Spec.ClusterName == "" {
249+
return nil, nil, fmt.Errorf("machine set %s/%s: %w",
250+
capiMachineSet.Namespace, capiMachineSet.Name, errInvalidInfraClusterReference)
251+
}
252+
253+
if infraMachineTemplateRef.Name == "" || infraMachineTemplateRef.Namespace == "" {
254+
return nil, nil, fmt.Errorf("machine %s/%s: %w",
255+
capiMachineSet.Namespace, capiMachineSet.Name, errInvalidInfraMachineTemplateReference)
256+
}
257+
238258
infraMachineTemplate, infraCluster, err := controllers.InitInfraMachineTemplateAndInfraClusterFromProvider(r.Platform)
239259
if err != nil {
240260
return nil, nil, fmt.Errorf("unable to devise CAPI infra resources: %w", err)
@@ -341,6 +361,12 @@ func (r *MachineSetSyncReconciler) reconcileMAPIMachineSetToCAPIMachineSet(ctx c
341361
restoreCAPIFields(existingCAPIMachineSet, convertedCAPIMachineSet, r.CAPINamespace, authoritativeAPI, clusterOwnerRefence)
342362

343363
if err := r.ensureCAPIInfraMachineTemplate(ctx, sourceMAPIMachineSet, convertedCAPIMachineSet, convertedCAPIInfraMachineTemplate, clusterOwnerRefence); err != nil {
364+
// Don't requeue for terminal configuration errors
365+
if isTerminalConfigurationError(err) {
366+
logger.Error(err, terminalConfigurationErrorLog)
367+
return ctrl.Result{}, nil
368+
}
369+
344370
return ctrl.Result{}, fmt.Errorf("unable to ensure CAPI infra machine template: %w", err)
345371
}
346372

@@ -572,6 +598,14 @@ func (r *MachineSetSyncReconciler) reconcileCAPIMachineSetToMAPIMachineSet(ctx c
572598
if err != nil {
573599
fetchErr := fmt.Errorf("failed to fetch CAPI infra resources: %w", err)
574600

601+
// Don't requeue for terminal configuration errors
602+
if isTerminalConfigurationError(err) {
603+
logger.Error(err, terminalConfigurationErrorLog)
604+
r.Recorder.Event(sourceCAPIMachineSet, corev1.EventTypeWarning, "SynchronizationError", fetchErr.Error())
605+
606+
return ctrl.Result{}, nil
607+
}
608+
575609
if condErr := r.applySynchronizedConditionWithPatch(
576610
ctx, existingMAPIMachineSet, corev1.ConditionFalse, reasonFailedToGetCAPIInfraResources, fetchErr.Error(), nil); condErr != nil {
577611
return ctrl.Result{}, utilerrors.NewAggregate([]error{fetchErr, condErr})
@@ -1532,3 +1566,13 @@ func hasSpecOrMetadataOrProviderSpecChanges(diff map[string]any) bool {
15321566

15331567
return ok1 || ok2 || ok3
15341568
}
1569+
1570+
// isTerminalConfigurationError returns true if the provided error is
1571+
// errInvalidClusterInfraReference or errInvalidInfraMachineTemplateReference.
1572+
func isTerminalConfigurationError(err error) bool {
1573+
if errors.Is(err, errInvalidInfraClusterReference) || errors.Is(err, errInvalidInfraMachineTemplateReference) {
1574+
return true
1575+
}
1576+
1577+
return false
1578+
}

0 commit comments

Comments
 (0)