Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
crclient "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand Down Expand Up @@ -103,11 +104,12 @@ func main() {

registerComponentOrExit(mgr, argov1beta1api.AddToScheme)

isAnalyticsDisabled := strings.ToLower(os.Getenv("ANALYTICS")) == "false"
analyticsEnabled := areAnalyticsEnabled(mgr.GetAPIReader())
setupLog.Info("analytics enabled", "enabled", analyticsEnabled)
if err = (&controllers.PatternReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
AnalyticsClient: controllers.AnalyticsInit(isAnalyticsDisabled, setupLog),
AnalyticsClient: controllers.AnalyticsInit(!analyticsEnabled, setupLog),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Pattern")
os.Exit(1)
Expand Down Expand Up @@ -184,3 +186,22 @@ func registerComponentOrExit(mgr manager.Manager, f func(*k8sruntime.Scheme) err
}
setupLog.Info(fmt.Sprintf("Component registered: %v", reflect.ValueOf(f)))
}

// areAnalyticsEnabled determines whether analytics are enabled.
// Precedence: Operator ConfigMap key "analytics.enabled" (true/false) > ENV ANALYTICS (false means disabled)
func areAnalyticsEnabled(reader crclient.Reader) bool {
enabled := strings.ToLower(os.Getenv("ANALYTICS")) != "false"

var cm corev1.ConfigMap
err := reader.Get(context.Background(), crclient.ObjectKey{Namespace: controllers.OperatorNamespace, Name: controllers.OperatorConfigMap}, &cm)
if err != nil {
setupLog.Error(err, "error reading operator configmap for analytics setting")
return enabled
}

if v, ok := cm.Data["analytics.enabled"]; ok {
return strings.EqualFold(v, "true")
}

return enabled
}
74 changes: 74 additions & 0 deletions cmd/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package main

import (
"os"
"testing"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
crclient "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"

controllers "github.com/hybrid-cloud-patterns/patterns-operator/internal/controller"
)

func newFakeReader(objs ...crclient.Object) crclient.Reader {
scheme := runtime.NewScheme()
_ = corev1.AddToScheme(scheme)
builder := fake.NewClientBuilder().WithScheme(scheme)
if len(objs) > 0 {
builder = builder.WithObjects(objs...)
}
return builder.Build()
}

func newOperatorConfigMap(analyticsEnabled string) *corev1.ConfigMap {
return &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Namespace: controllers.OperatorNamespace,
Name: controllers.OperatorConfigMap,
},
Data: map[string]string{
"analytics.enabled": analyticsEnabled,
},
}
}

func TestAreAnalyticsEnabledWithReader_ConfigMapTrue(t *testing.T) {
cm := newOperatorConfigMap("true")
reader := newFakeReader(cm)

if got := areAnalyticsEnabled(reader); got != true {
t.Fatalf("expected true when configmap sets analytics.enabled=true, got %v", got)
}
}

func TestAreAnalyticsEnabledWithReader_ConfigMapFalse(t *testing.T) {
cm := newOperatorConfigMap("false")
reader := newFakeReader(cm)

if got := areAnalyticsEnabled(reader); got != false {
t.Fatalf("expected false when configmap sets analytics.enabled=false, got %v", got)
}
}

func TestAreAnalyticsEnabledWithReader_NoConfigMap_EnvFalseDisables(t *testing.T) {
_ = os.Setenv("ANALYTICS", "false")
t.Cleanup(func() { _ = os.Unsetenv("ANALYTICS") })

reader := newFakeReader()
if got := areAnalyticsEnabled(reader); got != false {
t.Fatalf("expected false when no configmap and ANALYTICS=false, got %v", got)
}
}

func TestAreAnalyticsEnabledWithReader_NoConfigMap_EnvTrueEnables(t *testing.T) {
_ = os.Setenv("ANALYTICS", "true")
t.Cleanup(func() { _ = os.Unsetenv("ANALYTICS") })

reader := newFakeReader()
if got := areAnalyticsEnabled(reader); got != true {
t.Fatalf("expected true when no configmap and ANALYTICS=true, got %v", got)
}
}
1 change: 1 addition & 0 deletions internal/controller/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ var DefaultPatternOperatorConfig = map[string]string{
"gitea.chartName": GiteaChartName,
"gitea.helmRepoUrl": GiteaHelmRepoUrl,
"gitea.chartVersion": GiteaDefaultChartVersion,
"analytics.enabled": "true",
}

type GitOpsConfig map[string]string
Expand Down
Loading