From c0b1c7091d9dfdd789370454422fd2d13e3b56da Mon Sep 17 00:00:00 2001 From: Pritesh Pagar Date: Thu, 20 Mar 2025 10:05:24 +0530 Subject: [PATCH 1/6] Add reconciliation phase in status field * Status will have a new field Phase to show reconciliation phase, such as - Ready, ApplyingChanges, Invalid --- api/v1/hbase_types.go | 15 +++++++ .../crd/bases/hbase.elenskiy.co_hbases.yaml | 4 ++ internal/controller/hbase_controller.go | 22 +++++++++ internal/controller/hbase_controller_test.go | 45 +++++++++++++++++++ 4 files changed, 86 insertions(+) diff --git a/api/v1/hbase_types.go b/api/v1/hbase_types.go index c32cbfa..9d43bb1 100644 --- a/api/v1/hbase_types.go +++ b/api/v1/hbase_types.go @@ -69,10 +69,25 @@ type ServerSpec struct { Count int32 `json:"count,omitempty"` } +// HBasePhase is the phase HBase is in from the controller point of view. +type HBasePhase string + +const ( + // HBaseReadyPhase is operating at the desired spec. + HBaseReadyPhase HBasePhase = "Ready" + // HBaseApplyingChangesPhase controller is working towards a desired state. + HBaseApplyingChangesPhase HBasePhase = "ApplyingChanges" + // HBaseResourceInvalid is marking a resource as invalid, should never happen if admission control is installed correctly. + HBaseResourceInvalidPhase HBasePhase = "Invalid" +) + // HBaseStatus defines the observed state of HBase type HBaseStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file + + // Phase is a reconciliation phase of hbase + Phase HBasePhase `json:"phase,omitempty"` } //+kubebuilder:object:root=true diff --git a/config/crd/bases/hbase.elenskiy.co_hbases.yaml b/config/crd/bases/hbase.elenskiy.co_hbases.yaml index e702ca5..07a0183 100644 --- a/config/crd/bases/hbase.elenskiy.co_hbases.yaml +++ b/config/crd/bases/hbase.elenskiy.co_hbases.yaml @@ -15044,6 +15044,10 @@ spec: type: object status: description: HBaseStatus defines the observed state of HBase + properties: + phase: + description: Phase is a reconciliation phase of hbase + type: string type: object type: object served: true diff --git a/internal/controller/hbase_controller.go b/internal/controller/hbase_controller.go index ea3c0e0..cdf4490 100644 --- a/internal/controller/hbase_controller.go +++ b/internal/controller/hbase_controller.go @@ -75,13 +75,21 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } log.Info("got HBase CRD") + if app.Status.Phase == "" { + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + } + + // Update the state when this function exits + defer r.Status().Update(ctx, app) serviceOk, err := r.ensureService(app) if err != nil { + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } if !serviceOk { log.Info("HBase service reconfigured, reconciling again") + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{Requeue: true}, nil } log.Info("HBase headless service is in sync") @@ -90,10 +98,12 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl configMapName := getConfigMapName(app) cmOk, err := r.ensureConfigMap(app, configMapName) if err != nil { + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } if !cmOk { log.Info("HBase ConfigMap reconfigured, reconciling again") + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{Requeue: true}, nil } log.Info("HBase ConfigMap is in sync") @@ -103,10 +113,12 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl masterSts, masterUpdated, err := r.ensureStatefulSet(app, masterName, configMapName, app.Spec.MasterSpec) if err != nil { r.Log.Error(err, "Failed reconciling HBase Master StatefulSet") + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } if masterUpdated { log.Info("HBase Master StatefulSet updated, reconciling again") + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{Requeue: true}, nil } log.Info("HBase Master StatefulSet is in sync") @@ -116,10 +128,12 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl rsSts, rsUpdated, err := r.ensureStatefulSet(app, rsName, configMapName, app.Spec.RegionServerSpec) if err != nil { r.Log.Error(err, "Failed reconciling HBase RegionServer StatefulSet") + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } if rsUpdated { log.Info("HBase RegionServer StatefulSet updated") + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{Requeue: true}, nil } log.Info("RegionServer StatefulSet is in sync") @@ -129,10 +143,12 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl // be able to fix incorrect config and not fight with operator rit, err := r.regionsInTransition() if err != nil { + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, fmt.Errorf("failed to get regions in transition: %v", err) } if rit != 0 { log.Info("There are regions in transition, wait and restart reconciling", "regions", rit) + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{RequeueAfter: 10 * time.Second}, nil } log.Info("There are no regions in transition") @@ -141,9 +157,11 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl mastersOk, err := r.ensureStatefulSetPods(ctx, masterSts, r.pickMasterToDelete) if err != nil { r.Log.Error(err, "Failed reconciling HBase Master pods") + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } if !mastersOk { + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{RequeueAfter: 15 * time.Second}, nil } @@ -151,18 +169,22 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl rsOk, err := r.ensureStatefulSetPods(ctx, rsSts, r.pickRegionServerToDelete) if err != nil { r.Log.Error(err, "Failed reconciling HBase RegionServer pods") + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } if !rsOk { + app.Status.Phase = hbasev1.HBaseApplyingChangesPhase return ctrl.Result{RequeueAfter: 15 * time.Second}, nil } r.Log.Info("Deleting unused config maps") if err := r.deleteUnusedConfigMaps(ctx, app, configMapName); err != nil { + app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err } r.Log.Info("Everything is up to date!") + app.Status.Phase = hbasev1.HBaseReadyPhase return ctrl.Result{}, nil } diff --git a/internal/controller/hbase_controller_test.go b/internal/controller/hbase_controller_test.go index 330d8d5..68cd4b8 100644 --- a/internal/controller/hbase_controller_test.go +++ b/internal/controller/hbase_controller_test.go @@ -261,6 +261,12 @@ var _ = Describe("HBase controller", func() { hb.Spec.RegionServerSpec.Count = 3 Expect(k8sClient.Update(ctx, hb)).Should(Succeed()) + By("By checking phase in status is ApplyingChanges") + Eventually(func() bool { + k8sClient.Get(ctx, hbaseLookupKey, hb) + return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase + }, 2*time.Second, 1*time.Millisecond).Should(BeTrue()) + By("By checking HBase deployed new config map") Eventually(func() ([]corev1.ConfigMap, error) { configMapList := &corev1.ConfigMapList{} @@ -318,6 +324,15 @@ var _ = Describe("HBase controller", func() { return int(*updatedRsSts.Spec.Replicas), nil }, timeout, interval).Should(Equal(3)) + By("By checking phase in status is Reconciled") + Eventually(func() bool { + err := k8sClient.Get(ctx, hbaseLookupKey, hb) + if err != nil { + return false + } + return hb.Status.Phase == hbasev1.HBaseReadyPhase + }, timeout, interval).Should(BeTrue()) + // --------------------------- TEST 2 --------------------------- // Clear test vars getExistingCm() @@ -332,6 +347,12 @@ var _ = Describe("HBase controller", func() { hb.Spec.RegionServerSpec.Count = 5 Expect(k8sClient.Update(ctx, hb)).Should(Succeed()) + By("By checking phase in status is ApplyingChanges") + Eventually(func() bool { + k8sClient.Get(ctx, hbaseLookupKey, hb) + return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase + }, 2*time.Second, 1*time.Millisecond).Should(BeTrue()) + By("By checking HBase configmap was not updated") Eventually(func() ([]corev1.ConfigMap, error) { configMapList := &corev1.ConfigMapList{} @@ -389,6 +410,15 @@ var _ = Describe("HBase controller", func() { return int(*updatedRsSts.Spec.Replicas), nil }, timeout, interval).Should(Equal(5)) + By("By checking phase in status is Reconciled") + Eventually(func() bool { + err := k8sClient.Get(ctx, hbaseLookupKey, hb) + if err != nil { + return false + } + return hb.Status.Phase == hbasev1.HBaseReadyPhase + }, timeout, interval).Should(BeTrue()) + // --------------------------- TEST 3 --------------------------- // Clear test vars getExistingCm() @@ -404,6 +434,12 @@ var _ = Describe("HBase controller", func() { hb.Spec.RegionServerSpec.Count = 3 Expect(k8sClient.Update(ctx, hb)).Should(Succeed()) + By("By checking phase in status is ApplyingChanges") + Eventually(func() bool { + k8sClient.Get(ctx, hbaseLookupKey, hb) + return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase + }, 2*time.Second, 1*time.Millisecond).Should(BeTrue()) + By("By checking HBase configmap is updated") Eventually(func() ([]corev1.ConfigMap, error) { configMapList := &corev1.ConfigMapList{} @@ -461,6 +497,15 @@ var _ = Describe("HBase controller", func() { return int(*updatedRsSts.Spec.Replicas), nil }, timeout, interval).Should(Equal(3)) + By("By checking phase in status is Reconciled") + Eventually(func() bool { + err := k8sClient.Get(ctx, hbaseLookupKey, hb) + if err != nil { + return false + } + return hb.Status.Phase == hbasev1.HBaseReadyPhase + }, timeout, interval).Should(BeTrue()) + }) }) }) From 7eefb13203d321d155251fbd7f8d18d32dc2c150 Mon Sep 17 00:00:00 2001 From: Pritesh Pagar Date: Fri, 21 Mar 2025 14:15:21 +0530 Subject: [PATCH 2/6] controllers: expose controller phase as metric --- internal/controller/hbase_controller.go | 18 +++++++++++- internal/controller/hbase_controller_extra.go | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/internal/controller/hbase_controller.go b/internal/controller/hbase_controller.go index cdf4490..97a2e09 100644 --- a/internal/controller/hbase_controller.go +++ b/internal/controller/hbase_controller.go @@ -26,8 +26,10 @@ import ( "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/metrics" "github.com/go-logr/logr" + "github.com/prometheus/client_golang/prometheus" hbasev1 "github.com/timoha/hbase-k8s-operator/api/v1" "github.com/tsuna/gohbase" ) @@ -41,6 +43,16 @@ type HBaseReconciler struct { GhAdmin gohbase.AdminClient } +var ( + hbaseReconciliationPhaseMetric = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "hbase_reconciliation_phase", + Help: `Current phase of HBase (1=ApplyingChanges, 2=Ready, 3=Invalid, 0=Unknown)`, + }, + []string{"namespace", "name"}, + ) +) + //+kubebuilder:rbac:groups=hbase.elenskiy.co,resources=hbases,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=hbase.elenskiy.co,resources=hbases/status,verbs=get;update;patch //+kubebuilder:rbac:groups=hbase.elenskiy.co,resources=hbases/finalizers,verbs=update @@ -80,7 +92,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } // Update the state when this function exits - defer r.Status().Update(ctx, app) + defer r.updateStatus(ctx, app) serviceOk, err := r.ensureService(app) if err != nil { @@ -197,3 +209,7 @@ func (r *HBaseReconciler) SetupWithManager(mgr ctrl.Manager) error { Owns(&appsv1.StatefulSet{}). Complete(r) } + +func init() { + metrics.Registry.MustRegister(hbaseReconciliationPhaseMetric) +} diff --git a/internal/controller/hbase_controller_extra.go b/internal/controller/hbase_controller_extra.go index 0856823..778a5e3 100644 --- a/internal/controller/hbase_controller_extra.go +++ b/internal/controller/hbase_controller_extra.go @@ -56,6 +56,13 @@ const ( headlessServiceName = "hbase" ) +const ( + hbasePhaseUnknown float64 = iota + hbasePhaseApplyingChanges + hbasePhaseReady + hbasePhaseResourceInvalid +) + func (r *HBaseReconciler) ensureConfigMap(hb *hbasev1.HBase, name types.NamespacedName) (bool, error) { configMap := &corev1.ConfigMap{} if err := r.Get(context.TODO(), name, configMap); err != nil { @@ -626,3 +633,25 @@ func (r *HBaseReconciler) headlessService(hb *hbasev1.HBase) *corev1.Service { _ = controllerutil.SetControllerReference(hb, srv, r.Scheme) return srv } + +// updateStatus updates the status of hbase and exposes same as a metrics +func (r *HBaseReconciler) updateStatus(ctx context.Context, hb *hbasev1.HBase) { + updateReconciliationPhaseMetrics(hb) + r.Status().Update(ctx, hb) +} + +// updates reconciliation phase metrics +func updateReconciliationPhaseMetrics(hb *hbasev1.HBase) { + var phaseToStatusValue = map[hbasev1.HBasePhase]float64{ + hbasev1.HBaseApplyingChangesPhase: hbasePhaseApplyingChanges, + hbasev1.HBaseReadyPhase: hbasePhaseReady, + hbasev1.HBaseResourceInvalidPhase: hbasePhaseResourceInvalid, + } + + statusValue, exists := phaseToStatusValue[hb.Status.Phase] + if !exists { + statusValue = hbasePhaseUnknown + } + + hbaseReconciliationPhaseMetric.WithLabelValues(hb.Namespace, hb.Name).Set(statusValue) +} From 9bbf5555d467970b29ad8df699b0e4dfed49a1f9 Mon Sep 17 00:00:00 2001 From: Pritesh Pagar Date: Fri, 21 Mar 2025 17:44:08 +0530 Subject: [PATCH 3/6] controller: address review comments to expose phase as metric --- internal/controller/hbase_controller.go | 13 ++++++-- internal/controller/hbase_controller_extra.go | 31 +++++-------------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/internal/controller/hbase_controller.go b/internal/controller/hbase_controller.go index 97a2e09..10e6999 100644 --- a/internal/controller/hbase_controller.go +++ b/internal/controller/hbase_controller.go @@ -43,13 +43,20 @@ type HBaseReconciler struct { GhAdmin gohbase.AdminClient } +const ( + promNamespace = "hbase" + promSubsystem = "operator" +) + var ( hbaseReconciliationPhaseMetric = prometheus.NewGaugeVec( prometheus.GaugeOpts{ - Name: "hbase_reconciliation_phase", - Help: `Current phase of HBase (1=ApplyingChanges, 2=Ready, 3=Invalid, 0=Unknown)`, + Name: "reconciliation_phase", + Help: "Current reconciliation phase of HBase", + Namespace: promNamespace, + Subsystem: promSubsystem, }, - []string{"namespace", "name"}, + []string{"namespace", "name", "phase"}, ) ) diff --git a/internal/controller/hbase_controller_extra.go b/internal/controller/hbase_controller_extra.go index 778a5e3..87b45bc 100644 --- a/internal/controller/hbase_controller_extra.go +++ b/internal/controller/hbase_controller_extra.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/davecgh/go-spew/spew" + "github.com/prometheus/client_golang/prometheus" hbasev1 "github.com/timoha/hbase-k8s-operator/api/v1" "github.com/tsuna/gohbase/hrpc" appsv1 "k8s.io/api/apps/v1" @@ -56,13 +57,6 @@ const ( headlessServiceName = "hbase" ) -const ( - hbasePhaseUnknown float64 = iota - hbasePhaseApplyingChanges - hbasePhaseReady - hbasePhaseResourceInvalid -) - func (r *HBaseReconciler) ensureConfigMap(hb *hbasev1.HBase, name types.NamespacedName) (bool, error) { configMap := &corev1.ConfigMap{} if err := r.Get(context.TODO(), name, configMap); err != nil { @@ -636,22 +630,11 @@ func (r *HBaseReconciler) headlessService(hb *hbasev1.HBase) *corev1.Service { // updateStatus updates the status of hbase and exposes same as a metrics func (r *HBaseReconciler) updateStatus(ctx context.Context, hb *hbasev1.HBase) { - updateReconciliationPhaseMetrics(hb) - r.Status().Update(ctx, hb) -} + // update reconciliation phase metrics + hbaseReconciliationPhaseMetric.DeletePartialMatch( + prometheus.Labels{"namespace": hb.Namespace, "name": hb.Name}) + hbaseReconciliationPhaseMetric.WithLabelValues( + hb.Namespace, hb.Name, string(hb.Status.Phase)).Set(1) -// updates reconciliation phase metrics -func updateReconciliationPhaseMetrics(hb *hbasev1.HBase) { - var phaseToStatusValue = map[hbasev1.HBasePhase]float64{ - hbasev1.HBaseApplyingChangesPhase: hbasePhaseApplyingChanges, - hbasev1.HBaseReadyPhase: hbasePhaseReady, - hbasev1.HBaseResourceInvalidPhase: hbasePhaseResourceInvalid, - } - - statusValue, exists := phaseToStatusValue[hb.Status.Phase] - if !exists { - statusValue = hbasePhaseUnknown - } - - hbaseReconciliationPhaseMetric.WithLabelValues(hb.Namespace, hb.Name).Set(statusValue) + r.Status().Update(ctx, hb) } From e5e02ec43a8560e62a3496075f3509d1a5449569 Mon Sep 17 00:00:00 2001 From: Pritesh Pagar Date: Mon, 24 Mar 2025 14:49:10 +0530 Subject: [PATCH 4/6] controller: show reconciliation progress in status - add a new field reconcile progress in status do donote what exactly reconciler is doing - expose progress as a prom metrics as well --- api/v1/hbase_types.go | 17 +++++++++++++++++ config/crd/bases/hbase.elenskiy.co_hbases.yaml | 3 +++ internal/controller/hbase_controller.go | 15 ++++++++++++--- internal/controller/hbase_controller_extra.go | 2 +- internal/controller/hbase_controller_test.go | 18 ++++++++++++------ 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/api/v1/hbase_types.go b/api/v1/hbase_types.go index 9d43bb1..c3a7604 100644 --- a/api/v1/hbase_types.go +++ b/api/v1/hbase_types.go @@ -81,6 +81,20 @@ const ( HBaseResourceInvalidPhase HBasePhase = "Invalid" ) +type HBaseProgress string + +const ( + HBaseProgressUpdatingService HBaseProgress = "UpdatingService" + HBaseProgressUpdatingCM HBaseProgress = "UpdatingConfigMap" + HBaseProgressUpdatingMasters HBaseProgress = "UpdatingMasters" + HBaseProgressUpdatingRS HBaseProgress = "UpdatingRegionServers" + HBaseProgressWaitingRegionTransition HBaseProgress = "WaitingRegionTransition" + HBaseProgressWaitingMasters HBaseProgress = "WaitingMasterPods" + HBaseProgressWaitingRS HBaseProgress = "WaitingRegionServerPods" + HBaseProgressDelUnusedCM HBaseProgress = "DeletingUnusedConfigMaps" + HBaseProgressReady HBaseProgress = "Ready" +) + // HBaseStatus defines the observed state of HBase type HBaseStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster @@ -88,6 +102,9 @@ type HBaseStatus struct { // Phase is a reconciliation phase of hbase Phase HBasePhase `json:"phase,omitempty"` + + // ReconcileProgress is a reconcilation progress of hbase + ReconcileProgress HBaseProgress `json:"reconcileprogress,omitempty"` } //+kubebuilder:object:root=true diff --git a/config/crd/bases/hbase.elenskiy.co_hbases.yaml b/config/crd/bases/hbase.elenskiy.co_hbases.yaml index 07a0183..6dc8a2e 100644 --- a/config/crd/bases/hbase.elenskiy.co_hbases.yaml +++ b/config/crd/bases/hbase.elenskiy.co_hbases.yaml @@ -15048,6 +15048,9 @@ spec: phase: description: Phase is a reconciliation phase of hbase type: string + reconcileprogress: + description: ReconcileProgress is a reconcilation progress of hbase + type: string type: object type: object served: true diff --git a/internal/controller/hbase_controller.go b/internal/controller/hbase_controller.go index 10e6999..4f89969 100644 --- a/internal/controller/hbase_controller.go +++ b/internal/controller/hbase_controller.go @@ -51,12 +51,12 @@ const ( var ( hbaseReconciliationPhaseMetric = prometheus.NewGaugeVec( prometheus.GaugeOpts{ - Name: "reconciliation_phase", - Help: "Current reconciliation phase of HBase", + Name: "reconciliation_status", + Help: "Current reconciliation status of HBase", Namespace: promNamespace, Subsystem: promSubsystem, }, - []string{"namespace", "name", "phase"}, + []string{"namespace", "name", "phase", "progress"}, ) ) @@ -109,6 +109,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl if !serviceOk { log.Info("HBase service reconfigured, reconciling again") app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressUpdatingService return ctrl.Result{Requeue: true}, nil } log.Info("HBase headless service is in sync") @@ -123,6 +124,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl if !cmOk { log.Info("HBase ConfigMap reconfigured, reconciling again") app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressUpdatingCM return ctrl.Result{Requeue: true}, nil } log.Info("HBase ConfigMap is in sync") @@ -138,6 +140,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl if masterUpdated { log.Info("HBase Master StatefulSet updated, reconciling again") app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressUpdatingMasters return ctrl.Result{Requeue: true}, nil } log.Info("HBase Master StatefulSet is in sync") @@ -153,6 +156,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl if rsUpdated { log.Info("HBase RegionServer StatefulSet updated") app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressUpdatingRS return ctrl.Result{Requeue: true}, nil } log.Info("RegionServer StatefulSet is in sync") @@ -168,6 +172,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl if rit != 0 { log.Info("There are regions in transition, wait and restart reconciling", "regions", rit) app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressWaitingRegionTransition return ctrl.Result{RequeueAfter: 10 * time.Second}, nil } log.Info("There are no regions in transition") @@ -181,6 +186,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } if !mastersOk { app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressWaitingMasters return ctrl.Result{RequeueAfter: 15 * time.Second}, nil } @@ -193,10 +199,12 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } if !rsOk { app.Status.Phase = hbasev1.HBaseApplyingChangesPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressWaitingRS return ctrl.Result{RequeueAfter: 15 * time.Second}, nil } r.Log.Info("Deleting unused config maps") + app.Status.ReconcileProgress = hbasev1.HBaseProgressDelUnusedCM if err := r.deleteUnusedConfigMaps(ctx, app, configMapName); err != nil { app.Status.Phase = hbasev1.HBaseResourceInvalidPhase return ctrl.Result{}, err @@ -204,6 +212,7 @@ func (r *HBaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl r.Log.Info("Everything is up to date!") app.Status.Phase = hbasev1.HBaseReadyPhase + app.Status.ReconcileProgress = hbasev1.HBaseProgressReady return ctrl.Result{}, nil } diff --git a/internal/controller/hbase_controller_extra.go b/internal/controller/hbase_controller_extra.go index 87b45bc..dac3c0d 100644 --- a/internal/controller/hbase_controller_extra.go +++ b/internal/controller/hbase_controller_extra.go @@ -634,7 +634,7 @@ func (r *HBaseReconciler) updateStatus(ctx context.Context, hb *hbasev1.HBase) { hbaseReconciliationPhaseMetric.DeletePartialMatch( prometheus.Labels{"namespace": hb.Namespace, "name": hb.Name}) hbaseReconciliationPhaseMetric.WithLabelValues( - hb.Namespace, hb.Name, string(hb.Status.Phase)).Set(1) + hb.Namespace, hb.Name, string(hb.Status.Phase), string(hb.Status.ReconcileProgress)).Set(1) r.Status().Update(ctx, hb) } diff --git a/internal/controller/hbase_controller_test.go b/internal/controller/hbase_controller_test.go index 68cd4b8..185cf0a 100644 --- a/internal/controller/hbase_controller_test.go +++ b/internal/controller/hbase_controller_test.go @@ -264,7 +264,8 @@ var _ = Describe("HBase controller", func() { By("By checking phase in status is ApplyingChanges") Eventually(func() bool { k8sClient.Get(ctx, hbaseLookupKey, hb) - return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase + return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase && + hb.Status.ReconcileProgress == hbasev1.HBaseProgressUpdatingCM }, 2*time.Second, 1*time.Millisecond).Should(BeTrue()) By("By checking HBase deployed new config map") @@ -330,7 +331,8 @@ var _ = Describe("HBase controller", func() { if err != nil { return false } - return hb.Status.Phase == hbasev1.HBaseReadyPhase + return hb.Status.Phase == hbasev1.HBaseReadyPhase && + hb.Status.ReconcileProgress == hbasev1.HBaseProgressReady }, timeout, interval).Should(BeTrue()) // --------------------------- TEST 2 --------------------------- @@ -350,7 +352,8 @@ var _ = Describe("HBase controller", func() { By("By checking phase in status is ApplyingChanges") Eventually(func() bool { k8sClient.Get(ctx, hbaseLookupKey, hb) - return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase + return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase && + hb.Status.ReconcileProgress == hbasev1.HBaseProgressUpdatingMasters }, 2*time.Second, 1*time.Millisecond).Should(BeTrue()) By("By checking HBase configmap was not updated") @@ -416,7 +419,8 @@ var _ = Describe("HBase controller", func() { if err != nil { return false } - return hb.Status.Phase == hbasev1.HBaseReadyPhase + return hb.Status.Phase == hbasev1.HBaseReadyPhase && + hb.Status.ReconcileProgress == hbasev1.HBaseProgressReady }, timeout, interval).Should(BeTrue()) // --------------------------- TEST 3 --------------------------- @@ -437,7 +441,8 @@ var _ = Describe("HBase controller", func() { By("By checking phase in status is ApplyingChanges") Eventually(func() bool { k8sClient.Get(ctx, hbaseLookupKey, hb) - return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase + return hb.Status.Phase == hbasev1.HBaseApplyingChangesPhase && + hb.Status.ReconcileProgress == hbasev1.HBaseProgressUpdatingCM }, 2*time.Second, 1*time.Millisecond).Should(BeTrue()) By("By checking HBase configmap is updated") @@ -503,7 +508,8 @@ var _ = Describe("HBase controller", func() { if err != nil { return false } - return hb.Status.Phase == hbasev1.HBaseReadyPhase + return hb.Status.Phase == hbasev1.HBaseReadyPhase && + hb.Status.ReconcileProgress == hbasev1.HBaseProgressReady }, timeout, interval).Should(BeTrue()) }) From 37d52b42d560baf79880ee510836d2f4ba4f7152 Mon Sep 17 00:00:00 2001 From: Tomas Baltrunas Date: Tue, 15 Apr 2025 07:35:46 +0100 Subject: [PATCH 5/6] Add zkroot flag Allow overriding the default hbase znode parent used by gohbase admin client Needed for running multiple hbase clusters on the same zookeeper cluster, e.g. for replication between hbases. Tested by running `go run ./cmd/ -zkroot=/hbase-test` and observing ``` failed to read the /hbase-test/master znode: zk: could not connect to a server ``` in the output. --- cmd/main.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/main.go b/cmd/main.go index f5583c5..8a1fe02 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -57,6 +57,7 @@ func main() { probeAddr string namespace string zkQuorum string + zkRoot string ) flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&pprofAddr, "pprof-addr", ":6060", "The address the pprof endpoint binds to.") @@ -67,6 +68,8 @@ func main() { flag.StringVar(&namespace, "namespace", "hbase", "The namespace to watch for resource definitions.") flag.StringVar(&zkQuorum, "zkquorum", "localhost:2181", "Comma-separated list of zookeeper addresses.") + flag.StringVar(&zkRoot, "zkroot", "/hbase", + "Zookeeper root znode for hbase.") opts := zap.Options{ Development: true, @@ -116,7 +119,7 @@ func main() { Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.Log.WithName("controllers").WithName("HBase"), - GhAdmin: gohbase.NewAdminClient(zkQuorum), + GhAdmin: gohbase.NewAdminClient(zkQuorum, gohbase.ZookeeperRoot(zkRoot)), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "HBase") os.Exit(1) From c3a3c656768de8e5e5ec2d08251b907d423fc8ba Mon Sep 17 00:00:00 2001 From: tomasbanet <105751190+tomasbanet@users.noreply.github.com> Date: Tue, 15 Apr 2025 15:06:37 +0100 Subject: [PATCH 6/6] Upgrade gohbase (#8) * Upgrade gohbase ``` go get github.com/tsuna/gohbase go mod tidy ``` * Migrate from github.com/golang/mock to https://github.com/uber-go/mock --- go.mod | 43 +++++------ go.sum | 114 +++++++++++++----------------- internal/controller/suite_test.go | 2 +- 3 files changed, 73 insertions(+), 86 deletions(-) diff --git a/go.mod b/go.mod index 51d5233..7f36962 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,17 @@ module github.com/timoha/hbase-k8s-operator -go 1.21 +go 1.23.0 + +toolchain go1.23.5 require ( github.com/davecgh/go-spew v1.1.1 - github.com/go-logr/logr v1.4.1 - github.com/golang/mock v1.6.0 + github.com/go-logr/logr v1.4.2 github.com/onsi/ginkgo/v2 v2.14.0 github.com/onsi/gomega v1.30.0 - github.com/tsuna/gohbase v0.0.0-20240313220547-1676ef7e233d + github.com/prometheus/client_golang v1.20.5 + github.com/tsuna/gohbase v0.0.0-20250311120459-be525bde7d77 + go.uber.org/mock v0.5.0 k8s.io/api v0.29.0 k8s.io/apimachinery v0.29.0 k8s.io/client-go v0.29.0 @@ -18,7 +21,7 @@ require ( require ( github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch/v5 v5.8.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -28,7 +31,7 @@ require ( github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect + github.com/go-zookeeper/zk v1.0.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect @@ -41,34 +44,32 @@ require ( github.com/imdario/mergo v0.3.6 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.18.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/net v0.33.0 // indirect - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.30.0 // indirect golang.org/x/term v0.27.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/tools v0.22.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.36.5 // 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 @@ -76,7 +77,7 @@ require ( k8s.io/component-base v0.29.0 // indirect k8s.io/klog/v2 v2.110.1 // indirect k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - modernc.org/b/v2 v2.1.0 // indirect + modernc.org/b/v2 v2.1.2 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/go.sum b/go.sum index 73ddad2..1900aa7 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -19,8 +19,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -33,15 +33,12 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -69,6 +66,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr 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/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= 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= @@ -76,10 +75,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -95,20 +94,18 @@ 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.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +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/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -116,25 +113,27 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/tsuna/gohbase v0.0.0-20240313220547-1676ef7e233d h1:2+ifSR43rmH8tzjaX1XRmsPa3RhySCgA2LfugodVdfY= -github.com/tsuna/gohbase v0.0.0-20240313220547-1676ef7e233d/go.mod h1:9AJb3BOaT4Q2Qwvq0EDiDx/C2fDd9tRYSiFbaQ5rLyg= +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/tsuna/gohbase v0.0.0-20250311120459-be525bde7d77 h1:tk5DkfgbTsnYFjK5S9oaeQgRprjveMeuUTTriuPDXlQ= +github.com/tsuna/gohbase v0.0.0-20250311120459-be525bde7d77/go.mod h1:aF5WH9CNVHqJCiNT4GsWFILXomADPV72liozeyKjeOg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +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/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= @@ -146,36 +145,26 @@ golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfU golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= 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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 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.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= @@ -185,21 +174,18 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm 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.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= 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= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= @@ -227,12 +213,12 @@ k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/A k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -modernc.org/b/v2 v2.1.0 h1:kMD/G43EYnsFJI/0qK1F1X659XlSs41bp01MUDidHC0= -modernc.org/b/v2 v2.1.0/go.mod h1:fQhHWDXrchyUSLjQYCslV/4uw04PW1LeiZ25D4SNmeo= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/b/v2 v2.1.2 h1:PX71mrgWbZV3325fh6yVnzAuMU1qU+OX/bud9wmqbII= +modernc.org/b/v2 v2.1.2/go.mod h1:Xyvaj/0l3N2tUButg4o32FUWXhhQ9tCePmQwQYVJLXQ= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= diff --git a/internal/controller/suite_test.go b/internal/controller/suite_test.go index 32551b7..ab71f9d 100644 --- a/internal/controller/suite_test.go +++ b/internal/controller/suite_test.go @@ -21,12 +21,12 @@ import ( "runtime" "testing" - "github.com/golang/mock/gomock" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" hbasev1 "github.com/timoha/hbase-k8s-operator/api/v1" "github.com/tsuna/gohbase/pb" "github.com/tsuna/gohbase/test/mock" + "go.uber.org/mock/gomock" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime"