From ac99fe547b060e52ef268b933174b3c34d1c0374 Mon Sep 17 00:00:00 2001 From: Gianluca Mardente Date: Sat, 20 Dec 2025 14:51:23 +0100 Subject: [PATCH 1/2] (bug) Optmize classifier reconciliations Move some logs from info to debug. This PR also: - advances clusterAPI to v1.12.1 - advances kind to v0.31.0 - advances golangci_lint to v2.7.2 - uses kubernetes v1.35.0 for both management and managed cluster --- Makefile | 6 +- controllers/classifier_controller.go | 15 +- controllers/classifier_deployer.go | 77 ++++----- controllers/classifier_predicates.go | 50 +++++- controllers/classifier_predicates_test.go | 10 +- controllers/cluster_controller.go | 2 +- controllers/sveltoscluster_controller.go | 2 +- go.mod | 4 +- go.sum | 8 +- hack/tools/go.mod | 46 ++--- hack/tools/go.sum | 195 +++++++++------------- hack/tools/tools.go | 1 + pkg/agent/sveltos-applier.go | 2 +- pkg/agent/sveltos-applier.yaml | 2 +- test/clusterapi-workload.yaml | 16 +- test/pullmode-sveltosapplier.yaml | 2 +- 16 files changed, 232 insertions(+), 206 deletions(-) diff --git a/Makefile b/Makefile index dbd9f7e..d20cf03 100644 --- a/Makefile +++ b/Makefile @@ -58,8 +58,8 @@ KIND := $(TOOLS_BIN_DIR)/kind KUBECTL := $(TOOLS_BIN_DIR)/kubectl CLUSTERCTL := $(TOOLS_BIN_DIR)/clusterctl -GOLANGCI_LINT_VERSION := "v2.5.0" -CLUSTERCTL_VERSION := v1.12.0 +GOLANGCI_LINT_VERSION := "v2.7.2" +CLUSTERCTL_VERSION := v1.12.1 KUSTOMIZE_VER := v5.7.0 KUSTOMIZE_BIN := kustomize @@ -169,7 +169,7 @@ endif # K8S_VERSION for the Kind cluster can be set as environment variable. If not defined, # this default value is used ifndef K8S_VERSION -K8S_VERSION := v1.34.0 +K8S_VERSION := v1.35.0 endif KIND_CONFIG ?= kind-cluster.yaml diff --git a/controllers/classifier_controller.go b/controllers/classifier_controller.go index 5601625..3b15833 100644 --- a/controllers/classifier_controller.go +++ b/controllers/classifier_controller.go @@ -141,7 +141,7 @@ func (r *ClassifierReconciler) Reconcile(ctx context.Context, req ctrl.Request) } logger := ctrl.LoggerFrom(ctx) - logger.V(logs.LogInfo).Info("Reconciling") + logger.V(logs.LogDebug).Info("Reconciling") // Fecth the Classifier instance classifier := &libsveltosv1beta1.Classifier{} @@ -197,7 +197,7 @@ func (r *ClassifierReconciler) reconcileDelete( ) (reconcile.Result, error) { logger := classifierScope.Logger - logger.V(logs.LogInfo).Info("Reconciling Classifier delete") + logger.V(logs.LogDebug).Info("Reconciling Classifier delete") err := r.removeAllRegistrations(ctx, classifierScope, logger) if err != nil { @@ -250,7 +250,7 @@ func (r *ClassifierReconciler) reconcileDelete( controllerutil.RemoveFinalizer(classifierScope.Classifier, libsveltosv1beta1.ClassifierFinalizer) } - logger.V(logs.LogInfo).Info("Reconcile delete success") + logger.V(logs.LogDebug).Info("Reconcile delete success") return reconcile.Result{}, nil } @@ -260,7 +260,7 @@ func (r *ClassifierReconciler) reconcileNormal( ) (reconcile.Result, error) { logger := classifierScope.Logger - logger.V(logs.LogInfo).Info("Reconciling Classifier") + logger.V(logs.LogDebug).Info("Reconciling Classifier") if !controllerutil.ContainsFinalizer(classifierScope.Classifier, libsveltosv1beta1.ClassifierFinalizer) { if err := r.addFinalizer(ctx, classifierScope); err != nil { @@ -296,7 +296,7 @@ func (r *ClassifierReconciler) reconcileNormal( return reconcile.Result{Requeue: true, RequeueAfter: normalRequeueAfter}, nil } - logger.V(logs.LogInfo).Info("Reconcile success") + logger.V(logs.LogDebug).Info("Reconcile success") return reconcile.Result{}, nil } @@ -308,7 +308,8 @@ func (r *ClassifierReconciler) SetupWithManager(ctx context.Context, // all Classifier with at least one conflict needs to be reconciled c, err := ctrl.NewControllerManagedBy(mgr). - For(&libsveltosv1beta1.Classifier{}). + For(&libsveltosv1beta1.Classifier{}, builder.WithPredicates( + ClassifierPredicate{Logger: mgr.GetLogger().WithValues("classifierPredicate")})). WithOptions(controller.Options{ MaxConcurrentReconciles: r.ConcurrentReconciles, }). @@ -321,7 +322,7 @@ func (r *ClassifierReconciler) SetupWithManager(ctx context.Context, Watches(&libsveltosv1beta1.Classifier{}, handler.EnqueueRequestsFromMapFunc(r.requeueClassifierForClassifier), builder.WithPredicates( - ClassifierPredicate(mgr.GetLogger().WithValues("predicate", "classifiepredicate")), + OtherClassifierPredicate(mgr.GetLogger().WithValues("predicate", "otherClassifiepredicate")), ), ). Watches(&libsveltosv1beta1.SveltosCluster{}, diff --git a/controllers/classifier_deployer.go b/controllers/classifier_deployer.go index be55b80..c8c1bb9 100644 --- a/controllers/classifier_deployer.go +++ b/controllers/classifier_deployer.go @@ -176,10 +176,10 @@ func (r *ClassifierReconciler) undeployClassifier(ctx context.Context, classifie _, err := clusterproxy.GetCluster(ctx, r.Client, c.Namespace, c.Name, clusterproxy.GetClusterType(c)) if err != nil { if apierrors.IsNotFound(err) { - logger.V(logs.LogInfo).Info(fmt.Sprintf("cluster %s/%s does not exist", c.Namespace, c.Name)) + logger.V(logs.LogDebug).Info(fmt.Sprintf("cluster %s/%s does not exist", c.Namespace, c.Name)) continue } - logger.V(logs.LogInfo).Info("failed to get cluster") + logger.V(logs.LogInfo).Error(err, "failed to get cluster") return err } clusters = append(clusters, c) @@ -243,7 +243,7 @@ func getClassifierAndClusterClient(ctx context.Context, clusterNamespace, cluste } if !classifier.DeletionTimestamp.IsZero() { - logger.V(logs.LogInfo).Info("Classifier is marked for deletion. Nothing to do.") + logger.V(logs.LogDebug).Info("Classifier is marked for deletion. Nothing to do.") // if classifier is marked for deletion, there is nothing to deploy return nil, nil, fmt.Errorf("classifier is marked for deletion") } @@ -255,7 +255,7 @@ func getClassifierAndClusterClient(ctx context.Context, clusterNamespace, cluste } if !cluster.GetDeletionTimestamp().IsZero() { - logger.V(logs.LogInfo).Info("cluster is marked for deletion. Nothing to do.") + logger.V(logs.LogDebug).Info("cluster is marked for deletion. Nothing to do.") // if cluster is marked for deletion, there is nothing to deploy return nil, nil, fmt.Errorf("cluster is marked for deletion") } @@ -653,7 +653,7 @@ func undeployClassifierFromCluster(ctx context.Context, c client.Client, } if !cluster.GetDeletionTimestamp().IsZero() { - logger.V(logs.LogInfo).Info("cluster is marked for deletion. Nothing to do.") + logger.V(logs.LogDebug).Info("cluster is marked for deletion. Nothing to do.") return nil } @@ -682,10 +682,10 @@ func undeployClassifierFromCluster(ctx context.Context, c client.Client, err = remoteClient.Get(ctx, types.NamespacedName{Name: applicant}, currentClassifier) if err != nil { if apierrors.IsNotFound(err) { - logger.V(logs.LogInfo).Info("classifier not found") + logger.V(logs.LogDebug).Info("classifier not found") return nil } - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get classifier. Err: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get classifier") return err } @@ -821,7 +821,7 @@ func (r *ClassifierReconciler) removeClassifier(ctx context.Context, classifierS return err } if paused { - logger.V(logs.LogInfo).Info("cluster is paused. Do nothing.") + logger.V(logs.LogDebug).Info("cluster is paused. Do nothing.") return nil } @@ -878,7 +878,7 @@ func (r *ClassifierReconciler) canProceed(ctx context.Context, classifierScope * } if !ready { - logger.V(logs.LogInfo).Info("Cluster is not ready yet") + logger.V(logs.LogDebug).Info("Cluster is not ready yet") return false, nil } @@ -1004,7 +1004,7 @@ func (r *ClassifierReconciler) proceedProcessingClassifier(ctx context.Context, var result deployer.Result if isConfigSame { - logger.V(logs.LogInfo).Info("classifier and kubeconfig have not changed") + logger.V(logs.LogDebug).Info("classifier and kubeconfig have not changed") result = r.Deployer.GetResult(ctx, cluster.Namespace, cluster.Name, classifier.Name, f.id, clusterproxy.GetClusterType(cluster), false) deployerStatus = r.convertResultStatus(result) @@ -1036,11 +1036,11 @@ func (r *ClassifierReconciler) proceedProcessingClassifier(ctx context.Context, return clusterInfo, fmt.Errorf("classifier is still being provisioned") } } else if isConfigSame && currentStatus != nil && *currentStatus == libsveltosv1beta1.SveltosStatusProvisioned { - logger.V(logs.LogInfo).Info("already deployed") + logger.V(logs.LogDebug).Info("already deployed") s := libsveltosv1beta1.SveltosStatusProvisioned deployerStatus = &s } else { - logger.V(logs.LogInfo).Info("no result is available. queue job and mark status as provisioning") + logger.V(logs.LogDebug).Info("no result is available. queue job and mark status as provisioning") s := libsveltosv1beta1.SveltosStatusProvisioning deployerStatus = &s @@ -1190,8 +1190,7 @@ func deployCRDInPullMode(ctx context.Context, clusterNamespace, clusterName, cla err := pullmode.StageResourcesForDeployment(ctx, getManagementClusterClient(), clusterNamespace, clusterName, libsveltosv1beta1.ClassifierKind, classifierName, libsveltosv1beta1.FeatureClassifier, resources, true, logger) if err != nil { - logger.V(logs.LogInfo).Info( - fmt.Sprintf("failed to stage DebuggingConfiguration CRD: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to stage DebuggingConfiguration CRD") return err } return nil @@ -1209,7 +1208,7 @@ func applyCRD(ctx context.Context, clusterNamespace, clusterName string, u *unst dr, err := k8s_utils.GetDynamicResourceInterface(remoteRestConfig, u.GroupVersionKind(), "") if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get dynamic client: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get dynamic client") return err } @@ -1219,7 +1218,7 @@ func applyCRD(ctx context.Context, clusterNamespace, clusterName string, u *unst } _, err = dr.Apply(ctx, u.GetName(), u, options) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to apply Classifier CRD: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to apply Classifier CRD") return err } @@ -1232,7 +1231,7 @@ func deployClassifierCRD(ctx context.Context, clusterNamespace, clusterName, cla classifierCRD, err := k8s_utils.GetUnstructured(crd.GetClassifierCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get Classifier CRD unstructured: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get Classifier CRD unstructured") return err } @@ -1249,8 +1248,7 @@ func deployClassifierReportCRD(ctx context.Context, clusterNamespace, clusterNam classifierReportCRD, err := k8s_utils.GetUnstructured(crd.GetClassifierReportCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get ClassifierReport CRD unstructured: %v", - err)) + logger.V(logs.LogInfo).Error(err, "failed to get ClassifierReport CRD unstructured") return err } @@ -1267,7 +1265,7 @@ func deployHealthCheckCRD(ctx context.Context, clusterNamespace, clusterName, cl healthCheckCRD, err := k8s_utils.GetUnstructured(crd.GetHealthCheckCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get HealthCheck CRD unstructured: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get HealthCheck CRD unstructured") return err } @@ -1284,8 +1282,7 @@ func deployHealthCheckReportCRD(ctx context.Context, clusterNamespace, clusterNa healthCheckReportCRD, err := k8s_utils.GetUnstructured(crd.GetHealthCheckReportCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get healthCheckReport CRD unstructured: %v", - err)) + logger.V(logs.LogInfo).Error(err, "failed to get healthCheckReport CRD unstructured") return err } @@ -1302,7 +1299,7 @@ func deployEventSourceCRD(ctx context.Context, clusterNamespace, clusterName, cl eventSourceCRD, err := k8s_utils.GetUnstructured(crd.GetEventSourceCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get eventSourceCRD CRD unstructured: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get eventSourceCRD CRD unstructured") return err } @@ -1319,8 +1316,7 @@ func deployEventReportCRD(ctx context.Context, clusterNamespace, clusterName, cl eventReportCRD, err := k8s_utils.GetUnstructured(crd.GetEventReportCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get eventReportCRD CRD unstructured: %v", - err)) + logger.V(logs.LogInfo).Error(err, "failed to get eventReportCRD CRD unstructured") return err } @@ -1392,8 +1388,7 @@ func deployDebuggingConfigurationCRD(ctx context.Context, clusterNamespace, clus dcCRD, err := k8s_utils.GetUnstructured(crd.GetDebuggingConfigurationCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get DebuggingConfiguration CRD unstructured: %v", - err)) + logger.V(logs.LogInfo).Error(err, "failed to get DebuggingConfiguration CRD unstructured") return err } @@ -1410,7 +1405,7 @@ func deployReloaderCRD(ctx context.Context, clusterNamespace, clusterName, class // Deploy Reloader CRD reloaderCRD, err := k8s_utils.GetUnstructured(crd.GetReloaderCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get Reloader CRD unstructured: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get Reloader CRD unstructured") return err } @@ -1427,8 +1422,7 @@ func deployReloaderReportCRD(ctx context.Context, clusterNamespace, clusterName, // Deploy Reloader CRD reloaderReportCRD, err := k8s_utils.GetUnstructured(crd.GetReloaderReportCRDYAML()) if err != nil { - logger.V(logs.LogInfo).Info( - fmt.Sprintf("failed to get ReloaderReport CRD unstructured: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get ReloaderReport CRD unstructured") return err } @@ -1599,8 +1593,7 @@ func deploySveltosAgentInManagementCluster(ctx context.Context, restConfig *rest lbls := getSveltosAgentLabels(clusterNamespace, clusterName, clusterType) name, err := getSveltosAgentDeploymentName(ctx, restConfig, clusterNamespace, clusterName, clusterType, lbls) if err != nil { - logger.V(logs.LogInfo).Info( - fmt.Sprintf("failed to get name for sveltos-agent deployment: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get name for sveltos-agent deployment") return err } @@ -1624,7 +1617,7 @@ func deploySveltosAgentResources(ctx context.Context, clusterNamespace, clusterN for i := range elements { policy, err := k8s_utils.GetUnstructured([]byte(elements[i])) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to parse sveltos agent yaml: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to parse sveltos agent yaml") return err } @@ -1642,7 +1635,7 @@ func deploySveltosAgentResources(ctx context.Context, clusterNamespace, clusterN if policy.GetKind() == "Deployment" { policy, err = addTemplateSpecLabels(policy, lbls) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to set deployment spec.template.labels: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to set deployment spec.template.labels") return err } } @@ -1656,7 +1649,7 @@ func deploySveltosAgentResources(ctx context.Context, clusterNamespace, clusterN []*unstructured.Unstructured{policy}, ) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to patch sveltos-agent: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to patch sveltos-agent") return err } } else { @@ -1699,7 +1692,7 @@ func deploySveltosApplierResources(ctx context.Context, clusterNamespace, cluste for i := range elements { policy, err := k8s_utils.GetUnstructured([]byte(elements[i])) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to parse sveltos applier yaml: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to parse sveltos applier yaml") return err } @@ -1711,7 +1704,7 @@ func deploySveltosApplierResources(ctx context.Context, clusterNamespace, cluste []*unstructured.Unstructured{policy}, ) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to patch sveltos-applier: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to patch sveltos-applier") return err } } else { @@ -1732,7 +1725,7 @@ func deploySveltosAgentPatchedResources(ctx context.Context, restConfig *rest.Co policy := referencedUnstructured[i] dr, err := k8s_utils.GetDynamicResourceInterface(restConfig, policy.GroupVersionKind(), policy.GetNamespace()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get dynamic client: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get dynamic client") return err } @@ -1850,8 +1843,8 @@ func removeSveltosAgentFromManagementCluster(ctx context.Context, name, err := getSveltosAgentDeploymentName(ctx, getManagementClusterConfig(), clusterNamespace, clusterName, clusterType, lbls) if err != nil { - logger.V(logs.LogInfo).Info( - fmt.Sprintf("failed to get name for sveltos-agent deployment name: %v", err)) + logger.V(logs.LogInfo).Error(err, + "failed to get name for sveltos-agent deployment name") return err } @@ -1864,13 +1857,13 @@ func removeSveltosAgentFromManagementCluster(ctx context.Context, for i := range elements { policy, err := k8s_utils.GetUnstructured([]byte(elements[i])) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to parse sveltos-agent yaml: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to parse sveltos-agent yaml") return err } dr, err := k8s_utils.GetDynamicResourceInterface(restConfig, policy.GroupVersionKind(), policy.GetNamespace()) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get dynamic client: %v", err)) + logger.V(logs.LogInfo).Error(err, "failed to get dynamic client") return err } diff --git a/controllers/classifier_predicates.go b/controllers/classifier_predicates.go index 1771522..98982bd 100644 --- a/controllers/classifier_predicates.go +++ b/controllers/classifier_predicates.go @@ -28,6 +28,52 @@ import ( logs "github.com/projectsveltos/libsveltos/lib/logsettings" ) +// ClassifierPredicate is a custom predicate that filters ClusterSummary s events +type ClassifierPredicate struct { + Logger logr.Logger +} + +func (p ClassifierPredicate) Create(e event.CreateEvent) bool { + // Always reconcile on creation + return true +} + +func (p ClassifierPredicate) Update(e event.UpdateEvent) bool { + newClassifier := e.ObjectNew.(*libsveltosv1beta1.Classifier) + oldClassifier := e.ObjectOld.(*libsveltosv1beta1.Classifier) + log := p.Logger.WithValues("predicate", "updateClassifier", + "classifier", newClassifier.Name, + ) + + if oldClassifier == nil { + log.V(logs.LogVerbose).Info("Old Classifier is nil. Reconcile Classifier.") + return true + } + + if !reflect.DeepEqual(oldClassifier.DeletionTimestamp, newClassifier.DeletionTimestamp) { + return true + } + + if !reflect.DeepEqual(oldClassifier.Spec, newClassifier.Spec) { + log.V(logs.LogVerbose).Info( + "ClusterSummary Spec changed. Will attempt to reconcile ClusterSummary.", + ) + return true + } + + return false +} + +func (p ClassifierPredicate) Delete(e event.DeleteEvent) bool { + // Always reconcile on deletion + return true +} + +func (p ClassifierPredicate) Generic(e event.GenericEvent) bool { + // Ignore generic + return false +} + // SecretPredicates predicates for Secret. ClassifierReconciler watches Secret events // and react to those by reconciling itself based on following predicates func SecretPredicates(logger logr.Logger) predicate.Funcs { @@ -251,9 +297,9 @@ func ClassifierReportPredicate(logger logr.Logger) predicate.Funcs { } } -// ClassifierPredicate predicates for Classifier. ClassifierReconciler watches Classifier events +// OtherClassifierPredicate predicates for Classifier. ClassifierReconciler watches Classifier events // and react to those by reconciling itself based on following predicates -func ClassifierPredicate(logger logr.Logger) predicate.Funcs { +func OtherClassifierPredicate(logger logr.Logger) predicate.Funcs { return predicate.Funcs{ UpdateFunc: func(e event.UpdateEvent) bool { newClassifer := e.ObjectNew.(*libsveltosv1beta1.Classifier) diff --git a/controllers/classifier_predicates_test.go b/controllers/classifier_predicates_test.go index 76aacf6..52be0ea 100644 --- a/controllers/classifier_predicates_test.go +++ b/controllers/classifier_predicates_test.go @@ -357,7 +357,7 @@ var _ = Describe("Classifier Predicates: ClassifierReportPredicate", func() { }) }) -var _ = Describe("Classifier Predicates: ClassifierPredicate", func() { +var _ = Describe("Classifier Predicates: OtherClassifierPredicate", func() { var logger logr.Logger var classifier *libsveltosv1beta1.Classifier @@ -371,7 +371,7 @@ var _ = Describe("Classifier Predicates: ClassifierPredicate", func() { }) It("Create does not reprocesses", func() { - classifierPredicate := controllers.ClassifierPredicate(logger) + classifierPredicate := controllers.OtherClassifierPredicate(logger) e := event.CreateEvent{ Object: classifier, @@ -381,7 +381,7 @@ var _ = Describe("Classifier Predicates: ClassifierPredicate", func() { Expect(result).To(BeFalse()) }) It("Delete does reprocess ", func() { - classifierPredicate := controllers.ClassifierPredicate(logger) + classifierPredicate := controllers.OtherClassifierPredicate(logger) e := event.DeleteEvent{ Object: classifier, @@ -391,7 +391,7 @@ var _ = Describe("Classifier Predicates: ClassifierPredicate", func() { Expect(result).To(BeTrue()) }) It("Update reprocesses when Status.MatchinClusterStatuses changes", func() { - classifierPredicate := controllers.ClassifierPredicate(logger) + classifierPredicate := controllers.OtherClassifierPredicate(logger) classifier.Status.MachingClusterStatuses = []libsveltosv1beta1.MachingClusterStatus{ { @@ -416,7 +416,7 @@ var _ = Describe("Classifier Predicates: ClassifierPredicate", func() { Expect(result).To(BeTrue()) }) It("Update does not reprocess when Status.MatchinClusterStatuses does not change", func() { - classifierPredicate := controllers.ClassifierPredicate(logger) + classifierPredicate := controllers.OtherClassifierPredicate(logger) classifier.Status.MachingClusterStatuses = []libsveltosv1beta1.MachingClusterStatus{ { diff --git a/controllers/cluster_controller.go b/controllers/cluster_controller.go index 2cdab0b..42d03ee 100644 --- a/controllers/cluster_controller.go +++ b/controllers/cluster_controller.go @@ -42,7 +42,7 @@ type ClusterReconciler struct { func (r *ClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := ctrl.LoggerFrom(ctx) - logger.V(logs.LogInfo).Info("Reconciling Cluster") + logger.V(logs.LogDebug).Info("Reconciling Cluster") // Fecth the Cluster instance cluster := &clusterv1.Cluster{} diff --git a/controllers/sveltoscluster_controller.go b/controllers/sveltoscluster_controller.go index aa77f67..6536ca6 100644 --- a/controllers/sveltoscluster_controller.go +++ b/controllers/sveltoscluster_controller.go @@ -43,7 +43,7 @@ type SveltosClusterReconciler struct { func (r *SveltosClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := ctrl.LoggerFrom(ctx) - logger.V(logs.LogInfo).Info("Reconciling SveltosCluster") + logger.V(logs.LogDebug).Info("Reconciling SveltosCluster") // Fecth the SveltosCluster instance sveltosCluster := &libsveltosv1beta1.SveltosCluster{} diff --git a/go.mod b/go.mod index f230b17..0d3a8c8 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/onsi/ginkgo/v2 v2.27.3 github.com/onsi/gomega v1.38.3 github.com/pkg/errors v0.9.1 - github.com/projectsveltos/libsveltos v1.3.0 + github.com/projectsveltos/libsveltos v1.3.1 github.com/prometheus/client_golang v1.23.2 github.com/spf13/pflag v1.0.10 golang.org/x/text v0.32.0 @@ -20,7 +20,7 @@ require ( k8s.io/component-base v0.34.3 k8s.io/klog/v2 v2.130.1 k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 - sigs.k8s.io/cluster-api v1.12.0 + sigs.k8s.io/cluster-api v1.12.1 sigs.k8s.io/controller-runtime v0.22.4 sigs.k8s.io/yaml v1.6.0 ) diff --git a/go.sum b/go.sum index 295aeb4..2d44569 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/projectsveltos/libsveltos v1.3.0 h1:m0AEG+HqTSkl93Wa9rizedH6nqTwUbrCeBdz4VGloNc= -github.com/projectsveltos/libsveltos v1.3.0/go.mod h1:At1G0itHPdELlMuQh+v2rLtA/Kji9xMV8K1k0l/sQ1Q= +github.com/projectsveltos/libsveltos v1.3.1 h1:uUQ7YRwhWnxxBUjBmf6WJprwSsHJDJAPyHkUmQ+DyXI= +github.com/projectsveltos/libsveltos v1.3.1/go.mod h1:At1G0itHPdELlMuQh+v2rLtA/Kji9xMV8K1k0l/sQ1Q= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= @@ -318,8 +318,8 @@ k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzk k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/cluster-api v1.12.0 h1:iFOz8b0LdrMJS5Df1Eb7wyvTkWqlTUM2LHFEHCeI6vA= -sigs.k8s.io/cluster-api v1.12.0/go.mod h1:+S6WJdi8UPdqv5q9nka5al3ed/Qa0zAcSBgzTaa9VKA= +sigs.k8s.io/cluster-api v1.12.1 h1:s3DivSZjXdu2HPyOtV/n6XwSZBaIycZdKNs4y8X+3lY= +sigs.k8s.io/cluster-api v1.12.1/go.mod h1:+S6WJdi8UPdqv5q9nka5al3ed/Qa0zAcSBgzTaa9VKA= sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A= sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= diff --git a/hack/tools/go.mod b/hack/tools/go.mod index 5a24349..92fb7c5 100644 --- a/hack/tools/go.mod +++ b/hack/tools/go.mod @@ -6,9 +6,10 @@ require ( github.com/a8m/envsubst v1.4.3 github.com/onsi/ginkgo/v2 v2.27.3 golang.org/x/oauth2 v0.34.0 - k8s.io/client-go v0.34.3 - sigs.k8s.io/controller-tools v0.19.0 - sigs.k8s.io/kind v0.30.0 + golang.org/x/tools v0.40.0 + k8s.io/client-go v0.35.0 + sigs.k8s.io/controller-tools v0.20.0 + sigs.k8s.io/kind v0.31.0 ) require ( @@ -26,7 +27,6 @@ require ( github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/google/gnostic-models v0.7.0 // indirect github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -40,32 +40,32 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/spf13/cobra v1.9.1 // indirect - github.com/spf13/pflag v1.0.7 // indirect + github.com/spf13/cobra v1.10.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/x448/float16 v0.8.4 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect + golang.org/x/term v0.38.0 // indirect + golang.org/x/text v0.32.0 // indirect golang.org/x/time v0.9.0 // indirect - golang.org/x/tools v0.36.0 // indirect - google.golang.org/protobuf v1.36.7 // indirect + google.golang.org/protobuf v1.36.8 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.34.3 // indirect - k8s.io/apiextensions-apiserver v0.34.0 // indirect - k8s.io/apimachinery v0.34.3 // indirect - k8s.io/code-generator v0.34.0 // indirect - k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect + k8s.io/api v0.35.0 // indirect + k8s.io/apiextensions-apiserver v0.35.0 // indirect + k8s.io/apimachinery v0.35.0 // indirect + k8s.io/code-generator v0.35.0 // indirect + k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect - k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect diff --git a/hack/tools/go.sum b/hack/tools/go.sum index 3e23572..dd775ee 100644 --- a/hack/tools/go.sum +++ b/hack/tools/go.sum @@ -62,8 +62,6 @@ github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4 github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= @@ -87,8 +85,6 @@ github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -121,30 +117,30 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.27.3 h1:ICsZJ8JoYafeXFFlFAG75a7CxMsJHwgKwtO+82SE9L8= github.com/onsi/ginkgo/v2 v2.27.3/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= -github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= -github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= +github.com/onsi/gomega v1.38.3 h1:eTX+W6dobAYfFeGC2PV6RwXRu/MyT+cQguijutvkpSM= +github.com/onsi/gomega v1.38.3/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= -github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -156,8 +152,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -168,94 +164,69 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= +golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= -golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= -golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= -google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= +google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -265,36 +236,36 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.34.3 h1:D12sTP257/jSH2vHV2EDYrb16bS7ULlHpdNdNhEw2S4= -k8s.io/api v0.34.3/go.mod h1:PyVQBF886Q5RSQZOim7DybQjAbVs8g7gwJNhGtY5MBk= -k8s.io/apiextensions-apiserver v0.34.0 h1:B3hiB32jV7BcyKcMU5fDaDxk882YrJ1KU+ZSkA9Qxoc= -k8s.io/apiextensions-apiserver v0.34.0/go.mod h1:hLI4GxE1BDBy9adJKxUxCEHBGZtGfIg98Q+JmTD7+g0= -k8s.io/apimachinery v0.34.3 h1:/TB+SFEiQvN9HPldtlWOTp0hWbJ+fjU+wkxysf/aQnE= -k8s.io/apimachinery v0.34.3/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/apiserver v0.34.0 h1:Z51fw1iGMqN7uJ1kEaynf2Aec1Y774PqU+FVWCFV3Jg= -k8s.io/apiserver v0.34.0/go.mod h1:52ti5YhxAvewmmpVRqlASvaqxt0gKJxvCeW7ZrwgazQ= -k8s.io/client-go v0.34.3 h1:wtYtpzy/OPNYf7WyNBTj3iUA0XaBHVqhv4Iv3tbrF5A= -k8s.io/client-go v0.34.3/go.mod h1:OxxeYagaP9Kdf78UrKLa3YZixMCfP6bgPwPwNBQBzpM= -k8s.io/code-generator v0.34.0 h1:Ze2i1QsvUprIlX3oHiGv09BFQRLCz+StA8qKwwFzees= -k8s.io/code-generator v0.34.0/go.mod h1:Py2+4w2HXItL8CGhks8uI/wS3Y93wPKO/9mBQUYNua0= -k8s.io/component-base v0.34.0 h1:bS8Ua3zlJzapklsB1dZgjEJuJEeHjj8yTu1gxE2zQX8= -k8s.io/component-base v0.34.0/go.mod h1:RSCqUdvIjjrEm81epPcjQ/DS+49fADvGSCkIP3IC6vg= -k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q= -k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= +k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= +k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/apiserver v0.35.0 h1:CUGo5o+7hW9GcAEF3x3usT3fX4f9r8xmgQeCBDaOgX4= +k8s.io/apiserver v0.35.0/go.mod h1:QUy1U4+PrzbJaM3XGu2tQ7U9A4udRRo5cyxkFX0GEds= +k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= +k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= +k8s.io/code-generator v0.35.0 h1:TvrtfKYZTm9oDF2z+veFKSCcgZE3Igv0svY+ehCmjHQ= +k8s.io/code-generator v0.35.0/go.mod h1:iS1gvVf3c/T71N5DOGYO+Gt3PdJ6B9LYSvIyQ4FHzgc= +k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94= +k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0= +k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b h1:gMplByicHV/TJBizHd9aVEsTYoJBnnUAT5MHlTkbjhQ= +k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b/go.mod h1:CgujABENc3KuTrcsdpGmrrASjtQsWCT7R99mEV4U/fM= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= -k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk= -sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/kind v0.30.0 h1:2Xi1KFEfSMm0XDcvKnUt15ZfgRPCT0OnCBbpgh8DztY= -sigs.k8s.io/kind v0.30.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= +sigs.k8s.io/controller-tools v0.20.0 h1:VWZF71pwSQ2lZZCt7hFGJsOfDc5dVG28/IysjjMWXL8= +sigs.k8s.io/controller-tools v0.20.0/go.mod h1:b4qPmjGU3iZwqn34alUU5tILhNa9+VXK+J3QV0fT/uU= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/kind v0.31.0 h1:UcT4nzm+YM7YEbqiAKECk+b6dsvc/HRZZu9U0FolL1g= +sigs.k8s.io/kind v0.31.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= diff --git a/hack/tools/tools.go b/hack/tools/tools.go index 946f3cb..d6ac85f 100644 --- a/hack/tools/tools.go +++ b/hack/tools/tools.go @@ -25,6 +25,7 @@ import ( _ "github.com/a8m/envsubst" _ "github.com/onsi/ginkgo/v2/ginkgo" _ "golang.org/x/oauth2/google" + _ "golang.org/x/tools/cmd/goimports" _ "k8s.io/client-go/plugin/pkg/client/auth/azure" _ "sigs.k8s.io/controller-tools/cmd/controller-gen" _ "sigs.k8s.io/kind" diff --git a/pkg/agent/sveltos-applier.go b/pkg/agent/sveltos-applier.go index 7e0ccc6..b46288b 100644 --- a/pkg/agent/sveltos-applier.go +++ b/pkg/agent/sveltos-applier.go @@ -117,7 +117,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: docker.io/projectsveltos/sveltos-applier@sha256:ff398fa543da817db8b2380e14634f3b524b4bc9ce43cf59106d3b8bc1ac0de7 + image: docker.io/projectsveltos/sveltos-applier@sha256:d1ea88837a23089d28c9bfbad4fcaaaa8a1ccc3fb439165ef4d3a93ef6668301 livenessProbe: failureThreshold: 3 httpGet: diff --git a/pkg/agent/sveltos-applier.yaml b/pkg/agent/sveltos-applier.yaml index 0fbf979..e2ff916 100644 --- a/pkg/agent/sveltos-applier.yaml +++ b/pkg/agent/sveltos-applier.yaml @@ -99,7 +99,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: docker.io/projectsveltos/sveltos-applier@sha256:ff398fa543da817db8b2380e14634f3b524b4bc9ce43cf59106d3b8bc1ac0de7 + image: docker.io/projectsveltos/sveltos-applier@sha256:d1ea88837a23089d28c9bfbad4fcaaaa8a1ccc3fb439165ef4d3a93ef6668301 livenessProbe: failureThreshold: 3 httpGet: diff --git a/test/clusterapi-workload.yaml b/test/clusterapi-workload.yaml index 6e87077..94fad17 100644 --- a/test/clusterapi-workload.yaml +++ b/test/clusterapi-workload.yaml @@ -7,6 +7,13 @@ spec: controlPlane: healthCheck: checks: + unhealthyMachineConditions: + - status: Unknown + timeoutSeconds: 300 + type: NodeReady + - status: "False" + timeoutSeconds: 300 + type: NodeReady unhealthyNodeConditions: - status: Unknown timeoutSeconds: 300 @@ -224,6 +231,13 @@ spec: class: default-worker healthCheck: checks: + unhealthyMachineConditions: + - status: Unknown + timeoutSeconds: 300 + type: NodeReady + - status: "False" + timeoutSeconds: 300 + type: NodeReady unhealthyNodeConditions: - status: Unknown timeoutSeconds: 300 @@ -367,7 +381,7 @@ spec: enabled: true enforce: baseline warn: restricted - version: v1.34.0 + version: v1.35.0 workers: machineDeployments: - class: default-worker diff --git a/test/pullmode-sveltosapplier.yaml b/test/pullmode-sveltosapplier.yaml index 6ae44e7..0bb3583 100644 --- a/test/pullmode-sveltosapplier.yaml +++ b/test/pullmode-sveltosapplier.yaml @@ -99,7 +99,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: docker.io/projectsveltos/sveltos-applier@sha256:ff398fa543da817db8b2380e14634f3b524b4bc9ce43cf59106d3b8bc1ac0de7 + image: docker.io/projectsveltos/sveltos-applier@sha256:d1ea88837a23089d28c9bfbad4fcaaaa8a1ccc3fb439165ef4d3a93ef6668301 livenessProbe: failureThreshold: 3 httpGet: From 96c92701a4979704f691f57451386bdf3d54647e Mon Sep 17 00:00:00 2001 From: Gianluca Mardente Date: Wed, 31 Dec 2025 10:47:42 +0100 Subject: [PATCH 2/2] (chore) optmize classifier deployment --- controllers/classifier_deployer.go | 159 ++++++++++++-------- controllers/classifier_report_collection.go | 5 +- controllers/utils.go | 4 + 3 files changed, 107 insertions(+), 61 deletions(-) diff --git a/controllers/classifier_deployer.go b/controllers/classifier_deployer.go index c8c1bb9..025cf90 100644 --- a/controllers/classifier_deployer.go +++ b/controllers/classifier_deployer.go @@ -120,30 +120,46 @@ func (r *ClassifierReconciler) deployClassifier(ctx context.Context, classifierS logger.V(logs.LogDebug).Info("request to deploy") var errorSeen error - allDeployed := true - clusterInfo := make([]libsveltosv1beta1.ClusterInfo, 0) + allProcessed := true + for i := range classifier.Status.ClusterInfo { - c := classifier.Status.ClusterInfo[i] - cInfo, err := r.processClassifier(ctx, classifierScope, r.ControlPlaneEndpoint, &c.Cluster, f, logger) + c := &classifier.Status.ClusterInfo[i] + + l := logger.WithValues("cluster", fmt.Sprintf("%s:%s/%s", + c.Cluster.Kind, c.Cluster.Namespace, c.Cluster.Name)) + + clusterInfo, err := r.processClassifier(ctx, classifierScope, r.ControlPlaneEndpoint, &c.Cluster, f, l) if err != nil { errorSeen = err } - if cInfo != nil { - clusterInfo = append(clusterInfo, *cInfo) - if cInfo.Status != libsveltosv1beta1.SveltosStatusProvisioned { - allDeployed = false + if clusterInfo != nil { + classifier.Status.ClusterInfo[i] = *clusterInfo + if clusterInfo.Status != libsveltosv1beta1.SveltosStatusProvisioned { + allProcessed = false } } } + // Filter out entries with Statuslibsveltosv1beta1.SveltosStatusRemoved + n := 0 + for i := range classifier.Status.ClusterInfo { + if classifier.Status.ClusterInfo[i].Status != libsveltosv1beta1.SveltosStatusRemoved { + classifier.Status.ClusterInfo[n] = classifier.Status.ClusterInfo[i] + n++ + } + } + // Truncate the slice to the new length + classifier.Status.ClusterInfo = classifier.Status.ClusterInfo[:n] + // Update Classifier Status - classifierScope.SetClusterInfo(clusterInfo) + logger.V(logs.LogDebug).Info("set clusterInfo") + classifierScope.SetClusterInfo(classifier.Status.ClusterInfo) if errorSeen != nil { return errorSeen } - if !allDeployed { + if !allProcessed { return fmt.Errorf("request to deploy Classifier is still queued in one ore more clusters") } @@ -948,8 +964,6 @@ func (r *ClassifierReconciler) processClassifier(ctx context.Context, classifier cpEndpoint string, cluster *corev1.ObjectReference, f feature, logger logr.Logger, ) (*libsveltosv1beta1.ClusterInfo, error) { - logger = logger.WithValues("cluster", fmt.Sprintf("%s:%s/%s", cluster.Kind, cluster.Namespace, cluster.Name)) - // Get Classifier Spec hash (at this very precise moment) currentHash, err := r.getCurrentHash(ctx, classifierScope, cpEndpoint, cluster, f, logger) if err != nil { @@ -957,14 +971,28 @@ func (r *ClassifierReconciler) processClassifier(ctx context.Context, classifier } classifier := classifierScope.Classifier - var proceed bool - proceed, err = r.canProceed(ctx, classifierScope, cluster, logger) + clusterInfo := &libsveltosv1beta1.ClusterInfo{ + Cluster: *cluster, + Hash: currentHash, + FailureMessage: nil, + Status: libsveltosv1beta1.SveltosStatusProvisioning, + } + + proceed, err := r.canProceed(ctx, classifierScope, cluster, logger) if err != nil { - return nil, err + failureMessage := err.Error() + clusterInfo.FailureMessage = &failureMessage + return clusterInfo, err } else if !proceed { - return nil, nil + failureMessage := "cannot proceed deploying. Either cluster is paused or not ready." + clusterInfo.FailureMessage = &failureMessage + return clusterInfo, nil } + // Remove any queued entry to cleanup + r.Deployer.CleanupEntries(cluster.Namespace, cluster.Name, classifier.Name, f.id, + clusterproxy.GetClusterType(cluster), true) + // If undeploying feature is in progress, wait for it to complete. // Otherwise, if we redeploy feature while same feature is still being cleaned up, if two workers process // those request in parallel some resources might end up missing. @@ -981,6 +1009,8 @@ func (r *ClassifierReconciler) processClassifier(ctx context.Context, classifier if !isConfigSame { logger.V(logs.LogDebug).Info(fmt.Sprintf("Classifier has changed. Current hash %x. Previous hash %x", currentHash, hash)) + } else { + logger.V(logs.LogDebug).Info("Classifier has not changed") } isPullMode, err := clusterproxy.IsClusterInPullMode(ctx, r.Client, cluster.Namespace, @@ -988,7 +1018,8 @@ func (r *ClassifierReconciler) processClassifier(ctx context.Context, classifier if err != nil { msg := fmt.Sprintf("failed to verify if Cluster is in pull mode: %v", err) logger.V(logs.LogDebug).Info(msg) - return nil, err + clusterInfo.FailureMessage = &msg + return clusterInfo, err } return r.proceedProcessingClassifier(ctx, classifier, cluster, isPullMode, isConfigSame, currentHash, f, logger) @@ -998,6 +1029,13 @@ func (r *ClassifierReconciler) proceedProcessingClassifier(ctx context.Context, cluster *corev1.ObjectReference, isPullMode, isConfigSame bool, currentHash []byte, f feature, logger logr.Logger, ) (*libsveltosv1beta1.ClusterInfo, error) { + clusterInfo := &libsveltosv1beta1.ClusterInfo{ + Cluster: *cluster, + Hash: currentHash, + FailureMessage: stringPtr(""), + Status: libsveltosv1beta1.SveltosStatusProvisioning, + } + _, currentStatus := r.getClassifierInClusterHashAndStatus(classifier, cluster) var deployerStatus *libsveltosv1beta1.SveltosFeatureStatus @@ -1011,16 +1049,13 @@ func (r *ClassifierReconciler) proceedProcessingClassifier(ctx context.Context, } if deployerStatus != nil { - logger.V(logs.LogDebug).Info("result is available. updating status.") - var errorMessage string + logger.V(logs.LogDebug).Info(fmt.Sprintf("result is available %q. updating status.", *deployerStatus)) + + clusterInfo.Status = *deployerStatus + if result.Err != nil { - errorMessage = result.Err.Error() - } - clusterInfo := &libsveltosv1beta1.ClusterInfo{ - Cluster: *cluster, - Status: *deployerStatus, - Hash: currentHash, - FailureMessage: &errorMessage, + errorMessage := result.Err.Error() + clusterInfo.FailureMessage = &errorMessage } if *deployerStatus == libsveltosv1beta1.SveltosStatusProvisioned { @@ -1037,12 +1072,11 @@ func (r *ClassifierReconciler) proceedProcessingClassifier(ctx context.Context, } } else if isConfigSame && currentStatus != nil && *currentStatus == libsveltosv1beta1.SveltosStatusProvisioned { logger.V(logs.LogDebug).Info("already deployed") - s := libsveltosv1beta1.SveltosStatusProvisioned - deployerStatus = &s + clusterInfo.Status = libsveltosv1beta1.SveltosStatusProvisioned + clusterInfo.FailureMessage = nil } else { logger.V(logs.LogDebug).Info("no result is available. queue job and mark status as provisioning") - s := libsveltosv1beta1.SveltosStatusProvisioning - deployerStatus = &s + clusterInfo.Status = libsveltosv1beta1.SveltosStatusProvisioning options := deployer.Options{HandlerOptions: make(map[string]any)} options.HandlerOptions[configurationHash] = currentHash @@ -1060,17 +1094,12 @@ func (r *ClassifierReconciler) proceedProcessingClassifier(ctx context.Context, if err := r.Deployer.Deploy(ctx, cluster.Namespace, cluster.Name, classifier.Name, f.id, clusterproxy.GetClusterType(cluster), false, handler, programDuration, options); err != nil { - return nil, err + failureMessage := err.Error() + clusterInfo.FailureMessage = &failureMessage + return clusterInfo, err } } - clusterInfo := &libsveltosv1beta1.ClusterInfo{ - Cluster: *cluster, - Status: *deployerStatus, - Hash: currentHash, - FailureMessage: nil, - } - if clusterInfo.Hash == nil { panic(1) } @@ -1084,6 +1113,13 @@ func (r *ClassifierReconciler) proceedDeployingClassifierInPullMode(ctx context. var pullmodeStatus *libsveltosv1beta1.FeatureStatus + clusterInfo := &libsveltosv1beta1.ClusterInfo{ + Cluster: *cluster, + Hash: currentHash, + FailureMessage: nil, + Status: libsveltosv1beta1.SveltosStatusProvisioning, + } + if isConfigSame { pullmodeHash, err := pullmode.GetRequestorHash(ctx, getManagementClusterClient(), cluster.Namespace, cluster.Name, libsveltosv1beta1.ClassifierKind, classifier.Name, f.id, logger) @@ -1091,7 +1127,10 @@ func (r *ClassifierReconciler) proceedDeployingClassifierInPullMode(ctx context. if !apierrors.IsNotFound(err) { msg := fmt.Sprintf("failed to get pull mode hash: %v", err) logger.V(logs.LogDebug).Info(msg) - return nil, err + clusterInfo.FailureMessage = &msg + return clusterInfo, err + } else { + isConfigSame = false } } else { isConfigSame = reflect.DeepEqual(pullmodeHash, currentHash) @@ -1104,16 +1143,12 @@ func (r *ClassifierReconciler) proceedDeployingClassifierInPullMode(ctx context. var err error pullmodeStatus, err = r.proceesAgentDeploymentStatus(ctx, classifier, cluster, f, logger) if err != nil { - return nil, err + failureMessage := err.Error() + clusterInfo.FailureMessage = &failureMessage + return clusterInfo, err } } - clusterInfo := &libsveltosv1beta1.ClusterInfo{ - Cluster: *cluster, - Hash: currentHash, - FailureMessage: nil, - } - if pullmodeStatus != nil { logger.V(logs.LogDebug).Info(fmt.Sprintf("agent result is available. updating status: %v", *pullmodeStatus)) @@ -1121,29 +1156,27 @@ func (r *ClassifierReconciler) proceedDeployingClassifierInPullMode(ctx context. case libsveltosv1beta1.FeatureStatusProvisioned: if err := pullmode.TerminateDeploymentTracking(ctx, r.Client, cluster.Namespace, cluster.Name, libsveltosv1beta1.ClassifierKind, classifier.Name, f.id, logger); err != nil { - logger.V(logs.LogDebug).Info(fmt.Sprintf("failed to terminate tracking: %v", err)) - return nil, err + failureMessage := fmt.Sprintf("failed to terminate tracking: %v", err) + logger.V(logs.LogDebug).Info(failureMessage) + clusterInfo.FailureMessage = &failureMessage + return clusterInfo, err } - provisioned := libsveltosv1beta1.SveltosStatusProvisioned - clusterInfo.Status = provisioned + clusterInfo.Status = libsveltosv1beta1.SveltosStatusProvisioned return clusterInfo, nil case libsveltosv1beta1.FeatureStatusProvisioning: msg := "agent is provisioning the content" logger.V(logs.LogDebug).Info(msg) - provisioning := libsveltosv1beta1.SveltosStatusProvisioning - clusterInfo.Status = provisioning + clusterInfo.Status = libsveltosv1beta1.SveltosStatusProvisioning return clusterInfo, nil case libsveltosv1beta1.FeatureStatusFailed: logger.V(logs.LogDebug).Info("agent failed provisioning the content") - failed := libsveltosv1beta1.SveltosStatusFailed - clusterInfo.Status = failed + clusterInfo.Status = libsveltosv1beta1.SveltosStatusFailed case libsveltosv1beta1.FeatureStatusFailedNonRetriable, libsveltosv1beta1.FeatureStatusRemoving, libsveltosv1beta1.FeatureStatusAgentRemoving, libsveltosv1beta1.FeatureStatusRemoved: logger.V(logs.LogDebug).Info("proceed deploying") } } else { - provisioning := libsveltosv1beta1.SveltosStatusProvisioning - clusterInfo.Status = provisioning + clusterInfo.Status = libsveltosv1beta1.SveltosStatusProvisioning } // Getting here means either agent failed to deploy feature or configuration has changed. @@ -1155,7 +1188,9 @@ func (r *ClassifierReconciler) proceedDeployingClassifierInPullMode(ctx context. if err := r.Deployer.Deploy(ctx, cluster.Namespace, cluster.Name, classifier.Name, f.id, clusterproxy.GetClusterType(cluster), false, deployClassifierInCluster, programDuration, options); err != nil { - return nil, err + failureMessage := err.Error() + clusterInfo.FailureMessage = &failureMessage + return clusterInfo, err } return clusterInfo, fmt.Errorf("request to deploy queued") @@ -1175,7 +1210,11 @@ func (r *ClassifierReconciler) proceesAgentDeploymentStatus(ctx context.Context, if pullmode.IsProcessingMismatch(err) { provisioning := libsveltosv1beta1.FeatureStatusProvisioning return &provisioning, nil + } else if pullmode.IsActionNotSetToDeploy(err) { + _ = pullmode.TerminateDeploymentTracking(ctx, r.Client, cluster.Namespace, + cluster.Name, libsveltosv1beta1.ClassifierKind, classifier.Name, f.id, logger) } + return nil, err } return status.DeploymentStatus, err @@ -1698,7 +1737,7 @@ func deploySveltosApplierResources(ctx context.Context, clusterNamespace, cluste var referencedUnstructured []*unstructured.Unstructured if len(patches) > 0 { - logger.V(logs.LogInfo).Info("Patch sveltos-applier resources") + logger.V(logs.LogDebug).Info("Patch sveltos-applier resources") p := &patcher.CustomPatchPostRenderer{Patches: patches} referencedUnstructured, err = p.RunUnstructured( []*unstructured.Unstructured{policy}, @@ -2147,10 +2186,12 @@ func getPerClusterPatches(ctx context.Context, c client.Client, patches, err := getSveltosApplierPatchesNew(ctx, c, configMapNamespace, configMapName, logger) if err != nil { - logger.Error(err, "failed to get ConfigMap with drift-detection patches", + logger.Error(err, "failed to get ConfigMap with patches", "configMapNamespace", configMapNamespace, "configMapName", configMapName) return nil, err } + logger.V(logs.LogDebug).Info(fmt.Sprintf("got patches from ConfigMap %s/%s", + configMapNamespace, configMapName)) return patches, nil } diff --git a/controllers/classifier_report_collection.go b/controllers/classifier_report_collection.go index cda0425..c074bd6 100644 --- a/controllers/classifier_report_collection.go +++ b/controllers/classifier_report_collection.go @@ -185,9 +185,10 @@ func collectClassifierReports(c client.Client, shardKey, capiOnboardAnnotation, for i := range clusterList { cluster := &clusterList[i] - err = collectClassifierReportsFromCluster(ctx, c, cluster, version, logger) + l := logger.WithValues("cluster", fmt.Sprintf("%s:%s/%s", cluster.Kind, cluster.Namespace, cluster.Name)) + err = collectClassifierReportsFromCluster(ctx, c, cluster, version, l) if err != nil { - logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to collect ClassifierReports from cluster: %s/%s %v", + l.V(logs.LogInfo).Info(fmt.Sprintf("failed to collect ClassifierReports from cluster: %s/%s %v", cluster.Namespace, cluster.Name, err)) } } diff --git a/controllers/utils.go b/controllers/utils.go index 152c565..1e59b68 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -216,3 +216,7 @@ func deplAssociatedClusterExist(ctx context.Context, c client.Client, depl *apps return true, "", "", "" } + +func stringPtr(s string) *string { + return &s +}