From bf507f12ed5202acd40fa472297c339e04fe1a5a Mon Sep 17 00:00:00 2001 From: Thibault Richard Date: Mon, 7 Feb 2022 13:58:35 +0100 Subject: [PATCH 1/5] Configure Stack Monitoring only if association configured --- .../common/stackmon/monitoring/monitoring.go | 30 +++++++++++++++++++ .../elasticsearch/stackmon/beat_config.go | 4 +-- .../elasticsearch/stackmon/sidecar.go | 4 +-- pkg/controller/kibana/stackmon/beat_config.go | 4 +-- pkg/controller/kibana/stackmon/sidecar.go | 4 +-- 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/pkg/controller/common/stackmon/monitoring/monitoring.go b/pkg/controller/common/stackmon/monitoring/monitoring.go index d409841f09..300d2a6630 100644 --- a/pkg/controller/common/stackmon/monitoring/monitoring.go +++ b/pkg/controller/common/stackmon/monitoring/monitoring.go @@ -18,6 +18,36 @@ type HasMonitoring interface { MonitoringAssociation(ref commonv1.ObjectSelector) commonv1.Association } +func AreAssocConfigured(resource HasMonitoring) bool { + return IsMetricsAssocConfigured(resource) && IsLogsAssocConfigured(resource) +} + +func IsMetricsAssocConfigured(resource HasMonitoring) bool { + if !IsMetricsDefined(resource) { + return false + } + refs := resource.GetMonitoringMetricsRefs() + for _, ref := range refs { + if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { + return false + } + } + return true +} + +func IsLogsAssocConfigured(resource HasMonitoring) bool { + if !IsLogsDefined(resource) { + return false + } + refs := resource.GetMonitoringLogsRefs() + for _, ref := range refs { + if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { + return false + } + } + return true +} + func IsDefined(resource HasMonitoring) bool { return IsMetricsDefined(resource) || IsLogsDefined(resource) } diff --git a/pkg/controller/elasticsearch/stackmon/beat_config.go b/pkg/controller/elasticsearch/stackmon/beat_config.go index fa7ceb5d1a..f2314cb50b 100644 --- a/pkg/controller/elasticsearch/stackmon/beat_config.go +++ b/pkg/controller/elasticsearch/stackmon/beat_config.go @@ -25,7 +25,7 @@ var ( // ReconcileConfigSecrets reconciles the secrets holding beats configuration func ReconcileConfigSecrets(client k8s.Client, es esv1.Elasticsearch) error { - if monitoring.IsMetricsDefined(&es) { + if monitoring.IsMetricsAssocConfigured(&es) { b, err := Metricbeat(client, es) if err != nil { return err @@ -36,7 +36,7 @@ func ReconcileConfigSecrets(client k8s.Client, es esv1.Elasticsearch) error { } } - if monitoring.IsLogsDefined(&es) { + if monitoring.IsLogsAssocConfigured(&es) { b, err := Filebeat(client, es) if err != nil { return err diff --git a/pkg/controller/elasticsearch/stackmon/sidecar.go b/pkg/controller/elasticsearch/stackmon/sidecar.go index 19a49dd6de..1cabdc3981 100644 --- a/pkg/controller/elasticsearch/stackmon/sidecar.go +++ b/pkg/controller/elasticsearch/stackmon/sidecar.go @@ -55,8 +55,8 @@ func Filebeat(client k8s.Client, es esv1.Elasticsearch) (stackmon.BeatSidecar, e // WithMonitoring updates the Elasticsearch Pod template builder to deploy Metricbeat and Filebeat in sidecar containers // in the Elasticsearch pod and injects the volumes for the beat configurations and the ES CA certificates. func WithMonitoring(client k8s.Client, builder *defaults.PodTemplateBuilder, es esv1.Elasticsearch) (*defaults.PodTemplateBuilder, error) { - // no monitoring defined, skip - if !monitoring.IsDefined(&es) { + // no monitoring defined or yet configured, skip + if !monitoring.IsDefined(&es) || !monitoring.AreAssocConfigured(&es) { return builder, nil } diff --git a/pkg/controller/kibana/stackmon/beat_config.go b/pkg/controller/kibana/stackmon/beat_config.go index 7c613bf27d..45c21ae457 100644 --- a/pkg/controller/kibana/stackmon/beat_config.go +++ b/pkg/controller/kibana/stackmon/beat_config.go @@ -25,7 +25,7 @@ var ( // ReconcileConfigSecrets reconciles the secrets holding beats configuration func ReconcileConfigSecrets(client k8s.Client, kb kbv1.Kibana) error { - if monitoring.IsMetricsDefined(&kb) { + if monitoring.IsMetricsAssocConfigured(&kb) { b, err := Metricbeat(client, kb) if err != nil { return err @@ -36,7 +36,7 @@ func ReconcileConfigSecrets(client k8s.Client, kb kbv1.Kibana) error { } } - if monitoring.IsLogsDefined(&kb) { + if monitoring.IsLogsAssocConfigured(&kb) { b, err := Filebeat(client, kb) if err != nil { return err diff --git a/pkg/controller/kibana/stackmon/sidecar.go b/pkg/controller/kibana/stackmon/sidecar.go index a2f817f452..0faa371b19 100644 --- a/pkg/controller/kibana/stackmon/sidecar.go +++ b/pkg/controller/kibana/stackmon/sidecar.go @@ -69,8 +69,8 @@ func Filebeat(client k8s.Client, kb kbv1.Kibana) (stackmon.BeatSidecar, error) { // WithMonitoring updates the Kibana Pod template builder to deploy Metricbeat and Filebeat in sidecar containers // in the Kibana pod and injects the volumes for the beat configurations and the ES CA certificates. func WithMonitoring(client k8s.Client, builder *defaults.PodTemplateBuilder, kb kbv1.Kibana) (*defaults.PodTemplateBuilder, error) { - // no monitoring defined, skip - if !monitoring.IsDefined(&kb) { + // no monitoring defined or yet configured, skip + if !monitoring.IsDefined(&kb) || !monitoring.AreAssocConfigured(&kb) { return builder, nil } From 0f225e63328f5e1dad69142f732caf4b7f85f1de Mon Sep 17 00:00:00 2001 From: Thibault Richard Date: Mon, 7 Feb 2022 17:59:29 +0100 Subject: [PATCH 2/5] Keep defined and configured distinct --- pkg/controller/common/stackmon/monitoring/monitoring.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pkg/controller/common/stackmon/monitoring/monitoring.go b/pkg/controller/common/stackmon/monitoring/monitoring.go index 300d2a6630..2a80a5e6ec 100644 --- a/pkg/controller/common/stackmon/monitoring/monitoring.go +++ b/pkg/controller/common/stackmon/monitoring/monitoring.go @@ -23,9 +23,6 @@ func AreAssocConfigured(resource HasMonitoring) bool { } func IsMetricsAssocConfigured(resource HasMonitoring) bool { - if !IsMetricsDefined(resource) { - return false - } refs := resource.GetMonitoringMetricsRefs() for _, ref := range refs { if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { @@ -36,9 +33,6 @@ func IsMetricsAssocConfigured(resource HasMonitoring) bool { } func IsLogsAssocConfigured(resource HasMonitoring) bool { - if !IsLogsDefined(resource) { - return false - } refs := resource.GetMonitoringLogsRefs() for _, ref := range refs { if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { From 0e14888cf2b94a535d2886a63109e4d3c2c00ea2 Mon Sep 17 00:00:00 2001 From: Thibault Richard Date: Tue, 8 Feb 2022 10:19:34 +0100 Subject: [PATCH 3/5] Check IsDefined to reconcile secrets --- pkg/controller/elasticsearch/stackmon/beat_config.go | 9 +++++++-- pkg/controller/kibana/stackmon/beat_config.go | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/controller/elasticsearch/stackmon/beat_config.go b/pkg/controller/elasticsearch/stackmon/beat_config.go index f2314cb50b..ac7000fcea 100644 --- a/pkg/controller/elasticsearch/stackmon/beat_config.go +++ b/pkg/controller/elasticsearch/stackmon/beat_config.go @@ -25,7 +25,12 @@ var ( // ReconcileConfigSecrets reconciles the secrets holding beats configuration func ReconcileConfigSecrets(client k8s.Client, es esv1.Elasticsearch) error { - if monitoring.IsMetricsAssocConfigured(&es) { + // no monitoring defined or yet configured, skip + if !monitoring.IsDefined(&es) || !monitoring.AreAssocConfigured(&es) { + return nil + } + + if monitoring.IsMetricsDefined(&es) { b, err := Metricbeat(client, es) if err != nil { return err @@ -36,7 +41,7 @@ func ReconcileConfigSecrets(client k8s.Client, es esv1.Elasticsearch) error { } } - if monitoring.IsLogsAssocConfigured(&es) { + if monitoring.IsMetricsDefined(&es) { b, err := Filebeat(client, es) if err != nil { return err diff --git a/pkg/controller/kibana/stackmon/beat_config.go b/pkg/controller/kibana/stackmon/beat_config.go index 45c21ae457..7b395c1618 100644 --- a/pkg/controller/kibana/stackmon/beat_config.go +++ b/pkg/controller/kibana/stackmon/beat_config.go @@ -25,7 +25,12 @@ var ( // ReconcileConfigSecrets reconciles the secrets holding beats configuration func ReconcileConfigSecrets(client k8s.Client, kb kbv1.Kibana) error { - if monitoring.IsMetricsAssocConfigured(&kb) { + // no monitoring defined or yet configured, skip + if !monitoring.IsDefined(&kb) || !monitoring.AreAssocConfigured(&kb) { + return nil + } + + if monitoring.IsMetricsDefined(&kb) { b, err := Metricbeat(client, kb) if err != nil { return err @@ -36,7 +41,7 @@ func ReconcileConfigSecrets(client k8s.Client, kb kbv1.Kibana) error { } } - if monitoring.IsLogsAssocConfigured(&kb) { + if monitoring.IsLogsDefined(&kb) { b, err := Filebeat(client, kb) if err != nil { return err From c7c5efff02d162e20eb85be2b79a0d6091e13df7 Mon Sep 17 00:00:00 2001 From: Thibault Richard Date: Mon, 14 Feb 2022 12:01:05 +0100 Subject: [PATCH 4/5] Apply review's input --- .../common/stackmon/monitoring/monitoring.go | 20 +++++++++++-------- .../elasticsearch/stackmon/beat_config.go | 5 ++--- .../elasticsearch/stackmon/sidecar.go | 3 +-- pkg/controller/kibana/stackmon/beat_config.go | 3 +-- pkg/controller/kibana/stackmon/sidecar.go | 3 +-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pkg/controller/common/stackmon/monitoring/monitoring.go b/pkg/controller/common/stackmon/monitoring/monitoring.go index 2a80a5e6ec..fd2ebfe9be 100644 --- a/pkg/controller/common/stackmon/monitoring/monitoring.go +++ b/pkg/controller/common/stackmon/monitoring/monitoring.go @@ -18,11 +18,19 @@ type HasMonitoring interface { MonitoringAssociation(ref commonv1.ObjectSelector) commonv1.Association } -func AreAssocConfigured(resource HasMonitoring) bool { - return IsMetricsAssocConfigured(resource) && IsLogsAssocConfigured(resource) +// IsReconcilable return true if a resource has at least one association defined in its specification +// and all defined associations are configured. +func IsReconcilable(resource HasMonitoring) bool { + return IsDefined(resource) && isMetricsAssocConfigured(resource) && isLogsAssocConfigured(resource) } -func IsMetricsAssocConfigured(resource HasMonitoring) bool { +// IsDefined return true if a resource has at least one association for Stack Monitoring defined in its specification +// (can be one for logs or one for metrics). +func IsDefined(resource HasMonitoring) bool { + return IsMetricsDefined(resource) || IsLogsDefined(resource) +} + +func isMetricsAssocConfigured(resource HasMonitoring) bool { refs := resource.GetMonitoringMetricsRefs() for _, ref := range refs { if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { @@ -32,7 +40,7 @@ func IsMetricsAssocConfigured(resource HasMonitoring) bool { return true } -func IsLogsAssocConfigured(resource HasMonitoring) bool { +func isLogsAssocConfigured(resource HasMonitoring) bool { refs := resource.GetMonitoringLogsRefs() for _, ref := range refs { if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { @@ -42,10 +50,6 @@ func IsLogsAssocConfigured(resource HasMonitoring) bool { return true } -func IsDefined(resource HasMonitoring) bool { - return IsMetricsDefined(resource) || IsLogsDefined(resource) -} - func IsMetricsDefined(resource HasMonitoring) bool { return AreEsRefsDefined(resource.GetMonitoringMetricsRefs()) } diff --git a/pkg/controller/elasticsearch/stackmon/beat_config.go b/pkg/controller/elasticsearch/stackmon/beat_config.go index ac7000fcea..3dcb35eedb 100644 --- a/pkg/controller/elasticsearch/stackmon/beat_config.go +++ b/pkg/controller/elasticsearch/stackmon/beat_config.go @@ -25,8 +25,7 @@ var ( // ReconcileConfigSecrets reconciles the secrets holding beats configuration func ReconcileConfigSecrets(client k8s.Client, es esv1.Elasticsearch) error { - // no monitoring defined or yet configured, skip - if !monitoring.IsDefined(&es) || !monitoring.AreAssocConfigured(&es) { + if !monitoring.IsReconcilable(&es) { return nil } @@ -41,7 +40,7 @@ func ReconcileConfigSecrets(client k8s.Client, es esv1.Elasticsearch) error { } } - if monitoring.IsMetricsDefined(&es) { + if monitoring.IsLogsDefined(&es) { b, err := Filebeat(client, es) if err != nil { return err diff --git a/pkg/controller/elasticsearch/stackmon/sidecar.go b/pkg/controller/elasticsearch/stackmon/sidecar.go index 1cabdc3981..bfad9cbdcd 100644 --- a/pkg/controller/elasticsearch/stackmon/sidecar.go +++ b/pkg/controller/elasticsearch/stackmon/sidecar.go @@ -55,8 +55,7 @@ func Filebeat(client k8s.Client, es esv1.Elasticsearch) (stackmon.BeatSidecar, e // WithMonitoring updates the Elasticsearch Pod template builder to deploy Metricbeat and Filebeat in sidecar containers // in the Elasticsearch pod and injects the volumes for the beat configurations and the ES CA certificates. func WithMonitoring(client k8s.Client, builder *defaults.PodTemplateBuilder, es esv1.Elasticsearch) (*defaults.PodTemplateBuilder, error) { - // no monitoring defined or yet configured, skip - if !monitoring.IsDefined(&es) || !monitoring.AreAssocConfigured(&es) { + if !monitoring.IsReconcilable(&es) { return builder, nil } diff --git a/pkg/controller/kibana/stackmon/beat_config.go b/pkg/controller/kibana/stackmon/beat_config.go index 7b395c1618..7970df515e 100644 --- a/pkg/controller/kibana/stackmon/beat_config.go +++ b/pkg/controller/kibana/stackmon/beat_config.go @@ -25,8 +25,7 @@ var ( // ReconcileConfigSecrets reconciles the secrets holding beats configuration func ReconcileConfigSecrets(client k8s.Client, kb kbv1.Kibana) error { - // no monitoring defined or yet configured, skip - if !monitoring.IsDefined(&kb) || !monitoring.AreAssocConfigured(&kb) { + if !monitoring.IsReconcilable(&kb) { return nil } diff --git a/pkg/controller/kibana/stackmon/sidecar.go b/pkg/controller/kibana/stackmon/sidecar.go index 0faa371b19..61a6e33b08 100644 --- a/pkg/controller/kibana/stackmon/sidecar.go +++ b/pkg/controller/kibana/stackmon/sidecar.go @@ -69,8 +69,7 @@ func Filebeat(client k8s.Client, kb kbv1.Kibana) (stackmon.BeatSidecar, error) { // WithMonitoring updates the Kibana Pod template builder to deploy Metricbeat and Filebeat in sidecar containers // in the Kibana pod and injects the volumes for the beat configurations and the ES CA certificates. func WithMonitoring(client k8s.Client, builder *defaults.PodTemplateBuilder, kb kbv1.Kibana) (*defaults.PodTemplateBuilder, error) { - // no monitoring defined or yet configured, skip - if !monitoring.IsDefined(&kb) || !monitoring.AreAssocConfigured(&kb) { + if !monitoring.IsReconcilable(&kb) { return builder, nil } From 48e13f35e6f1be1e722000675cb8a357e58709c7 Mon Sep 17 00:00:00 2001 From: Thibault Richard Date: Mon, 14 Feb 2022 21:26:43 +0100 Subject: [PATCH 5/5] Inline ambiguous methods used only once and add unit tests --- .../common/stackmon/monitoring/monitoring.go | 29 ++-- .../stackmon/monitoring/monitoring_test.go | 151 ++++++++++++++++++ 2 files changed, 160 insertions(+), 20 deletions(-) diff --git a/pkg/controller/common/stackmon/monitoring/monitoring.go b/pkg/controller/common/stackmon/monitoring/monitoring.go index fd2ebfe9be..8370ae7bec 100644 --- a/pkg/controller/common/stackmon/monitoring/monitoring.go +++ b/pkg/controller/common/stackmon/monitoring/monitoring.go @@ -21,18 +21,11 @@ type HasMonitoring interface { // IsReconcilable return true if a resource has at least one association defined in its specification // and all defined associations are configured. func IsReconcilable(resource HasMonitoring) bool { - return IsDefined(resource) && isMetricsAssocConfigured(resource) && isLogsAssocConfigured(resource) -} - -// IsDefined return true if a resource has at least one association for Stack Monitoring defined in its specification -// (can be one for logs or one for metrics). -func IsDefined(resource HasMonitoring) bool { - return IsMetricsDefined(resource) || IsLogsDefined(resource) -} - -func isMetricsAssocConfigured(resource HasMonitoring) bool { - refs := resource.GetMonitoringMetricsRefs() - for _, ref := range refs { + if !IsDefined(resource) { + return false + } + allRefs := append(resource.GetMonitoringMetricsRefs(), resource.GetMonitoringLogsRefs()...) + for _, ref := range allRefs { if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { return false } @@ -40,14 +33,10 @@ func isMetricsAssocConfigured(resource HasMonitoring) bool { return true } -func isLogsAssocConfigured(resource HasMonitoring) bool { - refs := resource.GetMonitoringLogsRefs() - for _, ref := range refs { - if !resource.MonitoringAssociation(ref).AssociationConf().IsConfigured() { - return false - } - } - return true +// IsDefined return true if a resource has at least one association for Stack Monitoring defined in its specification +// (can be one for logs or one for metrics). +func IsDefined(resource HasMonitoring) bool { + return IsMetricsDefined(resource) || IsLogsDefined(resource) } func IsMetricsDefined(resource HasMonitoring) bool { diff --git a/pkg/controller/common/stackmon/monitoring/monitoring_test.go b/pkg/controller/common/stackmon/monitoring/monitoring_test.go index cc8bcfe54b..6f05901392 100644 --- a/pkg/controller/common/stackmon/monitoring/monitoring_test.go +++ b/pkg/controller/common/stackmon/monitoring/monitoring_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/types" commonv1 "github.com/elastic/cloud-on-k8s/pkg/apis/common/v1" esv1 "github.com/elastic/cloud-on-k8s/pkg/apis/elasticsearch/v1" @@ -27,6 +28,156 @@ var ( } ) +func TestIsReconcilable(t *testing.T) { + tests := []struct { + name string + es esv1.Elasticsearch + want bool + }{ + { + name: "without monitoring", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Version: "7.13.1", + }, + }, + want: false, + }, + { + name: "with metrics monitoring defined but not configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Metrics: esv1.MetricsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + }, + }, + }, + want: false, + }, + { + name: "with metrics monitoring defined and configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Metrics: esv1.MetricsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + }, + }, + AssocConfs: map[types.NamespacedName]commonv1.AssociationConf{ + types.NamespacedName{Name: "m1", Namespace: "b"}: {URL: "https://es.xyz", AuthSecretName: "-"}, + }, + }, + want: true, + }, + { + name: "with logs monitoring defined and configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Logs: esv1.LogsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + }, + }, + AssocConfs: map[types.NamespacedName]commonv1.AssociationConf{ + types.NamespacedName{Name: "m1", Namespace: "b"}: {URL: "https://es.xyz", AuthSecretName: "-"}, + }, + }, + want: true, + }, + { + name: "with metrics and logs monitoring defined and partially configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Metrics: esv1.MetricsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + Logs: esv1.LogsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m2", Namespace: "b"}}, + }, + }, + }, + AssocConfs: map[types.NamespacedName]commonv1.AssociationConf{ + types.NamespacedName{Name: "m1", Namespace: "b"}: {URL: "https://es.xyz", AuthSecretName: "-"}, + }, + }, + want: false, + }, + { + name: "with metrics and logs monitoring defined and partially configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Metrics: esv1.MetricsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + Logs: esv1.LogsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m2", Namespace: "b"}}, + }, + }, + }, + AssocConfs: map[types.NamespacedName]commonv1.AssociationConf{ + types.NamespacedName{Name: "m1", Namespace: "b"}: {URL: "https://es.xyz", AuthSecretName: "-"}, + }, + }, + want: false, + }, + { + name: "with logs and metrics monitoring defined and configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Metrics: esv1.MetricsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + Logs: esv1.LogsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + }, + }, + AssocConfs: map[types.NamespacedName]commonv1.AssociationConf{ + types.NamespacedName{Name: "m1", Namespace: "b"}: {URL: "https://m1.xyz", AuthSecretName: "-"}, + }, + }, + want: true, + }, + { + name: "with distinct logs and metrics monitoring defined and configured", + es: esv1.Elasticsearch{ + Spec: esv1.ElasticsearchSpec{ + Monitoring: esv1.Monitoring{ + Metrics: esv1.MetricsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m1", Namespace: "b"}}, + }, + Logs: esv1.LogsMonitoring{ + ElasticsearchRefs: []commonv1.ObjectSelector{{Name: "m2", Namespace: "b"}}, + }, + }, + }, + AssocConfs: map[types.NamespacedName]commonv1.AssociationConf{ + types.NamespacedName{Name: "m1", Namespace: "b"}: {URL: "https://m1.xyz", AuthSecretName: "-"}, + types.NamespacedName{Name: "m2", Namespace: "b"}: {URL: "https://m2.xyz", AuthSecretName: "-"}, + }, + }, + want: true, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := IsReconcilable(&tc.es) + if got != tc.want { + t.Errorf("IsReconcilable() got = %v, want %v", got, tc.want) + return + } + }) + } +} + func TestIsDefined(t *testing.T) { assert.False(t, IsDefined(&sampleEs)) assert.True(t, IsDefined(&sampleMonitoredEs))