@@ -18,10 +18,13 @@ package e2e
18
18
19
19
import (
20
20
"regexp"
21
+ "strings"
22
+ "time"
21
23
22
24
corev1 "k8s.io/api/core/v1"
23
25
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
24
26
27
+ "github.com/cloudnative-pg/cloudnative-pg/pkg/specs"
25
28
"github.com/cloudnative-pg/cloudnative-pg/tests"
26
29
"github.com/cloudnative-pg/cloudnative-pg/tests/utils"
27
30
@@ -71,6 +74,7 @@ var _ = Describe("Metrics", func() {
71
74
env .DumpNamespaceObjects (namespace , "out/" + CurrentSpecReport ().LeafNodeText + ".log" )
72
75
}
73
76
})
77
+
74
78
AfterEach (func () {
75
79
err := env .DeleteNamespace (namespace )
76
80
Expect (err ).ToNot (HaveOccurred ())
@@ -190,4 +194,65 @@ var _ = Describe("Metrics", func() {
190
194
191
195
collectAndAssertDefaultMetricsPresentOnEachPod (namespace , metricsClusterName , curlPodName , false )
192
196
})
197
+
198
+ It ("execute custom queries against the application database on replica clusters" , func () {
199
+ const (
200
+ replicaModeClusterDir = "/replica_mode_cluster/"
201
+ replicaClusterSampleFile = fixturesDir + "/metrics/cluster-replica-tls-with-metrics.yaml"
202
+ srcClusterSampleFile = fixturesDir + replicaModeClusterDir + "cluster-replica-src.yaml"
203
+ configMapFIle = fixturesDir + "/metrics/custom-queries-for-replica-cluster.yaml"
204
+ checkQuery = "SELECT count(*) FROM test_replica"
205
+ )
206
+
207
+ namespace = "metrics-with-replica-mode"
208
+
209
+ // Fetching the source cluster name
210
+ srcClusterName , err := env .GetResourceNameFromYAML (srcClusterSampleFile )
211
+ Expect (err ).ToNot (HaveOccurred ())
212
+
213
+ // Fetching replica cluster name
214
+ replicaClusterName , err := env .GetResourceNameFromYAML (replicaClusterSampleFile )
215
+ Expect (err ).ToNot (HaveOccurred ())
216
+
217
+ // create namespace
218
+ err = env .CreateNamespace (namespace )
219
+ Expect (err ).ToNot (HaveOccurred ())
220
+
221
+ // Creating and verifying custom queries configmap
222
+ AssertCustomMetricsResourcesExist (namespace , configMapFIle , 1 , 0 )
223
+
224
+ // Create the curl client pod and wait for it to be ready
225
+ By ("setting up curl client pod" , func () {
226
+ curlClient := utils .CurlClient (namespace )
227
+ err := utils .PodCreateAndWaitForReady (env , & curlClient , 240 )
228
+ Expect (err ).ToNot (HaveOccurred ())
229
+ curlPodName = curlClient .GetName ()
230
+ })
231
+
232
+ AssertReplicaModeCluster (namespace , srcClusterName , srcClusterSampleFile , replicaClusterName ,
233
+ replicaClusterSampleFile , checkQuery )
234
+
235
+ By ("grant select permission for test_replica table to pg_monitor" , func () {
236
+ primarySrcCluster , err := env .GetClusterPrimary (namespace , srcClusterName )
237
+ Expect (err ).ToNot (HaveOccurred ())
238
+ commandTimeout := time .Second * 5
239
+ cmd := "GRANT SELECT ON test_replica TO pg_monitor"
240
+ _ , _ , err = env .EventuallyExecCommand (env .Ctx , * primarySrcCluster , specs .PostgresContainerName ,
241
+ & commandTimeout , "psql" , "-U" , "postgres" , "appSrc" , "-tAc" , cmd )
242
+ Expect (err ).ToNot (HaveOccurred ())
243
+ })
244
+
245
+ By ("collecting metrics on each pod and checking that the table has been found" , func () {
246
+ podList , err := env .GetClusterPodList (namespace , replicaClusterName )
247
+ Expect (err ).ToNot (HaveOccurred ())
248
+ // Gather metrics in each pod
249
+ for _ , pod := range podList .Items {
250
+ podIP := pod .Status .PodIP
251
+ out , err := utils .CurlGetMetrics (namespace , curlPodName , podIP , 9187 )
252
+ Expect (err ).Should (Not (HaveOccurred ()))
253
+ Expect (strings .Split (out , "\n " )).Should (ContainElement ("cnpg_replica_test_row_count 3" ))
254
+ }
255
+ })
256
+ collectAndAssertDefaultMetricsPresentOnEachPod (namespace , replicaClusterName , curlPodName , true )
257
+ })
193
258
})
0 commit comments