@@ -20,10 +20,12 @@ import (
2020 "k8s.io/apimachinery/pkg/types"
2121 "sigs.k8s.io/controller-runtime/pkg/client"
2222
23+ "github.com/crunchydata/postgres-operator/internal/controller/runtime"
2324 "github.com/crunchydata/postgres-operator/internal/feature"
2425 "github.com/crunchydata/postgres-operator/internal/initialize"
2526 "github.com/crunchydata/postgres-operator/internal/naming"
2627 "github.com/crunchydata/postgres-operator/internal/testing/cmp"
28+ "github.com/crunchydata/postgres-operator/internal/testing/events"
2729 "github.com/crunchydata/postgres-operator/internal/testing/require"
2830 "github.com/crunchydata/postgres-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1"
2931)
@@ -551,8 +553,7 @@ func TestReconcilePGMonitorExporter(t *testing.T) {
551553 observed := & observedInstances {forCluster : instances }
552554
553555 called = false
554- assert .NilError (t , reconciler .reconcilePGMonitorExporter (ctx ,
555- cluster , observed , nil ))
556+ assert .NilError (t , reconciler .reconcilePGMonitorExporter (ctx , cluster , observed , nil ))
556557 assert .Assert (t , called , "PodExec was not called." )
557558 assert .Assert (t , cluster .Status .Monitoring .ExporterConfiguration != "" , "ExporterConfiguration was empty." )
558559 })
@@ -830,6 +831,147 @@ func TestReconcileExporterQueriesConfig(t *testing.T) {
830831 actual , err = reconciler .reconcileExporterQueriesConfig (ctx , cluster )
831832 assert .NilError (t , err )
832833 assert .Assert (t , actual .Data ["defaultQueries.yml" ] == existing .Data ["defaultQueries.yml" ], "Data does not align." )
834+ assert .Assert (t , actual .Data ["defaultQueries.yml" ] != "" , "Data should not be empty." )
835+ })
836+
837+ t .Run ("Pg>17" , func (t * testing.T ) {
838+ cluster .Spec .PostgresVersion = 18
839+ actual , err = reconciler .reconcileExporterQueriesConfig (ctx , cluster )
840+ assert .NilError (t , err )
841+ assert .Assert (t , actual .Data ["defaultQueries.yml" ] == "" , "Data should be empty" )
833842 })
834843 })
835844}
845+
846+ // TestReconcileExporterSqlSetup checks that the setup script returned
847+ // by reconcileExporterSqlSetup is either empty or not depending on
848+ // which exporter is enabled and what the postgres version is.
849+ func TestReconcileExporterSqlSetup (t * testing.T ) {
850+ ctx := context .Background ()
851+
852+ monitoringSpec := & v1beta1.MonitoringSpec {
853+ PGMonitor : & v1beta1.PGMonitorSpec {
854+ Exporter : & v1beta1.ExporterSpec {
855+ Image : "image" ,
856+ },
857+ },
858+ }
859+
860+ instrumentationSpec := & v1beta1.InstrumentationSpec {
861+ Image : "image" ,
862+ }
863+
864+ testCases := []struct {
865+ tcName string
866+ postgresVersion int
867+ exporterEnabled bool
868+ otelMetricsEnabled bool
869+ errorPresent bool
870+ setupEmpty bool
871+ expectedNumEvents int
872+ expectedEvent string
873+ }{{
874+ tcName : "ExporterEnabledOtelDisabled" ,
875+ postgresVersion : 17 ,
876+ exporterEnabled : true ,
877+ otelMetricsEnabled : false ,
878+ errorPresent : false ,
879+ setupEmpty : false ,
880+ expectedNumEvents : 0 ,
881+ expectedEvent : "" ,
882+ }, {
883+ tcName : "ExporterDisabledOtelEnabled" ,
884+ postgresVersion : 17 ,
885+ exporterEnabled : false ,
886+ otelMetricsEnabled : true ,
887+ errorPresent : false ,
888+ setupEmpty : false ,
889+ expectedNumEvents : 0 ,
890+ expectedEvent : "" ,
891+ }, {
892+ tcName : "BothEnabled" ,
893+ postgresVersion : 17 ,
894+ exporterEnabled : true ,
895+ otelMetricsEnabled : true ,
896+ errorPresent : false ,
897+ setupEmpty : false ,
898+ expectedNumEvents : 0 ,
899+ expectedEvent : "" ,
900+ }, {
901+ tcName : "ExporterEnabledOtelDisabledPostgres18" ,
902+ postgresVersion : 18 ,
903+ exporterEnabled : true ,
904+ otelMetricsEnabled : false ,
905+ errorPresent : false ,
906+ setupEmpty : true ,
907+ expectedNumEvents : 1 ,
908+ expectedEvent : "postgres_exporter not supported for pg18; use OTel for postgres 18 and later" ,
909+ }, {
910+ tcName : "ExporterDisabledOtelEnabledPostgres18" ,
911+ postgresVersion : 18 ,
912+ exporterEnabled : false ,
913+ otelMetricsEnabled : true ,
914+ errorPresent : false ,
915+ setupEmpty : false ,
916+ expectedNumEvents : 0 ,
917+ expectedEvent : "" ,
918+ }, {
919+ tcName : "BothEnabledPostgres18" ,
920+ postgresVersion : 18 ,
921+ exporterEnabled : true ,
922+ otelMetricsEnabled : true ,
923+ errorPresent : false ,
924+ setupEmpty : false ,
925+ expectedNumEvents : 0 ,
926+ expectedEvent : "" ,
927+ }, {
928+ tcName : "ExporterEnabledOtelDisabledBadPostgresVersion" ,
929+ postgresVersion : 1 ,
930+ exporterEnabled : true ,
931+ otelMetricsEnabled : false ,
932+ errorPresent : true ,
933+ setupEmpty : true ,
934+ expectedNumEvents : 0 ,
935+ expectedEvent : "" ,
936+ }}
937+
938+ for _ , tc := range testCases {
939+ t .Run (tc .tcName , func (t * testing.T ) {
940+ cluster := testCluster ()
941+ cluster .Spec .PostgresVersion = tc .postgresVersion
942+
943+ recorder := events .NewRecorder (t , runtime .Scheme )
944+ r := & Reconciler {Recorder : recorder }
945+
946+ gate := feature .NewGate ()
947+ assert .NilError (t , gate .SetFromMap (map [string ]bool {
948+ feature .OpenTelemetryMetrics : tc .otelMetricsEnabled ,
949+ }))
950+ ctx := feature .NewContext (ctx , gate )
951+
952+ if tc .otelMetricsEnabled {
953+ cluster .Spec .Instrumentation = instrumentationSpec
954+ }
955+
956+ if tc .exporterEnabled {
957+ cluster .Spec .Monitoring = monitoringSpec
958+ }
959+
960+ setup , err := r .reconcileExporterSqlSetup (ctx , cluster )
961+ if tc .errorPresent {
962+ assert .Assert (t , err != nil )
963+ } else {
964+ assert .NilError (t , err )
965+ }
966+ assert .Equal (t , setup == "" , tc .setupEmpty )
967+
968+ assert .Equal (t , len (recorder .Events ), tc .expectedNumEvents )
969+ if tc .expectedNumEvents == 1 {
970+ assert .Equal (t , recorder .Events [0 ].Regarding .Name , cluster .Name )
971+ assert .Equal (t , recorder .Events [0 ].Reason , "ExporterNotSupportedForPostgresVersion" )
972+ assert .Equal (t , recorder .Events [0 ].Note , tc .expectedEvent )
973+ assert .Equal (t , recorder .Events [0 ].Type , corev1 .EventTypeWarning )
974+ }
975+ })
976+ }
977+ }
0 commit comments