From 08ba474454b258d4f9110049320f9c7348bc0fb0 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Thu, 8 May 2025 06:59:02 -0700 Subject: [PATCH 01/21] MLE-20428: add labels and annotation in group level --- api/v1/marklogiccluster_types.go | 4 +++- api/v1/zz_generated.deepcopy.go | 14 ++++++++++++++ .../marklogic.progress.com_marklogicclusters.yaml | 8 ++++++++ pkg/k8sutil/marklogicServer.go | 14 ++++++++++++++ pkg/k8sutil/statefulset.go | 9 ++++++--- 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/api/v1/marklogiccluster_types.go b/api/v1/marklogiccluster_types.go index b27c350..d213666 100644 --- a/api/v1/marklogiccluster_types.go +++ b/api/v1/marklogiccluster_types.go @@ -91,7 +91,9 @@ type MarklogicGroups struct { // +kubebuilder:default:=1 Replicas *int32 `json:"replicas,omitempty"` // +kubebuilder:validation:Required - Name string `json:"name,omitempty"` + Name string `json:"name,omitempty"` + Labels map[string]string `json:"labels,omitempty"` + Annotations map[string]string `json:"annotations,omitempty"` // +kubebuilder:default:={name: "Default", enableXdqpSsl: true} GroupConfig *GroupConfig `json:"groupConfig,omitempty"` Image string `json:"image,omitempty"` diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index ed17b6a..1d3ad9b 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -733,6 +733,20 @@ func (in *MarklogicGroups) DeepCopyInto(out *MarklogicGroups) { *out = new(int32) **out = **in } + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Annotations != nil { + in, out := &in.Annotations, &out.Annotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } if in.GroupConfig != nil { in, out := &in.GroupConfig, &out.GroupConfig *out = new(GroupConfig) diff --git a/config/crd/bases/marklogic.progress.com_marklogicclusters.yaml b/config/crd/bases/marklogic.progress.com_marklogicclusters.yaml index 09c2783..c5b9d03 100644 --- a/config/crd/bases/marklogic.progress.com_marklogicclusters.yaml +++ b/config/crd/bases/marklogic.progress.com_marklogicclusters.yaml @@ -7987,6 +7987,10 @@ spec: x-kubernetes-list-type: atomic type: object type: object + annotations: + additionalProperties: + type: string + type: object groupConfig: default: enableXdqpSsl: true @@ -9356,6 +9360,10 @@ spec: isBootstrap: default: false type: boolean + labels: + additionalProperties: + type: string + type: object logCollection: properties: enabled: diff --git a/pkg/k8sutil/marklogicServer.go b/pkg/k8sutil/marklogicServer.go index 1bfbd94..37cf104 100644 --- a/pkg/k8sutil/marklogicServer.go +++ b/pkg/k8sutil/marklogicServer.go @@ -19,6 +19,8 @@ type MarkLogicGroupParameters struct { Replicas *int32 Name string ServiceAccountName string + Labels map[string]string + Annotations map[string]string GroupConfig *marklogicv1.GroupConfig Image string ImagePullPolicy string @@ -89,6 +91,16 @@ func GenerateMarkLogicGroupDef(cr *marklogicv1.MarklogicCluster, index int, para logger.Info("ReconcileMarkLogicCluster") labels := getCommonLabels(cr.ObjectMeta.Name) annotations := getCommonAnnotations() + if params.Labels != nil { + for key, value := range params.Labels { + labels[key] = value + } + } + if params.Annotations != nil { + for key, value := range params.Annotations { + annotations[key] = value + } + } objectMeta := generateObjectMeta(cr.Spec.MarkLogicGroups[index].Name, cr.Namespace, labels, annotations) bootStrapHostName := "" bootStrapName := "" @@ -246,6 +258,8 @@ func generateMarkLogicGroupParams(cr *marklogicv1.MarklogicCluster, index int, c markLogicGroupParameters := &MarkLogicGroupParameters{ Replicas: cr.Spec.MarkLogicGroups[index].Replicas, Name: cr.Spec.MarkLogicGroups[index].Name, + Labels: cr.Spec.MarkLogicGroups[index].Labels, + Annotations: cr.Spec.MarkLogicGroups[index].Annotations, GroupConfig: cr.Spec.MarkLogicGroups[index].GroupConfig, Service: cr.Spec.MarkLogicGroups[index].Service, Image: clusterParams.Image, diff --git a/pkg/k8sutil/statefulset.go b/pkg/k8sutil/statefulset.go index 404046e..7990159 100644 --- a/pkg/k8sutil/statefulset.go +++ b/pkg/k8sutil/statefulset.go @@ -65,9 +65,12 @@ type containerParameters struct { func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { cr := oc.GetMarkLogicServer() logger := oc.ReqLogger - labels := getCommonLabels(cr.Spec.Name) - annotations := getCommonAnnotations() - objectMeta := generateObjectMeta(cr.Spec.Name, cr.Namespace, labels, annotations) + // labels := getCommonLabels() + groupLabels := cr.GetLabels() + groupLabels["app.kubernetes.io/instance"] = cr.Spec.Name + groupAnnotations := cr.GetAnnotations() + // annotations := getCommonAnnotations() + objectMeta := generateObjectMeta(cr.Spec.Name, cr.Namespace, groupLabels, groupAnnotations) currentSts, err := oc.GetStatefulSet(cr.Namespace, objectMeta.Name) containerParams := generateContainerParams(cr) statefulSetParams := generateStatefulSetsParams(cr) From 4f942621b369ecfad4d75eeb848d93cbc46daa49 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 14 May 2025 23:13:59 -0700 Subject: [PATCH 02/21] delete annotation used for kubectl apply --- pkg/k8sutil/common.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/k8sutil/common.go b/pkg/k8sutil/common.go index 61b8952..af626db 100644 --- a/pkg/k8sutil/common.go +++ b/pkg/k8sutil/common.go @@ -54,6 +54,7 @@ func SetCommonLabels(labels map[string]string) { } func SetCommonAnnotations(annotations map[string]string) { + delete(annotations, "kubectl.kubernetes.io/last-applied-configuration") CustomAnnotations = annotations } From fbfac9c6ec4057c17fdb39a796b452fb78164a48 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 19 May 2025 09:22:59 -0700 Subject: [PATCH 03/21] Fix the issue with HAProxy Label --- pkg/k8sutil/common.go | 10 ++++++++++ pkg/k8sutil/haProxy.go | 6 +++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/k8sutil/common.go b/pkg/k8sutil/common.go index af626db..ca28a3d 100644 --- a/pkg/k8sutil/common.go +++ b/pkg/k8sutil/common.go @@ -68,6 +68,16 @@ func getSelectorLabels(name string) map[string]string { return selectorLabels } +func getHAProxyLabels(name string) map[string]string { + selectorLabels := map[string]string{ + "app.kubernetes.io/name": "marklogic", + "app.kubernetes.io/instance": name, + "app.kubernetes.io/managed-by": "marklogic-operator", + "app.kubernetes.io/component": "haproxy", + } + return selectorLabels +} + func getCommonLabels(name string) map[string]string { defaultLabels := getSelectorLabels(name) mergedLabels := map[string]string{} diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 96c5dd5..2b33f0c 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -24,8 +24,7 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { logger.Info("Reconciling HAProxy Config") - labels := getCommonLabels(cr.GetObjectMeta().GetName()) - labels["app.kubernetes.io/component"] = "haproxy" + labels := getHAProxyLabels(cr.GetObjectMeta().GetName()) annotations := getCommonAnnotations() configMapName := "marklogic-haproxy" objectMeta := generateObjectMeta(configMapName, cr.Namespace, labels, annotations) @@ -344,6 +343,7 @@ func (cc *ClusterContext) generateHaproxyServiceDef(meta metav1.ObjectMeta) *cor Port: cr.Spec.HAProxy.Stats.Port, }) } + selectorLables := getHAProxyLabels(cr.GetObjectMeta().GetName()) serviceDef := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: "marklogic-haproxy", @@ -352,7 +352,7 @@ func (cc *ClusterContext) generateHaproxyServiceDef(meta metav1.ObjectMeta) *cor Annotations: meta.Annotations, }, Spec: corev1.ServiceSpec{ - Selector: meta.Labels, + Selector: selectorLables, Ports: servicePort, Type: corev1.ServiceTypeClusterIP, }, From 7799150b7815c665439668fb5e93626a4b0fe704 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 28 May 2025 02:41:17 -0700 Subject: [PATCH 04/21] Working Solution --- .../controller/marklogiccluster_controller.go | 48 +++++++++ .../controller/marklogicgroup_controller.go | 62 ++++++++++- pkg/k8sutil/haProxy.go | 18 +++- pkg/k8sutil/marklogicServer.go | 29 +++-- pkg/k8sutil/service.go | 2 +- pkg/k8sutil/statefulset.go | 100 +++++++++--------- 6 files changed, 194 insertions(+), 65 deletions(-) diff --git a/internal/controller/marklogiccluster_controller.go b/internal/controller/marklogiccluster_controller.go index 317ed37..5d0d923 100644 --- a/internal/controller/marklogiccluster_controller.go +++ b/internal/controller/marklogiccluster_controller.go @@ -31,6 +31,9 @@ import ( "github.com/go-logr/logr" marklogicv1 "github.com/marklogic/marklogic-operator-kubernetes/api/v1" "github.com/marklogic/marklogic-operator-kubernetes/pkg/k8sutil" + "reflect" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" ) // MarklogicClusterReconciler reconciles a MarklogicCluster object @@ -81,10 +84,55 @@ func (r *MarklogicClusterReconciler) Reconcile(ctx context.Context, req ctrl.Req return result, nil } +func markLogicClusterCreateUpdateDeletePredicate() predicate.Predicate { + return predicate.Funcs{ + CreateFunc: func(e event.CreateEvent) bool { + return true // Reconcile on create + }, + UpdateFunc: func(e event.UpdateEvent) bool { + switch e.ObjectNew.(type) { + case *marklogicv1.MarklogicCluster: + oldAnnotations := e.ObjectOld.GetAnnotations() + newAnnotations := e.ObjectNew.GetAnnotations() + // delete(newAnnotations, "banzaicloud.com/last-applied") + // delete(oldAnnotations, "banzaicloud.com/last-applied") + // delete(newAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + // delete(oldAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + if !reflect.DeepEqual(oldAnnotations, newAnnotations) { + return true // Reconcile if annotations have changed + } + oldLables := e.ObjectOld.GetLabels() + newLabels := e.ObjectNew.GetLabels() + if !reflect.DeepEqual(oldLables, newLabels) { + return true // Reconcile if labels have changed + } + // If annotations and labels are the same, check if the spec has changed + oldObj := e.ObjectOld.(*marklogicv1.MarklogicGroup) + // Check if the spec has changed + newObj := e.ObjectNew.(*marklogicv1.MarklogicGroup) + if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + return true // Reconcile if spec has changed + } + default: + return false // Ignore updates for other types + } + return false // Reconcile on update of MarklogicCluster + + }, + DeleteFunc: func(e event.DeleteEvent) bool { + return true // Reconcile on delete + }, + GenericFunc: func(e event.GenericEvent) bool { + return false // Ignore generic events (optional) + }, + } +} + // SetupWithManager sets up the controller with the Manager. func (r *MarklogicClusterReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&marklogicv1.MarklogicCluster{}). + WithEventFilter(markLogicClusterCreateUpdateDeletePredicate()). Owns(&marklogicv1.MarklogicGroup{}). Complete(r) } diff --git a/internal/controller/marklogicgroup_controller.go b/internal/controller/marklogicgroup_controller.go index 820a16c..e534c71 100644 --- a/internal/controller/marklogicgroup_controller.go +++ b/internal/controller/marklogicgroup_controller.go @@ -19,18 +19,20 @@ package controller import ( "context" + "github.com/go-logr/logr" + marklogicv1 "github.com/marklogic/marklogic-operator-kubernetes/api/v1" + "github.com/marklogic/marklogic-operator-kubernetes/pkg/k8sutil" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" + "reflect" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/log" - - "github.com/go-logr/logr" - marklogicv1 "github.com/marklogic/marklogic-operator-kubernetes/api/v1" - "github.com/marklogic/marklogic-operator-kubernetes/pkg/k8sutil" + "sigs.k8s.io/controller-runtime/pkg/predicate" ) // MarklogicGroupReconciler reconciles a MarklogicGroup object @@ -94,12 +96,64 @@ func (r *MarklogicGroupReconciler) Reconcile(ctx context.Context, req ctrl.Reque return result, nil } +func markLogicGroupCreateUpdateDeletePredicate() predicate.Predicate { + return predicate.Funcs{ + CreateFunc: func(e event.CreateEvent) bool { + return true // Reconcile on create + }, + UpdateFunc: func(e event.UpdateEvent) bool { + switch e.ObjectNew.(type) { + case *marklogicv1.MarklogicGroup: + return true // Reconcile on update of MarklogicGroup + // oldAnnotations := e.ObjectOld.GetAnnotations() + // newAnnotations := e.ObjectNew.GetAnnotations() + // delete(newAnnotations, "banzaicloud.com/last-applied") + // delete(oldAnnotations, "banzaicloud.com/last-applied") + // delete(newAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + // delete(oldAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + // if !reflect.DeepEqual(oldAnnotations, newAnnotations) { + // return true // Reconcile if annotations have changed + // } + // oldLables := e.ObjectOld.GetLabels() + // newLabels := e.ObjectNew.GetLabels() + // if !reflect.DeepEqual(oldLables, newLabels) { + // return true // Reconcile if labels have changed + // } + // oldObj := e.ObjectOld.(*marklogicv1.MarklogicGroup) + // newObj := e.ObjectNew.(*marklogicv1.MarklogicGroup) + // if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + // return true // Reconcile if the spec has changed + // } + // return false + case *appsv1.StatefulSet: + return true // Reconcile on update of StatefulSet + case *corev1.Service: + oldObj := e.ObjectOld.(*corev1.Service) + newObj := e.ObjectNew.(*corev1.Service) + if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + return true // Reconcile if the spec has changed + } + return false // Reconcile on update of Service + default: + return false // Ignore updates for other types + } + }, + DeleteFunc: func(e event.DeleteEvent) bool { + return true // Reconcile on delete + }, + GenericFunc: func(e event.GenericEvent) bool { + return false // Ignore generic events (optional) + }, + } +} + // SetupWithManager sets up the controller with the Manager. func (r *MarklogicGroupReconciler) SetupWithManager(mgr ctrl.Manager) error { builder := ctrl.NewControllerManagedBy(mgr). Named("marklogicgroup-controller"). For(&marklogicv1.MarklogicGroup{}). + WithEventFilter(markLogicGroupCreateUpdateDeletePredicate()). Owns(&appsv1.StatefulSet{}). Owns(&corev1.Service{}) diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 2b33f0c..3ba9c42 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -40,6 +40,9 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { if err != nil { if errors.IsNotFound(err) { logger.Info("HAProxy ConfigMap is not found, creating a new one") + // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configMapDef); err != nil { + // logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") + // } err = cc.createConfigMapForCC(configMapDef) if err != nil { logger.Info("HAProxy configmap creation is failed") @@ -51,6 +54,9 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { logger.Info("HAProxy Deployment creation is failed") return result.Error(err) } + // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(haproxyServiceDef); err != nil { + // logger.Error(err, "Failed to set last applied annotation for HAProxy Service") + // } err = cc.createHAProxyService(haproxyServiceDef) if err != nil { logger.Info("HAProxy Service creation is failed") @@ -72,12 +78,15 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { return result.Error(err) } if !patchDiff.IsEmpty() { - logger.Info("MarkLogic statefulSet spec is different from the MarkLogicGroup spec, updating the statefulSet") + logger.Info("MarkLogic HAProxy Config spec is different from previous spec, updating the HAProxy ConfigMap") logger.Info(patchDiff.String()) configmap.Data = configMapDef.Data + // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configmap); err != nil { + // logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") + // } err := cc.Client.Update(cc.Ctx, configmap) if err != nil { - logger.Error(err, "Error updating MakrLogicGroup") + logger.Error(err, "Error updating MarkLogic HAProxy ConfigMap") return result.Error(err) } } @@ -95,9 +104,12 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { return result.Error(err) } if !patchDiff.IsEmpty() { - logger.Info("HAProxy Service spec is different from the MarkLogicGroup spec, updating the haproxy service") + logger.Info("HAProxy spec is different from the previous spec, updating the haproxy service") logger.Info(patchDiff.String()) haproxyService.Spec = haproxyServiceDef.Spec + // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(haproxyService); err != nil { + // logger.Error(err, "Failed to set last applied annotation for HAProxy Service") + // } err := cc.Client.Update(cc.Ctx, haproxyService) if err != nil { logger.Error(err, "Error updating HAProxy service") diff --git a/pkg/k8sutil/marklogicServer.go b/pkg/k8sutil/marklogicServer.go index 37cf104..7affbf8 100644 --- a/pkg/k8sutil/marklogicServer.go +++ b/pkg/k8sutil/marklogicServer.go @@ -91,6 +91,8 @@ func GenerateMarkLogicGroupDef(cr *marklogicv1.MarklogicCluster, index int, para logger.Info("ReconcileMarkLogicCluster") labels := getCommonLabels(cr.ObjectMeta.Name) annotations := getCommonAnnotations() + logger.Info("!!!!MarkLogicGroupDef - Cluster Level Labels", "Cluster Level Labels", labels, "Annotations", annotations) + logger.Info("!!!!MarkLogicGroupDef - Group level Labels", "Group level Labels", params.Labels, "Annotations", params.Annotations) if params.Labels != nil { for key, value := range params.Labels { labels[key] = value @@ -101,6 +103,7 @@ func GenerateMarkLogicGroupDef(cr *marklogicv1.MarklogicCluster, index int, para annotations[key] = value } } + logger.Info("!!!!MarkLogicGroupDef - Computed Labels", "Computed Labels", labels, "Annotations", annotations) objectMeta := generateObjectMeta(cr.Spec.MarkLogicGroups[index].Name, cr.Namespace, labels, annotations) bootStrapHostName := "" bootStrapName := "" @@ -172,11 +175,16 @@ func (cc *ClusterContext) ReconsileMarklogicCluster() (reconcile.Result, error) params := generateMarkLogicGroupParams(cr, i, clusterParams) logger.Info("!!! ReconcileCluster MarkLogicGroup", "MarkLogicGroupParams", params) markLogicGroupDef := GenerateMarkLogicGroupDef(operatorCR, i, params) + logger.Info("###MarkLogicGroupDef", "MarkLogicGroupDef Labels", markLogicGroupDef.ObjectMeta.Labels) err := cc.Client.Get(cc.Ctx, namespacedName, currentMlg) + logger.Info("###currentMlg", "currentMlg Labels", currentMlg.ObjectMeta.Labels) if err != nil { if apierrors.IsNotFound(err) { logger.Info("MarkLogicGroup resource not found. Creating a new one") - + if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(markLogicGroupDef); err != nil { + logger.Error(err, "Failed to set last applied annotation") + } + logger.Info("@@@@MarkLogicGroupDef", "MarkLogicGroupDef annotation", markLogicGroupDef.ObjectMeta.Annotations) err = cc.Client.Create(ctx, markLogicGroupDef) if err != nil { logger.Error(err, "Failed to create markLogicCluster") @@ -198,18 +206,21 @@ func (cc *ClusterContext) ReconsileMarklogicCluster() (reconcile.Result, error) return result.Error(err).Output() } if !patchDiff.IsEmpty() { - logger.Info("MarkLogic statefulSet spec is different from the MarkLogicGroup spec, updating the statefulSet") - logger.Info(patchDiff.String()) - currentMlg.Spec = markLogicGroupDef.Spec - currentMlg.ObjectMeta.Labels = markLogicGroupDef.ObjectMeta.Labels - currentMlg.ObjectMeta.Annotations = markLogicGroupDef.ObjectMeta.Annotations - err := cc.Client.Update(cc.Ctx, currentMlg) + logger.Info("MarkLogicGroup spec is different from the previous spec, updating the markLogicGroup") + // currentMlg.Spec = markLogicGroupDef.Spec + // currentMlg.ObjectMeta.Labels = markLogicGroupDef.ObjectMeta.Labels + // currentMlg.ObjectMeta.Annotations = markLogicGroupDef.ObjectMeta.Annotations + markLogicGroupDef.ObjectMeta.ResourceVersion = currentMlg.ObjectMeta.ResourceVersion + if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(markLogicGroupDef); err != nil { + logger.Error(err, "Failed to set last applied annotation") + } + err := cc.Client.Update(cc.Ctx, markLogicGroupDef) if err != nil { - logger.Error(err, "Error updating MakrLogicGroup") + logger.Error(err, "Error updating MarklogicGroup") return result.Error(err).Output() } } else { - logger.Info("MarkLogic statefulSet spec is the same as the MarkLogicGroup spec") + logger.Info("MarkLogicGroup spec is same as the current spec, no update required") } } diff --git a/pkg/k8sutil/service.go b/pkg/k8sutil/service.go index 65f4d09..e7e6e43 100644 --- a/pkg/k8sutil/service.go +++ b/pkg/k8sutil/service.go @@ -96,7 +96,7 @@ func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerRefe } func generateService(svcName string, cr *marklogicv1.MarklogicGroup) *corev1.Service { - labels := getCommonLabels(cr.Spec.Name) + labels := getSelectorLabels(cr.Spec.Name) var svcParams serviceParameters = serviceParameters{} svcParams = generateServiceParams(cr) svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations) diff --git a/pkg/k8sutil/statefulset.go b/pkg/k8sutil/statefulset.go index 7990159..1c07646 100644 --- a/pkg/k8sutil/statefulset.go +++ b/pkg/k8sutil/statefulset.go @@ -69,7 +69,7 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { groupLabels := cr.GetLabels() groupLabels["app.kubernetes.io/instance"] = cr.Spec.Name groupAnnotations := cr.GetAnnotations() - // annotations := getCommonAnnotations() + delete(groupAnnotations, "banzaicloud.com/last-applied") objectMeta := generateObjectMeta(cr.Spec.Name, cr.Namespace, groupLabels, groupAnnotations) currentSts, err := oc.GetStatefulSet(cr.Namespace, objectMeta.Name) containerParams := generateContainerParams(cr) @@ -87,40 +87,41 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { logger.Error(err, "Cannot create standalone statefulSet for MarkLogic") return result.Error(err).Output() } - patchClient := client.MergeFrom(oc.MarklogicGroup.DeepCopy()) - updated := false - if currentSts.Status.ReadyReplicas == 0 || currentSts.Status.ReadyReplicas != currentSts.Status.Replicas { - logger.Info("MarkLogic statefulSet is not ready, setting condition and requeue") - condition := metav1.Condition{ - Type: "Ready", - Status: metav1.ConditionFalse, - Reason: "MarkLogicGroupStatefulSetNotReady", - Message: "MarkLogicGroup statefulSet is not ready", - } - updated = oc.setCondition(&condition) - if updated { - err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) - if err != nil { - oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") - } - } - return result.Done().Output() - } else { - logger.Info("MarkLogic statefulSet is ready, setting condition") - condition := metav1.Condition{ - Type: "Ready", - Status: metav1.ConditionTrue, - Reason: "MarkLogicGroupStatefulSetReady", - Message: "MarkLogicGroup statefulSet is ready", - } - updated = oc.setCondition(&condition) - } - if updated { - err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) - if err != nil { - oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") - } - } + // patchClient := client.MergeFrom(oc.MarklogicGroup.DeepCopy()) + // updated := false + // if currentSts.Status.ReadyReplicas == 0 || currentSts.Status.ReadyReplicas != currentSts.Status.Replicas { + // logger.Info("MarkLogic statefulSet is not ready, setting condition and requeue") + // condition := metav1.Condition{ + // Type: "Ready", + // Status: metav1.ConditionFalse, + // Reason: "MarkLogicGroupStatefulSetNotReady", + // Message: "MarkLogicGroup statefulSet is not ready", + // } + // updated = oc.setCondition(&condition) + // if updated { + // err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) + // if err != nil { + // oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") + // } + // } + // return result.Done().Output() + // } else { + // logger.Info("MarkLogic statefulSet is ready, setting condition") + // condition := metav1.Condition{ + // Type: "Ready", + // Status: metav1.ConditionTrue, + // Reason: "MarkLogicGroupStatefulSetReady", + // Message: "MarkLogicGroup statefulSet is ready", + // } + // updated = oc.setCondition(&condition) + // } + // if updated { + // err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) + // if err != nil { + // oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") + // } + // } + patchDiff, err := patch.DefaultPatchMaker.Calculate(currentSts, statefulSetDef, patch.IgnoreStatusFields(), patch.IgnoreVolumeClaimTemplateTypeMetaAndStatus(), @@ -129,26 +130,30 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { logger.Error(err, "Error calculating patch") return result.Error(err).Output() } + logger.Info("****MarkLogic statefulSet patch diff", "diff", patchDiff) if !patchDiff.IsEmpty() { logger.Info("MarkLogic statefulSet spec is different from the MarkLogicGroup spec, updating the statefulSet") logger.Info(patchDiff.String()) - err := oc.Client.Update(oc.Ctx, statefulSetDef) + currentSts.Spec = statefulSetDef.Spec + currentSts.ObjectMeta.Annotations = statefulSetDef.ObjectMeta.Annotations + currentSts.ObjectMeta.Labels = statefulSetDef.ObjectMeta.Labels + err := oc.Client.Update(oc.Ctx, currentSts) if err != nil { logger.Error(err, "Error updating statefulSet") return result.Error(err).Output() } } else { - logger.Info("MarkLogic statefulSet spec is the same as the MarkLogicGroup spec") - } - logger.Info("Operator Status:", "Stage", cr.Status.Stage) - if cr.Status.Stage == "STS_CREATED" { - logger.Info("MarkLogic statefulSet created successfully, waiting for pods to be ready") - pods, err := GetPodsForStatefulSet(cr.Namespace, cr.Spec.Name) - if err != nil { - logger.Error(err, "Error getting pods for statefulset") - } - logger.Info("Pods in statefulSet: ", "Pods", pods) - } + logger.Info("MarkLogic statefulSet spec is the same as the current spec, no update needed") + } + // logger.Info("Operator Status:", "Stage", cr.Status.Stage) + // if cr.Status.Stage == "STS_CREATED" { + // logger.Info("MarkLogic statefulSet created successfully, waiting for pods to be ready") + // pods, err := GetPodsForStatefulSet(cr.Namespace, cr.Spec.Name) + // if err != nil { + // logger.Error(err, "Error getting pods for statefulset") + // } + // logger.Info("Pods in statefulSet: ", "Pods", pods) + // } return result.Done().Output() } @@ -179,7 +184,6 @@ func (oc *OperatorContext) GetStatefulSet(namespace string, stateful string) (*a func (oc *OperatorContext) createStatefulSet(statefulset *appsv1.StatefulSet, cr *marklogicv1.MarklogicGroup) error { logger := oc.ReqLogger err := oc.Client.Create(context.TODO(), statefulset) - // _, err := GenerateK8sClient().AppsV1().StatefulSets(namespace).Create(context.TODO(), stateful, metav1.CreateOptions{}) if err != nil { logger.Error(err, "MarkLogic stateful creation failed") return err From bc9f374a2ad0d659f66b602baa2bd98618ea7a44 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 2 Jun 2025 09:39:34 -0700 Subject: [PATCH 05/21] fix haproxy selector --- pkg/k8sutil/common.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/k8sutil/common.go b/pkg/k8sutil/common.go index ca28a3d..daf0a15 100644 --- a/pkg/k8sutil/common.go +++ b/pkg/k8sutil/common.go @@ -69,13 +69,26 @@ func getSelectorLabels(name string) map[string]string { } func getHAProxyLabels(name string) map[string]string { - selectorLabels := map[string]string{ + defaultHaproxyLabels := map[string]string{ "app.kubernetes.io/name": "marklogic", "app.kubernetes.io/instance": name, "app.kubernetes.io/managed-by": "marklogic-operator", "app.kubernetes.io/component": "haproxy", } - return selectorLabels + mergedLabels := map[string]string{} + if len(CustomLabels) > 0 { + for k, v := range defaultHaproxyLabels { + mergedLabels[k] = v + } + for k, v := range CustomLabels { + if _, ok := defaultHaproxyLabels[k]; !ok { + mergedLabels[k] = v + } + } + } else { + return defaultHaproxyLabels + } + return mergedLabels } func getCommonLabels(name string) map[string]string { From f72e6bfcaea3513d753e5dab35840b11f79b67b1 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 2 Jun 2025 23:24:21 -0700 Subject: [PATCH 06/21] fix update for haproxy service --- pkg/k8sutil/haProxy.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 3ba9c42..1ddc208 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -107,6 +107,8 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { logger.Info("HAProxy spec is different from the previous spec, updating the haproxy service") logger.Info(patchDiff.String()) haproxyService.Spec = haproxyServiceDef.Spec + haproxyService.ObjectMeta.Labels = haproxyServiceDef.ObjectMeta.Labels + haproxyService.ObjectMeta.Annotations = haproxyServiceDef.ObjectMeta.Annotations // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(haproxyService); err != nil { // logger.Error(err, "Failed to set last applied annotation for HAProxy Service") // } From 32befb0e82033b61f85e3edab24d06e1e870538f Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 2 Jun 2025 23:30:26 -0700 Subject: [PATCH 07/21] fix issue with haproxy updated after creation --- pkg/k8sutil/haProxy.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 1ddc208..a580edc 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -62,7 +62,8 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { logger.Info("HAProxy Service creation is failed") return result.Error(err) } - logger.Info("HAProxy Test is successful") + logger.Info("HAProxy Deployed is successful") + return result.Continue() } else { logger.Error(err, "HAProxy configmap creation is failed") return result.Error(err) @@ -109,9 +110,6 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { haproxyService.Spec = haproxyServiceDef.Spec haproxyService.ObjectMeta.Labels = haproxyServiceDef.ObjectMeta.Labels haproxyService.ObjectMeta.Annotations = haproxyServiceDef.ObjectMeta.Annotations - // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(haproxyService); err != nil { - // logger.Error(err, "Failed to set last applied annotation for HAProxy Service") - // } err := cc.Client.Update(cc.Ctx, haproxyService) if err != nil { logger.Error(err, "Error updating HAProxy service") From 58ad062d28aebc7f30d2361af309bf258ca2cfba Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Tue, 3 Jun 2025 00:04:00 -0700 Subject: [PATCH 08/21] fix haproxy deployment label update --- pkg/k8sutil/common.go | 9 +++++++-- pkg/k8sutil/haProxy.go | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/pkg/k8sutil/common.go b/pkg/k8sutil/common.go index daf0a15..5172c80 100644 --- a/pkg/k8sutil/common.go +++ b/pkg/k8sutil/common.go @@ -68,13 +68,18 @@ func getSelectorLabels(name string) map[string]string { return selectorLabels } -func getHAProxyLabels(name string) map[string]string { - defaultHaproxyLabels := map[string]string{ +func getHAProxySelectorLabels(name string) map[string]string { + selectorLabels := map[string]string{ "app.kubernetes.io/name": "marklogic", "app.kubernetes.io/instance": name, "app.kubernetes.io/managed-by": "marklogic-operator", "app.kubernetes.io/component": "haproxy", } + return selectorLabels +} + +func getHAProxyLabels(name string) map[string]string { + defaultHaproxyLabels := getHAProxySelectorLabels(name) mergedLabels := map[string]string{} if len(CustomLabels) > 0 { for k, v := range defaultHaproxyLabels { diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index a580edc..3c9bafd 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -35,6 +35,7 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { err := client.Get(cc.Ctx, nsName, configmap) data := generateHAProxyConfigMapData(cc.MarklogicCluster) configMapDef := generateHAProxyConfigMap(objectMeta, marklogicClusterAsOwner(cr), data) + haproxyDeploymentDef := cc.createHAProxyDeploymentDef(objectMeta) haproxyServiceDef := cc.generateHaproxyServiceDef(objectMeta) configmapHash := calculateHash(configMapDef.Data) if err != nil { @@ -49,7 +50,7 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { return result.Error(err) } logger.Info("HAProxy configmap creation is successful") - err = cc.createHAProxyDeployment(objectMeta) + err = cc.createHAProxyDeployment(haproxyDeploymentDef) if err != nil { logger.Info("HAProxy Deployment creation is failed") return result.Error(err) @@ -117,19 +118,26 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { } } + // Check if the HAProxy Deployment is updated + logger.Info("!!@@##Checking if HAProxy Deployment is updated", "labels:", labels) haproxyDeployment := &appsv1.Deployment{} - err = client.Get(cc.Ctx, types.NamespacedName{Name: "marklogic-haproxy", Namespace: cr.Namespace}, haproxyDeployment) + deployName := types.NamespacedName{Name: "marklogic-haproxy", Namespace: cr.Namespace} + err = client.Get(cc.Ctx, deployName, haproxyDeployment) if err != nil { logger.Error(err, "Failed to get HAProxy Deployment") return result.Error(err) } - if haproxyDeployment.Spec.Template.Annotations == nil { - haproxyDeployment.Spec.Template.Annotations = make(map[string]string) + patchDiff, err = patch.DefaultPatchMaker.Calculate(haproxyDeployment, haproxyDeploymentDef, + patch.IgnoreStatusFields(), + patch.IgnoreVolumeClaimTemplateTypeMetaAndStatus(), + patch.IgnoreField("kind")) + if haproxyDeploymentDef.Spec.Template.Annotations == nil { + haproxyDeploymentDef.Spec.Template.Annotations = make(map[string]string) } - if haproxyDeployment.Spec.Template.Annotations["configmap-hash"] != configmapHash { + if haproxyDeployment.Spec.Template.Annotations["configmap-hash"] != configmapHash || !patchDiff.IsEmpty() { logger.Info("HAProxy Deployment is different from the HAProxy ConfigMap, updating the Deployment") - haproxyDeployment.Spec.Template.Annotations["configmap-hash"] = configmapHash - err := client.Update(cc.Ctx, haproxyDeployment) + haproxyDeploymentDef.Spec.Template.Annotations["configmap-hash"] = configmapHash + err := client.Update(cc.Ctx, haproxyDeploymentDef) if err != nil { logger.Error(err, "Error updating HAProxy Deployment") return result.Error(err) @@ -206,12 +214,9 @@ resolvers dns return haProxyData } -// createHAproxy Deployment -func (cc *ClusterContext) createHAProxyDeployment(meta metav1.ObjectMeta) error { - logger := cc.ReqLogger - logger.Info("Creating HAProxy Deployment") - client := cc.Client +func (cc *ClusterContext) createHAProxyDeploymentDef(meta metav1.ObjectMeta) *appsv1.Deployment { cr := cc.MarklogicCluster + selectorLabels := getHAProxySelectorLabels(cr.GetObjectMeta().GetName()) ownerDef := marklogicClusterAsOwner(cr) defaultMode := int32(420) deploymentDef := &appsv1.Deployment{ @@ -224,7 +229,7 @@ func (cc *ClusterContext) createHAProxyDeployment(meta metav1.ObjectMeta) error Spec: appsv1.DeploymentSpec{ Replicas: &cr.Spec.HAProxy.ReplicaCount, Selector: &metav1.LabelSelector{ - MatchLabels: meta.Labels, + MatchLabels: selectorLabels, }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ @@ -288,7 +293,14 @@ func (cc *ClusterContext) createHAProxyDeployment(meta metav1.ObjectMeta) error }) } AddOwnerRefToObject(deploymentDef, ownerDef) - logger.Info("===== HAProxy Deployment ==== ", "deployment:", deploymentDef) + return deploymentDef +} + +// createHAproxy Deployment +func (cc *ClusterContext) createHAProxyDeployment(deploymentDef *appsv1.Deployment) error { + logger := cc.ReqLogger + logger.Info("Creating HAProxy Deployment") + client := cc.Client err := client.Create(cc.Ctx, deploymentDef) if err != nil { logger.Error(err, "HAProxy Deployment creation failed") From c0c44d673fe76e120a14242b2a9609b8af08892b Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Tue, 3 Jun 2025 00:14:53 -0700 Subject: [PATCH 09/21] fix label for all services --- pkg/k8sutil/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/k8sutil/service.go b/pkg/k8sutil/service.go index e7e6e43..65f4d09 100644 --- a/pkg/k8sutil/service.go +++ b/pkg/k8sutil/service.go @@ -96,7 +96,7 @@ func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerRefe } func generateService(svcName string, cr *marklogicv1.MarklogicGroup) *corev1.Service { - labels := getSelectorLabels(cr.Spec.Name) + labels := getCommonLabels(cr.Spec.Name) var svcParams serviceParameters = serviceParameters{} svcParams = generateServiceParams(cr) svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations) From 6071d04b79f553d21f24f24c07a76bfc19ba181a Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 4 Jun 2025 15:29:28 -0700 Subject: [PATCH 10/21] remove debug logging --- pkg/k8sutil/haProxy.go | 2 -- pkg/k8sutil/marklogicServer.go | 4 ---- pkg/k8sutil/statefulset.go | 1 - 3 files changed, 7 deletions(-) diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 3c9bafd..0771ab1 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -81,7 +81,6 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { } if !patchDiff.IsEmpty() { logger.Info("MarkLogic HAProxy Config spec is different from previous spec, updating the HAProxy ConfigMap") - logger.Info(patchDiff.String()) configmap.Data = configMapDef.Data // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configmap); err != nil { // logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") @@ -107,7 +106,6 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { } if !patchDiff.IsEmpty() { logger.Info("HAProxy spec is different from the previous spec, updating the haproxy service") - logger.Info(patchDiff.String()) haproxyService.Spec = haproxyServiceDef.Spec haproxyService.ObjectMeta.Labels = haproxyServiceDef.ObjectMeta.Labels haproxyService.ObjectMeta.Annotations = haproxyServiceDef.ObjectMeta.Annotations diff --git a/pkg/k8sutil/marklogicServer.go b/pkg/k8sutil/marklogicServer.go index 7affbf8..4dae8d4 100644 --- a/pkg/k8sutil/marklogicServer.go +++ b/pkg/k8sutil/marklogicServer.go @@ -91,8 +91,6 @@ func GenerateMarkLogicGroupDef(cr *marklogicv1.MarklogicCluster, index int, para logger.Info("ReconcileMarkLogicCluster") labels := getCommonLabels(cr.ObjectMeta.Name) annotations := getCommonAnnotations() - logger.Info("!!!!MarkLogicGroupDef - Cluster Level Labels", "Cluster Level Labels", labels, "Annotations", annotations) - logger.Info("!!!!MarkLogicGroupDef - Group level Labels", "Group level Labels", params.Labels, "Annotations", params.Annotations) if params.Labels != nil { for key, value := range params.Labels { labels[key] = value @@ -103,7 +101,6 @@ func GenerateMarkLogicGroupDef(cr *marklogicv1.MarklogicCluster, index int, para annotations[key] = value } } - logger.Info("!!!!MarkLogicGroupDef - Computed Labels", "Computed Labels", labels, "Annotations", annotations) objectMeta := generateObjectMeta(cr.Spec.MarkLogicGroups[index].Name, cr.Namespace, labels, annotations) bootStrapHostName := "" bootStrapName := "" @@ -173,7 +170,6 @@ func (cc *ClusterContext) ReconsileMarklogicCluster() (reconcile.Result, error) namespacedName := types.NamespacedName{Name: name, Namespace: namespace} clusterParams := generateMarkLogicClusterParams(cr) params := generateMarkLogicGroupParams(cr, i, clusterParams) - logger.Info("!!! ReconcileCluster MarkLogicGroup", "MarkLogicGroupParams", params) markLogicGroupDef := GenerateMarkLogicGroupDef(operatorCR, i, params) logger.Info("###MarkLogicGroupDef", "MarkLogicGroupDef Labels", markLogicGroupDef.ObjectMeta.Labels) err := cc.Client.Get(cc.Ctx, namespacedName, currentMlg) diff --git a/pkg/k8sutil/statefulset.go b/pkg/k8sutil/statefulset.go index 1c07646..6277ec0 100644 --- a/pkg/k8sutil/statefulset.go +++ b/pkg/k8sutil/statefulset.go @@ -130,7 +130,6 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { logger.Error(err, "Error calculating patch") return result.Error(err).Output() } - logger.Info("****MarkLogic statefulSet patch diff", "diff", patchDiff) if !patchDiff.IsEmpty() { logger.Info("MarkLogic statefulSet spec is different from the MarkLogicGroup spec, updating the statefulSet") logger.Info(patchDiff.String()) From 798a754a21b32f53729001f22150dc521ae4b22c Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 4 Jun 2025 22:41:05 -0700 Subject: [PATCH 11/21] fix the bug with update panic --- internal/controller/marklogiccluster_controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/controller/marklogiccluster_controller.go b/internal/controller/marklogiccluster_controller.go index 5d0d923..42fc0a4 100644 --- a/internal/controller/marklogiccluster_controller.go +++ b/internal/controller/marklogiccluster_controller.go @@ -107,9 +107,9 @@ func markLogicClusterCreateUpdateDeletePredicate() predicate.Predicate { return true // Reconcile if labels have changed } // If annotations and labels are the same, check if the spec has changed - oldObj := e.ObjectOld.(*marklogicv1.MarklogicGroup) + oldObj := e.ObjectOld.(*marklogicv1.MarklogicCluster) // Check if the spec has changed - newObj := e.ObjectNew.(*marklogicv1.MarklogicGroup) + newObj := e.ObjectNew.(*marklogicv1.MarklogicCluster) if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { return true // Reconcile if spec has changed } From 234d59771c7a114d9cb9bf6d5befadd85464036c Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 4 Jun 2025 23:38:18 -0700 Subject: [PATCH 12/21] fix group level label not prompt to services --- api/v1/marklogicgroup_types.go | 6 ++++-- api/v1/zz_generated.deepcopy.go | 14 ++++++++++++++ .../marklogic.progress.com_marklogicgroups.yaml | 8 ++++++++ pkg/k8sutil/ingress.go | 1 - pkg/k8sutil/marklogicServer.go | 2 ++ pkg/k8sutil/networkPolicy.go | 1 - pkg/k8sutil/service.go | 6 ++++++ pkg/k8sutil/statefulset.go | 1 - 8 files changed, 34 insertions(+), 5 deletions(-) diff --git a/api/v1/marklogicgroup_types.go b/api/v1/marklogicgroup_types.go index 0b195b9..3ed957a 100644 --- a/api/v1/marklogicgroup_types.go +++ b/api/v1/marklogicgroup_types.go @@ -28,8 +28,10 @@ import ( // MarklogicGroupSpec defines the desired state of MarklogicGroup type MarklogicGroupSpec struct { // +kubebuilder:default:=1 - Replicas *int32 `json:"replicas,omitempty"` - Name string `json:"name,omitempty"` + Replicas *int32 `json:"replicas,omitempty"` + Name string `json:"name,omitempty"` + Labels map[string]string `json:"labels,omitempty"` + Annotations map[string]string `json:"annotations,omitempty"` // +kubebuilder:default:="cluster.local" ClusterDomain string `json:"clusterDomain,omitempty"` // +kubebuilder:default:="progressofficial/marklogic-db:11.3.0-ubi-rootless" diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index 1d3ad9b..8ab1994 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -565,6 +565,20 @@ func (in *MarklogicGroupSpec) DeepCopyInto(out *MarklogicGroupSpec) { *out = new(int32) **out = **in } + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Annotations != nil { + in, out := &in.Annotations, &out.Annotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } if in.ImagePullSecrets != nil { in, out := &in.ImagePullSecrets, &out.ImagePullSecrets *out = make([]corev1.LocalObjectReference, len(*in)) diff --git a/config/crd/bases/marklogic.progress.com_marklogicgroups.yaml b/config/crd/bases/marklogic.progress.com_marklogicgroups.yaml index dd3e351..3e17273 100644 --- a/config/crd/bases/marklogic.progress.com_marklogicgroups.yaml +++ b/config/crd/bases/marklogic.progress.com_marklogicgroups.yaml @@ -3250,6 +3250,10 @@ spec: x-kubernetes-list-type: atomic type: object type: object + annotations: + additionalProperties: + type: string + type: object auth: properties: adminPassword: @@ -3317,6 +3321,10 @@ spec: type: object x-kubernetes-map-type: atomic type: array + labels: + additionalProperties: + type: string + type: object license: properties: key: diff --git a/pkg/k8sutil/ingress.go b/pkg/k8sutil/ingress.go index e249722..a6bb30d 100644 --- a/pkg/k8sutil/ingress.go +++ b/pkg/k8sutil/ingress.go @@ -114,7 +114,6 @@ func (cc *ClusterContext) ReconcileIngress() result.ReconcileResult { } if !patchDiff.IsEmpty() { logger.Info("MarkLogic Ingress spec is different from the input Ingress spec, updating the Ingress") - logger.Info(patchDiff.String()) err := cc.Client.Update(cc.Ctx, ingressDef) if err != nil { logger.Error(err, "Error updating Ingress") diff --git a/pkg/k8sutil/marklogicServer.go b/pkg/k8sutil/marklogicServer.go index 4dae8d4..e4f07f3 100644 --- a/pkg/k8sutil/marklogicServer.go +++ b/pkg/k8sutil/marklogicServer.go @@ -125,6 +125,8 @@ func GenerateMarkLogicGroupDef(cr *marklogicv1.MarklogicCluster, index int, para Auth: params.Auth, ServiceAccountName: params.ServiceAccountName, Image: params.Image, + Labels: params.Labels, + Annotations: params.Annotations, ImagePullSecrets: params.ImagePullSecrets, License: params.License, TerminationGracePeriodSeconds: params.TerminationGracePeriodSeconds, diff --git a/pkg/k8sutil/networkPolicy.go b/pkg/k8sutil/networkPolicy.go index 30f6085..b904c79 100644 --- a/pkg/k8sutil/networkPolicy.go +++ b/pkg/k8sutil/networkPolicy.go @@ -85,7 +85,6 @@ func (cc *ClusterContext) ReconcileNetworkPolicy() result.ReconcileResult { } if !patchDiff.IsEmpty() { logger.Info("MarkLogic NetworkPolicy spec is different from the input NetworkPolicy spec, updating the NetworkPolicy") - logger.Info(patchDiff.String()) err := cc.Client.Update(cc.Ctx, networkPolicyDef) if err != nil { logger.Error(err, "Error updating NetworkPolicy") diff --git a/pkg/k8sutil/service.go b/pkg/k8sutil/service.go index 65f4d09..35bc807 100644 --- a/pkg/k8sutil/service.go +++ b/pkg/k8sutil/service.go @@ -97,6 +97,12 @@ func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerRefe func generateService(svcName string, cr *marklogicv1.MarklogicGroup) *corev1.Service { labels := getCommonLabels(cr.Spec.Name) + groupLabels := cr.Spec.Labels + if groupLabels != nil { + for key, value := range groupLabels { + labels[key] = value + } + } var svcParams serviceParameters = serviceParameters{} svcParams = generateServiceParams(cr) svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations) diff --git a/pkg/k8sutil/statefulset.go b/pkg/k8sutil/statefulset.go index 6277ec0..38c80f4 100644 --- a/pkg/k8sutil/statefulset.go +++ b/pkg/k8sutil/statefulset.go @@ -132,7 +132,6 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { } if !patchDiff.IsEmpty() { logger.Info("MarkLogic statefulSet spec is different from the MarkLogicGroup spec, updating the statefulSet") - logger.Info(patchDiff.String()) currentSts.Spec = statefulSetDef.Spec currentSts.ObjectMeta.Annotations = statefulSetDef.ObjectMeta.Annotations currentSts.ObjectMeta.Labels = statefulSetDef.ObjectMeta.Labels From f76cc4aadb69ef1ad03da6f72b322638109ca016 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Thu, 5 Jun 2025 23:20:20 -0700 Subject: [PATCH 13/21] update the Helm CRD --- .../templates/marklogiccluster-crd.yaml | 8 ++++++++ .../templates/marklogicgroup-crd.yaml | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/charts/marklogic-operator-kubernetes/templates/marklogiccluster-crd.yaml b/charts/marklogic-operator-kubernetes/templates/marklogiccluster-crd.yaml index e32fd07..da9351a 100644 --- a/charts/marklogic-operator-kubernetes/templates/marklogiccluster-crd.yaml +++ b/charts/marklogic-operator-kubernetes/templates/marklogiccluster-crd.yaml @@ -7965,6 +7965,10 @@ spec: x-kubernetes-list-type: atomic type: object type: object + annotations: + additionalProperties: + type: string + type: object groupConfig: default: enableXdqpSsl: true @@ -9331,6 +9335,10 @@ spec: isBootstrap: default: false type: boolean + labels: + additionalProperties: + type: string + type: object logCollection: properties: enabled: diff --git a/charts/marklogic-operator-kubernetes/templates/marklogicgroup-crd.yaml b/charts/marklogic-operator-kubernetes/templates/marklogicgroup-crd.yaml index f98bb1d..befd8a4 100644 --- a/charts/marklogic-operator-kubernetes/templates/marklogicgroup-crd.yaml +++ b/charts/marklogic-operator-kubernetes/templates/marklogicgroup-crd.yaml @@ -3243,6 +3243,10 @@ spec: x-kubernetes-list-type: atomic type: object type: object + annotations: + additionalProperties: + type: string + type: object auth: properties: adminPassword: @@ -3310,6 +3314,10 @@ spec: type: object x-kubernetes-map-type: atomic type: array + labels: + additionalProperties: + type: string + type: object license: properties: key: From 8f9c974877d78e5cb7d414b484b7894cd52ac7a7 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 16 Jun 2025 23:28:03 -0700 Subject: [PATCH 14/21] Fix Unit Test Failuer --- pkg/k8sutil/statefulset.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/k8sutil/statefulset.go b/pkg/k8sutil/statefulset.go index 38c80f4..c0eee37 100644 --- a/pkg/k8sutil/statefulset.go +++ b/pkg/k8sutil/statefulset.go @@ -65,8 +65,10 @@ type containerParameters struct { func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { cr := oc.GetMarkLogicServer() logger := oc.ReqLogger - // labels := getCommonLabels() - groupLabels := cr.GetLabels() + groupLabels := cr.Labels + if groupLabels == nil { + groupLabels = getSelectorLabels(cr.Spec.Name) + } groupLabels["app.kubernetes.io/instance"] = cr.Spec.Name groupAnnotations := cr.GetAnnotations() delete(groupAnnotations, "banzaicloud.com/last-applied") From c9cf1d32d54ccab26af16c8202558958bf44249c Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 16 Jun 2025 23:29:21 -0700 Subject: [PATCH 15/21] tidy code --- pkg/k8sutil/statefulset.go | 86 +++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/pkg/k8sutil/statefulset.go b/pkg/k8sutil/statefulset.go index c0eee37..8c690f3 100644 --- a/pkg/k8sutil/statefulset.go +++ b/pkg/k8sutil/statefulset.go @@ -89,40 +89,40 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { logger.Error(err, "Cannot create standalone statefulSet for MarkLogic") return result.Error(err).Output() } - // patchClient := client.MergeFrom(oc.MarklogicGroup.DeepCopy()) - // updated := false - // if currentSts.Status.ReadyReplicas == 0 || currentSts.Status.ReadyReplicas != currentSts.Status.Replicas { - // logger.Info("MarkLogic statefulSet is not ready, setting condition and requeue") - // condition := metav1.Condition{ - // Type: "Ready", - // Status: metav1.ConditionFalse, - // Reason: "MarkLogicGroupStatefulSetNotReady", - // Message: "MarkLogicGroup statefulSet is not ready", - // } - // updated = oc.setCondition(&condition) - // if updated { - // err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) - // if err != nil { - // oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") - // } - // } - // return result.Done().Output() - // } else { - // logger.Info("MarkLogic statefulSet is ready, setting condition") - // condition := metav1.Condition{ - // Type: "Ready", - // Status: metav1.ConditionTrue, - // Reason: "MarkLogicGroupStatefulSetReady", - // Message: "MarkLogicGroup statefulSet is ready", - // } - // updated = oc.setCondition(&condition) - // } - // if updated { - // err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) - // if err != nil { - // oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") - // } - // } + patchClient := client.MergeFrom(oc.MarklogicGroup.DeepCopy()) + updated := false + if currentSts.Status.ReadyReplicas == 0 || currentSts.Status.ReadyReplicas != currentSts.Status.Replicas { + logger.Info("MarkLogic statefulSet is not ready, setting condition and requeue") + condition := metav1.Condition{ + Type: "Ready", + Status: metav1.ConditionFalse, + Reason: "MarkLogicGroupStatefulSetNotReady", + Message: "MarkLogicGroup statefulSet is not ready", + } + updated = oc.setCondition(&condition) + if updated { + err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) + if err != nil { + oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") + } + } + return result.Done().Output() + } else { + logger.Info("MarkLogic statefulSet is ready, setting condition") + condition := metav1.Condition{ + Type: "Ready", + Status: metav1.ConditionTrue, + Reason: "MarkLogicGroupStatefulSetReady", + Message: "MarkLogicGroup statefulSet is ready", + } + updated = oc.setCondition(&condition) + } + if updated { + err := oc.Client.Status().Patch(oc.Ctx, oc.MarklogicGroup, patchClient) + if err != nil { + oc.ReqLogger.Error(err, "error updating the MarkLogic Operator Internal status") + } + } patchDiff, err := patch.DefaultPatchMaker.Calculate(currentSts, statefulSetDef, patch.IgnoreStatusFields(), @@ -145,15 +145,15 @@ func (oc *OperatorContext) ReconcileStatefulset() (reconcile.Result, error) { } else { logger.Info("MarkLogic statefulSet spec is the same as the current spec, no update needed") } - // logger.Info("Operator Status:", "Stage", cr.Status.Stage) - // if cr.Status.Stage == "STS_CREATED" { - // logger.Info("MarkLogic statefulSet created successfully, waiting for pods to be ready") - // pods, err := GetPodsForStatefulSet(cr.Namespace, cr.Spec.Name) - // if err != nil { - // logger.Error(err, "Error getting pods for statefulset") - // } - // logger.Info("Pods in statefulSet: ", "Pods", pods) - // } + logger.Info("Operator Status:", "Stage", cr.Status.Stage) + if cr.Status.Stage == "STS_CREATED" { + logger.Info("MarkLogic statefulSet created successfully, waiting for pods to be ready") + pods, err := GetPodsForStatefulSet(cr.Namespace, cr.Spec.Name) + if err != nil { + logger.Error(err, "Error getting pods for statefulset") + } + logger.Info("Pods in statefulSet: ", "Pods", pods) + } return result.Done().Output() } From 5d12f55dd7e795db413b7abb09de9ae88192b6ba Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 18 Jun 2025 00:11:58 -0700 Subject: [PATCH 16/21] add comment out back --- pkg/k8sutil/haProxy.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 0771ab1..9b9e550 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -41,9 +41,9 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { if err != nil { if errors.IsNotFound(err) { logger.Info("HAProxy ConfigMap is not found, creating a new one") - // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configMapDef); err != nil { - // logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") - // } + if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configMapDef); err != nil { + logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") + } err = cc.createConfigMapForCC(configMapDef) if err != nil { logger.Info("HAProxy configmap creation is failed") @@ -55,9 +55,9 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { logger.Info("HAProxy Deployment creation is failed") return result.Error(err) } - // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(haproxyServiceDef); err != nil { - // logger.Error(err, "Failed to set last applied annotation for HAProxy Service") - // } + if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(haproxyServiceDef); err != nil { + logger.Error(err, "Failed to set last applied annotation for HAProxy Service") + } err = cc.createHAProxyService(haproxyServiceDef) if err != nil { logger.Info("HAProxy Service creation is failed") @@ -82,9 +82,9 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { if !patchDiff.IsEmpty() { logger.Info("MarkLogic HAProxy Config spec is different from previous spec, updating the HAProxy ConfigMap") configmap.Data = configMapDef.Data - // if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configmap); err != nil { - // logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") - // } + if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(configmap); err != nil { + logger.Error(err, "Failed to set last applied annotation for HAProxy ConfigMap") + } err := cc.Client.Update(cc.Ctx, configmap) if err != nil { logger.Error(err, "Error updating MarkLogic HAProxy ConfigMap") From 35b6262ad9740e1acf30260850a34c8872ac8259 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 18 Jun 2025 00:31:26 -0700 Subject: [PATCH 17/21] remove excess logging --- pkg/k8sutil/marklogicServer.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/k8sutil/marklogicServer.go b/pkg/k8sutil/marklogicServer.go index e4f07f3..66f86dd 100644 --- a/pkg/k8sutil/marklogicServer.go +++ b/pkg/k8sutil/marklogicServer.go @@ -173,16 +173,13 @@ func (cc *ClusterContext) ReconsileMarklogicCluster() (reconcile.Result, error) clusterParams := generateMarkLogicClusterParams(cr) params := generateMarkLogicGroupParams(cr, i, clusterParams) markLogicGroupDef := GenerateMarkLogicGroupDef(operatorCR, i, params) - logger.Info("###MarkLogicGroupDef", "MarkLogicGroupDef Labels", markLogicGroupDef.ObjectMeta.Labels) err := cc.Client.Get(cc.Ctx, namespacedName, currentMlg) - logger.Info("###currentMlg", "currentMlg Labels", currentMlg.ObjectMeta.Labels) if err != nil { if apierrors.IsNotFound(err) { logger.Info("MarkLogicGroup resource not found. Creating a new one") if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(markLogicGroupDef); err != nil { logger.Error(err, "Failed to set last applied annotation") } - logger.Info("@@@@MarkLogicGroupDef", "MarkLogicGroupDef annotation", markLogicGroupDef.ObjectMeta.Annotations) err = cc.Client.Create(ctx, markLogicGroupDef) if err != nil { logger.Error(err, "Failed to create markLogicCluster") From 9ef531e014bd38fa8c6f173b54fa12ede67c53f1 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Wed, 18 Jun 2025 15:38:50 -0700 Subject: [PATCH 18/21] uncomment the logic in predicate --- .../controller/marklogiccluster_controller.go | 8 ++-- .../controller/marklogicgroup_controller.go | 41 +++++++++---------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/internal/controller/marklogiccluster_controller.go b/internal/controller/marklogiccluster_controller.go index 42fc0a4..2766e77 100644 --- a/internal/controller/marklogiccluster_controller.go +++ b/internal/controller/marklogiccluster_controller.go @@ -94,10 +94,10 @@ func markLogicClusterCreateUpdateDeletePredicate() predicate.Predicate { case *marklogicv1.MarklogicCluster: oldAnnotations := e.ObjectOld.GetAnnotations() newAnnotations := e.ObjectNew.GetAnnotations() - // delete(newAnnotations, "banzaicloud.com/last-applied") - // delete(oldAnnotations, "banzaicloud.com/last-applied") - // delete(newAnnotations, "kubectl.kubernetes.io/last-applied-configuration") - // delete(oldAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + delete(newAnnotations, "banzaicloud.com/last-applied") + delete(oldAnnotations, "banzaicloud.com/last-applied") + delete(newAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + delete(oldAnnotations, "kubectl.kubernetes.io/last-applied-configuration") if !reflect.DeepEqual(oldAnnotations, newAnnotations) { return true // Reconcile if annotations have changed } diff --git a/internal/controller/marklogicgroup_controller.go b/internal/controller/marklogicgroup_controller.go index e534c71..0c02ba8 100644 --- a/internal/controller/marklogicgroup_controller.go +++ b/internal/controller/marklogicgroup_controller.go @@ -104,27 +104,26 @@ func markLogicGroupCreateUpdateDeletePredicate() predicate.Predicate { UpdateFunc: func(e event.UpdateEvent) bool { switch e.ObjectNew.(type) { case *marklogicv1.MarklogicGroup: - return true // Reconcile on update of MarklogicGroup - // oldAnnotations := e.ObjectOld.GetAnnotations() - // newAnnotations := e.ObjectNew.GetAnnotations() - // delete(newAnnotations, "banzaicloud.com/last-applied") - // delete(oldAnnotations, "banzaicloud.com/last-applied") - // delete(newAnnotations, "kubectl.kubernetes.io/last-applied-configuration") - // delete(oldAnnotations, "kubectl.kubernetes.io/last-applied-configuration") - // if !reflect.DeepEqual(oldAnnotations, newAnnotations) { - // return true // Reconcile if annotations have changed - // } - // oldLables := e.ObjectOld.GetLabels() - // newLabels := e.ObjectNew.GetLabels() - // if !reflect.DeepEqual(oldLables, newLabels) { - // return true // Reconcile if labels have changed - // } - // oldObj := e.ObjectOld.(*marklogicv1.MarklogicGroup) - // newObj := e.ObjectNew.(*marklogicv1.MarklogicGroup) - // if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { - // return true // Reconcile if the spec has changed - // } - // return false + oldAnnotations := e.ObjectOld.GetAnnotations() + newAnnotations := e.ObjectNew.GetAnnotations() + delete(newAnnotations, "banzaicloud.com/last-applied") + delete(oldAnnotations, "banzaicloud.com/last-applied") + delete(newAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + delete(oldAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + if !reflect.DeepEqual(oldAnnotations, newAnnotations) { + return true // Reconcile if annotations have changed + } + oldLables := e.ObjectOld.GetLabels() + newLabels := e.ObjectNew.GetLabels() + if !reflect.DeepEqual(oldLables, newLabels) { + return true // Reconcile if labels have changed + } + oldObj := e.ObjectOld.(*marklogicv1.MarklogicGroup) + newObj := e.ObjectNew.(*marklogicv1.MarklogicGroup) + if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + return true // Reconcile if the spec has changed + } + return false case *appsv1.StatefulSet: return true // Reconcile on update of StatefulSet case *corev1.Service: From aa5a65152fc5a8e3d8493067e81336db438c7870 Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Sun, 22 Jun 2025 23:43:52 -0700 Subject: [PATCH 19/21] improve timeout for testing --- test/e2e/2_marklogic_cluster_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/e2e/2_marklogic_cluster_test.go b/test/e2e/2_marklogic_cluster_test.go index ffd8609..a8e34fc 100644 --- a/test/e2e/2_marklogic_cluster_test.go +++ b/test/e2e/2_marklogic_cluster_test.go @@ -114,7 +114,7 @@ type DataSource struct { } func TestMarklogicCluster(t *testing.T) { - feature := features.New("Marklogic Cluster Test") + feature := features.New("Marklogic Cluster Test").WithLabel("type", "cluster-test") // Setup Loki and Grafana to verify Logging for Operator feature.Setup(func(ctx context.Context, t *testing.T, c *envconf.Config) context.Context { @@ -228,7 +228,7 @@ func TestMarklogicCluster(t *testing.T) { client := c.Client() podName := "node-0" - err := utils.WaitForPod(ctx, t, client, mlNamespace, podName, 120*time.Second) + err := utils.WaitForPod(ctx, t, client, mlNamespace, podName, 180*time.Second) if err != nil { t.Fatalf("Failed to wait for pod creation: %v", err) } @@ -300,7 +300,7 @@ func TestMarklogicCluster(t *testing.T) { if err != nil { t.Fatalf("Failed to execute kubectl command in grafana pod: %v", err) } - // t.Logf("Query datasource response: %s", output) + t.Logf("Query datasource response: %s", output) // Verify MarkLogic logs in Grafana using Loki and Fluent Bit if !(strings.Contains(string(output), "Starting MarkLogic Server")) { t.Fatal("Failed to Query datasource") From b02bcbd61995762a62144a1f781609164d4be26f Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 23 Jun 2025 09:58:48 -0700 Subject: [PATCH 20/21] Fix typo --- pkg/k8sutil/haProxy.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/k8sutil/haProxy.go b/pkg/k8sutil/haProxy.go index 9b9e550..4de8312 100644 --- a/pkg/k8sutil/haProxy.go +++ b/pkg/k8sutil/haProxy.go @@ -116,8 +116,6 @@ func (cc *ClusterContext) ReconcileHAProxy() result.ReconcileResult { } } - // Check if the HAProxy Deployment is updated - logger.Info("!!@@##Checking if HAProxy Deployment is updated", "labels:", labels) haproxyDeployment := &appsv1.Deployment{} deployName := types.NamespacedName{Name: "marklogic-haproxy", Namespace: cr.Namespace} err = client.Get(cc.Ctx, deployName, haproxyDeployment) @@ -365,7 +363,7 @@ func (cc *ClusterContext) generateHaproxyServiceDef(meta metav1.ObjectMeta) *cor Port: cr.Spec.HAProxy.Stats.Port, }) } - selectorLables := getHAProxyLabels(cr.GetObjectMeta().GetName()) + selectorLabels := getHAProxyLabels(cr.GetObjectMeta().GetName()) serviceDef := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: "marklogic-haproxy", @@ -374,7 +372,7 @@ func (cc *ClusterContext) generateHaproxyServiceDef(meta metav1.ObjectMeta) *cor Annotations: meta.Annotations, }, Spec: corev1.ServiceSpec{ - Selector: selectorLables, + Selector: selectorLabels, Ports: servicePort, Type: corev1.ServiceTypeClusterIP, }, From 59536fa0f1ab9e3c5388b13de853d1cdbbbdce0c Mon Sep 17 00:00:00 2001 From: Peng Zhou Date: Mon, 23 Jun 2025 10:03:09 -0700 Subject: [PATCH 21/21] add label and annotation sample for complete.yaml --- config/samples/complete.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/samples/complete.yaml b/config/samples/complete.yaml index 56e7233..8c5d325 100644 --- a/config/samples/complete.yaml +++ b/config/samples/complete.yaml @@ -195,6 +195,10 @@ spec: # additionalVolumeClaimTemplates: [] markLogicGroups: - name: dnode + labels: + group-level-label: "group-level-label" + annotations: + group-level-annotation: "group-level-annotation" replicas: 3 groupConfig: name: dnode