@@ -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 })
@@ -836,6 +837,147 @@ func TestReconcileExporterQueriesConfig(t *testing.T) {
836837 actual , err = reconciler .reconcileExporterQueriesConfig (ctx , cluster )
837838 assert .NilError (t , err )
838839 assert .Assert (t , actual .Data ["defaultQueries.yml" ] == existing .Data ["defaultQueries.yml" ], "Data does not align." )
840+ assert .Assert (t , actual .Data ["defaultQueries.yml" ] != "" , "Data should not be empty." )
841+ })
842+
843+ t .Run ("Pg>17" , func (t * testing.T ) {
844+ cluster .Spec .PostgresVersion = 18
845+ actual , err = reconciler .reconcileExporterQueriesConfig (ctx , cluster )
846+ assert .NilError (t , err )
847+ assert .Assert (t , actual .Data ["defaultQueries.yml" ] == "" , "Data should be empty" )
839848 })
840849 })
841850}
851+
852+ // TestReconcileExporterSqlSetup checks that the setup script returned
853+ // by reconcileExporterSqlSetup is either empty or not depending on
854+ // which exporter is enabled and what the postgres version is.
855+ func TestReconcileExporterSqlSetup (t * testing.T ) {
856+ ctx := context .Background ()
857+
858+ monitoringSpec := & v1beta1.MonitoringSpec {
859+ PGMonitor : & v1beta1.PGMonitorSpec {
860+ Exporter : & v1beta1.ExporterSpec {
861+ Image : "image" ,
862+ },
863+ },
864+ }
865+
866+ instrumentationSpec := & v1beta1.InstrumentationSpec {
867+ Image : "image" ,
868+ }
869+
870+ testCases := []struct {
871+ tcName string
872+ postgresVersion int32
873+ exporterEnabled bool
874+ otelMetricsEnabled bool
875+ errorPresent bool
876+ setupEmpty bool
877+ expectedNumEvents int
878+ expectedEvent string
879+ }{{
880+ tcName : "ExporterEnabledOtelDisabled" ,
881+ postgresVersion : 17 ,
882+ exporterEnabled : true ,
883+ otelMetricsEnabled : false ,
884+ errorPresent : false ,
885+ setupEmpty : false ,
886+ expectedNumEvents : 0 ,
887+ expectedEvent : "" ,
888+ }, {
889+ tcName : "ExporterDisabledOtelEnabled" ,
890+ postgresVersion : 17 ,
891+ exporterEnabled : false ,
892+ otelMetricsEnabled : true ,
893+ errorPresent : false ,
894+ setupEmpty : false ,
895+ expectedNumEvents : 0 ,
896+ expectedEvent : "" ,
897+ }, {
898+ tcName : "BothEnabled" ,
899+ postgresVersion : 17 ,
900+ exporterEnabled : true ,
901+ otelMetricsEnabled : true ,
902+ errorPresent : false ,
903+ setupEmpty : false ,
904+ expectedNumEvents : 0 ,
905+ expectedEvent : "" ,
906+ }, {
907+ tcName : "ExporterEnabledOtelDisabledPostgres18" ,
908+ postgresVersion : 18 ,
909+ exporterEnabled : true ,
910+ otelMetricsEnabled : false ,
911+ errorPresent : false ,
912+ setupEmpty : true ,
913+ expectedNumEvents : 1 ,
914+ expectedEvent : "postgres_exporter not supported for pg18; use OTel for postgres 18 and later" ,
915+ }, {
916+ tcName : "ExporterDisabledOtelEnabledPostgres18" ,
917+ postgresVersion : 18 ,
918+ exporterEnabled : false ,
919+ otelMetricsEnabled : true ,
920+ errorPresent : false ,
921+ setupEmpty : false ,
922+ expectedNumEvents : 0 ,
923+ expectedEvent : "" ,
924+ }, {
925+ tcName : "BothEnabledPostgres18" ,
926+ postgresVersion : 18 ,
927+ exporterEnabled : true ,
928+ otelMetricsEnabled : true ,
929+ errorPresent : false ,
930+ setupEmpty : false ,
931+ expectedNumEvents : 0 ,
932+ expectedEvent : "" ,
933+ }, {
934+ tcName : "ExporterEnabledOtelDisabledBadPostgresVersion" ,
935+ postgresVersion : 1 ,
936+ exporterEnabled : true ,
937+ otelMetricsEnabled : false ,
938+ errorPresent : true ,
939+ setupEmpty : true ,
940+ expectedNumEvents : 0 ,
941+ expectedEvent : "" ,
942+ }}
943+
944+ for _ , tc := range testCases {
945+ t .Run (tc .tcName , func (t * testing.T ) {
946+ cluster := testCluster ()
947+ cluster .Spec .PostgresVersion = tc .postgresVersion
948+
949+ recorder := events .NewRecorder (t , runtime .Scheme )
950+ r := & Reconciler {Recorder : recorder }
951+
952+ gate := feature .NewGate ()
953+ assert .NilError (t , gate .SetFromMap (map [string ]bool {
954+ feature .OpenTelemetryMetrics : tc .otelMetricsEnabled ,
955+ }))
956+ ctx := feature .NewContext (ctx , gate )
957+
958+ if tc .otelMetricsEnabled {
959+ cluster .Spec .Instrumentation = instrumentationSpec
960+ }
961+
962+ if tc .exporterEnabled {
963+ cluster .Spec .Monitoring = monitoringSpec
964+ }
965+
966+ setup , err := r .reconcileExporterSqlSetup (ctx , cluster )
967+ if tc .errorPresent {
968+ assert .Assert (t , err != nil )
969+ } else {
970+ assert .NilError (t , err )
971+ }
972+ assert .Equal (t , setup == "" , tc .setupEmpty )
973+
974+ assert .Equal (t , len (recorder .Events ), tc .expectedNumEvents )
975+ if tc .expectedNumEvents == 1 {
976+ assert .Equal (t , recorder .Events [0 ].Regarding .Name , cluster .Name )
977+ assert .Equal (t , recorder .Events [0 ].Reason , "ExporterNotSupportedForPostgresVersion" )
978+ assert .Equal (t , recorder .Events [0 ].Note , tc .expectedEvent )
979+ assert .Equal (t , recorder .Events [0 ].Type , corev1 .EventTypeWarning )
980+ }
981+ })
982+ }
983+ }
0 commit comments